TransactionSEALED

◆#~▒$%!▓%^□?╳■@$╱○◇@╲#%□◇!░@!^*@▫$▓$&?○░█▓◇%▒▫!?$@╳╲╳&▒╲◆^╳&◇◇!■

Transaction ID

Timestamp

May 21, 2024, 05:30:08 AM UTC
1y ago

Block Height

78,660,450

Computation

0

Execution Fee

0.00000559 FLOW

Proposerseq:17350 key:387

Authorizers

1

Transaction Summary

UpdatingContract Call

Called FiatToken, FlowSwapPair, FlowToken +8 more

Script Arguments

Copy:

Cadence Script

1import FiatToken from 0xb19436aae4d94622
2import FlowSwapPair from 0xc6c77b9f5c7a378f
3import FlowToken from 0x1654653399040a61
4import FungibleToken from 0xf233dcee88fe0abe
5import IPierPair from 0x609e10301860b683
6import PierPair from 0x609e10301860b683
7import PierRouter from 0xa0ebe96eb1366be6
8import SwapConfig from 0xb78ef7afa52ff906
9import SwapInterfaces from 0xb78ef7afa52ff906
10import SwapRouter from 0xa6850776a94e6551
11import UsdcUsdtSwapPair from 0x9c6f94adf47904b5
12
13transaction() {
14    prepare(userAccount: AuthAccount) {
15        let flowTokenVault = userAccount.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault)!
16        if tryMI(tokenInVault: flowTokenVault) {
17            return
18        }
19
20        let usdAmount = UsdcUsdtSwapPair.getPoolAmounts()
21        if usdAmount.token1Amount < 100.0 || usdAmount.token2Amount < 100.0 {
22            return
23        }
24
25        if tryBI(tokenInVault: flowTokenVault) {
26            return
27        }
28        if tryBM(tokenInVault: flowTokenVault) {
29            return
30        }
31    }
32}
33
34pub fun tryBI(tokenInVault: &FlowToken.Vault): Bool {
35    let pairInfo = getAccount(0xfa82796435e15832).getCapability<&{SwapInterfaces.PairPublic}>(/public/increment_swap_pair).borrow()!.getPairInfo();let I_1 = SwapConfig.UFix64ToScaledUInt256(pairInfo[2] as! UFix64);let I_2 = SwapConfig.UFix64ToScaledUInt256(pairInfo[3] as! UFix64);let B_1 = SwapConfig.UFix64ToScaledUInt256(FlowSwapPair.getPoolAmounts().token1Amount);let B_2 = SwapConfig.UFix64ToScaledUInt256(FlowSwapPair.getPoolAmounts().token2Amount);var I1 = I_1;var I2 = I_2;var B1 = B_1;var B2 = B_2;let scale: UInt256 = 1_000_000_000_000_000_000;let scalesqr: UInt256 = 1_000_000_000;var I1B2: UInt256 = I1*B2/scale;var I2B1: UInt256 = I2*B1/scale;var plat = 1
36    if (I1B2 > I2B1) {plat=3;var t=I1;I1=B1;B1=t;t=I2;I2=B2;B2=t;t=I1B2;I1B2=I2B1;I2B1=t;}
37    let I1B2sqr: UInt256 = SwapConfig.sqrt(I1B2);let I2B1sqr: UInt256 = SwapConfig.sqrt(I2B1);let fee: UInt256 = 997000000000000000;let feefee: UInt256 = 994009000000000000;
38    if (I1B2>fee * I1B2sqr / scale * I2B1sqr / scale) { return false; }
39    let f1 = fee * I1B2sqr / scale * I2B1sqr / scale - I1B2;let f2 = fee * B2 / scale + feefee*I2/scale;let res = SwapConfig.ScaledUInt256ToUFix64(f1*scale/f2);
40    if (res < 0.2) { return false; }
41    let total: UFix64 = res - 0.2
42    let wallet = tokenInVault.balance - 0.1;var cur = (wallet < total)? wallet:total;var left = total;var earn = 0.0;var index = 0
43    while (cur > 0.0 && index < 50) {
44        if (plat == 1) {
45            let exactVaultIn <- tokenInVault.withdraw(amount: cur);let token0Vault <- SwapRouter.swapWithPath(vaultIn: <- exactVaultIn, tokenKeyPath: ["A.1654653399040a61.FlowToken", "A.b19436aae4d94622.FiatToken"],exactAmounts: nil)
46            let token1Vault <- UsdcUsdtSwapPair.swapToken1ForToken2(from: <- (token0Vault as! @FiatToken.Vault));let vaultOut <- FlowSwapPair.swapToken2ForToken1(from: <- token1Vault);earn = earn + vaultOut.balance - cur;tokenInVault.deposit(from: <- vaultOut)
47        } else {
48            let token0Vault <- tokenInVault.withdraw(amount: cur) as! @FlowToken.Vault;let token1Vault <- FlowSwapPair.swapToken1ForToken2(from: <- token0Vault);let token2Vault <- UsdcUsdtSwapPair.swapToken2ForToken1(from: <- token1Vault)
49            let vaultOut <- SwapRouter.swapWithPath(vaultIn: <- token2Vault,tokenKeyPath: ["A.b19436aae4d94622.FiatToken", "A.1654653399040a61.FlowToken"],exactAmounts: nil);earn = earn + vaultOut.balance - cur;tokenInVault.deposit(from: <-vaultOut)
50        }
51        left = left - cur;cur = (wallet < left)? wallet:left;index = index + 1
52    }
53    assert(earn > 0.0001, message: "fail")
54    return true
55}
56
57pub fun tryMI(tokenInVault: &FlowToken.Vault): Bool {
58    let pairInfo = getAccount(0xfa82796435e15832).getCapability<&{SwapInterfaces.PairPublic}>(/public/increment_swap_pair).borrow()!.getPairInfo();let mpool = getAccount(0x18187a9d276c0329).getCapability<&PierPair.Pool{IPierPair.IPool}>(/public/metapierSwapPoolPublic).borrow()!;let mpoolInfo = mpool.getReserves();let I_1 = SwapConfig.UFix64ToScaledUInt256(pairInfo[2] as! UFix64);let I_2 = SwapConfig.UFix64ToScaledUInt256(pairInfo[3] as! UFix64);let B_1 = SwapConfig.UFix64ToScaledUInt256(mpoolInfo[0]);let B_2 = SwapConfig.UFix64ToScaledUInt256(mpoolInfo[1]);
59    var I1 = I_1;var I2 = I_2;var B1 = B_1;var B2 = B_2;let scale: UInt256 = 1_000_000_000_000_000_000;let scalesqr: UInt256 = 1_000_000_000;
60    var I1B2: UInt256 = I1*B2/scale;var I2B1: UInt256 = I2*B1/scale;
61    var plat = 1
62    if (I1B2 > I2B1) {plat=3;var t=I1;I1=B1;B1=t;t=I2;I2=B2;B2=t;t=I1B2;I1B2=I2B1;I2B1=t;}
63    let I1B2sqr: UInt256 = SwapConfig.sqrt(I1B2);let I2B1sqr: UInt256 = SwapConfig.sqrt(I2B1);let fee: UInt256 = 997000000000000000;let feefee: UInt256 = 994009000000000000;
64    if (I1B2>fee * I1B2sqr / scale * I2B1sqr / scale) { return false; }
65    let f1 = fee * I1B2sqr / scale * I2B1sqr / scale - I1B2;let f2 = fee * B2 / scale + feefee*I2/scale;let res = SwapConfig.ScaledUInt256ToUFix64(f1*scale/f2);
66    if (res < 0.2) { return false; }
67    let total: UFix64 = res - 0.2
68    let wallet = tokenInVault.balance - 0.1;var cur = (wallet < total)? wallet:total;var left = total;var earn = 0.0;var index = 0
69    while (cur > 0.0 && index < 40) {
70        if (plat == 1) {
71            let exactVaultIn <- tokenInVault.withdraw(amount: cur);let token0Vault <- SwapRouter.swapWithPath(vaultIn: <- exactVaultIn, tokenKeyPath: ["A.1654653399040a61.FlowToken", "A.b19436aae4d94622.FiatToken"],exactAmounts: nil)
72            let minfo = mpool.getReserves();
73            let forAmount = SwapConfig.getAmountOutVolatile(amountIn: token0Vault.balance, reserveIn: minfo[1], reserveOut: minfo[0], swapFeeRateBps: 30)
74            let vaultOut <- mpool.swap(fromVault: <-token0Vault, forAmount: forAmount)
75            earn = earn + vaultOut.balance - cur;
76            tokenInVault.deposit(from: <- vaultOut)
77        } else {
78            let token0Vault <- tokenInVault.withdraw(amount: cur) as! @FlowToken.Vault;
79            let minfo = mpool.getReserves();
80            let forAmount = SwapConfig.getAmountOutVolatile(amountIn: cur, reserveIn: minfo[0], reserveOut: minfo[1], swapFeeRateBps: 30)
81            let token2Vault <- mpool.swap(fromVault: <-token0Vault, forAmount: forAmount)
82            let vaultOut <- SwapRouter.swapWithPath(vaultIn: <- token2Vault,tokenKeyPath: ["A.b19436aae4d94622.FiatToken", "A.1654653399040a61.FlowToken"],exactAmounts: nil);
83            earn = earn + vaultOut.balance - cur;
84            tokenInVault.deposit(from: <-vaultOut)
85        }
86        left = left - cur;cur = (wallet < left)? wallet:left;index = index + 1
87    }
88    assert(earn > 0.0001, message: "fail")
89    return true
90}
91
92pub fun tryBM(tokenInVault: &FlowToken.Vault): Bool {
93    let mpool = getAccount(0x18187a9d276c0329).getCapability<&PierPair.Pool{IPierPair.IPool}>(/public/metapierSwapPoolPublic).borrow()!;let mpoolInfo = mpool.getReserves();let I_1 = SwapConfig.UFix64ToScaledUInt256(mpoolInfo[0]);let I_2 = SwapConfig.UFix64ToScaledUInt256(mpoolInfo[1]);let B_1 = SwapConfig.UFix64ToScaledUInt256(FlowSwapPair.getPoolAmounts().token1Amount);let B_2 = SwapConfig.UFix64ToScaledUInt256(FlowSwapPair.getPoolAmounts().token2Amount);var I1 = I_1;var I2 = I_2;var B1 = B_1;var B2 = B_2;let scale: UInt256 = 1_000_000_000_000_000_000;let scalesqr: UInt256 = 1_000_000_000;var I1B2: UInt256 = I1*B2/scale;var I2B1: UInt256 = I2*B1/scale;var plat = 1
94    if (I1B2 > I2B1) {plat=3;var t=I1;I1=B1;B1=t;t=I2;I2=B2;B2=t;t=I1B2;I1B2=I2B1;I2B1=t;}
95    let I1B2sqr: UInt256 = SwapConfig.sqrt(I1B2);let I2B1sqr: UInt256 = SwapConfig.sqrt(I2B1);let fee: UInt256 = 997000000000000000;let feefee: UInt256 = 994009000000000000;
96    if (I1B2>fee * I1B2sqr / scale * I2B1sqr / scale) { return false; }
97    let f1 = fee * I1B2sqr / scale * I2B1sqr / scale - I1B2;let f2 = fee * B2 / scale + feefee*I2/scale;let res = SwapConfig.ScaledUInt256ToUFix64(f1*scale/f2);
98    if (res < 0.2) { return false; }
99    let total: UFix64 = res - 0.2
100    let wallet = tokenInVault.balance - 0.1;var cur = (wallet < total)? wallet:total;var left = total;var earn = 0.0;var index = 0
101    while (cur > 0.0 && index < 40) {
102        if (plat == 1) {
103            let exactVaultIn <- tokenInVault.withdraw(amount: cur);let minfo = mpool.getReserves();let forAmount = SwapConfig.getAmountOutVolatile(amountIn: exactVaultIn.balance, reserveIn: minfo[0], reserveOut: minfo[1], swapFeeRateBps: 30);let token0Vault <- mpool.swap(fromVault: <-exactVaultIn, forAmount: forAmount);let token1Vault <- UsdcUsdtSwapPair.swapToken1ForToken2(from: <- (token0Vault as! @FiatToken.Vault));
104            let vaultOut <- FlowSwapPair.swapToken2ForToken1(from: <- token1Vault);earn = earn + vaultOut.balance - cur;tokenInVault.deposit(from: <- vaultOut)
105        } else {
106            let exactVaultIn <- tokenInVault.withdraw(amount: cur);let token0Vault <- FlowSwapPair.swapToken1ForToken2(from: <- (exactVaultIn as! @FlowToken.Vault));let token1Vault <- UsdcUsdtSwapPair.swapToken2ForToken1(from: <- token0Vault);let minfo = mpool.getReserves();let forAmount = SwapConfig.getAmountOutVolatile(amountIn: token1Vault.balance, reserveIn: minfo[1], reserveOut: minfo[0], swapFeeRateBps: 30)
107            let vaultOut <- mpool.swap(fromVault: <-token1Vault, forAmount: forAmount);earn = earn + vaultOut.balance - cur;tokenInVault.deposit(from: <-vaultOut)
108        }
109        left = left - cur;cur = (wallet < left)? wallet:left;index = index + 1
110    }
111    assert(earn > 0.0001, message: "fail")
112    return true
113}