{"sources":{"Vyper_contract.vy":{"content":"# @version 0.2.4\n\"\"\"\n@title Curve DAO Token\n@author Curve Finance\n@license MIT\n@notice ERC20 with piecewise-linear mining supply.\n@dev Based on the ERC-20 token standard as defined at\n     https://eips.ethereum.org/EIPS/eip-20\n\"\"\"\n\nfrom vyper.interfaces import ERC20\n\nimplements: ERC20\n\n\nevent Transfer:\n    _from: indexed(address)\n    _to: indexed(address)\n    _value: uint256\n\nevent Approval:\n    _owner: indexed(address)\n    _spender: indexed(address)\n    _value: uint256\n\nevent UpdateMiningParameters:\n    time: uint256\n    rate: uint256\n    supply: uint256\n\nevent SetMinter:\n    minter: address\n\nevent SetAdmin:\n    admin: address\n\n\nname: public(String[64])\nsymbol: public(String[32])\ndecimals: public(uint256)\n\nbalanceOf: public(HashMap[address, uint256])\nallowances: HashMap[address, HashMap[address, uint256]]\ntotal_supply: uint256\n\nminter: public(address)\nadmin: public(address)\n\n# General constants\nYEAR: constant(uint256) = 86400 * 365\n\n# Allocation:\n# =========\n# * shareholders - 30%\n# * emplyees - 3%\n# * DAO-controlled reserve - 5%\n# * Early users - 5%\n# == 43% ==\n# left for inflation: 57%\n\n# Supply parameters\nINITIAL_SUPPLY: constant(uint256) = 1_303_030_303\nINITIAL_RATE: constant(uint256) = 274_815_283 * 10 ** 18 / YEAR  # leading to 43% premine\nRATE_REDUCTION_TIME: constant(uint256) = YEAR\nRATE_REDUCTION_COEFFICIENT: constant(uint256) = 1189207115002721024  # 2 ** (1/4) * 1e18\nRATE_DENOMINATOR: constant(uint256) = 10 ** 18\nINFLATION_DELAY: constant(uint256) = 86400\n\n# Supply variables\nmining_epoch: public(int128)\nstart_epoch_time: public(uint256)\nrate: public(uint256)\n\nstart_epoch_supply: uint256\n\n\n@external\ndef __init__(_name: String[64], _symbol: String[32], _decimals: uint256):\n    \"\"\"\n    @notice Contract constructor\n    @param _name Token full name\n    @param _symbol Token symbol\n    @param _decimals Number of decimals for token\n    \"\"\"\n    init_supply: uint256 = INITIAL_SUPPLY * 10 ** _decimals\n    self.name = _name\n    self.symbol = _symbol\n    self.decimals = _decimals\n    self.balanceOf[msg.sender] = init_supply\n    self.total_supply = init_supply\n    self.admin = msg.sender\n    log Transfer(ZERO_ADDRESS, msg.sender, init_supply)\n\n    self.start_epoch_time = block.timestamp + INFLATION_DELAY - RATE_REDUCTION_TIME\n    self.mining_epoch = -1\n    self.rate = 0\n    self.start_epoch_supply = init_supply\n\n\n@internal\ndef _update_mining_parameters():\n    \"\"\"\n    @dev Update mining rate and supply at the start of the epoch\n         Any modifying mining call must also call this\n    \"\"\"\n    _rate: uint256 = self.rate\n    _start_epoch_supply: uint256 = self.start_epoch_supply\n\n    self.start_epoch_time += RATE_REDUCTION_TIME\n    self.mining_epoch += 1\n\n    if _rate == 0:\n        _rate = INITIAL_RATE\n    else:\n        _start_epoch_supply += _rate * RATE_REDUCTION_TIME\n        self.start_epoch_supply = _start_epoch_supply\n        _rate = _rate * RATE_DENOMINATOR / RATE_REDUCTION_COEFFICIENT\n\n    self.rate = _rate\n\n    log UpdateMiningParameters(block.timestamp, _rate, _start_epoch_supply)\n\n\n@external\ndef update_mining_parameters():\n    \"\"\"\n    @notice Update mining rate and supply at the start of the epoch\n    @dev Callable by any address, but only once per epoch\n         Total supply becomes slightly larger if this function is called late\n    \"\"\"\n    assert block.timestamp >= self.start_epoch_time + RATE_REDUCTION_TIME  # dev: too soon!\n    self._update_mining_parameters()\n\n\n@external\ndef start_epoch_time_write() -> uint256:\n    \"\"\"\n    @notice Get timestamp of the current mining epoch start\n            while simultaneously updating mining parameters\n    @return Timestamp of the epoch\n    \"\"\"\n    _start_epoch_time: uint256 = self.start_epoch_time\n    if block.timestamp >= _start_epoch_time + RATE_REDUCTION_TIME:\n        self._update_mining_parameters()\n        return self.start_epoch_time\n    else:\n        return _start_epoch_time\n\n\n@external\ndef future_epoch_time_write() -> uint256:\n    \"\"\"\n    @notice Get timestamp of the next mining epoch start\n            while simultaneously updating mining parameters\n    @return Timestamp of the next epoch\n    \"\"\"\n    _start_epoch_time: uint256 = self.start_epoch_time\n    if block.timestamp >= _start_epoch_time + RATE_REDUCTION_TIME:\n        self._update_mining_parameters()\n        return self.start_epoch_time + RATE_REDUCTION_TIME\n    else:\n        return _start_epoch_time + RATE_REDUCTION_TIME\n\n\n@internal\n@view\ndef _available_supply() -> uint256:\n    return self.start_epoch_supply + (block.timestamp - self.start_epoch_time) * self.rate\n\n\n@external\n@view\ndef available_supply() -> uint256:\n    \"\"\"\n    @notice Current number of tokens in existence (claimed or unclaimed)\n    \"\"\"\n    return self._available_supply()\n\n\n@external\n@view\ndef mintable_in_timeframe(start: uint256, end: uint256) -> uint256:\n    \"\"\"\n    @notice How much supply is mintable from start timestamp till end timestamp\n    @param start Start of the time interval (timestamp)\n    @param end End of the time interval (timestamp)\n    @return Tokens mintable from `start` till `end`\n    \"\"\"\n    assert start <= end  # dev: start > end\n    to_mint: uint256 = 0\n    current_epoch_time: uint256 = self.start_epoch_time\n    current_rate: uint256 = self.rate\n\n    # Special case if end is in future (not yet minted) epoch\n    if end > current_epoch_time + RATE_REDUCTION_TIME:\n        current_epoch_time += RATE_REDUCTION_TIME\n        current_rate = current_rate * RATE_DENOMINATOR / RATE_REDUCTION_COEFFICIENT\n\n    assert end <= current_epoch_time + RATE_REDUCTION_TIME  # dev: too far in future\n\n    for i in range(999):  # Curve will not work in 1000 years. Darn!\n        if end >= current_epoch_time:\n            current_end: uint256 = end\n            if current_end > current_epoch_time + RATE_REDUCTION_TIME:\n                current_end = current_epoch_time + RATE_REDUCTION_TIME\n\n            current_start: uint256 = start\n            if current_start >= current_epoch_time + RATE_REDUCTION_TIME:\n                break  # We should never get here but what if...\n            elif current_start < current_epoch_time:\n                current_start = current_epoch_time\n\n            to_mint += current_rate * (current_end - current_start)\n\n            if start >= current_epoch_time:\n                break\n\n        current_epoch_time -= RATE_REDUCTION_TIME\n        current_rate = current_rate * RATE_REDUCTION_COEFFICIENT / RATE_DENOMINATOR  # double-division with rounding made rate a bit less => good\n        assert current_rate <= INITIAL_RATE  # This should never happen\n\n    return to_mint\n\n\n@external\ndef set_minter(_minter: address):\n    \"\"\"\n    @notice Set the minter address\n    @dev Only callable once, when minter has not yet been set\n    @param _minter Address of the minter\n    \"\"\"\n    assert msg.sender == self.admin  # dev: admin only\n    assert self.minter == ZERO_ADDRESS  # dev: can set the minter only once, at creation\n    self.minter = _minter\n    log SetMinter(_minter)\n\n\n@external\ndef set_admin(_admin: address):\n    \"\"\"\n    @notice Set the new admin.\n    @dev After all is set up, admin only can change the token name\n    @param _admin New admin address\n    \"\"\"\n    assert msg.sender == self.admin  # dev: admin only\n    self.admin = _admin\n    log SetAdmin(_admin)\n\n\n@external\n@view\ndef totalSupply() -> uint256:\n    \"\"\"\n    @notice Total number of tokens in existence.\n    \"\"\"\n    return self.total_supply\n\n\n@external\n@view\ndef allowance(_owner : address, _spender : address) -> uint256:\n    \"\"\"\n    @notice Check the amount of tokens that an owner allowed to a spender\n    @param _owner The address which owns the funds\n    @param _spender The address which will spend the funds\n    @return uint256 specifying the amount of tokens still available for the spender\n    \"\"\"\n    return self.allowances[_owner][_spender]\n\n\n@external\ndef transfer(_to : address, _value : uint256) -> bool:\n    \"\"\"\n    @notice Transfer `_value` tokens from `msg.sender` to `_to`\n    @dev Vyper does not allow underflows, so the subtraction in\n         this function will revert on an insufficient balance\n    @param _to The address to transfer to\n    @param _value The amount to be transferred\n    @return bool success\n    \"\"\"\n    assert _to != ZERO_ADDRESS  # dev: transfers to 0x0 are not allowed\n    self.balanceOf[msg.sender] -= _value\n    self.balanceOf[_to] += _value\n    log Transfer(msg.sender, _to, _value)\n    return True\n\n\n@external\ndef transferFrom(_from : address, _to : address, _value : uint256) -> bool:\n    \"\"\"\n     @notice Transfer `_value` tokens from `_from` to `_to`\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     @return bool success\n    \"\"\"\n    assert _to != ZERO_ADDRESS  # dev: transfers to 0x0 are not allowed\n    # NOTE: vyper does not allow underflows\n    #       so the following subtraction would revert on insufficient balance\n    self.balanceOf[_from] -= _value\n    self.balanceOf[_to] += _value\n    self.allowances[_from][msg.sender] -= _value\n    log Transfer(_from, _to, _value)\n    return True\n\n\n@external\ndef approve(_spender : address, _value : uint256) -> bool:\n    \"\"\"\n    @notice Approve `_spender` to transfer `_value` tokens on behalf of `msg.sender`\n    @dev Approval may only be from zero -> nonzero or from nonzero -> zero in order\n        to mitigate the potential race condition described here:\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    @return bool success\n    \"\"\"\n    assert _value == 0 or self.allowances[msg.sender][_spender] == 0\n    self.allowances[msg.sender][_spender] = _value\n    log Approval(msg.sender, _spender, _value)\n    return True\n\n\n@external\ndef mint(_to: address, _value: uint256) -> bool:\n    \"\"\"\n    @notice Mint `_value` tokens and assign them to `_to`\n    @dev Emits a Transfer event originating from 0x00\n    @param _to The account that will receive the created tokens\n    @param _value The amount that will be created\n    @return bool success\n    \"\"\"\n    assert msg.sender == self.minter  # dev: minter only\n    assert _to != ZERO_ADDRESS  # dev: zero address\n\n    if block.timestamp >= self.start_epoch_time + RATE_REDUCTION_TIME:\n        self._update_mining_parameters()\n\n    _total_supply: uint256 = self.total_supply + _value\n    assert _total_supply <= self._available_supply()  # dev: exceeds allowable mint amount\n    self.total_supply = _total_supply\n\n    self.balanceOf[_to] += _value\n    log Transfer(ZERO_ADDRESS, _to, _value)\n\n    return True\n\n\n@external\ndef burn(_value: uint256) -> bool:\n    \"\"\"\n    @notice Burn `_value` tokens belonging to `msg.sender`\n    @dev Emits a Transfer event with a destination of 0x00\n    @param _value The amount that will be burned\n    @return bool success\n    \"\"\"\n    self.balanceOf[msg.sender] -= _value\n    self.total_supply -= _value\n\n    log Transfer(msg.sender, ZERO_ADDRESS, _value)\n    return True\n\n\n@external\ndef set_name(_name: String[64], _symbol: String[32]):\n    \"\"\"\n    @notice Change the token name and symbol to `_name` and `_symbol`\n    @dev Only callable by the admin account\n    @param _name New token name\n    @param _symbol New token symbol\n    \"\"\"\n    assert msg.sender == self.admin, \"Only admin is allowed to change name\"\n    self.name = _name\n    self.symbol = _symbol"}},"compilation":{"language":"Vyper","compiler":"vyper","compilerVersion":"0.2.4+commit.7949850","compilerSettings":{"libraries":{},"search_paths":["."],"outputSelection":{"Vyper_contract.vy":["abi","ast","interface","ir","userdoc","devdoc","evm.bytecode.object","evm.bytecode.opcodes","evm.deployedBytecode.object","evm.deployedBytecode.opcodes","evm.deployedBytecode.sourceMap","evm.methodIdentifiers"]}},"name":"Vyper_contract","fullyQualifiedName":"Vyper_contract.vy:Vyper_contract"},"runtimeBytecode":{"onchainBytecode":"0x600436101561000d5761110b565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610203575b61014052600a5461016052600b5461018052600980546301e133808181830110156100d357600080fd5b80820190509050815550600880546001606051818301806040519013156100f957600080fd5b809190121561010757600080fd5b9050905081555061016051151561012a576778ef89edad16a615610160526101ba565b6101808051610160516301e13380808202821582848304141761014c57600080fd5b8090509050905081818301101561016257600080fd5b8082019050905081525061018051600b5561016051670de0b6b3a7640000808202821582848304141761019457600080fd5b80905090509050671080e992061ab30080806101af57600080fd5b820490509050610160525b61016051600a55426101a052610160516101c052610180516101e0527f27e46362a1e6129b6dd539c984ce739291a97128dfcaeca1255e8ac83abd944160606101a0a161014051565b63d43b40fa600051141561025457341561021c57600080fd5b6009546301e1338081818301101561023357600080fd5b8082019050905042101561024657600080fd5b600658016100a9565b600050005b63adc4cf4360005114156102d057341561026d57600080fd5b60095461014052610140516301e1338081818301101561028c57600080fd5b80820190509050421015156102c05761014051600658016100a9565b6101405260005060095460005260206000f3506102ce565b6101405160005260206000f3505b005b63b26b238e60005114156103825734156102e957600080fd5b60095461014052610140516301e1338081818301101561030857600080fd5b80820190509050421015156103575761014051600658016100a9565b610140526000506009546301e1338081818301101561034257600080fd5b8082019050905060005260206000f350610380565b610140516301e1338081818301101561036f57600080fd5b8082019050905060005260206000f3505b005b6000156103eb575b61014052600b5442600954808210156103a257600080fd5b80820390509050600a5480820282158284830414176103c057600080fd5b809050905090508181830110156103d657600080fd5b80820190509050600052600051610140515650005b6324f92a25600051141561042057341561040457600080fd5b6006580161038a565b610140526101405160005260206000f350005b63d725a9ca60005114156106ec57341561043957600080fd5b602435600435111561044a57600080fd5b60006101405260095461016052600a5461018052610160516301e1338081818301101561047657600080fd5b8082019050905060243511156104f05761016080516301e1338081818301101561049f57600080fd5b8082019050905081525061018051670de0b6b3a764000080820282158284830414176104ca57600080fd5b80905090509050671080e992061ab30080806104e557600080fd5b820490509050610180525b610160516301e1338081818301101561050857600080fd5b80820190509050602435111561051d57600080fd5b6101a060006103e7818352015b6101605160243510151561064b576024356101c052610160516301e1338081818301101561055757600080fd5b808201905090506101c051111561058c57610160516301e1338081818301101561058057600080fd5b808201905090506101c0525b6004356101e052610160516301e133808181830110156105ab57600080fd5b808201905090506101e0511015156105c6576106db566105de565b610160516101e05110156105dd57610160516101e0525b5b6101408051610180516101c0516101e051808210156105fc57600080fd5b80820390509050808202821582848304141761061757600080fd5b8090509050905081818301101561062d57600080fd5b808201905090508152506101605160043510151561064a576106db565b5b61016080516301e133808082101561066257600080fd5b8082039050905081525061018051671080e992061ab300808202821582848304141761068d57600080fd5b80905090509050670de0b6b3a764000080806106a857600080fd5b820490509050610180526778ef89edad16a6156101805111156106ca57600080fd5b5b815160010180835281141561052a575b50506101405160005260206000f350005b631652e9fc600051141561076857341561070557600080fd5b600435602051811061071657600080fd5b50600754331461072557600080fd5b6006541561073257600080fd5b600435600655600435610140527fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c6020610140a1005b63e9333fab60005114156107d757341561078157600080fd5b600435602051811061079257600080fd5b5060075433146107a157600080fd5b600435600755600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b6318160ddd60005114156107fe5734156107f057600080fd5b60055460005260206000f350005b63dd62ed3e600051141561086557341561081757600080fd5b600435602051811061082857600080fd5b50602435602051811061083a57600080fd5b50600460043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f350005b63a9059cbb600051141561093657341561087e57600080fd5b600435602051811061088f57600080fd5b5060006004351861089f57600080fd5b60033360e05260c052604060c0208054602435808210156108bf57600080fd5b80820390509050815550600360043560e05260c052604060c02080546024358181830110156108ed57600080fd5b8082019050905081555060243561014052600435337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b6323b872dd6000511415610a5557341561094f57600080fd5b600435602051811061096057600080fd5b50602435602051811061097257600080fd5b5060006024351861098257600080fd5b600360043560e05260c052604060c0208054604435808210156109a457600080fd5b80820390509050815550600360243560e05260c052604060c02080546044358181830110156109d257600080fd5b80820190509050815550600460043560e05260c052604060c0203360e05260c052604060c020805460443580821015610a0a57600080fd5b80820390509050815550604435610140526024356004357fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63095ea7b36000511415610b18573415610a6e57600080fd5b6004356020518110610a7f57600080fd5b506024351515610a90576001610aaf565b60043360e05260c052604060c02060043560e05260c052604060c02054155b5b610ab957600080fd5b60243560043360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f350005b6340c10f196000511415610c50573415610b3157600080fd5b6004356020518110610b4257600080fd5b506006543314610b5157600080fd5b600060043518610b6057600080fd5b6009546301e13380818183011015610b7757600080fd5b8082019050905042101515610b9357600658016100a9565b6000505b600554602435818183011015610ba857600080fd5b8082019050905061014052610140516006580161038a565b610180526101405261018051610140511115610bdb57600080fd5b61014051600555600360043560e05260c052604060c0208054602435818183011015610c0657600080fd5b808201905090508155506024356101a05260043560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101a0a3600160005260206000f350005b6342966c686000511415610cef573415610c6957600080fd5b60033360e05260c052604060c020805460043580821015610c8957600080fd5b808203905090508155506005805460043580821015610ca757600080fd5b80820390509050815550600435610140526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63e1430e066000511415610e71573415610d0857600080fd5b6060600435600401610140376040600435600401351115610d2857600080fd5b60406024356004016101c0376020602435600401351115610d4857600080fd5b6308c379a0610220526020610240526024610260527f4f6e6c792061646d696e20697320616c6c6f77656420746f206368616e676520610280527f6e616d65000000000000000000000000000000000000000000000000000000006102a052610260506007543314610dbb57608461023cfd5b61014080600060c052602060c020602082510161012060006003818352015b82610120516020021115610ded57610e0f565b61012051602002850151610120518501555b8151600101808352811415610dda575b5050505050506101c080600160c052602060c020602082510161012060006002818352015b82610120516020021115610e4757610e69565b61012051602002850151610120518501555b8151600101808352811415610e34575b505050505050005b6306fdde036000511415610f25573415610e8a57600080fd5b60008060c052602060c020610180602082540161012060006003818352015b82610120516020021115610ebc57610ede565b61012051850154610120516020028501525b8151600101808352811415610ea9575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b416000511415610fd9573415610f3e57600080fd5b60018060c052602060c020610180602082540161012060006002818352015b82610120516020021115610f7057610f92565b61012051850154610120516020028501525b8151600101808352811415610f5d575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce5676000511415611000573415610ff257600080fd5b60025460005260206000f350005b6370a08231600051141561104757341561101957600080fd5b600435602051811061102a57600080fd5b50600360043560e05260c052604060c0205460005260206000f350005b6307546172600051141561106e57341561106057600080fd5b60065460005260206000f350005b63f851a440600051141561109557341561108757600080fd5b60075460005260206000f350005b63f9a40bf660005114156110bc5734156110ae57600080fd5b60085460005260206000f350005b637375be2660005114156110e35734156110d557600080fd5b60095460005260206000f350005b632c4e722e600051141561110a5734156110fc57600080fd5b600a5460005260206000f350005b5b60006000fd","recompiledBytecode":"0x600436101561000d5761110b565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610203575b61014052600a5461016052600b5461018052600980546301e133808181830110156100d357600080fd5b80820190509050815550600880546001606051818301806040519013156100f957600080fd5b809190121561010757600080fd5b9050905081555061016051151561012a576778ef89edad16a615610160526101ba565b6101808051610160516301e13380808202821582848304141761014c57600080fd5b8090509050905081818301101561016257600080fd5b8082019050905081525061018051600b5561016051670de0b6b3a7640000808202821582848304141761019457600080fd5b80905090509050671080e992061ab30080806101af57600080fd5b820490509050610160525b61016051600a55426101a052610160516101c052610180516101e0527f27e46362a1e6129b6dd539c984ce739291a97128dfcaeca1255e8ac83abd944160606101a0a161014051565b63d43b40fa600051141561025457341561021c57600080fd5b6009546301e1338081818301101561023357600080fd5b8082019050905042101561024657600080fd5b600658016100a9565b600050005b63adc4cf4360005114156102d057341561026d57600080fd5b60095461014052610140516301e1338081818301101561028c57600080fd5b80820190509050421015156102c05761014051600658016100a9565b6101405260005060095460005260206000f3506102ce565b6101405160005260206000f3505b005b63b26b238e60005114156103825734156102e957600080fd5b60095461014052610140516301e1338081818301101561030857600080fd5b80820190509050421015156103575761014051600658016100a9565b610140526000506009546301e1338081818301101561034257600080fd5b8082019050905060005260206000f350610380565b610140516301e1338081818301101561036f57600080fd5b8082019050905060005260206000f3505b005b6000156103eb575b61014052600b5442600954808210156103a257600080fd5b80820390509050600a5480820282158284830414176103c057600080fd5b809050905090508181830110156103d657600080fd5b80820190509050600052600051610140515650005b6324f92a25600051141561042057341561040457600080fd5b6006580161038a565b610140526101405160005260206000f350005b63d725a9ca60005114156106ec57341561043957600080fd5b602435600435111561044a57600080fd5b60006101405260095461016052600a5461018052610160516301e1338081818301101561047657600080fd5b8082019050905060243511156104f05761016080516301e1338081818301101561049f57600080fd5b8082019050905081525061018051670de0b6b3a764000080820282158284830414176104ca57600080fd5b80905090509050671080e992061ab30080806104e557600080fd5b820490509050610180525b610160516301e1338081818301101561050857600080fd5b80820190509050602435111561051d57600080fd5b6101a060006103e7818352015b6101605160243510151561064b576024356101c052610160516301e1338081818301101561055757600080fd5b808201905090506101c051111561058c57610160516301e1338081818301101561058057600080fd5b808201905090506101c0525b6004356101e052610160516301e133808181830110156105ab57600080fd5b808201905090506101e0511015156105c6576106db566105de565b610160516101e05110156105dd57610160516101e0525b5b6101408051610180516101c0516101e051808210156105fc57600080fd5b80820390509050808202821582848304141761061757600080fd5b8090509050905081818301101561062d57600080fd5b808201905090508152506101605160043510151561064a576106db565b5b61016080516301e133808082101561066257600080fd5b8082039050905081525061018051671080e992061ab300808202821582848304141761068d57600080fd5b80905090509050670de0b6b3a764000080806106a857600080fd5b820490509050610180526778ef89edad16a6156101805111156106ca57600080fd5b5b815160010180835281141561052a575b50506101405160005260206000f350005b631652e9fc600051141561076857341561070557600080fd5b600435602051811061071657600080fd5b50600754331461072557600080fd5b6006541561073257600080fd5b600435600655600435610140527fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c6020610140a1005b63e9333fab60005114156107d757341561078157600080fd5b600435602051811061079257600080fd5b5060075433146107a157600080fd5b600435600755600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b6318160ddd60005114156107fe5734156107f057600080fd5b60055460005260206000f350005b63dd62ed3e600051141561086557341561081757600080fd5b600435602051811061082857600080fd5b50602435602051811061083a57600080fd5b50600460043560e05260c052604060c02060243560e05260c052604060c0205460005260206000f350005b63a9059cbb600051141561093657341561087e57600080fd5b600435602051811061088f57600080fd5b5060006004351861089f57600080fd5b60033360e05260c052604060c0208054602435808210156108bf57600080fd5b80820390509050815550600360043560e05260c052604060c02080546024358181830110156108ed57600080fd5b8082019050905081555060243561014052600435337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b6323b872dd6000511415610a5557341561094f57600080fd5b600435602051811061096057600080fd5b50602435602051811061097257600080fd5b5060006024351861098257600080fd5b600360043560e05260c052604060c0208054604435808210156109a457600080fd5b80820390509050815550600360243560e05260c052604060c02080546044358181830110156109d257600080fd5b80820190509050815550600460043560e05260c052604060c0203360e05260c052604060c020805460443580821015610a0a57600080fd5b80820390509050815550604435610140526024356004357fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63095ea7b36000511415610b18573415610a6e57600080fd5b6004356020518110610a7f57600080fd5b506024351515610a90576001610aaf565b60043360e05260c052604060c02060043560e05260c052604060c02054155b5b610ab957600080fd5b60243560043360e05260c052604060c02060043560e05260c052604060c0205560243561014052600435337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256020610140a3600160005260206000f350005b6340c10f196000511415610c50573415610b3157600080fd5b6004356020518110610b4257600080fd5b506006543314610b5157600080fd5b600060043518610b6057600080fd5b6009546301e13380818183011015610b7757600080fd5b8082019050905042101515610b9357600658016100a9565b6000505b600554602435818183011015610ba857600080fd5b8082019050905061014052610140516006580161038a565b610180526101405261018051610140511115610bdb57600080fd5b61014051600555600360043560e05260c052604060c0208054602435818183011015610c0657600080fd5b808201905090508155506024356101a05260043560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206101a0a3600160005260206000f350005b6342966c686000511415610cef573415610c6957600080fd5b60033360e05260c052604060c020805460043580821015610c8957600080fd5b808203905090508155506005805460043580821015610ca757600080fd5b80820390509050815550600435610140526000337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020610140a3600160005260206000f350005b63e1430e066000511415610e71573415610d0857600080fd5b6060600435600401610140376040600435600401351115610d2857600080fd5b60406024356004016101c0376020602435600401351115610d4857600080fd5b6308c379a0610220526020610240526024610260527f4f6e6c792061646d696e20697320616c6c6f77656420746f206368616e676520610280527f6e616d65000000000000000000000000000000000000000000000000000000006102a052610260506007543314610dbb57608461023cfd5b61014080600060c052602060c020602082510161012060006003818352015b82610120516020021115610ded57610e0f565b61012051602002850151610120518501555b8151600101808352811415610dda575b5050505050506101c080600160c052602060c020602082510161012060006002818352015b82610120516020021115610e4757610e69565b61012051602002850151610120518501555b8151600101808352811415610e34575b505050505050005b6306fdde036000511415610f25573415610e8a57600080fd5b60008060c052602060c020610180602082540161012060006003818352015b82610120516020021115610ebc57610ede565b61012051850154610120516020028501525b8151600101808352811415610ea9575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b416000511415610fd9573415610f3e57600080fd5b60018060c052602060c020610180602082540161012060006002818352015b82610120516020021115610f7057610f92565b61012051850154610120516020028501525b8151600101808352811415610f5d575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce5676000511415611000573415610ff257600080fd5b60025460005260206000f350005b6370a08231600051141561104757341561101957600080fd5b600435602051811061102a57600080fd5b50600360043560e05260c052604060c0205460005260206000f350005b6307546172600051141561106e57341561106057600080fd5b60065460005260206000f350005b63f851a440600051141561109557341561108757600080fd5b60075460005260206000f350005b63f9a40bf660005114156110bc5734156110ae57600080fd5b60085460005260206000f350005b637375be2660005114156110e35734156110d557600080fd5b60095460005260206000f350005b632c4e722e600051141561110a5734156110fc57600080fd5b600a5460005260206000f350005b5b60006000fd","sourceMap":"-1:-1:0:-;;;;;:::-;;:::-;:::-;;;;;;;;;;;;;;;;;;;;2363:677;;;:::-;:::-;-1:-1;2363:677;2553:9;-1:-1;2536:26;2363:677;2598:23;-1:-1;2567:54;2363:677;2627:21;;;:44;;;;;-1:-1;;2627:44;:::-;;;;:::-;;;;;;;;;;;2676:17;;;2697:1;2676:22;;;;;;;;;;;;:::-;;;;:::-;;;;;;;:::-;;;;:::-;;;;;;;;2707:5;:10;;2704:236;;:::-;-1:-1;2727:5;:20;2704:236;:::-;:::-;2766:19;;;2789:5;:27;;;;;;;;;;;;;;:::-;;;;:::-;;;;;;;;2766:50;;;;-1:-1;;2766:50;:::-;;;;:::-;;;;;;;;;;;2851:19;-1:-1;2825:23;:45;2887:5;:24;;;;;;;;;;;;;;:::-;;;;:::-;;;;;;;;:53;;;;:::-;;;;:::-;;;;;-1:-1;;2879:5;:61;2704:236::-;2958:5;-1:-1;2946:9;:17;-1:-1;;2969:71;3013:5;-1:-1;;2969:71;3020:19;-1:-1;;2969:71;-1:-1;;;2969:71;2363:677;;:::o;:::-;3053:380;;;;;;:::-;;;;:::-;;;;:::-;3335:21;:43;;;;;;-1:-1;;3335:43;:::-;;;;:::-;;;;;;;;3316:15;-1:-1;;3309:69;:::-;;;;:::-;3401:32;;;;:::i;:::-;;;3053:380;:::-;3446:454;;;;;;:::-;;;;:::-;;;;:::-;3691:21;-1:-1;3662:50;3446:454;3739:17;:39;;;;;;-1:-1;;3739:39;:::-;;;;:::-;;;;;;;;3720:15;-1:-1;;3717:183;;:::-;3788:32;;;;;;:::i;:::-;;;;;3836:21;3829:28;;;;;;3788:32;3717:183;:::-;:::-;3883:17;3876:24;;;;;;;3717:183::-;3446:454;:::-;3913:501;;;;;;:::-;;;;:::-;;;;:::-;4161:21;-1:-1;4132:50;3913:501;4209:17;:39;;;;;;-1:-1;;4209:39;:::-;;;;:::-;;;;;;;;4190:15;-1:-1;;4187:227;;:::-;4258:32;;;;;;:::i;:::-;;;;;4306:21;:43;;;;;;-1:-1;;4306:43;:::-;;;;:::-;;;;;;;;4299:50;;;;;4258:32;4187:227;:::-;:::-;4375:17;:39;;;;;;-1:-1;;4375:39;:::-;;;;:::-;;;;;;;;4368:46;;;;;;4187:227::-;3913:501;:::-;4433:126;;;:::-;:::-;-1:-1;4433:126;4480:23;:79;4507:15;4525:21;4507:39;;;-1:-1;;4507:39;:::-;;;;:::-;;;;;;;;4550:9;4506:53;;;;;;;;;;;;;:::-;;;;:::-;;;;;;;;4480:79;;;;-1:-1;;4480:79;:::-;;;;:::-;;;;;;;;4473:86;;;;;;:::o;4433:126;;:::-;4578:159;;;;;;:::-;;;;:::-;;;;:::-;4713:24;;;;:::i;:::-;;;;4706:31;;;;;;4578:159;;:::-;4756:1825;;;;;;:::-;;;;:::-;;;;:::-;5100:3;5091:12;:5;:12;-1:-1;;5084:19;:::-;;;;:::-;-1:-1;5128:20;4756:1825;5183:21;-1:-1;5153:51;4756:1825;5233:9;-1:-1;5209:33;4756:1825;5319:18;:40;;;;;;-1:-1;;5319:40;:::-;;;;:::-;;;;;;;;5313:3;:46;;5310:184;;:::-;5369:18;;;:41;;;;;-1:-1;;5369:41;:::-;;;;:::-;;;;;;;;;;;5434:12;:31;;;;;;;;;;;;;;:::-;;;;:::-;;;;;;;;:60;;;;:::-;;;;:::-;;;;;-1:-1;;5419:12;:75;5310:184::-;5514:18;:40;;;;;;-1:-1;;5514:40;:::-;;;;:::-;;;;;;;;5507:3;:47;-1:-1;;5500:54;:::-;;;;:::-;5586:947;;;;;;;:::-;5669:18;5662:25;:3;:25;-1:-1;;5659:633;;:::-;5724:3;-1:-1;5701:26;;5757:18;:40;;;;;;-1:-1;;5757:40;:::-;;;;:::-;;;;;;;;5743:11;:54;;5740:129;;:::-;5829:18;:40;;;;;;-1:-1;;5829:40;:::-;;;;:::-;;;;;;-1:-1;;5815:11;:54;5740:129::-;5908:5;-1:-1;5883:30;5701:26;5946:18;:40;;;;;;-1:-1;;5946:40;:::-;;;;:::-;;;;;;;;5929:13;:57;-1:-1;;5926:230;;:::-;6004:5;:::-;5926:230;:::-;:::-;6086:18;6070:34;:13;:34;;6065:91;;:::-;6138:18;-1:-1;6122:13;:34;6065:91::-;5926:230::-;6170:7;;;6181:12;:44;6197:11;:27;6211:13;6197:27;;;-1:-1;;6197:27;:::-;;;;:::-;;;;;;;;6181:44;;;;;;;;;;;;:::-;;;;:::-;;;;;;;;6170:55;;;;-1:-1;;6170:55;:::-;;;;:::-;;;;;;;;;;;6251:18;6242:27;:5;:27;-1:-1;;6239:53;;:::-;6287:5;:::-;6239:53::-;5659:633::-;6302:18;;;:41;;;-1:-1;;6302:41;:::-;;;;:::-;;;;;;;;;;;6367:12;:41;;;;;;;;;;;;;;:::-;;;;:::-;;;;;;;;:60;;;;:::-;;;;:::-;;;;;-1:-1;;6352:12;:75;6521:12;6505;:28;-1:-1;;6498:35;:::-;;;;:::-;5586:947::-;;;;;;;;;;;;:::-;:::-;;;6574:7;6567:14;;;;;;4756:1825;;:::-;6594:384;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;6594:384;;;:::-;;;;:::-;;6807:10;6793:24;:10;:24;6786:31;:::-;;;;:::-;6848:11;:27;;6841:34;:::-;;;;:::-;6944:7;-1:-1;6930:11;:21;6970:7;-1:-1;;6956:22;-1:-1;;;6956:22;6594:384;:::-;6991:285;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;6991:285;;;:::-;;;;:::-;;7198:10;7184:24;:10;:24;7177:31;:::-;;;;:::-;7245:6;-1:-1;7232:10;:19;7269:6;-1:-1;;7256:20;-1:-1;;;7256:20;6991:285;:::-;7295:123;;;;;;:::-;;;;:::-;;;;:::-;7401:17;7394:24;;;;;;7295:123;;:::-;7437:392;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;7437:392;;;:::-;;;;:::-;;-1:-1;;;;7437:392;;;:::-;;;;:::-;;7796:15;7812:6;-1:-1;;;;;;;;7820:8;-1:-1;;;;;;;;7789:40;;;;;;7437:392;;:::-;7842:579;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;7842:579;;;:::-;;;;:::-;;8235:12;8228:3;:19;8221:26;;:::-;;;;:::-;8293:14;-1:-1;8293:36;;;;;;;-1:-1;8293:36;8323:6;8293:36;;;-1:-1;;8293:36;:::-;;;;:::-;;;;;;;;;;;8334:14;8349:3;-1:-1;8334:29;;;;;;;-1:-1;8334:29;8357:6;8334:29;;;;;-1:-1;;8334:29;:::-;;;;:::-;;;;;;;;;;;8398:6;-1:-1;;8368:37;8393:3;-1:-1;;;;;8368:37;8417:4;8410:11;;;;;7842:579;;:::-;8434:748;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;8434:748;;;:::-;;;;:::-;;-1:-1;;;;8434:748;;;:::-;;;;:::-;;8835:12;8828:3;:19;8821:26;;:::-;;;;:::-;9015:14;9030:5;-1:-1;9015:31;;;;;;;-1:-1;9015:31;9040:6;9015:31;;;-1:-1;;9015:31;:::-;;;;:::-;;;;;;;;;;;9051:14;9066:3;-1:-1;9051:29;;;;;;;-1:-1;9051:29;9074:6;9051:29;;;;;-1:-1;;9051:29;:::-;;;;:::-;;;;;;;;;;;9085:15;9101:5;-1:-1;;;;;;;;;9085:44;;;;;;;-1:-1;9085:44;9123:6;9085:44;;;-1:-1;;9085:44;:::-;;;;:::-;;;;;;;;;;;9159:6;-1:-1;;9134:32;9154:3;-1:-1;9147:5;-1:-1;;;;9134:32;9178:4;9171:11;;;;;8434:748;;:::-;9195:700;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;9195:700;;;:::-;;;;:::-;;9724:6;:11;;-1:-1;;:::-;;;:::-;:::-;9739:15;-1:-1;;;;;;;;9767:8;-1:-1;;;;;;;;9739:42;;-1:-1::-;:::-;9717:64;:::-;;;;:::-;9826:6;-1:-1;9786:15;-1:-1;;;;;;;;9814:8;-1:-1;;;;;;;;9786:46;9872:6;-1:-1;;9837:42;9862:8;-1:-1;;;;;9837:42;9891:4;9884:11;;;;;9195:700;;:::-;9908:819;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;9908:819;;;:::-;;;;:::-;;10249:11;10235:25;:10;:25;10228:32;:::-;;;;:::-;10299:12;10292:3;:19;10285:26;;:::-;;;;:::-;10360:21;:43;;;;;;-1:-1;;10360:43;:::-;;;;:::-;;;;;;;;10341:15;-1:-1;;10338:107;;:::-;10413:32;;;;:::i;:::-;;;10338:107::-;10476:17;:26;10496:6;10476:26;;;;;-1:-1;;10476:26;:::-;;;;:::-;;;;;;-1:-1;;10451:51;9908:819;10531:24;;;;;;:::i;:::-;;;;;;10514:41;:13;:41;-1:-1;;10507:48;:::-;;;;:::-;10618:13;-1:-1;10598:17;:33;10637:14;10652:3;-1:-1;10637:29;;;;;;;-1:-1;10637:29;10660:6;10637:29;;;;;-1:-1;;10637:29;:::-;;;;:::-;;;;;;;;;;;10703:6;-1:-1;;10671:39;10698:3;-1:-1;;;;;10671:39;10723:4;10716:11;;;;;9908:819;;:::-;10740:383;;;;;;:::-;;;;:::-;;;;:::-;10987:14;-1:-1;10987:36;;;;;;;-1:-1;10987:36;11017:6;10987:36;;;-1:-1;;10987:36;:::-;;;;:::-;;;;;;;;;;;11028:17;;;11049:6;11028:27;;;-1:-1;;11028:27;:::-;;;;:::-;;;;;;;;;;;11100:6;-1:-1;;11061:46;-1:-1;;;;;11061:46;11119:4;11112:11;;;;;10740:383;;:::-;11136:375;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;;;;;;;;;;;;;:::-;;;;:::-;;;;;;;;;;;;;;;;;:::-;;;;:::-;11392:71;;;;;;11425:38;;;;;;;;;;11136:375;11413:10;11399:24;:10;:24;11392:71;:::-;;;;:::-;11480:5;11468:17;:9;:17;;;;;;;;;;;;;;;;:::-;;;;;;;;;:::-;;:::-;:::-;;;;;;;;;;;;;:::-;;;;;;;;;;;;:::-;:::-;;;;;;;11504:7;11490:21;:11;:21;;;;;;;;;;;;;;;;:::-;;;;;;;;;:::-;;:::-;:::-;;;;;;;;;;;;;:::-;;;;;;;;;;;;:::-;:::-;;;;;;;11136:375;:::-;638:24;;;;;;:::-;;;;:::-;;;;:::-;;-1:-1;638:24;;;;;;;;;;;;;;;;;:::-;;;;;;;;;:::-;;:::-;:::-;;;;;;;;;;;;;:::-;;;;;;;;;;;;:::-;:::-;;;;;;;-1:-1;;;;;;;;;;;;;;;;;;;;;;;638:24;;;;;;;;-1:-1;;;;;;;;;;;638:24;;;;:::-;663:26;;;;;;:::-;;;;:::-;;;;:::-;;-1:-1;663:26;;;;;;;;;;;;;;;;;:::-;;;;;;;;;:::-;;:::-;:::-;;;;;;;;;;;;;:::-;;;;;;;;;;;;:::-;:::-;;;;;;;-1:-1;;;;;;;;;;;;;;;;;;;;;;;663:26;;;;;;;;-1:-1;;;;;;;;;;;663:26;;;;:::-;690:25;;;;;;:::-;;;;:::-;;;;:::-;;;;;;;;;;:::-;717:44;;;;;;:::-;;;;:::-;;;;:::-;-1:-1;;;;717:44;;;:::-;;;;:::-;;;;-1:-1;;;;;;;;717:44;;;;;;;;:::-;841:23;;;;;;:::-;;;;:::-;;;;:::-;;;;;;;;;;:::-;865:22;;;;;;:::-;;;;:::-;;;;:::-;;;;;;;;;;:::-;1512:28;;;;;;:::-;;;;:::-;;;;:::-;;;;;;;;;;:::-;1541:33;;;;;;:::-;;;;:::-;;;;:::-;;;;;;;;;;:::-;1575:21;;;;;;:::-;;;;:::-;;;;:::-;;;;;;;;;;:::-;-1:-1::-;;;;","linkReferences":null,"cborAuxdata":{},"immutableReferences":null,"transformations":[],"transformationValues":{}},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"deployment":{"transactionHash":"0x5dc4a688b63cea09bf4d73a695175b77572792a2e2b3656297809ad3596d4bfe","blockNumber":"10647806","transactionIndex":"60","deployer":"0xc4AD0Ef33A0A4ddA3461c479ccb6c36d1e4B7Be4"},"matchId":"5888333","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2025-01-08T11:12:10Z","match":"match","chainId":"1","address":"0xD533a949740bb3306d119CC777fa900bA034cd52"}