From d4fe3fd99ef48835c64120ec6543d4e29f95b233 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 29 Jan 2025 18:03:27 +0200 Subject: [PATCH 01/23] feat: contract and basic tests --- src/DssBlow2.sol | 60 +++++++++++++++++++++++++++++++++ src/DssBlow2.t.sol | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 src/DssBlow2.sol create mode 100644 src/DssBlow2.t.sol diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol new file mode 100644 index 0000000..24eed4b --- /dev/null +++ b/src/DssBlow2.sol @@ -0,0 +1,60 @@ +/** + *Submitted for verification at Etherscan.io on 2021-11-10 +*/ + +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2021 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 . + +pragma solidity ^0.8.26; + +interface ERC20Like { + function balanceOf(address) external returns (uint256); + function approve(address usr, uint wad) external returns (bool); +} + +interface JoinLike { + function dai() external view returns (address); + function join(address, uint256) external; +} + +contract DssBlow2 { + address public immutable vow; + ERC20Like public immutable dai; + ERC20Like public immutable usds; + JoinLike public immutable daiJoin; + JoinLike public immutable usdsJoin; + + event Blow(uint256 DaiAmount, uint256 UsdsAmount); + + constructor(address daiJoin_, address usdsJoin_, address vow_) { + daiJoin = JoinLike(daiJoin_); + dai = ERC20Like(daiJoin.dai()); + usdsJoin = JoinLike(usdsJoin_); + usds = ERC20Like(usdsJoin.dai()); + vow = vow_; + dai.approve(daiJoin_, type(uint256).max); + usds.approve(usdsJoin_, type(uint256).max); + } + + function blow() public { + uint256 daiBalance = dai.balanceOf(address(this)); + daiJoin.join(vow, daiBalance); + uint256 usdsBalance = usds.balanceOf(address(this)); + usdsJoin.join(vow, usdsBalance); + emit Blow(daiBalance, usdsBalance); + } + +} \ No newline at end of file diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol new file mode 100644 index 0000000..414a8fa --- /dev/null +++ b/src/DssBlow2.t.sol @@ -0,0 +1,82 @@ +/** + *Submitted for verification at Etherscan.io on 2021-11-10 +*/ + +// SPDX-License-Identifier: AGPL-3.0-or-later +// Copyright (C) 2021 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 . + +pragma solidity ^0.8.26; + +import "dss-test/DssTest.sol"; +import "./DssBlow2.sol"; + + +contract DssBlow2Test is DssTest { + + address constant CHAINLOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F; + + DssInstance public dss; + DssBlow2 public dssBlow2; + + address usds; + address usdsJoin; + address vow; + + event Blow(uint256 DaiAmount, uint256 UsdsAmount); + + function setUp() public { + vm.createSelectFork("mainnet"); + // get all the relevant addresses + dss = MCD.loadFromChainlog(CHAINLOG); + usds = dss.chainlog.getAddress("USDS"); + usdsJoin = dss.chainlog.getAddress("USDS_JOIN"); + vow = address(dss.vow); + + dssBlow2 = new DssBlow2(address(dss.daiJoin), usdsJoin, vow); + + vm.label(address(dss.dai), "Dai"); + vm.label(address(dss.daiJoin), "DaiJoin"); + vm.label( usds, "Usds"); + vm.label( usdsJoin, "UsdsJoin"); + vm.label(address(dss.vow), "Vow"); + } + + function test_vow() public { + // send dai and usds to DssBlow2 + uint256 daiAmount = 10 ether; + uint256 usdsAmount = 5 ether; + deal(address(dss.dai), address(dssBlow2), daiAmount); + deal(usds, address(dssBlow2), usdsAmount); + // store balances before blow() + uint256 vowDaiBalance = dss.vat.dai(vow); + uint256 blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); + uint256 blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); + assertEq(blowUsdsBalance, usdsAmount); + assertEq(blowDaiBalance, daiAmount); + // event emission + vm.expectEmit(false, false, false, true); + emit Blow(daiAmount, usdsAmount); + // call blow() + dssBlow2.blow(); + // check balance after blow() + blowDaiBalance = dss.dai.balanceOf(vow); + blowUsdsBalance = ERC20Like(usds).balanceOf(vow); + assertEq(blowDaiBalance, 0); + assertEq(blowUsdsBalance, 0); + // the vat dai balance is in rad so we multiply with ray + assertEq(dss.vat.dai(vow), vowDaiBalance + (daiAmount + usdsAmount) * RAY); + } +} \ No newline at end of file From d328a985a10fac3dd14cb40db31eae84743d8832 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 29 Jan 2025 21:24:04 +0200 Subject: [PATCH 02/23] chore: fix CI --- .github/workflows/test.yml | 2 +- src/DssBlow2.sol | 15 +++++---------- src/DssBlow2.t.sol | 38 ++++++++++++++++---------------------- 3 files changed, 22 insertions(+), 33 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 762a296..5152cdc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,7 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: - version: nightly + version: stable - name: Show Forge version run: | diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 24eed4b..5961931 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -1,7 +1,3 @@ -/** - *Submitted for verification at Etherscan.io on 2021-11-10 -*/ - // SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2021 Dai Foundation // @@ -22,7 +18,7 @@ pragma solidity ^0.8.26; interface ERC20Like { function balanceOf(address) external returns (uint256); - function approve(address usr, uint wad) external returns (bool); + function approve(address usr, uint256 wad) external returns (bool); } interface JoinLike { @@ -31,11 +27,11 @@ interface JoinLike { } contract DssBlow2 { - address public immutable vow; + address public immutable vow; ERC20Like public immutable dai; ERC20Like public immutable usds; - JoinLike public immutable daiJoin; - JoinLike public immutable usdsJoin; + JoinLike public immutable daiJoin; + JoinLike public immutable usdsJoin; event Blow(uint256 DaiAmount, uint256 UsdsAmount); @@ -56,5 +52,4 @@ contract DssBlow2 { usdsJoin.join(vow, usdsBalance); emit Blow(daiBalance, usdsBalance); } - -} \ No newline at end of file +} diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index 414a8fa..08a9191 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -1,7 +1,3 @@ -/** - *Submitted for verification at Etherscan.io on 2021-11-10 -*/ - // SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2021 Dai Foundation // @@ -23,13 +19,11 @@ pragma solidity ^0.8.26; import "dss-test/DssTest.sol"; import "./DssBlow2.sol"; - contract DssBlow2Test is DssTest { - - address constant CHAINLOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F; + address constant CHAINLOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F; DssInstance public dss; - DssBlow2 public dssBlow2; + DssBlow2 public dssBlow2; address usds; address usdsJoin; @@ -40,30 +34,30 @@ contract DssBlow2Test is DssTest { function setUp() public { vm.createSelectFork("mainnet"); // get all the relevant addresses - dss = MCD.loadFromChainlog(CHAINLOG); - usds = dss.chainlog.getAddress("USDS"); + dss = MCD.loadFromChainlog(CHAINLOG); + usds = dss.chainlog.getAddress("USDS"); usdsJoin = dss.chainlog.getAddress("USDS_JOIN"); - vow = address(dss.vow); + vow = address(dss.vow); dssBlow2 = new DssBlow2(address(dss.daiJoin), usdsJoin, vow); - vm.label(address(dss.dai), "Dai"); + vm.label(address(dss.dai), "Dai"); vm.label(address(dss.daiJoin), "DaiJoin"); - vm.label( usds, "Usds"); - vm.label( usdsJoin, "UsdsJoin"); - vm.label(address(dss.vow), "Vow"); + vm.label(usds, "Usds"); + vm.label(usdsJoin, "UsdsJoin"); + vm.label(address(dss.vow), "Vow"); } function test_vow() public { // send dai and usds to DssBlow2 - uint256 daiAmount = 10 ether; - uint256 usdsAmount = 5 ether; + uint256 daiAmount = 10 ether; + uint256 usdsAmount = 5 ether; deal(address(dss.dai), address(dssBlow2), daiAmount); deal(usds, address(dssBlow2), usdsAmount); // store balances before blow() - uint256 vowDaiBalance = dss.vat.dai(vow); - uint256 blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); - uint256 blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); + uint256 vowDaiBalance = dss.vat.dai(vow); + uint256 blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); + uint256 blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); assertEq(blowUsdsBalance, usdsAmount); assertEq(blowDaiBalance, daiAmount); // event emission @@ -72,11 +66,11 @@ contract DssBlow2Test is DssTest { // call blow() dssBlow2.blow(); // check balance after blow() - blowDaiBalance = dss.dai.balanceOf(vow); + blowDaiBalance = dss.dai.balanceOf(vow); blowUsdsBalance = ERC20Like(usds).balanceOf(vow); assertEq(blowDaiBalance, 0); assertEq(blowUsdsBalance, 0); // the vat dai balance is in rad so we multiply with ray assertEq(dss.vat.dai(vow), vowDaiBalance + (daiAmount + usdsAmount) * RAY); } -} \ No newline at end of file +} From 2e9ab3c492e8f4d517b3d25a74ef525dfabc139e Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 29 Jan 2025 21:27:05 +0200 Subject: [PATCH 03/23] chore: fix compiler warning --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5152cdc..0e036bb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,7 +36,7 @@ jobs: - name: Run Forge build run: | - forge build --sizes + forge build --sizes --via-ir id: build - name: Run Forge tests From 70543564466a1b3dfa9001eead9826e99e84692c Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 29 Jan 2025 21:31:27 +0200 Subject: [PATCH 04/23] chore: fix compiler in testing --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0e036bb..0636e8d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,5 +41,5 @@ jobs: - name: Run Forge tests run: | - forge test -vvv + forge test -vvv --via-ir id: test From 9acc0fe1d2a8a3b59472b24bf3d6bc4f26fdee46 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 29 Jan 2025 21:36:09 +0200 Subject: [PATCH 05/23] chore: fix ci --- .github/workflows/test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0636e8d..ef2e255 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,6 +7,8 @@ on: env: FOUNDRY_PROFILE: ci + ETH_RPC_URL: ${{ secrets.ETH_RPC_URL }} + jobs: check: @@ -41,5 +43,5 @@ jobs: - name: Run Forge tests run: | - forge test -vvv --via-ir + forge test -vvv id: test From da8629aa1f5acfe8133f5543ca9c3733818d2e52 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Thu, 30 Jan 2025 15:40:45 +0200 Subject: [PATCH 06/23] chore: re-enable opt --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ef2e255..30ec9d2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -43,5 +43,5 @@ jobs: - name: Run Forge tests run: | - forge test -vvv + forge test -vvv --via-ir id: test From 31f52d86477af61103a81da81359d239e2554aa9 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Thu, 30 Jan 2025 19:34:29 +0200 Subject: [PATCH 07/23] chore: fix licenses --- src/DssBlow2.sol | 2 +- src/DssBlow2.t.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 5961931..9b3e42f 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -1,5 +1,5 @@ +// SPDX-FileCopyrightText: © 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2021 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 diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index 08a9191..63311c9 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -1,5 +1,5 @@ +// SPDX-FileCopyrightText: © 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later -// Copyright (C) 2021 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 From 6b41329783a25e471a69a59fa994bd44c88cf02c Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Sun, 2 Feb 2025 22:59:15 +0200 Subject: [PATCH 08/23] feat: deployment script --- script/DssBlow2Deploy.s.sol | 58 +++++++++++++++++++++++++++++ script/input/1/README.md | 1 + script/output/1/README.md | 1 + src/DssBlow2.sol | 5 +-- src/DssBlow2.t.sol | 3 +- src/deployment/DssBlow2Deploy.sol | 35 +++++++++++++++++ src/deployment/DssBlow2Instance.sol | 21 +++++++++++ 7 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 script/DssBlow2Deploy.s.sol create mode 100644 script/input/1/README.md create mode 100644 script/output/1/README.md create mode 100644 src/deployment/DssBlow2Deploy.sol create mode 100644 src/deployment/DssBlow2Instance.sol diff --git a/script/DssBlow2Deploy.s.sol b/script/DssBlow2Deploy.s.sol new file mode 100644 index 0000000..46b2e15 --- /dev/null +++ b/script/DssBlow2Deploy.s.sol @@ -0,0 +1,58 @@ +// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// 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 . +pragma solidity 0.8.26; + +import {Script} from "forge-std/Script.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {MCD, DssInstance} from "dss-test/MCD.sol"; +import {ScriptTools} from "dss-test/ScriptTools.sol"; +import {DssBlow2Deploy, DssBlow2DeployParams} from "src/deployment/DssBlow2Deploy.sol"; +import {DssBlow2Instance} from "src/deployment/DssBlow2Instance.sol"; + +contract DssBlow2DeployScript is Script { + using stdJson for string; + using ScriptTools for string; + + string constant NAME = "dss-blow-2-deploy"; + string config; + + address constant CHAINLOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F; + DssInstance dss = MCD.loadFromChainlog(CHAINLOG); + address usdsJoin = dss.chainlog.getAddress("USDS_JOIN"); + DssBlow2Instance inst; + + function run() external { + config = ScriptTools.loadConfig(); + + vm.startBroadcast(); + + inst = DssBlow2Deploy.deploy( + DssBlow2DeployParams({ + daiJoin: address(dss.daiJoin), + usdsJoin: usdsJoin, + vow: address(dss.vow) + }) + ); + + vm.stopBroadcast(); + + ScriptTools.exportContract(NAME, "dssBlow2Deploy", inst.blow); + ScriptTools.exportContract(NAME, "daiJoin", address(dss.daiJoin)); + ScriptTools.exportContract(NAME, "usdsJoin", usdsJoin); + ScriptTools.exportContract(NAME, "vow", address(dss.vow)); + } +} + diff --git a/script/input/1/README.md b/script/input/1/README.md new file mode 100644 index 0000000..301eb91 --- /dev/null +++ b/script/input/1/README.md @@ -0,0 +1 @@ +Script inputs for Mainnet. \ No newline at end of file diff --git a/script/output/1/README.md b/script/output/1/README.md new file mode 100644 index 0000000..85ae78f --- /dev/null +++ b/script/output/1/README.md @@ -0,0 +1 @@ +Script outputs for Mainnet. \ No newline at end of file diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 9b3e42f..8b14d63 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2025 Dai Foundation +// SPDX-FileCopyrightText: © 2023 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify @@ -13,8 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . - -pragma solidity ^0.8.26; +pragma solidity 0.8.26; interface ERC20Like { function balanceOf(address) external returns (uint256); diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index 63311c9..c761143 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -13,8 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . - -pragma solidity ^0.8.26; +pragma solidity 0.8.26; import "dss-test/DssTest.sol"; import "./DssBlow2.sol"; diff --git a/src/deployment/DssBlow2Deploy.sol b/src/deployment/DssBlow2Deploy.sol new file mode 100644 index 0000000..1a3c393 --- /dev/null +++ b/src/deployment/DssBlow2Deploy.sol @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// 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 . +pragma solidity 0.8.26; + +import {DssBlow2} from "src/DssBlow2.sol"; +import {DssBlow2Instance} from "./DssBlow2Instance.sol"; + +struct DssBlow2DeployParams { + address daiJoin; + address usdsJoin; + address vow; +} + +library DssBlow2Deploy { + function deploy(DssBlow2DeployParams memory p) internal returns (DssBlow2Instance memory r) { + r.blow = address(new DssBlow2({ + daiJoin_: p.daiJoin, + usdsJoin_: p.usdsJoin, + vow_: p.vow + })); + } +} \ No newline at end of file diff --git a/src/deployment/DssBlow2Instance.sol b/src/deployment/DssBlow2Instance.sol new file mode 100644 index 0000000..4987f0f --- /dev/null +++ b/src/deployment/DssBlow2Instance.sol @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// 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 . +pragma solidity 0.8.26; + +struct DssBlow2Instance { + address blow; +} + From a79c13685ef0bedf2fc9073f99d294a13425aaf1 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Mon, 3 Feb 2025 16:07:02 +0200 Subject: [PATCH 09/23] chore: emit 2 separate events --- src/DssBlow2.sol | 16 +++++++++---- src/DssBlow2.t.sol | 60 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 8b14d63..ba5feb7 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -22,6 +22,7 @@ interface ERC20Like { interface JoinLike { function dai() external view returns (address); + function usds() external view returns (address); function join(address, uint256) external; } @@ -32,13 +33,13 @@ contract DssBlow2 { JoinLike public immutable daiJoin; JoinLike public immutable usdsJoin; - event Blow(uint256 DaiAmount, uint256 UsdsAmount); + event Blow(address indexed token, uint256 amount); constructor(address daiJoin_, address usdsJoin_, address vow_) { daiJoin = JoinLike(daiJoin_); dai = ERC20Like(daiJoin.dai()); usdsJoin = JoinLike(usdsJoin_); - usds = ERC20Like(usdsJoin.dai()); + usds = ERC20Like(usdsJoin.usds()); vow = vow_; dai.approve(daiJoin_, type(uint256).max); usds.approve(usdsJoin_, type(uint256).max); @@ -46,9 +47,14 @@ contract DssBlow2 { function blow() public { uint256 daiBalance = dai.balanceOf(address(this)); - daiJoin.join(vow, daiBalance); + if (daiBalance > 0) { + daiJoin.join(vow, daiBalance); + emit Blow(address(dai), daiBalance); + } uint256 usdsBalance = usds.balanceOf(address(this)); - usdsJoin.join(vow, usdsBalance); - emit Blow(daiBalance, usdsBalance); + if (usdsBalance > 0) { + usdsJoin.join(vow, usdsBalance); + emit Blow(address(usds), usdsBalance); + } } } diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index c761143..a2a12f4 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -28,7 +28,7 @@ contract DssBlow2Test is DssTest { address usdsJoin; address vow; - event Blow(uint256 DaiAmount, uint256 UsdsAmount); + event Blow(address indexed token, uint256 amount); function setUp() public { vm.createSelectFork("mainnet"); @@ -47,7 +47,7 @@ contract DssBlow2Test is DssTest { vm.label(address(dss.vow), "Vow"); } - function test_vow() public { + function test_blow() public { // send dai and usds to DssBlow2 uint256 daiAmount = 10 ether; uint256 usdsAmount = 5 ether; @@ -57,19 +57,67 @@ contract DssBlow2Test is DssTest { uint256 vowDaiBalance = dss.vat.dai(vow); uint256 blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); uint256 blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); + assertEq(blowDaiBalance, daiAmount); assertEq(blowUsdsBalance, usdsAmount); + // event emission + vm.expectEmit(true, false, false, true); + emit Blow(address(dss.dai), daiAmount); + vm.expectEmit(true, false, false, true); + emit Blow(usds, usdsAmount); + // call blow() + dssBlow2.blow(); + // check balances after blow() + blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); + blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); + assertEq(blowDaiBalance, 0); + assertEq(blowUsdsBalance, 0); + // the vat dai balance is in rad so we multiply with ray + assertEq(dss.vat.dai(vow), vowDaiBalance + (daiAmount + usdsAmount) * RAY, "blowDaiUsds: vow balance mismatch"); + } + + function test_blowDai() public { + // send only dai to DssBlow2 + uint256 daiAmount = 10 ether; + deal(address(dss.dai), address(dssBlow2), daiAmount); + // store balances before blow() + uint256 vowDaiBalance = dss.vat.dai(vow); + uint256 blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); + uint256 blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); assertEq(blowDaiBalance, daiAmount); // event emission - vm.expectEmit(false, false, false, true); - emit Blow(daiAmount, usdsAmount); + vm.expectEmit(true, false, false, true); + emit Blow(address(dss.dai), daiAmount); // call blow() dssBlow2.blow(); - // check balance after blow() + // check balances after blow() blowDaiBalance = dss.dai.balanceOf(vow); blowUsdsBalance = ERC20Like(usds).balanceOf(vow); assertEq(blowDaiBalance, 0); assertEq(blowUsdsBalance, 0); // the vat dai balance is in rad so we multiply with ray - assertEq(dss.vat.dai(vow), vowDaiBalance + (daiAmount + usdsAmount) * RAY); + assertEq(dss.vat.dai(vow), vowDaiBalance + daiAmount * RAY, "blowDai: vow balance mismatch"); + } + + function test_blowUsds() public { + // send only usds to DssBlow2 + uint256 usdsAmount = 5 ether; + deal(usds, address(dssBlow2), usdsAmount); + // store balances before blow() + uint256 vowDaiBalance = dss.vat.dai(vow); + uint256 blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); + uint256 blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); + assertEq(blowUsdsBalance, usdsAmount); + // event emission + vm.expectEmit(true, false, false, true); + emit Blow(usds, usdsAmount); + // call blow() + dssBlow2.blow(); + // check balances after blow() + blowDaiBalance = dss.dai.balanceOf(address(dssBlow2)); + blowUsdsBalance = ERC20Like(usds).balanceOf(address(dssBlow2)); + assertEq(blowDaiBalance, 0); + assertEq(blowUsdsBalance, 0); + // the vat dai balance is in rad so we multiply with ray + assertEq(dss.vat.dai(vow), vowDaiBalance + usdsAmount * RAY, "blowUsds: vow balance mismatch"); } } From eba1cf95c6eb39fc5ea4d970a4c11d42cbc529fd Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Mon, 3 Feb 2025 22:02:52 +0200 Subject: [PATCH 10/23] chore: fix deployment --- foundry.toml | 1 + script/DssBlow2Deploy.s.sol | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/foundry.toml b/foundry.toml index a5e1842..614e8f4 100644 --- a/foundry.toml +++ b/foundry.toml @@ -5,6 +5,7 @@ script = 'script' libs = ["lib"] solc = '0.8.26' optimizer = false +via_ir = true fs_permissions = [ { access = "read", path = "./out/" }, diff --git a/script/DssBlow2Deploy.s.sol b/script/DssBlow2Deploy.s.sol index 46b2e15..7d1e424 100644 --- a/script/DssBlow2Deploy.s.sol +++ b/script/DssBlow2Deploy.s.sol @@ -27,7 +27,6 @@ contract DssBlow2DeployScript is Script { using ScriptTools for string; string constant NAME = "dss-blow-2-deploy"; - string config; address constant CHAINLOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F; DssInstance dss = MCD.loadFromChainlog(CHAINLOG); @@ -35,7 +34,6 @@ contract DssBlow2DeployScript is Script { DssBlow2Instance inst; function run() external { - config = ScriptTools.loadConfig(); vm.startBroadcast(); From 66c5934e361e11957a6fbf4d97c27c42a4dc4fd4 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Mon, 3 Feb 2025 22:30:20 +0200 Subject: [PATCH 11/23] chore: run formatter --- script/DssBlow2Deploy.s.sol | 8 +------- src/DssBlow2.sol | 4 ++-- src/deployment/DssBlow2Deploy.sol | 8 ++------ src/deployment/DssBlow2Instance.sol | 1 - 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/script/DssBlow2Deploy.s.sol b/script/DssBlow2Deploy.s.sol index 7d1e424..219c603 100644 --- a/script/DssBlow2Deploy.s.sol +++ b/script/DssBlow2Deploy.s.sol @@ -34,15 +34,10 @@ contract DssBlow2DeployScript is Script { DssBlow2Instance inst; function run() external { - vm.startBroadcast(); inst = DssBlow2Deploy.deploy( - DssBlow2DeployParams({ - daiJoin: address(dss.daiJoin), - usdsJoin: usdsJoin, - vow: address(dss.vow) - }) + DssBlow2DeployParams({daiJoin: address(dss.daiJoin), usdsJoin: usdsJoin, vow: address(dss.vow)}) ); vm.stopBroadcast(); @@ -53,4 +48,3 @@ contract DssBlow2DeployScript is Script { ScriptTools.exportContract(NAME, "vow", address(dss.vow)); } } - diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index ba5feb7..3808098 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -48,8 +48,8 @@ contract DssBlow2 { function blow() public { uint256 daiBalance = dai.balanceOf(address(this)); if (daiBalance > 0) { - daiJoin.join(vow, daiBalance); - emit Blow(address(dai), daiBalance); + daiJoin.join(vow, daiBalance); + emit Blow(address(dai), daiBalance); } uint256 usdsBalance = usds.balanceOf(address(this)); if (usdsBalance > 0) { diff --git a/src/deployment/DssBlow2Deploy.sol b/src/deployment/DssBlow2Deploy.sol index 1a3c393..09591bf 100644 --- a/src/deployment/DssBlow2Deploy.sol +++ b/src/deployment/DssBlow2Deploy.sol @@ -26,10 +26,6 @@ struct DssBlow2DeployParams { library DssBlow2Deploy { function deploy(DssBlow2DeployParams memory p) internal returns (DssBlow2Instance memory r) { - r.blow = address(new DssBlow2({ - daiJoin_: p.daiJoin, - usdsJoin_: p.usdsJoin, - vow_: p.vow - })); + r.blow = address(new DssBlow2({daiJoin_: p.daiJoin, usdsJoin_: p.usdsJoin, vow_: p.vow})); } -} \ No newline at end of file +} diff --git a/src/deployment/DssBlow2Instance.sol b/src/deployment/DssBlow2Instance.sol index 4987f0f..298c62d 100644 --- a/src/deployment/DssBlow2Instance.sol +++ b/src/deployment/DssBlow2Instance.sol @@ -18,4 +18,3 @@ pragma solidity 0.8.26; struct DssBlow2Instance { address blow; } - From a4ca54e36071671421c574515593cb6c8fd31d67 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Tue, 4 Feb 2025 21:54:55 +0200 Subject: [PATCH 12/23] chore: remove ir flag --- foundry.toml | 1 - src/DssBlow2.t.sol | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/foundry.toml b/foundry.toml index 614e8f4..a5e1842 100644 --- a/foundry.toml +++ b/foundry.toml @@ -5,7 +5,6 @@ script = 'script' libs = ["lib"] solc = '0.8.26' optimizer = false -via_ir = true fs_permissions = [ { access = "read", path = "./out/" }, diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index a2a12f4..6d1d42b 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -21,8 +21,8 @@ import "./DssBlow2.sol"; contract DssBlow2Test is DssTest { address constant CHAINLOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F; - DssInstance public dss; - DssBlow2 public dssBlow2; + DssInstance dss; + DssBlow2 dssBlow2; address usds; address usdsJoin; From f2aa96a541090aef6d8583ad63ab707d8e753934 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 5 Feb 2025 00:38:25 +0200 Subject: [PATCH 13/23] chore: remove ir flag from CI --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 30ec9d2..694446b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,10 +38,10 @@ jobs: - name: Run Forge build run: | - forge build --sizes --via-ir + forge build --sizes id: build - name: Run Forge tests run: | - forge test -vvv --via-ir + forge test -vvv id: test From f12b0ec94f10f54ac63fc0c251390604f894ecc7 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 5 Feb 2025 11:23:16 +0200 Subject: [PATCH 14/23] chore: downgrade solc --- foundry.toml | 2 +- script/DssBlow2Deploy.s.sol | 2 +- src/DssBlow2.sol | 2 +- src/DssBlow2.t.sol | 2 +- src/deployment/DssBlow2Deploy.sol | 2 +- src/deployment/DssBlow2Instance.sol | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/foundry.toml b/foundry.toml index a5e1842..1cf3402 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,7 +3,7 @@ src = "src" out = "out" script = 'script' libs = ["lib"] -solc = '0.8.26' +solc = '0.8.24' optimizer = false fs_permissions = [ diff --git a/script/DssBlow2Deploy.s.sol b/script/DssBlow2Deploy.s.sol index 219c603..fa9a24c 100644 --- a/script/DssBlow2Deploy.s.sol +++ b/script/DssBlow2Deploy.s.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.26; +pragma solidity 0.8.24; import {Script} from "forge-std/Script.sol"; import {stdJson} from "forge-std/StdJson.sol"; diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 3808098..0369627 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.26; +pragma solidity 0.8.24; interface ERC20Like { function balanceOf(address) external returns (uint256); diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index 6d1d42b..619aef1 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.26; +pragma solidity 0.8.24; import "dss-test/DssTest.sol"; import "./DssBlow2.sol"; diff --git a/src/deployment/DssBlow2Deploy.sol b/src/deployment/DssBlow2Deploy.sol index 09591bf..b5e92dc 100644 --- a/src/deployment/DssBlow2Deploy.sol +++ b/src/deployment/DssBlow2Deploy.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.26; +pragma solidity 0.8.24; import {DssBlow2} from "src/DssBlow2.sol"; import {DssBlow2Instance} from "./DssBlow2Instance.sol"; diff --git a/src/deployment/DssBlow2Instance.sol b/src/deployment/DssBlow2Instance.sol index 298c62d..72fe100 100644 --- a/src/deployment/DssBlow2Instance.sol +++ b/src/deployment/DssBlow2Instance.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.26; +pragma solidity 0.8.24; struct DssBlow2Instance { address blow; From e7ccbf70483fd5e9ae3a3c7f74e75b66f55570ab Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 5 Feb 2025 20:40:21 +0200 Subject: [PATCH 15/23] chore: address reviewer's comments --- script/DssBlow2Deploy.s.sol | 4 ++-- src/DssBlow2.sol | 2 +- src/DssBlow2.t.sol | 2 +- src/deployment/DssBlow2Deploy.sol | 2 +- src/deployment/DssBlow2Instance.sol | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/script/DssBlow2Deploy.s.sol b/script/DssBlow2Deploy.s.sol index fa9a24c..f6d2075 100644 --- a/script/DssBlow2Deploy.s.sol +++ b/script/DssBlow2Deploy.s.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import {Script} from "forge-std/Script.sol"; import {stdJson} from "forge-std/StdJson.sol"; @@ -42,7 +42,7 @@ contract DssBlow2DeployScript is Script { vm.stopBroadcast(); - ScriptTools.exportContract(NAME, "dssBlow2Deploy", inst.blow); + ScriptTools.exportContract(NAME, "blow2", inst.blow); ScriptTools.exportContract(NAME, "daiJoin", address(dss.daiJoin)); ScriptTools.exportContract(NAME, "usdsJoin", usdsJoin); ScriptTools.exportContract(NAME, "vow", address(dss.vow)); diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 0369627..8ecb671 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.24; +pragma solidity ^0.8.24; interface ERC20Like { function balanceOf(address) external returns (uint256); diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index 619aef1..55f51d0 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import "dss-test/DssTest.sol"; import "./DssBlow2.sol"; diff --git a/src/deployment/DssBlow2Deploy.sol b/src/deployment/DssBlow2Deploy.sol index b5e92dc..5e52158 100644 --- a/src/deployment/DssBlow2Deploy.sol +++ b/src/deployment/DssBlow2Deploy.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.24; +pragma solidity ^0.8.24; import {DssBlow2} from "src/DssBlow2.sol"; import {DssBlow2Instance} from "./DssBlow2Instance.sol"; diff --git a/src/deployment/DssBlow2Instance.sol b/src/deployment/DssBlow2Instance.sol index 72fe100..cecfcb0 100644 --- a/src/deployment/DssBlow2Instance.sol +++ b/src/deployment/DssBlow2Instance.sol @@ -13,7 +13,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -pragma solidity 0.8.24; +pragma solidity ^0.8.24; struct DssBlow2Instance { address blow; From 051f140f4ed3f0f89c54a545050bad2241817702 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 5 Feb 2025 22:20:31 +0200 Subject: [PATCH 16/23] chore: fix interface --- src/DssBlow2.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 8ecb671..d18358c 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -22,7 +22,6 @@ interface ERC20Like { interface JoinLike { function dai() external view returns (address); - function usds() external view returns (address); function join(address, uint256) external; } @@ -39,7 +38,7 @@ contract DssBlow2 { daiJoin = JoinLike(daiJoin_); dai = ERC20Like(daiJoin.dai()); usdsJoin = JoinLike(usdsJoin_); - usds = ERC20Like(usdsJoin.usds()); + usds = ERC20Like(usdsJoin.dai()); vow = vow_; dai.approve(daiJoin_, type(uint256).max); usds.approve(usdsJoin_, type(uint256).max); From d113e362d885b6acfd45d803fd452bb5b42f6406 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 5 Feb 2025 22:39:35 +0200 Subject: [PATCH 17/23] chore: sparate interfaces for clarity --- src/DssBlow2.sol | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index d18358c..c59f370 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -20,25 +20,28 @@ interface ERC20Like { function approve(address usr, uint256 wad) external returns (bool); } -interface JoinLike { +interface DaiJoinLike { function dai() external view returns (address); function join(address, uint256) external; } +interface UsdsJoinLike is DaiJoinLike { + function usds() external view returns (address); +} contract DssBlow2 { address public immutable vow; ERC20Like public immutable dai; ERC20Like public immutable usds; - JoinLike public immutable daiJoin; - JoinLike public immutable usdsJoin; + DaiJoinLike public immutable daiJoin; + UsdsJoinLike public immutable usdsJoin; event Blow(address indexed token, uint256 amount); constructor(address daiJoin_, address usdsJoin_, address vow_) { - daiJoin = JoinLike(daiJoin_); + daiJoin = DaiJoinLike(daiJoin_); dai = ERC20Like(daiJoin.dai()); - usdsJoin = JoinLike(usdsJoin_); - usds = ERC20Like(usdsJoin.dai()); + usdsJoin = UsdsJoinLike(usdsJoin_); + usds = ERC20Like(usdsJoin.usds()); vow = vow_; dai.approve(daiJoin_, type(uint256).max); usds.approve(usdsJoin_, type(uint256).max); From ce3d3ee8354dd3551552bd866119fef1f856904b Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Wed, 5 Feb 2025 22:41:16 +0200 Subject: [PATCH 18/23] chore: run formatter --- src/DssBlow2.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index c59f370..7cdc1fe 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -24,6 +24,7 @@ interface DaiJoinLike { function dai() external view returns (address); function join(address, uint256) external; } + interface UsdsJoinLike is DaiJoinLike { function usds() external view returns (address); } From faaaa65fb113cb8335af8a015a131794f865d512 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Fri, 7 Feb 2025 15:58:27 +0200 Subject: [PATCH 19/23] chore: update copyright dates --- script/DssBlow2Deploy.s.sol | 2 +- src/DssBlow2.sol | 2 +- src/deployment/DssBlow2Deploy.sol | 2 +- src/deployment/DssBlow2Instance.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/script/DssBlow2Deploy.s.sol b/script/DssBlow2Deploy.s.sol index f6d2075..dfa6c23 100644 --- a/script/DssBlow2Deploy.s.sol +++ b/script/DssBlow2Deploy.s.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-FileCopyrightText: © 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 7cdc1fe..ff695d6 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-FileCopyrightText: © 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify diff --git a/src/deployment/DssBlow2Deploy.sol b/src/deployment/DssBlow2Deploy.sol index 5e52158..2186219 100644 --- a/src/deployment/DssBlow2Deploy.sol +++ b/src/deployment/DssBlow2Deploy.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-FileCopyrightText: © 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify diff --git a/src/deployment/DssBlow2Instance.sol b/src/deployment/DssBlow2Instance.sol index cecfcb0..704ff0e 100644 --- a/src/deployment/DssBlow2Instance.sol +++ b/src/deployment/DssBlow2Instance.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2023 Dai Foundation +// SPDX-FileCopyrightText: © 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify From f0d603b01da7ee707be9d07e1215a4adcdea277e Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Mon, 10 Feb 2025 11:48:40 +0200 Subject: [PATCH 20/23] chore: fix interface --- src/DssBlow2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index ff695d6..e461f66 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -16,7 +16,7 @@ pragma solidity ^0.8.24; interface ERC20Like { - function balanceOf(address) external returns (uint256); + function balanceOf(address) external view returns (uint256); function approve(address usr, uint256 wad) external returns (bool); } From 2616ab8ab9686b341bce4f3e0929b3bacbd62de5 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Mon, 10 Feb 2025 16:10:05 +0200 Subject: [PATCH 21/23] chore: remove @ from copyright --- script/DssBlow2Deploy.s.sol | 2 +- src/DssBlow2.sol | 2 +- src/DssBlow2.t.sol | 2 +- src/deployment/DssBlow2Deploy.sol | 2 +- src/deployment/DssBlow2Instance.sol | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/script/DssBlow2Deploy.s.sol b/script/DssBlow2Deploy.s.sol index dfa6c23..09cd043 100644 --- a/script/DssBlow2Deploy.s.sol +++ b/script/DssBlow2Deploy.s.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2025 Dai Foundation +// SPDX-FileCopyrightText: 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index e461f66..1f427f2 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2025 Dai Foundation +// SPDX-FileCopyrightText: 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify diff --git a/src/DssBlow2.t.sol b/src/DssBlow2.t.sol index 55f51d0..ed6c5fa 100644 --- a/src/DssBlow2.t.sol +++ b/src/DssBlow2.t.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2025 Dai Foundation +// SPDX-FileCopyrightText: 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify diff --git a/src/deployment/DssBlow2Deploy.sol b/src/deployment/DssBlow2Deploy.sol index 2186219..a71dc98 100644 --- a/src/deployment/DssBlow2Deploy.sol +++ b/src/deployment/DssBlow2Deploy.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2025 Dai Foundation +// SPDX-FileCopyrightText: 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify diff --git a/src/deployment/DssBlow2Instance.sol b/src/deployment/DssBlow2Instance.sol index 704ff0e..6447f7b 100644 --- a/src/deployment/DssBlow2Instance.sol +++ b/src/deployment/DssBlow2Instance.sol @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: © 2025 Dai Foundation +// SPDX-FileCopyrightText: 2025 Dai Foundation // SPDX-License-Identifier: AGPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify From 8cffeb812fd5c3e004dac6bc0391b2a33b499d2d Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Mon, 10 Feb 2025 19:19:14 +0200 Subject: [PATCH 22/23] chore: update README --- README.md | 74 ++++++++++++++++++------------------------- img/architecture.png | Bin 0 -> 151751 bytes 2 files changed, 30 insertions(+), 44 deletions(-) create mode 100644 img/architecture.png diff --git a/README.md b/README.md index 9265b45..cd72251 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,52 @@ -## Foundry +# dss-blow2 -**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** +## Description -Foundry consists of: +`dss-blow2` is a smart contract designed to facilitate the refunding of Dai or USDS to the Sky Protocol. -- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). -- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. -- **Chisel**: Fast, utilitarian, and verbose solidity REPL. +## Overview -## Documentation +There are a few actions that are harder than expected when interacting with the Sky Protocol. For instance, returning Dai/USDS to SkyDAO is a non-trivial operation for users who are not familiar with the protocol’s inner workings. -https://book.getfoundry.sh/ +From an accounting perspective, any returns made should be considered extra revenue. However, the protocol's revenue is not stored anywhere within the system. Instead, the closest representation is the **Surplus Buffer**, which can be roughly described as a _quasi_-instant snapshot of Sky's accumulated profits. More information on that can be found in [this article](https://hackmd.io/@infomorph/rJ7Wjcrai). -## Usage +Technically speaking, the Surplus Buffer is calculated as the internal balance of the [`Vow`](https://etherscan.io/address/0xa950524441892a31ebddf91d3ceefa04bf454466) (`vat.dai(vow)`) minus the total bad debt in the system (`vat.vice`): -### Build - -```shell -$ forge build +``` +surplus_buffer = vat.dai(vow) - vat.vice ``` -### Test -```shell -$ forge test -``` +Thus, the "correct" way to return Dai/USDS to the protocol is by incorporating them into the Surplus Buffer. The downside is that there is no associated address for the Surplus Buffer—it is merely a data entry in the `Vat`. -### Format +Instead of making a standard ERC-20 transfer, anyone wishing to return tokens to the protocol must: -```shell -$ forge fmt -``` +1. Call `dai.approve(daiJoin, amt)` or `usds.approve(usdsJoin, amt)` to allow [`daiJoin`](https://etherscan.io/address/0x9759a6ac90977b93b58547b4a71c78317f391a28) or [`usdsJoin`](https://etherscan.io/address/0x3c0f895007ca717aa01c8693e59df1e8c3777feb) to spend Dai/USDS. +2. Call `daiJoin.join(vow, amt)` or `usdsJoin.join(vow, amt)` to burn the ERC-20 Dai/USDS and incorporate it into the Surplus Buffer. -### Gas Snapshots +Both operations can be challenging (if not impossible) due to wallet limitations and tend to be error-prone. -```shell -$ forge snapshot -``` +The original [`DssBlow` contract](https://etherscan.io/address/0x0048fc4357db3c0f45adea433a07a20769ddb0cf#code) was created as a standard ERC-20 "bridge" between users and the Sky Protocol. It allows any user to simply transfer Dai to it, and a permissionless function named `blow()` then incorporates the outstanding Dai balance of the contract into the Surplus Buffer. -### Anvil +While `DssBlow` works well for Dai, the same approach would not work for USDS, since the Sky Ecosystem has adopted the new native stablecoin. `DssBlow2` is capable of handling both Dai and USDS simultaneously: -```shell -$ anvil -``` +- **Unified Address:** Users can send Dai or USDS to the **same address**—the `DssBlow2` instance. +- **Single Entry Point:** Anyone can call `blow()`, which will add both the outstanding Dai and USDS balances to the Surplus Buffer at the same time. +- **Function Override Consideration:** The `blow(uint256 wad)` override does not make much sense in this context. It should either be removed or modified to `blow(address nat, uint256 wad)` to allow users to specify which native token they wish to use in the transaction. -### Deploy +## Solution Design -```shell -$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key -``` +The primary design principle is simplicity. `DssBlow2` will function similarly to `DssBlow`, with the `blow()` function handling the return of both `DAI` and `USDS` to the protocol. Although this function is permissionless, it is expected to be invoked periodically—either by a keeper or directly by a user. As mentioned earlier, there is no need for an override function. Each time `blow()` is called, the contract’s Dai and USDS balances will be checked to determine whether a transfer is necessary. The logic and frequency of invocation will be managed at the keeper level, especially if a cron job is implemented. -### Cast +We decided to pass the necessary addresses (i.e., `daiJoin`, `usdsJoin`, and `vow`) as constructor arguments. The `dai` and `usds` ERC-20 contracts are obtained via their corresponding joins. In the rare event that one of the relevant addresses changes, the contract would need to be redeployed. -```shell -$ cast -``` +![Architecture Diagram](img/architecture.png) -### Help +## Installation -```shell -$ forge --help -$ anvil --help -$ cast --help -``` +To install the project, clone the repository and set up the necessary dependencies: + +```bash +git clone https://github.com/dewiz-xyz/dss-blow2.git +cd dss-blow2 +forge install diff --git a/img/architecture.png b/img/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..413a121430f7cfe33fd2dcab9a798526449dd3a2 GIT binary patch literal 151751 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 literal 0 HcmV?d00001 From 81f1899c7d7cc3c7c60214bb1ec99f2f0020dec7 Mon Sep 17 00:00:00 2001 From: 0xp3th1um <0xp3th1um@dewiz.xyz> Date: Mon, 10 Feb 2025 19:59:50 +0200 Subject: [PATCH 23/23] chore: add natspec comments --- src/DssBlow2.sol | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/DssBlow2.sol b/src/DssBlow2.sol index 1f427f2..7ed376b 100644 --- a/src/DssBlow2.sol +++ b/src/DssBlow2.sol @@ -13,47 +13,73 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . + pragma solidity ^0.8.24; interface ERC20Like { - function balanceOf(address) external view returns (uint256); + function balanceOf(address account) external view returns (uint256); function approve(address usr, uint256 wad) external returns (bool); } interface DaiJoinLike { function dai() external view returns (address); - function join(address, uint256) external; + function join(address usr, uint256 wad) external; } interface UsdsJoinLike is DaiJoinLike { function usds() external view returns (address); } +/// @title DssBlow2 +/// @notice This contract acts as a bridge to incorporate any available Dai or USDS +/// balances into the protocol's Surplus Buffer by invoking the appropriate join adapters. +/// @dev The contract automatically approves the maximum token amount for both join adapters during construction. contract DssBlow2 { + /// @notice The address of the Vow contract that receives tokens. address public immutable vow; + + /// @notice The ERC20 token representing Dai. ERC20Like public immutable dai; + + /// @notice The ERC20 token representing USDS. ERC20Like public immutable usds; + + /// @notice The adapter for joining Dai into the protocol. DaiJoinLike public immutable daiJoin; + + /// @notice The adapter for joining USDS into the protocol. UsdsJoinLike public immutable usdsJoin; + /// @notice Emitted when tokens are transferred into the protocol. + /// @param token The address of the token (Dai or USDS) that was transferred. + /// @param amount The amount of tokens that was transferred. event Blow(address indexed token, uint256 amount); + /// @notice Initializes the DssBlow2 contract. + /// @param daiJoin_ The address of the DaiJoin contract. + /// @param usdsJoin_ The address of the UsdsJoin contract. + /// @param vow_ The address of the Vow contract. constructor(address daiJoin_, address usdsJoin_, address vow_) { daiJoin = DaiJoinLike(daiJoin_); dai = ERC20Like(daiJoin.dai()); usdsJoin = UsdsJoinLike(usdsJoin_); usds = ERC20Like(usdsJoin.usds()); vow = vow_; + + // Approve the maximum uint256 amount for both join adapters. dai.approve(daiJoin_, type(uint256).max); usds.approve(usdsJoin_, type(uint256).max); } + /// @notice Transfers any available Dai and USDS balances from this contract to the protocol's Surplus Buffer. + /// @dev For each token, if the balance is greater than zero, the respective join adapter's join function is called. function blow() public { uint256 daiBalance = dai.balanceOf(address(this)); if (daiBalance > 0) { daiJoin.join(vow, daiBalance); emit Blow(address(dai), daiBalance); } + uint256 usdsBalance = usds.balanceOf(address(this)); if (usdsBalance > 0) { usdsJoin.join(vow, usdsBalance);