tx · E31Z43H8J6QmXybShK9N8ZHfdptLSW3bev97TSEuc4U3

3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ:  -0.07000000 Gic

2025.06.12 05:12 [5845] smart account 3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ > SELF 0.00000000 Gic

{ "type": 13, "id": "E31Z43H8J6QmXybShK9N8ZHfdptLSW3bev97TSEuc4U3", "fee": 7000000, "feeAssetId": null, "timestamp": 1749694426892, "version": 2, "chainId": 71, "sender": "3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ", "senderPublicKey": "8dNEACURBe9HFX8kgDH2MVb1mxkFC7Txoqvi4ymdPiNd", "proofs": [ "3PT98aqT9JJYn6wdrsmkQBRdWh4CJpkDFv2RtP9for9geuEADBodoqNdY6Sh9w9TdTe6Hhn8nHZ1DtGQSZBFQ6Ty" ], "script": "base64:AAIFAAAAAAAAAGQIAhIGCgQICAEEEgMKAQgSAwoBBBIGCgQEBAQEEgMKAQESBAoCCAQSBwoFCAgBAQESBAoCCAgSBQoDCAgIEgQKAggIEgUKAwgIARIFCgMICAESBAoCCAgSBAoCCAgSBQoDCAgBAAAAJgAAAAAEbWFpbgIAAAAKbWFpbl9hc3NldAAAAAAMYWRtaW5BZGRyZXNzAgAAAA1hZG1pbl9hZGRyZXNzAAAAAAJscAIAAAAJbHBfYXNzZXRfAAAAAARwb29sAgAAAAZwb29sX18AAAAABGZhcm0CAAAABmZhcm1fXwAAAAAGc3Rha2VkAgAAAAdzdGFrZWRfAAAAAA1yZXdhcmRDbGFpbWVkAgAAAA9yZXdhcmRfY2xhaW1lZF8AAAAADWRlcG9zaXRIZWlnaHQCAAAAD2RlcG9zaXRfaGVpZ2h0XwAAAAAKZmFybUhlaWdodAIAAAAMZmFybV9oZWlnaHRfAAAAAAt0b3RhbExvY2tlZAIAAAANdG90YWxfbG9ja2VkXwAAAAAHc3dhcEZlZQIAAAAIc3dhcF9mZWUAAAAADmZhcm1SZXdhcmRQb29sAgAAABFmYXJtX3Jld2FyZF9wb29sXwAAAAAHZmFybUFwcgIAAAAJZmFybV9hcHJfAAAAAA5mYXJtTG9ja0Jsb2NrcwIAAAARZmFybV9sb2NrX2Jsb2Nrc18AAAAAD2Zhcm1Ub3RhbFN0YWtlZAIAAAASZmFybV90b3RhbF9zdGFrZWRfAAAAABFibGFja2xpc3RlZFRva2VucwIAAAAMYmxhY2tsaXN0ZWRfAAAAAA50b3RhbFVzZXJzRmFybQIAAAARdG90YWxfdXNlcnNfZmFybV8AAAAAAkQ4AAAAAAAF9eEAAAAAAA9jb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQgFAAAABHRoaXMAAAAFYnl0ZXMAAAAAAmFjAgAAAAhhY3RpdmF0ZQAAAAAGcG9vbEFjAgAAAA5hY3RpdmF0ZV9wb29scwAAAAAGc3dhcEFjAgAAAA1hY3RpdmF0ZV9zd2FwAAAAAAtsaXF1aWRpdHlBYwIAAAASYWN0aXZhdGVfbGlxdWlkaXR5AAAAAAZmYXJtQWMCAAAADmFjdGl2YXRlX2Zhcm1zAQAAAAJrcAAAAAIAAAAGYXNzZXQxAAAA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b2xLZXkFAAAABmFzc2V0MgQAAAANdG90YWxMcFN1cHBseQQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEFAAAACWxwQXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAIBQAAAAFhAAAACHF1YW50aXR5AAAAAAAAAAAABAAAAAdhbW91bnQxCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQxBQAAAA10b3RhbExwU3VwcGx5BAAAAAdhbW91bnQyCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQyBQAAAA10b3RhbExwU3VwcGx5BAAAAApjdXJyZW50S2V5CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAE2N1cnJlbnRBbW91bnRBc3NldDEJAQAAAA11c2VyTGlxdWlkaXR5AAAAAwUAAAAKY3VycmVudEtleQUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAABNjdXJyZW50QW1vdW50QXNzZXQyCQEAAAANdXNlckxpcXVpZGl0eQAAAAMFAAAACmN1cnJlbnRLZXkFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAAPbmV3QW1vdW50QXNzZXQxCQAAZQAAAAIFAAAAE2N1cnJlbnRBbW91bnRBc3NldDEFAAAAB2Ftb3VudDEEAAAAD25ld0Ftb3VudEFzc2V0MgkAAGUAAAACBQAAABNjdXJyZW50QW1vdW50QXNzZXQyBQAAAAdhbW91bnQyAwMJAABmAAAAAgAAAAAAAAAAAAUAAAAPbmV3QW1vdW50QXNzZXQxBgkAAGYAAAACAAAAAAAAAAAABQAAAA9uZXdBbW91bnRBc3NldDIJAAACAAAAAQIAAAAeSW5zdWZmaWNpZW50IGxpcXVpZGl0eSBiYWxhbmNlBAAAAA5uZXdQb29sQW1vdW50MQkAAGUAAAACBQAAAAtwb29sQW1vdW50MQUAAAAHYW1vdW50MQQAAAAObmV3UG9vbEFtb3VudDIJAABlAAAAAgUAAAALcG9vbEFtb3VudDIFAAAAB2Ftb3VudDIEAAAAC2Fzc2V0MUJ5dGVzAwkA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AAloZWlnaHRLZXkFAAAABmhlaWdodAQAAAAUYmxvY2tzU2luY2VMYXN0Q2xhaW0JAABlAAAAAgUAAAAGaGVpZ2h0BQAAAA9sYXN0Q2xhaW1IZWlnaHQEAAAADnJld2FyZFBlckJsb2NrCQAAaQAAAAIJAABoAAAAAgUAAAAKcmV3YXJkUG9vbAUAAAADYXByCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAnEAUAAAAKbG9ja0Jsb2NrcwUAAAAKdG90YWxVc2VycwQAAAAGcmV3YXJkAwkAAGcAAAACBQAAABRibG9ja3NTaW5jZUxhc3RDbGFpbQAAAAAAAAAAAQkAAGkAAAACCQAAaAAAAAIJAABoAAAAAgUAAAAOcmV3YXJkUGVyQmxvY2sFAAAAFGJsb2Nrc1NpbmNlTGFzdENsYWltBQAAAA1jdXJyZW50U3Rha2VkBQAAAAJEOAAAAAAAAAAAAAQAAAANbmV3UmV3YXJkUG9vbAkAAGUAAAACBQAAAApyZXdhcmRQb29sBQAAAAZyZXdhcmQEAAAACW5ld1N0YWtlZAkAAGUAAAACBQAAAA1jdXJyZW50U3Rha2VkBQAAAAZhbW91bnQEAAAADnRvdGFsU3Rha2VkS2V5CQABLAAAAAIFAAAAD2Zhcm1Ub3RhbFN0YWtlZAUAAAAHcG9vbEtleQQAAAATcHJldmlvdXNUb3RhbFN0YWtlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA50b3RhbFN0YWtlZEtleQAAAAAAAAAAAAQAAAAObmV3VG90YWxTdGFrZWQJAABlAAAAAgUAAAATcHJldmlvdXNUb3RhbFN0YWtlZAUAAAAGYW1vdW50BAAAAA1uZXdUb3RhbFVzZXJzAwkAAAAAAAACBQAAAAluZXdTdGFrZWQAAAAAAAAAAAAJAABlAAAAAgUAAAAKdG90YWxVc2VycwAAAAAAAAAAAQUAAAAKdG90YWxVc2VycwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJc3Rha2VkS2V5BQAAAAluZXdTdGFrZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADnRvdGFsU3Rha2VkS2V5BQAAAA5uZXdUb3RhbFN0YWtlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA50b3RhbFVzZXJzRmFybQUAAAAHcG9vbEtleQUAAAANbmV3VG90YWxVc2VycwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJcmV3YXJkS2V5AAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmZhcm1SZXdhcmRQb29sBQAAAAdwb29sS2V5BQAAAA1uZXdSZXdhcmRQb29sCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAloZWlnaHRLZXkFAAAABmhlaWdodAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABmFtb3VudAUAAAAHbHBBc3NldAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABnJld2FyZAUAAAAEdW5pdAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAHJG1hdGNoMAUAAAACdHgJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5ArgkFQ==", "height": 5845, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AidDSdTaQpnve98VSxJd3jVnTDLyuJoTwJyUyFdnPRaP Next: CpScZx6nn7YK2jEtShxVrUnXCKD9kKW97v1kfGDFVYwz Diff:
OldNewDifferences
501501 let assetOutBytes = if ((assetOut == "GIC"))
502502 then unit
503503 else fromBase58String(assetOut)
504-[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
504+[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
505505 }
506506 }
507507 }
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 createPool (asset1,asset2,nameLp) = {
263263 let poolKey = kp(asset1, asset2)
264264 let admin = getAdminAddress()
265265 if ((toBase58String(i.caller.bytes) != admin))
266266 then throw("Only the Admin itself can invoke this function")
267267 else if (!(isValidAsset(asset1)))
268268 then throw("Invalid asset1")
269269 else if (!(isValidAsset(asset2)))
270270 then throw("Invalid asset2")
271271 else if ((asset1 == asset2))
272272 then throw("Asset1 cannot be equal to Asset2")
273273 else if (if (isBlacklisted(asset1))
274274 then true
275275 else isBlacklisted(asset2))
276276 then throw("One or both assets are blacklisted")
277277 else if ((validPoolK(poolKey) != 0))
278278 then throw("Pool already exists")
279279 else {
280280 let assetLpCreate = Issue(nameLp, ((("LP asset for pool " + asset1) + "_") + asset2), 1, 8, true)
281281 let idAssetLp = calculateAssetId(assetLpCreate)
282282 [assetLpCreate, StringEntry((lp + poolKey), toBase58String(idAssetLp)), IntegerEntry(poolKey, 1)]
283283 }
284284 }
285285
286286
287287
288288 @Callable(i)
289289 func addLiquidity (asset1,asset2) = {
290290 let power = getBooleanValue(this, ac)
291291 let liquidityPower = getBooleanValue(this, liquidityAc)
292292 let acGic = getBooleanValue(this, "accept_gic")
293293 let poolKey = kp(asset1, asset2)
294294 let pmt1 = i.payments[0]
295295 let pmt2 = i.payments[1]
296296 let asset1Id = match pmt1.assetId {
297297 case a: ByteVector =>
298298 toBase58String(a)
299299 case _ =>
300300 "GIC"
301301 }
302302 let asset2Id = match pmt2.assetId {
303303 case a: ByteVector =>
304304 toBase58String(a)
305305 case _ =>
306306 "GIC"
307307 }
308308 let decimals1 = getAssetDecimals(asset1Id)
309309 let decimals2 = getAssetDecimals(asset2Id)
310310 if (!(power))
311311 then throw("dApp is currently under maintenance")
312312 else if (liquidityPower)
313313 then throw("Liquidity is currently under maintenance")
314314 else if (if ((asset1Id != asset1))
315315 then true
316316 else (asset2Id != asset2))
317317 then throw("Payment assets do not match specified assets")
318318 else if ((asset1 == asset2))
319319 then throw("Asset1 cannot be equal to Asset2")
320320 else if (!(isValidAsset(asset1)))
321321 then throw("Invalid asset1")
322322 else if (!(isValidAsset(asset2)))
323323 then throw("Invalid asset2")
324324 else if (if (isBlacklisted(asset1))
325325 then true
326326 else isBlacklisted(asset2))
327327 then throw("One or both assets are blacklisted")
328328 else if (if (if ((asset1 == "GIC"))
329329 then true
330330 else (asset2 == "GIC"))
331331 then !(acGic)
332332 else false)
333333 then throw("GIC not allowed")
334334 else if ((validPoolK(poolKey) == 0))
335335 then throw("Pool does not exist. Create it first")
336336 else {
337337 let poolAmount1 = poolAA(poolKey, asset1)
338338 let poolAmount2 = poolAA(poolKey, asset2)
339339 let amount1 = pmt1.amount
340340 let amount2 = pmt2.amount
341341 let lpAmount = if (if ((poolAmount1 == 0))
342342 then true
343343 else (poolAmount2 == 0))
344344 then toBigInt(amount1)
345345 else ((toBigInt(amount1) * toBigInt(poolAmount2)) / toBigInt(poolAmount1))
346346 let currentKey = toBase58String(i.caller.bytes)
347347 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
348348 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
349349 let newAmountAsset1 = (toBigInt(currentAmountAsset1) + toBigInt(amount1))
350350 let newAmountAsset2 = (toBigInt(currentAmountAsset2) + toBigInt(amount2))
351351 let newPoolAmount1 = (toBigInt(poolAmount1) + toBigInt(amount1))
352352 let newPoolAmount2 = (toBigInt(poolAmount2) + toBigInt(amount2))
353353 let lpAssetId = getStringValue(this, (lp + poolKey))
354354 let oldAssetLpTotal = valueOrElse(getIntegerValue(poolKey), 0)
355355 let lpAsset = if ((lpAssetId == ""))
356356 then throw("Pool does not have a liquidity pair, contact admin")
357357 else fromBase58String(lpAssetId)
358358 [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)]
359359 }
360360 }
361361
362362
363363
364364 @Callable(i)
365365 func removeLiquidity (asset1,asset2,lpAmount) = {
366366 let power = getBooleanValue(this, ac)
367367 let liquidityPower = getBooleanValue(this, liquidityAc)
368368 let poolKey = kp(asset1, asset2)
369369 let lpAssetId = getStringValue(this, (lp + poolKey))
370370 let lpAsset = fromBase58String(lpAssetId)
371371 let pmt = i.payments[0]
372372 let pmtAssetId = match pmt.assetId {
373373 case a: ByteVector =>
374374 toBase58String(a)
375375 case _ =>
376376 "GIC"
377377 }
378378 let decimals1 = getAssetDecimals(asset1)
379379 let decimals2 = getAssetDecimals(asset2)
380380 if (!(power))
381381 then throw("dApp is currently under maintenance")
382382 else if (liquidityPower)
383383 then throw("Liquidity is currently under maintenance")
384384 else if ((lpAssetId == ""))
385385 then throw("Invalid LP asset")
386386 else if ((pmtAssetId != lpAssetId))
387387 then throw("Invalid LP token")
388388 else if ((validPoolK(poolKey) == 0))
389389 then throw("Pool does not exist")
390390 else if ((0 >= lpAmount))
391391 then throw("LP amount must be positive")
392392 else {
393393 let poolAmount1 = poolAA(poolKey, asset1)
394394 let poolAmount2 = poolAA(poolKey, asset2)
395395 let totalLpSupply = match assetInfo(fromBase58String(lpAssetId)) {
396396 case a: Asset =>
397397 a.quantity
398398 case _ =>
399399 0
400400 }
401401 let amount1 = ((lpAmount * poolAmount1) / totalLpSupply)
402402 let amount2 = ((lpAmount * poolAmount2) / totalLpSupply)
403403 let currentKey = toBase58String(i.caller.bytes)
404404 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
405405 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
406406 let newAmountAsset1 = (currentAmountAsset1 - amount1)
407407 let newAmountAsset2 = (currentAmountAsset2 - amount2)
408408 if (if ((0 > newAmountAsset1))
409409 then true
410410 else (0 > newAmountAsset2))
411411 then throw("Insufficient liquidity balance")
412412 else {
413413 let newPoolAmount1 = (poolAmount1 - amount1)
414414 let newPoolAmount2 = (poolAmount2 - amount2)
415415 let asset1Bytes = if ((asset1 == "GIC"))
416416 then unit
417417 else fromBase58String(asset1)
418418 let asset2Bytes = if ((asset2 == "GIC"))
419419 then unit
420420 else fromBase58String(asset2)
421421 let oldAssetLpTotal = getIntegerValue(poolKey)
422422 [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)]
423423 }
424424 }
425425 }
426426
427427
428428
429429 @Callable(i)
430430 func swap (assetIn,assetOut,maxSlippage) = {
431431 let power = getBooleanValue(this, ac)
432432 let swapActivate = getBooleanValue(this, swapAc)
433433 let acGic = getBooleanValue(this, "accept_gic")
434434 let poolKey = kp(assetIn, assetOut)
435435 let reversePoolKey = kp(assetOut, assetIn)
436436 let key = if ((validPoolK(poolKey) != 0))
437437 then poolKey
438438 else if ((validPoolK(reversePoolKey) != 0))
439439 then reversePoolKey
440440 else ""
441441 let pmt = i.payments[0]
442442 let pmtAssetId = match pmt.assetId {
443443 case a: ByteVector =>
444444 toBase58String(a)
445445 case _ =>
446446 "GIC"
447447 }
448448 let decimalsIn = getAssetDecimals(assetIn)
449449 let decimalsOut = getAssetDecimals(assetOut)
450450 let feeBps = toBigInt(getIntegerValue(this, swapFee))
451451 let adminAddr = addressFromStringValue(getStringValue(this, adminAddress))
452452 if (!(power))
453453 then throw("dApp is currently under maintenance")
454454 else if (swapActivate)
455455 then throw("Swap is currently under maintenance")
456456 else if ((pmtAssetId != assetIn))
457457 then throw("Payment asset does not match assetIn")
458458 else if (!(isValidAsset(assetIn)))
459459 then throw("Invalid assetIn")
460460 else if (!(isValidAsset(assetOut)))
461461 then throw("Invalid assetOut")
462462 else if (if (isBlacklisted(assetIn))
463463 then true
464464 else isBlacklisted(assetOut))
465465 then throw("One or both assets are blacklisted")
466466 else if ((assetIn == assetOut))
467467 then throw("assetIn cannot be equal to assetOut")
468468 else if (if (if ((assetIn == "GIC"))
469469 then true
470470 else (assetOut == "GIC"))
471471 then !(acGic)
472472 else false)
473473 then throw("GIC not allowed")
474474 else if ((key == ""))
475475 then throw("Pool does not exist")
476476 else {
477477 let isReverse = (key == reversePoolKey)
478478 let poolAsset1 = if (isReverse)
479479 then assetOut
480480 else assetIn
481481 let poolAsset2 = if (isReverse)
482482 then assetIn
483483 else assetOut
484484 let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
485485 let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
486486 let amountInAdjusted = toBigInt(pmt.amount)
487487 let amountOut = if (isReverse)
488488 then ((amountInAdjusted * poolAmount2) / (poolAmount1 + amountInAdjusted))
489489 else ((amountInAdjusted * poolAmount2) / poolAmount1)
490490 let fee = ((amountOut * feeBps) / toBigInt(10000))
491491 let amountOutAfterFee = (amountOut - fee)
492492 let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
493493 let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
494494 if ((minAmountOut > amountOutAfterFee))
495495 then throw("Slippage exceeded")
496496 else {
497497 let newPoolAmount1 = (poolAmount1 + (if (isReverse)
498498 then toBigInt(0)
499499 else amountInAdjusted))
500500 let newPoolAmount2 = (poolAmount2 - amountOut)
501501 let assetOutBytes = if ((assetOut == "GIC"))
502502 then unit
503503 else fromBase58String(assetOut)
504-[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
504+[IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assetOutBytes), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
505505 }
506506 }
507507 }
508508
509509
510510
511511 @Callable(i)
512512 func farmsAddLP (asset1,asset2) = {
513513 let power = getBooleanValue(this, ac)
514514 let farmPower = getBooleanValue(this, farmAc)
515515 let poolKey = kp(asset1, asset2)
516516 let farmKey = fk(asset1, asset2)
517517 let pmt = i.payments[0]
518518 let lpAssetId = getStringValue(this, (lp + poolKey))
519519 let pmtAssetId = match pmt.assetId {
520520 case a: ByteVector =>
521521 toBase58String(a)
522522 case _ =>
523523 "GIC"
524524 }
525525 if (!(power))
526526 then throw("dApp is currently under maintenance")
527527 else if (farmPower)
528528 then throw("Farms are currently under maintenance")
529529 else if ((pmtAssetId != lpAssetId))
530530 then throw("Invalid LP token")
531531 else if ((validPoolK(poolKey) == 0))
532532 then throw("Pool does not exist")
533533 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
534534 then throw("Farm does not exist")
535535 else {
536536 let currentKey = toBase58String(i.caller.bytes)
537537 let stakedKey = sk(asset1, asset2, currentKey)
538538 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
539539 let newStaked = (currentStaked + pmt.amount)
540540 let totalStakedKey = (farmTotalStaked + poolKey)
541541 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
542542 let newTotalStaked = (previousTotalStaked + pmt.amount)
543543 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 0)
544544 let newTotalUsers = if ((currentStaked == 0))
545545 then (totalUsers + 1)
546546 else totalUsers
547547 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(fh(asset1, asset2, currentKey), height)]
548548 }
549549 }
550550
551551
552552
553553 @Callable(i)
554554 func farmsClaimLP (asset1,asset2) = {
555555 let power = getBooleanValue(this, ac)
556556 let farmPower = getBooleanValue(this, farmAc)
557557 let poolKey = kp(asset1, asset2)
558558 let farmKey = fk(asset1, asset2)
559559 let currentKey = toBase58String(i.caller.bytes)
560560 let stakedKey = sk(asset1, asset2, currentKey)
561561 let heightKey = fh(asset1, asset2, currentKey)
562562 let rewardKey = rk(asset1, asset2, currentKey)
563563 if (!(power))
564564 then throw("dApp is currently under maintenance")
565565 else if (farmPower)
566566 then throw("Farms are currently under maintenance")
567567 else if ((validPoolK(poolKey) == 0))
568568 then throw("Pool does not exist")
569569 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
570570 then throw("Farm does not exist")
571571 else {
572572 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
573573 if ((0 >= currentStaked))
574574 then throw("No staked LP tokens")
575575 else {
576576 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
577577 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
578578 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
579579 let apr = getIntegerValue(this, (farmApr + poolKey))
580580 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
581581 let blocksSinceLastClaim = (height - lastClaimHeight)
582582 if ((1 > blocksSinceLastClaim))
583583 then throw("Must wait at least 1 block since last claim")
584584 else {
585585 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
586586 let reward = (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
587587 if ((reward > rewardPool))
588588 then throw("Insufficient reward pool")
589589 else {
590590 let newRewardPool = (rewardPool - reward)
591591 [IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, reward, unit)]
592592 }
593593 }
594594 }
595595 }
596596 }
597597
598598
599599
600600 @Callable(i)
601601 func farmsRemoveLP (asset1,asset2,amount) = {
602602 let power = getBooleanValue(this, ac)
603603 let farmPower = getBooleanValue(this, farmAc)
604604 let poolKey = kp(asset1, asset2)
605605 let farmKey = fk(asset1, asset2)
606606 let lpAssetId = getStringValue(this, (lp + poolKey))
607607 let lpAsset = if ((lpAssetId == ""))
608608 then unit
609609 else fromBase58String(lpAssetId)
610610 let currentKey = toBase58String(i.caller.bytes)
611611 let stakedKey = sk(asset1, asset2, currentKey)
612612 let heightKey = fh(asset1, asset2, currentKey)
613613 let rewardKey = rk(asset1, asset2, currentKey)
614614 if (!(power))
615615 then throw("dApp is currently under maintenance")
616616 else if (farmPower)
617617 then throw("Farms are currently under maintenance")
618618 else if ((validPoolK(poolKey) == 0))
619619 then throw("Pool does not exist")
620620 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
621621 then throw("Farm does not exist")
622622 else {
623623 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
624624 if ((0 >= amount))
625625 then throw("Amount must be positive")
626626 else if ((amount > currentStaked))
627627 then throw("Insufficient staked LP tokens")
628628 else {
629629 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
630630 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
631631 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
632632 let apr = getIntegerValue(this, (farmApr + poolKey))
633633 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
634634 let blocksSinceLastClaim = (height - lastClaimHeight)
635635 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
636636 let reward = if ((blocksSinceLastClaim >= 1))
637637 then (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
638638 else 0
639639 let newRewardPool = (rewardPool - reward)
640640 let newStaked = (currentStaked - amount)
641641 let totalStakedKey = (farmTotalStaked + poolKey)
642642 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
643643 let newTotalStaked = (previousTotalStaked - amount)
644644 let newTotalUsers = if ((newStaked == 0))
645645 then (totalUsers - 1)
646646 else totalUsers
647647 [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)]
648648 }
649649 }
650650 }
651651
652652
653653 @Verifier(tx)
654654 func verify () = match tx {
655655 case _ =>
656656 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
657657 }
658658

github/gicsportsofficial/g8-explorer
123.03 ms