Skip to content

Commit eadac7d

Browse files
authored
Merge pull request #148 from meTokens/fix/remove-soonest
Perf Optimise Migration
2 parents 75ecdea + f39405a commit eadac7d

File tree

4 files changed

+48
-66
lines changed

4 files changed

+48
-66
lines changed

contracts/interfaces/IMigration.sol

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ interface IMigration {
1717
/// @notice Method to send assets from migration vault to the vault of the
1818
/// target hub
1919
/// @param meToken Address of meToken
20-
/// @return amountOut Amount of token returned
21-
function finishMigration(address meToken)
22-
external
23-
returns (uint256 amountOut);
20+
function finishMigration(address meToken) external;
2421

2522
/// @notice Method returns bool if migration started
2623
/// @param meToken Address of meToken

contracts/migrations/SameAssetTransferMigration.sol

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,26 @@ contract SameAssetTransferMigration is ReentrancyGuard, Vault, IMigration {
2929

3030
mapping(address => SameAssetMigration) private _sameAssetMigration;
3131

32+
modifier onlyDiamond() {
33+
require(msg.sender == diamond, "!diamond");
34+
_;
35+
}
36+
3237
constructor(address _dao, address _diamond) Vault(_dao, _diamond) {}
3338

3439
/// @inheritdoc IMigration
3540
function initMigration(
3641
address meToken,
3742
bytes memory /* encodedArgs */
38-
) external override {
39-
require(msg.sender == diamond, "!diamond");
40-
43+
) external override onlyDiamond {
4144
MeTokenInfo memory meTokenInfo = IMeTokenRegistryFacet(diamond)
4245
.getMeTokenInfo(meToken);
43-
HubInfo memory hubInfo = IHubFacet(diamond).getHubInfo(
44-
meTokenInfo.hubId
45-
);
46-
HubInfo memory targetHubInfo = IHubFacet(diamond).getHubInfo(
47-
meTokenInfo.targetHubId
48-
);
4946

50-
require(hubInfo.asset == targetHubInfo.asset, "asset different");
47+
require(
48+
IHubFacet(diamond).getHubInfo(meTokenInfo.hubId).asset ==
49+
IHubFacet(diamond).getHubInfo(meTokenInfo.targetHubId).asset,
50+
"same asset"
51+
);
5152

5253
_sameAssetMigration[meToken].isMigrating = true;
5354
}
@@ -75,26 +76,21 @@ contract SameAssetTransferMigration is ReentrancyGuard, Vault, IMigration {
7576
external
7677
override
7778
nonReentrant
78-
returns (uint256 amountOut)
79+
onlyDiamond
7980
{
80-
require(msg.sender == diamond, "!diamond");
81-
SameAssetMigration storage usts = _sameAssetMigration[meToken];
82-
require(usts.isMigrating, "!migrating");
83-
8481
MeTokenInfo memory meTokenInfo = IMeTokenRegistryFacet(diamond)
8582
.getMeTokenInfo(meToken);
86-
HubInfo memory hubInfo = IHubFacet(diamond).getHubInfo(
87-
meTokenInfo.hubId
88-
);
8983
HubInfo memory targetHubInfo = IHubFacet(diamond).getHubInfo(
9084
meTokenInfo.targetHubId
9185
);
9286

93-
if (!usts.started) {
94-
ISingleAssetVault(hubInfo.vault).startMigration(meToken);
95-
usts.started = true;
87+
if (!_sameAssetMigration[meToken].started) {
88+
ISingleAssetVault(
89+
IHubFacet(diamond).getHubInfo(meTokenInfo.hubId).vault
90+
).startMigration(meToken);
9691
}
97-
amountOut = meTokenInfo.balancePooled + meTokenInfo.balanceLocked;
92+
uint256 amountOut = meTokenInfo.balancePooled +
93+
meTokenInfo.balanceLocked;
9894

9995
// Send asset to new vault only if there's a migration vault
10096
IERC20(targetHubInfo.asset).safeTransfer(
@@ -114,16 +110,14 @@ contract SameAssetTransferMigration is ReentrancyGuard, Vault, IMigration {
114110
usts = _sameAssetMigration[meToken];
115111
}
116112

117-
// Kicks off meToken warmup period
118113
/// @inheritdoc Vault
119114
function isValid(
120115
address meToken,
121116
bytes memory /* encodedArgs */
122117
) external view override returns (bool) {
123-
MeTokenInfo memory meTokenInfo = IMeTokenRegistryFacet(diamond)
124-
.getMeTokenInfo(meToken);
125118
// MeToken not subscribed to a hub
126-
if (meTokenInfo.hubId == 0) return false;
119+
if (IMeTokenRegistryFacet(diamond).getMeTokenInfo(meToken).hubId == 0)
120+
return false;
127121
return true;
128122
}
129123

contracts/migrations/UniswapSingleTransferMigration.sol

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ contract UniswapSingleTransferMigration is ReentrancyGuard, Vault, IMigration {
2727
uint24 fee;
2828
// if migration is active and startMigration() has not been triggered
2929
bool started;
30-
// meToken has executed the swap and can finish migrating
31-
bool swapped;
3230
}
3331

3432
mapping(address => UniswapSingleTransfer) private _uniswapSingleTransfers;
@@ -43,46 +41,48 @@ contract UniswapSingleTransferMigration is ReentrancyGuard, Vault, IMigration {
4341
uint24 public constant MIDFEE = 3000; // 0.3% (Default fee)
4442
uint24 public constant MAXFEE = 1e4; // 1%
4543

44+
modifier onlyDiamond() {
45+
require(msg.sender == diamond, "!diamond");
46+
_;
47+
}
48+
4649
constructor(address _dao, address _diamond) Vault(_dao, _diamond) {}
4750

4851
/// @inheritdoc IMigration
4952
function initMigration(address meToken, bytes memory encodedArgs)
5053
external
5154
override
55+
onlyDiamond
5256
{
53-
require(msg.sender == diamond, "!diamond");
54-
5557
MeTokenInfo memory meTokenInfo = IMeTokenRegistryFacet(diamond)
5658
.getMeTokenInfo(meToken);
57-
HubInfo memory hubInfo = IHubFacet(diamond).getHubInfo(
58-
meTokenInfo.hubId
59-
);
60-
HubInfo memory targetHubInfo = IHubFacet(diamond).getHubInfo(
61-
meTokenInfo.targetHubId
62-
);
6359

64-
require(hubInfo.asset != targetHubInfo.asset, "same asset");
60+
require(
61+
IHubFacet(diamond).getHubInfo(meTokenInfo.hubId).asset !=
62+
IHubFacet(diamond).getHubInfo(meTokenInfo.targetHubId).asset,
63+
"same asset"
64+
);
6565

66-
uint24 fee = abi.decode(encodedArgs, (uint24));
67-
UniswapSingleTransfer storage usts = _uniswapSingleTransfers[meToken];
68-
usts.fee = fee;
66+
_uniswapSingleTransfers[meToken].fee = abi.decode(
67+
encodedArgs,
68+
(uint24)
69+
);
6970
}
7071

7172
/// @inheritdoc IMigration
7273
function poke(address meToken) external override nonReentrant {
73-
// Make sure meToken is in a state of resubscription
7474
UniswapSingleTransfer storage usts = _uniswapSingleTransfers[meToken];
7575
MeTokenInfo memory meTokenInfo = IMeTokenRegistryFacet(diamond)
7676
.getMeTokenInfo(meToken);
77-
HubInfo memory hubInfo = IHubFacet(diamond).getHubInfo(
78-
meTokenInfo.hubId
79-
);
77+
8078
if (
81-
usts.fee != 0 && // this is to ensure the meToken is resubscribing
79+
usts.fee != 0 && // make sure meToken is in a state of resubscription
8280
block.timestamp > meTokenInfo.startTime && // swap can only happen after resubscribe
8381
!usts.started // should skip if already started
8482
) {
85-
ISingleAssetVault(hubInfo.vault).startMigration(meToken);
83+
ISingleAssetVault(
84+
IHubFacet(diamond).getHubInfo(meTokenInfo.hubId).vault
85+
).startMigration(meToken);
8686
usts.started = true;
8787
_swap(meToken);
8888
}
@@ -93,22 +93,19 @@ contract UniswapSingleTransferMigration is ReentrancyGuard, Vault, IMigration {
9393
external
9494
override
9595
nonReentrant
96-
returns (uint256 amountOut)
96+
onlyDiamond
9797
{
98-
require(msg.sender == diamond, "!diamond");
99-
UniswapSingleTransfer storage usts = _uniswapSingleTransfers[meToken];
100-
10198
MeTokenInfo memory meTokenInfo = IMeTokenRegistryFacet(diamond)
10299
.getMeTokenInfo(meToken);
103-
HubInfo memory hubInfo = IHubFacet(diamond).getHubInfo(
104-
meTokenInfo.hubId
105-
);
106100
HubInfo memory targetHubInfo = IHubFacet(diamond).getHubInfo(
107101
meTokenInfo.targetHubId
108102
);
109103

110-
if (!usts.started) {
111-
ISingleAssetVault(hubInfo.vault).startMigration(meToken);
104+
uint256 amountOut;
105+
if (!_uniswapSingleTransfers[meToken].started) {
106+
ISingleAssetVault(
107+
IHubFacet(diamond).getHubInfo(meTokenInfo.hubId).vault
108+
).startMigration(meToken);
112109
amountOut = _swap(meToken);
113110
} else {
114111
// No swap, amountOut = amountIn
@@ -206,8 +203,6 @@ contract UniswapSingleTransferMigration is ReentrancyGuard, Vault, IMigration {
206203
sqrtPriceLimitX96: 0
207204
});
208205

209-
usts.swapped = true;
210-
211206
// The call to `exactInputSingle` executes the swap
212207
amountOut = _router.exactInputSingle(params);
213208

test/contracts/migrations/UniswapSingleTransfer.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,9 @@ const setup = async () => {
6464
let encodedVaultDAIArgs: string;
6565
let encodedVaultWETHArgs: string;
6666
let block;
67-
let migrationDetails: [number, boolean, boolean] & {
67+
let migrationDetails: [number, boolean] & {
6868
fee: number;
6969
started: boolean;
70-
swapped: boolean;
7170
};
7271

7372
before(async () => {
@@ -337,7 +336,6 @@ const setup = async () => {
337336
.to.emit(meTokenRegistry, "UpdateBalances");
338337
migrationDetails = await migration.getDetails(meToken.address);
339338
expect(migrationDetails.started).to.be.equal(true);
340-
expect(migrationDetails.swapped).to.be.equal(true);
341339
});
342340
it("should be able to call when migration already started, but wont run startMigration()", async () => {
343341
const tx = await migration.poke(meToken.address);
@@ -380,7 +378,6 @@ const setup = async () => {
380378
migrationDetails = await migration.getDetails(meToken.address);
381379
expect(migrationDetails.fee).to.equal(0);
382380
expect(migrationDetails.started).to.equal(false);
383-
expect(migrationDetails.swapped).to.equal(false);
384381
});
385382
it("should revert before endTime", async () => {
386383
let meTokenRegistryDetails = await meTokenRegistry.getMeTokenInfo(
@@ -455,7 +452,6 @@ const setup = async () => {
455452
migrationDetails = await migration.getDetails(meToken.address);
456453
expect(migrationDetails.fee).to.equal(0);
457454
expect(migrationDetails.started).to.equal(false);
458-
expect(migrationDetails.swapped).to.equal(false);
459455
});
460456

461457
describe("During resubscribe", () => {

0 commit comments

Comments
 (0)