tx · 6rSuRar6Pi7vZAL8HtxdFWZLthkwYtgSDSPo38cin9KL

3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ:  -0.05000000 Gic

2025.06.12 05:33 [5868] smart account 3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ > SELF 0.00000000 Gic

{ "type": 13, "id": "6rSuRar6Pi7vZAL8HtxdFWZLthkwYtgSDSPo38cin9KL", "fee": 5000000, "feeAssetId": null, "timestamp": 1749695681675, "version": 2, "chainId": 71, "sender": "3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ", "senderPublicKey": "8dNEACURBe9HFX8kgDH2MVb1mxkFC7Txoqvi4ymdPiNd", "proofs": [ "3CUyUrZMGYeW2PjMfaLFi5PU8efSQRVN2fmCCJ9TCMawYK7AgWMUwBgFCcLZXqe9zCM7dYi7UGrVkwhcagpoVbVG" ], "script": "base64:AAIFAAAAAAAAAGoIAhIGCgQICAEEEgMKAQgSAwoBBBIGCgQEBAQEEgMKAQESBAoCCAQSBwoFCAgBAQESBAoCCAgSBAoCCAESBQoDCAgIEgQKAggIEgUKAwgIARIFCgMICAESBAoCCAgSBAoCCAgSBQoDCAgBAAAAJgAAAAAEbWFpbgIAAAAKbWFpbl9hc3NldAAAAAAMYWRtaW5BZGRyZXNzAgAAAA1hZG1pbl9hZGRyZXNzAAAAAAJscAIAAAAJbHBfYXNzZXRfAAAAAARwb29sAgAAAAZwb29sX18AAAAABGZhcm0CAAAABmZhcm1fXwAAAAAGc3Rha2VkAgAAAAdzdGFrZWRfAAAAAA1yZXdhcmRDbGFpbWVkAgAAAA9yZXdhcmRfY2xhaW1lZF8AAAAADWRlcG9zaXRIZWlnaHQCAAAAD2RlcG9zaXRfaGVpZ2h0XwAAAAAKZmFybUhlaWdodAIAAAAMZmFybV9oZWlnaHRfAAAAAAt0b3RhbExvY2tlZAIAAAANdG90YWxfbG9ja2VkXwAAAAAHc3dhcEZlZQIAAAAIc3dhcF9mZWUAAAAADmZhcm1SZXdhcmRQb29sAgAAABFmYXJtX3Jld2FyZF9wb29sXwAAAAAHZmFybUFwcgIAAAAJZmFybV9hcHJfAAAAAA5mYXJtTG9ja0Jsb2NrcwIAAAARZmFybV9sb2NrX2Jsb2Nrc18AAAAAD2Zhcm1Ub3RhbFN0YWtlZAIAAAASZmFybV90b3RhbF9zdGFrZWRfAAAAABFibGFja2xpc3RlZFRva2VucwIAAAAMYmxhY2tsaXN0ZWRfAAAAAA50b3RhbFVzZXJzRmFybQIAAAARdG90YWxfdXNlcnNfZmFybV8AAAAAAkQ4AAAAAAAF9eEAAAAAAA9jb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQgFAAAABHRoaXMAAAAFYnl0ZXMAAAAAAmFjAgAAAAhhY3RpdmF0ZQAAAAAGcG9vbEFjAgAAAA5hY3RpdmF0ZV9wb29scwAAAAAGc3dhcEFjAgAAAA1hY3RpdmF0ZV9zd2FwAAAAAAtsaXF1aWRpdHlBYwIAAAASYWN0aXZhdGVfbGlxdWlkaXR5AAAAAAZmYXJtQWMCAAAADmFjdGl2YXRlX2Zhcm1zAQAAAAJrcAAAAAIAAAAGYXNz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IHRva2VuAwkAAAAAAAACCQEAAAAKdmFsaWRQb29sSwAAAAEFAAAAB3Bvb2xLZXkAAAAAAAAAAAAJAAACAAAAAQIAAAATUG9vbCBkb2VzIG5vdCBleGlzdAMJAABnAAAAAgAAAAAAAAAAAAUAAAAIbHBBbW91bnQJAAACAAAAAQIAAAAaTFAgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAAC3Bvb2xBbW91bnQxCQEAAAAGcG9vbEFBAAAAAgUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAAAtwb29sQW1vdW50MgkBAAAABnBvb2xBQQAAAAIFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAANdG90YWxMcFN1cHBseQQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEFAAAACWxwQXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAIBQAAAAFhAAAACHF1YW50aXR5AAAAAAAAAAAABAAAAAdhbW91bnQxCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQxBQAAAA10b3RhbExwU3VwcGx5BAAAAAdhbW91bnQyCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQyBQAAAA10b3RhbExwU3VwcGx5BAAAAApjdXJyZW50S2V5CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAE2N1cnJlbnRBbW91bnRBc3NldDEJAQAAAA11c2VyTGlxdWlkaXR5AAAAAwUAAAAKY3VycmVudEtleQUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAABNjdXJyZW50QW1vdW50QXNzZXQyCQEAAAANdXNlckxpcXVpZGl0eQAAAAMFAAAACmN1cnJlbnRLZXkFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAAPbmV3QW1vdW50QXNzZXQxCQAAZQAAAAIFAAAAE2N1cnJlbnRBbW91bnRBc3NldDEFAAAAB2Ftb3VudDEEAAAAD25ld0Ftb3VudEFzc2V0MgkAAGUAAAACBQAAABNjdXJyZW50QW1vdW50QXNzZXQyBQAAAAdhbW91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", "height": 5868, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2VgrB4Ty2mTZj3frzQkKajs4YpuCN13TJjh7DezHecUm Next: zXDYoPmvKbm9JYbMBFc58UDdZdnjP3gqLgdhEwauz3R Diff:
OldNewDifferences
510510 let newPoolAmount2 = if (isReverse)
511511 then (poolAmount2 + amountInAdjusted)
512512 else (poolAmount2 - amountOut)
513- let assetOutBytes = if ((assetOut == "GIC"))
513+ let assetOutBytes = if (((if (isReverse)
514+ then assetIn
515+ else assetOut) == "GIC"))
514516 then unit
515- else fromBase58String(assetOut)
517+ else fromBase58String(if (isReverse)
518+ then assetIn
519+ else assetOut)
516520 [IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
517521 }
518522 }
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))
462462 if (!(power))
463463 then throw("dApp is currently under maintenance")
464464 else if (swapActivate)
465465 then throw("Swap is currently under maintenance")
466466 else if ((pmtAssetId != assetIn))
467467 then throw("Payment asset does not match assetIn")
468468 else if (!(isValidAsset(assetIn)))
469469 then throw("Invalid assetIn")
470470 else if (!(isValidAsset(assetOut)))
471471 then throw("Invalid assetOut")
472472 else if (if (isBlacklisted(assetIn))
473473 then true
474474 else isBlacklisted(assetOut))
475475 then throw("One or both assets are blacklisted")
476476 else if ((assetIn == assetOut))
477477 then throw("assetIn cannot be equal to assetOut")
478478 else if (if (if ((assetIn == "GIC"))
479479 then true
480480 else (assetOut == "GIC"))
481481 then !(acGic)
482482 else false)
483483 then throw("GIC not allowed")
484484 else if ((key == ""))
485485 then throw("Pool does not exist")
486486 else {
487487 let isReverse = (key == reversePoolKey)
488488 let poolAsset1 = if (isReverse)
489489 then assetOut
490490 else assetIn
491491 let poolAsset2 = if (isReverse)
492492 then assetIn
493493 else assetOut
494494 let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
495495 let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
496496 let amountInAdjusted = toBigInt(pmt.amount)
497497 let amountOut = if (isReverse)
498498 then ((amountInAdjusted * poolAmount1) / poolAmount2)
499499 else ((amountInAdjusted * poolAmount2) / poolAmount1)
500500 let fee = ((amountOut * feeBps) / toBigInt(10000))
501501 let amountOutAfterFee = (amountOut - fee)
502502 let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
503503 let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
504504 if ((minAmountOut > amountOutAfterFee))
505505 then throw("Slippage exceeded")
506506 else {
507507 let newPoolAmount1 = if (isReverse)
508508 then (poolAmount1 - amountOut)
509509 else (poolAmount1 + amountInAdjusted)
510510 let newPoolAmount2 = if (isReverse)
511511 then (poolAmount2 + amountInAdjusted)
512512 else (poolAmount2 - amountOut)
513- let assetOutBytes = if ((assetOut == "GIC"))
513+ let assetOutBytes = if (((if (isReverse)
514+ then assetIn
515+ else assetOut) == "GIC"))
514516 then unit
515- else fromBase58String(assetOut)
517+ else fromBase58String(if (isReverse)
518+ then assetIn
519+ else assetOut)
516520 [IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
517521 }
518522 }
519523 }
520524
521525
522526
523527 @Callable(i)
524528 func farmsAddLP (asset1,asset2) = {
525529 let power = getBooleanValue(this, ac)
526530 let farmPower = getBooleanValue(this, farmAc)
527531 let poolKey = kp(asset1, asset2)
528532 let farmKey = fk(asset1, asset2)
529533 let pmt = i.payments[0]
530534 let lpAssetId = getStringValue(this, (lp + poolKey))
531535 let pmtAssetId = match pmt.assetId {
532536 case a: ByteVector =>
533537 toBase58String(a)
534538 case _ =>
535539 "GIC"
536540 }
537541 if (!(power))
538542 then throw("dApp is currently under maintenance")
539543 else if (farmPower)
540544 then throw("Farms are currently under maintenance")
541545 else if ((pmtAssetId != lpAssetId))
542546 then throw("Invalid LP token")
543547 else if ((validPoolK(poolKey) == 0))
544548 then throw("Pool does not exist")
545549 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
546550 then throw("Farm does not exist")
547551 else {
548552 let currentKey = toBase58String(i.caller.bytes)
549553 let stakedKey = sk(asset1, asset2, currentKey)
550554 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
551555 let newStaked = (currentStaked + pmt.amount)
552556 let totalStakedKey = (farmTotalStaked + poolKey)
553557 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
554558 let newTotalStaked = (previousTotalStaked + pmt.amount)
555559 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 0)
556560 let newTotalUsers = if ((currentStaked == 0))
557561 then (totalUsers + 1)
558562 else totalUsers
559563 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(fh(asset1, asset2, currentKey), height)]
560564 }
561565 }
562566
563567
564568
565569 @Callable(i)
566570 func farmsClaimLP (asset1,asset2) = {
567571 let power = getBooleanValue(this, ac)
568572 let farmPower = getBooleanValue(this, farmAc)
569573 let poolKey = kp(asset1, asset2)
570574 let farmKey = fk(asset1, asset2)
571575 let currentKey = toBase58String(i.caller.bytes)
572576 let stakedKey = sk(asset1, asset2, currentKey)
573577 let heightKey = fh(asset1, asset2, currentKey)
574578 let rewardKey = rk(asset1, asset2, currentKey)
575579 if (!(power))
576580 then throw("dApp is currently under maintenance")
577581 else if (farmPower)
578582 then throw("Farms are currently under maintenance")
579583 else if ((validPoolK(poolKey) == 0))
580584 then throw("Pool does not exist")
581585 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
582586 then throw("Farm does not exist")
583587 else {
584588 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
585589 if ((0 >= currentStaked))
586590 then throw("No staked LP tokens")
587591 else {
588592 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
589593 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
590594 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
591595 let apr = getIntegerValue(this, (farmApr + poolKey))
592596 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
593597 let blocksSinceLastClaim = (height - lastClaimHeight)
594598 if ((1 > blocksSinceLastClaim))
595599 then throw("Must wait at least 1 block since last claim")
596600 else {
597601 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
598602 let reward = (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
599603 if ((reward > rewardPool))
600604 then throw("Insufficient reward pool")
601605 else {
602606 let newRewardPool = (rewardPool - reward)
603607 [IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, reward, unit)]
604608 }
605609 }
606610 }
607611 }
608612 }
609613
610614
611615
612616 @Callable(i)
613617 func farmsRemoveLP (asset1,asset2,amount) = {
614618 let power = getBooleanValue(this, ac)
615619 let farmPower = getBooleanValue(this, farmAc)
616620 let poolKey = kp(asset1, asset2)
617621 let farmKey = fk(asset1, asset2)
618622 let lpAssetId = getStringValue(this, (lp + poolKey))
619623 let lpAsset = if ((lpAssetId == ""))
620624 then unit
621625 else fromBase58String(lpAssetId)
622626 let currentKey = toBase58String(i.caller.bytes)
623627 let stakedKey = sk(asset1, asset2, currentKey)
624628 let heightKey = fh(asset1, asset2, currentKey)
625629 let rewardKey = rk(asset1, asset2, currentKey)
626630 if (!(power))
627631 then throw("dApp is currently under maintenance")
628632 else if (farmPower)
629633 then throw("Farms are currently under maintenance")
630634 else if ((validPoolK(poolKey) == 0))
631635 then throw("Pool does not exist")
632636 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
633637 then throw("Farm does not exist")
634638 else {
635639 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
636640 if ((0 >= amount))
637641 then throw("Amount must be positive")
638642 else if ((amount > currentStaked))
639643 then throw("Insufficient staked LP tokens")
640644 else {
641645 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
642646 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
643647 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
644648 let apr = getIntegerValue(this, (farmApr + poolKey))
645649 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
646650 let blocksSinceLastClaim = (height - lastClaimHeight)
647651 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
648652 let reward = if ((blocksSinceLastClaim >= 1))
649653 then (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
650654 else 0
651655 let newRewardPool = (rewardPool - reward)
652656 let newStaked = (currentStaked - amount)
653657 let totalStakedKey = (farmTotalStaked + poolKey)
654658 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
655659 let newTotalStaked = (previousTotalStaked - amount)
656660 let newTotalUsers = if ((newStaked == 0))
657661 then (totalUsers - 1)
658662 else totalUsers
659663 [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)]
660664 }
661665 }
662666 }
663667
664668
665669 @Verifier(tx)
666670 func verify () = match tx {
667671 case _ =>
668672 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
669673 }
670674

github/gicsportsofficial/g8-explorer
76.49 ms