TransactionSEALED
◆#~▒$%!▓%^□?╳■@$╱○◇@╲#%□◇!░@!^*@▫$▓$&?○░█▓◇%▒▫!?$@╳╲╳&▒╲◆^╳&◇◇!■
Transaction ID
Execution Fee
0.00000559 FLOWTransaction 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}