tx · Bkd97VLWP4En1Y7BhwqS1H8uMt2xPR6sTpNuGakyuvhN

3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ:  -0.07000000 Gic

2025.06.12 05:19 [5855] smart account 3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ > SELF 0.00000000 Gic

{ "type": 13, "id": "Bkd97VLWP4En1Y7BhwqS1H8uMt2xPR6sTpNuGakyuvhN", "fee": 7000000, "feeAssetId": null, "timestamp": 1749694911747, "version": 2, "chainId": 71, "sender": "3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ", "senderPublicKey": "8dNEACURBe9HFX8kgDH2MVb1mxkFC7Txoqvi4ymdPiNd", "proofs": [ "61MhqgK9rteGhLt6HS7BVookAKGm7rq7zqbFkmgR23NDsQvbKzfC8tmxzHbBtsZuAxPRnfWAfBf1dq7hp2nuu9fD" ], "script": "base64:AAIFAAAAAAAAAGoIAhIGCgQICAEEEgMKAQgSAwoBBBIGCgQEBAQEEgMKAQESBAoCCAQSBwoFCAgBAQESBAoCCAgSBAoCCAESBQoDCAgIEgQKAggIEgUKAwgIARIFCgMICAESBAoCCAgSBAoCCAgSBQoDCAgBAAAAJgAAAAAEbWFpbgIAAAAKbWFpbl9hc3NldAAAAAAMYWRtaW5BZGRyZXNzAgAAAA1hZG1pbl9hZGRyZXNzAAAAAAJscAIAAAAJbHBfYXNzZXRfAAAAAARwb29sAgAAAAZwb29sX18AAAAABGZhcm0CAAAABmZhcm1fXwAAAAAGc3Rha2VkAgAAAAdzdGFrZWRfAAAAAA1yZXdhcmRDbGFpbWVkAgAAAA9yZXdhcmRfY2xhaW1lZF8AAAAADWRlcG9zaXRIZWlnaHQCAAAAD2RlcG9zaXRfaGVpZ2h0XwAAAAAKZmFybUhlaWdodAIAAAAMZmFybV9oZWlnaHRfAAAAAAt0b3RhbExvY2tlZAIAAAANdG90YWxfbG9ja2VkXwAAAAAHc3dhcEZlZQIAAAAIc3dhcF9mZWUAAAAADmZhcm1SZXdhcmRQb29sAgAAABFmYXJtX3Jld2FyZF9wb29sXwAAAAAHZmFybUFwcgIAAAAJZmFybV9hcHJfAAAAAA5mYXJtTG9ja0Jsb2NrcwIAAAARZmFybV9sb2NrX2Jsb2Nrc18AAAAAD2Zhcm1Ub3RhbFN0YWtlZAIAAAASZmFybV90b3RhbF9zdGFrZWRfAAAAABFibGFja2xpc3RlZFRva2VucwIAAAAMYmxhY2tsaXN0ZWRfAAAAAA50b3RhbFVzZXJzRmFybQIAAAARdG90YWxfdXNlcnNfZmFybV8AAAAAAkQ4AAAAAAAF9eEAAAAAAA9jb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQgFAAAABHRoaXMAAAAFYnl0ZXMAAAAAAmFjAgAAAAhhY3RpdmF0ZQAAAAAGcG9vbEFjAgAAAA5hY3RpdmF0ZV9wb29scwAAAAAGc3dhcEFjAgAAAA1hY3RpdmF0ZV9zd2FwAAAAAAtsaXF1aWRpdHlBYwIAAAASYWN0aXZhdGVfbGlxdWlkaXR5AAAAAAZmYXJtQWMCAAAADmFjdGl2YXRlX2Zhcm1zAQAAAAJrcAAAAAIAAAAGYXNz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IHRva2VuAwkAAAAAAAACCQEAAAAKdmFsaWRQb29sSwAAAAEFAAAAB3Bvb2xLZXkAAAAAAAAAAAAJAAACAAAAAQIAAAATUG9vbCBkb2VzIG5vdCBleGlzdAMJAABnAAAAAgAAAAAAAAAAAAUAAAAIbHBBbW91bnQJAAACAAAAAQIAAAAaTFAgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAAC3Bvb2xBbW91bnQxCQEAAAAGcG9vbEFBAAAAAgUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAAAtwb29sQW1vdW50MgkBAAAABnBvb2xBQQAAAAIFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAANdG90YWxMcFN1cHBseQQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEFAAAACWxwQXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAIBQAAAAFhAAAACHF1YW50aXR5AAAAAAAAAAAABAAAAAdhbW91bnQxCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQxBQAAAA10b3RhbExwU3VwcGx5BAAAAAdhbW91bnQyCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQyBQAAAA10b3RhbExwU3VwcGx5BAAAAApjdXJyZW50S2V5CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAE2N1cnJlbnRBbW91bnRBc3NldDEJAQAAAA11c2VyTGlxdWlkaXR5AAAAAwUAAAAKY3VycmVudEtleQUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAABNjdXJyZW50QW1vdW50QXNzZXQyCQEAAAANdXNlckxpcXVpZGl0eQAAAAMFAAAACmN1cnJlbnRLZXkFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAAPbmV3QW1vdW50QXNzZXQxCQAAZQAAAAIFAAAAE2N1cnJlbnRBbW91bnRBc3NldDEFAAAAB2Ftb3VudDEEAAAAD25ld0Ftb3VudEFzc2V0MgkAAGUAAAACBQAAABNjdXJyZW50QW1vdW50QXNzZXQyBQAAAAdhbW91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", "height": 5855, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CpScZx6nn7YK2jEtShxVrUnXCKD9kKW97v1kfGDFVYwz Next: 2VgrB4Ty2mTZj3frzQkKajs4YpuCN13TJjh7DezHecUm Diff:
OldNewDifferences
259259
260260
261261 @Callable(i)
262+func changeData (key,data) = {
263+ let admin = getAdminAddress()
264+ if ((toBase58String(i.caller.bytes) != admin))
265+ then throw("Only the Admin itself can invoke this function")
266+ else [IntegerEntry(key, data)]
267+ }
268+
269+
270+
271+@Callable(i)
262272 func createPool (asset1,asset2,nameLp) = {
263273 let poolKey = kp(asset1, asset2)
264274 let admin = getAdminAddress()
494504 if ((minAmountOut > amountOutAfterFee))
495505 then throw("Slippage exceeded")
496506 else {
497- let newPoolAmount1 = (poolAmount1 + (if (isReverse)
498- then toBigInt(0)
499- else amountInAdjusted))
500- let newPoolAmount2 = (poolAmount2 - amountOut)
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)
501513 let assetOutBytes = if ((assetOut == "GIC"))
502514 then unit
503515 else fromBase58String(assetOut)
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)
262+func changeData (key,data) = {
263+ let admin = getAdminAddress()
264+ if ((toBase58String(i.caller.bytes) != admin))
265+ then throw("Only the Admin itself can invoke this function")
266+ else [IntegerEntry(key, data)]
267+ }
268+
269+
270+
271+@Callable(i)
262272 func createPool (asset1,asset2,nameLp) = {
263273 let poolKey = kp(asset1, asset2)
264274 let admin = getAdminAddress()
265275 if ((toBase58String(i.caller.bytes) != admin))
266276 then throw("Only the Admin itself can invoke this function")
267277 else if (!(isValidAsset(asset1)))
268278 then throw("Invalid asset1")
269279 else if (!(isValidAsset(asset2)))
270280 then throw("Invalid asset2")
271281 else if ((asset1 == asset2))
272282 then throw("Asset1 cannot be equal to Asset2")
273283 else if (if (isBlacklisted(asset1))
274284 then true
275285 else isBlacklisted(asset2))
276286 then throw("One or both assets are blacklisted")
277287 else if ((validPoolK(poolKey) != 0))
278288 then throw("Pool already exists")
279289 else {
280290 let assetLpCreate = Issue(nameLp, ((("LP asset for pool " + asset1) + "_") + asset2), 1, 8, true)
281291 let idAssetLp = calculateAssetId(assetLpCreate)
282292 [assetLpCreate, StringEntry((lp + poolKey), toBase58String(idAssetLp)), IntegerEntry(poolKey, 1)]
283293 }
284294 }
285295
286296
287297
288298 @Callable(i)
289299 func addLiquidity (asset1,asset2) = {
290300 let power = getBooleanValue(this, ac)
291301 let liquidityPower = getBooleanValue(this, liquidityAc)
292302 let acGic = getBooleanValue(this, "accept_gic")
293303 let poolKey = kp(asset1, asset2)
294304 let pmt1 = i.payments[0]
295305 let pmt2 = i.payments[1]
296306 let asset1Id = match pmt1.assetId {
297307 case a: ByteVector =>
298308 toBase58String(a)
299309 case _ =>
300310 "GIC"
301311 }
302312 let asset2Id = match pmt2.assetId {
303313 case a: ByteVector =>
304314 toBase58String(a)
305315 case _ =>
306316 "GIC"
307317 }
308318 let decimals1 = getAssetDecimals(asset1Id)
309319 let decimals2 = getAssetDecimals(asset2Id)
310320 if (!(power))
311321 then throw("dApp is currently under maintenance")
312322 else if (liquidityPower)
313323 then throw("Liquidity is currently under maintenance")
314324 else if (if ((asset1Id != asset1))
315325 then true
316326 else (asset2Id != asset2))
317327 then throw("Payment assets do not match specified assets")
318328 else if ((asset1 == asset2))
319329 then throw("Asset1 cannot be equal to Asset2")
320330 else if (!(isValidAsset(asset1)))
321331 then throw("Invalid asset1")
322332 else if (!(isValidAsset(asset2)))
323333 then throw("Invalid asset2")
324334 else if (if (isBlacklisted(asset1))
325335 then true
326336 else isBlacklisted(asset2))
327337 then throw("One or both assets are blacklisted")
328338 else if (if (if ((asset1 == "GIC"))
329339 then true
330340 else (asset2 == "GIC"))
331341 then !(acGic)
332342 else false)
333343 then throw("GIC not allowed")
334344 else if ((validPoolK(poolKey) == 0))
335345 then throw("Pool does not exist. Create it first")
336346 else {
337347 let poolAmount1 = poolAA(poolKey, asset1)
338348 let poolAmount2 = poolAA(poolKey, asset2)
339349 let amount1 = pmt1.amount
340350 let amount2 = pmt2.amount
341351 let lpAmount = if (if ((poolAmount1 == 0))
342352 then true
343353 else (poolAmount2 == 0))
344354 then toBigInt(amount1)
345355 else ((toBigInt(amount1) * toBigInt(poolAmount2)) / toBigInt(poolAmount1))
346356 let currentKey = toBase58String(i.caller.bytes)
347357 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
348358 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
349359 let newAmountAsset1 = (toBigInt(currentAmountAsset1) + toBigInt(amount1))
350360 let newAmountAsset2 = (toBigInt(currentAmountAsset2) + toBigInt(amount2))
351361 let newPoolAmount1 = (toBigInt(poolAmount1) + toBigInt(amount1))
352362 let newPoolAmount2 = (toBigInt(poolAmount2) + toBigInt(amount2))
353363 let lpAssetId = getStringValue(this, (lp + poolKey))
354364 let oldAssetLpTotal = valueOrElse(getIntegerValue(poolKey), 0)
355365 let lpAsset = if ((lpAssetId == ""))
356366 then throw("Pool does not have a liquidity pair, contact admin")
357367 else fromBase58String(lpAssetId)
358368 [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)]
359369 }
360370 }
361371
362372
363373
364374 @Callable(i)
365375 func removeLiquidity (asset1,asset2,lpAmount) = {
366376 let power = getBooleanValue(this, ac)
367377 let liquidityPower = getBooleanValue(this, liquidityAc)
368378 let poolKey = kp(asset1, asset2)
369379 let lpAssetId = getStringValue(this, (lp + poolKey))
370380 let lpAsset = fromBase58String(lpAssetId)
371381 let pmt = i.payments[0]
372382 let pmtAssetId = match pmt.assetId {
373383 case a: ByteVector =>
374384 toBase58String(a)
375385 case _ =>
376386 "GIC"
377387 }
378388 let decimals1 = getAssetDecimals(asset1)
379389 let decimals2 = getAssetDecimals(asset2)
380390 if (!(power))
381391 then throw("dApp is currently under maintenance")
382392 else if (liquidityPower)
383393 then throw("Liquidity is currently under maintenance")
384394 else if ((lpAssetId == ""))
385395 then throw("Invalid LP asset")
386396 else if ((pmtAssetId != lpAssetId))
387397 then throw("Invalid LP token")
388398 else if ((validPoolK(poolKey) == 0))
389399 then throw("Pool does not exist")
390400 else if ((0 >= lpAmount))
391401 then throw("LP amount must be positive")
392402 else {
393403 let poolAmount1 = poolAA(poolKey, asset1)
394404 let poolAmount2 = poolAA(poolKey, asset2)
395405 let totalLpSupply = match assetInfo(fromBase58String(lpAssetId)) {
396406 case a: Asset =>
397407 a.quantity
398408 case _ =>
399409 0
400410 }
401411 let amount1 = ((lpAmount * poolAmount1) / totalLpSupply)
402412 let amount2 = ((lpAmount * poolAmount2) / totalLpSupply)
403413 let currentKey = toBase58String(i.caller.bytes)
404414 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
405415 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
406416 let newAmountAsset1 = (currentAmountAsset1 - amount1)
407417 let newAmountAsset2 = (currentAmountAsset2 - amount2)
408418 if (if ((0 > newAmountAsset1))
409419 then true
410420 else (0 > newAmountAsset2))
411421 then throw("Insufficient liquidity balance")
412422 else {
413423 let newPoolAmount1 = (poolAmount1 - amount1)
414424 let newPoolAmount2 = (poolAmount2 - amount2)
415425 let asset1Bytes = if ((asset1 == "GIC"))
416426 then unit
417427 else fromBase58String(asset1)
418428 let asset2Bytes = if ((asset2 == "GIC"))
419429 then unit
420430 else fromBase58String(asset2)
421431 let oldAssetLpTotal = getIntegerValue(poolKey)
422432 [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)]
423433 }
424434 }
425435 }
426436
427437
428438
429439 @Callable(i)
430440 func swap (assetIn,assetOut,maxSlippage) = {
431441 let power = getBooleanValue(this, ac)
432442 let swapActivate = getBooleanValue(this, swapAc)
433443 let acGic = getBooleanValue(this, "accept_gic")
434444 let poolKey = kp(assetIn, assetOut)
435445 let reversePoolKey = kp(assetOut, assetIn)
436446 let key = if ((validPoolK(poolKey) != 0))
437447 then poolKey
438448 else if ((validPoolK(reversePoolKey) != 0))
439449 then reversePoolKey
440450 else ""
441451 let pmt = i.payments[0]
442452 let pmtAssetId = match pmt.assetId {
443453 case a: ByteVector =>
444454 toBase58String(a)
445455 case _ =>
446456 "GIC"
447457 }
448458 let decimalsIn = getAssetDecimals(assetIn)
449459 let decimalsOut = getAssetDecimals(assetOut)
450460 let feeBps = toBigInt(getIntegerValue(this, swapFee))
451461 let adminAddr = addressFromStringValue(getStringValue(this, adminAddress))
452462 if (!(power))
453463 then throw("dApp is currently under maintenance")
454464 else if (swapActivate)
455465 then throw("Swap is currently under maintenance")
456466 else if ((pmtAssetId != assetIn))
457467 then throw("Payment asset does not match assetIn")
458468 else if (!(isValidAsset(assetIn)))
459469 then throw("Invalid assetIn")
460470 else if (!(isValidAsset(assetOut)))
461471 then throw("Invalid assetOut")
462472 else if (if (isBlacklisted(assetIn))
463473 then true
464474 else isBlacklisted(assetOut))
465475 then throw("One or both assets are blacklisted")
466476 else if ((assetIn == assetOut))
467477 then throw("assetIn cannot be equal to assetOut")
468478 else if (if (if ((assetIn == "GIC"))
469479 then true
470480 else (assetOut == "GIC"))
471481 then !(acGic)
472482 else false)
473483 then throw("GIC not allowed")
474484 else if ((key == ""))
475485 then throw("Pool does not exist")
476486 else {
477487 let isReverse = (key == reversePoolKey)
478488 let poolAsset1 = if (isReverse)
479489 then assetOut
480490 else assetIn
481491 let poolAsset2 = if (isReverse)
482492 then assetIn
483493 else assetOut
484494 let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
485495 let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
486496 let amountInAdjusted = toBigInt(pmt.amount)
487497 let amountOut = if (isReverse)
488498 then ((amountInAdjusted * poolAmount1) / poolAmount2)
489499 else ((amountInAdjusted * poolAmount2) / poolAmount1)
490500 let fee = ((amountOut * feeBps) / toBigInt(10000))
491501 let amountOutAfterFee = (amountOut - fee)
492502 let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
493503 let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
494504 if ((minAmountOut > amountOutAfterFee))
495505 then throw("Slippage exceeded")
496506 else {
497- let newPoolAmount1 = (poolAmount1 + (if (isReverse)
498- then toBigInt(0)
499- else amountInAdjusted))
500- let newPoolAmount2 = (poolAmount2 - amountOut)
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)
501513 let assetOutBytes = if ((assetOut == "GIC"))
502514 then unit
503515 else fromBase58String(assetOut)
504516 [IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
505517 }
506518 }
507519 }
508520
509521
510522
511523 @Callable(i)
512524 func farmsAddLP (asset1,asset2) = {
513525 let power = getBooleanValue(this, ac)
514526 let farmPower = getBooleanValue(this, farmAc)
515527 let poolKey = kp(asset1, asset2)
516528 let farmKey = fk(asset1, asset2)
517529 let pmt = i.payments[0]
518530 let lpAssetId = getStringValue(this, (lp + poolKey))
519531 let pmtAssetId = match pmt.assetId {
520532 case a: ByteVector =>
521533 toBase58String(a)
522534 case _ =>
523535 "GIC"
524536 }
525537 if (!(power))
526538 then throw("dApp is currently under maintenance")
527539 else if (farmPower)
528540 then throw("Farms are currently under maintenance")
529541 else if ((pmtAssetId != lpAssetId))
530542 then throw("Invalid LP token")
531543 else if ((validPoolK(poolKey) == 0))
532544 then throw("Pool does not exist")
533545 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
534546 then throw("Farm does not exist")
535547 else {
536548 let currentKey = toBase58String(i.caller.bytes)
537549 let stakedKey = sk(asset1, asset2, currentKey)
538550 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
539551 let newStaked = (currentStaked + pmt.amount)
540552 let totalStakedKey = (farmTotalStaked + poolKey)
541553 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
542554 let newTotalStaked = (previousTotalStaked + pmt.amount)
543555 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 0)
544556 let newTotalUsers = if ((currentStaked == 0))
545557 then (totalUsers + 1)
546558 else totalUsers
547559 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(fh(asset1, asset2, currentKey), height)]
548560 }
549561 }
550562
551563
552564
553565 @Callable(i)
554566 func farmsClaimLP (asset1,asset2) = {
555567 let power = getBooleanValue(this, ac)
556568 let farmPower = getBooleanValue(this, farmAc)
557569 let poolKey = kp(asset1, asset2)
558570 let farmKey = fk(asset1, asset2)
559571 let currentKey = toBase58String(i.caller.bytes)
560572 let stakedKey = sk(asset1, asset2, currentKey)
561573 let heightKey = fh(asset1, asset2, currentKey)
562574 let rewardKey = rk(asset1, asset2, currentKey)
563575 if (!(power))
564576 then throw("dApp is currently under maintenance")
565577 else if (farmPower)
566578 then throw("Farms are currently under maintenance")
567579 else if ((validPoolK(poolKey) == 0))
568580 then throw("Pool does not exist")
569581 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
570582 then throw("Farm does not exist")
571583 else {
572584 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
573585 if ((0 >= currentStaked))
574586 then throw("No staked LP tokens")
575587 else {
576588 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
577589 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
578590 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
579591 let apr = getIntegerValue(this, (farmApr + poolKey))
580592 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
581593 let blocksSinceLastClaim = (height - lastClaimHeight)
582594 if ((1 > blocksSinceLastClaim))
583595 then throw("Must wait at least 1 block since last claim")
584596 else {
585597 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
586598 let reward = (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
587599 if ((reward > rewardPool))
588600 then throw("Insufficient reward pool")
589601 else {
590602 let newRewardPool = (rewardPool - reward)
591603 [IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, reward, unit)]
592604 }
593605 }
594606 }
595607 }
596608 }
597609
598610
599611
600612 @Callable(i)
601613 func farmsRemoveLP (asset1,asset2,amount) = {
602614 let power = getBooleanValue(this, ac)
603615 let farmPower = getBooleanValue(this, farmAc)
604616 let poolKey = kp(asset1, asset2)
605617 let farmKey = fk(asset1, asset2)
606618 let lpAssetId = getStringValue(this, (lp + poolKey))
607619 let lpAsset = if ((lpAssetId == ""))
608620 then unit
609621 else fromBase58String(lpAssetId)
610622 let currentKey = toBase58String(i.caller.bytes)
611623 let stakedKey = sk(asset1, asset2, currentKey)
612624 let heightKey = fh(asset1, asset2, currentKey)
613625 let rewardKey = rk(asset1, asset2, currentKey)
614626 if (!(power))
615627 then throw("dApp is currently under maintenance")
616628 else if (farmPower)
617629 then throw("Farms are currently under maintenance")
618630 else if ((validPoolK(poolKey) == 0))
619631 then throw("Pool does not exist")
620632 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
621633 then throw("Farm does not exist")
622634 else {
623635 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
624636 if ((0 >= amount))
625637 then throw("Amount must be positive")
626638 else if ((amount > currentStaked))
627639 then throw("Insufficient staked LP tokens")
628640 else {
629641 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
630642 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
631643 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
632644 let apr = getIntegerValue(this, (farmApr + poolKey))
633645 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
634646 let blocksSinceLastClaim = (height - lastClaimHeight)
635647 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
636648 let reward = if ((blocksSinceLastClaim >= 1))
637649 then (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
638650 else 0
639651 let newRewardPool = (rewardPool - reward)
640652 let newStaked = (currentStaked - amount)
641653 let totalStakedKey = (farmTotalStaked + poolKey)
642654 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
643655 let newTotalStaked = (previousTotalStaked - amount)
644656 let newTotalUsers = if ((newStaked == 0))
645657 then (totalUsers - 1)
646658 else totalUsers
647659 [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)]
648660 }
649661 }
650662 }
651663
652664
653665 @Verifier(tx)
654666 func verify () = match tx {
655667 case _ =>
656668 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
657669 }
658670

github/gicsportsofficial/g8-explorer
172.23 ms