{"file_path":".sol","creation_status":"success","source_code":"// File: contracts/zeppelin/SafeMath.sol\n\npragma solidity 0.4.24;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checks that throw on error\n */\nlibrary SafeMath {\n    /**\n    * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).\n    */\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b <= a);\n        uint256 c = a - b;\n\n        return c;\n    }\n\n    /**\n    * @dev Adds two numbers, reverts on overflow.\n    */\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\n        uint256 c = a + b;\n        require(c >= a);\n\n        return c;\n    }\n\n    /**\n    * @dev Multiplies two unsigned integers, reverts on overflow.\n    */\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n        // benefit is lost if 'b' is also tested.\n        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n        if (a == 0) {\n            return 0;\n        }\n\n        uint256 c = a * b;\n        require(c / a == b);\n\n        return c;\n    }\n\n    /**\n    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.\n    */\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\n        // Solidity only automatically asserts when dividing by 0\n        require(b > 0);\n        uint256 c = a / b;\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n        return c;\n    }\n}\n\n// File: contracts/XAUHImplementation.sol\n\npragma solidity 0.4.24;\npragma experimental \"v0.5.0\";\n\n\n\n/**\n * @title XAUHImplementation\n * @dev this contract is a Pausable ERC20 token with Burn and Mint\n * controlled by a central SupplyController. By implementing XAUHImplementation\n * this contract also includes external methods for setting\n * a new implementation contract for the Proxy.\n * NOTE: The storage defined here will actually be held in the Proxy\n * contract and all calls to this contract should be made through\n * the proxy, including admin actions done as owner or supplyController.\n * Any call to transfer against this contract should fail\n * with insufficient funds since no tokens will be issued there.\n */\ncontract XAUHImplementation {\n\n    /**\n     * MATH\n     */\n\n    using SafeMath for uint256;\n\n    /**\n     * DATA\n     */\n\n    // INITIALIZATION DATA\n    bool private initialized = false;\n\n    // ERC20 BASIC DATA\n    mapping(address => uint256) internal balances;\n    uint256 internal totalSupply_;\n    string public constant name = \"Herculis Gold Coin\"; // solium-disable-line\n    string public constant symbol = \"XAUH\"; // solium-disable-line uppercase\n    uint8 public constant decimals = 18; // solium-disable-line uppercase\n\n    // ERC20 DATA\n    mapping(address => mapping(address => uint256)) internal allowed;\n\n    // OWNER DATA\n    address public owner;\n    address public proposedOwner;\n\n    // PAUSABILITY DATA\n    bool public paused = false;\n\n    // ASSET PROTECTION DATA\n    address public assetProtectionRole;\n    mapping(address => bool) internal frozen;\n\n    // SUPPLY CONTROL DATA\n    address public supplyController;\n\n    // DELEGATED TRANSFER DATA\n    address public betaDelegateWhitelister;\n    mapping(address => bool) internal betaDelegateWhitelist;\n    mapping(address => uint256) internal nextSeqs;\n    // EIP191 header for EIP712 prefix\n    string constant internal EIP191_HEADER = \"\\x19\\x01\";\n    // Hash of the EIP712 Domain Separator Schema\n    bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(\n        \"EIP712Domain(string name,address verifyingContract)\"\n    );\n    bytes32 constant internal EIP712_DELEGATED_TRANSFER_SCHEMA_HASH = keccak256(\n        \"BetaDelegatedTransfer(address to,uint256 value,uint256 serviceFee,uint256 seq,uint256 deadline)\"\n    );\n    // Hash of the EIP712 Domain Separator data\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 public EIP712_DOMAIN_HASH;\n\n    // FEE CONTROLLER DATA\n    // fee decimals is only set for informational purposes.\n    // 1 feeRate = .000001 gram of gold\n    uint8 public constant feeDecimals = 6;\n\n    // feeRate is measured in 100th of a basis point (parts per 1,000,000)\n    // ex: a fee rate of 200 = 0.02% of a gram of gold\n    uint256 public constant feeParts = 1000000;\n    uint256 public feeRate;\n    address public feeController;\n    address public feeRecipient;\n\n    /**\n     * EVENTS\n     */\n\n    // ERC20 BASIC EVENTS\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    // ERC20 EVENTS\n    event Approval(\n        address indexed owner,\n        address indexed spender,\n        uint256 value\n    );\n\n    // OWNABLE EVENTS\n    event OwnershipTransferProposed(\n        address indexed currentOwner,\n        address indexed proposedOwner\n    );\n    event OwnershipTransferDisregarded(\n        address indexed oldProposedOwner\n    );\n    event OwnershipTransferred(\n        address indexed oldOwner,\n        address indexed newOwner\n    );\n\n    // PAUSABLE EVENTS\n    event Pause();\n    event Unpause();\n\n    // ASSET PROTECTION EVENTS\n    event AddressFrozen(address indexed addr);\n    event AddressUnfrozen(address indexed addr);\n    event FrozenAddressWiped(address indexed addr);\n    event AssetProtectionRoleSet (\n        address indexed oldAssetProtectionRole,\n        address indexed newAssetProtectionRole\n    );\n\n    // SUPPLY CONTROL EVENTS\n    event SupplyIncreased(address indexed to, uint256 value);\n    event SupplyDecreased(address indexed from, uint256 value);\n    event SupplyControllerSet(\n        address indexed oldSupplyController,\n        address indexed newSupplyController\n    );\n\n    // DELEGATED TRANSFER EVENTS\n    event BetaDelegatedTransfer(\n        address indexed from, address indexed to, uint256 value, uint256 seq, uint256 serviceFee\n    );\n    event BetaDelegateWhitelisterSet(\n        address indexed oldWhitelister,\n        address indexed newWhitelister\n    );\n    event BetaDelegateWhitelisted(address indexed newDelegate);\n    event BetaDelegateUnwhitelisted(address indexed oldDelegate);\n\n    // FEE CONTROLLER EVENTS\n    event FeeCollected(address indexed from, address indexed to, uint256 value);\n    event FeeRateSet(\n        uint256 indexed oldFeeRate,\n        uint256 indexed newFeeRate\n    );\n    event FeeControllerSet(\n        address indexed oldFeeController,\n        address indexed newFeeController\n    );\n    event FeeRecipientSet(\n        address indexed oldFeeRecipient,\n        address indexed newFeeRecipient\n    );\n\n    /**\n     * FUNCTIONALITY\n     */\n\n    // INITIALIZATION FUNCTIONALITY\n\n    /**\n     * @dev sets 0 initial tokens, the owner, the supplyController,\n     * the fee controller and fee recipient.\n     * this serves as the constructor for the proxy but compiles to the\n     * memory model of the Implementation contract.\n     */\n    function initialize() public {\n        require(!initialized, \"already initialized\");\n        owner = msg.sender;\n        proposedOwner = address(0);\n        assetProtectionRole = address(0);\n        totalSupply_ = 0;\n        supplyController = msg.sender;\n        feeRate = 0;\n        feeController = msg.sender;\n        feeRecipient = msg.sender;\n        initializeDomainSeparator();\n        initialized = true;\n    }\n\n    /**\n     * The constructor is used here to ensure that the implementation\n     * contract is initialized. An uncontrolled implementation\n     * contract might lead to misleading state\n     * for users who accidentally interact with it.\n     */\n    constructor() public {\n        initialize();\n        pause();\n    }\n\n    /**\n     * @dev To be called when upgrading the contract using upgradeAndCall to add delegated transfers\n     */\n    function initializeDomainSeparator() public {\n        // hash the name context with the contract address\n        EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(// solium-disable-line\n                EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n                keccak256(bytes(name)),\n                bytes32(address(this))\n            ));\n    }\n\n    // ERC20 BASIC FUNCTIONALITY\n\n    /**\n    * @dev Total number of tokens in existence\n    */\n    function totalSupply() public view returns (uint256) {\n        return totalSupply_;\n    }\n\n    /**\n    * @dev Transfer token to a specified address from msg.sender\n    * Transfer additionally sends the fee to the fee controller\n    * Note: the use of Safemath ensures that _value is nonnegative.\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 returns (bool) {\n        require(_to != address(0), \"cannot transfer to address zero\");\n        require(!frozen[_to] && !frozen[msg.sender], \"address frozen\");\n        require(_value <= balances[msg.sender], \"insufficient funds\");\n\n        _transfer(msg.sender, _to, _value);\n        return true;\n    }\n\n    /**\n    * @dev Gets the balance of the specified address.\n    * @param _addr The address to query the the balance of.\n    * @return An uint256 representing the amount owned by the passed address.\n    */\n    function balanceOf(address _addr) public view returns (uint256) {\n        return balances[_addr];\n    }\n\n    // ERC20 FUNCTIONALITY\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(\n        address _from,\n        address _to,\n        uint256 _value\n    )\n    public\n    whenNotPaused\n    returns (bool)\n    {\n        require(_to != address(0), \"cannot transfer to address zero\");\n        require(!frozen[_to] && !frozen[_from] && !frozen[msg.sender], \"address frozen\");\n        require(_value <= balances[_from], \"insufficient funds\");\n        require(_value <= allowed[_from][msg.sender], \"insufficient allowance\");\n\n        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);\n        _transfer(_from, _to, _value);\n\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     * Beware that changing an allowance with this method brings the risk that someone may use both the old\n     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this\n     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\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 whenNotPaused returns (bool) {\n        require(!frozen[_spender] && !frozen[msg.sender], \"address frozen\");\n        allowed[msg.sender][_spender] = _value;\n        emit Approval(msg.sender, _spender, _value);\n        return true;\n    }\n\n    /**\n     * @dev Function to check the amount of tokens that 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 A uint256 specifying the amount of tokens still available for the spender.\n     */\n    function allowance(\n        address _owner,\n        address _spender\n    )\n    public\n    view\n    returns (uint256)\n    {\n        return allowed[_owner][_spender];\n    }\n\n    function _transfer(address _from, address _to, uint256 _value) internal returns (uint256) {\n        uint256 _fee = getFeeFor(_value);\n        uint256 _principle = _value.sub(_fee);\n        balances[_from] = balances[_from].sub(_value);\n        balances[_to] = balances[_to].add(_principle);\n        emit Transfer(_from, _to, _principle);\n        emit Transfer(_from, feeRecipient, _fee);\n        if (_fee > 0) {\n            balances[feeRecipient] = balances[feeRecipient].add(_fee);\n            emit FeeCollected(_from, feeRecipient, _fee);\n        }\n\n        return _principle;\n    }\n\n    // OWNER FUNCTIONALITY\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        require(msg.sender == owner, \"onlyOwner\");\n        _;\n    }\n\n    /**\n     * @dev Allows the current owner to begin transferring control of the contract to a proposedOwner\n     * @param _proposedOwner The address to transfer ownership to.\n     */\n    function proposeOwner(address _proposedOwner) public onlyOwner {\n        require(_proposedOwner != address(0), \"cannot transfer ownership to address zero\");\n        require(msg.sender != _proposedOwner, \"caller already is owner\");\n        proposedOwner = _proposedOwner;\n        emit OwnershipTransferProposed(owner, proposedOwner);\n    }\n\n    /**\n     * @dev Allows the current owner or proposed owner to cancel transferring control of the contract to a proposedOwner\n     */\n    function disregardProposeOwner() public {\n        require(msg.sender == proposedOwner || msg.sender == owner, \"only proposedOwner or owner\");\n        require(proposedOwner != address(0), \"can only disregard a proposed owner that was previously set\");\n        address _oldProposedOwner = proposedOwner;\n        proposedOwner = address(0);\n        emit OwnershipTransferDisregarded(_oldProposedOwner);\n    }\n\n    /**\n     * @dev Allows the proposed owner to complete transferring control of the contract to the proposedOwner.\n     */\n    function claimOwnership() public {\n        require(msg.sender == proposedOwner, \"onlyProposedOwner\");\n        address _oldOwner = owner;\n        owner = proposedOwner;\n        proposedOwner = address(0);\n        emit OwnershipTransferred(_oldOwner, owner);\n    }\n\n    /**\n     * @dev Reclaim all XAUH at the contract address.\n     * This sends the XAUH tokens that this contract add holding to the owner.\n     * Note: this is not affected by freeze constraints.\n     */\n    function reclaimXAUH() external onlyOwner {\n        uint256 _balance = balances[this];\n        balances[this] = 0;\n        balances[owner] = balances[owner].add(_balance);\n        emit Transfer(this, owner, _balance);\n    }\n\n    // PAUSABILITY FUNCTIONALITY\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     */\n    modifier whenNotPaused() {\n        require(!paused, \"whenNotPaused\");\n        _;\n    }\n\n    /**\n     * @dev called by the owner to pause, triggers stopped state\n     */\n    function pause() public onlyOwner {\n        require(!paused, \"already paused\");\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() public onlyOwner {\n        require(paused, \"already unpaused\");\n        paused = false;\n        emit Unpause();\n    }\n\n    // ASSET PROTECTION FUNCTIONALITY\n\n    /**\n     * @dev Sets a new asset protection role address.\n     * @param _newAssetProtectionRole The new address allowed to freeze/unfreeze addresses and seize their tokens.\n     */\n    function setAssetProtectionRole(address _newAssetProtectionRole) public {\n        require(msg.sender == assetProtectionRole || msg.sender == owner, \"only assetProtectionRole or Owner\");\n        emit AssetProtectionRoleSet(assetProtectionRole, _newAssetProtectionRole);\n        assetProtectionRole = _newAssetProtectionRole;\n    }\n\n    modifier onlyAssetProtectionRole() {\n        require(msg.sender == assetProtectionRole, \"onlyAssetProtectionRole\");\n        _;\n    }\n\n    /**\n     * @dev Freezes an address balance from being transferred.\n     * @param _addr The new address to freeze.\n     */\n    function freeze(address _addr) public onlyAssetProtectionRole {\n        require(!frozen[_addr], \"address already frozen\");\n        frozen[_addr] = true;\n        emit AddressFrozen(_addr);\n    }\n\n    /**\n     * @dev Unfreezes an address balance allowing transfer.\n     * @param _addr The new address to unfreeze.\n     */\n    function unfreeze(address _addr) public onlyAssetProtectionRole {\n        require(frozen[_addr], \"address already unfrozen\");\n        frozen[_addr] = false;\n        emit AddressUnfrozen(_addr);\n    }\n\n    /**\n     * @dev Wipes the balance of a frozen address, burning the tokens\n     * and setting the approval to zero.\n     * @param _addr The new frozen address to wipe.\n     */\n    function wipeFrozenAddress(address _addr) public onlyAssetProtectionRole {\n        require(frozen[_addr], \"address is not frozen\");\n        uint256 _balance = balances[_addr];\n        balances[_addr] = 0;\n        totalSupply_ = totalSupply_.sub(_balance);\n        emit FrozenAddressWiped(_addr);\n        emit SupplyDecreased(_addr, _balance);\n        emit Transfer(_addr, address(0), _balance);\n    }\n\n    /**\n    * @dev Gets whether the address is currently frozen.\n    * @param _addr The address to check if frozen.\n    * @return A bool representing whether the given address is frozen.\n    */\n    function isFrozen(address _addr) public view returns (bool) {\n        return frozen[_addr];\n    }\n\n    // SUPPLY CONTROL FUNCTIONALITY\n\n    /**\n     * @dev Sets a new supply controller address.\n     * @param _newSupplyController The address allowed to burn/mint tokens to control supply.\n     */\n    function setSupplyController(address _newSupplyController) public {\n        require(msg.sender == supplyController || msg.sender == owner, \"only SupplyController or Owner\");\n        require(_newSupplyController != address(0), \"cannot set supply controller to address zero\");\n        emit SupplyControllerSet(supplyController, _newSupplyController);\n        supplyController = _newSupplyController;\n    }\n\n    modifier onlySupplyController() {\n        require(msg.sender == supplyController, \"onlySupplyController\");\n        _;\n    }\n\n    /**\n     * @dev Increases the total supply by minting the specified number of tokens to the supply controller account.\n     * @param _value The number of tokens to add.\n     * @return A boolean that indicates if the operation was successful.\n     */\n    function increaseSupply(uint256 _value) public onlySupplyController returns (bool success) {\n        totalSupply_ = totalSupply_.add(_value);\n        balances[supplyController] = balances[supplyController].add(_value);\n        emit SupplyIncreased(supplyController, _value);\n        emit Transfer(address(0), supplyController, _value);\n        return true;\n    }\n\n    /**\n     * @dev Decreases the total supply by burning the specified number of tokens from the supply controller account.\n     * @param _value The number of tokens to remove.\n     * @return A boolean that indicates if the operation was successful.\n     */\n    function decreaseSupply(uint256 _value) public onlySupplyController returns (bool success) {\n        require(_value <= balances[supplyController], \"not enough supply\");\n        balances[supplyController] = balances[supplyController].sub(_value);\n        totalSupply_ = totalSupply_.sub(_value);\n        emit SupplyDecreased(supplyController, _value);\n        emit Transfer(supplyController, address(0), _value);\n        return true;\n    }\n\n    // DELEGATED TRANSFER FUNCTIONALITY\n\n    /**\n     * @dev returns the next seq for a target address.\n     * The transactor must submit nextSeqOf(transactor) in the next transaction for it to be valid.\n     * Note: that the seq context is specific to this smart contract.\n     * @param target The target address.\n     * @return the seq.\n     */\n    //\n    function nextSeqOf(address target) public view returns (uint256) {\n        return nextSeqs[target];\n    }\n\n    /**\n     * @dev Performs a transfer on behalf of the from address, identified by its signature on the delegatedTransfer msg.\n     * Splits a signature byte array into r,s,v for convenience.\n     * @param sig the signature of the delgatedTransfer msg.\n     * @param to The address to transfer to.\n     * @param value The amount to be transferred.\n     * @param serviceFee an optional ERC20 service fee paid to the executor of betaDelegatedTransfer by the from address.\n     * @param seq a sequencing number included by the from address specific to this contract to protect from replays.\n     * @param deadline a block number after which the pre-signed transaction has expired.\n     * @return A boolean that indicates if the operation was successful.\n     */\n    function betaDelegatedTransfer(\n        bytes sig, address to, uint256 value, uint256 serviceFee, uint256 seq, uint256 deadline\n    ) public returns (bool) {\n        require(sig.length == 65, \"signature should have length 65\");\n        bytes32 r;\n        bytes32 s;\n        uint8 v;\n        assembly {\n            r := mload(add(sig, 32))\n            s := mload(add(sig, 64))\n            v := byte(0, mload(add(sig, 96)))\n        }\n        require(_betaDelegatedTransfer(r, s, v, to, value, serviceFee, seq, deadline), \"failed transfer\");\n        return true;\n    }\n\n    /**\n     * @dev Performs a transfer on behalf of the from address, identified by its signature on the betaDelegatedTransfer msg.\n     * Note: both the delegate and transactor sign in the service fees. The transactor, however,\n     * has no control over the gas price, and therefore no control over the transaction time.\n     * Beta prefix chosen to avoid a name clash with an emerging standard in ERC865 or elsewhere.\n     * Internal to the contract - see betaDelegatedTransfer and betaDelegatedTransferBatch.\n     * @param r the r signature of the delgatedTransfer msg.\n     * @param s the s signature of the delgatedTransfer msg.\n     * @param v the v signature of the delgatedTransfer msg.\n     * @param to The address to transfer to.\n     * @param value The amount to be transferred.\n     * @param serviceFee an optional ERC20 service fee paid to the delegate of betaDelegatedTransfer by the from address.\n     * @param seq a sequencing number included by the from address specific to this contract to protect from replays.\n     * @param deadline a block number after which the pre-signed transaction has expired.\n     * @return A boolean that indicates if the operation was successful.\n     */\n    function _betaDelegatedTransfer(\n        bytes32 r, bytes32 s, uint8 v, address to, uint256 value, uint256 serviceFee, uint256 seq, uint256 deadline\n    ) internal whenNotPaused returns (bool) {\n        require(betaDelegateWhitelist[msg.sender], \"Beta feature only accepts whitelisted delegates\");\n        require(value > 0 || serviceFee > 0, \"cannot transfer zero tokens with zero service fee\");\n        require(block.number <= deadline, \"transaction expired\");\n        // prevent sig malleability from ecrecover()\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \"signature incorrect\");\n        require(v == 27 || v == 28, \"signature incorrect\");\n\n        // EIP712 scheme: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md\n        bytes32 hash = keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, keccak256(abi.encodePacked(// solium-disable-line\n                EIP712_DELEGATED_TRANSFER_SCHEMA_HASH, bytes32(to), value, serviceFee, seq, deadline\n        ))));\n        address _from = ecrecover(hash, v, r, s);\n\n        require(_from != address(0), \"error determining from address from signature\");\n        require(to != address(0), \"cannot use address zero\");\n        require(!frozen[to] && !frozen[_from] && !frozen[msg.sender], \"address frozen\");\n        require(value.add(serviceFee) <= balances[_from], \"insufficient funds or bad signature\");\n        require(nextSeqs[_from] == seq, \"incorrect seq\");\n\n        nextSeqs[_from] = nextSeqs[_from].add(1);\n\n        uint256 _principle = _transfer(_from, to, value);\n\n        if (serviceFee != 0) {\n            balances[_from] = balances[_from].sub(serviceFee);\n            balances[msg.sender] = balances[msg.sender].add(serviceFee);\n            emit Transfer(_from, msg.sender, serviceFee);\n        }\n\n        emit BetaDelegatedTransfer(_from, to, _principle, seq, serviceFee);\n        return true;\n    }\n\n    /**\n     * @dev Performs an atomic batch of transfers on behalf of the from addresses, identified by their signatures.\n     * Lack of nested array support in arguments requires all arguments to be passed as equal size arrays where\n     * delegated transfer number i is the combination of all arguments at index i\n     * @param r the r signatures of the delgatedTransfer msg.\n     * @param s the s signatures of the delgatedTransfer msg.\n     * @param v the v signatures of the delgatedTransfer msg.\n     * @param to The addresses to transfer to.\n     * @param value The amounts to be transferred.\n     * @param serviceFee optional ERC20 service fees paid to the delegate of betaDelegatedTransfer by the from address.\n     * @param seq sequencing numbers included by the from address specific to this contract to protect from replays.\n     * @param deadline block numbers after which the pre-signed transactions have expired.\n     * @return A boolean that indicates if the operation was successful.\n     */\n    function betaDelegatedTransferBatch(\n        bytes32[] r, bytes32[] s, uint8[] v, address[] to, uint256[] value, uint256[] serviceFee, uint256[] seq, uint256[] deadline\n    ) public returns (bool) {\n        require(r.length == s.length && r.length == v.length && r.length == to.length && r.length == value.length, \"length mismatch\");\n        require(r.length == serviceFee.length && r.length == seq.length && r.length == deadline.length, \"length mismatch\");\n\n        for (uint i = 0; i < r.length; i++) {\n            require(\n                _betaDelegatedTransfer(r[i], s[i], v[i], to[i], value[i], serviceFee[i], seq[i], deadline[i]),\n                \"failed transfer\"\n            );\n        }\n        return true;\n    }\n\n    /**\n    * @dev Gets whether the address is currently whitelisted for betaDelegateTransfer.\n    * @param _addr The address to check if whitelisted.\n    * @return A bool representing whether the given address is whitelisted.\n    */\n    function isWhitelistedBetaDelegate(address _addr) public view returns (bool) {\n        return betaDelegateWhitelist[_addr];\n    }\n\n    /**\n     * @dev Sets a new betaDelegate whitelister.\n     * @param _newWhitelister The address allowed to whitelist betaDelegates.\n     */\n    function setBetaDelegateWhitelister(address _newWhitelister) public {\n        require(msg.sender == betaDelegateWhitelister || msg.sender == owner, \"only Whitelister or Owner\");\n        betaDelegateWhitelister = _newWhitelister;\n        emit BetaDelegateWhitelisterSet(betaDelegateWhitelister, _newWhitelister);\n    }\n\n    modifier onlyBetaDelegateWhitelister() {\n        require(msg.sender == betaDelegateWhitelister, \"onlyBetaDelegateWhitelister\");\n        _;\n    }\n\n    /**\n     * @dev Whitelists an address to allow calling BetaDelegatedTransfer.\n     * @param _addr The new address to whitelist.\n     */\n    function whitelistBetaDelegate(address _addr) public onlyBetaDelegateWhitelister {\n        require(!betaDelegateWhitelist[_addr], \"delegate already whitelisted\");\n        betaDelegateWhitelist[_addr] = true;\n        emit BetaDelegateWhitelisted(_addr);\n    }\n\n    /**\n     * @dev Unwhitelists an address to disallow calling BetaDelegatedTransfer.\n     * @param _addr The new address to whitelist.\n     */\n    function unwhitelistBetaDelegate(address _addr) public onlyBetaDelegateWhitelister {\n        require(betaDelegateWhitelist[_addr], \"delegate not whitelisted\");\n        betaDelegateWhitelist[_addr] = false;\n        emit BetaDelegateUnwhitelisted(_addr);\n    }\n\n    // FEE CONTROLLER FUNCTIONALITY\n\n    /**\n     * @dev Sets a new fee controller address.\n     * @param _newFeeController The address allowed to set the fee rate and the fee recipient.\n     */\n    function setFeeController(address _newFeeController) public {\n        require(msg.sender == feeController || msg.sender == owner, \"only FeeController or Owner\");\n        require(_newFeeController != address(0), \"cannot set fee controller to address zero\");\n        address _oldFeeController = feeController;\n        feeController = _newFeeController;\n        emit FeeControllerSet(_oldFeeController, feeController);\n    }\n\n    modifier onlyFeeController() {\n        require(msg.sender == feeController, \"only FeeController\");\n        _;\n    }\n\n    /**\n     * @dev Sets a new fee recipient address.\n     * @param _newFeeRecipient The address allowed to collect transfer fees for transfers.\n     */\n    function setFeeRecipient(address _newFeeRecipient) public onlyFeeController {\n        require(_newFeeRecipient != address(0), \"cannot set fee recipient to address zero\");\n        address _oldFeeRecipient = feeRecipient;\n        feeRecipient = _newFeeRecipient;\n        emit FeeRecipientSet(_oldFeeRecipient, feeRecipient);\n    }\n\n    /**\n     * @dev Sets a new fee rate.\n     * @param _newFeeRate The new fee rate to collect as transfer fees for transfers.\n     */\n    function setFeeRate(uint256 _newFeeRate) public onlyFeeController {\n        require(_newFeeRate <= feeParts, \"cannot set fee rate above 100%\");\n        uint256 _oldFeeRate = feeRate;\n        feeRate = _newFeeRate;\n        emit FeeRateSet(_oldFeeRate, feeRate);\n    }\n\n    /**\n    * @dev Gets a fee for a given value\n    * ex: given feeRate = 200 and feeParts = 1,000,000 then getFeeFor(10000) = 2\n    * @param _value The amount to get the fee for.\n    */\n    function getFeeFor(uint256 _value) public view returns (uint256) {\n        if (feeRate == 0) {\n            return 0;\n        }\n\n        return _value.mul(feeRate).div(feeParts);\n    }\n}\n","deployed_bytecode":"0x6080604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303acb448811461024a57806306fdde0314610261578063095ea7b3146102eb5780630a91b601146103235780630abe469a1461035457806318160ddd1461037e5780631b6705611461039357806321ab11f71461057757806323b872dd146105f05780632ff791611461061a578063313ce5671461062f5780633ed4c6781461065a5780633f4ba83a1461067b57806345596e2e1461069057806345c8b1a6146106a857806346904840146106c95780634e71e0c8146106de57806352875bc3146106f357806357526b3f146107145780635c975abb146107295780636999b3771461073e57806370a08231146107535780638129fc1c146107745780638456cb591461078957806389f72c211461079e5780638ceed9cb146107bf5780638d1fdf2f146107e05780638da5cb5b1461080157806395d89b4114610816578063978bbdb91461082b57806397d60d561461084057806398e52f9a14610861578063a7d87ed014610879578063a9059cbb1461089a578063ac69275c146108be578063b5ed298a146108df578063b921e16314610900578063c4f62fee14610918578063cc0f17861461092d578063d153b60c14610942578063d990c61814610957578063dd62ed3e14610978578063e2f72f031461099f578063e306f779146109c0578063e5839836146109d5578063e74b981b146109f6578063e7ba101214610a17578063fa1d9b0f14610a2c575b600080fd5b34801561025657600080fd5b5061025f610a41565b005b34801561026d57600080fd5b50610276610b92565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b0578181015183820152602001610298565b50505050905090810190601f1680156102dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102f757600080fd5b5061030f600160a060020a0360043516602435610bc9565b604080519115158252519081900360200190f35b34801561032f57600080fd5b50610338610d00565b60408051600160a060020a039092168252519081900360200190f35b34801561036057600080fd5b5061036c600435610d0f565b60408051918252519081900360200190f35b34801561038a57600080fd5b5061036c610d54565b34801561039f57600080fd5b506040805160206004803580820135838102808601850190965280855261030f95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610d5a9650505050505050565b34801561058357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261030f94369492936024939284019190819084018382808284375094975050600160a060020a0385351695505050602083013592604081013592506060810135915060800135610f97565b3480156105fc57600080fd5b5061030f600160a060020a0360043581169060243516604435611073565b34801561062657600080fd5b5061025f611321565b34801561063b57600080fd5b5061064461148f565b6040805160ff9092168252519081900360200190f35b34801561066657600080fd5b5061025f600160a060020a0360043516611494565b34801561068757600080fd5b5061025f6115eb565b34801561069c57600080fd5b5061025f6004356116e7565b3480156106b457600080fd5b5061025f600160a060020a03600435166117e1565b3480156106d557600080fd5b506103386118fe565b3480156106ea57600080fd5b5061025f61190d565b3480156106ff57600080fd5b5061025f600160a060020a03600435166119d3565b34801561072057600080fd5b5061036c611b2e565b34801561073557600080fd5b5061030f611b35565b34801561074a57600080fd5b50610338611b45565b34801561075f57600080fd5b5061036c600160a060020a0360043516611b54565b34801561078057600080fd5b5061025f611b6f565b34801561079557600080fd5b5061025f611c31565b3480156107aa57600080fd5b5061036c600160a060020a0360043516611d32565b3480156107cb57600080fd5b5061025f600160a060020a0360043516611d4d565b3480156107ec57600080fd5b5061025f600160a060020a0360043516611e48565b34801561080d57600080fd5b50610338611f67565b34801561082257600080fd5b50610276611f76565b34801561083757600080fd5b5061036c611fad565b34801561084c57600080fd5b5061025f600160a060020a0360043516611fb3565b34801561086d57600080fd5b5061030f60043561207c565b34801561088557600080fd5b5061030f600160a060020a036004351661222b565b3480156108a657600080fd5b5061030f600160a060020a0360043516602435612249565b3480156108ca57600080fd5b5061025f600160a060020a03600435166123f5565b3480156108eb57600080fd5b5061025f600160a060020a0360043516612514565b34801561090c57600080fd5b5061030f6004356126a2565b34801561092457600080fd5b506103386127dd565b34801561093957600080fd5b506106446127ec565b34801561094e57600080fd5b506103386127f1565b34801561096357600080fd5b5061025f600160a060020a0360043516612800565b34801561098457600080fd5b5061036c600160a060020a036004358116906024351661291d565b3480156109ab57600080fd5b5061025f600160a060020a0360043516612948565b3480156109cc57600080fd5b5061036c612af9565b3480156109e157600080fd5b5061030f600160a060020a0360043516612aff565b348015610a0257600080fd5b5061025f600160a060020a0360043516612b1d565b348015610a2357600080fd5b50610338612c5d565b348015610a3857600080fd5b5061025f612c6c565b600554600090600160a060020a0316331480610a675750600454600160a060020a031633145b1515610abd576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c792070726f706f7365644f776e6572206f72206f776e65720000000000604482015290519081900360640190fd5b600554600160a060020a03161515610b45576040805160e560020a62461bcd02815260206004820152603b60248201527f63616e206f6e6c792064697372656761726420612070726f706f736564206f7760448201527f6e65722074686174207761732070726576696f75736c79207365740000000000606482015290519081900360840190fd5b5060058054600160a060020a03198116909155604051600160a060020a039091169081907f24f4590b0077912a4db89e7430de7986175c27bede1b47ee039e3b421c2e798e90600090a250565b60408051808201909152601281527f48657263756c697320476f6c6420436f696e0000000000000000000000000000602082015281565b60055460009060a060020a900460ff1615610c1c576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526007602052604090205460ff16158015610c5557503360009081526007602052604090205460ff16155b1515610c99576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b336000818152600360209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b600654600160a060020a031681565b6000600d5460001415610d2457506000610d4f565b610d4c620f4240610d40600d5485612d4690919063ffffffff16565b9063ffffffff612d7f16565b90505b919050565b60025490565b60008088518a51148015610d6f575087518a51145b8015610d7c575086518a51145b8015610d89575085518a51145b1515610ddf576040805160e560020a62461bcd02815260206004820152600f60248201527f6c656e677468206d69736d617463680000000000000000000000000000000000604482015290519081900360640190fd5b84518a51148015610df1575083518a51145b8015610dfe575082518a51145b1515610e54576040805160e560020a62461bcd02815260206004820152600f60248201527f6c656e677468206d69736d617463680000000000000000000000000000000000604482015290519081900360640190fd5b5060005b8951811015610f8757610f298a82815181101515610e7257fe5b906020019060200201518a83815181101515610e8a57fe5b906020019060200201518a84815181101515610ea257fe5b906020019060200201518a85815181101515610eba57fe5b906020019060200201518a86815181101515610ed257fe5b906020019060200201518a87815181101515610eea57fe5b906020019060200201518a88815181101515610f0257fe5b906020019060200201518a89815181101515610f1a57fe5b90602001906020020151612da2565b1515610f7f576040805160e560020a62461bcd02815260206004820152600f60248201527f6661696c6564207472616e736665720000000000000000000000000000000000604482015290519081900360640190fd5b600101610e58565b5060019998505050505050505050565b60008060008089516041141515610ff8576040805160e560020a62461bcd02815260206004820152601f60248201527f7369676e61747572652073686f756c642068617665206c656e67746820363500604482015290519081900360640190fd5b50505060208701516040880151606089015160001a61101d8383838c8c8c8c8c612da2565b1515610f87576040805160e560020a62461bcd02815260206004820152600f60248201527f6661696c6564207472616e736665720000000000000000000000000000000000604482015290519081900360640190fd5b60055460009060a060020a900460ff16156110c6576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b600160a060020a0383161515611126576040805160e560020a62461bcd02815260206004820152601f60248201527f63616e6e6f74207472616e7366657220746f2061646472657373207a65726f00604482015290519081900360640190fd5b600160a060020a03831660009081526007602052604090205460ff161580156111685750600160a060020a03841660009081526007602052604090205460ff16155b801561118457503360009081526007602052604090205460ff16155b15156111c8576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b600160a060020a038416600090815260016020526040902054821115611238576040805160e560020a62461bcd02815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03841660009081526003602090815260408083203384529091529020548211156112b3576040805160e560020a62461bcd02815260206004820152601660248201527f696e73756666696369656e7420616c6c6f77616e636500000000000000000000604482015290519081900360640190fd5b600160a060020a03841660009081526003602090815260408083203384529091529020546112e7908363ffffffff6136dc16565b600160a060020a03851660009081526003602090815260408083203384529091529020556113168484846136f3565b506001949350505050565b604080517f454950373132446f6d61696e28737472696e67206e616d652c6164647265737381527f20766572696679696e67436f6e747261637429000000000000000000000000006020808301919091528251918290036033018220828401845260128084527f48657263756c697320476f6c6420436f696e000000000000000000000000000092840192835293519093909182918083835b602083106113d95780518252601f1990920191602091820191016113ba565b51815160209384036101000a60001901801990921691161790526040805192909401829003822082820197909752818401969096523060608083019190915283518083039091018152608090910192839052805190959294508493509185019190508083835b6020831061145e5780518252601f19909201916020918201910161143f565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600c55505050565b601281565b600e54600090600160a060020a03163314806114ba5750600454600160a060020a031633145b1515611510576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920466565436f6e74726f6c6c6572206f72204f776e65720000000000604482015290519081900360640190fd5b600160a060020a0382161515611596576040805160e560020a62461bcd02815260206004820152602960248201527f63616e6e6f74207365742066656520636f6e74726f6c6c657220746f2061646460448201527f72657373207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50600e8054600160a060020a03838116600160a060020a03198316179283905560405191811692169082907f9f67a87fdd653dfcdb36c8e3f851b597fb84328e3e90b118af01dc93a94e2eb590600090a35050565b600454600160a060020a0316331461163b576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b60055460a060020a900460ff16151561169e576040805160e560020a62461bcd02815260206004820152601060248201527f616c726561647920756e70617573656400000000000000000000000000000000604482015290519081900360640190fd5b6005805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600e54600090600160a060020a0316331461174c576040805160e560020a62461bcd02815260206004820152601260248201527f6f6e6c7920466565436f6e74726f6c6c65720000000000000000000000000000604482015290519081900360640190fd5b620f42408211156117a7576040805160e560020a62461bcd02815260206004820152601e60248201527f63616e6e6f74207365742066656520726174652061626f766520313030250000604482015290519081900360640190fd5b50600d805490829055604051829082907f959ec4191db1bd972bfbc60dc7d735d4cfb897ca3fd297f4ebd6ee918feb84d490600090a35050565b600654600160a060020a03163314611843576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c79417373657450726f74656374696f6e526f6c65000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526007602052604090205460ff1615156118b5576040805160e560020a62461bcd02815260206004820152601860248201527f6164647265737320616c726561647920756e66726f7a656e0000000000000000604482015290519081900360640190fd5b600160a060020a038116600081815260076020526040808220805460ff19169055517fc3776b472ebf54114339eec9e4dc924e7ce307a97f5c1ee72b6d474e6e5e8b7c9190a250565b600f54600160a060020a031681565b600554600090600160a060020a03163314611972576040805160e560020a62461bcd02815260206004820152601160248201527f6f6e6c7950726f706f7365644f776e6572000000000000000000000000000000604482015290519081900360640190fd5b506004805460058054600160a060020a0319808416600160a060020a038381169190911795869055911690915560405191811692169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b600854600160a060020a03163314806119f65750600454600160a060020a031633145b1515611a4c576040805160e560020a62461bcd02815260206004820152601e60248201527f6f6e6c7920537570706c79436f6e74726f6c6c6572206f72204f776e65720000604482015290519081900360640190fd5b600160a060020a0381161515611ad2576040805160e560020a62461bcd02815260206004820152602c60248201527f63616e6e6f742073657420737570706c7920636f6e74726f6c6c657220746f2060448201527f61646472657373207a65726f0000000000000000000000000000000000000000606482015290519081900360840190fd5b600854604051600160a060020a038084169216907f40d53b0b666e4424f29d55244e7e171a1dc332acc11d04ed4abd884629d8cc9790600090a360088054600160a060020a031916600160a060020a0392909216919091179055565b620f424081565b60055460a060020a900460ff1681565b600e54600160a060020a031681565b600160a060020a031660009081526001602052604090205490565b60005460ff1615611bca576040805160e560020a62461bcd02815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b6004805433600160a060020a03199182168117909255600580548216905560068054821690556000600281905560088054831684179055600d55600e8054821683179055600f80549091169091179055611c22611321565b6000805460ff19166001179055565b600454600160a060020a03163314611c81576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b60055460a060020a900460ff1615611ce3576040805160e560020a62461bcd02815260206004820152600e60248201527f616c726561647920706175736564000000000000000000000000000000000000604482015290519081900360640190fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600160a060020a03166000908152600b602052604090205490565b600654600160a060020a0316331480611d705750600454600160a060020a031633145b1515611dec576040805160e560020a62461bcd02815260206004820152602160248201527f6f6e6c7920617373657450726f74656374696f6e526f6c65206f72204f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600654604051600160a060020a038084169216907fd0c36a0ac0fe0d375386bd568fa2947a2dae7523a0a0cfdab20b7532a105bd1b90600090a360068054600160a060020a031916600160a060020a0392909216919091179055565b600654600160a060020a03163314611eaa576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c79417373657450726f74656374696f6e526f6c65000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526007602052604090205460ff1615611f1b576040805160e560020a62461bcd02815260206004820152601660248201527f6164647265737320616c72656164792066726f7a656e00000000000000000000604482015290519081900360640190fd5b600160a060020a038116600081815260076020526040808220805460ff19166001179055517f90811a8edd3b3c17eeaefffc17f639cc69145d41a359c9843994dc25382036909190a250565b600454600160a060020a031681565b60408051808201909152600481527f5841554800000000000000000000000000000000000000000000000000000000602082015281565b600d5481565b600954600160a060020a0316331480611fd65750600454600160a060020a031633145b151561202c576040805160e560020a62461bcd02815260206004820152601960248201527f6f6e6c792057686974656c6973746572206f72204f776e657200000000000000604482015290519081900360640190fd5b60098054600160a060020a031916600160a060020a0383811691821792839055604051919216907f54e20b07412504aee4d17519747ae2f01b9924f7f30059793fe5576c4220a0c390600090a350565b600854600090600160a060020a031633146120e1576040805160e560020a62461bcd02815260206004820152601460248201527f6f6e6c79537570706c79436f6e74726f6c6c6572000000000000000000000000604482015290519081900360640190fd5b600854600160a060020a0316600090815260016020526040902054821115612153576040805160e560020a62461bcd02815260206004820152601160248201527f6e6f7420656e6f75676820737570706c79000000000000000000000000000000604482015290519081900360640190fd5b600854600160a060020a031660009081526001602052604090205461217e908363ffffffff6136dc16565b600854600160a060020a03166000908152600160205260409020556002546121ac908363ffffffff6136dc16565b600255600854604080518481529051600160a060020a03909216917f1b7e18241beced0d7f41fbab1ea8ed468732edbcb74ec4420151654ca71c8a639181900360200190a2600854604080518481529051600092600160a060020a0316916000805160206138dd833981519152919081900360200190a3506001919050565b600160a060020a03166000908152600a602052604090205460ff1690565b60055460009060a060020a900460ff161561229c576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b600160a060020a03831615156122fc576040805160e560020a62461bcd02815260206004820152601f60248201527f63616e6e6f74207472616e7366657220746f2061646472657373207a65726f00604482015290519081900360640190fd5b600160a060020a03831660009081526007602052604090205460ff1615801561233557503360009081526007602052604090205460ff16155b1515612379576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b336000908152600160205260409020548211156123e0576040805160e560020a62461bcd02815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b6123eb3384846136f3565b5060019392505050565b600954600160a060020a03163314612457576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c794265746144656c656761746557686974656c69737465720000000000604482015290519081900360640190fd5b600160a060020a0381166000908152600a602052604090205460ff16156124c8576040805160e560020a62461bcd02815260206004820152601c60248201527f64656c656761746520616c72656164792077686974656c697374656400000000604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020526040808220805460ff19166001179055517f8a22e0d8ecb02260464e9a55b7d82b17482735ae1f765de59dee573dfec5b36d9190a250565b600454600160a060020a03163314612564576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b600160a060020a03811615156125ea576040805160e560020a62461bcd02815260206004820152602960248201527f63616e6e6f74207472616e73666572206f776e65727368697020746f2061646460448201527f72657373207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a038216141561264b576040805160e560020a62461bcd02815260206004820152601760248201527f63616c6c657220616c7265616479206973206f776e6572000000000000000000604482015290519081900360640190fd5b60058054600160a060020a031916600160a060020a038381169190911791829055600454604051928216929116907ff4e75b79500ab730f8a026ed3cba6d55331bcb64c9e9f60c548e371356e5e3c090600090a350565b600854600090600160a060020a03163314612707576040805160e560020a62461bcd02815260206004820152601460248201527f6f6e6c79537570706c79436f6e74726f6c6c6572000000000000000000000000604482015290519081900360640190fd5b60025461271a908363ffffffff61388a16565b600255600854600160a060020a0316600090815260016020526040902054612748908363ffffffff61388a16565b60088054600160a060020a03908116600090815260016020908152604091829020949094559154825186815292519116927ff5c174d57843e57fea3c649fdde37f015ef08750759cbee88060390566a98797928290030190a2600854604080518481529051600160a060020a03909216916000916000805160206138dd833981519152919081900360200190a3506001919050565b600954600160a060020a031681565b600681565b600554600160a060020a031681565b600954600160a060020a03163314612862576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c794265746144656c656761746557686974656c69737465720000000000604482015290519081900360640190fd5b600160a060020a0381166000908152600a602052604090205460ff1615156128d4576040805160e560020a62461bcd02815260206004820152601860248201527f64656c6567617465206e6f742077686974656c69737465640000000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020526040808220805460ff19169055517f12acb305bec2ecc1e4568decc9c8e0423749ceb6ae249eaef4ef375ec174a49c9190a250565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600654600090600160a060020a031633146129ad576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c79417373657450726f74656374696f6e526f6c65000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526007602052604090205460ff161515612a1f576040805160e560020a62461bcd02815260206004820152601560248201527f61646472657373206973206e6f742066726f7a656e0000000000000000000000604482015290519081900360640190fd5b50600160a060020a03811660009081526001602052604081208054919055600254612a50908263ffffffff6136dc16565b600255604051600160a060020a038316907ffc5960f1c5a5d2b60f031bf534af053b1bf7d9881989afaeb8b1d164db23aede90600090a2604080518281529051600160a060020a038416917f1b7e18241beced0d7f41fbab1ea8ed468732edbcb74ec4420151654ca71c8a63919081900360200190a2604080518281529051600091600160a060020a038516916000805160206138dd8339815191529181900360200190a35050565b600c5481565b600160a060020a031660009081526007602052604090205460ff1690565b600e54600090600160a060020a03163314612b82576040805160e560020a62461bcd02815260206004820152601260248201527f6f6e6c7920466565436f6e74726f6c6c65720000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382161515612c08576040805160e560020a62461bcd02815260206004820152602860248201527f63616e6e6f74207365742066656520726563697069656e7420746f206164647260448201527f657373207a65726f000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50600f8054600160a060020a03838116600160a060020a03198316179283905560405191811692169082907f15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa7084015272190600090a35050565b600854600160a060020a031681565b600454600090600160a060020a03163314612cbf576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b5030600090815260016020526040808220805490839055600454600160a060020a03168352912054612cf7908263ffffffff61388a16565b60048054600160a060020a039081166000908152600160209081526040918290209490945591548251858152925191169230926000805160206138dd833981519152929081900390910190a350565b600080831515612d595760009150612d78565b50828202828482811515612d6957fe5b0414612d7457600080fd5b8091505b5092915050565b600080808311612d8e57600080fd5b8284811515612d9957fe5b04949350505050565b60055460009081908190819060a060020a900460ff1615612dfb576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b336000908152600a602052604090205460ff161515612e8a576040805160e560020a62461bcd02815260206004820152602f60248201527f426574612066656174757265206f6e6c7920616363657074732077686974656c60448201527f69737465642064656c6567617465730000000000000000000000000000000000606482015290519081900360840190fd5b6000881180612e995750600087115b1515612f15576040805160e560020a62461bcd02815260206004820152603160248201527f63616e6e6f74207472616e73666572207a65726f20746f6b656e73207769746860448201527f207a65726f207365727669636520666565000000000000000000000000000000606482015290519081900360840190fd5b43851015612f6d576040805160e560020a62461bcd02815260206004820152601360248201527f7472616e73616374696f6e206578706972656400000000000000000000000000604482015290519081900360640190fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08b1115612fe5576040805160e560020a62461bcd02815260206004820152601360248201527f7369676e617475726520696e636f727265637400000000000000000000000000604482015290519081900360640190fd5b8960ff16601b1480612ffa57508960ff16601c145b1515613050576040805160e560020a62461bcd02815260206004820152601360248201527f7369676e617475726520696e636f727265637400000000000000000000000000604482015290519081900360640190fd5b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191909152600c5483517f4265746144656c6567617465645472616e73666572286164647265737320746f81527f2c75696e743235362076616c75652c75696e7432353620736572766963654665818401527f652c75696e74323536207365712c75696e7432353620646561646c696e65290081860152845190819003605f01812081840152600160a060020a038e1681860152606081018d9052608081018c905260a081018b905260c08082018b90528551808303909101815260e09091019485905280519394919390928291908401908083835b602083106131775780518252601f199092019160209182019101613158565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955090830193508392870191508083835b602083106131d05780518252601f1990920191602091820191016131b1565b51815160209384036101000a6000190180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b602083106132385780518252601f199092019160209182019101613219565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902092506001838b8e8e604051600081526020016040526040518085600019166000191681526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019450505050506020604051602081039080840390855afa1580156132dc573d6000803e3d6000fd5b5050604051601f190151925050600160a060020a038216151561336f576040805160e560020a62461bcd02815260206004820152602d60248201527f6572726f722064657465726d696e696e672066726f6d2061646472657373206660448201527f726f6d207369676e617475726500000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03891615156133cf576040805160e560020a62461bcd02815260206004820152601760248201527f63616e6e6f74207573652061646472657373207a65726f000000000000000000604482015290519081900360640190fd5b600160a060020a03891660009081526007602052604090205460ff161580156134115750600160a060020a03821660009081526007602052604090205460ff16155b801561342d57503360009081526007602052604090205460ff16155b1515613471576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602052604090205461349a898963ffffffff61388a16565b1115613516576040805160e560020a62461bcd02815260206004820152602360248201527f696e73756666696369656e742066756e6473206f7220626164207369676e617460448201527f7572650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382166000908152600b60205260409020548614613585576040805160e560020a62461bcd02815260206004820152600d60248201527f696e636f72726563742073657100000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600b60205260409020546135af90600163ffffffff61388a16565b600160a060020a0383166000908152600b60205260409020556135d3828a8a6136f3565b9050861561367a57600160a060020a038216600090815260016020526040902054613604908863ffffffff6136dc16565b600160a060020a038316600090815260016020526040808220929092553381522054613636908863ffffffff61388a16565b336000818152600160209081526040918290209390935580518a815290519192600160a060020a038616926000805160206138dd8339815191529281900390910190a35b60408051828152602081018890528082018990529051600160a060020a03808c1692908516917fe526c2818be85606ab8e0ea3f317c198ef15baabbb4430bcf2d836eed3c7769b9181900360600190a35060019b9a5050505050505050505050565b600080838311156136ec57600080fd5b5050900390565b600080600061370184610d0f565b9150613713848363ffffffff6136dc16565b600160a060020a03871660009081526001602052604090205490915061373f908563ffffffff6136dc16565b600160a060020a038088166000908152600160205260408082209390935590871681522054613774908263ffffffff61388a16565b600160a060020a0380871660008181526001602090815260409182902094909455805185815290519193928a16926000805160206138dd83398151915292918290030190a3600f54604080518481529051600160a060020a03928316928916916000805160206138dd833981519152919081900360200190a3600082111561388157600f54600160a060020a0316600090815260016020526040902054613821908363ffffffff61388a16565b600f8054600160a060020a039081166000908152600160209081526040918290209490945591548251868152925190821693918a16927ff228de527fc1b9843baac03b9a04565473a263375950e63435d4138464386f4692908290030190a35b95945050505050565b600082820183811015612d7457600080fd00616464726573732066726f7a656e0000000000000000000000000000000000007768656e4e6f7450617573656400000000000000000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6f6e6c794f776e65720000000000000000000000000000000000000000000000a165627a7a723058201ece7b49fddc30e30b4e662b6b1f1354b5bbe268c08856c24dd42b58332281640029","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"libraries":{},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}}},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":null,"compiler_version":"v0.4.24+commit.e67f0147","is_verified_via_verifier_alliance":false,"verified_at":"2026-07-16T18:56:54.374973Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60806040526000805460ff191690556005805460a060020a60ff02191690553480156200002b57600080fd5b506200003f64010000000062000058810204565b620000526401000000006200013d810204565b62000406565b60005460ff1615620000cb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b6004805433600160a060020a03199182168117909255600580548216905560068054821690556000600281905560088054831684179055600d55600e8054821683179055600f805490911690911790556200012e64010000000062000294810204565b6000805460ff19166001179055565b600454600160a060020a03163314620001b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f6f6e6c794f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60055474010000000000000000000000000000000000000000900460ff16156200024257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c726561647920706175736564000000000000000000000000000000000000604482015290519081900360640190fd5b6005805460a060020a60ff021916740100000000000000000000000000000000000000001790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b604080517f454950373132446f6d61696e28737472696e67206e616d652c6164647265737381527f20766572696679696e67436f6e747261637429000000000000000000000000006020808301919091528251918290036033018220828401845260128084527f48657263756c697320476f6c6420436f696e000000000000000000000000000092840192835293519093909182918083835b602083106200034e5780518252601f1990920191602091820191016200032d565b51815160209384036101000a60001901801990921691161790526040805192909401829003822082820197909752818401969096523060608083019190915283518083039091018152608090910192839052805190959294508493509185019190508083835b60208310620003d55780518252601f199092019160209182019101620003b4565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600c55505050565b61394880620004166000396000f3006080604052600436106102455763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303acb448811461024a57806306fdde0314610261578063095ea7b3146102eb5780630a91b601146103235780630abe469a1461035457806318160ddd1461037e5780631b6705611461039357806321ab11f71461057757806323b872dd146105f05780632ff791611461061a578063313ce5671461062f5780633ed4c6781461065a5780633f4ba83a1461067b57806345596e2e1461069057806345c8b1a6146106a857806346904840146106c95780634e71e0c8146106de57806352875bc3146106f357806357526b3f146107145780635c975abb146107295780636999b3771461073e57806370a08231146107535780638129fc1c146107745780638456cb591461078957806389f72c211461079e5780638ceed9cb146107bf5780638d1fdf2f146107e05780638da5cb5b1461080157806395d89b4114610816578063978bbdb91461082b57806397d60d561461084057806398e52f9a14610861578063a7d87ed014610879578063a9059cbb1461089a578063ac69275c146108be578063b5ed298a146108df578063b921e16314610900578063c4f62fee14610918578063cc0f17861461092d578063d153b60c14610942578063d990c61814610957578063dd62ed3e14610978578063e2f72f031461099f578063e306f779146109c0578063e5839836146109d5578063e74b981b146109f6578063e7ba101214610a17578063fa1d9b0f14610a2c575b600080fd5b34801561025657600080fd5b5061025f610a41565b005b34801561026d57600080fd5b50610276610b92565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b0578181015183820152602001610298565b50505050905090810190601f1680156102dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102f757600080fd5b5061030f600160a060020a0360043516602435610bc9565b604080519115158252519081900360200190f35b34801561032f57600080fd5b50610338610d00565b60408051600160a060020a039092168252519081900360200190f35b34801561036057600080fd5b5061036c600435610d0f565b60408051918252519081900360200190f35b34801561038a57600080fd5b5061036c610d54565b34801561039f57600080fd5b506040805160206004803580820135838102808601850190965280855261030f95369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610d5a9650505050505050565b34801561058357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261030f94369492936024939284019190819084018382808284375094975050600160a060020a0385351695505050602083013592604081013592506060810135915060800135610f97565b3480156105fc57600080fd5b5061030f600160a060020a0360043581169060243516604435611073565b34801561062657600080fd5b5061025f611321565b34801561063b57600080fd5b5061064461148f565b6040805160ff9092168252519081900360200190f35b34801561066657600080fd5b5061025f600160a060020a0360043516611494565b34801561068757600080fd5b5061025f6115eb565b34801561069c57600080fd5b5061025f6004356116e7565b3480156106b457600080fd5b5061025f600160a060020a03600435166117e1565b3480156106d557600080fd5b506103386118fe565b3480156106ea57600080fd5b5061025f61190d565b3480156106ff57600080fd5b5061025f600160a060020a03600435166119d3565b34801561072057600080fd5b5061036c611b2e565b34801561073557600080fd5b5061030f611b35565b34801561074a57600080fd5b50610338611b45565b34801561075f57600080fd5b5061036c600160a060020a0360043516611b54565b34801561078057600080fd5b5061025f611b6f565b34801561079557600080fd5b5061025f611c31565b3480156107aa57600080fd5b5061036c600160a060020a0360043516611d32565b3480156107cb57600080fd5b5061025f600160a060020a0360043516611d4d565b3480156107ec57600080fd5b5061025f600160a060020a0360043516611e48565b34801561080d57600080fd5b50610338611f67565b34801561082257600080fd5b50610276611f76565b34801561083757600080fd5b5061036c611fad565b34801561084c57600080fd5b5061025f600160a060020a0360043516611fb3565b34801561086d57600080fd5b5061030f60043561207c565b34801561088557600080fd5b5061030f600160a060020a036004351661222b565b3480156108a657600080fd5b5061030f600160a060020a0360043516602435612249565b3480156108ca57600080fd5b5061025f600160a060020a03600435166123f5565b3480156108eb57600080fd5b5061025f600160a060020a0360043516612514565b34801561090c57600080fd5b5061030f6004356126a2565b34801561092457600080fd5b506103386127dd565b34801561093957600080fd5b506106446127ec565b34801561094e57600080fd5b506103386127f1565b34801561096357600080fd5b5061025f600160a060020a0360043516612800565b34801561098457600080fd5b5061036c600160a060020a036004358116906024351661291d565b3480156109ab57600080fd5b5061025f600160a060020a0360043516612948565b3480156109cc57600080fd5b5061036c612af9565b3480156109e157600080fd5b5061030f600160a060020a0360043516612aff565b348015610a0257600080fd5b5061025f600160a060020a0360043516612b1d565b348015610a2357600080fd5b50610338612c5d565b348015610a3857600080fd5b5061025f612c6c565b600554600090600160a060020a0316331480610a675750600454600160a060020a031633145b1515610abd576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c792070726f706f7365644f776e6572206f72206f776e65720000000000604482015290519081900360640190fd5b600554600160a060020a03161515610b45576040805160e560020a62461bcd02815260206004820152603b60248201527f63616e206f6e6c792064697372656761726420612070726f706f736564206f7760448201527f6e65722074686174207761732070726576696f75736c79207365740000000000606482015290519081900360840190fd5b5060058054600160a060020a03198116909155604051600160a060020a039091169081907f24f4590b0077912a4db89e7430de7986175c27bede1b47ee039e3b421c2e798e90600090a250565b60408051808201909152601281527f48657263756c697320476f6c6420436f696e0000000000000000000000000000602082015281565b60055460009060a060020a900460ff1615610c1c576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b600160a060020a03831660009081526007602052604090205460ff16158015610c5557503360009081526007602052604090205460ff16155b1515610c99576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b336000818152600360209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b600654600160a060020a031681565b6000600d5460001415610d2457506000610d4f565b610d4c620f4240610d40600d5485612d4690919063ffffffff16565b9063ffffffff612d7f16565b90505b919050565b60025490565b60008088518a51148015610d6f575087518a51145b8015610d7c575086518a51145b8015610d89575085518a51145b1515610ddf576040805160e560020a62461bcd02815260206004820152600f60248201527f6c656e677468206d69736d617463680000000000000000000000000000000000604482015290519081900360640190fd5b84518a51148015610df1575083518a51145b8015610dfe575082518a51145b1515610e54576040805160e560020a62461bcd02815260206004820152600f60248201527f6c656e677468206d69736d617463680000000000000000000000000000000000604482015290519081900360640190fd5b5060005b8951811015610f8757610f298a82815181101515610e7257fe5b906020019060200201518a83815181101515610e8a57fe5b906020019060200201518a84815181101515610ea257fe5b906020019060200201518a85815181101515610eba57fe5b906020019060200201518a86815181101515610ed257fe5b906020019060200201518a87815181101515610eea57fe5b906020019060200201518a88815181101515610f0257fe5b906020019060200201518a89815181101515610f1a57fe5b90602001906020020151612da2565b1515610f7f576040805160e560020a62461bcd02815260206004820152600f60248201527f6661696c6564207472616e736665720000000000000000000000000000000000604482015290519081900360640190fd5b600101610e58565b5060019998505050505050505050565b60008060008089516041141515610ff8576040805160e560020a62461bcd02815260206004820152601f60248201527f7369676e61747572652073686f756c642068617665206c656e67746820363500604482015290519081900360640190fd5b50505060208701516040880151606089015160001a61101d8383838c8c8c8c8c612da2565b1515610f87576040805160e560020a62461bcd02815260206004820152600f60248201527f6661696c6564207472616e736665720000000000000000000000000000000000604482015290519081900360640190fd5b60055460009060a060020a900460ff16156110c6576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b600160a060020a0383161515611126576040805160e560020a62461bcd02815260206004820152601f60248201527f63616e6e6f74207472616e7366657220746f2061646472657373207a65726f00604482015290519081900360640190fd5b600160a060020a03831660009081526007602052604090205460ff161580156111685750600160a060020a03841660009081526007602052604090205460ff16155b801561118457503360009081526007602052604090205460ff16155b15156111c8576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b600160a060020a038416600090815260016020526040902054821115611238576040805160e560020a62461bcd02815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03841660009081526003602090815260408083203384529091529020548211156112b3576040805160e560020a62461bcd02815260206004820152601660248201527f696e73756666696369656e7420616c6c6f77616e636500000000000000000000604482015290519081900360640190fd5b600160a060020a03841660009081526003602090815260408083203384529091529020546112e7908363ffffffff6136dc16565b600160a060020a03851660009081526003602090815260408083203384529091529020556113168484846136f3565b506001949350505050565b604080517f454950373132446f6d61696e28737472696e67206e616d652c6164647265737381527f20766572696679696e67436f6e747261637429000000000000000000000000006020808301919091528251918290036033018220828401845260128084527f48657263756c697320476f6c6420436f696e000000000000000000000000000092840192835293519093909182918083835b602083106113d95780518252601f1990920191602091820191016113ba565b51815160209384036101000a60001901801990921691161790526040805192909401829003822082820197909752818401969096523060608083019190915283518083039091018152608090910192839052805190959294508493509185019190508083835b6020831061145e5780518252601f19909201916020918201910161143f565b5181516020939093036101000a60001901801990911692169190911790526040519201829003909120600c55505050565b601281565b600e54600090600160a060020a03163314806114ba5750600454600160a060020a031633145b1515611510576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c7920466565436f6e74726f6c6c6572206f72204f776e65720000000000604482015290519081900360640190fd5b600160a060020a0382161515611596576040805160e560020a62461bcd02815260206004820152602960248201527f63616e6e6f74207365742066656520636f6e74726f6c6c657220746f2061646460448201527f72657373207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50600e8054600160a060020a03838116600160a060020a03198316179283905560405191811692169082907f9f67a87fdd653dfcdb36c8e3f851b597fb84328e3e90b118af01dc93a94e2eb590600090a35050565b600454600160a060020a0316331461163b576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b60055460a060020a900460ff16151561169e576040805160e560020a62461bcd02815260206004820152601060248201527f616c726561647920756e70617573656400000000000000000000000000000000604482015290519081900360640190fd5b6005805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600e54600090600160a060020a0316331461174c576040805160e560020a62461bcd02815260206004820152601260248201527f6f6e6c7920466565436f6e74726f6c6c65720000000000000000000000000000604482015290519081900360640190fd5b620f42408211156117a7576040805160e560020a62461bcd02815260206004820152601e60248201527f63616e6e6f74207365742066656520726174652061626f766520313030250000604482015290519081900360640190fd5b50600d805490829055604051829082907f959ec4191db1bd972bfbc60dc7d735d4cfb897ca3fd297f4ebd6ee918feb84d490600090a35050565b600654600160a060020a03163314611843576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c79417373657450726f74656374696f6e526f6c65000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526007602052604090205460ff1615156118b5576040805160e560020a62461bcd02815260206004820152601860248201527f6164647265737320616c726561647920756e66726f7a656e0000000000000000604482015290519081900360640190fd5b600160a060020a038116600081815260076020526040808220805460ff19169055517fc3776b472ebf54114339eec9e4dc924e7ce307a97f5c1ee72b6d474e6e5e8b7c9190a250565b600f54600160a060020a031681565b600554600090600160a060020a03163314611972576040805160e560020a62461bcd02815260206004820152601160248201527f6f6e6c7950726f706f7365644f776e6572000000000000000000000000000000604482015290519081900360640190fd5b506004805460058054600160a060020a0319808416600160a060020a038381169190911795869055911690915560405191811692169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b600854600160a060020a03163314806119f65750600454600160a060020a031633145b1515611a4c576040805160e560020a62461bcd02815260206004820152601e60248201527f6f6e6c7920537570706c79436f6e74726f6c6c6572206f72204f776e65720000604482015290519081900360640190fd5b600160a060020a0381161515611ad2576040805160e560020a62461bcd02815260206004820152602c60248201527f63616e6e6f742073657420737570706c7920636f6e74726f6c6c657220746f2060448201527f61646472657373207a65726f0000000000000000000000000000000000000000606482015290519081900360840190fd5b600854604051600160a060020a038084169216907f40d53b0b666e4424f29d55244e7e171a1dc332acc11d04ed4abd884629d8cc9790600090a360088054600160a060020a031916600160a060020a0392909216919091179055565b620f424081565b60055460a060020a900460ff1681565b600e54600160a060020a031681565b600160a060020a031660009081526001602052604090205490565b60005460ff1615611bca576040805160e560020a62461bcd02815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b6004805433600160a060020a03199182168117909255600580548216905560068054821690556000600281905560088054831684179055600d55600e8054821683179055600f80549091169091179055611c22611321565b6000805460ff19166001179055565b600454600160a060020a03163314611c81576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b60055460a060020a900460ff1615611ce3576040805160e560020a62461bcd02815260206004820152600e60248201527f616c726561647920706175736564000000000000000000000000000000000000604482015290519081900360640190fd5b6005805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600160a060020a03166000908152600b602052604090205490565b600654600160a060020a0316331480611d705750600454600160a060020a031633145b1515611dec576040805160e560020a62461bcd02815260206004820152602160248201527f6f6e6c7920617373657450726f74656374696f6e526f6c65206f72204f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600654604051600160a060020a038084169216907fd0c36a0ac0fe0d375386bd568fa2947a2dae7523a0a0cfdab20b7532a105bd1b90600090a360068054600160a060020a031916600160a060020a0392909216919091179055565b600654600160a060020a03163314611eaa576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c79417373657450726f74656374696f6e526f6c65000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526007602052604090205460ff1615611f1b576040805160e560020a62461bcd02815260206004820152601660248201527f6164647265737320616c72656164792066726f7a656e00000000000000000000604482015290519081900360640190fd5b600160a060020a038116600081815260076020526040808220805460ff19166001179055517f90811a8edd3b3c17eeaefffc17f639cc69145d41a359c9843994dc25382036909190a250565b600454600160a060020a031681565b60408051808201909152600481527f5841554800000000000000000000000000000000000000000000000000000000602082015281565b600d5481565b600954600160a060020a0316331480611fd65750600454600160a060020a031633145b151561202c576040805160e560020a62461bcd02815260206004820152601960248201527f6f6e6c792057686974656c6973746572206f72204f776e657200000000000000604482015290519081900360640190fd5b60098054600160a060020a031916600160a060020a0383811691821792839055604051919216907f54e20b07412504aee4d17519747ae2f01b9924f7f30059793fe5576c4220a0c390600090a350565b600854600090600160a060020a031633146120e1576040805160e560020a62461bcd02815260206004820152601460248201527f6f6e6c79537570706c79436f6e74726f6c6c6572000000000000000000000000604482015290519081900360640190fd5b600854600160a060020a0316600090815260016020526040902054821115612153576040805160e560020a62461bcd02815260206004820152601160248201527f6e6f7420656e6f75676820737570706c79000000000000000000000000000000604482015290519081900360640190fd5b600854600160a060020a031660009081526001602052604090205461217e908363ffffffff6136dc16565b600854600160a060020a03166000908152600160205260409020556002546121ac908363ffffffff6136dc16565b600255600854604080518481529051600160a060020a03909216917f1b7e18241beced0d7f41fbab1ea8ed468732edbcb74ec4420151654ca71c8a639181900360200190a2600854604080518481529051600092600160a060020a0316916000805160206138dd833981519152919081900360200190a3506001919050565b600160a060020a03166000908152600a602052604090205460ff1690565b60055460009060a060020a900460ff161561229c576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b600160a060020a03831615156122fc576040805160e560020a62461bcd02815260206004820152601f60248201527f63616e6e6f74207472616e7366657220746f2061646472657373207a65726f00604482015290519081900360640190fd5b600160a060020a03831660009081526007602052604090205460ff1615801561233557503360009081526007602052604090205460ff16155b1515612379576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b336000908152600160205260409020548211156123e0576040805160e560020a62461bcd02815260206004820152601260248201527f696e73756666696369656e742066756e64730000000000000000000000000000604482015290519081900360640190fd5b6123eb3384846136f3565b5060019392505050565b600954600160a060020a03163314612457576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c794265746144656c656761746557686974656c69737465720000000000604482015290519081900360640190fd5b600160a060020a0381166000908152600a602052604090205460ff16156124c8576040805160e560020a62461bcd02815260206004820152601c60248201527f64656c656761746520616c72656164792077686974656c697374656400000000604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020526040808220805460ff19166001179055517f8a22e0d8ecb02260464e9a55b7d82b17482735ae1f765de59dee573dfec5b36d9190a250565b600454600160a060020a03163314612564576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b600160a060020a03811615156125ea576040805160e560020a62461bcd02815260206004820152602960248201527f63616e6e6f74207472616e73666572206f776e65727368697020746f2061646460448201527f72657373207a65726f0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b33600160a060020a038216141561264b576040805160e560020a62461bcd02815260206004820152601760248201527f63616c6c657220616c7265616479206973206f776e6572000000000000000000604482015290519081900360640190fd5b60058054600160a060020a031916600160a060020a038381169190911791829055600454604051928216929116907ff4e75b79500ab730f8a026ed3cba6d55331bcb64c9e9f60c548e371356e5e3c090600090a350565b600854600090600160a060020a03163314612707576040805160e560020a62461bcd02815260206004820152601460248201527f6f6e6c79537570706c79436f6e74726f6c6c6572000000000000000000000000604482015290519081900360640190fd5b60025461271a908363ffffffff61388a16565b600255600854600160a060020a0316600090815260016020526040902054612748908363ffffffff61388a16565b60088054600160a060020a03908116600090815260016020908152604091829020949094559154825186815292519116927ff5c174d57843e57fea3c649fdde37f015ef08750759cbee88060390566a98797928290030190a2600854604080518481529051600160a060020a03909216916000916000805160206138dd833981519152919081900360200190a3506001919050565b600954600160a060020a031681565b600681565b600554600160a060020a031681565b600954600160a060020a03163314612862576040805160e560020a62461bcd02815260206004820152601b60248201527f6f6e6c794265746144656c656761746557686974656c69737465720000000000604482015290519081900360640190fd5b600160a060020a0381166000908152600a602052604090205460ff1615156128d4576040805160e560020a62461bcd02815260206004820152601860248201527f64656c6567617465206e6f742077686974656c69737465640000000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152600a6020526040808220805460ff19169055517f12acb305bec2ecc1e4568decc9c8e0423749ceb6ae249eaef4ef375ec174a49c9190a250565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600654600090600160a060020a031633146129ad576040805160e560020a62461bcd02815260206004820152601760248201527f6f6e6c79417373657450726f74656374696f6e526f6c65000000000000000000604482015290519081900360640190fd5b600160a060020a03821660009081526007602052604090205460ff161515612a1f576040805160e560020a62461bcd02815260206004820152601560248201527f61646472657373206973206e6f742066726f7a656e0000000000000000000000604482015290519081900360640190fd5b50600160a060020a03811660009081526001602052604081208054919055600254612a50908263ffffffff6136dc16565b600255604051600160a060020a038316907ffc5960f1c5a5d2b60f031bf534af053b1bf7d9881989afaeb8b1d164db23aede90600090a2604080518281529051600160a060020a038416917f1b7e18241beced0d7f41fbab1ea8ed468732edbcb74ec4420151654ca71c8a63919081900360200190a2604080518281529051600091600160a060020a038516916000805160206138dd8339815191529181900360200190a35050565b600c5481565b600160a060020a031660009081526007602052604090205460ff1690565b600e54600090600160a060020a03163314612b82576040805160e560020a62461bcd02815260206004820152601260248201527f6f6e6c7920466565436f6e74726f6c6c65720000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382161515612c08576040805160e560020a62461bcd02815260206004820152602860248201527f63616e6e6f74207365742066656520726563697069656e7420746f206164647260448201527f657373207a65726f000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50600f8054600160a060020a03838116600160a060020a03198316179283905560405191811692169082907f15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa7084015272190600090a35050565b600854600160a060020a031681565b600454600090600160a060020a03163314612cbf576040805160e560020a62461bcd02815260206004820152600960248201526000805160206138fd833981519152604482015290519081900360640190fd5b5030600090815260016020526040808220805490839055600454600160a060020a03168352912054612cf7908263ffffffff61388a16565b60048054600160a060020a039081166000908152600160209081526040918290209490945591548251858152925191169230926000805160206138dd833981519152929081900390910190a350565b600080831515612d595760009150612d78565b50828202828482811515612d6957fe5b0414612d7457600080fd5b8091505b5092915050565b600080808311612d8e57600080fd5b8284811515612d9957fe5b04949350505050565b60055460009081908190819060a060020a900460ff1615612dfb576040805160e560020a62461bcd02815260206004820152600d60248201526000805160206138bd833981519152604482015290519081900360640190fd5b336000908152600a602052604090205460ff161515612e8a576040805160e560020a62461bcd02815260206004820152602f60248201527f426574612066656174757265206f6e6c7920616363657074732077686974656c60448201527f69737465642064656c6567617465730000000000000000000000000000000000606482015290519081900360840190fd5b6000881180612e995750600087115b1515612f15576040805160e560020a62461bcd02815260206004820152603160248201527f63616e6e6f74207472616e73666572207a65726f20746f6b656e73207769746860448201527f207a65726f207365727669636520666565000000000000000000000000000000606482015290519081900360840190fd5b43851015612f6d576040805160e560020a62461bcd02815260206004820152601360248201527f7472616e73616374696f6e206578706972656400000000000000000000000000604482015290519081900360640190fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08b1115612fe5576040805160e560020a62461bcd02815260206004820152601360248201527f7369676e617475726520696e636f727265637400000000000000000000000000604482015290519081900360640190fd5b8960ff16601b1480612ffa57508960ff16601c145b1515613050576040805160e560020a62461bcd02815260206004820152601360248201527f7369676e617475726520696e636f727265637400000000000000000000000000604482015290519081900360640190fd5b604080518082018252600281527f1901000000000000000000000000000000000000000000000000000000000000602080830191909152600c5483517f4265746144656c6567617465645472616e73666572286164647265737320746f81527f2c75696e743235362076616c75652c75696e7432353620736572766963654665818401527f652c75696e74323536207365712c75696e7432353620646561646c696e65290081860152845190819003605f01812081840152600160a060020a038e1681860152606081018d9052608081018c905260a081018b905260c08082018b90528551808303909101815260e09091019485905280519394919390928291908401908083835b602083106131775780518252601f199092019160209182019101613158565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955090830193508392870191508083835b602083106131d05780518252601f1990920191602091820191016131b1565b51815160209384036101000a6000190180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b602083106132385780518252601f199092019160209182019101613219565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902092506001838b8e8e604051600081526020016040526040518085600019166000191681526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019450505050506020604051602081039080840390855afa1580156132dc573d6000803e3d6000fd5b5050604051601f190151925050600160a060020a038216151561336f576040805160e560020a62461bcd02815260206004820152602d60248201527f6572726f722064657465726d696e696e672066726f6d2061646472657373206660448201527f726f6d207369676e617475726500000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03891615156133cf576040805160e560020a62461bcd02815260206004820152601760248201527f63616e6e6f74207573652061646472657373207a65726f000000000000000000604482015290519081900360640190fd5b600160a060020a03891660009081526007602052604090205460ff161580156134115750600160a060020a03821660009081526007602052604090205460ff16155b801561342d57503360009081526007602052604090205460ff16155b1515613471576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061389d833981519152604482015290519081900360640190fd5b600160a060020a03821660009081526001602052604090205461349a898963ffffffff61388a16565b1115613516576040805160e560020a62461bcd02815260206004820152602360248201527f696e73756666696369656e742066756e6473206f7220626164207369676e617460448201527f7572650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382166000908152600b60205260409020548614613585576040805160e560020a62461bcd02815260206004820152600d60248201527f696e636f72726563742073657100000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0382166000908152600b60205260409020546135af90600163ffffffff61388a16565b600160a060020a0383166000908152600b60205260409020556135d3828a8a6136f3565b9050861561367a57600160a060020a038216600090815260016020526040902054613604908863ffffffff6136dc16565b600160a060020a038316600090815260016020526040808220929092553381522054613636908863ffffffff61388a16565b336000818152600160209081526040918290209390935580518a815290519192600160a060020a038616926000805160206138dd8339815191529281900390910190a35b60408051828152602081018890528082018990529051600160a060020a03808c1692908516917fe526c2818be85606ab8e0ea3f317c198ef15baabbb4430bcf2d836eed3c7769b9181900360600190a35060019b9a5050505050505050505050565b600080838311156136ec57600080fd5b5050900390565b600080600061370184610d0f565b9150613713848363ffffffff6136dc16565b600160a060020a03871660009081526001602052604090205490915061373f908563ffffffff6136dc16565b600160a060020a038088166000908152600160205260408082209390935590871681522054613774908263ffffffff61388a16565b600160a060020a0380871660008181526001602090815260409182902094909455805185815290519193928a16926000805160206138dd83398151915292918290030190a3600f54604080518481529051600160a060020a03928316928916916000805160206138dd833981519152919081900360200190a3600082111561388157600f54600160a060020a0316600090815260016020526040902054613821908363ffffffff61388a16565b600f8054600160a060020a039081166000908152600160209081526040918290209490945591548251868152925190821693918a16927ff228de527fc1b9843baac03b9a04565473a263375950e63435d4138464386f4692908290030190a35b95945050505050565b600082820183811015612d7457600080fd00616464726573732066726f7a656e0000000000000000000000000000000000007768656e4e6f7450617573656400000000000000000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6f6e6c794f776e65720000000000000000000000000000000000000000000000a165627a7a723058201ece7b49fddc30e30b4e662b6b1f1354b5bbe268c08856c24dd42b58332281640029","name":"XAUHImplementation","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"default","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"constant":false,"inputs":[],"name":"disregardProposeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"assetProtectionRole","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_value","type":"uint256"}],"name":"getFeeFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"v","type":"uint8[]"},{"name":"to","type":"address[]"},{"name":"value","type":"uint256[]"},{"name":"serviceFee","type":"uint256[]"},{"name":"seq","type":"uint256[]"},{"name":"deadline","type":"uint256[]"}],"name":"betaDelegatedTransferBatch","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sig","type":"bytes"},{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"serviceFee","type":"uint256"},{"name":"seq","type":"uint256"},{"name":"deadline","type":"uint256"}],"name":"betaDelegatedTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initializeDomainSeparator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFeeController","type":"address"}],"name":"setFeeController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newFeeRate","type":"uint256"}],"name":"setFeeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"unfreeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newSupplyController","type":"address"}],"name":"setSupplyController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeParts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"}],"name":"nextSeqOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAssetProtectionRole","type":"address"}],"name":"setAssetProtectionRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"freeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newWhitelister","type":"address"}],"name":"setBetaDelegateWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"decreaseSupply","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isWhitelistedBetaDelegate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"whitelistBetaDelegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_proposedOwner","type":"address"}],"name":"proposeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"increaseSupply","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"betaDelegateWhitelister","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"feeDecimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"unwhitelistBetaDelegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"wipeFrozenAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"EIP712_DOMAIN_HASH","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isFrozen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFeeRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"supplyController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reclaimXAUH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"currentOwner","type":"address"},{"indexed":true,"name":"proposedOwner","type":"address"}],"name":"OwnershipTransferProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldProposedOwner","type":"address"}],"name":"OwnershipTransferDisregarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"}],"name":"AddressFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"}],"name":"AddressUnfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"}],"name":"FrozenAddressWiped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldAssetProtectionRole","type":"address"},{"indexed":true,"name":"newAssetProtectionRole","type":"address"}],"name":"AssetProtectionRoleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"SupplyIncreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"SupplyDecreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldSupplyController","type":"address"},{"indexed":true,"name":"newSupplyController","type":"address"}],"name":"SupplyControllerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"seq","type":"uint256"},{"indexed":false,"name":"serviceFee","type":"uint256"}],"name":"BetaDelegatedTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldWhitelister","type":"address"},{"indexed":true,"name":"newWhitelister","type":"address"}],"name":"BetaDelegateWhitelisterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newDelegate","type":"address"}],"name":"BetaDelegateWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldDelegate","type":"address"}],"name":"BetaDelegateUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"FeeCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldFeeRate","type":"uint256"},{"indexed":true,"name":"newFeeRate","type":"uint256"}],"name":"FeeRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldFeeController","type":"address"},{"indexed":true,"name":"newFeeController","type":"address"}],"name":"FeeControllerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldFeeRecipient","type":"address"},{"indexed":true,"name":"newFeeRecipient","type":"address"}],"name":"FeeRecipientSet","type":"event"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":null}