tx · HLzX9Xy2FtF2SN4jyy5WEL9jjBNS9tTP5ijab7642sjM

3PPRHHF9JKvDLkAc3aHD3Kd5tRZp1CoqAJa:  -0.01400000 Waves

2021.12.14 18:31 [2899098] smart account 3PPRHHF9JKvDLkAc3aHD3Kd5tRZp1CoqAJa > SELF 0.00000000 Waves

{ "type": 13, "id": "HLzX9Xy2FtF2SN4jyy5WEL9jjBNS9tTP5ijab7642sjM", "fee": 1400000, "feeAssetId": null, "timestamp": 1639495939866, "version": 2, "chainId": 87, "sender": "3PPRHHF9JKvDLkAc3aHD3Kd5tRZp1CoqAJa", "senderPublicKey": "Dura8pBsdYoeuB1zq6r5uKsgRS3MfiaVm5J99p6wJXYF", "proofs": [ "54ej28GEWGEehmaKpzSfmjfHxaFeHm8uR8VkRDuWY9KzvqCUAKKCVSnDepsHhMR47YiGPJSvhDadd5omF17HaGa" ], "script": "base64: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AAAHYXNzZXRJZAAAAAphc3NldElkU3RyAAAACGFCYWxhbmNlAAAAFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEAAAAC3RvdGFsU3Rha2VkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEmdsb2JhbF9pbmRleFN0YWtlZAQAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBQAAABZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrBAAAABNjdXJyZW50QmFsYW5jZURlbHRhCQAAZQAAAAIJAQAAAA9nZXRUb2tlbkJhbGFuY2UAAAABBQAAAAdhc3NldElkBQAAAAhhQmFsYW5jZQQAAAAUY3VycmVudFRva2VuRWFybmluZ3MDCQAAZgAAAAIFAAAAE2N1cnJlbnRCYWxhbmNlRGVsdGEFAAAAFXRva2VuQmFsYW5jZUxhc3RDaGVjawUAAAATY3VycmVudEJhbGFuY2VEZWx0YQUAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAAAAAtuZXdFYXJuaW5ncwkAAGUAAAACBQAAABRjdXJyZW50VG9rZW5FYXJuaW5ncwUAAAAVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAAAAAtuZXdJbnRlcmVzdAMJAAAAAAAAAgUAAAALdG90YWxTdGFrZWQAAAAAAAAAAAAAAAAAAAAAAAAJAABrAAAAAwUAAAALbmV3RWFybmluZ3MFAAAABlNjYWxlOAUAAAALdG90YWxTdGFrZWQEAAAAEWxhc3RDaGVja0ludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFnbG9iYWxfbGFzdENoZWNrXwUAAAAKYXNzZXRJZFN0cgIAAAAJX2ludGVyZXN0CQAAZAAAAAIFAAAAEWxhc3RDaGVja0ludGVyZXN0BQAAAAtuZXdJbnRlcmVzdAEAAAALY2xhaW1SZXN1bHQAAAABAAAAB2FkZHJlc3MEAAAACmFkZHJlc3NTdHIJAAQlAAAAAQUAAAAHYWRkcmVzcwQAAAAMcHV6emxlQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgUAAAAKYWRkcmVzc1N0cgIAAAAMX2luZGV4U3Rha2VkCgEAAAAHaGFuZGxlcgAAAAIAAAAFYWNjdW0AAAAHYXNzZXRJZAQAAAAKYXNzZXRJZFN0cgkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAHYXNzZXRJZAQAAAAIYUJhbGFuY2UJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8JAQAAAA5nZXRBc3NldFN0cmluZwAAAAEFAAAAB2Fzc2V0SWQCAAAACF9iYWxhbmNlBAAAABZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFnbG9iYWxfbGFzdENoZWNrXwUAAAAKYXNzZXRJZFN0cgIAAAAJX2Vhcm5pbmdzBAAAABRjdXJyZW50VG9rZW5JbnRlcmVzdAkBAAAAHWNhbGN1bGF0ZUN1cnJlbnRBc3NldEludGVyZXN0AAAABAUAAAAHYXNzZXRJZAUAAAAKYXNzZXRJZFN0cgUAAAAIYUJhbGFuY2UFAAAAFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEAAAAFGN1cnJlbnRUb2tlbkVhcm5pbmdzCQABlgAAAAEJAARMAAAAAgUAAAAWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawkABEwAAAACCQAAZQAAAAIJAQAAAA9nZXRUb2tlbkJhbGFuY2UAAAABBQAAAAdhc3NldElkBQAAAAhhQmFsYW5jZQUAAAADbmlsBAAAAAxyZXdhcmRBbW91bnQJAABrAAAAAwUAAAAMcHV6emxlQW1vdW50CQAAZQAAAAIFAAAAFGN1cnJlbnRUb2tlbkludGVyZXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAACmFkZHJlc3NTdHICAAAAC19sYXN0Q2hlY2tfBQAAAAphc3NldElkU3RyAgAAAAlfaW50ZXJlc3QFAAAABlNjYWxlOAQAAAAIdHJhbnNmZXIDCQAAAAAAAAIFAAAADHJld2FyZEFtb3VudAAAAAAAAAAAAAUAAAADbmlsCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2FkZHJlc3MFAAAADHJld2FyZEFtb3VudAUAAAAHYXNzZXRJZAUAAAAD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YXNJbml0ZWQAAAAAAAAAAAAJAAACAAAAAQIAAAATcG9vbCBhbHJlYWR5IGluaXRlZAQAAAARaW5pdGlhbFBvb2xUb2tlbnMJAQAAABljYWxjdWxhdGVQb29sVG9rZW5zQW1vdW50AAAAAQgFAAAAAWkAAAAIcGF5bWVudHMEAAAADnBvb2xUb2tlbklzc3VlCQAEQwAAAAcCAAAAB1B1enpsZTUCAAAAFlB1enpsZSBTd2FwIFBvb2wgVG9rZW4FAAAAEWluaXRpYWxQb29sVG9rZW5zBQAAABFQb29sVG9rZW5EZWNpbWFscwYFAAAABHVuaXQAAAAAAAAAAAAEAAAAC3Bvb2xUb2tlbklkCQAEOAAAAAEFAAAADnBvb2xUb2tlbklzc3VlCQAETgAAAAIJAQAAAAtwcmVwYXJlTGlzdAAAAAAJAARMAAAAAgUAAAAOcG9vbFRva2VuSXNzdWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BQAAABFpbml0aWFsUG9vbFRva2VucwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAQZ2xvYmFsX3dhc0luaXRlZAAAAAAAAAAAAQkABEwAAAACCQEAAAALQmluYXJ5RW50cnkAAAACAgAAABNnbG9iYWxfcG9vbFRva2VuX2lkBQAAAAtwb29sVG9rZW5JZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEWluaXRpYWxQb29sVG9rZW5zBQAAAAtwb29sVG9rZW5JZAUAAAADbmlsAAAAAWkBAAAADWdlbmVyYXRlSW5kZXgAAAABAAAACm5lZWRDaGFuZ2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzBQAAAAFUCQAAAgAAAAEJAAEsAAAAAgIAAAA7eW91IG5lZWQgdG8gYXR0YWNoIGFsbCBwb29sIHRva2Vucy4gYW1vdW50IG9mIHBvb2wgdG9rZW5zOiAJAAGkAAAAAQUAAAABVAMJAQAAAAEhAAAAAQkBAAAAE2NoZWNrVG9rZW5zVmFsaWRpdHkAAAABCAUAAAABaQAAAAhwYXltZW50cwkAAAIAAAABAgAAABV3cm9uZyBhc3NldHMgYXR0YWNoZWQEAAAAB1BJc3N1ZWQJAQAAAA1nZXRNaW5QSXNzdWVkAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMEAAAAB3JlaXNzdWUJAQAAAAdSZWlzc3VlAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNTcpAAAAAQIAAAATZ2xvYmFsX3Bvb2xUb2tlbl9pZAUAAAAHUElzc3VlZAYEAAAABnJlc3VsdAkBAAAAE2hhbmRsZVBvb2xUb2tlbnNBZGQAAAAEBQAAAAdQSXNzdWVkCAUAAAABaQAAAAhwYXltZW50cwgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyBQAAAApuZWVkQ2hhbmdlCQAFFAAAAAIJAAROAAAAAgUAAAAGcmVzdWx0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAHUElzc3VlZAkBAAAADHRyeUdldEJpbmFyeQAAAAECAAAAE2dsb2JhbF9wb29sVG9rZW5faWQJAARMAAAAAgUAAAAHcmVpc3N1ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAXZ2xvYmFsX3Bvb2xUb2tlbl9hbW91bnQJAABkAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAUAAAAHUElzc3VlZAUAAAADbmlsBQAAAAdQSXNzdWVkAAAAAWkBAAAACnN0YWtlSW5kZXgAAAAABAAAAAphZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAAiE9AAAAAgkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkCQEAAAAMdHJ5R2V0QmluYXJ5AAAAAQIAAAATZ2xvYmFsX3Bvb2xUb2tlbl9pZAkAAAIAAAABAgAAABR3cm9uZyBhc3NldCBhdHRhY2hlZAkBAAAAEGluZGV4U3Rha2VSZXN1bHQAAAACBQAAAAphZGRyZXNzU3RyCAUAAAADcG10AAAABmFtb3VudAAAAAFpAQAAAAx1bnN0YWtlSW5kZXgAAAABAAAADHB1enpsZUFtb3VudAQAAAAKYWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIEAAAAD3B1enpsZUF2YWlsYWJsZQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIFAAAACmFkZHJlc3NTdHICAAAADF9pbmRleFN0YWtlZAMJAABmAAAAAgUAAAAMcHV6emxlQW1vdW50BQAAAA9wdXp6bGVBdmFpbGFibGUJAAACAAAAAQIAAAAleW91IGRvbid0IGhhdmUgaW5kZXggdG9rZW5zIGF2YWlsYWJsZQkABE4AAAACCQEAAAALY2xhaW1SZXN1bHQAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAKYWRkcmVzc1N0cgIAAAAMX2luZGV4U3Rha2VkCQAAZQAAAAIFAAAAD3B1enpsZUF2YWlsYWJsZQUAAAAMcHV6emxlQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABJnbG9iYWxfaW5kZXhTdGFrZWQJAABlAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJnbG9iYWxfaW5kZXhTdGFrZWQFAAAADHB1enpsZUFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADHB1enpsZUFtb3VudAkBAAAAEUBleHRyTmF0aXZlKDEwNTcpAAAAAQIAAAATZ2xvYmFsX3Bvb2xUb2tlbl9pZAUAAAADbmlsAAAAAWkBAAAAEWNsYWltSW5kZXhSZXdhcmRzAAAAAAkBAAAAC2NsYWltUmVzdWx0AAAAAQgFAAAAAWkAAAAGY2FsbGVyAAAAAWkBAAAAC3JlZGVlbUluZGV4AAAAAQAAAAxzZW5kVG9PcmlnaW4EAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAkBAAAADHRyeUdldEJpbmFyeQAAAAECAAAAE2dsb2JhbF9wb29sVG9rZW5faWQJAAACAAAAAQIAAAAecGxlYXNlIGF0dGFjaCBwb29sIHNoYXJlIHRva2VuBAAAAAlQUmVkZWVtZWQIBQAAAANwbXQAAAAGYW1vdW50BAAAAAZyZXN1bHQJAQAAABZoYW5kbGVQb29sVG9rZW5zUmVkZWVtAAAAAgUAAAAJUFJlZGVlbWVkAwUAAAAMc2VuZFRvT3JpZ2luCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIIBQAAAAFpAAAABmNhbGxlcgkABE4AAAACBQAAAAZyZXN1bHQJAARMAAAAAgkBAAAABEJ1cm4AAAACCQEAAAAMdHJ5R2V0QmluYXJ5AAAAAQIAAAATZ2xvYmFsX3Bvb2xUb2tlbl9pZAUAAAAJUFJlZGVlbWVkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAkAAGUAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BQAAAAlQUmVkZWVtZWQFAAAAA25pbAAAAAFpAQAAAARzd2FwAAAAAgAAAAhhc3NldE91dAAAAAdtaW5pbXVtBAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACEFtb3VudEluCQEAAAAFdmFsdWUAAAABCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAAB0Fzc2V0SW4IBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAIQXNzZXRPdXQJAQAAAA1nZXRBc3NldEJ5dGVzAAAAAQUAAAAIYXNzZXRPdXQEAAAACXB1enpsZUZlZQkAAAAAAAACCAUAAAABaQAAAAZjYWxsZXIIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgQAAAAOQXNzZXRJbkJhbGFuY2UJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8JAQAAAA5nZXRBc3NldFN0cmluZwAAAAEFAAAAB0Fzc2V0SW4CAAAACF9iYWxhbmNlBAAAAA9Bc3NldE91dEJhbGFuY2UJAQAA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CQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAt1c2RuQXNzZXRJZAUAAAASdXNkbkNhc2hiYWNrQW1vdW50BQAAAANuaWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABeAUAAAAHJG1hdGNoMAUAAAABeAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAUcHV6emxlQ2FzaGJhY2tBbW91bnQFAAAAFHB1enpsZUNhc2hiYWNrQW1vdW50CQAFFAAAAAIJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8FAAAACGFzc2V0T3V0AgAAAAhfYmFsYW5jZQkAAGQAAAACBQAAAA1uZXdCYWxhbmNlT3V0BQAAAA5jYXNoYmFja0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAAB2dsb2JhbF8JAQAAAA5nZXRBc3NldFN0cmluZwAAAAEFAAAAB0Fzc2V0SW4CAAAACF9iYWxhbmNlBQAAAAxuZXdCYWxhbmNlSW4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5jbGVhbkFtb3VudE91dAUAAAAIQXNzZXRPdXQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABRwdXp6bGVDYXNoYmFja0Ftb3VudAUAAAANcHV6emxlQXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAANZ2xvYmFsX3ZvbHVtZQkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAADWdsb2JhbF92b2x1bWUJAQAAABJjYWxjdWxhdGVVc2RuVmFsdWUAAAADBQAAAAdBc3NldEluBQAAAAhBbW91bnRJbgUAAAAOQXNzZXRJbkJhbGFuY2UFAAAAA25pbAUAAAARdXNkbkJhbGFuY2VDaGFuZ2UFAAAADmNsZWFuQW1vdW50T3V0CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwUAAAAIYXNzZXRPdXQCAAAACF9iYWxhbmNlBQAAAA1uZXdCYWxhbmNlT3V0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHZ2xvYmFsXwkBAAAADmdldEFzc2V0U3RyaW5nAAAAAQUAAAAHQXNzZXRJbgIAAAAIX2JhbGFuY2UFAAAADG5ld0JhbGFuY2VJbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADmNsZWFuQW1vdW50T3V0BQAAAAhBc3NldE91dAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAANZ2xvYmFsX3ZvbHVtZQkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAADWdsb2JhbF92b2x1bWUJAQAAABJjYWxjdWxhdGVVc2RuVmFsdWUAAAADBQAAAAdBc3NldEluBQAAAAhBbW91bnRJbgUAAAAOQXNzZXRJbkJhbGFuY2UFAAAAA25pbAUAAAAOY2xlYW5BbW91bnRPdXQAAAAAm0dC3w==", "height": 2899098, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FjMDaLhKif3RrQi2vTLvJnSUxFWUmi5jLqa1GVTHQruQ Next: 5S4RzgnWXYpwnZAzkLxEq7LsnuKvs6pxkoQ4e1cRFuUS Diff:
OldNewDifferences
2727
2828 let layer2Address = Address(base58'3PDVDYZiwJzK3pu8vcknuLiKCYBPx6XZntG')
2929
30+func getAssetString (assetId) = match assetId {
31+ case b: ByteVector =>
32+ toBase58String(b)
33+ case _ =>
34+ "WAVES"
35+}
36+
37+
38+func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
39+ then unit
40+ else fromBase58String(assetIdStr)
41+
42+
3043 let earnedAssets = assetIds
3144
3245 func tryGetInteger (key) = match getInteger(this, key) {
4659
4760
4861 func getCurrentTokenBalance (tokenType) = {
49- let tokenId = toBase58String(assetIds[tokenType])
62+ let tokenId = getAssetString(assetIds[tokenType])
5063 tryGetInteger((("global_" + tokenId) + "_balance"))
5164 }
5265
5366
5467 func calculatePIssued (amount,tokenId) = {
5568 let Psupply = tryGetInteger("global_poolToken_amount")
56- let Balance = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
69+ let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
5770 fraction(amount, Psupply, Balance, DOWN)
5871 }
5972
6073
6174 func getMinPIssued (payments) = {
6275 func handler (accum,current) = {
63- let PIssued = calculatePIssued(current.amount, value(current.assetId))
76+ let PIssued = calculatePIssued(current.amount, current.assetId)
6477 if (if ((accum == 0))
6578 then true
6679 else (accum > PIssued))
7285 let $l = payments
7386 let $s = size($l)
7487 let $acc0 = 0
75- func 1 ($a,$i) = if (($i >= $s))
88+ func $f0_1 ($a,$i) = if (($i >= $s))
7689 then $a
7790 else handler($a, $l[$i])
7891
79- func 2 ($a,$i) = if (($i >= $s))
92+ func $f0_2 ($a,$i) = if (($i >= $s))
8093 then $a
8194 else throw("List size exceeds 10")
8295
83- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
96+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
8497 }
8598 minPIssed
8699 }
90103 let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
91104 let usdnWeight = AssetsWeights[value(indexOf(assetIds, usdnId))]
92105 let assetWeight = AssetsWeights[value(indexOf(assetIds, assetId))]
93- let usdnBalance = tryGetInteger((("global_" + toBase58String(usdnId)) + "_balance"))
94- (fraction(amount, usdnBalance, usdnWeight) / (aBalance / assetWeight))
106+ let usdnBalance = tryGetInteger((("global_" + getAssetString(usdnId)) + "_balance"))
107+ fraction(amount, (usdnBalance / usdnWeight), (aBalance / assetWeight))
95108 }
96109
97110
98111 func checkTokensValidity (payments) = {
99- func handler1 (accum,payment) = (accum ++ [value(payment.assetId)])
112+ func handler1 (accum,payment) = (accum ++ [payment.assetId])
100113
101114 let ids = {
102115 let $l = payments
103116 let $s = size($l)
104117 let $acc0 = nil
105- func 1 ($a,$i) = if (($i >= $s))
118+ func $f0_1 ($a,$i) = if (($i >= $s))
106119 then $a
107120 else handler1($a, $l[$i])
108121
109- func 2 ($a,$i) = if (($i >= $s))
122+ func $f0_2 ($a,$i) = if (($i >= $s))
110123 then $a
111124 else throw("List size exceeds 10")
112125
113- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
126+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
114127 }
115128 if ((ids == ids))
116129 then {
117130 func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
118131 then (accum + 1)
119- else throw(("asset not attached: " + toBase58String(assetId)))
132+ else throw(("asset not attached: " + getAssetString(assetId)))
120133
121134 let checks = {
122135 let $l = assetIds
123136 let $s = size($l)
124137 let $acc0 = 0
125- func 1 ($a,$i) = if (($i >= $s))
138+ func $f1_1 ($a,$i) = if (($i >= $s))
126139 then $a
127140 else handler2($a, $l[$i])
128141
129- func 2 ($a,$i) = if (($i >= $s))
142+ func $f1_2 ($a,$i) = if (($i >= $s))
130143 then $a
131144 else throw("List size exceeds 10")
132145
133- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
146+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
134147 }
135148 if ((checks == checks))
136149 then true
149162 let $l = payments
150163 let $s = size($l)
151164 let $acc0 = 0
152- func 1 ($a,$i) = if (($i >= $s))
165+ func $f0_1 ($a,$i) = if (($i >= $s))
153166 then $a
154167 else handler($a, $l[$i])
155168
156- func 2 ($a,$i) = if (($i >= $s))
169+ func $f0_2 ($a,$i) = if (($i >= $s))
157170 then $a
158171 else throw("List size exceeds 10")
159172
160- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
173+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
161174 }
162175
163176 func handleTokenChange (accum,tokenId) = {
164- let Bk = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
177+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
165178 let PSupply = tryGetInteger("global_poolToken_amount")
166- let tokenDecimals = tryGetInteger((("static_" + toBase58String(tokenId)) + "_scale"))
179+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
167180 let Dk = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, DOWN) - tokenDecimals), Bk, tokenDecimals, DOWN)
168181 let paymentAmount = getTokenPaymentAmount(tokenId)
169- if ((1000 >= paymentAmount))
170- then throw("the value is too small")
171- else {
172- let toReturn = ((if ((paymentAmount != 0))
173- then paymentAmount
174- else 0) - Dk)
175- let t = if (needChange)
176- then [ScriptTransfer(userAddress, toReturn, tokenId)]
177- else nil
178- ((accum ++ t) ++ [IntegerEntry((("global_" + toBase58String(tokenId)) + "_balance"), (Bk + Dk))])
179- }
182+ let toReturn = ((if ((paymentAmount != 0))
183+ then paymentAmount
184+ else 0) - Dk)
185+ let t = if (needChange)
186+ then [ScriptTransfer(userAddress, toReturn, tokenId)]
187+ else nil
188+ ((accum ++ t) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
180189 }
181190
182191 let $l = assetIds
183192 let $s = size($l)
184193 let $acc0 = nil
185- func 1 ($a,$i) = if (($i >= $s))
194+ func $f0_1 ($a,$i) = if (($i >= $s))
186195 then $a
187196 else handleTokenChange($a, $l[$i])
188197
189- func 2 ($a,$i) = if (($i >= $s))
198+ func $f0_2 ($a,$i) = if (($i >= $s))
190199 then $a
191200 else throw("List size exceeds 10")
192201
193- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
202+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
194203 }
195204
196205
197206 func handlePoolTokensRedeem (PRedeemed,userAddress) = {
198207 func handleTokenRedeem (accum,tokenId) = {
199- let Bk = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
208+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
200209 let PSupply = tryGetInteger("global_poolToken_amount")
201- let tokenDecimals = tryGetInteger((("static_" + toBase58String(tokenId)) + "_scale"))
210+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
202211 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
203- (accum ++ [IntegerEntry((("global_" + toBase58String(tokenId)) + "_balance"), (Bk - amount))])
212+ (accum ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount))])
204213 }
205214
206215 func handleTokenRedeem2 (accum,tokenId) = {
207- let Bk = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
216+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
208217 let PSupply = tryGetInteger("global_poolToken_amount")
209- let tokenDecimals = tryGetInteger((("static_" + toBase58String(tokenId)) + "_scale"))
218+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
210219 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
211220 (accum ++ [ScriptTransfer(userAddress, amount, tokenId)])
212221 }
215224 let $l = assetIds
216225 let $s = size($l)
217226 let $acc0 = nil
218- func 1 ($a,$i) = if (($i >= $s))
227+ func $f0_1 ($a,$i) = if (($i >= $s))
219228 then $a
220229 else handleTokenRedeem($a, $l[$i])
221230
222- func 2 ($a,$i) = if (($i >= $s))
231+ func $f0_2 ($a,$i) = if (($i >= $s))
223232 then $a
224233 else throw("List size exceeds 10")
225234
226- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
235+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
227236 } ++ {
228237 let $l = assetIds
229238 let $s = size($l)
230239 let $acc0 = nil
231- func 1 ($a,$i) = if (($i >= $s))
240+ func $f1_1 ($a,$i) = if (($i >= $s))
232241 then $a
233242 else handleTokenRedeem2($a, $l[$i])
234243
235- func 2 ($a,$i) = if (($i >= $s))
244+ func $f1_2 ($a,$i) = if (($i >= $s))
236245 then $a
237246 else throw("List size exceeds 10")
238247
239- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
248+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
240249 })
241250 }
242251
246255 let IndexOut = value(indexOf(assetIds, assetOut))
247256 if ((IndexIn == IndexOut))
248257 then throw("inalid tokens pair")
249- 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)
258+ else fraction(BalanceOut, (Scales[IndexOut] - pow(fraction(BalanceIn, Scales[IndexIn], (BalanceIn + AmountIn)), Decimals[IndexIn], fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut]), 4, Decimals[IndexOut], CEILING)), Scales[IndexOut], DOWN)
250259 }
260+
261+
262+func getTokenBalance (assetId) = match assetId {
263+ case t: ByteVector =>
264+ assetBalance(this, t)
265+ case _ =>
266+ wavesBalance(this).available
267+}
251268
252269
253270 func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
254271 let totalStaked = tryGetInteger("global_indexStaked")
255272 let tokenBalanceLastCheck = tokenEarningsLastCheck
256- let currentBalanceDelta = (assetBalance(this, assetId) - aBalance)
273+ let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
257274 let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
258275 then currentBalanceDelta
259276 else tokenBalanceLastCheck
270287 let addressStr = toString(address)
271288 let puzzleAmount = tryGetInteger((addressStr + "_indexStaked"))
272289 func handler (accum,assetId) = {
273- let assetIdStr = toBase58String(assetId)
274- let aBalance = tryGetInteger((("global_" + toBase58String(assetId)) + "_balance"))
290+ let assetIdStr = getAssetString(assetId)
291+ let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
275292 let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
276293 let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
277- let currentTokenEarnings = max([tokenEarningsLastCheck, (assetBalance(this, assetId) - aBalance)])
294+ let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
278295 let rewardAmount = fraction(puzzleAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
279296 let transfer = if ((rewardAmount == 0))
280297 then nil
286303 let $l = earnedAssets
287304 let $s = size($l)
288305 let $acc0 = $Tuple2(nil, 0)
289- func 1 ($a,$i) = if (($i >= $s))
306+ func $f0_1 ($a,$i) = if (($i >= $s))
290307 then $a
291308 else handler($a, $l[$i])
292309
293- func 2 ($a,$i) = if (($i >= $s))
310+ func $f0_2 ($a,$i) = if (($i >= $s))
294311 then $a
295312 else throw("List size exceeds 10")
296313
297- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
314+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
298315 }
299316 (accum._1 ++ [IntegerEntry((addressStr + "_claimedRewardValue"), (tryGetInteger((addressStr + "_claimedRewardValue")) + accum._2)), IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
300317 }
310327 func preInit () = {
311328 func handler (accum,assetNum) = if ((assetNum >= T))
312329 then accum
313- else (accum ++ [IntegerEntry((("static_" + toBase58String(assetIds[0])) + "_scale"), Scales[assetNum]), IntegerEntry((("static_" + toBase58String(assetIds[0])) + "_weight"), AssetsWeights[assetNum])])
330+ else (accum ++ [IntegerEntry((("static_" + getAssetString(assetIds[assetNum])) + "_scale"), Scales[assetNum]), IntegerEntry((("static_" + getAssetString(assetIds[assetNum])) + "_weight"), AssetsWeights[assetNum])])
314331
315332 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
316333 let $s = size($l)
317334 let $acc0 = nil
318- func 1 ($a,$i) = if (($i >= $s))
335+ func $f0_1 ($a,$i) = if (($i >= $s))
319336 then $a
320337 else handler($a, $l[$i])
321338
322- func 2 ($a,$i) = if (($i >= $s))
339+ func $f0_2 ($a,$i) = if (($i >= $s))
323340 then $a
324341 else throw("List size exceeds 10")
325342
326- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
343+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
327344 }
328345
329346
338355 @Callable(i)
339356 func init () = {
340357 func prepareList () = {
341- func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + toBase58String(value(n.assetId))) + "_balance"), n.amount)])
358+ func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
342359
343360 let $l = i.payments
344361 let $s = size($l)
345362 let $acc0 = nil
346- func 1 ($a,$i) = if (($i >= $s))
363+ func $f0_1 ($a,$i) = if (($i >= $s))
347364 then $a
348365 else handler($a, $l[$i])
349366
350- func 2 ($a,$i) = if (($i >= $s))
367+ func $f0_2 ($a,$i) = if (($i >= $s))
351368 then $a
352369 else throw("List size exceeds 10")
353370
354- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
371+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
355372 }
356373
357374 func calculatePoolTokensAmount (payments) = {
358375 func handler (accum,pmt) = {
359- let assetId = value(pmt.assetId)
376+ let assetId = pmt.assetId
360377 func handler2 (accum,n) = if ((n == assetId))
361378 then value(indexOf(assetIds, n))
362379 else accum
365382 let $l = assetIds
366383 let $s = size($l)
367384 let $acc0 = 1
368- func 1 ($a,$i) = if (($i >= $s))
385+ func $f0_1 ($a,$i) = if (($i >= $s))
369386 then $a
370387 else handler2($a, $l[$i])
371388
372- func 2 ($a,$i) = if (($i >= $s))
389+ func $f0_2 ($a,$i) = if (($i >= $s))
373390 then $a
374391 else throw("List size exceeds 10")
375392
376- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
393+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
377394 }
378395 (accum * pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 1, FLOOR))
379396 }
381398 let $l = payments
382399 let $s = size($l)
383400 let $acc0 = 1
384- func 1 ($a,$i) = if (($i >= $s))
401+ func $f0_1 ($a,$i) = if (($i >= $s))
385402 then $a
386403 else handler($a, $l[$i])
387404
388- func 2 ($a,$i) = if (($i >= $s))
405+ func $f0_2 ($a,$i) = if (($i >= $s))
389406 then $a
390407 else throw("List size exceeds 10")
391408
392- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
409+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
393410 }
394411
395412 if ((tryGetInteger("global_wasInited") > 0))
465482 func swap (assetOut,minimum) = {
466483 let pmt = value(i.payments[0])
467484 let AmountIn = value(i.payments[0].amount)
468- let AssetIn = value(pmt.assetId)
469- let AssetOut = fromBase58String(assetOut)
470- let AssetInBalance = tryGetInteger((("global_" + toBase58String(AssetIn)) + "_balance"))
485+ let AssetIn = pmt.assetId
486+ let AssetOut = getAssetBytes(assetOut)
487+ let puzzleFee = (i.caller == i.originCaller)
488+ let AssetInBalance = tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance"))
471489 let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
472490 let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
473491 let feeAmount = fraction(AmountOut, Fee, FeeScale)
479497 then throw("sum to exchange is too small")
480498 else if ((0 > (AssetOutBalance - AmountOut)))
481499 then throw("contract is out of reserves")
482- 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)
500+ else {
501+ let newBalanceIn = (AssetInBalance + AmountIn)
502+ let newBalanceOut = (AssetOutBalance - AmountOut)
503+ if (puzzleFee)
504+ then {
505+ let cashbackAmount = (protocolFeeAmount / 2)
506+ let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
507+ let usdnBalance = if ((AssetIn == usdnAssetId))
508+ then newBalanceIn
509+ else if ((AssetOut == usdnAssetId))
510+ then newBalanceOut
511+ else tryGetInteger((("global_" + getAssetString(usdnAssetId)) + "_balance"))
512+ let usdnCashbackAmount = if ((AssetOut == usdnAssetId))
513+ then cashbackAmount
514+ else calculateOutAmount(cashbackAmount, AssetOut, usdnAssetId, newBalanceOut, usdnBalance)
515+ let usdnBalanceChange = if ((AssetOut != usdnAssetId))
516+ then [IntegerEntry((("global_" + toBase58String(usdnAssetId)) + "_balance"), (usdnBalance - usdnCashbackAmount))]
517+ else nil
518+ let puzzlePool = Address(base58'3PFDgzu1UtswAkCMxqqQjbTeHaX4cMab8Kh')
519+ let puzzleAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
520+ let puzzleCashbackAmount = match reentrantInvoke(puzzlePool, "swap", [toBase58String(puzzleAssetId), 0], [AttachedPayment(usdnAssetId, usdnCashbackAmount)]) {
521+ case x: Int =>
522+ x
523+ case _ =>
524+ 0
525+ }
526+ if ((puzzleCashbackAmount == puzzleCashbackAmount))
527+ then $Tuple2(([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + cashbackAmount)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), ScriptTransfer(i.caller, puzzleCashbackAmount, puzzleAssetId), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))] ++ usdnBalanceChange), cleanAmountOut)
528+ else throw("Strict value is not equal to itself.")
529+ }
530+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), newBalanceOut), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
531+ }
483532 }
484533
485534
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let T = 10
55
66 let assetIds = [base58'EfdcPXw7o7rrrPWmMBr2sa66Dk95n56622ngujbaGhye', base58'B543bkZcZNo5GrUnd5fxB6EwkiJhAVyKCkPn5nWzZC2s', base58'5bcAh1r6ydrpk44FEmrnmJQjumgKo3NKEEsyfgmZYwxC', base58'54UszKAj3MtYmkdRCqSXAcaQLaVALBy7CCrVkfmfzhxR', base58'5nk9JW8yRonyNBEwhChoksLxpBECVxbVLqaNuQs9EJn1', base58'Dfx6LJPndo1h5Umk9SofDhMDs6Gi8cHyT3873pSgoASU', base58'4kwKSf4Bx2Wq8YxKnVZBhcEHyXzEtJ2pw7ixfJgirwf2', base58'Ej7kEzxvUsoiMtJKiuFpMD9tC6qfCADpZynyW2vqcWW', base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS', base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p']
77
88 let AssetsWeights = [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
99
1010 let AssetsWeightsDecimals = 2
1111
1212 let PoolTokenDecimals = 0
1313
1414 let Decimals = [8, 8, 8, 8, 8, 8, 8, 8, 8, 6]
1515
1616 let Scales = [100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 100000000, 1000000]
1717
1818 let Fee = 200
1919
2020 let Scale = 10000
2121
2222 let Scale8 = 100000000
2323
2424 let FeeScale = 10000
2525
2626 let feeAggregator = Address(base58'3PBmAwjkwsM83KQhjSMNZvgdFeYeLz9tdBD')
2727
2828 let layer2Address = Address(base58'3PDVDYZiwJzK3pu8vcknuLiKCYBPx6XZntG')
2929
30+func getAssetString (assetId) = match assetId {
31+ case b: ByteVector =>
32+ toBase58String(b)
33+ case _ =>
34+ "WAVES"
35+}
36+
37+
38+func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
39+ then unit
40+ else fromBase58String(assetIdStr)
41+
42+
3043 let earnedAssets = assetIds
3144
3245 func tryGetInteger (key) = match getInteger(this, key) {
3346 case b: Int =>
3447 b
3548 case _ =>
3649 0
3750 }
3851
3952
4053 func tryGetBinary (key) = match getBinary(this, key) {
4154 case b: ByteVector =>
4255 b
4356 case _ =>
4457 base58''
4558 }
4659
4760
4861 func getCurrentTokenBalance (tokenType) = {
49- let tokenId = toBase58String(assetIds[tokenType])
62+ let tokenId = getAssetString(assetIds[tokenType])
5063 tryGetInteger((("global_" + tokenId) + "_balance"))
5164 }
5265
5366
5467 func calculatePIssued (amount,tokenId) = {
5568 let Psupply = tryGetInteger("global_poolToken_amount")
56- let Balance = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
69+ let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
5770 fraction(amount, Psupply, Balance, DOWN)
5871 }
5972
6073
6174 func getMinPIssued (payments) = {
6275 func handler (accum,current) = {
63- let PIssued = calculatePIssued(current.amount, value(current.assetId))
76+ let PIssued = calculatePIssued(current.amount, current.assetId)
6477 if (if ((accum == 0))
6578 then true
6679 else (accum > PIssued))
6780 then PIssued
6881 else accum
6982 }
7083
7184 let minPIssed = {
7285 let $l = payments
7386 let $s = size($l)
7487 let $acc0 = 0
75- func 1 ($a,$i) = if (($i >= $s))
88+ func $f0_1 ($a,$i) = if (($i >= $s))
7689 then $a
7790 else handler($a, $l[$i])
7891
79- func 2 ($a,$i) = if (($i >= $s))
92+ func $f0_2 ($a,$i) = if (($i >= $s))
8093 then $a
8194 else throw("List size exceeds 10")
8295
83- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
96+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
8497 }
8598 minPIssed
8699 }
87100
88101
89102 func calculateUsdnValue (assetId,amount,aBalance) = {
90103 let usdnId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
91104 let usdnWeight = AssetsWeights[value(indexOf(assetIds, usdnId))]
92105 let assetWeight = AssetsWeights[value(indexOf(assetIds, assetId))]
93- let usdnBalance = tryGetInteger((("global_" + toBase58String(usdnId)) + "_balance"))
94- (fraction(amount, usdnBalance, usdnWeight) / (aBalance / assetWeight))
106+ let usdnBalance = tryGetInteger((("global_" + getAssetString(usdnId)) + "_balance"))
107+ fraction(amount, (usdnBalance / usdnWeight), (aBalance / assetWeight))
95108 }
96109
97110
98111 func checkTokensValidity (payments) = {
99- func handler1 (accum,payment) = (accum ++ [value(payment.assetId)])
112+ func handler1 (accum,payment) = (accum ++ [payment.assetId])
100113
101114 let ids = {
102115 let $l = payments
103116 let $s = size($l)
104117 let $acc0 = nil
105- func 1 ($a,$i) = if (($i >= $s))
118+ func $f0_1 ($a,$i) = if (($i >= $s))
106119 then $a
107120 else handler1($a, $l[$i])
108121
109- func 2 ($a,$i) = if (($i >= $s))
122+ func $f0_2 ($a,$i) = if (($i >= $s))
110123 then $a
111124 else throw("List size exceeds 10")
112125
113- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
126+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
114127 }
115128 if ((ids == ids))
116129 then {
117130 func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
118131 then (accum + 1)
119- else throw(("asset not attached: " + toBase58String(assetId)))
132+ else throw(("asset not attached: " + getAssetString(assetId)))
120133
121134 let checks = {
122135 let $l = assetIds
123136 let $s = size($l)
124137 let $acc0 = 0
125- func 1 ($a,$i) = if (($i >= $s))
138+ func $f1_1 ($a,$i) = if (($i >= $s))
126139 then $a
127140 else handler2($a, $l[$i])
128141
129- func 2 ($a,$i) = if (($i >= $s))
142+ func $f1_2 ($a,$i) = if (($i >= $s))
130143 then $a
131144 else throw("List size exceeds 10")
132145
133- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
146+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
134147 }
135148 if ((checks == checks))
136149 then true
137150 else throw("Strict value is not equal to itself.")
138151 }
139152 else throw("Strict value is not equal to itself.")
140153 }
141154
142155
143156 func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
144157 func getTokenPaymentAmount (tokenId) = {
145158 func handler (accum,payment) = if ((payment.assetId == tokenId))
146159 then payment.amount
147160 else accum
148161
149162 let $l = payments
150163 let $s = size($l)
151164 let $acc0 = 0
152- func 1 ($a,$i) = if (($i >= $s))
165+ func $f0_1 ($a,$i) = if (($i >= $s))
153166 then $a
154167 else handler($a, $l[$i])
155168
156- func 2 ($a,$i) = if (($i >= $s))
169+ func $f0_2 ($a,$i) = if (($i >= $s))
157170 then $a
158171 else throw("List size exceeds 10")
159172
160- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
173+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
161174 }
162175
163176 func handleTokenChange (accum,tokenId) = {
164- let Bk = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
177+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
165178 let PSupply = tryGetInteger("global_poolToken_amount")
166- let tokenDecimals = tryGetInteger((("static_" + toBase58String(tokenId)) + "_scale"))
179+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
167180 let Dk = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, DOWN) - tokenDecimals), Bk, tokenDecimals, DOWN)
168181 let paymentAmount = getTokenPaymentAmount(tokenId)
169- if ((1000 >= paymentAmount))
170- then throw("the value is too small")
171- else {
172- let toReturn = ((if ((paymentAmount != 0))
173- then paymentAmount
174- else 0) - Dk)
175- let t = if (needChange)
176- then [ScriptTransfer(userAddress, toReturn, tokenId)]
177- else nil
178- ((accum ++ t) ++ [IntegerEntry((("global_" + toBase58String(tokenId)) + "_balance"), (Bk + Dk))])
179- }
182+ let toReturn = ((if ((paymentAmount != 0))
183+ then paymentAmount
184+ else 0) - Dk)
185+ let t = if (needChange)
186+ then [ScriptTransfer(userAddress, toReturn, tokenId)]
187+ else nil
188+ ((accum ++ t) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
180189 }
181190
182191 let $l = assetIds
183192 let $s = size($l)
184193 let $acc0 = nil
185- func 1 ($a,$i) = if (($i >= $s))
194+ func $f0_1 ($a,$i) = if (($i >= $s))
186195 then $a
187196 else handleTokenChange($a, $l[$i])
188197
189- func 2 ($a,$i) = if (($i >= $s))
198+ func $f0_2 ($a,$i) = if (($i >= $s))
190199 then $a
191200 else throw("List size exceeds 10")
192201
193- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
202+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
194203 }
195204
196205
197206 func handlePoolTokensRedeem (PRedeemed,userAddress) = {
198207 func handleTokenRedeem (accum,tokenId) = {
199- let Bk = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
208+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
200209 let PSupply = tryGetInteger("global_poolToken_amount")
201- let tokenDecimals = tryGetInteger((("static_" + toBase58String(tokenId)) + "_scale"))
210+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
202211 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
203- (accum ++ [IntegerEntry((("global_" + toBase58String(tokenId)) + "_balance"), (Bk - amount))])
212+ (accum ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount))])
204213 }
205214
206215 func handleTokenRedeem2 (accum,tokenId) = {
207- let Bk = tryGetInteger((("global_" + toBase58String(tokenId)) + "_balance"))
216+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
208217 let PSupply = tryGetInteger("global_poolToken_amount")
209- let tokenDecimals = tryGetInteger((("static_" + toBase58String(tokenId)) + "_scale"))
218+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
210219 let amount = fraction((tokenDecimals - fraction((PSupply - PRedeemed), tokenDecimals, PSupply, DOWN)), Bk, tokenDecimals, DOWN)
211220 (accum ++ [ScriptTransfer(userAddress, amount, tokenId)])
212221 }
213222
214223 ({
215224 let $l = assetIds
216225 let $s = size($l)
217226 let $acc0 = nil
218- func 1 ($a,$i) = if (($i >= $s))
227+ func $f0_1 ($a,$i) = if (($i >= $s))
219228 then $a
220229 else handleTokenRedeem($a, $l[$i])
221230
222- func 2 ($a,$i) = if (($i >= $s))
231+ func $f0_2 ($a,$i) = if (($i >= $s))
223232 then $a
224233 else throw("List size exceeds 10")
225234
226- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
235+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
227236 } ++ {
228237 let $l = assetIds
229238 let $s = size($l)
230239 let $acc0 = nil
231- func 1 ($a,$i) = if (($i >= $s))
240+ func $f1_1 ($a,$i) = if (($i >= $s))
232241 then $a
233242 else handleTokenRedeem2($a, $l[$i])
234243
235- func 2 ($a,$i) = if (($i >= $s))
244+ func $f1_2 ($a,$i) = if (($i >= $s))
236245 then $a
237246 else throw("List size exceeds 10")
238247
239- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
248+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
240249 })
241250 }
242251
243252
244253 func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
245254 let IndexIn = value(indexOf(assetIds, assetIn))
246255 let IndexOut = value(indexOf(assetIds, assetOut))
247256 if ((IndexIn == IndexOut))
248257 then throw("inalid tokens pair")
249- 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)
258+ else fraction(BalanceOut, (Scales[IndexOut] - pow(fraction(BalanceIn, Scales[IndexIn], (BalanceIn + AmountIn)), Decimals[IndexIn], fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut]), 4, Decimals[IndexOut], CEILING)), Scales[IndexOut], DOWN)
250259 }
260+
261+
262+func getTokenBalance (assetId) = match assetId {
263+ case t: ByteVector =>
264+ assetBalance(this, t)
265+ case _ =>
266+ wavesBalance(this).available
267+}
251268
252269
253270 func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
254271 let totalStaked = tryGetInteger("global_indexStaked")
255272 let tokenBalanceLastCheck = tokenEarningsLastCheck
256- let currentBalanceDelta = (assetBalance(this, assetId) - aBalance)
273+ let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
257274 let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
258275 then currentBalanceDelta
259276 else tokenBalanceLastCheck
260277 let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
261278 let newInterest = if ((totalStaked == 0))
262279 then 0
263280 else fraction(newEarnings, Scale8, totalStaked)
264281 let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
265282 (lastCheckInterest + newInterest)
266283 }
267284
268285
269286 func claimResult (address) = {
270287 let addressStr = toString(address)
271288 let puzzleAmount = tryGetInteger((addressStr + "_indexStaked"))
272289 func handler (accum,assetId) = {
273- let assetIdStr = toBase58String(assetId)
274- let aBalance = tryGetInteger((("global_" + toBase58String(assetId)) + "_balance"))
290+ let assetIdStr = getAssetString(assetId)
291+ let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
275292 let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
276293 let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
277- let currentTokenEarnings = max([tokenEarningsLastCheck, (assetBalance(this, assetId) - aBalance)])
294+ let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
278295 let rewardAmount = fraction(puzzleAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
279296 let transfer = if ((rewardAmount == 0))
280297 then nil
281298 else [ScriptTransfer(address, rewardAmount, assetId)]
282299 $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)))
283300 }
284301
285302 let accum = {
286303 let $l = earnedAssets
287304 let $s = size($l)
288305 let $acc0 = $Tuple2(nil, 0)
289- func 1 ($a,$i) = if (($i >= $s))
306+ func $f0_1 ($a,$i) = if (($i >= $s))
290307 then $a
291308 else handler($a, $l[$i])
292309
293- func 2 ($a,$i) = if (($i >= $s))
310+ func $f0_2 ($a,$i) = if (($i >= $s))
294311 then $a
295312 else throw("List size exceeds 10")
296313
297- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
314+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
298315 }
299316 (accum._1 ++ [IntegerEntry((addressStr + "_claimedRewardValue"), (tryGetInteger((addressStr + "_claimedRewardValue")) + accum._2)), IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
300317 }
301318
302319
303320 func indexStakeResult (addressStr,amount) = {
304321 let li = claimResult(addressFromStringValue(addressStr))
305322 (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
306323 }
307324
308325
309326 @Callable(i)
310327 func preInit () = {
311328 func handler (accum,assetNum) = if ((assetNum >= T))
312329 then accum
313- else (accum ++ [IntegerEntry((("static_" + toBase58String(assetIds[0])) + "_scale"), Scales[assetNum]), IntegerEntry((("static_" + toBase58String(assetIds[0])) + "_weight"), AssetsWeights[assetNum])])
330+ else (accum ++ [IntegerEntry((("static_" + getAssetString(assetIds[assetNum])) + "_scale"), Scales[assetNum]), IntegerEntry((("static_" + getAssetString(assetIds[assetNum])) + "_weight"), AssetsWeights[assetNum])])
314331
315332 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
316333 let $s = size($l)
317334 let $acc0 = nil
318- func 1 ($a,$i) = if (($i >= $s))
335+ func $f0_1 ($a,$i) = if (($i >= $s))
319336 then $a
320337 else handler($a, $l[$i])
321338
322- func 2 ($a,$i) = if (($i >= $s))
339+ func $f0_2 ($a,$i) = if (($i >= $s))
323340 then $a
324341 else throw("List size exceeds 10")
325342
326- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
343+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
327344 }
328345
329346
330347
331348 @Callable(i)
332349 func deInit () = if ((i.caller != this))
333350 then throw("admin only")
334351 else [IntegerEntry("global_wasInited", 0)]
335352
336353
337354
338355 @Callable(i)
339356 func init () = {
340357 func prepareList () = {
341- func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + toBase58String(value(n.assetId))) + "_balance"), n.amount)])
358+ func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
342359
343360 let $l = i.payments
344361 let $s = size($l)
345362 let $acc0 = nil
346- func 1 ($a,$i) = if (($i >= $s))
363+ func $f0_1 ($a,$i) = if (($i >= $s))
347364 then $a
348365 else handler($a, $l[$i])
349366
350- func 2 ($a,$i) = if (($i >= $s))
367+ func $f0_2 ($a,$i) = if (($i >= $s))
351368 then $a
352369 else throw("List size exceeds 10")
353370
354- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
371+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
355372 }
356373
357374 func calculatePoolTokensAmount (payments) = {
358375 func handler (accum,pmt) = {
359- let assetId = value(pmt.assetId)
376+ let assetId = pmt.assetId
360377 func handler2 (accum,n) = if ((n == assetId))
361378 then value(indexOf(assetIds, n))
362379 else accum
363380
364381 let Token = {
365382 let $l = assetIds
366383 let $s = size($l)
367384 let $acc0 = 1
368- func 1 ($a,$i) = if (($i >= $s))
385+ func $f0_1 ($a,$i) = if (($i >= $s))
369386 then $a
370387 else handler2($a, $l[$i])
371388
372- func 2 ($a,$i) = if (($i >= $s))
389+ func $f0_2 ($a,$i) = if (($i >= $s))
373390 then $a
374391 else throw("List size exceeds 10")
375392
376- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
393+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
377394 }
378395 (accum * pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 1, FLOOR))
379396 }
380397
381398 let $l = payments
382399 let $s = size($l)
383400 let $acc0 = 1
384- func 1 ($a,$i) = if (($i >= $s))
401+ func $f0_1 ($a,$i) = if (($i >= $s))
385402 then $a
386403 else handler($a, $l[$i])
387404
388- func 2 ($a,$i) = if (($i >= $s))
405+ func $f0_2 ($a,$i) = if (($i >= $s))
389406 then $a
390407 else throw("List size exceeds 10")
391408
392- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
409+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
393410 }
394411
395412 if ((tryGetInteger("global_wasInited") > 0))
396413 then throw("pool already inited")
397414 else {
398415 let initialPoolTokens = calculatePoolTokensAmount(i.payments)
399416 let poolTokenIssue = Issue("Puzzle5", "Puzzle Swap Pool Token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
400417 let poolTokenId = calculateAssetId(poolTokenIssue)
401418 (prepareList() ++ [poolTokenIssue, IntegerEntry("global_poolToken_amount", initialPoolTokens), IntegerEntry("global_wasInited", 1), BinaryEntry("global_poolToken_id", poolTokenId), ScriptTransfer(i.caller, initialPoolTokens, poolTokenId)])
402419 }
403420 }
404421
405422
406423
407424 @Callable(i)
408425 func generateIndex (needChange) = if ((size(i.payments) != T))
409426 then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
410427 else if (!(checkTokensValidity(i.payments)))
411428 then throw("wrong assets attached")
412429 else {
413430 let PIssued = getMinPIssued(i.payments)
414431 let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
415432 let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
416433 $Tuple2((result ++ [ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), reissue, IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
417434 }
418435
419436
420437
421438 @Callable(i)
422439 func stakeIndex () = {
423440 let addressStr = toString(i.originCaller)
424441 let pmt = i.payments[0]
425442 if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
426443 then throw("wrong asset attached")
427444 else indexStakeResult(addressStr, pmt.amount)
428445 }
429446
430447
431448
432449 @Callable(i)
433450 func unstakeIndex (puzzleAmount) = {
434451 let addressStr = toString(i.originCaller)
435452 let puzzleAvailable = tryGetInteger((addressStr + "_indexStaked"))
436453 if ((puzzleAmount > puzzleAvailable))
437454 then throw("you don't have index tokens available")
438455 else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (puzzleAvailable - puzzleAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - puzzleAmount)), ScriptTransfer(i.caller, puzzleAmount, getBinaryValue("global_poolToken_id"))])
439456 }
440457
441458
442459
443460 @Callable(i)
444461 func claimIndexRewards () = claimResult(i.caller)
445462
446463
447464
448465 @Callable(i)
449466 func redeemIndex (sendToOrigin) = {
450467 let pmt = i.payments[0]
451468 if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
452469 then throw("please attach pool share token")
453470 else {
454471 let PRedeemed = pmt.amount
455472 let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
456473 then i.originCaller
457474 else i.caller)
458475 (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
459476 }
460477 }
461478
462479
463480
464481 @Callable(i)
465482 func swap (assetOut,minimum) = {
466483 let pmt = value(i.payments[0])
467484 let AmountIn = value(i.payments[0].amount)
468- let AssetIn = value(pmt.assetId)
469- let AssetOut = fromBase58String(assetOut)
470- let AssetInBalance = tryGetInteger((("global_" + toBase58String(AssetIn)) + "_balance"))
485+ let AssetIn = pmt.assetId
486+ let AssetOut = getAssetBytes(assetOut)
487+ let puzzleFee = (i.caller == i.originCaller)
488+ let AssetInBalance = tryGetInteger((("global_" + getAssetString(AssetIn)) + "_balance"))
471489 let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
472490 let AmountOut = calculateOutAmount(AmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance)
473491 let feeAmount = fraction(AmountOut, Fee, FeeScale)
474492 let protocolFeeAmount = fraction(feeAmount, 40, 100)
475493 let cleanAmountOut = (AmountOut - feeAmount)
476494 if ((minimum > cleanAmountOut))
477495 then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
478496 else if ((10000 > AmountIn))
479497 then throw("sum to exchange is too small")
480498 else if ((0 > (AssetOutBalance - AmountOut)))
481499 then throw("contract is out of reserves")
482- 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)
500+ else {
501+ let newBalanceIn = (AssetInBalance + AmountIn)
502+ let newBalanceOut = (AssetOutBalance - AmountOut)
503+ if (puzzleFee)
504+ then {
505+ let cashbackAmount = (protocolFeeAmount / 2)
506+ let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
507+ let usdnBalance = if ((AssetIn == usdnAssetId))
508+ then newBalanceIn
509+ else if ((AssetOut == usdnAssetId))
510+ then newBalanceOut
511+ else tryGetInteger((("global_" + getAssetString(usdnAssetId)) + "_balance"))
512+ let usdnCashbackAmount = if ((AssetOut == usdnAssetId))
513+ then cashbackAmount
514+ else calculateOutAmount(cashbackAmount, AssetOut, usdnAssetId, newBalanceOut, usdnBalance)
515+ let usdnBalanceChange = if ((AssetOut != usdnAssetId))
516+ then [IntegerEntry((("global_" + toBase58String(usdnAssetId)) + "_balance"), (usdnBalance - usdnCashbackAmount))]
517+ else nil
518+ let puzzlePool = Address(base58'3PFDgzu1UtswAkCMxqqQjbTeHaX4cMab8Kh')
519+ let puzzleAssetId = base58'HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS'
520+ let puzzleCashbackAmount = match reentrantInvoke(puzzlePool, "swap", [toBase58String(puzzleAssetId), 0], [AttachedPayment(usdnAssetId, usdnCashbackAmount)]) {
521+ case x: Int =>
522+ x
523+ case _ =>
524+ 0
525+ }
526+ if ((puzzleCashbackAmount == puzzleCashbackAmount))
527+ then $Tuple2(([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + cashbackAmount)), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), ScriptTransfer(i.caller, puzzleCashbackAmount, puzzleAssetId), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))] ++ usdnBalanceChange), cleanAmountOut)
528+ else throw("Strict value is not equal to itself.")
529+ }
530+ else $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), newBalanceOut), IntegerEntry((("global_" + getAssetString(AssetIn)) + "_balance"), newBalanceIn), ScriptTransfer(i.caller, cleanAmountOut, AssetOut), IntegerEntry("global_volume", (tryGetInteger("global_volume") + calculateUsdnValue(AssetIn, AmountIn, AssetInBalance)))], cleanAmountOut)
531+ }
483532 }
484533
485534

github/deemru/w8io/3ef1775 
122.95 ms