Smart Contract
FlashloanUSDCMigration
A.3ddb31a3880d1d8f.FlashloanUSDCMigration
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}