Skip to content

Commit

Permalink
Dev into main (#429)
Browse files Browse the repository at this point in the history
* Prepare for v4 work (#346)

* update hardhat

* remove symlinks by using hardhat-foundry

use hardhat-foundry package to use foundry remappings to compile. Symlinks are no longer necessary
After upgrade HH412 error was thrown caused by the existing symlinks
ref:
https://hardhat.org/hardhat-runner/docs/errors#HH412
NomicFoundation/hardhat#3623

* update compiler version to ^0.8.24 supporting the cancun upgrades

* fix ci

* fix lock file

* Update yarn.lock

* regenerate gas snapshots

* install foundry in ci

* Use mainnet permit2 (#347)

* solc upgrade to 0.8.26

* use mainnet permit2 work started

* fix uniswap tests

* Remove block from resetFork

* Refactor to fetch fee tiers

* remove NFT protocols for V4 router (#348)

* first pass

* fix forge builds

* fix reentrancy test

* Add check to receive

* remove .only rip

* add todo for tests that need wrtiting

* update readme and planner

---------

Co-authored-by: Alice <[email protected]>
Co-authored-by: Alice Henshaw <[email protected]>

* V3 liquidity commands (#355)

* import with dif version of OZ

* fix remapping issue

* duplicate exports and v3 version error

* remove else statement and fix format

* fix duplicate IERC165 in typechain

* permit, decrease, collect, burn commands

* all v3 commands separately

* add structs

* remove mint and increaseLiquidity on v3

* test change

* fix yarn.lock

* pass foundry tests for now

* nit - change name

* spelling error

* v3pm address not needed

* some gas tests

* check msg.sender

* format

* transient storage

* unauthorized tests

* transient storage

* v3 multicall with tests

* v3 call + transient storage

* no decode

* clean up tests

* some changes

* comment changes

* suggestion fixes

* regenerate yarn.lock file

* revert yarn.lock

* some changes

* separate migration tests

* bignumber to fix test

* fix remappings for forge compile

* remove command placeholder

* remove transient storage

* format

* use v3 periphery 0.8 instead

* fix gas snapshots

* v3 position manager addresses

* name change

* remove v4 in this pr

* remove unnecessary stuff

* change test names

* fix erc721 permit

* more tests

* name changes, comments, test

---------

Co-authored-by: gretzke <[email protected]>

* Reentrancy guard transient (#354)

* Make reentrancy guard transient

* locker tests

* abstract the locker library away

* Updated locker tests

* move map, and fix CI

* Update lint.yml

* update comment

* V4 liquidity commands (#359)

* v4 periphery git submodule

* deploy v4

* prettier

* point v4 periphery to main

* use solmate/src and deploy v4

* format

* update v4-periphery and future proof deployRouter

* prettier

* update v4-periphery, change remapping, and update deploy test (#361)

* update v4-periphery, change remapping, and update deploy test

* make immutables public

* little fixes

* last one

* make only migrator immutables public

* Make msgSender public (#365)

* make maximum input transient (#366)

* update v4 periphery to main and update deployRouter (#367)

* update v4 periphery to main and update deployRouter

* point to updated v4 posm

* v4 planner (#368)

* v4 planner

* some renaming

* separate uniswap tests (#369)

* separate uniswap tests

* Move permit2 tests

* final decode in calldata (#363)

* batch permit decode in calldata

* array of structs

* PR comment

* V4 posm call (#364)

* v4 mint so far

* solmate remapping

* v4 mint and increase tests

* prettier

* update v4 periphery to main

* some gas tests

* remove selector check in v4 posm call

* organize some tests

* more tests

* prettier

* more tests

* update gas

* remove unnecessary import

* remove unnecessary encodings

* Add v4 routing (#360)

* complete setup, everything working

* v4 command plus planner

* use main v4 branch

* update periphery, handle changes

* linting

* V4 test setup

* working pool setup

* cleanup of imports

* 2 working v4 swap tests

* exact out swaps

* 2 hop swap tests

* update periphery

* Update posm with tests (#370)

* update tests to correspond with posm

* match deploy universal router with alices

* update oz for ierc721permit problem

* switch back to OZ 4.7.0

* use OZ 5.0.2 to match v4

* remove internal _msgSender()

* pr comments

* add license

* Update periphery in UR (#371)

* update to audit commit (#372)

* V4 Native Tests (#373)

* ETH input v4 tests

* eth output v4 tests

* PR comments

* Add v4 to receive (#376)

* add v4 to receive function

* linting

* PR comments

* fix and snapshots

* Take portion tests (#377)

* take portion test

* take portion test native

* correct comment

* take portion on input test

* remove console logs oops

* Oz L-09 (#382)

* OZ L-09

* Remove .vscode/settings.json from the repository

* update periphery to main (#380)

* update periphery to main

* update periphery after it updated main

* update again

* update again

* add different tests for increasing and add tests for forwarding eth (#379)

* add different tests for increasing and add tests for forwarding eth

* fix gas snapshot

* add more comments

* fix gas snapshots

* fix gas again

* add comments on unpermit tests

* OZ N-06 (#383)

* OZ N-16 (#388)

* ABDK CVF-107 (#385)

* spearbit 94 (#389)

* ABDK CVF106 (#387)

* ABDK CVF106

* fix comment

* oz-L13: missing natspec (#390)

* Spearbit 59 (#391)

* Spearbit 60 & 61 (#392)

* OZ N-11 (#393)

* update periphery (#394)

* update periphery

* remove position config

* lint

* Audit reports (#395)

* Periphery update - calldata decoder (#396)

* Periphery update - calldata decoder

* rename function and snapshots

* actually use the function

* feat: update to 1.6.1-beta.1 (#398)

* Chore/push button deploy (#400)

* Update .gitmodules (#337)

There is no need to use an account for GitHub.

* chore(infra): set up deploy

---------

Co-authored-by: Jonney <[email protected]>

* chore: fix yarn publish (#401)

* chore: fix yarn publish

* Update deploy.yml

* Update deploy.yml

* chore(infra): deploy with npm (#403)

* Update deploy.yml

* Update deploy.yml

* Update package.json

* compile contracts in workflow

* 2.0.0-beta.1 (#407)

* Release workflow needs forge install (#408)

* init submodules in release workflow (#409)

* gitmodules should use https (#410)

* Update v4 initialize (#415)

* update periphery

* update initialize ABI

* temporary position descriptor constructor arg

* lint

* updated snap

* restrict increase, decrease, and burn and v4 initialize pool call (#416)

* restrict increase, decrease, and burn

* prettier

* initialize v4 pool call

* prettier

* refactor logic into function, plus optimise decode

* merge latest periphery

* move v3 logic outside of dispatcher

* initialize pool tests

* sbapshot

* larger refactor

* pull v4 periphery and revert payments

* make checkV4InitializeCall like the others

* Call initialize directly

* undo v3 refactor

* imports

* remove unused typescript type

* remove unnecessary extra immutable

* Bump beta version

* Improve coments

* Add pool intiialization to some tests

---------

Co-authored-by: Alice Henshaw <[email protected]>

* deploy script for Base Sepolia (#381)

* Update .gitmodules (#337)

There is no need to use an account for GitHub.

* deploy script for Base Sepolia

* updating some deploys for sepolia L2s

* include vanity/public RPCs for scripts

* Update script/deployParameters/DeployOPSepolia.s.sol

Co-authored-by: Alice <[email protected]>

* Update script/deployParameters/DeployUnichainSepolia.s.sol

Co-authored-by: Alice <[email protected]>

---------

Co-authored-by: Jonney <[email protected]>
Co-authored-by: Alice <[email protected]>

* Latest v4 periphery (#420)

* Latest v4 periphery

* why didnt the linter catch this

* v3 refactor and pull latest periphery (#418)

* v3 refactor and pull latest periphery

* switch to if else

* allow permit2 to silently fail to avoid dos (#417)

* allow permit2 to silently fail to avoid dos

* fix tests

* update periphery (#424)

* update periphery not working

* fix ur according to periphery update

* prettier

* fix issue during hardhat tests fixed in version 2.22.14

* change optimizer size

* change optimizer runs for manager only

* update again

* prettier

* update periphery again

* switch runs to 30000

---------

Co-authored-by: gretzke <[email protected]>

* move file (#425)

* Merge updates into dev (#428)

* Update .gitmodules (#337)

There is no need to use an account for GitHub.

* chore(infra): set up deploy (#397)

* chore: yarn publish (#402)

* chore: yarn publish

* Update deploy.yml

* Update deploy.yml

* Update deploy.yml

* Update deploy.yml

* chore: add provenance (#404)

* compile contracts in workflow (#405)

* feat: deploy worldchain (#411)

* fix: update UR address on worldchain (#412)

previous accidentally set it to the unsupported protocol

* Create CODEOWNERS (#419)

---------

Co-authored-by: Jonney <[email protected]>
Co-authored-by: mr-uniswap <[email protected]>
Co-authored-by: Emily Williams <[email protected]>
Co-authored-by: marktoda <[email protected]>
Co-authored-by: dianakocsis <[email protected]>

---------

Co-authored-by: Daniel Gretzke <[email protected]>
Co-authored-by: diana <[email protected]>
Co-authored-by: saucepoint <[email protected]>
Co-authored-by: marktoda <[email protected]>
Co-authored-by: mr-uniswap <[email protected]>
Co-authored-by: Jonney <[email protected]>
Co-authored-by: Emily Williams <[email protected]>
  • Loading branch information
8 people authored Dec 4, 2024
1 parent ae89418 commit df69d57
Show file tree
Hide file tree
Showing 166 changed files with 6,524 additions and 14,431 deletions.
13 changes: 11 additions & 2 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,20 @@ jobs:
with:
cache: yarn
node-version: 18
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies and compile contracts
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: nightly

- name: Install dependencies
run: |
yarn install --immutable --immutable-cache
yarn compile
git submodule update --init --recursive
- name: Compile
run: yarn compile

- name: Release
env:
Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/forge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,12 @@ jobs:
# Must Insall node modules for forge to reference in remappings
- uses: actions/setup-node@v1
with:
node-version: 16.x
node-version: 18.x
registry-url: https://registry.npmjs.org

- name: Install Yarn
run: npm install -g yarn

- id: yarn-cache
run: echo "::set-output name=dir::$(yarn cache dir)"

Expand All @@ -53,7 +56,7 @@ jobs:

- name: Run Forge tests
run: |
forge test -vvv
forge test --isolate -vvv
id: test
env:
FORK_URL: https://mainnet.infura.io/v3/${{ secrets.INFURA_API_KEY }}
7 changes: 5 additions & 2 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,12 @@ jobs:
- name: Set up node
uses: actions/setup-node@v1
with:
node-version: 16.x
node-version: 18.x
registry-url: https://registry.npmjs.org

- name: Install Yarn
run: npm install -g yarn

- name: Install dependencies
run: yarn install --frozen-lockfile

Expand All @@ -37,4 +40,4 @@ jobs:
id: build

- name: Run linter
run: yarn run prettier
run: yarn run lint:check
12 changes: 10 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@ jobs:

- uses: actions/setup-node@v1
with:
node-version: 16.x
node-version: 18.x
registry-url: https://registry.npmjs.org

- name: Install Yarn
run: npm install -g yarn

- id: yarn-cache
run: echo "::set-output name=dir::$(yarn cache dir)"

Expand All @@ -34,11 +37,16 @@ jobs:
- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
with:
version: nightly

# This is required separately from yarn test because it generates the typechain definitions
- name: Compile
run: yarn compile

- name: Run Integration tests
run: yarn test
run: yarn test:hardhat
env:
INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Compiler files
cache/
cache_hardhat/
out/

# Ignores development broadcast logs
Expand Down
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,9 @@
[submodule "lib/permit2"]
path = lib/permit2
url = https://github.com/Uniswap/permit2
[submodule "lib/v3-periphery"]
path = lib/v3-periphery
url = https://github.com/uniswap/v3-periphery
[submodule "lib/v4-periphery"]
path = lib/v4-periphery
url = https://github.com/Uniswap/v4-periphery
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ out
openzeppelin-contracts
permit2
solmate
cache_hardhat
44 changes: 3 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,49 +84,12 @@ Each command is a `bytes1` containing the following 8 bits:
├──────┼───────────────────────────────┤
│ 0x0d │ PERMIT2_TRANSFER_FROM_BATCH │
├──────┼───────────────────────────────┤
│ 0x0e │ ------- │
├──────┼───────────────────────────────┤
│ 0x0f │ ------- │
├──────┼───────────────────────────────┤
│ 0x10 │ SEAPORT_V1_5 │
├──────┼───────────────────────────────┤
│ 0x11 │ LOOKS_RARE_721 │
├──────┼───────────────────────────────┤
│ 0x12 │ NFTX │
├──────┼───────────────────────────────┤
│ 0x13 │ CRYPTOPUNKS │
├──────┼───────────────────────────────┤
│ 0x14 │ LOOKS_RARE_1155 │
├──────┼───────────────────────────────┤
│ 0x15 │ OWNER_CHECK_721 │
├──────┼───────────────────────────────┤
│ 0x16 │ OWNER_CHECK_1155 │
├──────┼───────────────────────────────┤
│ 0x17 │ SWEEP_ERC721 │
├──────┼───────────────────────────────┤
│ 0x18 │ X2Y2_721 │
├──────┼───────────────────────────────┤
│ 0x19 │ SUDOSWAP │
├──────┼───────────────────────────────┤
│ 0x1a │ NFT20 │
├──────┼───────────────────────────────┤
│ 0x1b │ X2Y2_1155 │
├──────┼───────────────────────────────┤
│ 0x1c │ FOUNDATION │
├──────┼───────────────────────────────┤
│ 0x1d │ SWEEP_ERC1155 │
├──────┼───────────────────────────────┤
│ 0x1e │ ELEMENT_MARKET │
├──────┼───────────────────────────────┤
│ 0x1f │ ------- │
├──────┼───────────────────────────────┤
│ 0x20 │ SEAPORT_V1_4 │
│ 0x0e-│ ------- │
│ 0x20 │ │
├──────┼───────────────────────────────┤
│ 0x21 │ EXECUTE_SUB_PLAN │
├──────┼───────────────────────────────┤
│ 0x22 │ APPROVE_ERC20 │
├──────┼───────────────────────────────┤
│ 0x23-│ ------- │
│ 0x22-│ ------- │
│ 0x3f │ │
└──────┴───────────────────────────────┘
```
Expand Down Expand Up @@ -180,7 +143,6 @@ INFURA_API_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

```console
yarn install
yarn symlink
yarn compile
yarn test
```
Expand Down
Binary file not shown.
Binary file added audit/DRAFT_Spearbit_audit_UR.pdf
Binary file not shown.
Binary file not shown.
55 changes: 19 additions & 36 deletions contracts/UniversalRouter.sol
Original file line number Diff line number Diff line change
@@ -1,46 +1,36 @@
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;
pragma solidity ^0.8.24;

// Command implementations
import {Dispatcher} from './base/Dispatcher.sol';
import {RewardsCollector} from './base/RewardsCollector.sol';
import {RouterParameters} from './base/RouterImmutables.sol';
import {RouterParameters} from './types/RouterParameters.sol';
import {PaymentsImmutables, PaymentsParameters} from './modules/PaymentsImmutables.sol';
import {NFTImmutables, NFTParameters} from './modules/NFTImmutables.sol';
import {UniswapImmutables, UniswapParameters} from './modules/uniswap/UniswapImmutables.sol';
import {V4SwapRouter} from './modules/uniswap/v4/V4SwapRouter.sol';
import {Commands} from './libraries/Commands.sol';
import {IUniversalRouter} from './interfaces/IUniversalRouter.sol';
import {MigratorImmutables, MigratorParameters} from './modules/MigratorImmutables.sol';

contract UniversalRouter is IUniversalRouter, Dispatcher, RewardsCollector {
modifier checkDeadline(uint256 deadline) {
if (block.timestamp > deadline) revert TransactionDeadlinePassed();
_;
}

contract UniversalRouter is IUniversalRouter, Dispatcher {
constructor(RouterParameters memory params)
UniswapImmutables(
UniswapParameters(params.v2Factory, params.v3Factory, params.pairInitCodeHash, params.poolInitCodeHash)
)
PaymentsImmutables(PaymentsParameters(params.permit2, params.weth9, params.openseaConduit, params.sudoswap))
NFTImmutables(
NFTParameters(
params.seaportV1_5,
params.seaportV1_4,
params.nftxZap,
params.x2y2,
params.foundation,
params.sudoswap,
params.elementMarket,
params.nft20Zap,
params.cryptopunks,
params.looksRareV2,
params.routerRewardsDistributor,
params.looksRareRewardsDistributor,
params.looksRareToken
)
)
V4SwapRouter(params.v4PoolManager)
PaymentsImmutables(PaymentsParameters(params.permit2, params.weth9))
MigratorImmutables(MigratorParameters(params.v3NFTPositionManager, params.v4PositionManager))
{}

modifier checkDeadline(uint256 deadline) {
if (block.timestamp > deadline) revert TransactionDeadlinePassed();
_;
}

/// @notice To receive ETH from WETH
receive() external payable {
if (msg.sender != address(WETH9) && msg.sender != address(poolManager)) revert InvalidEthSender();
}

/// @inheritdoc IUniversalRouter
function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline)
external
Expand All @@ -58,7 +48,7 @@ contract UniversalRouter is IUniversalRouter, Dispatcher, RewardsCollector {
if (inputs.length != numCommands) revert LengthMismatch();

// loop through all given commands, execute them and pass along outputs as defined
for (uint256 commandIndex = 0; commandIndex < numCommands;) {
for (uint256 commandIndex = 0; commandIndex < numCommands; commandIndex++) {
bytes1 command = commands[commandIndex];

bytes calldata input = inputs[commandIndex];
Expand All @@ -68,17 +58,10 @@ contract UniversalRouter is IUniversalRouter, Dispatcher, RewardsCollector {
if (!success && successRequired(command)) {
revert ExecutionFailed({commandIndex: commandIndex, message: output});
}

unchecked {
commandIndex++;
}
}
}

function successRequired(bytes1 command) internal pure returns (bool) {
return command & Commands.FLAG_ALLOW_REVERT == 0;
}

/// @notice To receive ETH from WETH and NFT protocols
receive() external payable {}
}
32 changes: 0 additions & 32 deletions contracts/base/Callbacks.sol

This file was deleted.

Loading

0 comments on commit df69d57

Please sign in to comment.