tx · BN844neNvaD2xMTH2b19vRXvTX4cxQrMqLeV3kETxEAC

3N61Cvq5XcnPk9rxpy2Rnp3bSr4syNGUJph:  -0.01400000 Waves

2021.11.08 18:59 [1782247] smart account 3N61Cvq5XcnPk9rxpy2Rnp3bSr4syNGUJph > SELF 0.00000000 Waves

{ "type": 13, "id": "BN844neNvaD2xMTH2b19vRXvTX4cxQrMqLeV3kETxEAC", "fee": 1400000, "feeAssetId": null, "timestamp": 1636387285018, "version": 2, "chainId": 84, "sender": "3N61Cvq5XcnPk9rxpy2Rnp3bSr4syNGUJph", "senderPublicKey": "G7cNXePvAHUHmZfXa1eHnvFeH6DuykPC5wm9v9djTKgD", "proofs": [ "5BTrLJL9L3ksehaRqEtqojW9JpBPA8wZCSaQDcjF5UuSMvZv4HKB6eqfphw2Crjij1pzqcZZiF9v6K7qMZKeWERe" ], "script": "base64:AAIFAAAAAAAAACEIAhIAEgYKBBgYGBESBgoECAgBARIAEgMKAQgSBAoCCAEAAAAGAAAAAApkZXBvc2l0RmVlAAAAAAAAAAPoAAAAAA1jb250cm9sbGVyRmVlAAAAAAAAACcQAAAAAAtwbGF0Zm9ybUZlZQAAAAAAAAAnEAAAAAAMYWRtaW5QdWJLZXkxAQAAACDgkMh3M2mpU305XK7y5b9J+9C9m7ycRhB7Y2h8D+QzGgAAAAAMYWRtaW5QdWJLZXkyAQAAACDgkMh3M2mpU305XK7y5b9J+9C9m7ycRhB7Y2h8D+QzGgAAAAAMYWRtaW5QdWJLZXkzAQAAACDgkMh3M2mpU305XK7y5b9J+9C9m7ycRhB7Y2h8D+QzGgAAAAYAAAACYTgBAAAABGluaXQAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAADEzUFBIN3g3aXFvYlc1eml5aVJDaWMxOXJRcUtyNm5QWWFLMV9hc3NldF9iYWxhbmNlAAAAAAAAbdStBQAAAANuaWwAAAABaQEAAAAIYWRkUG9vbHMAAAAEAAAABXBvb2xzAAAAD2xpcXVpZGl0eVRva2VucwAAAA1zZXJ2aWNlVG9rZW5zAAAAFmxpcXVpZGl0eVRva2VuRGVjaW1hbHMDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkKAQAAABBnZW5lcmF0ZVBvb2xLZXlzAAAAAgAAAAthY2N1bXVsYXRlZAAAAARwb29sCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wCAAAADl9hc3NldF9iYWxhbmNlAAAAAAAAAAAABQAAAAthY2N1bXVsYXRlZAoBAAAAHmdlbmVyYXRlUG9vbExpcXVpZGl0eVRva2VuS2V5cwAAAAIAAAALYWNjdW11bGF0ZWQAAAAEcG9vbAQAAAAJcG9vbEluZGV4CQEAAAAFdmFsdWUAAAABCQAETwAAAAIFAAAABXBvb2xzBQAAAARwb29sBAAAAA5saXF1aWRpdHlUb2tlbgkAAZEAAAACBQAAAA9saXF1aWRpdHlUb2tlbnMFAAAACXBvb2xJbmRleAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAEF9saXF1aWRpdHlfdG9rZW4FAAAADmxpcXVpZGl0eVRva2VuBQAAAAthY2N1bXVsYXRlZAoBAAAAHGdlbmVyYXRlUG9vbFNlcnZpY2VUb2tlbktleXMAAAACAAAAC2FjY3VtdWxhdGVkAAAABHBvb2wEAAAACXBvb2xJbmRleAkBAAAABXZhbHVlAAAAAQkABE8AAAACBQAAAAVwb29scwUAAAAEcG9vbAQAAAAObGlxdWlkaXR5VG9rZW4JAAGRAAAAAgUAAAANc2VydmljZVRva2VucwUAAAAJcG9vbEluZGV4CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAAOX3NlcnZpY2VfdG9rZW4FAAAADmxpcXVpZGl0eVRva2VuBQAAAAthY2N1bXVsYXRlZAoBAAAAJWdlbmVyYXRlUG9vbExpcXVpZGl0eVRva2VuRGVjaW1hbEtleXMAAAACAAAAC2FjY3VtdWxhdGVkAAAABHBvb2wEAAAACXBvb2xJbmRleAkBAAAABXZhbHVlAAAAAQkABE8AAAACBQAAAAVwb29scwUAAAAEcG9vbAQAAAAObGlxdWlkaXR5VG9rZW4JAAGRAAAAAgUAAAAWbGlxdWlkaXR5VG9rZW5EZWNpbWFscwUAAAAJcG9vbEluZGV4CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wCAAAADl9zZXJ2aWNlX3Rva2VuBQAAAA5saXF1aWRpdHlUb2tlbgUAAAALYWNjdW11bGF0ZWQKAQAAABZnZW5lcmF0ZVBvb2xBY3RpdmVLZXlzAAAAAgAAAAthY2N1bXVsYXRlZAAAAARwb29sCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAB19hY3RpdmUGBQAAAAthY2N1bXVsYXRlZAQAAAAPcG9vbEJhbGFuY2VLZXlzCgAAAAACJGwFAAAABXBvb2xz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AQUAAAAVbGlxdWlkdXR5QXNzZXRBZGRyZXNzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVBc3NldAQAAAAFYXNzZXQFAAAAByRtYXRjaDAIBQAAAAVhc3NldAAAAAhkZWNpbWFscwkAAAIAAAABAgAAABBDYW4ndCBmaW5kIGFzc2V0AwkBAAAAAiE9AAAAAgUAAAAVbGlxdWlkdXR5QXNzZXRBZGRyZXNzBQAAAA1hc3NldElkU3RyaW5nCQAAAgAAAAECAAAAL1lvdSBhdHRhY2hlZCB3cm9uZyBsaXF1aWRpdHkgdG9rZW4gZnJvbSBTd29wLmZpBAAAAApwb29sQW1vdW50CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzBQAAAA1wb29sQW1vdW50S2V5BAAAAAp1c2VyQW1vdW50BAAAAAckbWF0Y2gwCQAEHwAAAAEFAAAAEXVzZXJQb29sQW1vdW50S2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAA2ludAUAAAAHJG1hdGNoMAUAAAADaW50BAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwAAAAAAAAAAAABAAAAA1uZXdQb29sQW1vdW50CQAAZAAAAAIFAAAACnBvb2xBbW91bnQFAAAABmFtb3VudAQAAAAUdXNlckFtb3VudFdpdGhvdXRGZWUJAABlAAAAAgkAAGUAAAACBQAAAAZhbW91bnQJAQAAAAhmcmFjdGlvbgAAAAQFAAAABmFtb3VudAAAAAAAAAAAAQUAAAAKZGVwb3NpdEZlZQUAAAAGSEFMRlVQCQEAAAAIZnJhY3Rpb24AAAAEBQAAAAZhbW91bnQAAAAAAAAAAAEFAAAADWNvbnRyb2xsZXJGZWUFAAAABkhBTEZVUAQAAAARbmV3VXNlclBvb2xBbW91bnQJAABkAAAAAgUAAAAKdXNlckFtb3VudAUAAAAUdXNlckFtb3VudFdpdGhvdXRGZWUJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADCQACWQAAAAEFAAAAEGRBcHBBc3NldEFkZHJlc3MFAAAAFHVzZXJBbW91bnRXaXRob3V0RmVlBgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIF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MAkAA+wAAAABCQACWQAAAAEFAAAAFWxpcXVpZHV0eUFzc2V0QWRkcmVzcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAABWFzc2V0BQAAAAckbWF0Y2gwCAUAAAAFYXNzZXQAAAAIZGVjaW1hbHMJAAACAAAAAQIAAAAQQ2FuJ3QgZmluZCBhc3NldAQAAAAPdXNlckVhcm5lZFRvdGFsCQAAZAAAAAIFAAAACnVzZXJFYXJuZWQFAAAAEHVzZXJFYXJuZWRCZWZvcmUEAAAAEGFtb3VudFdpdGhvdXRGZWUJAABlAAAAAgkAAGUAAAACBQAAAAZhbW91bnQJAQAAAAhmcmFjdGlvbgAAAAQFAAAABmFtb3VudAAAAAAAAAAAAQUAAAALcGxhdGZvcm1GZWUFAAAABkhBTEZVUAkBAAAACGZyYWN0aW9uAAAABAUAAAAGYW1vdW50AAAAAAAAAAABBQAAAA1jb250cm9sbGVyRmVlBQAAAAZIQUxGVVAEAAAADW5ld1Bvb2xBbW91bnQJAABlAAAAAgUAAAAKcG9vbEFtb3VudAUAAAAQYW1vdW50V2l0aG91dEZlZQMJAABnAAAAAgUAAAAKdXNlckFtb3VudAUAAAAGYW1vdW50BAAAABFuZXdVc2VyUG9vbEFtb3VudAkAAGUAAAACBQAAAAp1c2VyQW1vdW50BQAAABBhbW91bnRXaXRob3V0RmVlCQAETAAAAAIJAQAAAARCdXJuAAAAAgkAAlkAAAABBQAAABBkQXBwQXNzZXRBZGRyZXNzBQAAABBhbW91bnRXaXRob3V0RmVlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAQYW1vdW50V2l0aG91dEZlZQkAAlkAAAABBQAAABVsaXF1aWR1dHlBc3NldEFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADXBvb2xBbW91bnRLZXkFAAAADW5ld1Bvb2xBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEXVzZXJQb29sQW1vdW50S2V5BQAAABFuZXdVc2VyUG9vbEFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARdXNlclBvb2xFYXJuZWRLZXkFAAAAD3VzZXJFYXJuZWRUb3RhbAUAAAADbmlsCQAAAgAAAAECAAAAJllvdSBoYXZlIG5vdCBzdWNoIGJhbGFuY2UgZm9yIHdpdGhkcmF3AAAAAQAAAAJiNgEAAAACYjcAAAAACQAB9AAAAAMIBQAAAAJiNgAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAmI2AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAmI2AAAAD3NlbmRlclB1YmxpY0tleS3FC4Q=", "height": 1782247, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3e9t4msHvrXRpz7AuNWH3RhouAMEKHZw6Q6fw2sr2t9h Next: BReKKxAw7ZFM7mK6Bo5EWhf6xiTMxXvtBjvvYznWyxwt Diff:
OldNewDifferences
139139 func deposit (pool) = {
140140 let amount = i.payments[0].amount
141141 let assetId = i.payments[0].assetId
142- let poolAmountKey = (pool + "_asset_balance")
143- let userAddress = toString(i.caller)
144- let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
145- let dAppAssetAddress = match getString((pool + "_service_token")) {
146- case string: String =>
147- string
148- case nothing =>
149- throw("You try to exchange on unsupported pool")
142+ let assetIdString = match assetId {
143+ case id: ByteVector =>
144+ toBase58String(id)
145+ case _ =>
146+ throw("Match error")
150147 }
151- let poolAmount = getIntegerValue(this, poolAmountKey)
152- let userAmount = match getInteger(userPoolAmountKey) {
153- case int: Int =>
154- int
155- case nothing =>
156- 0
157- }
158- let newPoolAmount = (poolAmount + amount)
159- let userAmountWithoutFee = ((amount - fraction(amount, 1, depositFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
160- let newUserPoolAmount = (userAmount + userAmountWithoutFee)
148+ if ((size(i.payments) != 1))
149+ then throw("One attached payment expected")
150+ else if ((0 >= amount))
151+ then throw(("Deposit amount must be positive. Actual: " + toString(amount)))
152+ else {
153+ let poolAmountKey = (pool + "_asset_balance")
154+ let userAddress = toString(i.caller)
155+ let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
156+ let dAppAssetAddress = match getString((pool + "_service_token")) {
157+ case string: String =>
158+ string
159+ case nothing =>
160+ throw("You try to deposit on unsupported pool")
161+ }
162+ let liquidutyAssetAddress = getStringValue(this, (pool + "_liquidity_token"))
163+ let liquidityTokenDecimal = match assetInfo(fromBase58String(liquidutyAssetAddress)) {
164+ case asset: Asset =>
165+ asset.decimals
166+ case _ =>
167+ throw("Can't find asset")
168+ }
169+ if ((liquidutyAssetAddress != assetIdString))
170+ then throw("You attached wrong liquidity token from Swop.fi")
171+ else {
172+ let poolAmount = getIntegerValue(this, poolAmountKey)
173+ let userAmount = match getInteger(userPoolAmountKey) {
174+ case int: Int =>
175+ int
176+ case nothing =>
177+ 0
178+ }
179+ let newPoolAmount = (poolAmount + amount)
180+ let userAmountWithoutFee = ((amount - fraction(amount, 1, depositFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
181+ let newUserPoolAmount = (userAmount + userAmountWithoutFee)
161182 [Reissue(fromBase58String(dAppAssetAddress), userAmountWithoutFee, true), ScriptTransfer(i.caller, userAmountWithoutFee, fromBase58String(dAppAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
183+ }
184+ }
162185 }
163186
164187
167190 func withdraw (pool,userEarned) = {
168191 let amount = i.payments[0].amount
169192 let assetId = i.payments[0].assetId
170- let poolAmountKey = (pool + "_asset_balance")
171- let userAddress = toString(i.caller)
172- let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
173- let userPoolEarnedKey = (((pool + "_") + userAddress) + "_earned")
174- let dAppAssetAddress = match getString((pool + "_service_token")) {
175- case string: String =>
176- string
177- case nothing =>
178- throw("You try to exchange on unsupported pool")
193+ let assetIdString = match assetId {
194+ case id: ByteVector =>
195+ toBase58String(id)
196+ case _ =>
197+ throw("Match error")
179198 }
180- let poolAmount = getIntegerValue(this, poolAmountKey)
181- let userAmount = match getInteger(userPoolAmountKey) {
182- case int: Int =>
183- int
184- case nothing =>
185- 0
186- }
187- let userEarnedBefore = match getInteger(userPoolEarnedKey) {
188- case int: Int =>
189- int
190- case nothing =>
191- 0
192- }
193- let liquidutyAssetAddress = getStringValue(this, (pool + "_liquidity_token"))
194- let liquidityTokenDecimal = match assetInfo(fromBase58String(liquidutyAssetAddress)) {
195- case asset: Asset =>
196- asset.decimals
197- case _ =>
198- throw("Can't find asset")
199- }
200- let userEarnedTotal = (userEarned + userEarnedBefore)
201- let amountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
202- let newPoolAmount = (poolAmount - amountWithoutFee)
203- if ((userAmount >= amount))
204- then {
205- let newUserPoolAmount = (userAmount - amountWithoutFee)
199+ if ((size(i.payments) != 1))
200+ then throw("One attached payment expected")
201+ else if ((0 >= amount))
202+ then throw(("Withdraw amount must be positive. Actual: " + toString(amount)))
203+ else {
204+ let poolAmountKey = (pool + "_asset_balance")
205+ let userAddress = toString(i.caller)
206+ let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
207+ let userPoolEarnedKey = (((pool + "_") + userAddress) + "_earned")
208+ let dAppAssetAddress = match getString((pool + "_service_token")) {
209+ case string: String =>
210+ string
211+ case nothing =>
212+ throw("You try to withdraw from unsupported pool")
213+ }
214+ if ((dAppAssetAddress != assetIdString))
215+ then throw("You attached an wrong token")
216+ else {
217+ let poolAmount = getIntegerValue(this, poolAmountKey)
218+ let userAmount = match getInteger(userPoolAmountKey) {
219+ case int: Int =>
220+ int
221+ case nothing =>
222+ 0
223+ }
224+ let userEarnedBefore = match getInteger(userPoolEarnedKey) {
225+ case int: Int =>
226+ int
227+ case nothing =>
228+ 0
229+ }
230+ let liquidutyAssetAddress = getStringValue(this, (pool + "_liquidity_token"))
231+ let liquidityTokenDecimal = match assetInfo(fromBase58String(liquidutyAssetAddress)) {
232+ case asset: Asset =>
233+ asset.decimals
234+ case _ =>
235+ throw("Can't find asset")
236+ }
237+ let userEarnedTotal = (userEarned + userEarnedBefore)
238+ let amountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
239+ let newPoolAmount = (poolAmount - amountWithoutFee)
240+ if ((userAmount >= amount))
241+ then {
242+ let newUserPoolAmount = (userAmount - amountWithoutFee)
206243 [Burn(fromBase58String(dAppAssetAddress), amountWithoutFee), ScriptTransfer(i.caller, amountWithoutFee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount), IntegerEntry(userPoolEarnedKey, userEarnedTotal)]
207- }
208- else throw("You have not such balance for withdraw")
244+ }
245+ else throw("You have not such balance for withdraw")
246+ }
247+ }
209248 }
210249
211250
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let depositFee = 1000
55
66 let controllerFee = 10000
77
88 let platformFee = 10000
99
1010 let adminPubKey1 = base58'G7cNXePvAHUHmZfXa1eHnvFeH6DuykPC5wm9v9djTKgD'
1111
1212 let adminPubKey2 = base58'G7cNXePvAHUHmZfXa1eHnvFeH6DuykPC5wm9v9djTKgD'
1313
1414 let adminPubKey3 = base58'G7cNXePvAHUHmZfXa1eHnvFeH6DuykPC5wm9v9djTKgD'
1515
1616 @Callable(a8)
1717 func init () = [IntegerEntry("3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1_asset_balance", 7197869)]
1818
1919
2020
2121 @Callable(i)
2222 func addPools (pools,liquidityTokens,serviceTokens,liquidityTokenDecimals) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
2323 then {
2424 func generatePoolKeys (accumulated,pool) = IntegerEntry((pool + "_asset_balance"), 0) :: accumulated
2525
2626 func generatePoolLiquidityTokenKeys (accumulated,pool) = {
2727 let poolIndex = value(indexOf(pools, pool))
2828 let liquidityToken = liquidityTokens[poolIndex]
2929 StringEntry((pool + "_liquidity_token"), liquidityToken) :: accumulated
3030 }
3131
3232 func generatePoolServiceTokenKeys (accumulated,pool) = {
3333 let poolIndex = value(indexOf(pools, pool))
3434 let liquidityToken = serviceTokens[poolIndex]
3535 StringEntry((pool + "_service_token"), liquidityToken) :: accumulated
3636 }
3737
3838 func generatePoolLiquidityTokenDecimalKeys (accumulated,pool) = {
3939 let poolIndex = value(indexOf(pools, pool))
4040 let liquidityToken = liquidityTokenDecimals[poolIndex]
4141 IntegerEntry((pool + "_service_token"), liquidityToken) :: accumulated
4242 }
4343
4444 func generatePoolActiveKeys (accumulated,pool) = BooleanEntry((pool + "_active"), true) :: accumulated
4545
4646 let poolBalanceKeys = {
4747 let $l = pools
4848 let $s = size($l)
4949 let $acc0 = nil
5050 func 1 ($a,$i) = if (($i >= $s))
5151 then $a
5252 else generatePoolKeys($a, $l[$i])
5353
5454 func 2 ($a,$i) = if (($i >= $s))
5555 then $a
5656 else throw("List size exceeds 20")
5757
5858 2(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
5959 }
6060 let poolLiquidityTokenKeys = {
6161 let $l = pools
6262 let $s = size($l)
6363 let $acc0 = nil
6464 func 1 ($a,$i) = if (($i >= $s))
6565 then $a
6666 else generatePoolLiquidityTokenKeys($a, $l[$i])
6767
6868 func 2 ($a,$i) = if (($i >= $s))
6969 then $a
7070 else throw("List size exceeds 20")
7171
7272 2(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
7373 }
7474 let poolServiceTokenKeys = {
7575 let $l = pools
7676 let $s = size($l)
7777 let $acc0 = nil
7878 func 1 ($a,$i) = if (($i >= $s))
7979 then $a
8080 else generatePoolServiceTokenKeys($a, $l[$i])
8181
8282 func 2 ($a,$i) = if (($i >= $s))
8383 then $a
8484 else throw("List size exceeds 20")
8585
8686 2(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
8787 }
8888 let poolLiquidityTokenDecimalKeys = {
8989 let $l = pools
9090 let $s = size($l)
9191 let $acc0 = nil
9292 func 1 ($a,$i) = if (($i >= $s))
9393 then $a
9494 else generatePoolLiquidityTokenDecimalKeys($a, $l[$i])
9595
9696 func 2 ($a,$i) = if (($i >= $s))
9797 then $a
9898 else throw("List size exceeds 20")
9999
100100 2(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
101101 }
102102 let poolActiveKeys = {
103103 let $l = pools
104104 let $s = size($l)
105105 let $acc0 = nil
106106 func 1 ($a,$i) = if (($i >= $s))
107107 then $a
108108 else generatePoolActiveKeys($a, $l[$i])
109109
110110 func 2 ($a,$i) = if (($i >= $s))
111111 then $a
112112 else throw("List size exceeds 20")
113113
114114 2(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
115115 }
116116 ((((poolBalanceKeys ++ poolLiquidityTokenKeys) ++ poolServiceTokenKeys) ++ poolLiquidityTokenDecimalKeys) ++ poolActiveKeys)
117117 }
118118 else throw("Only admin can call this function")
119119
120120
121121
122122 @Callable(i)
123123 func issueToken (name,description,quantity,decimals) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
124124 then [Issue(name, description, quantity, decimals, true, unit, 0)]
125125 else throw("Only admin can call this function")
126126
127127
128128
129129 @Callable(a8)
130130 func call () = {
131131 let a9 = Issue("Asset107112021", "Asset from dApp 1", 100000, 2, true, unit, 0)
132132 let a10 = Issue("Asset207112021", "Asset from dApp 2", 100000, 2, true, unit, 0)
133133 [a10, a9]
134134 }
135135
136136
137137
138138 @Callable(i)
139139 func deposit (pool) = {
140140 let amount = i.payments[0].amount
141141 let assetId = i.payments[0].assetId
142- let poolAmountKey = (pool + "_asset_balance")
143- let userAddress = toString(i.caller)
144- let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
145- let dAppAssetAddress = match getString((pool + "_service_token")) {
146- case string: String =>
147- string
148- case nothing =>
149- throw("You try to exchange on unsupported pool")
142+ let assetIdString = match assetId {
143+ case id: ByteVector =>
144+ toBase58String(id)
145+ case _ =>
146+ throw("Match error")
150147 }
151- let poolAmount = getIntegerValue(this, poolAmountKey)
152- let userAmount = match getInteger(userPoolAmountKey) {
153- case int: Int =>
154- int
155- case nothing =>
156- 0
157- }
158- let newPoolAmount = (poolAmount + amount)
159- let userAmountWithoutFee = ((amount - fraction(amount, 1, depositFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
160- let newUserPoolAmount = (userAmount + userAmountWithoutFee)
148+ if ((size(i.payments) != 1))
149+ then throw("One attached payment expected")
150+ else if ((0 >= amount))
151+ then throw(("Deposit amount must be positive. Actual: " + toString(amount)))
152+ else {
153+ let poolAmountKey = (pool + "_asset_balance")
154+ let userAddress = toString(i.caller)
155+ let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
156+ let dAppAssetAddress = match getString((pool + "_service_token")) {
157+ case string: String =>
158+ string
159+ case nothing =>
160+ throw("You try to deposit on unsupported pool")
161+ }
162+ let liquidutyAssetAddress = getStringValue(this, (pool + "_liquidity_token"))
163+ let liquidityTokenDecimal = match assetInfo(fromBase58String(liquidutyAssetAddress)) {
164+ case asset: Asset =>
165+ asset.decimals
166+ case _ =>
167+ throw("Can't find asset")
168+ }
169+ if ((liquidutyAssetAddress != assetIdString))
170+ then throw("You attached wrong liquidity token from Swop.fi")
171+ else {
172+ let poolAmount = getIntegerValue(this, poolAmountKey)
173+ let userAmount = match getInteger(userPoolAmountKey) {
174+ case int: Int =>
175+ int
176+ case nothing =>
177+ 0
178+ }
179+ let newPoolAmount = (poolAmount + amount)
180+ let userAmountWithoutFee = ((amount - fraction(amount, 1, depositFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
181+ let newUserPoolAmount = (userAmount + userAmountWithoutFee)
161182 [Reissue(fromBase58String(dAppAssetAddress), userAmountWithoutFee, true), ScriptTransfer(i.caller, userAmountWithoutFee, fromBase58String(dAppAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount)]
183+ }
184+ }
162185 }
163186
164187
165188
166189 @Callable(i)
167190 func withdraw (pool,userEarned) = {
168191 let amount = i.payments[0].amount
169192 let assetId = i.payments[0].assetId
170- let poolAmountKey = (pool + "_asset_balance")
171- let userAddress = toString(i.caller)
172- let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
173- let userPoolEarnedKey = (((pool + "_") + userAddress) + "_earned")
174- let dAppAssetAddress = match getString((pool + "_service_token")) {
175- case string: String =>
176- string
177- case nothing =>
178- throw("You try to exchange on unsupported pool")
193+ let assetIdString = match assetId {
194+ case id: ByteVector =>
195+ toBase58String(id)
196+ case _ =>
197+ throw("Match error")
179198 }
180- let poolAmount = getIntegerValue(this, poolAmountKey)
181- let userAmount = match getInteger(userPoolAmountKey) {
182- case int: Int =>
183- int
184- case nothing =>
185- 0
186- }
187- let userEarnedBefore = match getInteger(userPoolEarnedKey) {
188- case int: Int =>
189- int
190- case nothing =>
191- 0
192- }
193- let liquidutyAssetAddress = getStringValue(this, (pool + "_liquidity_token"))
194- let liquidityTokenDecimal = match assetInfo(fromBase58String(liquidutyAssetAddress)) {
195- case asset: Asset =>
196- asset.decimals
197- case _ =>
198- throw("Can't find asset")
199- }
200- let userEarnedTotal = (userEarned + userEarnedBefore)
201- let amountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
202- let newPoolAmount = (poolAmount - amountWithoutFee)
203- if ((userAmount >= amount))
204- then {
205- let newUserPoolAmount = (userAmount - amountWithoutFee)
199+ if ((size(i.payments) != 1))
200+ then throw("One attached payment expected")
201+ else if ((0 >= amount))
202+ then throw(("Withdraw amount must be positive. Actual: " + toString(amount)))
203+ else {
204+ let poolAmountKey = (pool + "_asset_balance")
205+ let userAddress = toString(i.caller)
206+ let userPoolAmountKey = (((pool + "_") + userAddress) + "_asset_balance")
207+ let userPoolEarnedKey = (((pool + "_") + userAddress) + "_earned")
208+ let dAppAssetAddress = match getString((pool + "_service_token")) {
209+ case string: String =>
210+ string
211+ case nothing =>
212+ throw("You try to withdraw from unsupported pool")
213+ }
214+ if ((dAppAssetAddress != assetIdString))
215+ then throw("You attached an wrong token")
216+ else {
217+ let poolAmount = getIntegerValue(this, poolAmountKey)
218+ let userAmount = match getInteger(userPoolAmountKey) {
219+ case int: Int =>
220+ int
221+ case nothing =>
222+ 0
223+ }
224+ let userEarnedBefore = match getInteger(userPoolEarnedKey) {
225+ case int: Int =>
226+ int
227+ case nothing =>
228+ 0
229+ }
230+ let liquidutyAssetAddress = getStringValue(this, (pool + "_liquidity_token"))
231+ let liquidityTokenDecimal = match assetInfo(fromBase58String(liquidutyAssetAddress)) {
232+ case asset: Asset =>
233+ asset.decimals
234+ case _ =>
235+ throw("Can't find asset")
236+ }
237+ let userEarnedTotal = (userEarned + userEarnedBefore)
238+ let amountWithoutFee = ((amount - fraction(amount, 1, platformFee, HALFUP)) - fraction(amount, 1, controllerFee, HALFUP))
239+ let newPoolAmount = (poolAmount - amountWithoutFee)
240+ if ((userAmount >= amount))
241+ then {
242+ let newUserPoolAmount = (userAmount - amountWithoutFee)
206243 [Burn(fromBase58String(dAppAssetAddress), amountWithoutFee), ScriptTransfer(i.caller, amountWithoutFee, fromBase58String(liquidutyAssetAddress)), IntegerEntry(poolAmountKey, newPoolAmount), IntegerEntry(userPoolAmountKey, newUserPoolAmount), IntegerEntry(userPoolEarnedKey, userEarnedTotal)]
207- }
208- else throw("You have not such balance for withdraw")
244+ }
245+ else throw("You have not such balance for withdraw")
246+ }
247+ }
209248 }
210249
211250
212251 @Verifier(b6)
213252 func b7 () = sigVerify(b6.bodyBytes, b6.proofs[0], b6.senderPublicKey)
214253

github/deemru/w8io/169f3d6 
37.36 ms