tx · 53iEWmzij1CJNCqc28p1u224upvcFf1B3JKccX58Waz3

3PDrYPF6izza2sXWffzTPF7e2Fcir2CMpki:  -0.01400000 Waves

2021.11.25 20:20 [2871782] smart account 3PDrYPF6izza2sXWffzTPF7e2Fcir2CMpki > SELF 0.00000000 Waves

{ "type": 13, "id": "53iEWmzij1CJNCqc28p1u224upvcFf1B3JKccX58Waz3", "fee": 1400000, "feeAssetId": null, "timestamp": 1637860864333, "version": 2, "chainId": 87, "sender": "3PDrYPF6izza2sXWffzTPF7e2Fcir2CMpki", "senderPublicKey": "BHGZUnraSaYR29gbS4KuRhjkKjKbD22KfX6vjJdcMQd3", "proofs": [ "5djvgboM7xMRFqmFwygKT9qABCpqzRbrPAqjpdPtgXA3MrkYvefQwYkxEwvanyPCmcWwkZ2bLhGSLtR5HtVFSuCs" ], "script": "base64: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LAAAAAICAAAAB2dsb2JhbF8JAQAAAA5nZXRBc3NldFN0cmluZwAAAAEFAAAAB3Rva2VuSWQCAAAACF9iYWxhbmNlBAAAAAdQU3VwcGx5CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BAAAAA10b2tlbkRlY2ltYWxzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAdzdGF0aWNfCQEAAAAOZ2V0QXNzZXRTdHJpbmcAAAABBQAAAAd0b2tlbklkAgAAAAZfc2NhbGUEAAAABmFtb3VudAkBAAAACGZyYWN0aW9uAAAABAkAAGUAAAACBQAAAA10b2tlbkRlY2ltYWxzCQEAAAAIZnJhY3Rpb24AAAAECQAAZQAAAAIFAAAAB1BTdXBwbHkFAAAACVBSZWRlZW1lZAUAAAANdG9rZW5EZWNpbWFscwUAAAAHUFN1cHBseQUAAAAERE9XTgUAAAACQmsFAAAADXRva2VuRGVjaW1hbHMFAAAABERPV04JAAROAAAAAgUAAAAFYWNjdW0JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAdnbG9iYWxfCQEAAAAOZ2V0QXNzZXRTdHJpbmcAAAABBQAAAAd0b2tlbklkAgAAAAhfYmFsYW5jZQkAAGUAAAACBQAAAAJCawUAAAAGYW1vdW50BQAAAANuaWwKAQAAABJoYW5kbGVUb2tlblJlZGVlbTIAAAACAAAABWFjY3VtAAAAB3Rva2VuSWQEAAAAAkJrCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAdnbG9iYWxfCQEAAAAOZ2V0QXNzZXRTdHJpbmcAAAABBQAAAAd0b2tlbklkAgAAAAhfYmFsYW5jZQQAAAAHUFN1cHBseQkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAQAAAANdG9rZW5EZWNpbWFscwkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAHc3RhdGljXwkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAH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BQAAAAdJbmRleEluAAAAAAAAACcQCQABkQAAAAIFAAAADUFzc2V0c1dlaWdodHMFAAAACEluZGV4T3V0AAAAAAAAAAAECQABkQAAAAIFAAAACERlY2ltYWxzBQAAAAhJbmRleE91dAUAAAAFRkxPT1IJAAGRAAAAAgUAAAAGU2NhbGVzBQAAAAhJbmRleE91dAUAAAAERE9XTgEAAAAPZ2V0VG9rZW5CYWxhbmNlAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAF0BQAAAAckbWF0Y2gwCQAD8AAAAAIFAAAABHRoaXMFAAAAAXQICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlAQAAAB1jYWxjdWxhdGVDdXJyZW50QXNzZXRJbnRlcmVzdAAAAAQAAAAHYXNzZXRJZAAAAAphc3NldElkU3RyAAAACGFCYWxhbmNlAAAAFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEAAAAC3RvdGFsU3Rha2VkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEmdsb2JhbF9pbmRleFN0YWtlZAQAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBQAAABZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrBAAAABNjdXJyZW50QmFsYW5jZURlbHRhCQAAZQAAAAIJAQAAAA9nZXRUb2tlbkJhbGFuY2UAAAABBQAAAAdhc3NldElkBQAAAAhhQmFsYW5jZQQAAAAUY3VycmVudFRva2VuRWFybmluZ3MDCQAAZgAAAAIFAAAAE2N1cnJlbnRCYWxhbmNlRGVsdGEFAAAAFXRva2VuQmFsYW5jZUxhc3RDaGVjawUAAAATY3VycmVudEJhbGFuY2VEZWx0YQUAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAAAAAtuZXdFYXJuaW5ncwkAAGUAAAACBQAAABRjdXJyZW50VG9rZW5FYXJuaW5ncwUAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAAAAAtuZXdJbnRlcmVzdAMJAAAAAAAAAgUAAAALdG90YWxTdGFrZWQAAAAAAAAAAAAAAAAAAAAAAAAJAABrAAAAAwUAAAALbmV3RWFybmluZ3MFAAAABlNjYWxlOAUAAAALdG90YWxTdGFrZWQEAAAAEWxhc3RDaGVja0ludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFnbG9iYWxfbGFzdENoZWNrXwUAAAAKYXNzZXRJZFN0cgIAAAAJX2ludGVyZXN0CQAAZAAAAAIFAAAAEWxhc3RDaGVja0ludGVyZXN0BQAAAAtuZXdJbnRlcmVzdAEAAAALY2xhaW1SZXN1bHQAAAABAAAAB2FkZHJlc3MEAAAACmFkZHJlc3NTdHIJAAQlAAAAAQUAAAAHYWRkcmVzcwQAAAAMcHV6emxlQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgUAAAAKYWRkcmVzc1N0cgIAAAAMX2luZGV4U3Rha2VkCgEAAAAHaGFuZGxlcgAAAAIAAAAFYWNjdW0AAAAHYXNzZXRJZAQAAAAKYXNzZXRJZFN0cgkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAHYXNzZXRJZAQAAAAIYUJhbGFuY2UJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8JAQAAAA5nZXRBc3NldFN0cmluZwAAAAEFAAAAB2Fzc2V0SWQCAAAACF9iYWxhbmNlBAAAABZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFnbG9iYWxfbGFzdENoZWNrXwUAAAAKYXNzZXRJZFN0cgIAAAAJX2Vhcm5pbmdzBAAAABRjdXJyZW50VG9rZW5JbnRlcmVzdAkBAAAAHWNhbGN1bGF0ZUN1cnJlbnRBc3NldEludGVyZXN0AAAABAUAAAAHYXNzZXRJZAUAAAAKYXNzZXRJZFN0cgUAAAAIYUJhbGFuY2UFAAAAFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEAAAAFGN1cnJlbnRUb2tlbkVhcm5pbmdzCQABlgAAAAEJAARMAAAAAgUAAAAWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawkABEwAAAACCQAAZQAAAAIJAQAAAA9nZXRUb2tlbkJhbGFuY2UAAAAB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ZW5faWQJAAACAAAAAQIAAAAUd3JvbmcgYXNzZXQgYXR0YWNoZWQJAQAAABBpbmRleFN0YWtlUmVzdWx0AAAAAgUAAAAKYWRkcmVzc1N0cggFAAAAA3BtdAAAAAZhbW91bnQAAAABaQEAAAAMdW5zdGFrZUluZGV4AAAAAQAAAAxwdXp6bGVBbW91bnQEAAAACmFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyBAAAAA9wdXp6bGVBdmFpbGFibGUJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACBQAAAAphZGRyZXNzU3RyAgAAAAxfaW5kZXhTdGFrZWQDCQAAZgAAAAIFAAAADHB1enpsZUFtb3VudAUAAAAPcHV6emxlQXZhaWxhYmxlCQAAAgAAAAECAAAAJXlvdSBkb24ndCBoYXZlIGluZGV4IHRva2VucyBhdmFpbGFibGUJAAROAAAAAgkBAAAAC2NsYWltUmVzdWx0AAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAACmFkZHJlc3NTdHICAAAADF9pbmRleFN0YWtlZAkAAGUAAAACBQAAAA9wdXp6bGVBdmFpbGFibGUFAAAADHB1enpsZUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAASZ2xvYmFsX2luZGV4U3Rha2VkCQAAZQAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAASZ2xvYmFsX2luZGV4U3Rha2VkBQAAAAxwdXp6bGVBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxwdXp6bGVBbW91bnQJAQAAABFAZXh0ck5hdGl2ZSgxMDU3KQAAAAECAAAAE2dsb2JhbF9wb29sVG9rZW5faWQFAAAAA25pbAAAAAFpAQAAABFjbGFpbUluZGV4UmV3YXJkcwAAAAAJAQAAAAtjbGFpbVJlc3VsdAAAAAEIBQAAAAFpAAAABmNhbGxlcgAAAAFpAQAAAAtyZWRlZW1JbmRleAAAAAEAAAAMc2VuZFRvT3JpZ2luBAAAAANwbXQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAADCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQJAQAAAAx0cnlHZXRCaW5hcnkAAAABAgAAABNnbG9iYWxfcG9vbFRva2VuX2lkCQAAAgAAAAECAAAAHnBsZWFzZSBhdHRhY2ggcG9vbCBzaGFyZSB0b2tlbgQAAAAJUFJlZGVlbWVkCAUAAAADcG10AAAABmFtb3VudAQAAAAGcmVzdWx0CQEAAAAWaGFuZGxlUG9vbFRva2Vuc1JlZGVlbQAAAAIFAAAACVBSZWRlZW1lZAMFAAAADHNlbmRUb09yaWdpbggFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyCAUAAAABaQAAAAZjYWxsZXIJAAROAAAAAgUAAAAGcmVzdWx0CQAETAAAAAIJAQAAAARCdXJuAAAAAgkBAAAADHRyeUdldEJpbmFyeQAAAAECAAAAE2dsb2JhbF9wb29sVG9rZW5faWQFAAAACVBSZWRlZW1lZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQJAABlAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAUAAAAJUFJlZGVlbWVkBQAAAANuaWwAAAABaQEAAAAEc3dhcAAAAAIAAAAIYXNzZXRPdXQAAAAHbWluaW11bQQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAhBbW91bnRJbgkBAAAABXZhbHVlAAAAAQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BAAAAAdBc3NldEluCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAACEFzc2V0T3V0CQACWQAAAAEFAAAACGFzc2V0T3V0BAAAAA5Bc3NldEluQmFsYW5jZQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwkAAlgAAAABBQAAAAdBc3NldEluAgAAAAhfYmFsYW5jZQQAAAAPQXNzZXRPdXRCYWxhbmNlCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAdnbG9iYWxfBQAAAAhhc3NldE91dAIAAAAIX2JhbGFuY2UEAAAACUFtb3VudE91dAkBAAAAEmNhbGN1bGF0ZU91dEFtb3VudAAAAAUFAAAACEFtb3VudEluBQAAAAdBc3NldEluBQAAAAhBc3NldE91dAUAAAAOQXNzZXRJbkJhbGFuY2UFAAAAD0Fzc2V0T3V0QmFsYW5jZQQAAAAJZmVlQW1vdW50CQAAawAAAAMFAAAACUFtb3VudE91dAUAAAADRmVlBQAAAAhGZWVTY2FsZQQAAAARcHJvdG9jb2xGZWVBbW91bnQJAABrAAAAAwUAAAAJZmVlQW1vdW50AAAAAAAAAAAoAAAAAAAAAABkBAAAAA5jbGVhbkFtb3VudE91dAkAAGUAAAACBQAAAAlBbW91bnRPdXQFAAAACWZlZUFtb3VudAMJAABmAAAAAgUAAAAHbWluaW11bQUAAAAOY2xlYW5BbW91bnRPdXQJAAACAAAAAQkAASwAAAACAgAAACthbW91bnQgdG8gcmVjaWV2ZSBpcyBsb3dlciB0aGFuIGdpdmVuIG9uZTogCQABpAAAAAEFAAAADmNsZWFuQW1vdW50T3V0AwkAAGYAAAACAAAAAAAAACcQBQAAAAhBbW91bnRJbgkAAAIAAAABAgAAABxzdW0gdG8gZXhjaGFuZ2UgaXMgdG9vIHNtYWxsAwkAAGYAAAACAAAAAAAAAAAACQAAZQAAAAIFAAAAD0Fzc2V0T3V0QmFsYW5jZQUAAAAJQW1vdW50T3V0CQAAAgAAAAECAAAAG2NvbnRyYWN0IGlzIG91dCBvZiByZXNlcnZlcwkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwUAAAAIYXNzZXRPdXQCAAAACF9iYWxhbmNlCQAAZQAAAAIFAAAAD0Fzc2V0T3V0QmFsYW5jZQUAAAAJQW1vdW50T3V0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwkAAlgAAAABBQAAAAdBc3NldEluAgAAAAhfYmFsYW5jZQkAAGQAAAACBQAAAA5Bc3NldEluQmFsYW5jZQUAAAAIQW1vdW50SW4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5jbGVhbkFtb3VudE91dAUAAAAIQXNzZXRPdXQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAADWdsb2JhbF92b2x1bWUJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAA1nbG9iYWxfdm9sdW1lCQEAAAASY2FsY3VsYXRlVXNkblZhbHVlAAAAAwUAAAAHQXNzZXRJbgUAAAAIQW1vdW50SW4FAAAADkFzc2V0SW5CYWxhbmNlBQAAAANuaWwFAAAADmNsZWFuQW1vdW50T3V0AAAAAD7b7ww=", "height": 2871782, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8cMnARbhp8647g7sSQHXQMf9mDmEbi3rCQBfo1bJjdUH Next: 6mYTNyXVbgaU2T5epzmKT7EzQaU7UiXzkRoaweBLp5bi Diff:
OldNewDifferences
1919
2020 let Scale = 10000
2121
22+let Scale8 = 100000000
23+
2224 let FeeScale = 10000
2325
2426 let feeAggregator = Address(base58'3PES7MMthaKJx9WMXnNCY3cwTGG9nD9YT8f')
27+
28+func getAssetString (assetId) = match assetId {
29+ case b: ByteVector =>
30+ toBase58String(b)
31+ case _ =>
32+ "WAVES"
33+}
34+
35+
36+let earnedAssets = assetIds
2537
2638 func tryGetInteger (key) = match getInteger(this, key) {
2739 case b: Int =>
3951 }
4052
4153
42-func getAssetString (assetId) = match assetId {
43- case b: ByteVector =>
44- toBase58String(b)
45- case _ =>
46- "WAVES"
47-}
48-
49-
50-func getAssetBytes (assetId) = if ((assetId == "WAVES"))
51- then unit
52- else fromBase58String(assetId)
53-
54-
5554 func getCurrentTokenBalance (tokenType) = {
5655 let tokenId = getAssetString(assetIds[tokenType])
5756 tryGetInteger((("global_" + tokenId) + "_balance"))
6059
6160 func calculatePIssued (amount,tokenId) = {
6261 let Psupply = tryGetInteger("global_poolToken_amount")
63- let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
62+ let Balance = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
6463 fraction(amount, Psupply, Balance, DOWN)
6564 }
6665
6766
6867 func getMinPIssued (payments) = {
6968 func handler (accum,current) = {
70- let PIssued = calculatePIssued(current.amount, current.assetId)
69+ let PIssued = calculatePIssued(current.amount, value(current.assetId))
7170 if (if ((accum == 0))
7271 then true
7372 else (accum > PIssued))
9392 }
9493
9594
95+func calculateUsdnValue (assetId,amount,aBalance) = {
96+ let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
97+ let usdnWeight = AssetsWeights[value(indexOf(assetIds, usdnId))]
98+ let assetWeight = AssetsWeights[value(indexOf(assetIds, assetId))]
99+ let usdnBalance = tryGetInteger((("global_" + getAssetString(usdnId)) + "_balance"))
100+ (fraction(amount, usdnBalance, usdnWeight) / (aBalance / assetWeight))
101+ }
102+
103+
96104 func checkTokensValidity (payments) = {
97- func handler1 (accum,payment) = (accum ++ [payment.assetId])
105+ func handler1 (accum,payment) = (accum ++ [value(payment.assetId)])
98106
99107 let ids = {
100108 let $l = payments
112120 }
113121 if ((ids == ids))
114122 then {
115- func handler2 (accum,assetId) = {
116- let assetIdInList = indexOf(ids, assetId)
117- match assetIdInList {
118- case a: Int =>
119- (accum + 1)
120- case _ =>
121- throw(("asset not attached: " + getAssetString(assetId)))
122- }
123- }
123+ func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
124+ then (accum + 1)
125+ else throw(("asset not attached: " + getAssetString(assetId)))
124126
125127 let checks = {
126128 let $l = assetIds
144146 }
145147
146148
147-func handlePoolTokensAdd (PIssued,payments,userAddress) = {
149+func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
148150 func getTokenPaymentAmount (tokenId) = {
149151 func handler (accum,payment) = if ((payment.assetId == tokenId))
150152 then payment.amount
169171 let PSupply = tryGetInteger("global_poolToken_amount")
170172 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
171173 let Dk = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, DOWN) - tokenDecimals), Bk, tokenDecimals, DOWN)
172- (accum ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
173- }
174-
175- func handleTokenChange2 (accum,tokenId) = {
176- let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
177- let PSupply = tryGetInteger("global_poolToken_amount")
178- let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
179- let Dk = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, DOWN) - tokenDecimals), Bk, tokenDecimals, DOWN)
180174 let paymentAmount = getTokenPaymentAmount(tokenId)
181175 let toReturn = ((if ((paymentAmount != 0))
182176 then paymentAmount
183177 else 0) - Dk)
184- (accum ++ [ScriptTransfer(userAddress, toReturn, tokenId)])
178+ let t = if (needChange)
179+ then [ScriptTransfer(userAddress, toReturn, tokenId)]
180+ else nil
181+ ((accum ++ t) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
185182 }
186183
187- ({
188- let $l = assetIds
189- let $s = size($l)
190- let $acc0 = nil
191- func 1 ($a,$i) = if (($i >= $s))
192- then $a
193- else handleTokenChange($a, $l[$i])
184+ let $l = assetIds
185+ let $s = size($l)
186+ let $acc0 = nil
187+ func 1 ($a,$i) = if (($i >= $s))
188+ then $a
189+ else handleTokenChange($a, $l[$i])
194190
195- func 2 ($a,$i) = if (($i >= $s))
196- then $a
197- else throw("List size exceeds 10")
191+ func 2 ($a,$i) = if (($i >= $s))
192+ then $a
193+ else throw("List size exceeds 10")
198194
199- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
200- } ++ {
201- let $l = assetIds
202- let $s = size($l)
203- let $acc0 = nil
204- func 1 ($a,$i) = if (($i >= $s))
205- then $a
206- else handleTokenChange2($a, $l[$i])
207-
208- func 2 ($a,$i) = if (($i >= $s))
209- then $a
210- else throw("List size exceeds 10")
211-
212- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
213- })
195+ 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
214196 }
215197
216198
261243 }
262244
263245
264-func calculateUsdnValue (assetId,amount) = {
265- let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
266- let usdnWeight = AssetsWeights[value(indexOf(assetIds, usdnId))]
267- let assetWeight = AssetsWeights[value(indexOf(assetIds, assetId))]
268- (fraction(amount, tryGetInteger((("global_" + toBase58String(usdnId)) + "_balance")), usdnWeight) / (tryGetInteger((("global_" + getAssetString(assetId)) + "_balance")) / assetWeight))
269- }
270-
271-
272-func calculateOutAmount (AmountIn,assetIn,assetOut) = {
246+func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
273247 let IndexIn = value(indexOf(assetIds, assetIn))
274248 let IndexOut = value(indexOf(assetIds, assetOut))
275249 if ((IndexIn == IndexOut))
276250 then throw("inalid tokens pair")
277- else {
278- let BalanceIn = tryGetInteger((("global_" + getAssetString(assetIn)) + "_balance"))
279- let BalanceOut = tryGetInteger((("global_" + getAssetString(assetOut)) + "_balance"))
280- fraction(BalanceOut, (Scales[IndexOut] - pow(fraction(BalanceIn, Scales[IndexIn], (BalanceIn + AmountIn), FLOOR), Decimals[IndexIn], fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut]), 4, Decimals[IndexOut], FLOOR)), Scales[IndexOut], DOWN)
281- }
251+ else fraction(BalanceOut, (Scales[IndexOut] - pow(((BalanceIn * Scales[IndexIn]) / (BalanceIn + AmountIn)), Decimals[IndexIn], fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut]), 4, Decimals[IndexOut], FLOOR)), Scales[IndexOut], DOWN)
252+ }
253+
254+
255+func getTokenBalance (assetId) = match assetId {
256+ case t: ByteVector =>
257+ assetBalance(this, t)
258+ case _ =>
259+ wavesBalance(this).available
260+}
261+
262+
263+func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
264+ let totalStaked = tryGetInteger("global_indexStaked")
265+ let tokenBalanceLastCheck = tokenEarningsLastCheck
266+ let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
267+ let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
268+ then currentBalanceDelta
269+ else tokenBalanceLastCheck
270+ let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
271+ let newInterest = if ((totalStaked == 0))
272+ then 0
273+ else fraction(newEarnings, Scale8, totalStaked)
274+ let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
275+ (lastCheckInterest + newInterest)
276+ }
277+
278+
279+func claimResult (address) = {
280+ let addressStr = toString(address)
281+ let puzzleAmount = tryGetInteger((addressStr + "_indexStaked"))
282+ func handler (accum,assetId) = {
283+ let assetIdStr = getAssetString(assetId)
284+ let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
285+ let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
286+ let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
287+ let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
288+ let rewardAmount = fraction(puzzleAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
289+ let transfer = if ((rewardAmount == 0))
290+ then nil
291+ else [ScriptTransfer(address, rewardAmount, assetId)]
292+ $Tuple2(((accum._1 ++ transfer) ++ [IntegerEntry((("global_lastCheck_" + assetIdStr) + "_earnings"), (currentTokenEarnings - rewardAmount)), IntegerEntry((("global_lastCheck_" + assetIdStr) + "_interest"), currentTokenInterest), IntegerEntry((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"), currentTokenInterest)]), (accum._2 + calculateUsdnValue(assetId, rewardAmount, aBalance)))
293+ }
294+
295+ let accum = {
296+ let $l = earnedAssets
297+ let $s = size($l)
298+ let $acc0 = $Tuple2(nil, 0)
299+ func 1 ($a,$i) = if (($i >= $s))
300+ then $a
301+ else handler($a, $l[$i])
302+
303+ func 2 ($a,$i) = if (($i >= $s))
304+ then $a
305+ else throw("List size exceeds 10")
306+
307+ 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
308+ }
309+ (accum._1 ++ [IntegerEntry((addressStr + "_claimedRewardValue"), (tryGetInteger((addressStr + "_claimedRewardValue")) + accum._2)), IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
310+ }
311+
312+
313+func indexStakeResult (addressStr,amount) = {
314+ let li = claimResult(addressFromStringValue(addressStr))
315+ (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
282316 }
283317
284318
285319 @Callable(i)
286-func preInit () = [IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_scale"), Scales[0]), IntegerEntry((("static_" + getAssetString(assetIds[1])) + "_scale"), Scales[1]), IntegerEntry((("static_" + getAssetString(assetIds[2])) + "_scale"), Scales[2]), IntegerEntry((("static_" + getAssetString(assetIds[3])) + "_scale"), Scales[3]), IntegerEntry((("static_" + getAssetString(assetIds[4])) + "_scale"), Scales[4]), IntegerEntry((("static_" + getAssetString(assetIds[5])) + "_scale"), Scales[5]), IntegerEntry((("static_" + getAssetString(assetIds[6])) + "_scale"), Scales[6]), IntegerEntry((("static_" + getAssetString(assetIds[7])) + "_scale"), Scales[7]), IntegerEntry((("static_" + getAssetString(assetIds[8])) + "_scale"), Scales[8]), IntegerEntry((("static_" + getAssetString(assetIds[9])) + "_scale"), Scales[9]), IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_weight"), AssetsWeights[0]), IntegerEntry((("static_" + getAssetString(assetIds[1])) + "_weight"), AssetsWeights[1]), IntegerEntry((("static_" + getAssetString(assetIds[2])) + "_weight"), AssetsWeights[2]), IntegerEntry((("static_" + getAssetString(assetIds[3])) + "_weight"), AssetsWeights[3]), IntegerEntry((("static_" + getAssetString(assetIds[4])) + "_weight"), AssetsWeights[4]), IntegerEntry((("static_" + getAssetString(assetIds[5])) + "_weight"), AssetsWeights[5]), IntegerEntry((("static_" + getAssetString(assetIds[6])) + "_weight"), AssetsWeights[6]), IntegerEntry((("static_" + getAssetString(assetIds[7])) + "_weight"), AssetsWeights[7]), IntegerEntry((("static_" + getAssetString(assetIds[8])) + "_weight"), AssetsWeights[8]), IntegerEntry((("static_" + getAssetString(assetIds[9])) + "_weight"), AssetsWeights[9])]
320+func preInit () = {
321+ func handler (accum,assetNum) = if ((assetNum >= T))
322+ then accum
323+ else (accum ++ [IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_scale"), Scales[assetNum]), IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_weight"), AssetsWeights[assetNum])])
324+
325+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
326+ let $s = size($l)
327+ let $acc0 = nil
328+ func 1 ($a,$i) = if (($i >= $s))
329+ then $a
330+ else handler($a, $l[$i])
331+
332+ func 2 ($a,$i) = if (($i >= $s))
333+ then $a
334+ else throw("List size exceeds 10")
335+
336+ 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
337+ }
287338
288339
289340
290341 @Callable(i)
291-func deinit () = if ((i.caller != this))
342+func deInit () = if ((i.caller != this))
292343 then throw("admin only")
293344 else [IntegerEntry("global_wasInited", 0)]
294345
297348 @Callable(i)
298349 func init () = {
299350 func prepareList () = {
300- func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
351+ func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + toBase58String(value(n.assetId))) + "_balance"), n.amount)])
301352
302353 let $l = i.payments
303354 let $s = size($l)
315366
316367 func calculatePoolTokensAmount (payments) = {
317368 func handler (accum,pmt) = {
318- let assetId = pmt.assetId
369+ let assetId = value(pmt.assetId)
319370 func handler2 (accum,n) = if ((n == assetId))
320371 then value(indexOf(assetIds, n))
321372 else accum
355406 then throw("pool already inited")
356407 else {
357408 let initialPoolTokens = calculatePoolTokensAmount(i.payments)
358- let poolTokenIssue = Issue("PZ-DeFi Index", "Puzzle Swap DeFi Pool Index", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
409+ let poolTokenIssue = Issue("Puzzle5", "Puzzle Swap Pool Token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
359410 let poolTokenId = calculateAssetId(poolTokenIssue)
360411 (prepareList() ++ [poolTokenIssue, IntegerEntry("global_poolToken_amount", initialPoolTokens), IntegerEntry("global_wasInited", 1), BinaryEntry("global_poolToken_id", poolTokenId), ScriptTransfer(i.caller, initialPoolTokens, poolTokenId)])
361412 }
364415
365416
366417 @Callable(i)
367-func addLiquidity () = if ((tryGetInteger("global_wasInited") == 0))
368- then throw("swaps are not inited")
369- else if ((size(i.payments) != T))
370- then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
371- else if (!(checkTokensValidity(i.payments)))
372- then throw("wrong assets attached")
373- else {
374- let PIssued = getMinPIssued(i.payments)
375- let result = handlePoolTokensAdd(PIssued, i.payments, i.caller)
376- let reissue = Reissue(tryGetBinary("global_poolToken_id"), PIssued, true)
377- (result ++ [reissue, ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))])
378- }
418+func generateIndex (needChange) = if ((size(i.payments) != T))
419+ then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
420+ else if (!(checkTokensValidity(i.payments)))
421+ then throw("wrong assets attached")
422+ else {
423+ let PIssued = getMinPIssued(i.payments)
424+ let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
425+ let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
426+ $Tuple2((result ++ [ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), reissue, IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
427+ }
379428
380429
381430
382431 @Callable(i)
383-func removeLiquidity () = throw("LP is closed yet")
432+func stakeIndex () = {
433+ let addressStr = toString(i.originCaller)
434+ let pmt = i.payments[0]
435+ if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
436+ then throw("wrong asset attached")
437+ else indexStakeResult(addressStr, pmt.amount)
438+ }
439+
440+
441+
442+@Callable(i)
443+func unstakeIndex (puzzleAmount) = {
444+ let addressStr = toString(i.originCaller)
445+ let puzzleAvailable = tryGetInteger((addressStr + "_indexStaked"))
446+ if ((puzzleAmount > puzzleAvailable))
447+ then throw("you don't have index tokens available")
448+ else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (puzzleAvailable - puzzleAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - puzzleAmount)), ScriptTransfer(i.caller, puzzleAmount, getBinaryValue("global_poolToken_id"))])
449+ }
450+
451+
452+
453+@Callable(i)
454+func claimIndexRewards () = claimResult(i.caller)
455+
456+
457+
458+@Callable(i)
459+func redeemIndex (sendToOrigin) = {
460+ let pmt = i.payments[0]
461+ if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
462+ then throw("please attach pool share token")
463+ else {
464+ let PRedeemed = pmt.amount
465+ let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
466+ then i.originCaller
467+ else i.caller)
468+ (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
469+ }
470+ }
384471
385472
386473
388475 func swap (assetOut,minimum) = {
389476 let pmt = value(i.payments[0])
390477 let AmountIn = value(i.payments[0].amount)
391- let AssetIn = pmt.assetId
392- let AssetOut = getAssetBytes(assetOut)
393- let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut)
394- if ((tryGetInteger("global_wasInited") == 0))
395- then throw("swaps are not inited")
396- else if ((minimum > AmountOut))
397- then throw(("amount to recieve it lower than given one: " + toString(AmountOut)))
398- else if (((Scales[value(indexOf(assetIds, AssetIn))] / 10000) >= AmountIn))
399- then throw("sum to exchange is too small")
400- else if ((0 > (tryGetInteger((("global_" + getAssetString(AssetOut)) + "_balance")) - AmountOut)))
401- then throw("contract is out of reserves")
402- else {
403- let feeAmount = fraction(AmountOut, Fee, FeeScale)
404- let cleanAmountOut = (AmountOut - feeAmount)
405-[ScriptTransfer(feeAggregator, feeAmount, AssetOut), IntegerEntry((("global_" + getAssetString(AssetOut)) + "_balance"), (tryGetInteger((("global_" + getAssetString(AssetOut)) + "_balance")) - AmountOut)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), (tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance")) + AmountIn)), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn)))]
406- }
478+ let AssetIn = value(pmt.assetId)
479+ let AssetOut = fromBase58String(assetOut)
480+ let AssetInBalance = tryGetInteger((("global_" + toBase58String(AssetIn)) + "_balance"))
481+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
482+ let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
483+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
484+ let protocolFeeAmount = fraction(feeAmount, 40, 100)
485+ let cleanAmountOut = (AmountOut - feeAmount)
486+ if ((minimum > cleanAmountOut))
487+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
488+ else if ((10000 > AmountIn))
489+ then throw("sum to exchange is too small")
490+ else if ((0 > (AssetOutBalance - AmountOut)))
491+ then throw("contract is out of reserves")
492+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), (AssetOutBalance - AmountOut)), IntegerEntry((("global_" + toBase58String(AssetIn)) + "_balance"), (AssetInBalance + AmountIn)), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
407493 }
408494
409-
410-@Verifier(tx)
411-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
412495
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let T = 10
55
66 let assetIds = [unit, base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS', base58'Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT', base58'DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p', base58'6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g', base58'7LMV3s1J4dKpMQZqge5sKYoFkZRLojnnU49aerqos4yg', base58'9sQutD5HnRvjM1uui5cVC4w9xkMPAfYEV8ymug3Mon2Y', base58'4K35syPfY2tYrNWzjh1vbmH39qE4qPV7SwLwekrzD82r', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p']
77
88 let AssetsWeights = [20, 20, 8, 8, 6, 6, 4, 4, 12, 12]
99
1010 let AssetsWeightsDecimals = 2
1111
1212 let PoolTokenDecimals = 8
1313
1414 let Decimals = [8, 8, 8, 8, 6, 8, 8, 6, 6, 6]
1515
1616 let Scales = [100000000, 100000000, 100000000, 100000000, 1000000, 100000000, 100000000, 1000000, 1000000, 1000000]
1717
1818 let Fee = 200
1919
2020 let Scale = 10000
2121
22+let Scale8 = 100000000
23+
2224 let FeeScale = 10000
2325
2426 let feeAggregator = Address(base58'3PES7MMthaKJx9WMXnNCY3cwTGG9nD9YT8f')
27+
28+func getAssetString (assetId) = match assetId {
29+ case b: ByteVector =>
30+ toBase58String(b)
31+ case _ =>
32+ "WAVES"
33+}
34+
35+
36+let earnedAssets = assetIds
2537
2638 func tryGetInteger (key) = match getInteger(this, key) {
2739 case b: Int =>
2840 b
2941 case _ =>
3042 0
3143 }
3244
3345
3446 func tryGetBinary (key) = match getBinary(this, key) {
3547 case b: ByteVector =>
3648 b
3749 case _ =>
3850 base58''
3951 }
4052
4153
42-func getAssetString (assetId) = match assetId {
43- case b: ByteVector =>
44- toBase58String(b)
45- case _ =>
46- "WAVES"
47-}
48-
49-
50-func getAssetBytes (assetId) = if ((assetId == "WAVES"))
51- then unit
52- else fromBase58String(assetId)
53-
54-
5554 func getCurrentTokenBalance (tokenType) = {
5655 let tokenId = getAssetString(assetIds[tokenType])
5756 tryGetInteger((("global_" + tokenId) + "_balance"))
5857 }
5958
6059
6160 func calculatePIssued (amount,tokenId) = {
6261 let Psupply = tryGetInteger("global_poolToken_amount")
63- let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
62+ let Balance = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
6463 fraction(amount, Psupply, Balance, DOWN)
6564 }
6665
6766
6867 func getMinPIssued (payments) = {
6968 func handler (accum,current) = {
70- let PIssued = calculatePIssued(current.amount, current.assetId)
69+ let PIssued = calculatePIssued(current.amount, value(current.assetId))
7170 if (if ((accum == 0))
7271 then true
7372 else (accum > PIssued))
7473 then PIssued
7574 else accum
7675 }
7776
7877 let minPIssed = {
7978 let $l = payments
8079 let $s = size($l)
8180 let $acc0 = 0
8281 func 1 ($a,$i) = if (($i >= $s))
8382 then $a
8483 else handler($a, $l[$i])
8584
8685 func 2 ($a,$i) = if (($i >= $s))
8786 then $a
8887 else throw("List size exceeds 10")
8988
9089 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
9190 }
9291 minPIssed
9392 }
9493
9594
95+func calculateUsdnValue (assetId,amount,aBalance) = {
96+ let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
97+ let usdnWeight = AssetsWeights[value(indexOf(assetIds, usdnId))]
98+ let assetWeight = AssetsWeights[value(indexOf(assetIds, assetId))]
99+ let usdnBalance = tryGetInteger((("global_" + getAssetString(usdnId)) + "_balance"))
100+ (fraction(amount, usdnBalance, usdnWeight) / (aBalance / assetWeight))
101+ }
102+
103+
96104 func checkTokensValidity (payments) = {
97- func handler1 (accum,payment) = (accum ++ [payment.assetId])
105+ func handler1 (accum,payment) = (accum ++ [value(payment.assetId)])
98106
99107 let ids = {
100108 let $l = payments
101109 let $s = size($l)
102110 let $acc0 = nil
103111 func 1 ($a,$i) = if (($i >= $s))
104112 then $a
105113 else handler1($a, $l[$i])
106114
107115 func 2 ($a,$i) = if (($i >= $s))
108116 then $a
109117 else throw("List size exceeds 10")
110118
111119 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
112120 }
113121 if ((ids == ids))
114122 then {
115- func handler2 (accum,assetId) = {
116- let assetIdInList = indexOf(ids, assetId)
117- match assetIdInList {
118- case a: Int =>
119- (accum + 1)
120- case _ =>
121- throw(("asset not attached: " + getAssetString(assetId)))
122- }
123- }
123+ func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
124+ then (accum + 1)
125+ else throw(("asset not attached: " + getAssetString(assetId)))
124126
125127 let checks = {
126128 let $l = assetIds
127129 let $s = size($l)
128130 let $acc0 = 0
129131 func 1 ($a,$i) = if (($i >= $s))
130132 then $a
131133 else handler2($a, $l[$i])
132134
133135 func 2 ($a,$i) = if (($i >= $s))
134136 then $a
135137 else throw("List size exceeds 10")
136138
137139 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
138140 }
139141 if ((checks == checks))
140142 then true
141143 else throw("Strict value is not equal to itself.")
142144 }
143145 else throw("Strict value is not equal to itself.")
144146 }
145147
146148
147-func handlePoolTokensAdd (PIssued,payments,userAddress) = {
149+func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
148150 func getTokenPaymentAmount (tokenId) = {
149151 func handler (accum,payment) = if ((payment.assetId == tokenId))
150152 then payment.amount
151153 else accum
152154
153155 let $l = payments
154156 let $s = size($l)
155157 let $acc0 = 0
156158 func 1 ($a,$i) = if (($i >= $s))
157159 then $a
158160 else handler($a, $l[$i])
159161
160162 func 2 ($a,$i) = if (($i >= $s))
161163 then $a
162164 else throw("List size exceeds 10")
163165
164166 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
165167 }
166168
167169 func handleTokenChange (accum,tokenId) = {
168170 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
169171 let PSupply = tryGetInteger("global_poolToken_amount")
170172 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
171173 let Dk = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, DOWN) - tokenDecimals), Bk, tokenDecimals, DOWN)
172- (accum ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
173- }
174-
175- func handleTokenChange2 (accum,tokenId) = {
176- let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
177- let PSupply = tryGetInteger("global_poolToken_amount")
178- let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
179- let Dk = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, DOWN) - tokenDecimals), Bk, tokenDecimals, DOWN)
180174 let paymentAmount = getTokenPaymentAmount(tokenId)
181175 let toReturn = ((if ((paymentAmount != 0))
182176 then paymentAmount
183177 else 0) - Dk)
184- (accum ++ [ScriptTransfer(userAddress, toReturn, tokenId)])
178+ let t = if (needChange)
179+ then [ScriptTransfer(userAddress, toReturn, tokenId)]
180+ else nil
181+ ((accum ++ t) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
185182 }
186183
187- ({
188- let $l = assetIds
189- let $s = size($l)
190- let $acc0 = nil
191- func 1 ($a,$i) = if (($i >= $s))
192- then $a
193- else handleTokenChange($a, $l[$i])
184+ let $l = assetIds
185+ let $s = size($l)
186+ let $acc0 = nil
187+ func 1 ($a,$i) = if (($i >= $s))
188+ then $a
189+ else handleTokenChange($a, $l[$i])
194190
195- func 2 ($a,$i) = if (($i >= $s))
196- then $a
197- else throw("List size exceeds 10")
191+ func 2 ($a,$i) = if (($i >= $s))
192+ then $a
193+ else throw("List size exceeds 10")
198194
199- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
200- } ++ {
201- let $l = assetIds
202- let $s = size($l)
203- let $acc0 = nil
204- func 1 ($a,$i) = if (($i >= $s))
205- then $a
206- else handleTokenChange2($a, $l[$i])
207-
208- func 2 ($a,$i) = if (($i >= $s))
209- then $a
210- else throw("List size exceeds 10")
211-
212- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
213- })
195+ 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
214196 }
215197
216198
217199 func handlePoolTokensRedeem (PRedeemed,userAddress) = {
218200 func handleTokenRedeem (accum,tokenId) = {
219201 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
220202 let PSupply = tryGetInteger("global_poolToken_amount")
221203 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
222204 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
223205 (accum ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount))])
224206 }
225207
226208 func handleTokenRedeem2 (accum,tokenId) = {
227209 let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
228210 let PSupply = tryGetInteger("global_poolToken_amount")
229211 let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
230212 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
231213 (accum ++ [ScriptTransfer(userAddress, amount, tokenId)])
232214 }
233215
234216 ({
235217 let $l = assetIds
236218 let $s = size($l)
237219 let $acc0 = nil
238220 func 1 ($a,$i) = if (($i >= $s))
239221 then $a
240222 else handleTokenRedeem($a, $l[$i])
241223
242224 func 2 ($a,$i) = if (($i >= $s))
243225 then $a
244226 else throw("List size exceeds 10")
245227
246228 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
247229 } ++ {
248230 let $l = assetIds
249231 let $s = size($l)
250232 let $acc0 = nil
251233 func 1 ($a,$i) = if (($i >= $s))
252234 then $a
253235 else handleTokenRedeem2($a, $l[$i])
254236
255237 func 2 ($a,$i) = if (($i >= $s))
256238 then $a
257239 else throw("List size exceeds 10")
258240
259241 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
260242 })
261243 }
262244
263245
264-func calculateUsdnValue (assetId,amount) = {
265- let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
266- let usdnWeight = AssetsWeights[value(indexOf(assetIds, usdnId))]
267- let assetWeight = AssetsWeights[value(indexOf(assetIds, assetId))]
268- (fraction(amount, tryGetInteger((("global_" + toBase58String(usdnId)) + "_balance")), usdnWeight) / (tryGetInteger((("global_" + getAssetString(assetId)) + "_balance")) / assetWeight))
269- }
270-
271-
272-func calculateOutAmount (AmountIn,assetIn,assetOut) = {
246+func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
273247 let IndexIn = value(indexOf(assetIds, assetIn))
274248 let IndexOut = value(indexOf(assetIds, assetOut))
275249 if ((IndexIn == IndexOut))
276250 then throw("inalid tokens pair")
277- else {
278- let BalanceIn = tryGetInteger((("global_" + getAssetString(assetIn)) + "_balance"))
279- let BalanceOut = tryGetInteger((("global_" + getAssetString(assetOut)) + "_balance"))
280- fraction(BalanceOut, (Scales[IndexOut] - pow(fraction(BalanceIn, Scales[IndexIn], (BalanceIn + AmountIn), FLOOR), Decimals[IndexIn], fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut]), 4, Decimals[IndexOut], FLOOR)), Scales[IndexOut], DOWN)
281- }
251+ else fraction(BalanceOut, (Scales[IndexOut] - pow(((BalanceIn * Scales[IndexIn]) / (BalanceIn + AmountIn)), Decimals[IndexIn], fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut]), 4, Decimals[IndexOut], FLOOR)), Scales[IndexOut], DOWN)
252+ }
253+
254+
255+func getTokenBalance (assetId) = match assetId {
256+ case t: ByteVector =>
257+ assetBalance(this, t)
258+ case _ =>
259+ wavesBalance(this).available
260+}
261+
262+
263+func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
264+ let totalStaked = tryGetInteger("global_indexStaked")
265+ let tokenBalanceLastCheck = tokenEarningsLastCheck
266+ let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
267+ let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
268+ then currentBalanceDelta
269+ else tokenBalanceLastCheck
270+ let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
271+ let newInterest = if ((totalStaked == 0))
272+ then 0
273+ else fraction(newEarnings, Scale8, totalStaked)
274+ let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
275+ (lastCheckInterest + newInterest)
276+ }
277+
278+
279+func claimResult (address) = {
280+ let addressStr = toString(address)
281+ let puzzleAmount = tryGetInteger((addressStr + "_indexStaked"))
282+ func handler (accum,assetId) = {
283+ let assetIdStr = getAssetString(assetId)
284+ let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
285+ let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
286+ let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
287+ let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
288+ let rewardAmount = fraction(puzzleAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
289+ let transfer = if ((rewardAmount == 0))
290+ then nil
291+ else [ScriptTransfer(address, rewardAmount, assetId)]
292+ $Tuple2(((accum._1 ++ transfer) ++ [IntegerEntry((("global_lastCheck_" + assetIdStr) + "_earnings"), (currentTokenEarnings - rewardAmount)), IntegerEntry((("global_lastCheck_" + assetIdStr) + "_interest"), currentTokenInterest), IntegerEntry((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"), currentTokenInterest)]), (accum._2 + calculateUsdnValue(assetId, rewardAmount, aBalance)))
293+ }
294+
295+ let accum = {
296+ let $l = earnedAssets
297+ let $s = size($l)
298+ let $acc0 = $Tuple2(nil, 0)
299+ func 1 ($a,$i) = if (($i >= $s))
300+ then $a
301+ else handler($a, $l[$i])
302+
303+ func 2 ($a,$i) = if (($i >= $s))
304+ then $a
305+ else throw("List size exceeds 10")
306+
307+ 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
308+ }
309+ (accum._1 ++ [IntegerEntry((addressStr + "_claimedRewardValue"), (tryGetInteger((addressStr + "_claimedRewardValue")) + accum._2)), IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
310+ }
311+
312+
313+func indexStakeResult (addressStr,amount) = {
314+ let li = claimResult(addressFromStringValue(addressStr))
315+ (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
282316 }
283317
284318
285319 @Callable(i)
286-func preInit () = [IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_scale"), Scales[0]), IntegerEntry((("static_" + getAssetString(assetIds[1])) + "_scale"), Scales[1]), IntegerEntry((("static_" + getAssetString(assetIds[2])) + "_scale"), Scales[2]), IntegerEntry((("static_" + getAssetString(assetIds[3])) + "_scale"), Scales[3]), IntegerEntry((("static_" + getAssetString(assetIds[4])) + "_scale"), Scales[4]), IntegerEntry((("static_" + getAssetString(assetIds[5])) + "_scale"), Scales[5]), IntegerEntry((("static_" + getAssetString(assetIds[6])) + "_scale"), Scales[6]), IntegerEntry((("static_" + getAssetString(assetIds[7])) + "_scale"), Scales[7]), IntegerEntry((("static_" + getAssetString(assetIds[8])) + "_scale"), Scales[8]), IntegerEntry((("static_" + getAssetString(assetIds[9])) + "_scale"), Scales[9]), IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_weight"), AssetsWeights[0]), IntegerEntry((("static_" + getAssetString(assetIds[1])) + "_weight"), AssetsWeights[1]), IntegerEntry((("static_" + getAssetString(assetIds[2])) + "_weight"), AssetsWeights[2]), IntegerEntry((("static_" + getAssetString(assetIds[3])) + "_weight"), AssetsWeights[3]), IntegerEntry((("static_" + getAssetString(assetIds[4])) + "_weight"), AssetsWeights[4]), IntegerEntry((("static_" + getAssetString(assetIds[5])) + "_weight"), AssetsWeights[5]), IntegerEntry((("static_" + getAssetString(assetIds[6])) + "_weight"), AssetsWeights[6]), IntegerEntry((("static_" + getAssetString(assetIds[7])) + "_weight"), AssetsWeights[7]), IntegerEntry((("static_" + getAssetString(assetIds[8])) + "_weight"), AssetsWeights[8]), IntegerEntry((("static_" + getAssetString(assetIds[9])) + "_weight"), AssetsWeights[9])]
320+func preInit () = {
321+ func handler (accum,assetNum) = if ((assetNum >= T))
322+ then accum
323+ else (accum ++ [IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_scale"), Scales[assetNum]), IntegerEntry((("static_" + getAssetString(assetIds[0])) + "_weight"), AssetsWeights[assetNum])])
324+
325+ let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
326+ let $s = size($l)
327+ let $acc0 = nil
328+ func 1 ($a,$i) = if (($i >= $s))
329+ then $a
330+ else handler($a, $l[$i])
331+
332+ func 2 ($a,$i) = if (($i >= $s))
333+ then $a
334+ else throw("List size exceeds 10")
335+
336+ 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
337+ }
287338
288339
289340
290341 @Callable(i)
291-func deinit () = if ((i.caller != this))
342+func deInit () = if ((i.caller != this))
292343 then throw("admin only")
293344 else [IntegerEntry("global_wasInited", 0)]
294345
295346
296347
297348 @Callable(i)
298349 func init () = {
299350 func prepareList () = {
300- func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
351+ func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + toBase58String(value(n.assetId))) + "_balance"), n.amount)])
301352
302353 let $l = i.payments
303354 let $s = size($l)
304355 let $acc0 = nil
305356 func 1 ($a,$i) = if (($i >= $s))
306357 then $a
307358 else handler($a, $l[$i])
308359
309360 func 2 ($a,$i) = if (($i >= $s))
310361 then $a
311362 else throw("List size exceeds 10")
312363
313364 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
314365 }
315366
316367 func calculatePoolTokensAmount (payments) = {
317368 func handler (accum,pmt) = {
318- let assetId = pmt.assetId
369+ let assetId = value(pmt.assetId)
319370 func handler2 (accum,n) = if ((n == assetId))
320371 then value(indexOf(assetIds, n))
321372 else accum
322373
323374 let Token = {
324375 let $l = assetIds
325376 let $s = size($l)
326377 let $acc0 = 1
327378 func 1 ($a,$i) = if (($i >= $s))
328379 then $a
329380 else handler2($a, $l[$i])
330381
331382 func 2 ($a,$i) = if (($i >= $s))
332383 then $a
333384 else throw("List size exceeds 10")
334385
335386 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
336387 }
337388 (accum * pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 1, FLOOR))
338389 }
339390
340391 let $l = payments
341392 let $s = size($l)
342393 let $acc0 = 1
343394 func 1 ($a,$i) = if (($i >= $s))
344395 then $a
345396 else handler($a, $l[$i])
346397
347398 func 2 ($a,$i) = if (($i >= $s))
348399 then $a
349400 else throw("List size exceeds 10")
350401
351402 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
352403 }
353404
354405 if ((tryGetInteger("global_wasInited") > 0))
355406 then throw("pool already inited")
356407 else {
357408 let initialPoolTokens = calculatePoolTokensAmount(i.payments)
358- let poolTokenIssue = Issue("PZ-DeFi Index", "Puzzle Swap DeFi Pool Index", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
409+ let poolTokenIssue = Issue("Puzzle5", "Puzzle Swap Pool Token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
359410 let poolTokenId = calculateAssetId(poolTokenIssue)
360411 (prepareList() ++ [poolTokenIssue, IntegerEntry("global_poolToken_amount", initialPoolTokens), IntegerEntry("global_wasInited", 1), BinaryEntry("global_poolToken_id", poolTokenId), ScriptTransfer(i.caller, initialPoolTokens, poolTokenId)])
361412 }
362413 }
363414
364415
365416
366417 @Callable(i)
367-func addLiquidity () = if ((tryGetInteger("global_wasInited") == 0))
368- then throw("swaps are not inited")
369- else if ((size(i.payments) != T))
370- then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
371- else if (!(checkTokensValidity(i.payments)))
372- then throw("wrong assets attached")
373- else {
374- let PIssued = getMinPIssued(i.payments)
375- let result = handlePoolTokensAdd(PIssued, i.payments, i.caller)
376- let reissue = Reissue(tryGetBinary("global_poolToken_id"), PIssued, true)
377- (result ++ [reissue, ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))])
378- }
418+func generateIndex (needChange) = if ((size(i.payments) != T))
419+ then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
420+ else if (!(checkTokensValidity(i.payments)))
421+ then throw("wrong assets attached")
422+ else {
423+ let PIssued = getMinPIssued(i.payments)
424+ let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
425+ let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
426+ $Tuple2((result ++ [ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), reissue, IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
427+ }
379428
380429
381430
382431 @Callable(i)
383-func removeLiquidity () = throw("LP is closed yet")
432+func stakeIndex () = {
433+ let addressStr = toString(i.originCaller)
434+ let pmt = i.payments[0]
435+ if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
436+ then throw("wrong asset attached")
437+ else indexStakeResult(addressStr, pmt.amount)
438+ }
439+
440+
441+
442+@Callable(i)
443+func unstakeIndex (puzzleAmount) = {
444+ let addressStr = toString(i.originCaller)
445+ let puzzleAvailable = tryGetInteger((addressStr + "_indexStaked"))
446+ if ((puzzleAmount > puzzleAvailable))
447+ then throw("you don't have index tokens available")
448+ else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (puzzleAvailable - puzzleAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - puzzleAmount)), ScriptTransfer(i.caller, puzzleAmount, getBinaryValue("global_poolToken_id"))])
449+ }
450+
451+
452+
453+@Callable(i)
454+func claimIndexRewards () = claimResult(i.caller)
455+
456+
457+
458+@Callable(i)
459+func redeemIndex (sendToOrigin) = {
460+ let pmt = i.payments[0]
461+ if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
462+ then throw("please attach pool share token")
463+ else {
464+ let PRedeemed = pmt.amount
465+ let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
466+ then i.originCaller
467+ else i.caller)
468+ (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
469+ }
470+ }
384471
385472
386473
387474 @Callable(i)
388475 func swap (assetOut,minimum) = {
389476 let pmt = value(i.payments[0])
390477 let AmountIn = value(i.payments[0].amount)
391- let AssetIn = pmt.assetId
392- let AssetOut = getAssetBytes(assetOut)
393- let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut)
394- if ((tryGetInteger("global_wasInited") == 0))
395- then throw("swaps are not inited")
396- else if ((minimum > AmountOut))
397- then throw(("amount to recieve it lower than given one: " + toString(AmountOut)))
398- else if (((Scales[value(indexOf(assetIds, AssetIn))] / 10000) >= AmountIn))
399- then throw("sum to exchange is too small")
400- else if ((0 > (tryGetInteger((("global_" + getAssetString(AssetOut)) + "_balance")) - AmountOut)))
401- then throw("contract is out of reserves")
402- else {
403- let feeAmount = fraction(AmountOut, Fee, FeeScale)
404- let cleanAmountOut = (AmountOut - feeAmount)
405-[ScriptTransfer(feeAggregator, feeAmount, AssetOut), IntegerEntry((("global_" + getAssetString(AssetOut)) + "_balance"), (tryGetInteger((("global_" + getAssetString(AssetOut)) + "_balance")) - AmountOut)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), (tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance")) + AmountIn)), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn)))]
406- }
478+ let AssetIn = value(pmt.assetId)
479+ let AssetOut = fromBase58String(assetOut)
480+ let AssetInBalance = tryGetInteger((("global_" + toBase58String(AssetIn)) + "_balance"))
481+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
482+ let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
483+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
484+ let protocolFeeAmount = fraction(feeAmount, 40, 100)
485+ let cleanAmountOut = (AmountOut - feeAmount)
486+ if ((minimum > cleanAmountOut))
487+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
488+ else if ((10000 > AmountIn))
489+ then throw("sum to exchange is too small")
490+ else if ((0 > (AssetOutBalance - AmountOut)))
491+ then throw("contract is out of reserves")
492+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), (AssetOutBalance - AmountOut)), IntegerEntry((("global_" + toBase58String(AssetIn)) + "_balance"), (AssetInBalance + AmountIn)), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
407493 }
408494
409-
410-@Verifier(tx)
411-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
412495

github/deemru/w8io/873ac7e 
95.64 ms