Skip to content

Commit

Permalink
Merge pull request #43 from Uniswap/fee-collector-deployer
Browse files Browse the repository at this point in the history
add deployer for fee collector
  • Loading branch information
gretzke authored Jan 31, 2025
2 parents 02472c6 + e0d5563 commit 9a3aae0
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 78 deletions.
2 changes: 1 addition & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ lib/
cache/
docs/autogenerated
deployments/
script/deploy/
script/deploy/tasks/*/*.json
broadcast/
57 changes: 41 additions & 16 deletions script/deploy/Deploy-all.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import {IPermit2, Permit2Deployer} from '../../src/briefcase/deployers/permit2/P
import {SwapRouter02Deployer} from '../../src/briefcase/deployers/swap-router-contracts/SwapRouter02Deployer.sol';

import {UniversalRouterDeployer} from '../../src/briefcase/deployers/universal-router/UniversalRouterDeployer.sol';

import {FeeCollectorDeployer} from '../../src/briefcase/deployers/util-contracts/FeeCollectorDeployer.sol';
import {FeeOnTransferDetectorDeployer} from
'../../src/briefcase/deployers/util-contracts/FeeOnTransferDetectorDeployer.sol';
import {UniswapV2FactoryDeployer} from '../../src/briefcase/deployers/v2-core/UniswapV2FactoryDeployer.sol';
Expand Down Expand Up @@ -53,6 +55,7 @@ contract Deploy is Script {
address nonfungiblePositionManager;
address poolManager;
address positionManager;
address universalRouter;

function run() public {
config = vm.readFile(string.concat('./script/deploy/tasks/', vm.toString(block.chainid), '/task-pending.json'));
Expand All @@ -71,10 +74,10 @@ contract Deploy is Script {

deploySwapRouters();

deployUtilsContracts();

deployUniversalRouter();

deployUtilsContracts();

vm.stopBroadcast();

if (vm.isContext(VmSafe.ForgeContext.ScriptBroadcast) && config.readBool('.rename')) {
Expand Down Expand Up @@ -338,11 +341,31 @@ contract Deploy is Script {
function deployUtilsContracts() private {
if (!config.readBool('.protocols.util-contracts.deploy')) return;

if (v2Factory == address(0)) {
v2Factory = config.readAddress('.protocols.v2.contracts.UniswapV2Factory.address');
bool deployFeeCollector = config.readBool('.protocols.util-contracts.contracts.FeeCollector.deploy');
bool deployFeeOnTransferDetector =
config.readBool('.protocols.util-contracts.contracts.FeeOnTransferDetector.deploy');

if (deployFeeOnTransferDetector) {
if (v2Factory == address(0)) {
v2Factory = config.readAddress('.protocols.v2.contracts.UniswapV2Factory.address');
}
console.log('deploying Fee On Transfer Detector');
FeeOnTransferDetectorDeployer.deploy(v2Factory);
}

if (deployFeeCollector) {
address owner = config.readAddress('.protocols.util-contracts.contracts.FeeCollector.params.owner.value');
address feeToken =
config.readAddress('.protocols.util-contracts.contracts.FeeCollector.params.feeToken.value');
if (universalRouter == address(0)) {
universalRouter = config.readAddress('.protocols.universal-router.contracts.UniversalRouter.address');
}
if (permit2 == address(0)) {
permit2 = config.readAddress('.protocols.permit2.contracts.Permit2.address');
}
console.log('deploying Fee Collector');
FeeCollectorDeployer.deploy(owner, universalRouter, permit2, feeToken);
}
console.log('deploying Fee On Transfer Detector');
FeeOnTransferDetectorDeployer.deploy(v2Factory);
}

function deployUniversalRouter() private {
Expand Down Expand Up @@ -372,16 +395,18 @@ contract Deploy is Script {
positionManager = config.readAddress('.protocols.v4.contracts.PositionManager.address');
}
console.log('deploying Universal Router');
UniversalRouterDeployer.deploy(
permit2,
weth(),
v2Factory,
v3Factory,
v2PairInitCodeHash,
v3PoolInitCodeHash,
poolManager,
nonfungiblePositionManager,
positionManager
universalRouter = address(
UniversalRouterDeployer.deploy(
permit2,
weth(),
v2Factory,
v3Factory,
v2PairInitCodeHash,
v3PoolInitCodeHash,
poolManager,
nonfungiblePositionManager,
positionManager
)
);
}

Expand Down
116 changes: 55 additions & 61 deletions script/deploy/tasks/task_template.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
"address": null,
"lookup": {
"latest": "Permit2",
"history": [
"UniversalRouter.input.constructor.params.permit2"
]
"history": ["UniversalRouter.input.constructor.params.permit2"]
},
"params": {
"salt": {
Expand All @@ -31,9 +29,7 @@
"address": null,
"lookup": {
"latest": "UniswapV2Factory",
"history": [
"UniversalRouter.input.constructor.params.v2Factory"
]
"history": ["UniversalRouter.input.constructor.params.v2Factory"]
},
"params": {
"feeToSetter": {
Expand All @@ -50,9 +46,7 @@
"pointer": "protocols.v2.contracts.UniswapV2Factory"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
}
}
},
Expand All @@ -65,9 +59,7 @@
"address": null,
"lookup": {
"latest": "UniswapV3Factory",
"history": [
"UniversalRouter.input.constructor.params.v3Factory"
]
"history": ["UniversalRouter.input.constructor.params.v3Factory"]
},
"params": {
"initialOwner": {
Expand All @@ -87,9 +79,7 @@
"pointer": "protocols.v3.contracts.UniswapV3Factory"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
},
"TickLens": {
"deploy": false
Expand All @@ -110,9 +100,7 @@
"type": "address"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
},
"NonfungiblePositionManager": {
"deploy": false,
Expand All @@ -130,9 +118,7 @@
"pointer": "protocols.v3.contracts.NonfungibleTokenPositionDescriptor"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
},
"V3Migrator": {
"deploy": false,
Expand All @@ -146,9 +132,7 @@
"pointer": "protocols.v3.contracts.NonfungiblePositionManager"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
},
"SwapRouter": {
"deploy": false,
Expand All @@ -159,9 +143,7 @@
"pointer": "protocols.v3.contracts.UniswapV3Factory"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
}
}
},
Expand Down Expand Up @@ -201,9 +183,7 @@
"type": "address"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
},
"PositionManager": {
"deploy": false,
Expand All @@ -229,9 +209,7 @@
"pointer": "protocols.v4.contracts.PositionDescriptor"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"]
},
"V4Quoter": {
"deploy": false,
Expand Down Expand Up @@ -290,25 +268,7 @@
"pointer": "protocols.v3.contracts.NonfungiblePositionManager"
}
},
"dependencies": [
"weth"
]
}
}
},
"util-contracts": {
"name": "Utils",
"deploy": false,
"contracts": {
"FeeOnTransferDetector": {
"deploy": false,
"address": null,
"params": {
"factoryV2": {
"name": "Uniswap v2 factory address",
"pointer": "protocols.v2.contracts.UniswapV2Factory"
}
}
"dependencies": ["weth"]
}
}
},
Expand Down Expand Up @@ -336,19 +296,15 @@
"type": "bytes32",
"value": "0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f",
"lookup": {
"history": [
"UniversalRouter.input.constructor.params.pairInitCodeHash"
]
"history": ["UniversalRouter.input.constructor.params.pairInitCodeHash"]
}
},
"v3PoolInitCodeHash": {
"name": "Uniswap v3 pool init code hash",
"type": "bytes32",
"value": "0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54",
"lookup": {
"history": [
"UniversalRouter.input.constructor.params.poolInitCodeHash"
]
"history": ["UniversalRouter.input.constructor.params.poolInitCodeHash"]
}
},
"v4PoolManager": {
Expand All @@ -364,9 +320,47 @@
"pointer": "protocols.v4.contracts.PositionManager"
}
},
"dependencies": [
"weth"
]
"dependencies": ["weth"],
"lookup": {
"latest": "UniversalRouter"
}
}
}
},
"util-contracts": {
"name": "Utils",
"deploy": false,
"contracts": {
"FeeOnTransferDetector": {
"deploy": false,
"address": null,
"params": {
"factoryV2": {
"name": "Uniswap v2 factory address",
"pointer": "protocols.v2.contracts.UniswapV2Factory"
}
}
},
"FeeCollector": {
"deploy": false,
"address": null,
"params": {
"owner": {
"type": "address"
},
"universalRouter": {
"name": "Universal Router address",
"pointer": "protocols.universal-router.contracts.UniversalRouter"
},
"permit2": {
"name": "Permit 2 address",
"pointer": "protocols.permit2.contracts.Permit2"
},
"feeToken": {
"name": "Fee token address (usually USDC)",
"type": "address"
}
}
}
}
}
Expand Down
29 changes: 29 additions & 0 deletions src/briefcase/deployers/util-contracts/FeeCollectorDeployer.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// SPDX-License-Identifier: MIT
pragma solidity >= 0.7.0;

import {IFeeCollector} from '../../protocols/util-contracts/interfaces/IFeeCollector.sol';

library FeeCollectorDeployer {
function deploy(address owner, address universalRouter, address permit2, address feeToken)
internal
returns (IFeeCollector feeCollector)
{
bytes memory args = abi.encode(owner, universalRouter, permit2, feeToken);
bytes memory initcode_ = abi.encodePacked(initcode(), args);

assembly {
feeCollector := create(0, add(initcode_, 32), mload(initcode_))
}
}

/**
* @dev autogenerated - run `./script/util/create_briefcase.sh` to generate current initcode
*
* @notice This initcode is generated from the following contract:
* - Source Contract: src/pkgs/util-contracts/src/FeeCollector.sol
*/
function initcode() internal pure returns (bytes memory) {
return
hex'60c060405234801561000f575f80fd5b50604051610d11380380610d1183398101604081905261002e916100bc565b5f80546001600160a01b0319166001600160a01b03861690811782556040518692907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b0394851617905582166080521660a0525061010d565b80516001600160a01b03811681146100b7575f80fd5b919050565b5f805f80608085870312156100cf575f80fd5b6100d8856100a1565b93506100e6602086016100a1565b92506100f4604086016100a1565b9150610102606086016100a1565b905092959194509250565b60805160a051610bc16101505f395f818160f8015281816103fa015281816104f201528181610527015261064d01525f81816101c1015261048f0152610bc15ff3fe6080604052600436106100dc575f3560e01c80638da5cb5b1161007c578063b4a25ce711610057578063b4a25ce714610261578063bbf20c1514610291578063d88d35de146102b0578063f2fde38b146102cf575f80fd5b80638da5cb5b1461020257806394a228b514610220578063b2ef14e314610242575f80fd5b8063481fb142116100b7578063481fb14214610177578063628a4b2f14610191578063647846a5146101b057806365d82753146101e3575f80fd5b806312261ee7146100e75780631ac169861461013757806335a9e4df14610158575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b5061011a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610142575f80fd5b506101566101513660046108ee565b6102ee565b005b348015610163575f80fd5b5060015461011a906001600160a01b031681565b348015610182575f80fd5b5061011a6001600160a01b0381565b34801561019c575f80fd5b506101566101ab36600461094d565b610330565b3480156101bb575f80fd5b5061011a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156101ee575f80fd5b506101566101fd3660046109b0565b6103c2565b34801561020d575f80fd5b505f5461011a906001600160a01b031681565b34801561022b575f80fd5b506102345f1981565b60405190815260200161012e565b34801561024d575f80fd5b5061015661025c3660046109ef565b610459565b34801561026c575f80fd5b5061027a65ffffffffffff81565b60405165ffffffffffff909116815260200161012e565b34801561029c575f80fd5b506101566102ab366004610a19565b6104ba565b3480156102bb575f80fd5b506101566102ca366004610a92565b61060d565b3480156102da575f80fd5b506101566102e936600461094d565b6106b5565b5f546001600160a01b031633146103205760405162461bcd60e51b815260040161031790610b03565b60405180910390fd5b61032b838383610728565b505050565b5f546001600160a01b031633146103595760405162461bcd60e51b815260040161031790610b03565b600154604080516001600160a01b03928316815291831660208301527f736ee8e49f5bc52c4483e2bf96ce5c99a25af7c12037267ccde543b28ab63071910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b031633146103eb5760405162461bcd60e51b815260040161031790610b03565b5f5b8181101561032b576104517f00000000000000000000000000000000000000000000000000000000000000005f85858581811061042c5761042c610b29565b9050602002016020810190610441919061094d565b6001600160a01b031691906107b0565b6001016103ed565b5f546001600160a01b031633146104825760405162461bcd60e51b815260040161031790610b03565b6104b66001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016838361082c565b5050565b5f546001600160a01b031633146104e35760405162461bcd60e51b815260040161031790610b03565b5f5b818110156105fa576105257f00000000000000000000000000000000000000000000000000000000000000005f1985858581811061042c5761042c610b29565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166387517c4584848481811061056657610566610b29565b905060200201602081019061057b919061094d565b60015460405160e084901b6001600160e01b03191681526001600160a01b0392831660048201529082166024820152604481019190915265ffffffffffff60648201526084015f604051808303815f87803b1580156105d8575f80fd5b505af11580156105ea573d5f803e3d5ffd5b5050600190920191506104e59050565b50610606858585610728565b5050505050565b5f546001600160a01b031633146106365760405162461bcd60e51b815260040161031790610b03565b60405163cc53287f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cc53287f906106849085908590600401610b3d565b5f604051808303815f87803b15801561069b575f80fd5b505af11580156106ad573d5f803e3d5ffd5b505050505050565b5f546001600160a01b031633146106de5760405162461bcd60e51b815260040161031790610b03565b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6001546040515f916001600160a01b03169083906107499087908790610ba5565b5f6040518083038185875af1925050503d805f8114610783576040519150601f19603f3d011682016040523d82523d5f602084013e610788565b606091505b50509050806107aa5760405163cee8b77760e01b815260040160405180910390fd5b50505050565b5f60405163095ea7b360e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f5114161716915050806107aa5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610317565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f5114161716915050806107aa5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610317565b5f8083601f8401126108b9575f80fd5b50813567ffffffffffffffff8111156108d0575f80fd5b6020830191508360208285010111156108e7575f80fd5b9250929050565b5f805f60408486031215610900575f80fd5b833567ffffffffffffffff811115610916575f80fd5b610922868287016108a9565b909790965060209590950135949350505050565b6001600160a01b038116811461094a575f80fd5b50565b5f6020828403121561095d575f80fd5b813561096881610936565b9392505050565b5f8083601f84011261097f575f80fd5b50813567ffffffffffffffff811115610996575f80fd5b6020830191508360208260051b85010111156108e7575f80fd5b5f80602083850312156109c1575f80fd5b823567ffffffffffffffff8111156109d7575f80fd5b6109e38582860161096f565b90969095509350505050565b5f8060408385031215610a00575f80fd5b8235610a0b81610936565b946020939093013593505050565b5f805f805f60608688031215610a2d575f80fd5b853567ffffffffffffffff811115610a43575f80fd5b610a4f888289016108a9565b90965094505060208601359250604086013567ffffffffffffffff811115610a75575f80fd5b610a818882890161096f565b969995985093965092949392505050565b5f8060208385031215610aa3575f80fd5b823567ffffffffffffffff811115610ab9575f80fd5b8301601f81018513610ac9575f80fd5b803567ffffffffffffffff811115610adf575f80fd5b8560208260061b8401011115610af3575f80fd5b6020919091019590945092505050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b602080825281018290525f8360408301825b85811015610b9b578235610b6281610936565b6001600160a01b031682526020830135610b7b81610936565b6001600160a01b0316602083015260409283019290910190600101610b4f565b5095945050505050565b818382375f910190815291905056fea164736f6c634300081a000a';
}
}

0 comments on commit 9a3aae0

Please sign in to comment.