Skip to content

Commit 071178d

Browse files
Merge branch 'eulerswap' into development
2 parents 20a2189 + f7dbed5 commit 071178d

9 files changed

+235
-3
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,6 @@
3434
[submodule "lib/solidity-bytes-utils"]
3535
path = lib/solidity-bytes-utils
3636
url = https://github.com/GNSPS/solidity-bytes-utils
37+
[submodule "lib/euler-swap"]
38+
path = lib/euler-swap
39+
url = https://github.com/euler-xyz/euler-swap

lib/euler-swap

Submodule euler-swap added at b948f40

remappings.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ lib/layerzero-devtools/packages/oapp-evm-upgradeable/contracts:@openzeppelin/con
1313
@layerzerolabs/lz-evm-oapp-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/oapp
1414
openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/
1515
openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/
16+
lib/fee-flow/src:solmate/=lib/fee-flow/lib/solmate/src
17+
lib/fee-flow/utils:solmate/=lib/fee-flow/lib/solmate/utils
18+
lib/fee-flow/tokens:solmate/=lib/fee-flow/lib/solmate/tokens
19+
lib/euler-swap:solmate/=lib/euler-swap/lib/euler-vault-kit/lib/permit2/lib/solmate
1620
ethereum-vault-connector/=lib/ethereum-vault-connector/src/
1721
evc/=lib/ethereum-vault-connector/src/
1822
evk/=lib/euler-vault-kit/src/
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
3+
pragma solidity ^0.8.0;
4+
5+
import {ScriptUtils} from "./utils/ScriptUtils.s.sol";
6+
7+
contract EulerSwapImplementation is ScriptUtils {
8+
function run() public broadcast returns (address implementation) {
9+
string memory inputScriptFileName = "22_EulerSwapImplementation_input.json";
10+
string memory outputScriptFileName = "22_EulerSwapImplementation_output.json";
11+
string memory json = getScriptFile(inputScriptFileName);
12+
address evc = vm.parseJsonAddress(json, ".evc");
13+
address poolManager = vm.parseJsonAddress(json, ".poolManager");
14+
15+
implementation = execute(evc, poolManager);
16+
17+
string memory object;
18+
object = vm.serializeAddress("implementation", "eulerSwapImplementation", implementation);
19+
20+
vm.writeJson(object, string.concat(vm.projectRoot(), "/script/", outputScriptFileName));
21+
}
22+
23+
function deploy(address evc, address poolManager) public broadcast returns (address implementation) {
24+
implementation = execute(evc, poolManager);
25+
}
26+
27+
function execute(address evc, address poolManager) public returns (address implementation) {
28+
bytes memory bytecode =
29+
abi.encodePacked(vm.getCode("out-euler-swap/EulerSwap.sol/EulerSwap.json"), abi.encode(evc, poolManager));
30+
assembly {
31+
implementation := create(0, add(bytecode, 0x20), mload(bytecode))
32+
}
33+
}
34+
}

script/23_EulerSwapFactory.s.sol

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
3+
pragma solidity ^0.8.0;
4+
5+
import {ScriptUtils} from "./utils/ScriptUtils.s.sol";
6+
7+
contract EulerSwapFactory is ScriptUtils {
8+
function run() public broadcast returns (address eulerSwapFactory) {
9+
string memory inputScriptFileName = "23_EulerSwapFactory_input.json";
10+
string memory outputScriptFileName = "23_EulerSwapFactory_output.json";
11+
string memory json = getScriptFile(inputScriptFileName);
12+
address evc = vm.parseJsonAddress(json, ".evc");
13+
address eVaultFactory = vm.parseJsonAddress(json, ".eVaultFactory");
14+
address eulerSwapImplementation = vm.parseJsonAddress(json, ".eulerSwapImplementation");
15+
address feeOwner = vm.parseJsonAddress(json, ".feeOwner");
16+
address feeReceipientSetter = vm.parseJsonAddress(json, ".feeReceipientSetter");
17+
18+
eulerSwapFactory = execute(evc, eVaultFactory, eulerSwapImplementation, feeOwner, feeReceipientSetter);
19+
20+
string memory object;
21+
object = vm.serializeAddress("factory", "eulerSwapFactory", eulerSwapFactory);
22+
23+
vm.writeJson(object, string.concat(vm.projectRoot(), "/script/", outputScriptFileName));
24+
}
25+
26+
function deploy(
27+
address evc,
28+
address eVaultFactory,
29+
address eulerSwapImplementation,
30+
address feeOwner,
31+
address feeReceipientSetter
32+
) public broadcast returns (address eulerSwapFactory) {
33+
eulerSwapFactory = execute(evc, eVaultFactory, eulerSwapImplementation, feeOwner, feeReceipientSetter);
34+
}
35+
36+
function execute(
37+
address evc,
38+
address eVaultFactory,
39+
address eulerSwapImplementation,
40+
address feeOwner,
41+
address feeReceipientSetter
42+
) public returns (address eulerSwapFactory) {
43+
bytes memory bytecode = abi.encodePacked(
44+
vm.getCode("out-euler-swap/EulerSwapFactory.sol/EulerSwapFactory.json"),
45+
abi.encode(evc, eVaultFactory, eulerSwapImplementation, feeOwner, feeReceipientSetter)
46+
);
47+
assembly {
48+
eulerSwapFactory := create(0, add(bytecode, 0x20), mload(bytecode))
49+
}
50+
}
51+
}

script/50_CoreAndPeriphery.s.sol

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import {OFTAdapterUpgradeableDeployer, MintBurnOFTAdapterDeployer} from "./14_OF
3636
import {EdgeFactoryDeployer} from "./15_EdgeFactory.s.sol";
3737
import {EulerEarnImplementation, IntegrationsParams} from "./20_EulerEarnImplementation.s.sol";
3838
import {EulerEarnFactory} from "./21_EulerEarnFactory.s.sol";
39+
import {EulerSwapImplementation} from "./22_EulerSwapImplementation.s.sol";
40+
import {EulerSwapFactory} from "./23_EulerSwapFactory.s.sol";
3941
import {FactoryGovernor} from "./../src/Governor/FactoryGovernor.sol";
4042
import {
4143
IGovernorAccessControlEmergencyFactory,
@@ -82,6 +84,10 @@ contract CoreAndPeriphery is BatchBuilder, SafeMultisendBuilder {
8284
address uniswapV3Router;
8385
uint256 feeFlowInitPrice;
8486
bool deployOFT;
87+
bool deployEulerSwapV1;
88+
address uniswapPoolManager;
89+
address eulerSwapFeeOwner;
90+
address eulerSwapFeeRecipientSetter;
8591
}
8692

8793
struct AdaptiveCurveIRMParams {
@@ -172,7 +178,11 @@ contract CoreAndPeriphery is BatchBuilder, SafeMultisendBuilder {
172178
uniswapV2Router: vm.parseJsonAddress(json, ".uniswapV2Router"),
173179
uniswapV3Router: vm.parseJsonAddress(json, ".uniswapV3Router"),
174180
feeFlowInitPrice: vm.parseJsonUint(json, ".feeFlowInitPrice"),
175-
deployOFT: vm.parseJsonBool(json, ".deployOFT")
181+
deployOFT: vm.parseJsonBool(json, ".deployOFT"),
182+
deployEulerSwapV1: vm.parseJsonBool(json, ".deployEulerSwapV1"),
183+
uniswapPoolManager: vm.parseJsonAddress(json, ".uniswapPoolManager"),
184+
eulerSwapFeeOwner: vm.parseJsonAddress(json, ".eulerSwapFeeOwner"),
185+
eulerSwapFeeRecipientSetter: vm.parseJsonAddress(json, ".eulerSwapFeeRecipientSetter")
176186
});
177187

178188
if (
@@ -253,6 +263,7 @@ contract CoreAndPeriphery is BatchBuilder, SafeMultisendBuilder {
253263
coreAddresses.eulerEarnFactory = deployer.deploy(coreAddresses.eulerEarnImplementation);
254264
} else {
255265
console.log("- EulerEarn factory already deployed. Skipping...");
266+
if (vm.isDir("out-euler-earn")) vm.removeDir("out-euler-earn", true);
256267
}
257268

258269
if (governorAddresses.eVaultFactoryGovernor == address(0)) {
@@ -993,6 +1004,34 @@ contract CoreAndPeriphery is BatchBuilder, SafeMultisendBuilder {
9931004
console.log("- Adaptive Curve IRM factory or IRM registry not deployed. Skipping...");
9941005
}
9951006

1007+
if (
1008+
eulerSwapAddresses.eulerSwapV1Implementation == address(0)
1009+
&& eulerSwapAddresses.eulerSwapV1Factory == address(0)
1010+
) {
1011+
if (input.deployEulerSwapV1) {
1012+
{
1013+
console.log("+ Deploying EulerSwap V1 implementation...");
1014+
EulerSwapImplementation deployer = new EulerSwapImplementation();
1015+
eulerSwapAddresses.eulerSwapV1Implementation =
1016+
deployer.deploy(coreAddresses.evc, input.uniswapPoolManager);
1017+
}
1018+
{
1019+
console.log("+ Deploying EulerSwap V1 factory...");
1020+
EulerSwapFactory deployer = new EulerSwapFactory();
1021+
eulerSwapAddresses.eulerSwapV1Factory = deployer.deploy(
1022+
coreAddresses.evc,
1023+
coreAddresses.eVaultFactory,
1024+
eulerSwapAddresses.eulerSwapV1Implementation,
1025+
input.eulerSwapFeeOwner,
1026+
input.eulerSwapFeeRecipientSetter
1027+
);
1028+
}
1029+
} else {
1030+
console.log("- EulerSwap v1 not deployed. Skipping...");
1031+
if (vm.isDir("out-euler-swap")) vm.removeDir("out-euler-swap", true);
1032+
}
1033+
}
1034+
9961035
executeBatch();
9971036

9981037
if (multisendItemExists()) {
@@ -1015,6 +1054,9 @@ contract CoreAndPeriphery is BatchBuilder, SafeMultisendBuilder {
10151054
vm.writeJson(serializeGovernorAddresses(governorAddresses), getScriptFilePath("GovernorAddresses_output.json"));
10161055
vm.writeJson(serializeTokenAddresses(tokenAddresses), getScriptFilePath("TokenAddresses_output.json"));
10171056
vm.writeJson(serializeLensAddresses(lensAddresses), getScriptFilePath("LensAddresses_output.json"));
1057+
vm.writeJson(
1058+
serializeEulerSwapAddresses(eulerSwapAddresses), getScriptFilePath("EulerSwapAddresses_output.json")
1059+
);
10181060
vm.writeJson(serializeBridgeAddresses(bridgeAddresses), getScriptFilePath("BridgeAddresses_output.json"));
10191061
vm.writeJson(serializeBridgeConfigCache(), getScriptFilePath("BridgeConfigCache_output.json"));
10201062

@@ -1042,6 +1084,10 @@ contract CoreAndPeriphery is BatchBuilder, SafeMultisendBuilder {
10421084
vm.writeJson(
10431085
serializeLensAddresses(lensAddresses), getAddressesFilePath("LensAddresses.json", block.chainid)
10441086
);
1087+
vm.writeJson(
1088+
serializeEulerSwapAddresses(eulerSwapAddresses),
1089+
getAddressesFilePath("EulerSwapAddresses.json", block.chainid)
1090+
);
10451091
vm.writeJson(
10461092
serializeBridgeAddresses(bridgeAddresses), getAddressesFilePath("BridgeAddresses.json", block.chainid)
10471093
);

script/interactiveDeployment.sh

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ if ! script/utils/checkEnvironment.sh "$@"; then
3838
fi
3939

4040
eulerEarnCompilerOptions="--optimize --optimizer-runs 800 --use 0.8.27 --out out-euler-earn"
41+
eulerSwapCompilerOptions="--optimize --optimizer-runs 1000000 --use 0.8.27 --out out-euler-swap"
4142

4243
while true; do
4344
echo ""
@@ -1263,6 +1264,7 @@ while true; do
12631264
feeFlowController=$(jq -r '.feeFlowController' "$addresses_dir_path/PeripheryAddresses.json" 2>/dev/null)
12641265
eulerEarnFactory=$(jq -r '.eulerEarnFactory' "$addresses_dir_path/CoreAddresses.json" 2>/dev/null)
12651266
eulerEarnFactory=${eulerEarnFactory:-$addressZero}
1267+
eulerSwapV1Factory=$(jq -r '.eulerSwapV1Factory' "$addresses_dir_path/EulerSwapAddresses.json" 2>/dev/null)
12661268
fi
12671269

12681270
if [ -z "$multisig_dao" ] || [ "$multisig_dao" == "$addressZero" ]; then
@@ -1290,6 +1292,16 @@ while true; do
12901292
read -p "Should deploy and configure OFT Adapter? (y/n) (default: n): " deploy_oft
12911293
fi
12921294

1295+
if [ -z "$eulerSwapV1Factory" ] || [ "$eulerSwapV1Factory" == "$addressZero" ]; then
1296+
read -p "Should deploy EulerSwap V1? (y/n) (default: n): " deploy_euler_swap_v1
1297+
1298+
if [ "$deploy_euler_swap_v1" = "y" ]; then
1299+
read -p "Enter the Uniswap V4 Pool Manager address (default: address(0) or look up https://docs.uniswap.org/contracts/v4/deployments): " uniswap_pool_manager
1300+
read -p "Enter the EulerSwap fee owner (default: DAO multisig): " euler_swap_fee_owner
1301+
read -p "Enter the EulerSwap fee recipient setter (default: address(0)): " euler_swap_fee_recipient_setter
1302+
fi
1303+
fi
1304+
12931305
multisig_dao=${multisig_dao:-$addressZero}
12941306
multisig_labs=${multisig_labs:-$addressZero}
12951307
multisig_security_council=${multisig_security_council:-$addressZero}
@@ -1300,11 +1312,19 @@ while true; do
13001312
uniswap_router_v3=${uniswap_router_v3:-$addressZero}
13011313
init_price=${init_price:-1000000000000000000}
13021314
deploy_oft=${deploy_oft:-n}
1315+
deploy_euler_swap_v1=${deploy_euler_swap_v1:-n}
1316+
uniswap_pool_manager=${uniswap_pool_manager:-$addressZero}
1317+
euler_swap_fee_owner=${euler_swap_fee_owner:-$multisig_dao}
1318+
euler_swap_fee_recipient_setter=${euler_swap_fee_recipient_setter:-$addressZero}
13031319

13041320
if [ -z "$eulerEarnFactory" ] || [ "$eulerEarnFactory" == "$addressZero" ]; then
13051321
forge compile lib/euler-earn/src $eulerEarnCompilerOptions --force
13061322
fi
13071323

1324+
if [ -z "$eulerSwapFactory_v1" ] || [ "$eulerSwapFactory_v1" == "$addressZero" ]; then
1325+
forge compile lib/euler-swap/src $eulerSwapCompilerOptions --force
1326+
fi
1327+
13081328
if [[ "$@" != *"--ffi"* ]]; then
13091329
set -- "$@" --ffi
13101330
fi
@@ -1320,6 +1340,10 @@ while true; do
13201340
--arg uniswapRouterV3 "$uniswap_router_v3" \
13211341
--arg initPrice "$init_price" \
13221342
--argjson deployOFT "$(jq -n --argjson val \"$deploy_oft\" 'if $val == "y" then true else false end')" \
1343+
--argjson deployEulerSwapV1 "$(jq -n --argjson val \"$deploy_euler_swap_v1\" 'if $val == "y" then true else false end')" \
1344+
--arg uniswapPoolManager "$uniswap_pool_manager" \
1345+
--arg eulerSwapFeeOwner "$euler_swap_fee_owner" \
1346+
--arg eulerSwapFeeRecipientSetter "$euler_swap_fee_recipient_setter" \
13231347
'{
13241348
multisigDAO: $multisigDAO,
13251349
multisigLabs: $multisigLabs,
@@ -1330,7 +1354,11 @@ while true; do
13301354
uniswapV2Router: $uniswapRouterV2,
13311355
uniswapV3Router: $uniswapRouterV3,
13321356
feeFlowInitPrice: $initPrice,
1333-
deployOFT: $deployOFT
1357+
deployOFT: $deployOFT,
1358+
deployEulerSwapV1: $deployEulerSwapV1,
1359+
uniswapPoolManager: $uniswapPoolManager,
1360+
eulerSwapFeeOwner: $eulerSwapFeeOwner,
1361+
eulerSwapFeeRecipientSetter: $eulerSwapFeeRecipientSetter
13341362
}' --indent 4 > script/${jsonName}_input.json
13351363
;;
13361364
51)

script/utils/ScriptUtils.s.sol

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,26 @@ abstract contract MultisigAddressesLib is ScriptExtended {
295295
}
296296
}
297297

298+
abstract contract EulerSwapAddressesLib is ScriptExtended {
299+
struct EulerSwapAddresses {
300+
address eulerSwapV1Implementation;
301+
address eulerSwapV1Factory;
302+
}
303+
304+
function serializeEulerSwapAddresses(EulerSwapAddresses memory Addresses) internal returns (string memory result) {
305+
result =
306+
vm.serializeAddress("eulerSwapAddresses", "eulerSwapV1Implementation", Addresses.eulerSwapV1Implementation);
307+
result = vm.serializeAddress("eulerSwapAddresses", "eulerSwapV1Factory", Addresses.eulerSwapV1Factory);
308+
}
309+
310+
function deserializeEulerSwapAddresses(string memory json) internal pure returns (EulerSwapAddresses memory) {
311+
return EulerSwapAddresses({
312+
eulerSwapV1Implementation: getAddressFromJson(json, ".eulerSwapV1Implementation"),
313+
eulerSwapV1Factory: getAddressFromJson(json, ".eulerSwapV1Factory")
314+
});
315+
}
316+
}
317+
298318
abstract contract BridgeAddressesLib is ScriptExtended {
299319
struct BridgeAddresses {
300320
address oftAdapter;
@@ -373,6 +393,7 @@ abstract contract ScriptUtils is
373393
BridgeAddressesLib,
374394
TokenAddressesLib,
375395
GovernorAddressesLib,
396+
EulerSwapAddressesLib,
376397
BridgeConfigCache
377398
{
378399
MultisigAddresses internal multisigAddresses;
@@ -382,6 +403,7 @@ abstract contract ScriptUtils is
382403
BridgeAddresses internal bridgeAddresses;
383404
TokenAddresses internal tokenAddresses;
384405
GovernorAddresses internal governorAddresses;
406+
EulerSwapAddresses internal eulerSwapAddresses;
385407
uint256 internal safeNonce = getSafeNonce();
386408

387409
constructor() {
@@ -392,6 +414,7 @@ abstract contract ScriptUtils is
392414
bridgeAddresses = deserializeBridgeAddresses(getAddressesJson("BridgeAddresses.json"));
393415
tokenAddresses = deserializeTokenAddresses(getAddressesJson("TokenAddresses.json"));
394416
governorAddresses = deserializeGovernorAddresses(getAddressesJson("GovernorAddresses.json"));
417+
eulerSwapAddresses = deserializeEulerSwapAddresses(getAddressesJson("EulerSwapAddresses.json"));
395418
deserializeBridgeConfigCache(getBridgeConfigCacheJson("BridgeConfigCache.json"));
396419
}
397420

script/utils/verifyContracts.sh

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ function verify_broadcast {
7878

7979
local createVerified=false
8080
local eulerEarnIndex=0
81+
local eulerSwapIndex=0
8182
for tx in $transactions; do
8283
local transactionType=$(echo $tx | jq -r '.transactionType')
8384
local contractAddress=$(echo $tx | jq -r '.contractAddress')
@@ -193,7 +194,7 @@ function verify_broadcast {
193194
elif [[ $transactionType == "CREATE" && $verificationSuccessful != true ]]; then
194195
local initCode=$(echo $tx | jq -r '.transaction.input')
195196

196-
if [ -d "out-euler-earn" ]; then
197+
if [ -d "out-euler-earn" ] && [ $eulerEarnIndex -le 7 ]; then
197198
# try to verify as EulerEarn contracts
198199
local src="lib/euler-earn/src"
199200
local verificationOptions="--num-of-optimizations 800 --compiler-version 0.8.27 --root lib/euler-earn"
@@ -263,6 +264,47 @@ function verify_broadcast {
263264
((eulerEarnIndex++))
264265
done
265266
fi
267+
268+
if [ -d "out-euler-swap" ] && ([ ! -d "out-euler-earn" ] || [ $eulerEarnIndex -gt 7 ]); then
269+
# try to verify as EulerSwap contracts
270+
local src="lib/euler-swap/src"
271+
local verificationOptions="--num-of-optimizations 1000000 --compiler-version 0.8.27 --root lib/euler-swap"
272+
local compilerOptions="--optimize --optimizer-runs 1000000 --use 0.8.27"
273+
274+
while true; do
275+
case $eulerSwapIndex in
276+
0)
277+
# try to verify as EulerSwap
278+
contractName=EulerSwap
279+
constructorBytesSize=64
280+
;;
281+
1)
282+
# try to verify as EulerSwapFactory
283+
contractName=EulerSwapFactory
284+
constructorBytesSize=160
285+
;;
286+
*)
287+
break
288+
;;
289+
esac
290+
291+
constructorArgs="--constructor-args ${initCode: -$((2*constructorBytesSize))}"
292+
293+
if [ "$createVerified" = false ]; then
294+
forge clean && forge compile $src $compilerOptions
295+
fi
296+
297+
verify_contract $contractAddress $contractName "$constructorArgs" "$@" $verificationOptions
298+
299+
if [ $? -eq 0 ]; then
300+
createVerified=true
301+
((eulerSwapIndex++))
302+
break
303+
fi
304+
305+
((eulerSwapIndex++))
306+
done
307+
fi
266308
fi
267309
done
268310
}

0 commit comments

Comments
 (0)