tx · 66CDrzaGxu2EYDPeh4BYiw5z9B6nToTJdXhdimC2cABw

3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ:  -0.05000000 Gic

2025.06.25 22:50 [6635] smart account 3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ > SELF 0.00000000 Gic

{ "type": 13, "id": "66CDrzaGxu2EYDPeh4BYiw5z9B6nToTJdXhdimC2cABw", "fee": 5000000, "feeAssetId": null, "timestamp": 1750881080125, "version": 2, "chainId": 71, "sender": "3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ", "senderPublicKey": "8dNEACURBe9HFX8kgDH2MVb1mxkFC7Txoqvi4ymdPiNd", "proofs": [ "3H1vWBhe1haSBrzSsysHvVMkaP5Z3St9AjbKSrXee3TmgJE3FpATb7bfGduguXRKxrXEzNHkdBK41cTxZrUpziwQ" ], "script": "base64:AAIFAAAAAAAAAGoIAhIGCgQICAEEEgMKAQgSAwoBBBIGCgQEBAQEEgMKAQESBAoCCAQSBwoFCAgBAQESBAoCCAgSBAoCCAESBQoDCAgIEgQKAggIEgUKAwgIARIFCgMICAESBAoCCAgSBAoCCAgSBQoDCAgBAAAAJgAAAAAEbWFpbgIAAAAKbWFpbl9hc3NldAAAAAAMYWRtaW5BZGRyZXNzAgAAAA1hZG1pbl9hZGRyZXNzAAAAAAJscAIAAAAJbHBfYXNzZXRfAAAAAARwb29sAgAAAAZwb29sX18AAAAABGZhcm0CAAAABmZhcm1fXwAAAAAGc3Rha2VkAgAAAAdzdGFrZWRfAAAAAA1yZXdhcmRDbGFpbWVkAgAAAA9yZXdhcmRfY2xhaW1lZF8AAAAADWRlcG9zaXRIZWlnaHQCAAAAD2RlcG9zaXRfaGVpZ2h0XwAAAAAKZmFybUhlaWdodAIAAAAMZmFybV9oZWlnaHRfAAAAAAt0b3RhbExvY2tlZAIAAAANdG90YWxfbG9ja2VkXwAAAAAHc3dhcEZlZQIAAAAIc3dhcF9mZWUAAAAADmZhcm1SZXdhcmRQb29sAgAAABFmYXJtX3Jld2FyZF9wb29sXwAAAAAHZmFybUFwcgIAAAAJZmFybV9hcHJfAAAAAA5mYXJtTG9ja0Jsb2NrcwIAAAARZmFybV9sb2NrX2Jsb2Nrc18AAAAAD2Zhcm1Ub3RhbFN0YWtlZAIAAAASZmFybV90b3RhbF9zdGFrZWRfAAAAABFibGFja2xpc3RlZFRva2VucwIAAAAMYmxhY2tsaXN0ZWRfAAAAAA50b3RhbFVzZXJzRmFybQIAAAARdG90YWxfdXNlcnNfZmFybV8AAAAAAkQ4AAAAAAAF9eEAAAAAAA9jb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQgFAAAABHRoaXMAAAAFYnl0ZXMAAAAAAmFjAgAAAAhhY3RpdmF0ZQAAAAAGcG9vbEFjAgAAAA5hY3RpdmF0ZV9wb29scwAAAAAGc3dhcEFjAgAAAA1hY3RpdmF0ZV9zd2FwAAAAAAtsaXF1aWRpdHlBYwIAAAASYWN0aXZhdGVfbGlxdWlkaXR5AAAAAAZmYXJtQWMCAAAADmFjdGl2YXRlX2Zhcm1zAQAAAAJrcAAAAAIAAAAGYXNz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IHRva2VuAwkAAAAAAAACCQEAAAAKdmFsaWRQb29sSwAAAAEFAAAAB3Bvb2xLZXkAAAAAAAAAAAAJAAACAAAAAQIAAAATUG9vbCBkb2VzIG5vdCBleGlzdAMJAABnAAAAAgAAAAAAAAAAAAUAAAAIbHBBbW91bnQJAAACAAAAAQIAAAAaTFAgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAAC3Bvb2xBbW91bnQxCQEAAAAGcG9vbEFBAAAAAgUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAAAtwb29sQW1vdW50MgkBAAAABnBvb2xBQQAAAAIFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAANdG90YWxMcFN1cHBseQQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEFAAAACWxwQXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAIBQAAAAFhAAAACHF1YW50aXR5AAAAAAAAAAAABAAAAAdhbW91bnQxCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQxBQAAAA10b3RhbExwU3VwcGx5BAAAAAdhbW91bnQyCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQyBQAAAA10b3RhbExwU3VwcGx5BAAAAApjdXJyZW50S2V5CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAE2N1cnJlbnRBbW91bnRBc3NldDEJAQAAAA11c2VyTGlxdWlkaXR5AAAAAwUAAAAKY3VycmVudEtleQUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAABNjdXJyZW50QW1vdW50QXNzZXQyCQEAAAANdXNlckxpcXVpZGl0eQAAAAMFAAAACmN1cnJlbnRLZXkFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAAPbmV3QW1vdW50QXNzZXQxCQAAZQAAAAIFAAAAE2N1cnJlbnRBbW91bnRBc3NldDEFAAAAB2Ftb3VudDEEAAAAD25ld0Ftb3VudEFzc2V0MgkAAGUAAAACBQAAABNjdXJyZW50QW1vdW50QXNzZXQyBQAAAAdhbW91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", "height": 6635, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: zQ1C4k3jgxS4D65HuWNTZ7MAXHepDJLyQasPq64WLXf Next: FDft5pv3WkPPXfJMdFPz5cUsVBS3t9cXSDCgeoTPd6ns Diff:
OldNewDifferences
459459 let decimalsOut = getAssetDecimals(assetOut)
460460 let feeBps = toBigInt(getIntegerValue(this, swapFee))
461461 let adminAddr = addressFromStringValue(getStringValue(this, adminAddress))
462- if (if ((pmtAssetId == "GIC"))
463- then if ((assetIn == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd"))
464- then true
465- else (assetOut == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd")
466- else false)
467- then throw("Gic-usgt is now avaliable to swap")
468- else if (!(power))
469- then throw("dApp is currently under maintenance")
470- else if (swapActivate)
471- then throw("Swap is currently under maintenance")
472- else if ((pmtAssetId != assetIn))
473- then throw("Payment asset does not match assetIn")
474- else if (!(isValidAsset(assetIn)))
475- then throw("Invalid assetIn")
476- else if (!(isValidAsset(assetOut)))
477- then throw("Invalid assetOut")
478- else if (if (isBlacklisted(assetIn))
479- then true
480- else isBlacklisted(assetOut))
481- then throw("One or both assets are blacklisted")
482- else if ((assetIn == assetOut))
483- then throw("assetIn cannot be equal to assetOut")
484- else if (if (if ((assetIn == "GIC"))
485- then true
486- else (assetOut == "GIC"))
487- then !(acGic)
488- else false)
489- then throw("GIC not allowed")
490- else if ((key == ""))
491- then throw("Pool does not exist")
492- else {
493- let isReverse = (key == reversePoolKey)
494- let poolAsset1 = if (isReverse)
495- then assetOut
496- else assetIn
497- let poolAsset2 = if (isReverse)
498- then assetIn
499- else assetOut
500- let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
501- let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
502- let amountInAdjusted = toBigInt(pmt.amount)
503- let amountOut = if (isReverse)
504- then ((amountInAdjusted * poolAmount1) / poolAmount2)
505- else ((amountInAdjusted * poolAmount2) / poolAmount1)
506- let fee = ((amountOut * feeBps) / toBigInt(10000))
507- let amountOutAfterFee = (amountOut - fee)
508- let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
509- let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
510- if ((minAmountOut > amountOutAfterFee))
511- then throw("Slippage exceeded")
512- else {
513- let newPoolAmount1 = if (isReverse)
514- then (poolAmount1 - amountOut)
515- else (poolAmount1 + amountInAdjusted)
516- let newPoolAmount2 = if (isReverse)
517- then (poolAmount2 + amountInAdjusted)
518- else (poolAmount2 - amountOut)
519- let assettoReceive = if ((assetOut == "GIC"))
520- then unit
521- else fromBase58String(assetOut)
522- let assetOutBytes = if ((assetIn == "GIC"))
523- then unit
524- else fromBase58String(assetIn)
462+ if (!(power))
463+ then throw("dApp is currently under maintenance")
464+ else if (swapActivate)
465+ then throw("Swap is currently under maintenance")
466+ else if ((pmtAssetId != assetIn))
467+ then throw("Payment asset does not match assetIn")
468+ else if (!(isValidAsset(assetIn)))
469+ then throw("Invalid assetIn")
470+ else if (!(isValidAsset(assetOut)))
471+ then throw("Invalid assetOut")
472+ else if (if (isBlacklisted(assetIn))
473+ then true
474+ else isBlacklisted(assetOut))
475+ then throw("One or both assets are blacklisted")
476+ else if ((assetIn == assetOut))
477+ then throw("assetIn cannot be equal to assetOut")
478+ else if (if (if ((assetIn == "GIC"))
479+ then true
480+ else (assetOut == "GIC"))
481+ then !(acGic)
482+ else false)
483+ then throw("GIC not allowed")
484+ else if ((key == ""))
485+ then throw("Pool does not exist")
486+ else {
487+ let isReverse = (key == reversePoolKey)
488+ let poolAsset1 = if (isReverse)
489+ then assetOut
490+ else assetIn
491+ let poolAsset2 = if (isReverse)
492+ then assetIn
493+ else assetOut
494+ let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
495+ let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
496+ let amountInAdjusted = toBigInt(pmt.amount)
497+ let amountOut = if (isReverse)
498+ then ((amountInAdjusted * poolAmount1) / poolAmount2)
499+ else ((amountInAdjusted * poolAmount2) / poolAmount1)
500+ let fee = ((amountOut * feeBps) / toBigInt(10000))
501+ let amountOutAfterFee = (amountOut - fee)
502+ let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
503+ let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
504+ if ((minAmountOut > amountOutAfterFee))
505+ then throw("Slippage exceeded")
506+ else {
507+ let newPoolAmount1 = if (isReverse)
508+ then (poolAmount1 - amountOut)
509+ else (poolAmount1 + amountInAdjusted)
510+ let newPoolAmount2 = if (isReverse)
511+ then (poolAmount2 + amountInAdjusted)
512+ else (poolAmount2 - amountOut)
513+ let assettoReceive = if ((assetOut == "GIC"))
514+ then unit
515+ else fromBase58String(assetOut)
516+ let assetOutBytes = if ((assetIn == "GIC"))
517+ then unit
518+ else fromBase58String(assetIn)
525519 [IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assettoReceive), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
526- }
527- }
520+ }
521+ }
528522 }
529523
530524
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let main = "main_asset"
55
66 let adminAddress = "admin_address"
77
88 let lp = "lp_asset_"
99
1010 let pool = "pool__"
1111
1212 let farm = "farm__"
1313
1414 let staked = "staked_"
1515
1616 let rewardClaimed = "reward_claimed_"
1717
1818 let depositHeight = "deposit_height_"
1919
2020 let farmHeight = "farm_height_"
2121
2222 let totalLocked = "total_locked_"
2323
2424 let swapFee = "swap_fee"
2525
2626 let farmRewardPool = "farm_reward_pool_"
2727
2828 let farmApr = "farm_apr_"
2929
3030 let farmLockBlocks = "farm_lock_blocks_"
3131
3232 let farmTotalStaked = "farm_total_staked_"
3333
3434 let blacklistedTokens = "blacklisted_"
3535
3636 let totalUsersFarm = "total_users_farm_"
3737
3838 let D8 = 100000000
3939
4040 let contractAddress = Address(this.bytes)
4141
4242 let ac = "activate"
4343
4444 let poolAc = "activate_pools"
4545
4646 let swapAc = "activate_swap"
4747
4848 let liquidityAc = "activate_liquidity"
4949
5050 let farmAc = "activate_farms"
5151
5252 func kp (asset1,asset2) = (((pool + asset1) + "_") + asset2)
5353
5454
5555 func fk (asset1,asset2) = (((farm + asset1) + "_") + asset2)
5656
5757
5858 func sk (asset1,asset2,address) = (((staked + kp(asset1, asset2)) + "_") + address)
5959
6060
6161 func rk (asset1,asset2,address) = (((rewardClaimed + kp(asset1, asset2)) + "_") + address)
6262
6363
6464 func dh (asset1,asset2,address) = (((depositHeight + kp(asset1, asset2)) + "_") + address)
6565
6666
6767 func fh (asset1,asset2,address) = (((farmHeight + kp(asset1, asset2)) + "_") + address)
6868
6969
7070 func isValidAsset (assetId) = if ((assetId == "GIC"))
7171 then true
7272 else match assetInfo(fromBase58String(assetId)) {
7373 case a: Asset =>
7474 true
7575 case _ =>
7676 false
7777 }
7878
7979
8080 func isBlacklisted (assetId) = valueOrElse(getBoolean(this, (blacklistedTokens + assetId)), false)
8181
8282
8383 func getAssetDecimals (assetId) = if ((assetId == "GIC"))
8484 then 8
8585 else match assetInfo(fromBase58String(assetId)) {
8686 case a: Asset =>
8787 a.decimals
8888 case _ =>
8989 8
9090 }
9191
9292
9393 func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse " + address) + " as address")))
9494
9595
9696 func validPoolK (key) = match getInteger(this, key) {
9797 case t: Int =>
9898 t
9999 case _ =>
100100 0
101101 }
102102
103103
104104 func poolAA (key,asset) = match getInteger(this, ((key + "_") + asset)) {
105105 case t: Int =>
106106 t
107107 case _ =>
108108 0
109109 }
110110
111111
112112 func userLiquidity (address,key,asset) = match getInteger(this, ((((key + "_") + address) + "_") + asset)) {
113113 case t: Int =>
114114 t
115115 case _ =>
116116 0
117117 }
118118
119119
120120 func getAdminAddress () = if ((valueOrElse(getStringValue(adminAddress), "") == ""))
121121 then throw("Constructor has not been initialized yet!")
122122 else getStringValue(adminAddress)
123123
124124
125125 @Callable(i)
126126 func constructor (MainAssetId,AdminAddress,SwapFeeBps,acceptGic) = if ((i.caller != this))
127127 then throw("Only the contract itself can invoke this function")
128128 else if (!(isValidAsset(MainAssetId)))
129129 then throw("Invalid MainAssetId")
130130 else if ((AdminAddress == ""))
131131 then throw("Invalid AdminAddress")
132132 else if (if ((0 > SwapFeeBps))
133133 then true
134134 else (SwapFeeBps > 1000))
135135 then throw("SwapFeeBps must be between 0 and 1000")
136136 else [StringEntry(main, MainAssetId), StringEntry(adminAddress, AdminAddress), IntegerEntry(swapFee, SwapFeeBps), BooleanEntry(ac, true), BooleanEntry(poolAc, false), BooleanEntry(swapAc, false), BooleanEntry(liquidityAc, false), BooleanEntry(farmAc, false), BooleanEntry("accept_gic", acceptGic)]
137137
138138
139139
140140 @Callable(i)
141141 func changeAdmin (address) = {
142142 let admin = getAdminAddress()
143143 if ((toBase58String(i.caller.bytes) != admin))
144144 then throw("Only the Admin itself can invoke this function.")
145145 else [StringEntry(adminAddress, address)]
146146 }
147147
148148
149149
150150 @Callable(i)
151151 func activate (v) = {
152152 let admin = getAdminAddress()
153153 if ((toBase58String(i.caller.bytes) != admin))
154154 then throw("Only the Admin itself can invoke this function")
155155 else [BooleanEntry(ac, v)]
156156 }
157157
158158
159159
160160 @Callable(i)
161161 func maintenance (pools,swap,stake,farms) = {
162162 let admin = getAdminAddress()
163163 if ((toBase58String(i.caller.bytes) != admin))
164164 then throw("Only the Admin itself can invoke this function")
165165 else [BooleanEntry(poolAc, pools), BooleanEntry(swapAc, swap), BooleanEntry(liquidityAc, stake), BooleanEntry(farmAc, farms)]
166166 }
167167
168168
169169
170170 @Callable(i)
171171 func setSwapFee (feeBps) = {
172172 let admin = getAdminAddress()
173173 if ((toBase58String(i.caller.bytes) != admin))
174174 then throw("Only the Admin itself can invoke this function")
175175 else if (if ((0 > feeBps))
176176 then true
177177 else (feeBps > 1000))
178178 then throw("Fee must be between 0 and 1000 basis points")
179179 else [IntegerEntry(swapFee, feeBps)]
180180 }
181181
182182
183183
184184 @Callable(i)
185185 func blacklistToken (assetId,blacklist) = {
186186 let admin = getAdminAddress()
187187 if ((toBase58String(i.caller.bytes) != admin))
188188 then throw("Only the Admin itself can invoke this function")
189189 else if (if (!(isValidAsset(assetId)))
190190 then (assetId != "GIC")
191191 else false)
192192 then throw("Invalid assetId")
193193 else [BooleanEntry((blacklistedTokens + assetId), blacklist)]
194194 }
195195
196196
197197
198198 @Callable(i)
199199 func createFarm (asset1,asset2,apr,lockBlocks,rewardAmount) = {
200200 let admin = getAdminAddress()
201201 if ((toBase58String(i.caller.bytes) != admin))
202202 then throw("Only the Admin itself can invoke this function")
203203 else if (!(isValidAsset(asset1)))
204204 then throw("Invalid asset1")
205205 else if (!(isValidAsset(asset2)))
206206 then throw("Invalid asset2")
207207 else if ((asset1 == asset2))
208208 then throw("Asset1 cannot be equal to Asset2")
209209 else if ((0 >= apr))
210210 then throw("APR must be positive")
211211 else if ((0 >= lockBlocks))
212212 then throw("Lock blocks must be positive")
213213 else if ((0 >= rewardAmount))
214214 then throw("Reward amount must be positive")
215215 else {
216216 let poolKey = kp(asset1, asset2)
217217 if ((validPoolK(poolKey) == 0))
218218 then throw("Pool does not exist")
219219 else {
220220 let farmKey = fk(asset1, asset2)
221221 [IntegerEntry(farmKey, 1), IntegerEntry((farmApr + poolKey), apr), IntegerEntry((farmLockBlocks + poolKey), lockBlocks), IntegerEntry((farmRewardPool + poolKey), rewardAmount), IntegerEntry((farmTotalStaked + poolKey), 0), IntegerEntry((totalUsersFarm + poolKey), 0)]
222222 }
223223 }
224224 }
225225
226226
227227
228228 @Callable(i)
229229 func fundFarm (asset1,asset2) = {
230230 let admin = getAdminAddress()
231231 if ((toBase58String(i.caller.bytes) != admin))
232232 then throw("Only the Admin itself can invoke this function")
233233 else {
234234 let pmt = i.payments[0]
235235 let pmtAssetId = match pmt.assetId {
236236 case a: ByteVector =>
237237 toBase58String(a)
238238 case _ =>
239239 "GIC"
240240 }
241241 if ((toBase58String(i.caller.bytes) != admin))
242242 then throw("Only the Admin itself can invoke this function")
243243 else if ((pmtAssetId != "GIC"))
244244 then throw("Rewards must be in GIC")
245245 else {
246246 let poolKey = kp(asset1, asset2)
247247 let farmKey = fk(asset1, asset2)
248248 if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
249249 then throw("Farm does not exist")
250250 else {
251251 let currentRewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
252252 let newRewardPool = (currentRewardPool + pmt.amount)
253253 [IntegerEntry((farmRewardPool + poolKey), newRewardPool)]
254254 }
255255 }
256256 }
257257 }
258258
259259
260260
261261 @Callable(i)
262262 func changeData (key,data) = {
263263 let admin = getAdminAddress()
264264 if ((toBase58String(i.caller.bytes) != admin))
265265 then throw("Only the Admin itself can invoke this function")
266266 else [IntegerEntry(key, data)]
267267 }
268268
269269
270270
271271 @Callable(i)
272272 func createPool (asset1,asset2,nameLp) = {
273273 let poolKey = kp(asset1, asset2)
274274 let admin = getAdminAddress()
275275 if ((toBase58String(i.caller.bytes) != admin))
276276 then throw("Only the Admin itself can invoke this function")
277277 else if (!(isValidAsset(asset1)))
278278 then throw("Invalid asset1")
279279 else if (!(isValidAsset(asset2)))
280280 then throw("Invalid asset2")
281281 else if ((asset1 == asset2))
282282 then throw("Asset1 cannot be equal to Asset2")
283283 else if (if (isBlacklisted(asset1))
284284 then true
285285 else isBlacklisted(asset2))
286286 then throw("One or both assets are blacklisted")
287287 else if ((validPoolK(poolKey) != 0))
288288 then throw("Pool already exists")
289289 else {
290290 let assetLpCreate = Issue(nameLp, ((("LP asset for pool " + asset1) + "_") + asset2), 1, 8, true)
291291 let idAssetLp = calculateAssetId(assetLpCreate)
292292 [assetLpCreate, StringEntry((lp + poolKey), toBase58String(idAssetLp)), IntegerEntry(poolKey, 1)]
293293 }
294294 }
295295
296296
297297
298298 @Callable(i)
299299 func addLiquidity (asset1,asset2) = {
300300 let power = getBooleanValue(this, ac)
301301 let liquidityPower = getBooleanValue(this, liquidityAc)
302302 let acGic = getBooleanValue(this, "accept_gic")
303303 let poolKey = kp(asset1, asset2)
304304 let pmt1 = i.payments[0]
305305 let pmt2 = i.payments[1]
306306 let asset1Id = match pmt1.assetId {
307307 case a: ByteVector =>
308308 toBase58String(a)
309309 case _ =>
310310 "GIC"
311311 }
312312 let asset2Id = match pmt2.assetId {
313313 case a: ByteVector =>
314314 toBase58String(a)
315315 case _ =>
316316 "GIC"
317317 }
318318 let decimals1 = getAssetDecimals(asset1Id)
319319 let decimals2 = getAssetDecimals(asset2Id)
320320 if (!(power))
321321 then throw("dApp is currently under maintenance")
322322 else if (liquidityPower)
323323 then throw("Liquidity is currently under maintenance")
324324 else if (if ((asset1Id != asset1))
325325 then true
326326 else (asset2Id != asset2))
327327 then throw("Payment assets do not match specified assets")
328328 else if ((asset1 == asset2))
329329 then throw("Asset1 cannot be equal to Asset2")
330330 else if (!(isValidAsset(asset1)))
331331 then throw("Invalid asset1")
332332 else if (!(isValidAsset(asset2)))
333333 then throw("Invalid asset2")
334334 else if (if (isBlacklisted(asset1))
335335 then true
336336 else isBlacklisted(asset2))
337337 then throw("One or both assets are blacklisted")
338338 else if (if (if ((asset1 == "GIC"))
339339 then true
340340 else (asset2 == "GIC"))
341341 then !(acGic)
342342 else false)
343343 then throw("GIC not allowed")
344344 else if ((validPoolK(poolKey) == 0))
345345 then throw("Pool does not exist. Create it first")
346346 else {
347347 let poolAmount1 = poolAA(poolKey, asset1)
348348 let poolAmount2 = poolAA(poolKey, asset2)
349349 let amount1 = pmt1.amount
350350 let amount2 = pmt2.amount
351351 let lpAmount = if (if ((poolAmount1 == 0))
352352 then true
353353 else (poolAmount2 == 0))
354354 then toBigInt(amount1)
355355 else ((toBigInt(amount1) * toBigInt(poolAmount2)) / toBigInt(poolAmount1))
356356 let currentKey = toBase58String(i.caller.bytes)
357357 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
358358 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
359359 let newAmountAsset1 = (toBigInt(currentAmountAsset1) + toBigInt(amount1))
360360 let newAmountAsset2 = (toBigInt(currentAmountAsset2) + toBigInt(amount2))
361361 let newPoolAmount1 = (toBigInt(poolAmount1) + toBigInt(amount1))
362362 let newPoolAmount2 = (toBigInt(poolAmount2) + toBigInt(amount2))
363363 let lpAssetId = getStringValue(this, (lp + poolKey))
364364 let oldAssetLpTotal = valueOrElse(getIntegerValue(poolKey), 0)
365365 let lpAsset = if ((lpAssetId == ""))
366366 then throw("Pool does not have a liquidity pair, contact admin")
367367 else fromBase58String(lpAssetId)
368368 [IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset1), toInt(newAmountAsset1)), IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset2), toInt(newAmountAsset2)), IntegerEntry(((poolKey + "_") + asset1), toInt(newPoolAmount1)), IntegerEntry(((poolKey + "_") + asset2), toInt(newPoolAmount2)), IntegerEntry((((depositHeight + poolKey) + "_") + currentKey), height), IntegerEntry(poolKey, (oldAssetLpTotal + toInt(lpAmount))), Reissue(lpAsset, toInt(lpAmount), true), ScriptTransfer(i.caller, toInt(lpAmount), lpAsset)]
369369 }
370370 }
371371
372372
373373
374374 @Callable(i)
375375 func removeLiquidity (asset1,asset2,lpAmount) = {
376376 let power = getBooleanValue(this, ac)
377377 let liquidityPower = getBooleanValue(this, liquidityAc)
378378 let poolKey = kp(asset1, asset2)
379379 let lpAssetId = getStringValue(this, (lp + poolKey))
380380 let lpAsset = fromBase58String(lpAssetId)
381381 let pmt = i.payments[0]
382382 let pmtAssetId = match pmt.assetId {
383383 case a: ByteVector =>
384384 toBase58String(a)
385385 case _ =>
386386 "GIC"
387387 }
388388 let decimals1 = getAssetDecimals(asset1)
389389 let decimals2 = getAssetDecimals(asset2)
390390 if (!(power))
391391 then throw("dApp is currently under maintenance")
392392 else if (liquidityPower)
393393 then throw("Liquidity is currently under maintenance")
394394 else if ((lpAssetId == ""))
395395 then throw("Invalid LP asset")
396396 else if ((pmtAssetId != lpAssetId))
397397 then throw("Invalid LP token")
398398 else if ((validPoolK(poolKey) == 0))
399399 then throw("Pool does not exist")
400400 else if ((0 >= lpAmount))
401401 then throw("LP amount must be positive")
402402 else {
403403 let poolAmount1 = poolAA(poolKey, asset1)
404404 let poolAmount2 = poolAA(poolKey, asset2)
405405 let totalLpSupply = match assetInfo(fromBase58String(lpAssetId)) {
406406 case a: Asset =>
407407 a.quantity
408408 case _ =>
409409 0
410410 }
411411 let amount1 = ((lpAmount * poolAmount1) / totalLpSupply)
412412 let amount2 = ((lpAmount * poolAmount2) / totalLpSupply)
413413 let currentKey = toBase58String(i.caller.bytes)
414414 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
415415 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
416416 let newAmountAsset1 = (currentAmountAsset1 - amount1)
417417 let newAmountAsset2 = (currentAmountAsset2 - amount2)
418418 if (if ((0 > newAmountAsset1))
419419 then true
420420 else (0 > newAmountAsset2))
421421 then throw("Insufficient liquidity balance")
422422 else {
423423 let newPoolAmount1 = (poolAmount1 - amount1)
424424 let newPoolAmount2 = (poolAmount2 - amount2)
425425 let asset1Bytes = if ((asset1 == "GIC"))
426426 then unit
427427 else fromBase58String(asset1)
428428 let asset2Bytes = if ((asset2 == "GIC"))
429429 then unit
430430 else fromBase58String(asset2)
431431 let oldAssetLpTotal = getIntegerValue(poolKey)
432432 [IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset1), newAmountAsset1), IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset2), newAmountAsset2), IntegerEntry(((poolKey + "_") + asset1), newPoolAmount1), IntegerEntry(((poolKey + "_") + asset2), newPoolAmount2), IntegerEntry(poolKey, (oldAssetLpTotal - lpAmount)), Burn(lpAsset, lpAmount), ScriptTransfer(i.caller, amount1, asset1Bytes), ScriptTransfer(i.caller, amount2, asset2Bytes)]
433433 }
434434 }
435435 }
436436
437437
438438
439439 @Callable(i)
440440 func swap (assetIn,assetOut,maxSlippage) = {
441441 let power = getBooleanValue(this, ac)
442442 let swapActivate = getBooleanValue(this, swapAc)
443443 let acGic = getBooleanValue(this, "accept_gic")
444444 let poolKey = kp(assetIn, assetOut)
445445 let reversePoolKey = kp(assetOut, assetIn)
446446 let key = if ((validPoolK(poolKey) != 0))
447447 then poolKey
448448 else if ((validPoolK(reversePoolKey) != 0))
449449 then reversePoolKey
450450 else ""
451451 let pmt = i.payments[0]
452452 let pmtAssetId = match pmt.assetId {
453453 case a: ByteVector =>
454454 toBase58String(a)
455455 case _ =>
456456 "GIC"
457457 }
458458 let decimalsIn = getAssetDecimals(assetIn)
459459 let decimalsOut = getAssetDecimals(assetOut)
460460 let feeBps = toBigInt(getIntegerValue(this, swapFee))
461461 let adminAddr = addressFromStringValue(getStringValue(this, adminAddress))
462- if (if ((pmtAssetId == "GIC"))
463- then if ((assetIn == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd"))
464- then true
465- else (assetOut == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd")
466- else false)
467- then throw("Gic-usgt is now avaliable to swap")
468- else if (!(power))
469- then throw("dApp is currently under maintenance")
470- else if (swapActivate)
471- then throw("Swap is currently under maintenance")
472- else if ((pmtAssetId != assetIn))
473- then throw("Payment asset does not match assetIn")
474- else if (!(isValidAsset(assetIn)))
475- then throw("Invalid assetIn")
476- else if (!(isValidAsset(assetOut)))
477- then throw("Invalid assetOut")
478- else if (if (isBlacklisted(assetIn))
479- then true
480- else isBlacklisted(assetOut))
481- then throw("One or both assets are blacklisted")
482- else if ((assetIn == assetOut))
483- then throw("assetIn cannot be equal to assetOut")
484- else if (if (if ((assetIn == "GIC"))
485- then true
486- else (assetOut == "GIC"))
487- then !(acGic)
488- else false)
489- then throw("GIC not allowed")
490- else if ((key == ""))
491- then throw("Pool does not exist")
492- else {
493- let isReverse = (key == reversePoolKey)
494- let poolAsset1 = if (isReverse)
495- then assetOut
496- else assetIn
497- let poolAsset2 = if (isReverse)
498- then assetIn
499- else assetOut
500- let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
501- let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
502- let amountInAdjusted = toBigInt(pmt.amount)
503- let amountOut = if (isReverse)
504- then ((amountInAdjusted * poolAmount1) / poolAmount2)
505- else ((amountInAdjusted * poolAmount2) / poolAmount1)
506- let fee = ((amountOut * feeBps) / toBigInt(10000))
507- let amountOutAfterFee = (amountOut - fee)
508- let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
509- let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
510- if ((minAmountOut > amountOutAfterFee))
511- then throw("Slippage exceeded")
512- else {
513- let newPoolAmount1 = if (isReverse)
514- then (poolAmount1 - amountOut)
515- else (poolAmount1 + amountInAdjusted)
516- let newPoolAmount2 = if (isReverse)
517- then (poolAmount2 + amountInAdjusted)
518- else (poolAmount2 - amountOut)
519- let assettoReceive = if ((assetOut == "GIC"))
520- then unit
521- else fromBase58String(assetOut)
522- let assetOutBytes = if ((assetIn == "GIC"))
523- then unit
524- else fromBase58String(assetIn)
462+ if (!(power))
463+ then throw("dApp is currently under maintenance")
464+ else if (swapActivate)
465+ then throw("Swap is currently under maintenance")
466+ else if ((pmtAssetId != assetIn))
467+ then throw("Payment asset does not match assetIn")
468+ else if (!(isValidAsset(assetIn)))
469+ then throw("Invalid assetIn")
470+ else if (!(isValidAsset(assetOut)))
471+ then throw("Invalid assetOut")
472+ else if (if (isBlacklisted(assetIn))
473+ then true
474+ else isBlacklisted(assetOut))
475+ then throw("One or both assets are blacklisted")
476+ else if ((assetIn == assetOut))
477+ then throw("assetIn cannot be equal to assetOut")
478+ else if (if (if ((assetIn == "GIC"))
479+ then true
480+ else (assetOut == "GIC"))
481+ then !(acGic)
482+ else false)
483+ then throw("GIC not allowed")
484+ else if ((key == ""))
485+ then throw("Pool does not exist")
486+ else {
487+ let isReverse = (key == reversePoolKey)
488+ let poolAsset1 = if (isReverse)
489+ then assetOut
490+ else assetIn
491+ let poolAsset2 = if (isReverse)
492+ then assetIn
493+ else assetOut
494+ let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
495+ let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
496+ let amountInAdjusted = toBigInt(pmt.amount)
497+ let amountOut = if (isReverse)
498+ then ((amountInAdjusted * poolAmount1) / poolAmount2)
499+ else ((amountInAdjusted * poolAmount2) / poolAmount1)
500+ let fee = ((amountOut * feeBps) / toBigInt(10000))
501+ let amountOutAfterFee = (amountOut - fee)
502+ let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
503+ let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
504+ if ((minAmountOut > amountOutAfterFee))
505+ then throw("Slippage exceeded")
506+ else {
507+ let newPoolAmount1 = if (isReverse)
508+ then (poolAmount1 - amountOut)
509+ else (poolAmount1 + amountInAdjusted)
510+ let newPoolAmount2 = if (isReverse)
511+ then (poolAmount2 + amountInAdjusted)
512+ else (poolAmount2 - amountOut)
513+ let assettoReceive = if ((assetOut == "GIC"))
514+ then unit
515+ else fromBase58String(assetOut)
516+ let assetOutBytes = if ((assetIn == "GIC"))
517+ then unit
518+ else fromBase58String(assetIn)
525519 [IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assettoReceive), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
526- }
527- }
520+ }
521+ }
528522 }
529523
530524
531525
532526 @Callable(i)
533527 func farmsAddLP (asset1,asset2) = {
534528 let power = getBooleanValue(this, ac)
535529 let farmPower = getBooleanValue(this, farmAc)
536530 let poolKey = kp(asset1, asset2)
537531 let farmKey = fk(asset1, asset2)
538532 let pmt = i.payments[0]
539533 let lpAssetId = getStringValue(this, (lp + poolKey))
540534 let pmtAssetId = match pmt.assetId {
541535 case a: ByteVector =>
542536 toBase58String(a)
543537 case _ =>
544538 "GIC"
545539 }
546540 if (!(power))
547541 then throw("dApp is currently under maintenance")
548542 else if (farmPower)
549543 then throw("Farms are currently under maintenance")
550544 else if ((pmtAssetId != lpAssetId))
551545 then throw("Invalid LP token")
552546 else if ((validPoolK(poolKey) == 0))
553547 then throw("Pool does not exist")
554548 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
555549 then throw("Farm does not exist")
556550 else {
557551 let currentKey = toBase58String(i.caller.bytes)
558552 let stakedKey = sk(asset1, asset2, currentKey)
559553 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
560554 let newStaked = (currentStaked + pmt.amount)
561555 let totalStakedKey = (farmTotalStaked + poolKey)
562556 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
563557 let newTotalStaked = (previousTotalStaked + pmt.amount)
564558 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 0)
565559 let newTotalUsers = if ((currentStaked == 0))
566560 then (totalUsers + 1)
567561 else totalUsers
568562 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(fh(asset1, asset2, currentKey), height)]
569563 }
570564 }
571565
572566
573567
574568 @Callable(i)
575569 func farmsClaimLP (asset1,asset2) = {
576570 let power = getBooleanValue(this, ac)
577571 let farmPower = getBooleanValue(this, farmAc)
578572 let poolKey = kp(asset1, asset2)
579573 let farmKey = fk(asset1, asset2)
580574 let currentKey = toBase58String(i.caller.bytes)
581575 let stakedKey = sk(asset1, asset2, currentKey)
582576 let heightKey = fh(asset1, asset2, currentKey)
583577 let rewardKey = rk(asset1, asset2, currentKey)
584578 if (!(power))
585579 then throw("dApp is currently under maintenance")
586580 else if (farmPower)
587581 then throw("Farms are currently under maintenance")
588582 else if ((validPoolK(poolKey) == 0))
589583 then throw("Pool does not exist")
590584 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
591585 then throw("Farm does not exist")
592586 else {
593587 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
594588 if ((0 >= currentStaked))
595589 then throw("No staked LP tokens")
596590 else {
597591 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
598592 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
599593 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
600594 let apr = getIntegerValue(this, (farmApr + poolKey))
601595 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
602596 let blocksSinceLastClaim = (height - lastClaimHeight)
603597 if ((1 > blocksSinceLastClaim))
604598 then throw("Must wait at least 1 block since last claim")
605599 else {
606600 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
607601 let reward = (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
608602 if ((reward > rewardPool))
609603 then throw("Insufficient reward pool")
610604 else {
611605 let newRewardPool = (rewardPool - reward)
612606 [IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, reward, unit)]
613607 }
614608 }
615609 }
616610 }
617611 }
618612
619613
620614
621615 @Callable(i)
622616 func farmsRemoveLP (asset1,asset2,amount) = {
623617 let power = getBooleanValue(this, ac)
624618 let farmPower = getBooleanValue(this, farmAc)
625619 let poolKey = kp(asset1, asset2)
626620 let farmKey = fk(asset1, asset2)
627621 let lpAssetId = getStringValue(this, (lp + poolKey))
628622 let lpAsset = if ((lpAssetId == ""))
629623 then unit
630624 else fromBase58String(lpAssetId)
631625 let currentKey = toBase58String(i.caller.bytes)
632626 let stakedKey = sk(asset1, asset2, currentKey)
633627 let heightKey = fh(asset1, asset2, currentKey)
634628 let rewardKey = rk(asset1, asset2, currentKey)
635629 if (!(power))
636630 then throw("dApp is currently under maintenance")
637631 else if (farmPower)
638632 then throw("Farms are currently under maintenance")
639633 else if ((validPoolK(poolKey) == 0))
640634 then throw("Pool does not exist")
641635 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
642636 then throw("Farm does not exist")
643637 else {
644638 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
645639 if ((0 >= amount))
646640 then throw("Amount must be positive")
647641 else if ((amount > currentStaked))
648642 then throw("Insufficient staked LP tokens")
649643 else {
650644 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
651645 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
652646 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
653647 let apr = getIntegerValue(this, (farmApr + poolKey))
654648 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
655649 let blocksSinceLastClaim = (height - lastClaimHeight)
656650 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
657651 let reward = if ((blocksSinceLastClaim >= 1))
658652 then (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
659653 else 0
660654 let newRewardPool = (rewardPool - reward)
661655 let newStaked = (currentStaked - amount)
662656 let totalStakedKey = (farmTotalStaked + poolKey)
663657 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
664658 let newTotalStaked = (previousTotalStaked - amount)
665659 let newTotalUsers = if ((newStaked == 0))
666660 then (totalUsers - 1)
667661 else totalUsers
668662 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, amount, lpAsset), ScriptTransfer(i.caller, reward, unit)]
669663 }
670664 }
671665 }
672666
673667
674668 @Verifier(tx)
675669 func verify () = match tx {
676670 case _ =>
677671 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
678672 }
679673

github/gicsportsofficial/g8-explorer
88.15 ms