creation_sourcecode: {{
    "language": "Solidity",
    "sources": {
      "src/dao/DAOConfig.sol": {
        "content": "// SPDX-License-Identifier: BUSL 1.1\npragma solidity =0.8.22;\n\nimport \"openzeppelin-contracts/contracts/access/Ownable.sol\";\nimport \"./interfaces/IDAOConfig.sol\";\n\n\n// Contract owned by the DAO with parameters modifiable only by the DAO\ncontract DAOConfig is IDAOConfig, Ownable\n    {\n    event BootstrappingRewardsChanged(uint256 newBootstrappingRewards);\n    event PercentPolRewardsBurnedChanged(uint256 newPercentPolRewardsBurned);\n    event BaseBallotQuorumPercentChanged(uint256 newBaseBallotQuorumPercentTimes1000);\n    event BallotDurationChanged(uint256 newBallotDuration);\n    event BallotMaximumDurationChanged(uint256 newMaximumDuration);\n    event RequiredProposalPercentStakeChanged(uint256 newRequiredProposalPercentStakeTimes1000);\n    event PercentRewardsForReserveChanged(uint256 newArbitrageProfitsPercentPOL);\n    event UpkeepRewardPercentChanged(uint256 newUpkeepRewardPercent);\n\n\t// The amount of SALT provided as a bootstrapping reward when a new token is whitelisted.\n\t// Note that new tokens will only be able to be whitelisted (even if the vote is favorable) once the DAO SALT balance is at least this amount.\n\t// The DAO receives 25 million SALT (linearly over 10 years - about 48k per week) as well as default ~23% of the Protocol Owned Liquidity SALT rewards.\n\t// Range: 50k ether to 500k ether with an adjustment of 50k ether\n\tuint256 public bootstrappingRewards = 200000 ether;\n\n\t// The percent of SALT rewards that are burned.\n\t// Range: 5% to 15% with an adjustment of 1%\n    uint256 public percentRewardsBurned = 10;\n\n\t// The minimum amount of xSALT required for ballot quorum (to take action on the ballot).\n\t// baseBallotQuorum is decided as a percent of the total amount of SALT staked.\n\t// NOTE: there is a hard minimum of 0.50% of SALT.totalSupply that takes effect if the amount of staked SALT is low (at launch for instance).\n\t// Parameter adjustment quorum: = 1 * baseBallotQuorum\n\t// Token whitelisting quorum: = 2 * baseBallotQuorum\n\t// Sending SALT from the DAO quorum: = 3 * baseBallotQuorum\n\t// Country whitelisting quorum: = 3 * baseBallotQuorum\n\t// Contract updating quorum: = 3 * baseBallotQuorum\n\t// Website updating quorum: = 3 * baseBallotQuorum\n\t// Range: 5% to 20% with an adjustment of 1%\n\tuint256 public baseBallotQuorumPercentTimes1000 = 7 * 1000; // Default 7% of the total amount of SALT staked with a 1000x multiplier\n\n\t// How many days minimum a ballot has to exist before it can be taken action on.\n\t// Action will only be taken if it has the required votes and quorum to do so.\n\t// Range: 3 to 14 days with an adjustment of 1 day\n\tuint256 public ballotMinimumDuration = 10 days;\n\n\t// How many days a ballot can exist before it can be manually removed by any user.\n\t// Range: 15 to 90 days with an adjustment of 15 days\n\tuint256 public ballotMaximumDuration = 30 days;\n\n\t// The percent of staked SALT that a user has to have to make a proposal\n\t// Range: 0.10% to 2% with an adjustment of 0.10%\n\tuint256 public requiredProposalPercentStakeTimes1000 = 500;  // Defaults to 0.50% with a 1000x multiplier\n\n\t// The percentage of SALT rewards that are sent to the DAO's reserve\n\t// Range: 5% to 15% with an adjustment of 1%\n\tuint256 public percentRewardsForReserve = 10;\n\n\t// The share of the WETH arbitrage profits sent to the DAO that are sent to the caller of DAO.performUpkeep()\n\t// Range: 1% to 10% with an adjustment of 1%\n\tuint256 public upkeepRewardPercent = 5;\n\n\n\tfunction changeBootstrappingRewards(bool increase) external onlyOwner\n\t\t{\n        if (increase)\n        \t{\n            if (bootstrappingRewards < 500000 ether)\n                bootstrappingRewards += 50000 ether;\n            }\n       \t else\n       \t \t{\n            if (bootstrappingRewards > 50000 ether)\n                bootstrappingRewards -= 50000 ether;\n\t        }\n\n\t\temit BootstrappingRewardsChanged(bootstrappingRewards);\n    \t}\n\n\n\tfunction changePercentRewardsBurned(bool increase) external onlyOwner\n\t\t{\n\t\tif (increase)\n\t\t\t{\n\t\t\tif (percentRewardsBurned < 15)\n\t\t\t\tpercentRewardsBurned += 1;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tif (percentRewardsBurned > 5)\n\t\t\t\tpercentRewardsBurned -= 1;\n\t\t\t}\n\n\t\temit PercentPolRewardsBurnedChanged(percentRewardsBurned);\n\t\t}\n\n\n\tfunction changeBaseBallotQuorumPercent(bool increase) external onlyOwner\n\t\t{\n\t\tif (increase)\n\t\t\t{\n\t\t\tif (baseBallotQuorumPercentTimes1000 < 20 * 1000)\n\t\t\t\tbaseBallotQuorumPercentTimes1000 += 1000;\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tif (baseBallotQuorumPercentTimes1000 > 5 * 1000 )\n\t\t\t\tbaseBallotQuorumPercentTimes1000 -= 1000;\n\t\t\t}\n\n\t\temit BaseBallotQuorumPercentChanged(baseBallotQuorumPercentTimes1000);\n\t\t}\n\n\n\tfunction changeBallotDuration(bool increase) external onlyOwner\n    \t{\n        if (increase)\n        \t{\n            if (ballotMinimumDuration < 14 days)\n                ballotMinimumDuration += 1 days;\n        \t}\n        else\n        \t{\n            if (ballotMinimumDuration > 3 days)\n                ballotMinimumDuration -= 1 days;\n        \t}\n\n\t\temit BallotDurationChanged(ballotMinimumDuration);\n    \t}\n\n\n\tfunction changeBallotMaximumDuration(bool increase) external onlyOwner\n    \t{\n        if (increase)\n        \t{\n            if (ballotMaximumDuration < 90 days)\n                ballotMaximumDuration += 15 days;\n        \t}\n        else\n        \t{\n            if (ballotMaximumDuration > 15 days)\n                ballotMaximumDuration -= 15 days;\n        \t}\n\n\t\temit BallotMaximumDurationChanged(ballotMaximumDuration);\n    \t}\n\n\n\tfunction changeRequiredProposalPercentStake(bool increase) external onlyOwner\n\t\t{\n\t\tif (increase)\n\t\t\t{\n\t\t\tif (requiredProposalPercentStakeTimes1000 < 2000) // Maximum 2%\n\t\t\t\trequiredProposalPercentStakeTimes1000 += 100; // Increase by 0.10%\n\t\t\t}\n\t\telse\n\t\t\t{\n\t\t\tif (requiredProposalPercentStakeTimes1000 > 100) // Minimum 0.10%\n\t\t\t   requiredProposalPercentStakeTimes1000 -= 100; // Decrease by 0.10%\n\t\t\t}\n\n\t\temit RequiredProposalPercentStakeChanged(requiredProposalPercentStakeTimes1000);\n\t\t}\n\n\n\tfunction changePercentRewardsForReserve(bool increase) external onlyOwner\n        {\n        if (increase)\n            {\n            if (percentRewardsForReserve < 15)\n                percentRewardsForReserve += 1;\n            }\n        else\n            {\n            if (percentRewardsForReserve > 5)\n                percentRewardsForReserve -= 1;\n            }\n\n\t\temit PercentRewardsForReserveChanged(percentRewardsForReserve);\n\t\t}\n\n\n\tfunction changeUpkeepRewardPercent(bool increase) external onlyOwner\n        {\n        if (increase)\n            {\n            if (upkeepRewardPercent < 10)\n                upkeepRewardPercent += 1;\n            }\n        else\n            {\n            if (upkeepRewardPercent > 1)\n                upkeepRewardPercent -= 1;\n            }\n\n\t\temit UpkeepRewardPercentChanged(upkeepRewardPercent);\n        }\n    }"
      },
      "lib/openzeppelin-contracts/contracts/access/Ownable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    constructor() {\n        _transferOwnership(_msgSender());\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"
      },
      "src/dao/interfaces/IDAOConfig.sol": {
        "content": "// SPDX-License-Identifier: BUSL 1.1\npragma solidity =0.8.22;\n\n\ninterface IDAOConfig\n\t{\n\tfunction changeBootstrappingRewards(bool increase) external; // onlyOwner\n\tfunction changePercentRewardsBurned(bool increase) external; // onlyOwner\n\tfunction changeBaseBallotQuorumPercent(bool increase) external; // onlyOwner\n\tfunction changeBallotDuration(bool increase) external; // onlyOwner\n\tfunction changeBallotMaximumDuration(bool increase) external; // onlyOwner\n\tfunction changeRequiredProposalPercentStake(bool increase) external; // onlyOwner\n\tfunction changePercentRewardsForReserve(bool increase) external; // onlyOwner\n\tfunction changeUpkeepRewardPercent(bool increase) external; // onlyOwner\n\n\t// Views\n    function bootstrappingRewards() external view returns (uint256);\n    function percentRewardsBurned() external view returns (uint256);\n    function baseBallotQuorumPercentTimes1000() external view returns (uint256);\n    function ballotMinimumDuration() external view returns (uint256);\n    function ballotMaximumDuration() external view returns (uint256);\n    function requiredProposalPercentStakeTimes1000() external view returns (uint256);\n    function percentRewardsForReserve() external view returns (uint256);\n    function upkeepRewardPercent() external view returns (uint256);\n\t}"
      },
      "lib/openzeppelin-contracts/contracts/utils/Context.sol": {
        "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n}\n"
      }
    },
    "settings": {
      "remappings": [
        "chainlink/=lib/chainlink/",
        "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
        "forge-std/=lib/openzeppelin-contracts/lib/forge-std/src/",
        "openzeppelin-contracts/=lib/openzeppelin-contracts/",
        "openzeppelin/=lib/openzeppelin-contracts/contracts/",
        "v3-core/=lib/v3-core/contracts/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 10000
      },
      "metadata": {
        "useLiteralContent": false,
        "bytecodeHash": "ipfs",
        "appendCBOR": true
      },
      "outputSelection": {
        "*": {
          "*": [
            "evm.bytecode",
            "evm.deployedBytecode",
            "devdoc",
            "userdoc",
            "metadata",
            "abi"
          ]
        }
      },
      "evmVersion": "paris",
      "libraries": {}
    }
  }}