tx · FDft5pv3WkPPXfJMdFPz5cUsVBS3t9cXSDCgeoTPd6ns

3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ:  -0.05000000 Gic

2025.06.25 22:54 [6641] smart account 3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ > SELF 0.00000000 Gic

{ "type": 13, "id": "FDft5pv3WkPPXfJMdFPz5cUsVBS3t9cXSDCgeoTPd6ns", "fee": 5000000, "feeAssetId": null, "timestamp": 1750881318910, "version": 2, "chainId": 71, "sender": "3GgTgarB4mvEUWB2VaZZR2eAuCccpK9f1FZ", "senderPublicKey": "8dNEACURBe9HFX8kgDH2MVb1mxkFC7Txoqvi4ymdPiNd", "proofs": [ "46soZ8evLYAWzBf5Um19434WEDTSop1dNsMP64dSXvVVTsoqDYLEVXaiurygcPqynYfTLysvuHzi7V8gGLteziqJ" ], "script": "base64:AAIFAAAAAAAAAGoIAhIGCgQICAEEEgMKAQgSAwoBBBIGCgQEBAQEEgMKAQESBAoCCAQSBwoFCAgBAQESBAoCCAgSBAoCCAESBQoDCAgIEgQKAggIEgUKAwgIARIFCgMICAESBAoCCAgSBAoCCAgSBQoDCAgBAAAAJgAAAAAEbWFpbgIAAAAKbWFpbl9hc3NldAAAAAAMYWRtaW5BZGRyZXNzAgAAAA1hZG1pbl9hZGRyZXNzAAAAAAJscAIAAAAJbHBfYXNzZXRfAAAAAARwb29sAgAAAAZwb29sX18AAAAABGZhcm0CAAAABmZhcm1fXwAAAAAGc3Rha2VkAgAAAAdzdGFrZWRfAAAAAA1yZXdhcmRDbGFpbWVkAgAAAA9yZXdhcmRfY2xhaW1lZF8AAAAADWRlcG9zaXRIZWlnaHQCAAAAD2RlcG9zaXRfaGVpZ2h0XwAAAAAKZmFybUhlaWdodAIAAAAMZmFybV9oZWlnaHRfAAAAAAt0b3RhbExvY2tlZAIAAAANdG90YWxfbG9ja2VkXwAAAAAHc3dhcEZlZQIAAAAIc3dhcF9mZWUAAAAADmZhcm1SZXdhcmRQb29sAgAAABFmYXJtX3Jld2FyZF9wb29sXwAAAAAHZmFybUFwcgIAAAAJZmFybV9hcHJfAAAAAA5mYXJtTG9ja0Jsb2NrcwIAAAARZmFybV9sb2NrX2Jsb2Nrc18AAAAAD2Zhcm1Ub3RhbFN0YWtlZAIAAAASZmFybV90b3RhbF9zdGFrZWRfAAAAABFibGFja2xpc3RlZFRva2VucwIAAAAMYmxhY2tsaXN0ZWRfAAAAAA50b3RhbFVzZXJzRmFybQIAAAARdG90YWxfdXNlcnNfZmFybV8AAAAAAkQ4AAAAAAAF9eEAAAAAAA9jb250cmFjdEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQgFAAAABHRoaXMAAAAFYnl0ZXMAAAAAAmFjAgAAAAhhY3RpdmF0ZQAAAAAGcG9vbEFjAgAAAA5hY3RpdmF0ZV9wb29scwAAAAAGc3dhcEFjAgAAAA1hY3RpdmF0ZV9zd2FwAAAAAAtsaXF1aWRpdHlBYwIAAAASYWN0aXZhdGVfbGlxdWlkaXR5AAAAAAZmYXJtQWMCAAAADmFjdGl2YXRlX2Zhcm1zAQAAAAJrcAAAAAIAAAAGYXNz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IHRva2VuAwkAAAAAAAACCQEAAAAKdmFsaWRQb29sSwAAAAEFAAAAB3Bvb2xLZXkAAAAAAAAAAAAJAAACAAAAAQIAAAATUG9vbCBkb2VzIG5vdCBleGlzdAMJAABnAAAAAgAAAAAAAAAAAAUAAAAIbHBBbW91bnQJAAACAAAAAQIAAAAaTFAgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAAC3Bvb2xBbW91bnQxCQEAAAAGcG9vbEFBAAAAAgUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAAAtwb29sQW1vdW50MgkBAAAABnBvb2xBQQAAAAIFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAANdG90YWxMcFN1cHBseQQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEFAAAACWxwQXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAAWEFAAAAByRtYXRjaDAIBQAAAAFhAAAACHF1YW50aXR5AAAAAAAAAAAABAAAAAdhbW91bnQxCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQxBQAAAA10b3RhbExwU3VwcGx5BAAAAAdhbW91bnQyCQAAaQAAAAIJAABoAAAAAgUAAAAIbHBBbW91bnQFAAAAC3Bvb2xBbW91bnQyBQAAAA10b3RhbExwU3VwcGx5BAAAAApjdXJyZW50S2V5CQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAE2N1cnJlbnRBbW91bnRBc3NldDEJAQAAAA11c2VyTGlxdWlkaXR5AAAAAwUAAAAKY3VycmVudEtleQUAAAAHcG9vbEtleQUAAAAGYXNzZXQxBAAAABNjdXJyZW50QW1vdW50QXNzZXQyCQEAAAANdXNlckxpcXVpZGl0eQAAAAMFAAAACmN1cnJlbnRLZXkFAAAAB3Bvb2xLZXkFAAAABmFzc2V0MgQAAAAPbmV3QW1vdW50QXNzZXQxCQAAZQAAAAIFAAAAE2N1cnJlbnRBbW91bnRBc3NldDEFAAAAB2Ftb3VudDEEAAAAD25ld0Ftb3VudEFzc2V0MgkAAGUAAAACBQAAABNjdXJyZW50QW1vdW50QXNzZXQyBQAAAAdhbW91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ZWN0b3IEAAAAAWEFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAABYQIAAAADR0lDBAAAAApkZWNpbWFsc0luCQEAAAAQZ2V0QXNzZXREZWNpbWFscwAAAAEFAAAAB2Fzc2V0SW4EAAAAC2RlY2ltYWxzT3V0CQEAAAAQZ2V0QXNzZXREZWNpbWFscwAAAAEFAAAACGFzc2V0T3V0BAAAAAZmZWVCcHMJAAE2AAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAAHc3dhcEZlZQQAAAAJYWRtaW5BZGRyCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAxhZG1pbkFkZHJlc3MDAwkAAAAAAAACBQAAAApwbXRBc3NldElkAgAAAANHSUMDCQAAAAAAAAIFAAAAB2Fzc2V0SW4CAAAALDg3ejVHaE04ZHQ0VDlVYnlGR2pXYU1Ka3o5OUFYNXV2QllKY0RTVWs1QUdkBgkAAAAAAAACBQAAAAhhc3NldE91dAIAAAAsODd6NUdoTThkdDRUOVVieUZHaldhTUprejk5QVg1dXZCWUpjRFNVazVBR2QHCQAAAgAAAAECAAAAIUdpYy11c2d0IGlzIG5vdyBhdmFsaWFibGUgdG8gc3dhcAMJAQAAAAEhAAAAAQUAAAAFcG93ZXIJAAACAAAAAQIAAAAjZEFwcCBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UDBQAAAAxzd2FwQWN0aXZhdGUJAAACAAAAAQIAAAAjU3dhcCBpcyBjdXJyZW50bHkgdW5kZXIgbWFpbnRlbmFuY2UDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAdhc3NldEluCQAAAgAAAAECAAAAJFBheW1lbnQgYXNzZXQgZG9lcyBub3QgbWF0Y2ggYXNzZXRJbgMJAQAAAAEhAAAAAQkBAAAADGlzVmFsaWRBc3NldAAAAAEFAAAAB2Fzc2V0SW4JAAACAAAAAQIAAAAPSW52YWxpZCBhc3NldEluAwkBAAAAASEAAAABCQEAAAAMaXNWYWxpZEFzc2V0AAAAAQUAAAAIYXNzZXRPdXQJAAACAAAAAQIAAAAQSW52YWxp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AAAAFGJsb2Nrc1NpbmNlTGFzdENsYWltBQAAAA1jdXJyZW50U3Rha2VkBQAAAAJEOAAAAAAAAAAAAAQAAAANbmV3UmV3YXJkUG9vbAkAAGUAAAACBQAAAApyZXdhcmRQb29sBQAAAAZyZXdhcmQEAAAACW5ld1N0YWtlZAkAAGUAAAACBQAAAA1jdXJyZW50U3Rha2VkBQAAAAZhbW91bnQEAAAADnRvdGFsU3Rha2VkS2V5CQABLAAAAAIFAAAAD2Zhcm1Ub3RhbFN0YWtlZAUAAAAHcG9vbEtleQQAAAATcHJldmlvdXNUb3RhbFN0YWtlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA50b3RhbFN0YWtlZEtleQAAAAAAAAAAAAQAAAAObmV3VG90YWxTdGFrZWQJAABlAAAAAgUAAAATcHJldmlvdXNUb3RhbFN0YWtlZAUAAAAGYW1vdW50BAAAAA1uZXdUb3RhbFVzZXJzAwkAAAAAAAACBQAAAAluZXdTdGFrZWQAAAAAAAAAAAAJAABlAAAAAgUAAAAKdG90YWxVc2VycwAAAAAAAAAAAQUAAAAKdG90YWxVc2VycwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJc3Rha2VkS2V5BQAAAAluZXdTdGFrZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADnRvdGFsU3Rha2VkS2V5BQAAAA5uZXdUb3RhbFN0YWtlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAA50b3RhbFVzZXJzRmFybQUAAAAHcG9vbEtleQUAAAANbmV3VG90YWxVc2VycwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJcmV3YXJkS2V5AAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAADmZhcm1SZXdhcmRQb29sBQAAAAdwb29sS2V5BQAAAA1uZXdSZXdhcmRQb29sCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAloZWlnaHRLZXkFAAAABmhlaWdodAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABmFtb3VudAUAAAAHbHBBc3NldAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABnJld2FyZAUAAAAEdW5pdAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAHJG1hdGNoMAUAAAACdHgJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5w2Rl+g==", "height": 6641, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 66CDrzaGxu2EYDPeh4BYiw5z9B6nToTJdXhdimC2cABw Next: none Diff:
OldNewDifferences
459459 let decimalsOut = getAssetDecimals(assetOut)
460460 let feeBps = toBigInt(getIntegerValue(this, swapFee))
461461 let adminAddr = addressFromStringValue(getStringValue(this, adminAddress))
462- if (!(power))
463- then throw("dApp is currently under maintenance")
464- else if (swapActivate)
465- then throw("Swap is currently under maintenance")
466- else if ((pmtAssetId != assetIn))
467- then throw("Payment asset does not match assetIn")
468- else if (!(isValidAsset(assetIn)))
469- then throw("Invalid assetIn")
470- else if (!(isValidAsset(assetOut)))
471- then throw("Invalid assetOut")
472- else if (if (isBlacklisted(assetIn))
473- then true
474- else isBlacklisted(assetOut))
475- then throw("One or both assets are blacklisted")
476- else if ((assetIn == assetOut))
477- then throw("assetIn cannot be equal to assetOut")
478- else if (if (if ((assetIn == "GIC"))
479- then true
480- else (assetOut == "GIC"))
481- then !(acGic)
482- else false)
483- then throw("GIC not allowed")
484- else if ((key == ""))
485- then throw("Pool does not exist")
486- else {
487- let isReverse = (key == reversePoolKey)
488- let poolAsset1 = if (isReverse)
489- then assetOut
490- else assetIn
491- let poolAsset2 = if (isReverse)
492- then assetIn
493- else assetOut
494- let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
495- let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
496- let amountInAdjusted = toBigInt(pmt.amount)
497- let amountOut = if (isReverse)
498- then ((amountInAdjusted * poolAmount1) / poolAmount2)
499- else ((amountInAdjusted * poolAmount2) / poolAmount1)
500- let fee = ((amountOut * feeBps) / toBigInt(10000))
501- let amountOutAfterFee = (amountOut - fee)
502- let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
503- let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
504- if ((minAmountOut > amountOutAfterFee))
505- then throw("Slippage exceeded")
506- else {
507- let newPoolAmount1 = if (isReverse)
508- then (poolAmount1 - amountOut)
509- else (poolAmount1 + amountInAdjusted)
510- let newPoolAmount2 = if (isReverse)
511- then (poolAmount2 + amountInAdjusted)
512- else (poolAmount2 - amountOut)
513- let assettoReceive = if ((assetOut == "GIC"))
514- then unit
515- else fromBase58String(assetOut)
516- let assetOutBytes = if ((assetIn == "GIC"))
517- then unit
518- else fromBase58String(assetIn)
462+ if (if ((pmtAssetId == "GIC"))
463+ then if ((assetIn == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd"))
464+ then true
465+ else (assetOut == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd")
466+ else false)
467+ then throw("Gic-usgt is now avaliable to swap")
468+ else if (!(power))
469+ then throw("dApp is currently under maintenance")
470+ else if (swapActivate)
471+ then throw("Swap is currently under maintenance")
472+ else if ((pmtAssetId != assetIn))
473+ then throw("Payment asset does not match assetIn")
474+ else if (!(isValidAsset(assetIn)))
475+ then throw("Invalid assetIn")
476+ else if (!(isValidAsset(assetOut)))
477+ then throw("Invalid assetOut")
478+ else if (if (isBlacklisted(assetIn))
479+ then true
480+ else isBlacklisted(assetOut))
481+ then throw("One or both assets are blacklisted")
482+ else if ((assetIn == assetOut))
483+ then throw("assetIn cannot be equal to assetOut")
484+ else if (if (if ((assetIn == "GIC"))
485+ then true
486+ else (assetOut == "GIC"))
487+ then !(acGic)
488+ else false)
489+ then throw("GIC not allowed")
490+ else if ((key == ""))
491+ then throw("Pool does not exist")
492+ else {
493+ let isReverse = (key == reversePoolKey)
494+ let poolAsset1 = if (isReverse)
495+ then assetOut
496+ else assetIn
497+ let poolAsset2 = if (isReverse)
498+ then assetIn
499+ else assetOut
500+ let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
501+ let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
502+ let amountInAdjusted = toBigInt(pmt.amount)
503+ let amountOut = if (isReverse)
504+ then ((amountInAdjusted * poolAmount1) / poolAmount2)
505+ else ((amountInAdjusted * poolAmount2) / poolAmount1)
506+ let fee = ((amountOut * feeBps) / toBigInt(10000))
507+ let amountOutAfterFee = (amountOut - fee)
508+ let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
509+ let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
510+ if ((minAmountOut > amountOutAfterFee))
511+ then throw("Slippage exceeded")
512+ else {
513+ let newPoolAmount1 = if (isReverse)
514+ then (poolAmount1 - amountOut)
515+ else (poolAmount1 + amountInAdjusted)
516+ let newPoolAmount2 = if (isReverse)
517+ then (poolAmount2 + amountInAdjusted)
518+ else (poolAmount2 - amountOut)
519+ let assettoReceive = if ((assetOut == "GIC"))
520+ then unit
521+ else fromBase58String(assetOut)
522+ let assetOutBytes = if ((assetIn == "GIC"))
523+ then unit
524+ else fromBase58String(assetIn)
519525 [IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assettoReceive), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
520- }
521- }
526+ }
527+ }
522528 }
523529
524530
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let main = "main_asset"
55
66 let adminAddress = "admin_address"
77
88 let lp = "lp_asset_"
99
1010 let pool = "pool__"
1111
1212 let farm = "farm__"
1313
1414 let staked = "staked_"
1515
1616 let rewardClaimed = "reward_claimed_"
1717
1818 let depositHeight = "deposit_height_"
1919
2020 let farmHeight = "farm_height_"
2121
2222 let totalLocked = "total_locked_"
2323
2424 let swapFee = "swap_fee"
2525
2626 let farmRewardPool = "farm_reward_pool_"
2727
2828 let farmApr = "farm_apr_"
2929
3030 let farmLockBlocks = "farm_lock_blocks_"
3131
3232 let farmTotalStaked = "farm_total_staked_"
3333
3434 let blacklistedTokens = "blacklisted_"
3535
3636 let totalUsersFarm = "total_users_farm_"
3737
3838 let D8 = 100000000
3939
4040 let contractAddress = Address(this.bytes)
4141
4242 let ac = "activate"
4343
4444 let poolAc = "activate_pools"
4545
4646 let swapAc = "activate_swap"
4747
4848 let liquidityAc = "activate_liquidity"
4949
5050 let farmAc = "activate_farms"
5151
5252 func kp (asset1,asset2) = (((pool + asset1) + "_") + asset2)
5353
5454
5555 func fk (asset1,asset2) = (((farm + asset1) + "_") + asset2)
5656
5757
5858 func sk (asset1,asset2,address) = (((staked + kp(asset1, asset2)) + "_") + address)
5959
6060
6161 func rk (asset1,asset2,address) = (((rewardClaimed + kp(asset1, asset2)) + "_") + address)
6262
6363
6464 func dh (asset1,asset2,address) = (((depositHeight + kp(asset1, asset2)) + "_") + address)
6565
6666
6767 func fh (asset1,asset2,address) = (((farmHeight + kp(asset1, asset2)) + "_") + address)
6868
6969
7070 func isValidAsset (assetId) = if ((assetId == "GIC"))
7171 then true
7272 else match assetInfo(fromBase58String(assetId)) {
7373 case a: Asset =>
7474 true
7575 case _ =>
7676 false
7777 }
7878
7979
8080 func isBlacklisted (assetId) = valueOrElse(getBoolean(this, (blacklistedTokens + assetId)), false)
8181
8282
8383 func getAssetDecimals (assetId) = if ((assetId == "GIC"))
8484 then 8
8585 else match assetInfo(fromBase58String(assetId)) {
8686 case a: Asset =>
8787 a.decimals
8888 case _ =>
8989 8
9090 }
9191
9292
9393 func getAddressIfValid (address) = toString(valueOrErrorMessage(addressFromString(address), (("Can't parse " + address) + " as address")))
9494
9595
9696 func validPoolK (key) = match getInteger(this, key) {
9797 case t: Int =>
9898 t
9999 case _ =>
100100 0
101101 }
102102
103103
104104 func poolAA (key,asset) = match getInteger(this, ((key + "_") + asset)) {
105105 case t: Int =>
106106 t
107107 case _ =>
108108 0
109109 }
110110
111111
112112 func userLiquidity (address,key,asset) = match getInteger(this, ((((key + "_") + address) + "_") + asset)) {
113113 case t: Int =>
114114 t
115115 case _ =>
116116 0
117117 }
118118
119119
120120 func getAdminAddress () = if ((valueOrElse(getStringValue(adminAddress), "") == ""))
121121 then throw("Constructor has not been initialized yet!")
122122 else getStringValue(adminAddress)
123123
124124
125125 @Callable(i)
126126 func constructor (MainAssetId,AdminAddress,SwapFeeBps,acceptGic) = if ((i.caller != this))
127127 then throw("Only the contract itself can invoke this function")
128128 else if (!(isValidAsset(MainAssetId)))
129129 then throw("Invalid MainAssetId")
130130 else if ((AdminAddress == ""))
131131 then throw("Invalid AdminAddress")
132132 else if (if ((0 > SwapFeeBps))
133133 then true
134134 else (SwapFeeBps > 1000))
135135 then throw("SwapFeeBps must be between 0 and 1000")
136136 else [StringEntry(main, MainAssetId), StringEntry(adminAddress, AdminAddress), IntegerEntry(swapFee, SwapFeeBps), BooleanEntry(ac, true), BooleanEntry(poolAc, false), BooleanEntry(swapAc, false), BooleanEntry(liquidityAc, false), BooleanEntry(farmAc, false), BooleanEntry("accept_gic", acceptGic)]
137137
138138
139139
140140 @Callable(i)
141141 func changeAdmin (address) = {
142142 let admin = getAdminAddress()
143143 if ((toBase58String(i.caller.bytes) != admin))
144144 then throw("Only the Admin itself can invoke this function.")
145145 else [StringEntry(adminAddress, address)]
146146 }
147147
148148
149149
150150 @Callable(i)
151151 func activate (v) = {
152152 let admin = getAdminAddress()
153153 if ((toBase58String(i.caller.bytes) != admin))
154154 then throw("Only the Admin itself can invoke this function")
155155 else [BooleanEntry(ac, v)]
156156 }
157157
158158
159159
160160 @Callable(i)
161161 func maintenance (pools,swap,stake,farms) = {
162162 let admin = getAdminAddress()
163163 if ((toBase58String(i.caller.bytes) != admin))
164164 then throw("Only the Admin itself can invoke this function")
165165 else [BooleanEntry(poolAc, pools), BooleanEntry(swapAc, swap), BooleanEntry(liquidityAc, stake), BooleanEntry(farmAc, farms)]
166166 }
167167
168168
169169
170170 @Callable(i)
171171 func setSwapFee (feeBps) = {
172172 let admin = getAdminAddress()
173173 if ((toBase58String(i.caller.bytes) != admin))
174174 then throw("Only the Admin itself can invoke this function")
175175 else if (if ((0 > feeBps))
176176 then true
177177 else (feeBps > 1000))
178178 then throw("Fee must be between 0 and 1000 basis points")
179179 else [IntegerEntry(swapFee, feeBps)]
180180 }
181181
182182
183183
184184 @Callable(i)
185185 func blacklistToken (assetId,blacklist) = {
186186 let admin = getAdminAddress()
187187 if ((toBase58String(i.caller.bytes) != admin))
188188 then throw("Only the Admin itself can invoke this function")
189189 else if (if (!(isValidAsset(assetId)))
190190 then (assetId != "GIC")
191191 else false)
192192 then throw("Invalid assetId")
193193 else [BooleanEntry((blacklistedTokens + assetId), blacklist)]
194194 }
195195
196196
197197
198198 @Callable(i)
199199 func createFarm (asset1,asset2,apr,lockBlocks,rewardAmount) = {
200200 let admin = getAdminAddress()
201201 if ((toBase58String(i.caller.bytes) != admin))
202202 then throw("Only the Admin itself can invoke this function")
203203 else if (!(isValidAsset(asset1)))
204204 then throw("Invalid asset1")
205205 else if (!(isValidAsset(asset2)))
206206 then throw("Invalid asset2")
207207 else if ((asset1 == asset2))
208208 then throw("Asset1 cannot be equal to Asset2")
209209 else if ((0 >= apr))
210210 then throw("APR must be positive")
211211 else if ((0 >= lockBlocks))
212212 then throw("Lock blocks must be positive")
213213 else if ((0 >= rewardAmount))
214214 then throw("Reward amount must be positive")
215215 else {
216216 let poolKey = kp(asset1, asset2)
217217 if ((validPoolK(poolKey) == 0))
218218 then throw("Pool does not exist")
219219 else {
220220 let farmKey = fk(asset1, asset2)
221221 [IntegerEntry(farmKey, 1), IntegerEntry((farmApr + poolKey), apr), IntegerEntry((farmLockBlocks + poolKey), lockBlocks), IntegerEntry((farmRewardPool + poolKey), rewardAmount), IntegerEntry((farmTotalStaked + poolKey), 0), IntegerEntry((totalUsersFarm + poolKey), 0)]
222222 }
223223 }
224224 }
225225
226226
227227
228228 @Callable(i)
229229 func fundFarm (asset1,asset2) = {
230230 let admin = getAdminAddress()
231231 if ((toBase58String(i.caller.bytes) != admin))
232232 then throw("Only the Admin itself can invoke this function")
233233 else {
234234 let pmt = i.payments[0]
235235 let pmtAssetId = match pmt.assetId {
236236 case a: ByteVector =>
237237 toBase58String(a)
238238 case _ =>
239239 "GIC"
240240 }
241241 if ((toBase58String(i.caller.bytes) != admin))
242242 then throw("Only the Admin itself can invoke this function")
243243 else if ((pmtAssetId != "GIC"))
244244 then throw("Rewards must be in GIC")
245245 else {
246246 let poolKey = kp(asset1, asset2)
247247 let farmKey = fk(asset1, asset2)
248248 if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
249249 then throw("Farm does not exist")
250250 else {
251251 let currentRewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
252252 let newRewardPool = (currentRewardPool + pmt.amount)
253253 [IntegerEntry((farmRewardPool + poolKey), newRewardPool)]
254254 }
255255 }
256256 }
257257 }
258258
259259
260260
261261 @Callable(i)
262262 func changeData (key,data) = {
263263 let admin = getAdminAddress()
264264 if ((toBase58String(i.caller.bytes) != admin))
265265 then throw("Only the Admin itself can invoke this function")
266266 else [IntegerEntry(key, data)]
267267 }
268268
269269
270270
271271 @Callable(i)
272272 func createPool (asset1,asset2,nameLp) = {
273273 let poolKey = kp(asset1, asset2)
274274 let admin = getAdminAddress()
275275 if ((toBase58String(i.caller.bytes) != admin))
276276 then throw("Only the Admin itself can invoke this function")
277277 else if (!(isValidAsset(asset1)))
278278 then throw("Invalid asset1")
279279 else if (!(isValidAsset(asset2)))
280280 then throw("Invalid asset2")
281281 else if ((asset1 == asset2))
282282 then throw("Asset1 cannot be equal to Asset2")
283283 else if (if (isBlacklisted(asset1))
284284 then true
285285 else isBlacklisted(asset2))
286286 then throw("One or both assets are blacklisted")
287287 else if ((validPoolK(poolKey) != 0))
288288 then throw("Pool already exists")
289289 else {
290290 let assetLpCreate = Issue(nameLp, ((("LP asset for pool " + asset1) + "_") + asset2), 1, 8, true)
291291 let idAssetLp = calculateAssetId(assetLpCreate)
292292 [assetLpCreate, StringEntry((lp + poolKey), toBase58String(idAssetLp)), IntegerEntry(poolKey, 1)]
293293 }
294294 }
295295
296296
297297
298298 @Callable(i)
299299 func addLiquidity (asset1,asset2) = {
300300 let power = getBooleanValue(this, ac)
301301 let liquidityPower = getBooleanValue(this, liquidityAc)
302302 let acGic = getBooleanValue(this, "accept_gic")
303303 let poolKey = kp(asset1, asset2)
304304 let pmt1 = i.payments[0]
305305 let pmt2 = i.payments[1]
306306 let asset1Id = match pmt1.assetId {
307307 case a: ByteVector =>
308308 toBase58String(a)
309309 case _ =>
310310 "GIC"
311311 }
312312 let asset2Id = match pmt2.assetId {
313313 case a: ByteVector =>
314314 toBase58String(a)
315315 case _ =>
316316 "GIC"
317317 }
318318 let decimals1 = getAssetDecimals(asset1Id)
319319 let decimals2 = getAssetDecimals(asset2Id)
320320 if (!(power))
321321 then throw("dApp is currently under maintenance")
322322 else if (liquidityPower)
323323 then throw("Liquidity is currently under maintenance")
324324 else if (if ((asset1Id != asset1))
325325 then true
326326 else (asset2Id != asset2))
327327 then throw("Payment assets do not match specified assets")
328328 else if ((asset1 == asset2))
329329 then throw("Asset1 cannot be equal to Asset2")
330330 else if (!(isValidAsset(asset1)))
331331 then throw("Invalid asset1")
332332 else if (!(isValidAsset(asset2)))
333333 then throw("Invalid asset2")
334334 else if (if (isBlacklisted(asset1))
335335 then true
336336 else isBlacklisted(asset2))
337337 then throw("One or both assets are blacklisted")
338338 else if (if (if ((asset1 == "GIC"))
339339 then true
340340 else (asset2 == "GIC"))
341341 then !(acGic)
342342 else false)
343343 then throw("GIC not allowed")
344344 else if ((validPoolK(poolKey) == 0))
345345 then throw("Pool does not exist. Create it first")
346346 else {
347347 let poolAmount1 = poolAA(poolKey, asset1)
348348 let poolAmount2 = poolAA(poolKey, asset2)
349349 let amount1 = pmt1.amount
350350 let amount2 = pmt2.amount
351351 let lpAmount = if (if ((poolAmount1 == 0))
352352 then true
353353 else (poolAmount2 == 0))
354354 then toBigInt(amount1)
355355 else ((toBigInt(amount1) * toBigInt(poolAmount2)) / toBigInt(poolAmount1))
356356 let currentKey = toBase58String(i.caller.bytes)
357357 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
358358 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
359359 let newAmountAsset1 = (toBigInt(currentAmountAsset1) + toBigInt(amount1))
360360 let newAmountAsset2 = (toBigInt(currentAmountAsset2) + toBigInt(amount2))
361361 let newPoolAmount1 = (toBigInt(poolAmount1) + toBigInt(amount1))
362362 let newPoolAmount2 = (toBigInt(poolAmount2) + toBigInt(amount2))
363363 let lpAssetId = getStringValue(this, (lp + poolKey))
364364 let oldAssetLpTotal = valueOrElse(getIntegerValue(poolKey), 0)
365365 let lpAsset = if ((lpAssetId == ""))
366366 then throw("Pool does not have a liquidity pair, contact admin")
367367 else fromBase58String(lpAssetId)
368368 [IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset1), toInt(newAmountAsset1)), IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset2), toInt(newAmountAsset2)), IntegerEntry(((poolKey + "_") + asset1), toInt(newPoolAmount1)), IntegerEntry(((poolKey + "_") + asset2), toInt(newPoolAmount2)), IntegerEntry((((depositHeight + poolKey) + "_") + currentKey), height), IntegerEntry(poolKey, (oldAssetLpTotal + toInt(lpAmount))), Reissue(lpAsset, toInt(lpAmount), true), ScriptTransfer(i.caller, toInt(lpAmount), lpAsset)]
369369 }
370370 }
371371
372372
373373
374374 @Callable(i)
375375 func removeLiquidity (asset1,asset2,lpAmount) = {
376376 let power = getBooleanValue(this, ac)
377377 let liquidityPower = getBooleanValue(this, liquidityAc)
378378 let poolKey = kp(asset1, asset2)
379379 let lpAssetId = getStringValue(this, (lp + poolKey))
380380 let lpAsset = fromBase58String(lpAssetId)
381381 let pmt = i.payments[0]
382382 let pmtAssetId = match pmt.assetId {
383383 case a: ByteVector =>
384384 toBase58String(a)
385385 case _ =>
386386 "GIC"
387387 }
388388 let decimals1 = getAssetDecimals(asset1)
389389 let decimals2 = getAssetDecimals(asset2)
390390 if (!(power))
391391 then throw("dApp is currently under maintenance")
392392 else if (liquidityPower)
393393 then throw("Liquidity is currently under maintenance")
394394 else if ((lpAssetId == ""))
395395 then throw("Invalid LP asset")
396396 else if ((pmtAssetId != lpAssetId))
397397 then throw("Invalid LP token")
398398 else if ((validPoolK(poolKey) == 0))
399399 then throw("Pool does not exist")
400400 else if ((0 >= lpAmount))
401401 then throw("LP amount must be positive")
402402 else {
403403 let poolAmount1 = poolAA(poolKey, asset1)
404404 let poolAmount2 = poolAA(poolKey, asset2)
405405 let totalLpSupply = match assetInfo(fromBase58String(lpAssetId)) {
406406 case a: Asset =>
407407 a.quantity
408408 case _ =>
409409 0
410410 }
411411 let amount1 = ((lpAmount * poolAmount1) / totalLpSupply)
412412 let amount2 = ((lpAmount * poolAmount2) / totalLpSupply)
413413 let currentKey = toBase58String(i.caller.bytes)
414414 let currentAmountAsset1 = userLiquidity(currentKey, poolKey, asset1)
415415 let currentAmountAsset2 = userLiquidity(currentKey, poolKey, asset2)
416416 let newAmountAsset1 = (currentAmountAsset1 - amount1)
417417 let newAmountAsset2 = (currentAmountAsset2 - amount2)
418418 if (if ((0 > newAmountAsset1))
419419 then true
420420 else (0 > newAmountAsset2))
421421 then throw("Insufficient liquidity balance")
422422 else {
423423 let newPoolAmount1 = (poolAmount1 - amount1)
424424 let newPoolAmount2 = (poolAmount2 - amount2)
425425 let asset1Bytes = if ((asset1 == "GIC"))
426426 then unit
427427 else fromBase58String(asset1)
428428 let asset2Bytes = if ((asset2 == "GIC"))
429429 then unit
430430 else fromBase58String(asset2)
431431 let oldAssetLpTotal = getIntegerValue(poolKey)
432432 [IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset1), newAmountAsset1), IntegerEntry(((((poolKey + "_") + currentKey) + "_") + asset2), newAmountAsset2), IntegerEntry(((poolKey + "_") + asset1), newPoolAmount1), IntegerEntry(((poolKey + "_") + asset2), newPoolAmount2), IntegerEntry(poolKey, (oldAssetLpTotal - lpAmount)), Burn(lpAsset, lpAmount), ScriptTransfer(i.caller, amount1, asset1Bytes), ScriptTransfer(i.caller, amount2, asset2Bytes)]
433433 }
434434 }
435435 }
436436
437437
438438
439439 @Callable(i)
440440 func swap (assetIn,assetOut,maxSlippage) = {
441441 let power = getBooleanValue(this, ac)
442442 let swapActivate = getBooleanValue(this, swapAc)
443443 let acGic = getBooleanValue(this, "accept_gic")
444444 let poolKey = kp(assetIn, assetOut)
445445 let reversePoolKey = kp(assetOut, assetIn)
446446 let key = if ((validPoolK(poolKey) != 0))
447447 then poolKey
448448 else if ((validPoolK(reversePoolKey) != 0))
449449 then reversePoolKey
450450 else ""
451451 let pmt = i.payments[0]
452452 let pmtAssetId = match pmt.assetId {
453453 case a: ByteVector =>
454454 toBase58String(a)
455455 case _ =>
456456 "GIC"
457457 }
458458 let decimalsIn = getAssetDecimals(assetIn)
459459 let decimalsOut = getAssetDecimals(assetOut)
460460 let feeBps = toBigInt(getIntegerValue(this, swapFee))
461461 let adminAddr = addressFromStringValue(getStringValue(this, adminAddress))
462- if (!(power))
463- then throw("dApp is currently under maintenance")
464- else if (swapActivate)
465- then throw("Swap is currently under maintenance")
466- else if ((pmtAssetId != assetIn))
467- then throw("Payment asset does not match assetIn")
468- else if (!(isValidAsset(assetIn)))
469- then throw("Invalid assetIn")
470- else if (!(isValidAsset(assetOut)))
471- then throw("Invalid assetOut")
472- else if (if (isBlacklisted(assetIn))
473- then true
474- else isBlacklisted(assetOut))
475- then throw("One or both assets are blacklisted")
476- else if ((assetIn == assetOut))
477- then throw("assetIn cannot be equal to assetOut")
478- else if (if (if ((assetIn == "GIC"))
479- then true
480- else (assetOut == "GIC"))
481- then !(acGic)
482- else false)
483- then throw("GIC not allowed")
484- else if ((key == ""))
485- then throw("Pool does not exist")
486- else {
487- let isReverse = (key == reversePoolKey)
488- let poolAsset1 = if (isReverse)
489- then assetOut
490- else assetIn
491- let poolAsset2 = if (isReverse)
492- then assetIn
493- else assetOut
494- let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
495- let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
496- let amountInAdjusted = toBigInt(pmt.amount)
497- let amountOut = if (isReverse)
498- then ((amountInAdjusted * poolAmount1) / poolAmount2)
499- else ((amountInAdjusted * poolAmount2) / poolAmount1)
500- let fee = ((amountOut * feeBps) / toBigInt(10000))
501- let amountOutAfterFee = (amountOut - fee)
502- let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
503- let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
504- if ((minAmountOut > amountOutAfterFee))
505- then throw("Slippage exceeded")
506- else {
507- let newPoolAmount1 = if (isReverse)
508- then (poolAmount1 - amountOut)
509- else (poolAmount1 + amountInAdjusted)
510- let newPoolAmount2 = if (isReverse)
511- then (poolAmount2 + amountInAdjusted)
512- else (poolAmount2 - amountOut)
513- let assettoReceive = if ((assetOut == "GIC"))
514- then unit
515- else fromBase58String(assetOut)
516- let assetOutBytes = if ((assetIn == "GIC"))
517- then unit
518- else fromBase58String(assetIn)
462+ if (if ((pmtAssetId == "GIC"))
463+ then if ((assetIn == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd"))
464+ then true
465+ else (assetOut == "87z5GhM8dt4T9UbyFGjWaMJkz99AX5uvBYJcDSUk5AGd")
466+ else false)
467+ then throw("Gic-usgt is now avaliable to swap")
468+ else if (!(power))
469+ then throw("dApp is currently under maintenance")
470+ else if (swapActivate)
471+ then throw("Swap is currently under maintenance")
472+ else if ((pmtAssetId != assetIn))
473+ then throw("Payment asset does not match assetIn")
474+ else if (!(isValidAsset(assetIn)))
475+ then throw("Invalid assetIn")
476+ else if (!(isValidAsset(assetOut)))
477+ then throw("Invalid assetOut")
478+ else if (if (isBlacklisted(assetIn))
479+ then true
480+ else isBlacklisted(assetOut))
481+ then throw("One or both assets are blacklisted")
482+ else if ((assetIn == assetOut))
483+ then throw("assetIn cannot be equal to assetOut")
484+ else if (if (if ((assetIn == "GIC"))
485+ then true
486+ else (assetOut == "GIC"))
487+ then !(acGic)
488+ else false)
489+ then throw("GIC not allowed")
490+ else if ((key == ""))
491+ then throw("Pool does not exist")
492+ else {
493+ let isReverse = (key == reversePoolKey)
494+ let poolAsset1 = if (isReverse)
495+ then assetOut
496+ else assetIn
497+ let poolAsset2 = if (isReverse)
498+ then assetIn
499+ else assetOut
500+ let poolAmount1 = toBigInt(poolAA(key, poolAsset1))
501+ let poolAmount2 = toBigInt(poolAA(key, poolAsset2))
502+ let amountInAdjusted = toBigInt(pmt.amount)
503+ let amountOut = if (isReverse)
504+ then ((amountInAdjusted * poolAmount1) / poolAmount2)
505+ else ((amountInAdjusted * poolAmount2) / poolAmount1)
506+ let fee = ((amountOut * feeBps) / toBigInt(10000))
507+ let amountOutAfterFee = (amountOut - fee)
508+ let feeToSend = ((amountInAdjusted * feeBps) / toBigInt(10000))
509+ let minAmountOut = ((amountOutAfterFee * toBigInt((10000 - maxSlippage))) / toBigInt(10000))
510+ if ((minAmountOut > amountOutAfterFee))
511+ then throw("Slippage exceeded")
512+ else {
513+ let newPoolAmount1 = if (isReverse)
514+ then (poolAmount1 - amountOut)
515+ else (poolAmount1 + amountInAdjusted)
516+ let newPoolAmount2 = if (isReverse)
517+ then (poolAmount2 + amountInAdjusted)
518+ else (poolAmount2 - amountOut)
519+ let assettoReceive = if ((assetOut == "GIC"))
520+ then unit
521+ else fromBase58String(assetOut)
522+ let assetOutBytes = if ((assetIn == "GIC"))
523+ then unit
524+ else fromBase58String(assetIn)
519525 [IntegerEntry(((key + "_") + poolAsset1), toInt(newPoolAmount1)), IntegerEntry(((key + "_") + poolAsset2), toInt(newPoolAmount2)), BooleanEntry("isReverse", isReverse), ScriptTransfer(i.caller, toInt(amountOutAfterFee), assettoReceive), ScriptTransfer(adminAddr, toInt(feeToSend), assetOutBytes)]
520- }
521- }
526+ }
527+ }
522528 }
523529
524530
525531
526532 @Callable(i)
527533 func farmsAddLP (asset1,asset2) = {
528534 let power = getBooleanValue(this, ac)
529535 let farmPower = getBooleanValue(this, farmAc)
530536 let poolKey = kp(asset1, asset2)
531537 let farmKey = fk(asset1, asset2)
532538 let pmt = i.payments[0]
533539 let lpAssetId = getStringValue(this, (lp + poolKey))
534540 let pmtAssetId = match pmt.assetId {
535541 case a: ByteVector =>
536542 toBase58String(a)
537543 case _ =>
538544 "GIC"
539545 }
540546 if (!(power))
541547 then throw("dApp is currently under maintenance")
542548 else if (farmPower)
543549 then throw("Farms are currently under maintenance")
544550 else if ((pmtAssetId != lpAssetId))
545551 then throw("Invalid LP token")
546552 else if ((validPoolK(poolKey) == 0))
547553 then throw("Pool does not exist")
548554 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
549555 then throw("Farm does not exist")
550556 else {
551557 let currentKey = toBase58String(i.caller.bytes)
552558 let stakedKey = sk(asset1, asset2, currentKey)
553559 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
554560 let newStaked = (currentStaked + pmt.amount)
555561 let totalStakedKey = (farmTotalStaked + poolKey)
556562 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
557563 let newTotalStaked = (previousTotalStaked + pmt.amount)
558564 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 0)
559565 let newTotalUsers = if ((currentStaked == 0))
560566 then (totalUsers + 1)
561567 else totalUsers
562568 [IntegerEntry(stakedKey, newStaked), IntegerEntry(totalStakedKey, newTotalStaked), IntegerEntry((totalUsersFarm + poolKey), newTotalUsers), IntegerEntry(fh(asset1, asset2, currentKey), height)]
563569 }
564570 }
565571
566572
567573
568574 @Callable(i)
569575 func farmsClaimLP (asset1,asset2) = {
570576 let power = getBooleanValue(this, ac)
571577 let farmPower = getBooleanValue(this, farmAc)
572578 let poolKey = kp(asset1, asset2)
573579 let farmKey = fk(asset1, asset2)
574580 let currentKey = toBase58String(i.caller.bytes)
575581 let stakedKey = sk(asset1, asset2, currentKey)
576582 let heightKey = fh(asset1, asset2, currentKey)
577583 let rewardKey = rk(asset1, asset2, currentKey)
578584 if (!(power))
579585 then throw("dApp is currently under maintenance")
580586 else if (farmPower)
581587 then throw("Farms are currently under maintenance")
582588 else if ((validPoolK(poolKey) == 0))
583589 then throw("Pool does not exist")
584590 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
585591 then throw("Farm does not exist")
586592 else {
587593 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
588594 if ((0 >= currentStaked))
589595 then throw("No staked LP tokens")
590596 else {
591597 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
592598 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
593599 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
594600 let apr = getIntegerValue(this, (farmApr + poolKey))
595601 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
596602 let blocksSinceLastClaim = (height - lastClaimHeight)
597603 if ((1 > blocksSinceLastClaim))
598604 then throw("Must wait at least 1 block since last claim")
599605 else {
600606 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
601607 let reward = (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
602608 if ((reward > rewardPool))
603609 then throw("Insufficient reward pool")
604610 else {
605611 let newRewardPool = (rewardPool - reward)
606612 [IntegerEntry(rewardKey, 0), IntegerEntry((farmRewardPool + poolKey), newRewardPool), IntegerEntry(heightKey, height), ScriptTransfer(i.caller, reward, unit)]
607613 }
608614 }
609615 }
610616 }
611617 }
612618
613619
614620
615621 @Callable(i)
616622 func farmsRemoveLP (asset1,asset2,amount) = {
617623 let power = getBooleanValue(this, ac)
618624 let farmPower = getBooleanValue(this, farmAc)
619625 let poolKey = kp(asset1, asset2)
620626 let farmKey = fk(asset1, asset2)
621627 let lpAssetId = getStringValue(this, (lp + poolKey))
622628 let lpAsset = if ((lpAssetId == ""))
623629 then unit
624630 else fromBase58String(lpAssetId)
625631 let currentKey = toBase58String(i.caller.bytes)
626632 let stakedKey = sk(asset1, asset2, currentKey)
627633 let heightKey = fh(asset1, asset2, currentKey)
628634 let rewardKey = rk(asset1, asset2, currentKey)
629635 if (!(power))
630636 then throw("dApp is currently under maintenance")
631637 else if (farmPower)
632638 then throw("Farms are currently under maintenance")
633639 else if ((validPoolK(poolKey) == 0))
634640 then throw("Pool does not exist")
635641 else if ((valueOrElse(getInteger(this, farmKey), 0) == 0))
636642 then throw("Farm does not exist")
637643 else {
638644 let currentStaked = valueOrElse(getInteger(this, stakedKey), 0)
639645 if ((0 >= amount))
640646 then throw("Amount must be positive")
641647 else if ((amount > currentStaked))
642648 then throw("Insufficient staked LP tokens")
643649 else {
644650 let rewardPool = valueOrElse(getInteger(this, (farmRewardPool + poolKey)), 0)
645651 let totalUsers = valueOrElse(getInteger(this, (totalUsersFarm + poolKey)), 1)
646652 let lockBlocks = getIntegerValue(this, (farmLockBlocks + poolKey))
647653 let apr = getIntegerValue(this, (farmApr + poolKey))
648654 let lastClaimHeight = valueOrElse(getInteger(this, heightKey), height)
649655 let blocksSinceLastClaim = (height - lastClaimHeight)
650656 let rewardPerBlock = ((rewardPool * apr) / ((10000 * lockBlocks) * totalUsers))
651657 let reward = if ((blocksSinceLastClaim >= 1))
652658 then (((rewardPerBlock * blocksSinceLastClaim) * currentStaked) / D8)
653659 else 0
654660 let newRewardPool = (rewardPool - reward)
655661 let newStaked = (currentStaked - amount)
656662 let totalStakedKey = (farmTotalStaked + poolKey)
657663 let previousTotalStaked = valueOrElse(getInteger(this, totalStakedKey), 0)
658664 let newTotalStaked = (previousTotalStaked - amount)
659665 let newTotalUsers = if ((newStaked == 0))
660666 then (totalUsers - 1)
661667 else totalUsers
662668 [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)]
663669 }
664670 }
665671 }
666672
667673
668674 @Verifier(tx)
669675 func verify () = match tx {
670676 case _ =>
671677 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
672678 }
673679

github/gicsportsofficial/g8-explorer
99.59 ms