Skip to content

Commit 101ac80

Browse files
committed
finish dust account
1 parent 5fc7031 commit 101ac80

File tree

5 files changed

+150
-137
lines changed

5 files changed

+150
-137
lines changed

src/swapService/config/mainnet.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const mainnetRoutingConfig: ChainRoutingConfig = [
5151
strategy: StrategyERC4626Wrapper.name(),
5252
match: {
5353
tokensInOrOut: [
54+
SUSDS_MAINNET,
5455
WSTUSR_MAINNET,
5556
PT_WSTUSR1740182579,
5657
YNETH_MAINNET,

src/swapService/strategies/strategyERC4626Wrapper.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ export class StrategyERC4626Wrapper {
433433
const withdrawAmount = adjustForInterest(swapParams.amount)
434434

435435
const {
436-
swapMulticallItem: withdrawMulticallItem,
436+
data: withdrawData,
437437
amountIn,
438438
amountOut,
439439
} = await encodeWithdraw(
@@ -443,7 +443,10 @@ export class StrategyERC4626Wrapper {
443443
swapParams.from,
444444
)
445445

446-
const multicallItems = [withdrawMulticallItem]
446+
const multicallItems = encodeTargetDebtAsExactInMulticall(
447+
swapParams,
448+
withdrawData,
449+
)
447450
const swap = buildApiResponseSwap(swapParams.from, multicallItems)
448451

449452
const verify = buildApiResponseVerifyDebtMax(
@@ -551,7 +554,7 @@ export class StrategyERC4626Wrapper {
551554
const mintAmount = adjustForInterest(swapParams.amount)
552555

553556
const {
554-
swapMulticallItem: mintMulticallItem,
557+
data: mintData,
555558
amountIn,
556559
amountOut,
557560
} = await encodeMint(
@@ -560,9 +563,12 @@ export class StrategyERC4626Wrapper {
560563
mintAmount,
561564
swapParams.from,
562565
)
566+
const multicallItems = encodeTargetDebtAsExactInMulticall(
567+
swapParams,
568+
mintData,
569+
)
563570

564571
// mint is encoded in target debt mode, so repay will happen automatically
565-
const multicallItems = [mintMulticallItem]
566572

567573
const swap = buildApiResponseSwap(swapParams.from, multicallItems)
568574

@@ -634,7 +640,7 @@ export class StrategyERC4626Wrapper {
634640
tokenOut,
635641
receiver: swapParams.from,
636642
onlyFixedInputExactOut: true, // this option will overswap, which should cover growing exchange rate
637-
encodeExactOut: true,
643+
noRepayEncoding: true,
638644
}
639645

640646
const innerQuotes = await runPipeline(innerSwapParams)
@@ -817,6 +823,7 @@ export async function encodeWithdraw(
817823
amountIn,
818824
amountOut,
819825
swapMulticallItem,
826+
data: swapData,
820827
}
821828
}
822829

src/swapService/strategies/strategyMidas.ts

Lines changed: 135 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
encodeDepositMulticallItem,
2525
encodeERC20TransferMulticallItem,
2626
encodeSwapMulticallItem,
27+
encodeTargetDebtAsExactInMulticall,
2728
findToken,
2829
isExactInRepay,
2930
matchParams,
@@ -493,7 +494,7 @@ export class StrategyMidas {
493494
const redeemAmount = (swapParams.amount * 100_001n) / 100_000n // a bit extra for accrued interest
494495

495496
const {
496-
swapMulticallItem: redeemInstantMulticallItem,
497+
data: redeemData,
497498
amountIn,
498499
amountOut,
499500
} = await this.encodeMTBILLRedeemInstant(
@@ -503,7 +504,10 @@ export class StrategyMidas {
503504
mToken.paymentToken,
504505
)
505506

506-
const multicallItems = [redeemInstantMulticallItem]
507+
const multicallItems = encodeTargetDebtAsExactInMulticall(
508+
swapParams,
509+
redeemData,
510+
)
507511

508512
const swap = buildApiResponseSwap(swapParams.from, multicallItems)
509513

@@ -605,141 +609,140 @@ export class StrategyMidas {
605609
}
606610

607611
async targetDebtFromPaymentTokenToMToken(
608-
swapParams: SwapParams,
612+
_swapParams: SwapParams,
609613
): Promise<SwapApiResponse[]> {
610-
const mToken = this.getMToken(swapParams)
611-
612-
const depositInstantAmount = adjustForInterest(swapParams.amount)
613-
614-
const {
615-
swapMulticallItem: depositInstantMulticallItem,
616-
amountIn,
617-
amountOut,
618-
} = await this.encodeMTBILLDepositInstant(
619-
swapParams,
620-
depositInstantAmount,
621-
true,
622-
mToken.paymentToken,
623-
)
624-
625-
// deposit instant is encoded in target debt mode, so repay will happen automatically
626-
const multicallItems = [depositInstantMulticallItem]
627-
628-
const swap = buildApiResponseSwap(swapParams.from, multicallItems)
629-
630-
const verify = buildApiResponseVerifyDebtMax(
631-
swapParams.chainId,
632-
swapParams.receiver,
633-
swapParams.accountOut,
634-
swapParams.targetDebt,
635-
swapParams.deadline,
614+
throw new Error(
615+
"Untested dust account update after making mTokens non-borrowable",
636616
)
637-
638-
return [
639-
{
640-
amountIn: String(amountIn),
641-
amountInMax: String(amountIn),
642-
amountOut: String(amountOut),
643-
amountOutMin: String(amountOut),
644-
vaultIn: swapParams.vaultIn,
645-
receiver: swapParams.receiver,
646-
accountIn: swapParams.accountIn,
647-
accountOut: swapParams.accountOut,
648-
tokenIn: swapParams.tokenIn,
649-
tokenOut: swapParams.tokenOut,
650-
slippage: swapParams.slippage,
651-
route: [MIDAS_ROUTE],
652-
swap,
653-
verify,
654-
},
655-
]
617+
// const mToken = this.getMToken(swapParams)
618+
619+
// const depositInstantAmount = adjustForInterest(swapParams.amount)
620+
621+
// const {
622+
// data: depositData,
623+
// amountIn,
624+
// amountOut,
625+
// } = await this.encodeMTBILLDepositInstant(
626+
// swapParams,
627+
// depositInstantAmount,
628+
// true,
629+
// mToken.paymentToken,
630+
// )
631+
632+
// const multicallItems = encodeTargetDebtAsExactInMulticall(swapParams, depositData)
633+
634+
// const swap = buildApiResponseSwap(swapParams.from, multicallItems)
635+
636+
// const verify = buildApiResponseVerifyDebtMax(
637+
// swapParams.chainId,
638+
// swapParams.receiver,
639+
// swapParams.accountOut,
640+
// swapParams.targetDebt,
641+
// swapParams.deadline,
642+
// )
643+
644+
// return [
645+
// {
646+
// amountIn: String(amountIn),
647+
// amountInMax: String(amountIn),
648+
// amountOut: String(amountOut),
649+
// amountOutMin: String(amountOut),
650+
// vaultIn: swapParams.vaultIn,
651+
// receiver: swapParams.receiver,
652+
// accountIn: swapParams.accountIn,
653+
// accountOut: swapParams.accountOut,
654+
// tokenIn: swapParams.tokenIn,
655+
// tokenOut: swapParams.tokenOut,
656+
// slippage: swapParams.slippage,
657+
// route: [MIDAS_ROUTE],
658+
// swap,
659+
// verify,
660+
// },
661+
// ]
656662
}
657663

658664
async targetDebtFromAnyToMToken(
659-
swapParams: SwapParams,
665+
_swapParams: SwapParams,
660666
): Promise<SwapApiResponse[]> {
661-
const mToken = this.getMToken(swapParams)
662-
663-
const targetDeposit = adjustForInterest(swapParams.amount)
664-
665-
const depositSwapParams = {
666-
...swapParams,
667-
tokenIn: findToken(
668-
swapParams.chainId,
669-
mToken.paymentToken,
670-
) as TokenListItem,
671-
vaultIn: mToken.paymentTokenSweepVault,
672-
accountIn: swapParams.dustAccount,
673-
}
674-
const {
675-
swapMulticallItem: depositInstantMulticallItem,
676-
amountIn: depositInstantAmountIn,
677-
amountOut,
678-
} = await this.encodeMTBILLDepositInstant(
679-
depositSwapParams,
680-
targetDeposit,
681-
true,
682-
mToken.paymentToken,
683-
)
684-
685-
const innerSwapParams = {
686-
...swapParams,
687-
amount: depositInstantAmountIn,
688-
tokenOut: findToken(
689-
swapParams.chainId,
690-
mToken.paymentToken,
691-
) as TokenListItem,
692-
receiver: swapParams.from,
693-
onlyFixedInputExactOut: true, // this option will overswap, which should cover growing exchange rate
694-
}
695-
696-
const innerQuotes = await runPipeline(innerSwapParams)
697-
698-
return Promise.all(
699-
innerQuotes.map(async (innerQuote) => {
700-
// re-encode inner swap from target debt to exact out so that repay is not executed before mint TODO fix with exact out support in all strategies
701-
const innerSwapItems = innerQuote.swap.multicallItems.map((item) => {
702-
if (item.functionName !== "swap") return item
703-
704-
const newItem = encodeSwapMulticallItem({
705-
...item.args[0],
706-
mode: BigInt(SwapperMode.EXACT_OUT),
707-
})
708-
709-
return newItem
710-
})
711-
712-
// repay is done through deposit item, which will return unused input, which is the intermediate asset
713-
const multicallItems = [...innerSwapItems, depositInstantMulticallItem]
714-
715-
const swap = buildApiResponseSwap(swapParams.from, multicallItems)
716-
717-
const verify = buildApiResponseVerifyDebtMax(
718-
swapParams.chainId,
719-
swapParams.receiver,
720-
swapParams.accountOut,
721-
swapParams.targetDebt,
722-
swapParams.deadline,
723-
)
724-
725-
return {
726-
amountIn: String(innerQuote.amountIn),
727-
amountInMax: String(innerQuote.amountInMax),
728-
amountOut: String(amountOut),
729-
amountOutMin: String(amountOut),
730-
vaultIn: swapParams.vaultIn,
731-
receiver: swapParams.receiver,
732-
accountIn: swapParams.accountIn,
733-
accountOut: swapParams.accountOut,
734-
tokenIn: swapParams.tokenIn,
735-
tokenOut: swapParams.tokenOut,
736-
slippage: swapParams.slippage,
737-
route: [...innerQuote.route, MIDAS_ROUTE],
738-
swap,
739-
verify,
740-
}
741-
}),
667+
throw new Error(
668+
"Untested dust account update after making mTokens non-borrowable",
742669
)
670+
// const mToken = this.getMToken(swapParams)
671+
672+
// const targetDeposit = adjustForInterest(swapParams.amount)
673+
674+
// const depositSwapParams = {
675+
// ...swapParams,
676+
// tokenIn: findToken(
677+
// swapParams.chainId,
678+
// mToken.paymentToken,
679+
// ) as TokenListItem,
680+
// vaultIn: mToken.paymentTokenSweepVault,
681+
// accountIn: swapParams.dustAccount,
682+
// }
683+
// const {
684+
// data: depositData,
685+
// amountIn: depositInstantAmountIn,
686+
// amountOut,
687+
// } = await this.encodeMTBILLDepositInstant(
688+
// depositSwapParams,
689+
// targetDeposit,
690+
// true,
691+
// mToken.paymentToken,
692+
// )
693+
694+
// const depositMulticallItems = encodeTargetDebtAsExactInMulticall(
695+
// depositSwapParams,
696+
// depositData,
697+
// )
698+
699+
// const innerSwapParams = {
700+
// ...swapParams,
701+
// amount: depositInstantAmountIn,
702+
// tokenOut: findToken(
703+
// swapParams.chainId,
704+
// mToken.paymentToken,
705+
// ) as TokenListItem,
706+
// receiver: swapParams.from,
707+
// onlyFixedInputExactOut: true, // this option will overswap, which should cover growing exchange rate
708+
// noRepayEncoding: true,
709+
// }
710+
711+
// const innerQuotes = await runPipeline(innerSwapParams)
712+
713+
// return Promise.all(
714+
// innerQuotes.map(async (innerQuote) => {
715+
// // repay is done through deposit item, which will return unused input, which is the intermediate asset
716+
// const multicallItems = [...innerQuote.swap.multicallItems, ...depositMulticallItems]
717+
718+
// const swap = buildApiResponseSwap(swapParams.from, multicallItems)
719+
720+
// const verify = buildApiResponseVerifyDebtMax(
721+
// swapParams.chainId,
722+
// swapParams.receiver,
723+
// swapParams.accountOut,
724+
// swapParams.targetDebt,
725+
// swapParams.deadline,
726+
// )
727+
728+
// return {
729+
// amountIn: String(innerQuote.amountIn),
730+
// amountInMax: String(innerQuote.amountInMax),
731+
// amountOut: String(amountOut),
732+
// amountOutMin: String(amountOut),
733+
// vaultIn: swapParams.vaultIn,
734+
// receiver: swapParams.receiver,
735+
// accountIn: swapParams.accountIn,
736+
// accountOut: swapParams.accountOut,
737+
// tokenIn: swapParams.tokenIn,
738+
// tokenOut: swapParams.tokenOut,
739+
// slippage: swapParams.slippage,
740+
// route: [...innerQuote.route, MIDAS_ROUTE],
741+
// swap,
742+
// verify,
743+
// }
744+
// }),
745+
// )
743746
}
744747

745748
async encodeMTBILLRedeemInstant(
@@ -824,6 +827,7 @@ export class StrategyMidas {
824827
amountIn,
825828
amountOut,
826829
swapMulticallItem,
830+
data: swapData,
827831
}
828832
}
829833

@@ -908,6 +912,7 @@ export class StrategyMidas {
908912
amountOut,
909913
amountIn,
910914
swapMulticallItem,
915+
data: swapData,
911916
}
912917
}
913918

src/swapService/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export interface SwapParams {
2626
dustAccount: Address
2727
routingOverride?: ChainRoutingConfig
2828
onlyFixedInputExactOut?: boolean // only fetch quotes where amountIn is fixed and not subject to slippage
29-
encodeExactOut?: boolean // FIXME workaround for composite repays (ERC4626 strategy / overswap)
29+
noRepayEncoding?: boolean // FIXME workaround for composite repays (ERC4626 strategy / overswap)
3030
}
3131

3232
export interface SwapQuote {

0 commit comments

Comments
 (0)