{"file_path":"contracts/swap/StablecoinBridge.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.0;\r\n\r\nimport \"../erc20/IERC20.sol\";\r\nimport \"../stablecoin/IFrankencoin.sol\";\r\n\r\n/**\r\n * @title Stable Coin Bridge\r\n * @notice A minting contract for another Swiss franc stablecoin ('source stablecoin') that we trust.\r\n * @author Frankencoin\r\n */\r\ncontract StablecoinBridge {\r\n\r\n    IERC20 public immutable chf; // the source stablecoin\r\n    IFrankencoin public immutable zchf; // the Frankencoin\r\n\r\n    /**\r\n     * @notice The time horizon after which this bridge expires and needs to be replaced by a new contract.\r\n     */\r\n    uint256 public immutable horizon;\r\n\r\n    /**\r\n     * @notice The decimal difference between ZCHF and the source stablecoin.\r\n     */\r\n    uint256 public immutable decimalMultiplier;\r\n\r\n    /**\r\n     * The maximum amount of outstanding converted source stablecoins.\r\n     */\r\n    uint256 public immutable limit;\r\n    uint256 public minted;\r\n\r\n    mapping (address => uint256) public credits;\r\n\r\n    event Mint(address indexed target, uint256 amount);\r\n    event Burn(address indexed zchfHolder, uint256 amount);\r\n    event Credit(address indexed target, uint256 amount);\r\n    event Payout(address indexed target, uint256 amount);\r\n\r\n    error Limit(uint256 amount, uint256 limit);\r\n    error Expired(uint256 time, uint256 expiration);\r\n    error UnsupportedToken(address token);\r\n\r\n    /**\r\n     * Construct the swap bridge.\r\n     * \r\n     * Other is the address of a trusted CHF stablecoin that we will allow minting against. It can have at most 18 decimals and \r\n     * the number of decimals must be constant over time. The bridge will mint 1 Frankencoin for each unit of the source stablecoin.\r\n     */\r\n    constructor(address other, address zchfAddress, uint256 limit_) {\r\n        chf = IERC20(other);\r\n        zchf = IFrankencoin(zchfAddress);\r\n        horizon = block.timestamp + 52 weeks;\r\n        decimalMultiplier = 10 ** (zchf.decimals() - chf.decimals());\r\n        limit = limit_;\r\n        minted = 0;\r\n    }\r\n\r\n    /**\r\n     * @notice Convenience method for mint(msg.sender, amount)\r\n     */\r\n    function mint(uint256 amount) external {\r\n        mintTo(msg.sender, amount);\r\n    }\r\n\r\n    /**\r\n     * @notice Mint the target amount of Frankencoins, taking the equal amount of source coins from the sender.\r\n     * @dev This only works if an allowance for the source coins has been set and the caller has enough of them.\r\n     */\r\n    function mintTo(address target, uint256 amount) public {\r\n        chf.transferFrom(msg.sender, address(this), amount);\r\n        _mint(target, amount * decimalMultiplier);\r\n    }\r\n\r\n    function _mint(address target, uint256 zchfAmount) internal {\r\n        if (block.timestamp > horizon) revert Expired(block.timestamp, horizon);\r\n        zchf.mint(target, zchfAmount);\r\n        minted += zchfAmount;\r\n        if (minted > limit) revert Limit(zchfAmount, limit);\r\n        emit Mint(target, zchfAmount);\r\n    }\r\n\r\n    /**\r\n     * @notice Convenience method for burnAndSend(msg.sender, amount)\r\n     */\r\n    function burn(uint256 zchfAmount) external {\r\n        uint256 chfAmount = zchfAmount / decimalMultiplier;\r\n        _burn(msg.sender, chfAmount * decimalMultiplier);\r\n        chf.transfer(msg.sender, chfAmount);\r\n    }\r\n\r\n    /**\r\n     * @notice Burn the indicated amount of Frankencoin and send the same number of source coin to the caller.\r\n     */\r\n    function burnAndSend(address target, uint256 zchfAmount) external {\r\n        uint256 chfAmount = zchfAmount / decimalMultiplier;\r\n        _burn(msg.sender, chfAmount * decimalMultiplier);\r\n        chf.transfer(target, chfAmount);\r\n    }\r\n\r\n    /**\r\n     * Burn the indicated amount of Frankencoin and credit the same amount to the target address.\r\n     * The target address can then call payoutCredit to receive the source coin.\r\n     * \r\n     * This can be useful in case the source stablecoin has transfer fees or other transfer restrictions.\r\n     */\r\n    function burnAndCredit(address target, uint256 zchfAmount) external {\r\n        uint256 chfAmount = zchfAmount / decimalMultiplier;\r\n        _burn(msg.sender, chfAmount * decimalMultiplier);\r\n        credits[target] += chfAmount;\r\n        emit Credit(target, chfAmount);\r\n    }\r\n\r\n    /**\r\n     * Function to check the credit balance of a target address.\r\n     */\r\n    function balanceOf(address account) external view returns (uint256) {\r\n        return credits[account];\r\n    }\r\n\r\n    /**\r\n     * Pays out all the outstanding credit of the target address to the target address.\r\n     * \r\n     * Anyone can trigger this for any target address. This is to cover the use case where the issuer has frozen\r\n     * the source coin in this contract but still allows withdrawals for specific addresses, in which case the issuer\r\n     * could unfreeze, trigger payouts to compliant users, and then freeze the balance again in a single transaction\r\n     * to satisfy the redemption rights of the beneficial owners according to the credit mapping.\r\n     */\r\n    function payoutCredit(address target) external {\r\n        uint256 amount = credits[target];\r\n        credits[target] = 0;\r\n        chf.transfer(target, amount);\r\n        emit Payout(target, amount);\r\n    }\r\n\r\n    function _burn(address zchfHolder, uint256 zchfAmount) internal {\r\n        zchf.burnFrom(zchfHolder, zchfAmount);\r\n        minted -= zchfAmount;\r\n        emit Burn(zchfHolder, zchfAmount);\r\n    }\r\n}\r\n","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a4d66daf11610066578063a4d66daf14610222578063c4d4803a14610249578063d868bfb714610270578063fe5ff4681461028357600080fd5b806370a08231146101d35780639e41b44d146101fc578063a0712d681461020f57600080fd5b806342966c68116100c857806342966c681461018f578063449a52f8146101a45780634f02c420146101b75780635d224043146101c057600080fd5b80631ce832b5146100ef5780633082538f1461012957806337b272b014610150575b600080fd5b6101167f000000000000000000000000000000000000000000000000000000006bb781e781565b6040519081526020015b60405180910390f35b6101167f000000000000000000000000000000000000000000000000000000e8d4a5100081565b6101777f000000000000000000000000bd4dfc058eb95b8de5ceaf39966a1a70f5556f7881565b6040516001600160a01b039091168152602001610120565b6101a261019d3660046109a8565b6102a3565b005b6101a26101b23660046109dd565b61039a565b61011660005481565b6101a26101ce366004610a07565b610469565b6101166101e1366004610a07565b6001600160a01b031660009081526001602052604090205490565b6101a261020a3660046109dd565b61055a565b6101a261021d3660046109a8565b61064f565b6101167f000000000000000000000000000000000000000000084595161401484a00000081565b6101777f000000000000000000000000b58e61c3098d85632df34eecfb899a1ed80921cb81565b6101a261027e3660046109dd565b61065c565b610116610291366004610a07565b60016020526000908152604090205481565b60006102cf7f000000000000000000000000000000000000000000000000000000e8d4a5100083610a3f565b9050610304336102ff7f000000000000000000000000000000000000000000000000000000e8d4a5100084610a61565b610728565b60405163a9059cbb60e01b8152336004820152602481018290527f000000000000000000000000bd4dfc058eb95b8de5ceaf39966a1a70f5556f786001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103959190610a7e565b505050565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f000000000000000000000000bd4dfc058eb95b8de5ceaf39966a1a70f5556f786001600160a01b0316906323b872dd906064016020604051808303816000875af115801561040d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104319190610a7e565b50610465826104607f000000000000000000000000000000000000000000000000000000e8d4a5100084610a61565b6107fb565b5050565b6001600160a01b0381811660008181526001602052604080822080549290555163a9059cbb60e01b8152600481019290925260248201819052917f000000000000000000000000bd4dfc058eb95b8de5ceaf39966a1a70f5556f78169063a9059cbb906044016020604051808303816000875af11580156104ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105129190610a7e565b50816001600160a01b03167f5afeca38b2064c23a692c4cf353015d80ab3ecc417b4f893f372690c11fbd9a68260405161054e91815260200190565b60405180910390a25050565b60006105867f000000000000000000000000000000000000000000000000000000e8d4a5100083610a3f565b90506105b6336102ff7f000000000000000000000000000000000000000000000000000000e8d4a5100084610a61565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390527f000000000000000000000000bd4dfc058eb95b8de5ceaf39966a1a70f5556f78169063a9059cbb906044016020604051808303816000875af1158015610625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106499190610a7e565b50505050565b610659338261039a565b50565b60006106887f000000000000000000000000000000000000000000000000000000e8d4a5100083610a3f565b90506106b8336102ff7f000000000000000000000000000000000000000000000000000000e8d4a5100084610a61565b6001600160a01b038316600090815260016020526040812080548392906106e0908490610aa0565b90915550506040518181526001600160a01b038416907f1bbf55d483639f8103dc4e035af71a4fbdb16c80be740fa3eef81198acefa0949060200160405180910390a2505050565b60405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000b58e61c3098d85632df34eecfb899a1ed80921cb16906379cc679090604401600060405180830381600087803b15801561079257600080fd5b505af11580156107a6573d6000803e3d6000fd5b50505050806000808282546107bb9190610ab3565b90915550506040518181526001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200161054e565b7f000000000000000000000000000000000000000000000000000000006bb781e74211156108695760405163aa2fd92560e01b81524260048201527f000000000000000000000000000000000000000000000000000000006bb781e760248201526044015b60405180910390fd5b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390527f000000000000000000000000b58e61c3098d85632df34eecfb899a1ed80921cb16906340c10f1990604401600060405180830381600087803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b50505050806000808282546108fc9190610aa0565b90915550506000547f000000000000000000000000000000000000000000084595161401484a000000101561096d57604051631927a4b960e21b8152600481018290527f000000000000000000000000000000000000000000084595161401484a0000006024820152604401610860565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161054e91815260200190565b6000602082840312156109ba57600080fd5b5035919050565b80356001600160a01b03811681146109d857600080fd5b919050565b600080604083850312156109f057600080fd5b6109f9836109c1565b946020939093013593505050565b600060208284031215610a1957600080fd5b610a22826109c1565b9392505050565b634e487b7160e01b600052601160045260246000fd5b600082610a5c57634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610a7857610a78610a29565b92915050565b600060208284031215610a9057600080fd5b81518015158114610a2257600080fd5b80820180821115610a7857610a78610a29565b81810381811115610a7857610a78610a2956fea26469706673582212209b6ba6ca01de75fb625b1baa6705bf5cc8efab7a6c39475c72058d5191dc2e8f64736f6c63430008180033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs","useLiteralContent":true},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}}},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":[["0xBD4DfC058eb95b8De5ceAF39966A1a70F5556F78",{"internalType":"address","name":"other","type":"address"}],["0xB58E61C3098d85632Df34EecfB899A1Ed80921cB",{"internalType":"address","name":"zchfAddress","type":"address"}],["10000000000000000000000000",{"internalType":"uint256","name":"limit_","type":"uint256"}]],"compiler_version":"v0.8.24+commit.e11b9ed9","is_verified_via_verifier_alliance":false,"verified_at":"2026-04-09T12:50:04.655976Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x6101206040523480156200001257600080fd5b5060405162000ef638038062000ef6833981016040819052620000359162000176565b6001600160a01b03808416608052821660a05262000058426301dfe200620001cd565b60c081815250506080516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c69190620001e9565b60a0516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000107573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012d9190620001e9565b62000139919062000215565b6200014690600a6200032e565b60e052610100525050600080556200033f565b80516001600160a01b03811681146200017157600080fd5b919050565b6000806000606084860312156200018c57600080fd5b620001978462000159565b9250620001a76020850162000159565b9150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b80820180821115620001e357620001e3620001b7565b92915050565b600060208284031215620001fc57600080fd5b815160ff811681146200020e57600080fd5b9392505050565b60ff8281168282160390811115620001e357620001e3620001b7565b600181815b8085111562000272578160001904821115620002565762000256620001b7565b808516156200026457918102915b93841c939080029062000236565b509250929050565b6000826200028b57506001620001e3565b816200029a57506000620001e3565b8160018114620002b35760028114620002be57620002de565b6001915050620001e3565b60ff841115620002d257620002d2620001b7565b50506001821b620001e3565b5060208310610133831016604e8410600b841016171562000303575081810a620001e3565b6200030f838362000231565b8060001904821115620003265762000326620001b7565b029392505050565b60006200020e60ff8416836200027a565b60805160a05160c05160e05161010051610afc620003fa6000396000818161022701528181610906015261094101526000818161012e015281816102aa015281816102da0152818161043b015281816105610152818161059101528181610663015261069301526000818160f4015281816107fd015261083801526000818161024e0152818161074e015261088f01526000818161015501528181610320015281816103bc015281816104a501526105dc0152610afc6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063a4d66daf11610066578063a4d66daf14610222578063c4d4803a14610249578063d868bfb714610270578063fe5ff4681461028357600080fd5b806370a08231146101d35780639e41b44d146101fc578063a0712d681461020f57600080fd5b806342966c68116100c857806342966c681461018f578063449a52f8146101a45780634f02c420146101b75780635d224043146101c057600080fd5b80631ce832b5146100ef5780633082538f1461012957806337b272b014610150575b600080fd5b6101167f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101167f000000000000000000000000000000000000000000000000000000000000000081565b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610120565b6101a261019d3660046109a8565b6102a3565b005b6101a26101b23660046109dd565b61039a565b61011660005481565b6101a26101ce366004610a07565b610469565b6101166101e1366004610a07565b6001600160a01b031660009081526001602052604090205490565b6101a261020a3660046109dd565b61055a565b6101a261021d3660046109a8565b61064f565b6101167f000000000000000000000000000000000000000000000000000000000000000081565b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101a261027e3660046109dd565b61065c565b610116610291366004610a07565b60016020526000908152604090205481565b60006102cf7f000000000000000000000000000000000000000000000000000000000000000083610a3f565b9050610304336102ff7f000000000000000000000000000000000000000000000000000000000000000084610a61565b610728565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103959190610a7e565b505050565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af115801561040d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104319190610a7e565b50610465826104607f000000000000000000000000000000000000000000000000000000000000000084610a61565b6107fb565b5050565b6001600160a01b0381811660008181526001602052604080822080549290555163a9059cbb60e01b8152600481019290925260248201819052917f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156104ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105129190610a7e565b50816001600160a01b03167f5afeca38b2064c23a692c4cf353015d80ab3ecc417b4f893f372690c11fbd9a68260405161054e91815260200190565b60405180910390a25050565b60006105867f000000000000000000000000000000000000000000000000000000000000000083610a3f565b90506105b6336102ff7f000000000000000000000000000000000000000000000000000000000000000084610a61565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106499190610a7e565b50505050565b610659338261039a565b50565b60006106887f000000000000000000000000000000000000000000000000000000000000000083610a3f565b90506106b8336102ff7f000000000000000000000000000000000000000000000000000000000000000084610a61565b6001600160a01b038316600090815260016020526040812080548392906106e0908490610aa0565b90915550506040518181526001600160a01b038416907f1bbf55d483639f8103dc4e035af71a4fbdb16c80be740fa3eef81198acefa0949060200160405180910390a2505050565b60405163079cc67960e41b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906379cc679090604401600060405180830381600087803b15801561079257600080fd5b505af11580156107a6573d6000803e3d6000fd5b50505050806000808282546107bb9190610ab3565b90915550506040518181526001600160a01b038316907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200161054e565b7f00000000000000000000000000000000000000000000000000000000000000004211156108695760405163aa2fd92560e01b81524260048201527f000000000000000000000000000000000000000000000000000000000000000060248201526044015b60405180910390fd5b6040516340c10f1960e01b81526001600160a01b038381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b1580156108d357600080fd5b505af11580156108e7573d6000803e3d6000fd5b50505050806000808282546108fc9190610aa0565b90915550506000547f0000000000000000000000000000000000000000000000000000000000000000101561096d57604051631927a4b960e21b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006024820152604401610860565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161054e91815260200190565b6000602082840312156109ba57600080fd5b5035919050565b80356001600160a01b03811681146109d857600080fd5b919050565b600080604083850312156109f057600080fd5b6109f9836109c1565b946020939093013593505050565b600060208284031215610a1957600080fd5b610a22826109c1565b9392505050565b634e487b7160e01b600052601160045260246000fd5b600082610a5c57634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610a7857610a78610a29565b92915050565b600060208284031215610a9057600080fd5b81518015158114610a2257600080fd5b80820180821115610a7857610a78610a29565b81810381811115610a7857610a78610a2956fea26469706673582212209b6ba6ca01de75fb625b1baa6705bf5cc8efab7a6c39475c72058d5191dc2e8f64736f6c63430008180033000000000000000000000000bd4dfc058eb95b8de5ceaf39966a1a70f5556f78000000000000000000000000b58e61c3098d85632df34eecfb899a1ed80921cb000000000000000000000000000000000000000000084595161401484a000000","name":"StablecoinBridge","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"contracts/equity/IGovernance.sol","source_code":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.0;\r\n\r\ninterface IGovernance {\r\n   function checkQualified(address sender, address[] calldata helpers) external view;\r\n}\r\n\r\nstruct SyncVote {\r\n    address voter;\r\n    uint256 votes;\r\n    address delegatee;\r\n}\r\n\r\nstruct SyncMessage {\r\n    SyncVote[] votes;\r\n    uint256 totalVotes;\r\n}\r\n"},{"file_path":"contracts/erc20/IERC20.sol","source_code":"/**\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Copyright (c) 2016-2019 zOS Global Limited\r\n *\r\n */\r\npragma solidity ^0.8.0;\r\n\r\n/**\r\n * @dev Interface of the ERC20 standard as defined in the EIP. Does not include\r\n * the optional functions; to access them see `ERC20Detailed`.\r\n */\r\n\r\ninterface IERC20 {\r\n    function name() external view returns (string memory);\r\n\r\n    function symbol() external view returns (string memory);\r\n\r\n    function decimals() external view returns (uint8);\r\n\r\n    /**\r\n     * @dev Returns the amount of tokens in existence.\r\n     */\r\n    function totalSupply() external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Returns the amount of tokens owned by `account`.\r\n     */\r\n    function balanceOf(address account) external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\r\n     *\r\n     * Returns always true. Throws error on failure.\r\n     *\r\n     * Emits a `Transfer` event.\r\n     */\r\n    function transfer(address recipient, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Returns the remaining number of tokens that `spender` will be\r\n     * allowed to spend on behalf of `owner` through `transferFrom`. This is\r\n     * zero by default.\r\n     *\r\n     * This value can change when `approve` or `transferFrom` are called.\r\n     */\r\n    function allowance(address owner, address spender) external view returns (uint256);\r\n\r\n    /**\r\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\r\n     *\r\n     * Returns a boolean value indicating whether the operation succeeded.\r\n     *\r\n     * > Beware that changing an allowance with this method brings the risk\r\n     * that someone may use both the old and the new allowance by unfortunate\r\n     * transaction ordering. One possible solution to mitigate this race\r\n     * condition is to first reduce the spender's allowance to 0 and set the\r\n     * desired value afterwards:\r\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\r\n     *\r\n     * Emits an `Approval` event.\r\n     */\r\n    function approve(address spender, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\r\n     * allowance mechanism. `amount` is then deducted from the caller's\r\n     * allowance.\r\n     *\r\n     * Returns always true. Throws error on failure.\r\n     *\r\n     * Emits a `Transfer` event.\r\n     */\r\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\r\n\r\n    /**\r\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\r\n     * another (`to`).\r\n     *\r\n     * Note that `value` may be zero.\r\n     */\r\n    event Transfer(address indexed from, address indexed to, uint256 value);\r\n\r\n    /**\r\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\r\n     * a call to `approve`. `value` is the new allowance.\r\n     */\r\n    event Approval(address indexed owner, address indexed spender, uint256 value);\r\n}\r\n"},{"file_path":"contracts/stablecoin/IBasicFrankencoin.sol","source_code":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.0;\r\n\r\nimport \"../erc20/IERC20.sol\";\r\nimport \"../equity/IGovernance.sol\";\r\n\r\ninterface IBasicFrankencoin is IERC20 {\r\n    function MIN_FEE() external view returns (uint256);\r\n\r\n    function MIN_APPLICATION_PERIOD() external view returns (uint256);\r\n\r\n    function suggestMinter(\r\n        address _minter,\r\n        uint256 _applicationPeriod,\r\n        uint256 _applicationFee,\r\n        string calldata _message\r\n    ) external;\r\n\r\n    function registerPosition(address position) external;\r\n\r\n    function denyMinter(address minter, address[] calldata helpers, string calldata message) external;\r\n\r\n    function reserve() external view returns (IGovernance);\r\n\r\n    function isMinter(address minter) external view returns (bool);\r\n\r\n    function getPositionParent(address position) external view returns (address);\r\n\r\n    function mint(address target, uint256 amount) external;\r\n\r\n    function burnFrom(address target, uint256 amount) external;\r\n\r\n    function burn(uint256 amount) external;\r\n\r\n    function coverLoss(address source, uint256 amount) external;\r\n\r\n    function collectProfits(address source, uint256 _amount) external;\r\n}\r\n"},{"file_path":"contracts/stablecoin/IFrankencoin.sol","source_code":"// SPDX-License-Identifier: MIT\r\npragma solidity ^0.8.0;\r\n\r\nimport \"../equity/IGovernance.sol\";\r\nimport \"./IBasicFrankencoin.sol\";\r\n\r\ninterface IFrankencoin is IBasicFrankencoin {\r\n\r\n    function minterReserve() external view returns (uint256);\r\n\r\n    function calculateAssignedReserve(uint256 mintedAmount, uint32 _reservePPM) external view returns (uint256);\r\n\r\n    function calculateFreedAmount(uint256 amountExcludingReserve, uint32 reservePPM) external view returns (uint256);\r\n\r\n    function equity() external view returns (uint256);\r\n\r\n    function mintWithReserve(address target, uint256 amount, uint32 reservePPM, uint32 feePPM) external;\r\n\r\n    function burnWithoutReserve(uint256 amountIncludingReserve, uint32 reservePPM) external;\r\n\r\n    function burnFromWithReserve(address payer, uint256 targetTotalBurnAmount, uint32 _reservePPM) external returns (uint256);\r\n\r\n    function burnWithReserve(uint256 amountExcludingReserve, uint32 reservePPM) external returns (uint256);\r\n\r\n}\r\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"other","type":"address"},{"internalType":"address","name":"zchfAddress","type":"address"},{"internalType":"uint256","name":"limit_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"Limit","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"UnsupportedToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"zchfHolder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Credit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Payout","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"zchfAmount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"zchfAmount","type":"uint256"}],"name":"burnAndCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"zchfAmount","type":"uint256"}],"name":"burnAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chf","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"credits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"horizon","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"payoutCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zchf","outputs":[{"internalType":"contract IFrankencoin","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x000000000000000000000000bd4dfc058eb95b8de5ceaf39966a1a70f5556f78000000000000000000000000b58e61c3098d85632df34eecfb899a1ed80921cb000000000000000000000000000000000000000000084595161401484a000000"}