Skip to content

Commit

Permalink
feat: permission for Aggregate Router
Browse files Browse the repository at this point in the history
  • Loading branch information
thaixuandang committed Aug 1, 2024
1 parent b1dca6d commit f568dd5
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/aggregate-router/AggregateRouter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ contract AggregateRouter is IAggregateRouter, Dispatcher {

constructor(RouterParameters memory params)
KatanaImmutables(
KatanaParameters(params.v2Factory, params.v3Factory, params.pairInitCodeHash, params.poolInitCodeHash)
KatanaParameters(
params.governance, params.v2Factory, params.v3Factory, params.pairInitCodeHash, params.poolInitCodeHash
)
)
PaymentsImmutables(PaymentsParameters(params.permit2, params.weth9))
{ }
Expand Down
1 change: 1 addition & 0 deletions src/aggregate-router/base/RouterImmutables.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ pragma solidity ^0.8.17;
struct RouterParameters {
address permit2;
address weth9;
address governance;
address v2Factory;
address v3Factory;
bytes32 pairInitCodeHash;
Expand Down
5 changes: 5 additions & 0 deletions src/aggregate-router/modules/katana/KatanaImmutables.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@
pragma solidity ^0.8.17;

struct KatanaParameters {
address governance;
address v2Factory;
address v3Factory;
bytes32 pairInitCodeHash;
bytes32 poolInitCodeHash;
}

contract KatanaImmutables {
/// @dev The address of KatanaGovernance
address internal immutable KATANA_GOVERNANCE;

/// @dev The address of KatanaV2Factory
address internal immutable KATANA_V2_FACTORY;

Expand All @@ -22,6 +26,7 @@ contract KatanaImmutables {
bytes32 internal immutable KATANA_V3_POOL_INIT_CODE_HASH;

constructor(KatanaParameters memory params) {
KATANA_GOVERNANCE = params.governance;
KATANA_V2_FACTORY = params.v2Factory;
KATANA_V2_PAIR_INIT_CODE_HASH = params.pairInitCodeHash;
KATANA_V3_FACTORY = params.v3Factory;
Expand Down
4 changes: 4 additions & 0 deletions src/aggregate-router/modules/katana/v2/V2SwapRouter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
pragma solidity ^0.8.17;

import { IKatanaV2Pair } from "@katana/v3-contracts/periphery/interfaces/IKatanaV2Pair.sol";
import { IKatanaGovernance } from "@katana/v3-contracts/external/interfaces/IKatanaGovernance.sol";
import { KatanaV2Library } from "./KatanaV2Library.sol";
import { KatanaImmutables } from "../KatanaImmutables.sol";
import { Payments } from "../../Payments.sol";
Expand All @@ -14,8 +15,11 @@ abstract contract V2SwapRouter is KatanaImmutables, Permit2Payments {
error V2TooLittleReceived();
error V2TooMuchRequested();
error V2InvalidPath();
error V2UnauthorizedPath();

function _v2Swap(address[] calldata path, address recipient, address pair) private {
if (!IKatanaGovernance(KATANA_GOVERNANCE).isAuthorized(path, msg.sender)) revert V2UnauthorizedPath();

unchecked {
if (path.length < 2) revert V2InvalidPath();

Expand Down
7 changes: 7 additions & 0 deletions src/aggregate-router/modules/katana/v3/V3SwapRouter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ pragma solidity ^0.8.17;

import { V3Path } from "./V3Path.sol";
import { BytesLib } from "./BytesLib.sol";
import { IKatanaGovernance } from "@katana/v3-contracts/external/interfaces/IKatanaGovernance.sol";
import { SafeCast } from "@katana/v3-contracts/core/libraries/SafeCast.sol";
import { IKatanaV3Pool } from "@katana/v3-contracts/core/interfaces/IKatanaV3Pool.sol";
import { IKatanaV3SwapCallback } from "@katana/v3-contracts/core/interfaces/callback/IKatanaV3SwapCallback.sol";
Expand All @@ -23,6 +24,7 @@ abstract contract V3SwapRouter is KatanaImmutables, Permit2Payments, IKatanaV3Sw
error V3TooMuchRequested();
error V3InvalidAmountOut();
error V3InvalidCaller();
error V3UnauthorizedSwap();

/// @dev Used as the placeholder value for maxAmountIn, because the computed amount in for an exact output swap
/// can never actually be this value
Expand Down Expand Up @@ -145,6 +147,11 @@ abstract contract V3SwapRouter is KatanaImmutables, Permit2Payments, IKatanaV3Sw
returns (int256 amount0Delta, int256 amount1Delta, bool zeroForOne)
{
(address tokenIn, uint24 fee, address tokenOut) = path.decodeFirstPool();

address[] memory tokens = new address[](2);
tokens[0] = tokenIn;
tokens[1] = tokenOut;
if (!IKatanaGovernance(KATANA_GOVERNANCE).isAuthorized(tokens, msg.sender)) revert V3UnauthorizedSwap();

zeroForOne = isExactIn ? tokenIn < tokenOut : tokenOut < tokenIn;

Expand Down

0 comments on commit f568dd5

Please sign in to comment.