Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
ee6eb57
feat: pull in from PoC and minify and adjust for easy integratoin
Sep 11, 2025
0172171
remove unnecessary console logs
Sep 11, 2025
3e72e99
fix: some security lockdowns
Sep 11, 2025
453c007
it builds
Sep 11, 2025
0f635c7
fix: new strategy
Sep 11, 2025
5ebd847
compiles
kaze-cow Sep 29, 2025
b168d45
fix tests
kaze-cow Sep 29, 2025
e56eac3
forge fmt
kaze-cow Sep 29, 2025
2e7f051
enable optimizer
kaze-cow Sep 29, 2025
de12e99
setup secrets and fix build failure
kaze-cow Sep 29, 2025
c3dc655
remove sizes for now
kaze-cow Sep 29, 2025
217af04
Revert "forge fmt"
kaze-cow Sep 29, 2025
4f6c81e
use a settle state instead of original sender
kaze-cow Sep 29, 2025
2c9704a
feat: pull in required vendor dependencies
kaze-cow Sep 30, 2025
8982db0
feat: pull in from PoC and minify and adjust for easy integratoin
kaze-cow Sep 30, 2025
e9afd40
remove unnecessary console logs
Sep 11, 2025
35cf23b
fix: some security lockdowns
Sep 11, 2025
938b8e9
remove cannon things
kaze-cow Sep 29, 2025
5ca3ae5
remove unnecessary file
kaze-cow Sep 29, 2025
ec9d67d
update all pragmas
kaze-cow Sep 29, 2025
9b7a904
undo undos
kaze-cow Sep 30, 2025
164efff
fix license
kaze-cow Sep 30, 2025
2d7989b
Merge pull request #3 from cowprotocol/feat/new-wrapper
kaze-cow Sep 30, 2025
413d162
Merge branch 'feat/initial' into feat/security
kaze-cow Sep 30, 2025
3ff8dc0
Merge pull request #2 from cowprotocol/feat/security
kaze-cow Sep 30, 2025
ca207e7
cleanup SwapVerifier
kaze-cow Oct 1, 2025
c3823ba
remove unneeded IGPv2Settlement interface
kaze-cow Oct 7, 2025
30fd178
remove unneeded commented code lines
kaze-cow Oct 7, 2025
b6e2318
Merge remote-tracking branch 'origin/master' into feat/initial
kaze-cow Oct 7, 2025
e2151f3
add foundry lock
kaze-cow Oct 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ on:

env:
FOUNDRY_PROFILE: ci
FORK_RPC_URL: ${{ secrets.RPC_URL_1 }}

jobs:
check:
Expand All @@ -31,7 +32,7 @@ jobs:

- name: Run Forge build
run: |
forge build --sizes
forge build
id: build

- name: Run Forge tests
Expand Down
1 change: 1 addition & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
[submodule "lib/cow"]
path = lib/cow
url = https://github.com/cowprotocol/contracts
branch = feat/wrapper
[submodule "lib/euler-vault-kit"]
path = lib/euler-vault-kit
url = https://github.com/euler-xyz/euler-vault-kit
Expand Down
13 changes: 8 additions & 5 deletions foundry.lock
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
{
"lib/cow": {
"rev": "39d7f4d68e37d14adeaf3c0caca30ea5c1a2fad9"
"branch": {
"name": "feat/wrapper",
"rev": "1e8127f476f8fef7758cf25033a0010d325dba8d"
}
},
"lib/euler-vault-kit": {
"rev": "5b98b42048ba11ae82fb62dfec06d1010c8e41e6"
},
"lib/evc": {
"rev": "34bb788288a0eb0fbba06bc370cb8ca3dd42614e"
},
"lib/forge-std": {
"tag": {
"name": "v1.10.0",
"rev": "8bbcf6e3f8f62f419e5429a0bd89331c85c37824"
}
"rev": "0768d9c08c085c79bb31d88683a78770764fec49"
}
}
1 change: 1 addition & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
src = "src"
out = "out"
libs = ["lib"]
optimize = true

# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
19 changes: 0 additions & 19 deletions script/Counter.s.sol

This file was deleted.

14 changes: 0 additions & 14 deletions src/Counter.sol

This file was deleted.

108 changes: 108 additions & 0 deletions src/CowEvcWrapper.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8;

import {IEVC} from "evc/EthereumVaultConnector.sol";
import {IGPv2Authentication} from "./vendor/interfaces/IGPv2Authentication.sol";

import {GPv2Signing, IERC20, GPv2Trade} from "cow/mixins/GPv2Signing.sol";
import {GPv2Wrapper,GPv2Interaction} from "cow/GPv2Wrapper.sol";

/// @title CowEvcWrapper
/// @notice A wrapper around the EVC that allows for settlement operations
contract CowEvcWrapper is GPv2Wrapper, GPv2Signing {
IEVC public immutable EVC;

/// @notice 0 = not executing, 1 = wrappedSettle() called and not yet internal settle, 2 = evcInternalSettle() called
uint256 public transient settleState;

error Unauthorized(address msgSender);
error NoReentrancy();
error MultiplePossibleReceivers(
address resolvedVault, address resolvedSender, address secondVault, address secondSender
);

error NotEVCSettlement();

constructor(address _evc, address payable _settlement) GPv2Wrapper(_settlement) {
EVC = IEVC(_evc);
}

struct ResolvedValues {
address vault;
address sender;
uint256 minAmount;
}

/// @notice Implementation of GPv2Wrapper._wrap - executes EVC operations around settlement
/// @param tokens Tokens involved in settlement
/// @param clearingPrices Clearing prices for settlement
/// @param trades Trade data for settlement
/// @param interactions Interaction data for settlement
/// @param wrapperData Additional data for the wrapper (unused in this implementation)
function _wrap(
IERC20[] calldata tokens,
uint256[] calldata clearingPrices,
GPv2Trade.Data[] calldata trades,
GPv2Interaction.Data[][3] calldata interactions,
bytes calldata wrapperData
) internal override {
// prevent reentrancy: there is no reason why we would want to allow it here
if (settleState != 0) {
revert NoReentrancy();
}
settleState = 1;

// Decode wrapperData into pre and post settlement actions
(IEVC.BatchItem[] memory preSettlementItems, IEVC.BatchItem[] memory postSettlementItems) =
abi.decode(wrapperData, (IEVC.BatchItem[], IEVC.BatchItem[]));
IEVC.BatchItem[] memory items = new IEVC.BatchItem[](preSettlementItems.length + postSettlementItems.length + 1);

// Copy pre-settlement items
for (uint256 i = 0; i < preSettlementItems.length; i++) {
items[i] = preSettlementItems[i];
}

// Add settlement call to wrapper - use _internalSettle from GPv2Wrapper
items[preSettlementItems.length] = IEVC.BatchItem({
onBehalfOfAccount: msg.sender,
targetContract: address(this),
value: 0,
data: abi.encodeCall(this.evcInternalSettle, (tokens, clearingPrices, trades, interactions))
});

// Copy post-settlement items
for (uint256 i = 0; i < postSettlementItems.length; i++) {
items[preSettlementItems.length + 1 + i] = postSettlementItems[i];
}

// Execute all items in a single batch
EVC.batch(items);
settleState = 0;
}

/// @notice Internal settlement function called by EVC
/// @param tokens Tokens involved in settlement
/// @param clearingPrices Clearing prices for settlement
/// @param trades Trade data for settlement
/// @param interactions Interaction data for settlement
function evcInternalSettle(
IERC20[] calldata tokens,
uint256[] calldata clearingPrices,
GPv2Trade.Data[] calldata trades,
GPv2Interaction.Data[][3] calldata interactions
) external payable {
if (msg.sender != address(EVC)) {
revert Unauthorized(msg.sender);
}

if (settleState != 1) {
// origSender will be address(0) here which indiates that internal settle was called when it shouldn't be (outside of wrappedSettle call)
revert Unauthorized(address(0));
}

settleState = 2;

// Use GPv2Wrapper's _internalSettle to call the settlement contract
_internalSettle(tokens, clearingPrices, trades, interactions);
}
}
24 changes: 0 additions & 24 deletions test/Counter.t.sol

This file was deleted.

Loading
Loading