Smart Contract

FlashloanUSDCMigration

A.3ddb31a3880d1d8f.FlashloanUSDCMigration

Valid From

85,074,152

Deployed

2d ago
Feb 26, 2026, 05:37:38 AM UTC

Dependents

0 imports
1import FungibleToken from 0xf233dcee88fe0abe
2import SwapConfig from 0xb78ef7afa52ff906
3import USDCFlow from 0xf1ab99c82dee3526
4import SwapInterfaces from 0xb78ef7afa52ff906
5import LendingInterfaces from 0x2df970b6cdee5735
6import LendingConfig from 0x2df970b6cdee5735
7
8pub contract FlashloanUSDCMigration {
9    pub resource FlashloanExecutor: SwapInterfaces.FlashLoanExecutor {
10        pub fun executeAndRepay(loanedToken: @FungibleToken.Vault, params: {String: AnyStruct}): @FungibleToken.Vault {
11            let usdcfLendingPool = getAccount(0x1113980ca45d1d37).getCapability<&{LendingInterfaces.PoolPublic}>(LendingConfig.PoolPublicPublicPath).borrow()!
12            let usdcLendingPool = getAccount(0x8334275bda13b2be).getCapability<&{LendingInterfaces.PoolPublic}>(LendingConfig.PoolPublicPublicPath).borrow()!
13            
14            let supplierAddr: Address = params["supplierAddr"]! as! Address
15            let userCertificateCap: Capability<&{LendingInterfaces.IdentityCertificate}> = params["certificateCap"]! as! Capability<&{LendingInterfaces.IdentityCertificate}>
16            let loanedAmount = loanedToken.balance
17            // supply usdcf
18            usdcfLendingPool.supply(supplierAddr: supplierAddr, inUnderlyingVault: <-loanedToken)
19            // redeem usdc
20            let usdcVault <- usdcLendingPool.redeemUnderlying(userCertificateCap: userCertificateCap, numUnderlyingToRedeem: UFix64.max)
21            // wrap usdc
22            let usdcfVault <- USDCFlow.createEmptyVault()
23            let pairUU = getAccount(0x58e93a2b71fa9373).getCapability<&{SwapInterfaces.PairPublic}>(/public/increment_swap_pair).borrow()!
24            let amountDex = pairUU.getAmountOut(amountIn: usdcVault.balance, tokenInKey: "A.b19436aae4d94622.FiatToken")
25            if amountDex >= usdcVault.balance {
26                let swapUsdcf <- pairUU.swap(vaultIn: <-usdcVault, exactAmountOut: nil)
27                usdcfVault.deposit(from: <- swapUsdcf)
28            } else {
29                let wrappedUSDCVault <- USDCFlow.wrapFiatToken(<- usdcVault)
30                usdcfVault.deposit(from: <- wrappedUSDCVault)
31            }
32
33            // supply usdcf
34            usdcfLendingPool.supply(supplierAddr: supplierAddr, inUnderlyingVault: <-usdcfVault)
35            // redeem usdcf to repay flashloan
36            let usdcfRepayVault <- usdcfLendingPool.redeemUnderlying(userCertificateCap: userCertificateCap, numUnderlyingToRedeem: loanedAmount)
37
38            return <-usdcfRepayVault
39        }
40    }
41
42    init() {
43        self.account.save(<- create FlashloanExecutor(), to: /storage/flashloanUSDCMigration)
44        self.account.link<&{SwapInterfaces.FlashLoanExecutor}>(/public/flashloanUSDCMigration, target: /storage/flashloanUSDCMigration)
45    }
46}