// SPDX-License-Identifier: AGPL-3.0-or-later
/// MkrSky.sol -- Mkr/Sky Exchanger
// Copyright (C) 2023 Dai Foundation
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
pragma solidity ^0.8.21;
interface GemLike {
function burn(address, uint256) external;
function mint(address, uint256) external;
}
contract MkrSky {
GemLike public immutable mkr;
GemLike public immutable sky;
uint256 public immutable rate;
event MkrToSky(address indexed caller, address indexed usr, uint256 mkrAmt, uint256 skyAmt);
event SkyToMkr(address indexed caller, address indexed usr, uint256 skyAmt, uint256 mkrAmt);
constructor(address mkr_, address sky_, uint256 rate_) {
mkr = GemLike(mkr_);
sky = GemLike(sky_);
rate = rate_;
}
function mkrToSky(address usr, uint256 mkrAmt) external {
mkr.burn(msg.sender, mkrAmt);
uint256 skyAmt = mkrAmt * rate;
sky.mint(usr, skyAmt);
emit MkrToSky(msg.sender, usr, mkrAmt, skyAmt);
}
function skyToMkr(address usr, uint256 skyAmt) external {
sky.burn(msg.sender, skyAmt);
uint256 mkrAmt = skyAmt / rate; // Rounding down, dust will be lost if it is not multiple of rate
mkr.mint(usr, mkrAmt);
emit SkyToMkr(msg.sender, usr, skyAmt, mkrAmt);
}
}
{
"compilationTarget": {
"src/MkrSky.sol": "MkrSky"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":dss-interfaces/=lib/token-tests/lib/dss-test/lib/dss-interfaces/src/",
":dss-test/=lib/token-tests/lib/dss-test/src/",
":forge-std/=lib/token-tests/lib/dss-test/lib/forge-std/src/",
":token-tests/=lib/token-tests/src/"
]
}
[{"inputs":[{"internalType":"address","name":"mkr_","type":"address"},{"internalType":"address","name":"sky_","type":"address"},{"internalType":"uint256","name":"rate_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"mkrAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"skyAmt","type":"uint256"}],"name":"MkrToSky","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"skyAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mkrAmt","type":"uint256"}],"name":"SkyToMkr","type":"event"},{"inputs":[],"name":"mkr","outputs":[{"internalType":"contract GemLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"mkrAmt","type":"uint256"}],"name":"mkrToSky","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sky","outputs":[{"internalType":"contract GemLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"skyAmt","type":"uint256"}],"name":"skyToMkr","outputs":[],"stateMutability":"nonpayable","type":"function"}]