tx · 9XFbBUXPLZcJpYhU53UhmPggLGwL8hE2bbSzb8GpV2nk

3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi:  -0.04000000 Waves

2022.08.23 14:58 [2197101] smart account 3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi > SELF 0.00000000 Waves

{ "type": 13, "id": "9XFbBUXPLZcJpYhU53UhmPggLGwL8hE2bbSzb8GpV2nk", "fee": 4000000, "feeAssetId": null, "timestamp": 1661256047355, "version": 1, "sender": "3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi", "senderPublicKey": "4qGVXRFATZNzo2RZZ5UYHXojGyJgSRBwtgJcCU8rJe5A", "proofs": [ "5T2HWPRYwoxcTXPJA8BqkuCZg1qjtxBREDZJbkC74U4U5H8B73avHShz1PFPnnTseRREruQ5bKjF5vgNEPVcC8p4", "pHrME2iqAFsDQD87WXAfoqSQjCxkRiaM8WHCsjoxjWU5k4oAdD4WGJGPvdse98jE2MFQcGwUcCRrFRLV2TCKz9y", "3Tg3xCL429YdmbdSzWqXgkDiMVHaubBSRLJ5ZA7wH3JmBBHbNEzsd7uxMA9sLeFA3cXJBBMSvVAvUCJg6WzEZWQA" ], "script": "base64:AAIFAAAAAAAAADkIAhIFCgMICAESAwoBARIHCgUBAQEBARIDCgEBEgQKAgECEgMKAQESABIFCgMBAQESBwoFAQEBAQEAAABXAAAAAAtyZXZpc2lvbk51bQIAAAAAAAAAAAlNVUxUU0NBTEUAAAAAAAAAAAgAAAAAB1NDQUxFMTYAAAAAAAAAABAAAAAAA1NFUAIAAAACX18AAAAABUhBTEY4AAAAAAAC+vCAAAAAAAhFVUxFUlgxNgkAATYAAAABAABgkqET2NV0AAAAAARUV09YCQABNgAAAAEAAAAAAAAAAAIAAAAABU1VTFQ2AAAAAAAAD0JAAAAAAAZNVUxUWDYJAAE2AAAAAQAAAAAAAA9CQAAAAAAFTVVMVDgAAAAAAAX14QAAAAAABk1VTFRYOAkAATYAAAABAAAAAAAF9eEAAAAAAAdNVUxUWDEwCQABNgAAAAEAAAAAAlQL5AAAAAAAB01VTFRYMTYJAAE2AAAAAQAAI4byb8EAAAAAAAAHV0FWRVNJRAkAAlkAAAABAgAAAAVXQVZFUwAAAAALa1Jlc3VsdElkeEEAAAAAAAAAAAAAAAAAD2tSZXN1bHRJZHhQYXVsQgAAAAAAAAAAAQAAAAAZa1Jlc3VsdElkeFdSZXNlcnZlc0luVXNkbgAAAAAAAAAAAgAAAAAQa1Jlc3VsdElkeE11bHRCUgAAAAAAAAAAAwAAAAATa1Jlc3VsdElkeE11bHRQb3dlcgAAAAAAAAAABAAAAAAba1Jlc3VsdElkeE11bHRFeHBJblBvd2VyU3RyAAAAAAAAAAAFAAAAABJrUmVzdWx0SWR4TXVsdEtTdHIAAAAAAAAAAAYAAAAAD25NZXRyaWNJZHhQcmljZQAAAAAAAAAAAAAAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlAAAAAAAAAAABAAAAABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAAAAAACAAAAABFuTWV0cmljSWR4UmVzZXJ2ZQAAAAAAAAAAAwAAAAAXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4AAAAAAAAAAAQAAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5AAAAAAAAAAAFAAAAABFuTWV0cmljSWR4U3VycGx1cwAAAAAAAAAABgAAAAAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50AAAAAAAAAAAHAAAAAAxuTWV0cmljSWR4QlIAAAAAAAAAAAgAAAAAFG5NZXRyaWNJZHhOc2J0U3VwcGx5AAAAAAAAAAAJAAAAABduTWV0cmljSWR4TWF4TnNidFN1cHBseQAAAAAAAAAACgAAAAAUbk1ldHJpY0lkeFN1cmZTdXBwbHkAAAAAAAAAAAsBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAACAAAAHSVzJXNfX2NvbmZpZ19fbmV1dHJpbm9BZGRyZXNzAQAAABNrZXlTd2FwQW1vdW50QVBhcmFtAAAAAAIAAAAYJXMlc19fY29uZmlnX19zd2FwQVBhcmFtAQAAABNrZXlTd2FwQW1vdW50QlBhcmFtAAAAAAIAAAAYJXMlc19fY29uZmlnX19zd2FwQlBhcmFtAQAAABdrZXlVc2RuU3dhcEFtb3VudEFQYXJhbQAAAAACAAAAHCVzJXNfX2NvbmZpZ19fdXNkblN3YXBBUGFyYW0BAAAAF2tleVVzZG5Td2FwQW1vdW50QlBhcmFtAAAAAAIAAAAcJXMlc19fY29uZmlnX191c2RuU3dhcEJQYXJhbQEAAAASa2V5TmV1dHJpbm9Bc3NldElkAAAAAAIAAAARbmV1dHJpbm9fYXNzZXRfaWQBAAAADmtleU5zYnRBc3NldElkAAAAAAIAAAANYm9uZF9hc3NldF9pZAEAAAAOa2V5U3VyZkFzc2V0SWQAAAAAAgAAAA1zdXJmX2Fzc2V0X2lkAQAAABBrZXlCYWxhbmNlTG9ja2VkAAAAAAIAAAANYmFsYW5jZV9sb2NrXwEAAAAVa2V5V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAkAASwAAAACCQEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAABXdhdmVzAQAAABhrZXlOZXV0cmlub0xvY2tlZEJhbGFuY2UAAAAACQABLAAAAAIJAQAAABBrZXlCYWxhbmNlTG9ja2VkAAAAAAIAAAAIbmV1dHJpbm8BAAAAEXN3YXBzVGltZWZyYW1lS0VZAAAAAAIAAAAPc3dhcHNfdGltZWZyYW1lAQAAABprZXlVc2VyTGFzdFF1aWNrU3dhcEhlaWdodAAAAAEAAAALdXNlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAA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dGNoMAIAAAAGU3RyaW5nBAAAAAZ2YWxTdHIFAAAAByRtYXRjaDAFAAAABnZhbFN0cgkAAAIAAAABAgAAABhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcAAAAAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAAAAAAAAAAEAAAAAGElkeENvbnRyb2xDZmdBdWN0aW9uRGFwcAAAAAAAAAAAAgAAAAAUSWR4Q29udHJvbENmZ1JwZERhcHAAAAAAAAAAAAMAAAAAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAAAAAAAAAABAAAAAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAAAAAAAAAABQAAAAAVSWR4Q29udHJvbENmZ1Jlc3REYXBwAAAAAAAAAAAGAAAAAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAAAAAAAAAABwAAAAAcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAAAAAAAAAAACAAAAAAZSWR4Q29udHJvbENmZ01lZGlhdG9yRGFwcAAAAAAAAAAACQEAAAARa2V5Q29udHJvbEFkZHJlc3MAAAAAAgAAABwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQAAAA1rZXlDb250cm9sQ2ZnAAAAAAIAAAARJXNfX2NvbnRyb2xDb25maWcBAAAAFHJlYWRDb250cm9sQ2ZnT3JGYWlsAAAAAQAAAAdjb250cm9sCQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAdjb250cm9sCQEAAAANa2V5Q29udHJvbENmZwAAAAAFAAAAA1NFUAEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgAAAApjb250cm9sQ2ZnAAAAA2lkeAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAKY29udHJvbENmZwUAAAADaWR4CQABLAAAAAICAAAALUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkAAaQAAAABBQAAAANpZHgAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAARa2V5Q29udHJvbEFkZHJlc3MAAAAAAgAAACMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAAAAAKY29udHJvbENmZwkBAAAAFHJlYWRDb250cm9sQ2ZnT3JGYWlsAAAAAQUAAAAPY29udHJvbENvbnRyYWN0AAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAASa2V5TmV1dHJpbm9Bc3NldElkAAAAAAAAAAALbnNidEFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAADmtleU5zYnRBc3NldElkAAAAAAAAAAALc3VyZkFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAAOa2V5U3VyZkFzc2V0SWQAAAAAAAAAAAxjdXJyZW50UHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAkBAAAACGtleVByaWNlAAAAAAAAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhrZXlOZXV0cmlub0xvY2tlZEJhbGFuY2UAAAAAAAAAAAAAAAAAAAAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAFWtleVdhdmVzTG9ja2VkQmFsYW5jZQAAAAAAAAAAAAAAAAAAAAAAB3Jlc2VydmUJAABlAAAAAggJAAPvAAAAAQUAAAAQbmV1dHJpbm9Db250cmFjdAAAAAdyZWd1bGFyBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UAAAAADnJlc2VydmVzSW5Vc2RuCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQAAAAAObmV1dHJpbm9TdXBwbHkJAABlAAAAAgkAAGUAAAACCQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD8AAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAkAA/AAAAACBQAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQAAAAAAkJSAwkAAAAAAAACBQAAAA5uZXV0cmlub1N1cHBseQAAAAAAAAAAAAAAAAAAAAAAAAkAAGsAAAADBQAAAA5yZXNlcnZlc0luVXNkbgUAAAAFTVVMVDYFAAAADm5ldXRyaW5vU3VwcGx5AAAACQAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAMAAAAPbmV1dHJpbm9BZGRyZXNzAAAAD25zYnRMb2NrQWRkcmVzcwAAABBzd2FwQW1vdW50QVBhcmFtAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAADm5vdCBhdXRob3JpemVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlOZXV0cmlub0FkZHJlc3MAAAAABQAAAA9uZXV0cmlub0Fk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AAIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4VXNkblN1cHBseQUAAAAPbnNidFN1cHBseURFTFRBBAAAAARzUmF3CQAAZAAAAAIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4TnNidFN1cHBseQUAAAAPbnNidFN1cHBseURFTFRBBAAAAARtUmF3CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAXbk1ldHJpY0lkeE1heE5zYnRTdXBwbHkEAAAACmtDYWxjQXJyYXkJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAEmNhbGN1bGF0ZUtSRUFET05MWQkABEwAAAACBQAAAAR3UmF3CQAETAAAAAIFAAAABHVSYXcJAARMAAAAAgUAAAAFcHJpY2UJAARMAAAAAgUAAAAEbVJhdwkABEwAAAACBQAAAARzUmF3BQAAAANuaWwFAAAAA25pbAQAAAAIbXVsdEtYMTYJAAGnAAAAAQkBAAAACGFzU3RyaW5nAAAAAQkAAZEAAAACBQAAAAprQ2FsY0FycmF5BQAAABJrUmVzdWx0SWR4TXVsdEtTdHIEAAAADG11bHRTdGVwMVgxNgkAATwAAAADCQABNgAAAAEFAAAABG1SYXcFAAAAB01VTFRYMTYJAAE2AAAAAQkAAGUAAAACBQAAAARtUmF3BQAAAARzUmF3BAAAAAxtdWx0U3RlcDJYMTYJAAE8AAAAAwUAAAAMbXVsdFN0ZXAxWDE2BQAAAAxtdWx0U3RlcDFYMTYFAAAAB01VTFRYMTYEAAAAFW11bHROc2J0MnVzZG5QcmljZVgxNgkAATwAAAADBQAAAAhtdWx0S1gxNgUAAAAMbXVsdFN0ZXAyWDE2BQAAAAdNVUxUWDE2BAAAAA5uc2J0MnVzZG5QcmljZQkAAaAAAAABCQABPAAAAAMFAAAAFW11bHROc2J0MnVzZG5QcmljZVgxNgkAATYAAAABBQAAAAVNVUxUNgUAAAAHTVVMVFgxNgQAAAAPbnNidDJ3YXZlc1ByaWNlCQAAawAAAAMFAAAADm5zYnQy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", "chainId": 84, "height": 2197101, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DrecysSgZVcyzTwuipRov3KjjtBhzUMG37Qdbj38XRvk Next: HryhGkGQ4wsumQgUB5mtqa3SKHorT4xmBEML2My3VyzK Diff:
OldNewDifferences
7676 func J () = "%s%s__config__swapBParam"
7777
7878
79-func K () = "neutrino_asset_id"
79+func K () = "%s%s__config__usdnSwapAParam"
8080
8181
82-func L () = "bond_asset_id"
82+func L () = "%s%s__config__usdnSwapBParam"
8383
8484
85-func M () = "surf_asset_id"
85+func M () = "neutrino_asset_id"
8686
8787
88-func N () = "balance_lock_"
88+func N () = "bond_asset_id"
8989
9090
91-func O () = (N() + "waves")
91+func O () = "surf_asset_id"
9292
9393
94-func P () = (N() + "neutrino")
94+func P () = "balance_lock_"
9595
9696
97-func Q () = "swaps_timeframe"
97+func Q () = (P() + "waves")
9898
9999
100-func R (S) = makeString(["%s%s", "userLastQuickSwapHeight", S], d)
100+func R () = (P() + "neutrino")
101101
102102
103-func T (S) = makeString(["%s%s", "quickSwapUserSpentInPeriod", S], d)
103+func S () = "swaps_timeframe"
104104
105105
106-func U () = "price"
106+func T (U) = makeString(["%s%s", "userLastQuickSwapHeight", U], d)
107107
108108
109-func V (W,X) = valueOrErrorMessage(getString(W, X), makeString(["mandatory ", toString(W), ".", X, " is not defined"], ""))
109+func V (U) = makeString(["%s%s", "quickSwapUserSpentInPeriod", U], d)
110110
111111
112-func Y (W,X) = valueOrErrorMessage(getInteger(W, X), makeString(["mandatory ", toString(W), ".", X, " is not defined"], ""))
112+func W () = "price"
113113
114114
115-func Z (W,X) = valueOrElse(getInteger(W, X), 0)
115+func X (Y,Z) = valueOrErrorMessage(getString(Y, Z), makeString(["mandatory ", toString(Y), ".", Z, " is not defined"], ""))
116116
117117
118-func aa (W,X) = valueOrErrorMessage(getBoolean(W, X), makeString(["mandatory ", toString(W), ".", X, " is not defined"], ""))
118+func aa (Y,Z) = valueOrErrorMessage(getInteger(Y, Z), makeString(["mandatory ", toString(Y), ".", Z, " is not defined"], ""))
119119
120120
121-func ab (ac,ad) = fraction(ac, j, ad)
121+func ab (Y,Z) = valueOrElse(getInteger(Y, Z), 0)
122122
123123
124-func ae (ac,ad) = fraction(ac, ad, j)
124+func ac (Y,Z) = valueOrErrorMessage(getBoolean(Y, Z), makeString(["mandatory ", toString(Y), ".", Z, " is not defined"], ""))
125125
126126
127-func af (ag,ah) = fraction(toBigInt(ag), m, toBigInt(ah))
127+func ad (ae,af) = fraction(ae, j, af)
128128
129129
130-func ai (aj,ak) = toInt(fraction(aj, toBigInt(ak), m))
130+func ag (ae,af) = fraction(ae, af, j)
131131
132132
133-func al (aj) = {
134- let am = aj
135- if ($isInstanceOf(am, "List[Any]"))
133+func ah (ai,aj) = fraction(toBigInt(ai), m, toBigInt(aj))
134+
135+
136+func ak (al,am) = toInt(fraction(al, toBigInt(am), m))
137+
138+
139+func an (al) = {
140+ let ao = al
141+ if ($isInstanceOf(ao, "List[Any]"))
136142 then {
137- let an = am
138- an
143+ let ap = ao
144+ ap
139145 }
140146 else throw("fail to cast into List[Any]")
141147 }
142148
143149
144-func ao (aj) = {
145- let am = aj
146- if ($isInstanceOf(am, "Int"))
150+func aq (al) = {
151+ let ao = al
152+ if ($isInstanceOf(ao, "Int"))
147153 then {
148- let ap = am
149- ap
154+ let ar = ao
155+ ar
150156 }
151157 else throw("fail to cast into Int")
152158 }
153159
154160
155-func aq (aj) = {
156- let am = aj
157- if ($isInstanceOf(am, "String"))
161+func as (al) = {
162+ let ao = al
163+ if ($isInstanceOf(ao, "String"))
158164 then {
159- let ar = am
160- ar
165+ let at = ao
166+ at
161167 }
162168 else throw("fail to cast into String")
163169 }
164170
165171
166-let as = 1
172+let au = 1
167173
168-let at = 2
174+let av = 2
169175
170-let au = 3
176+let aw = 3
171177
172-let av = 4
178+let ax = 4
173179
174-let aw = 5
180+let ay = 5
175181
176-let ax = 6
182+let az = 6
177183
178-let ay = 7
184+let aA = 7
179185
180-let az = 8
186+let aB = 8
181187
182-let aA = 9
188+let aC = 9
183189
184-func aB () = "%s%s__config__controlAddress"
190+func aD () = "%s%s__config__controlAddress"
185191
186192
187-func aC () = "%s__controlConfig"
193+func aE () = "%s__controlConfig"
188194
189195
190-func aD (aE) = split(V(aE, aC()), d)
196+func aF (aG) = split(X(aG, aE()), d)
191197
192198
193-func aF (aG,aH) = valueOrErrorMessage(addressFromString(aG[aH]), ("Control cfg doesn't contain address at index " + toString(aH)))
199+func aH (aI,aJ) = valueOrErrorMessage(addressFromString(aI[aJ]), ("Control cfg doesn't contain address at index " + toString(aJ)))
194200
195201
196-let aI = addressFromStringValue(valueOrElse(getString(this, aB()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
202+let aK = addressFromStringValue(valueOrElse(getString(this, aD()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
197203
198-let aG = aD(aI)
204+let aI = aF(aK)
199205
200-let aJ = aF(aG, as)
206+let aL = aH(aI, au)
201207
202-let aK = aF(aG, at)
208+let aM = aH(aI, av)
203209
204-let aL = aF(aG, aw)
210+let aN = aH(aI, ay)
205211
206-let aM = fromBase58String(V(aJ, K()))
212+let aO = fromBase58String(X(aL, M()))
207213
208-let aN = fromBase58String(getStringValue(aJ, L()))
214+let aP = fromBase58String(getStringValue(aL, N()))
209215
210-let aO = fromBase58String(getStringValue(aK, M()))
216+let aQ = fromBase58String(getStringValue(aM, O()))
211217
212-@Callable(aP)
213-func constructor (aQ,aR,aS) = if ((aP.caller != this))
218+let aR = getIntegerValue(aK, W())
219+
220+let aS = valueOrElse(getInteger(aL, R()), 0)
221+
222+let aT = valueOrElse(getInteger(aL, Q()), 0)
223+
224+let aU = (wavesBalance(aL).regular - aT)
225+
226+let aV = ag(aU, aR)
227+
228+let aW = (((aS + value(assetInfo(aO)).quantity) - assetBalance(aL, aO)) - assetBalance(aN, aO))
229+
230+let aX = if ((aW == 0))
231+ then 0
232+ else fraction(aV, h, aW)
233+
234+@Callable(aY)
235+func constructor (aZ,ba,bb) = if ((aY.caller != this))
214236 then throw("not authorized")
215- else [StringEntry(H(), aQ), IntegerEntry(I(), aS)]
237+ else [StringEntry(H(), aZ), IntegerEntry(I(), bb)]
216238
217239
218240
219-@Callable(aP)
220-func calcSwapLimitREADONLY (aT) = {
221- let aU = if ((0 >= aT))
241+@Callable(aY)
242+func calcSwapLimitREADONLY (bc) = {
243+ let bd = if ((0 >= bc))
222244 then 0
223245 else {
224- let aV = toBigInt(Y(this, I()))
225- let aW = toBigInt(Y(this, J()))
226- let aX = pow(toBigInt(aT), 6, aW, 16, 8, CEILING)
227- toInt(fraction(aV, aX, l))
246+ let be = toBigInt(aa(this, I()))
247+ let bf = toBigInt(aa(this, J()))
248+ let bg = pow(toBigInt(bc), 6, bf, 16, 8, CEILING)
249+ toInt(fraction(be, bg, l))
228250 }
229- $Tuple2(nil, aU)
251+ let bh = ad(bd, aR)
252+ let bi = if ((0 >= bc))
253+ then 0
254+ else {
255+ let be = toBigInt(aa(this, K()))
256+ let bf = toBigInt(aa(this, L()))
257+ let bj = toBigInt(aX)
258+ let bg = pow(toBigInt(bc), 6, bf, 16, 8, CEILING)
259+ toInt(fraction(fraction(be, bg, l), bj, i))
260+ }
261+ $Tuple2(nil, [bd, bh, bi])
230262 }
231263
232264
233265
234-@Callable(aP)
235-func calculateKREADONLY (aY,aZ,ad,ba,bb) = {
236- let bc = toBigInt(2718281)
237- let bd = 6
238- let be = valueOrElse(getInteger(aK, "nsbtCurveParam_a"), 3)
239- let bf = valueOrElse(getInteger(aK, "nsbtCurveParam_b"), ((3 * h) / 10))
240- let bg = ae(aY, ad)
241- let bh = fraction(bg, j, aZ)
242- if ((bh > 10678564816))
243- then throw((("BR=" + toString(bh)) + " > 10678.564816% will overflow exponent"))
266+@Callable(aY)
267+func calculateKREADONLY (bk,bl,af,bm,bn) = {
268+ let bo = toBigInt(2718281)
269+ let bp = 6
270+ let bq = valueOrElse(getInteger(aM, "nsbtCurveParam_a"), 3)
271+ let br = valueOrElse(getInteger(aM, "nsbtCurveParam_b"), ((3 * h) / 10))
272+ let bs = ag(bk, af)
273+ let bt = fraction(bs, j, bl)
274+ if ((bt > 10678564816))
275+ then throw((("BR=" + toString(bt)) + " > 10678.564816% will overflow exponent"))
244276 else {
245- let bi = (be * (bh - j))
246- let bj = pow(bc, bd, toBigInt(bi), b, c, DOWN)
247- let bk = fraction(toBigInt(bf), bj, i)
248- $Tuple2(nil, [be, bf, bg, bh, bi, toString(bj), toString(bk)])
277+ let bu = (bq * (bt - j))
278+ let bv = pow(bo, bp, toBigInt(bu), b, c, DOWN)
279+ let bw = fraction(toBigInt(br), bv, i)
280+ $Tuple2(nil, [bq, br, bs, bt, bu, toString(bv), toString(bw)])
249281 }
250282 }
251283
252284
253285
254-@Callable(aP)
255-func curveFunctionREADONLY (bl) = {
256- let bm = al(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
257- let ad = ao(bm[v])
258- let aY = ao(bm[y])
259- let aZ = ao(bm[A])
260- let bb = ao(bm[E])
261- let ba = ao(bm[F])
262- let bn = al(invoke(this, "calculateKREADONLY", [aY, aZ, ad, ba, bb], nil))
263- let bk = parseBigIntValue(aq(bn[u]))
264- let bo = ae(bl, ad)
265- let bp = toBigInt(ba)
266- let bq = toBigInt((ba - bb))
267- let br = fraction(toBigInt(bo), m, bk)
268- let bs = fraction(br, bq, bp)
269- let bt = toInt(fraction(bq, bp, (bs + bp)))
270- let bu = ((ba - bb) - bt)
271- $Tuple2(nil, [bu, bo, aY, aZ, ba, bb, ao(bn[o]), ao(bn[p]), ao(bn[q]), ad, ao(bn[r]), ao(bn[s]), bn[t], bn[u], toString(br), toString(bs), bt])
286+@Callable(aY)
287+func curveFunctionREADONLY (bx) = {
288+ let by = an(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
289+ let af = aq(by[v])
290+ let bk = aq(by[y])
291+ let bl = aq(by[A])
292+ let bn = aq(by[E])
293+ let bm = aq(by[F])
294+ let bz = an(invoke(this, "calculateKREADONLY", [bk, bl, af, bm, bn], nil))
295+ let bw = parseBigIntValue(as(bz[u]))
296+ let bA = ag(bx, af)
297+ let bB = toBigInt(bm)
298+ let bC = toBigInt((bm - bn))
299+ let bD = fraction(toBigInt(bA), m, bw)
300+ let bE = fraction(bD, bC, bB)
301+ let bF = toInt(fraction(bC, bB, (bE + bB)))
302+ let bG = ((bm - bn) - bF)
303+ $Tuple2(nil, [bG, bA, bk, bl, bm, bn, aq(bz[o]), aq(bz[p]), aq(bz[q]), af, aq(bz[r]), aq(bz[s]), bz[t], bz[u], toString(bD), toString(bE), bF])
272304 }
273305
274306
275307
276-@Callable(aP)
277-func surfFunctionREADONLY (ac,bv) = if ((0 > ac))
308+@Callable(aY)
309+func surfFunctionREADONLY (ae,bH) = if ((0 > ae))
278310 then throw("amount should be positive")
279311 else {
280- let bm = al(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
281- let ad = ao(bm[v])
282- let bw = toBigInt(ad)
283- let bx = ao(bm[y])
284- let by = toBigInt(bx)
285- let bz = ao(bm[A])
286- let bA = toBigInt(bz)
287- let bB = ao(bm[D])
288- if ((bB >= h))
289- then throw((("BR = " + toString(bB)) + ", cannot buy SURF"))
312+ let af = aR
313+ let bI = toBigInt(af)
314+ let bJ = toBigInt(aU)
315+ let bK = aW
316+ let bL = toBigInt(bK)
317+ if ((aX >= h))
318+ then throw((("BR = " + toString(aX)) + ", cannot buy SURF"))
290319 else {
291- let bC = (fraction(bz, j, ad) - bx)
292- let bD = (bz - fraction(bx, ad, j))
293- let bE = if ((bv == aM))
294- then if ((ac > bD))
295- then bD
296- else ac
297- else if ((bv == n))
298- then if ((ac > bC))
299- then bC
300- else ac
320+ let bM = (fraction(bK, j, af) - aU)
321+ let bN = (bK - fraction(aU, af, j))
322+ let bO = if ((bH == aO))
323+ then if ((ae > bN))
324+ then bN
325+ else ae
326+ else if ((bH == n))
327+ then if ((ae > bM))
328+ then bM
329+ else ae
301330 else 0
302- let bF = toBigInt(bE)
303- if ((bv == aM))
304- then $Tuple2(nil, [toInt(fraction(fraction(bF, k, bw), (bA - (bF / g)), by)), 0, bE, bx, bz, bB, bx, (bz - bE), fraction(ae(bx, ad), h, (bz - bE)), (ac - bE), ad])
305- else if ((bv == n))
306- then $Tuple2(nil, [toInt(fraction(bA, log(fraction((by + bF), m, by), 16, f, 16, 16, HALFUP), m)), bE, 0, bx, bz, bB, (bx + bE), bz, fraction(ae((bx + bE), ad), h, bz), (ac - bE), ad])
331+ let bP = toBigInt(bO)
332+ if ((bH == aO))
333+ then $Tuple2(nil, [toInt(fraction(fraction(bP, k, bI), (bL - (bP / g)), bJ)), 0, bO, aU, bK, aX, aU, (bK - bO), fraction(ag(aU, af), h, (bK - bO)), (ae - bO), af])
334+ else if ((bH == n))
335+ then $Tuple2(nil, [toInt(fraction(bL, log(fraction((bJ + bP), m, bJ), 16, f, 16, 16, HALFUP), m)), bO, 0, aU, bK, aX, (aU + bO), bK, fraction(ag((aU + bO), af), h, bK), (ae - bO), af])
307336 else throw("Unsupported asset")
308337 }
309338 }
310339
311340
312341
313-@Callable(aP)
314-func calcContractNsbtPriceSYSREADONLY (bG) = {
315- let bm = al(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
316- let ad = ao(bm[v])
317- let aY = ao(bm[y])
318- let aZ = (ao(bm[A]) - bG)
319- let bb = (ao(bm[E]) + bG)
320- let ba = ao(bm[F])
321- let bn = al(invoke(this, "calculateKREADONLY", [aY, aZ, ad, ba, bb], nil))
322- let bH = parseBigIntValue(aq(bn[u]))
323- let bI = fraction(toBigInt(ba), m, toBigInt((ba - bb)))
324- let bJ = fraction(bI, bI, m)
325- let bK = fraction(bH, bJ, m)
326- let bL = toInt(fraction(bK, toBigInt(h), m))
327- let bM = fraction(bL, h, ad)
328- $Tuple2(nil, [bL, bM])
342+@Callable(aY)
343+func calcContractNsbtPriceSYSREADONLY (bQ) = {
344+ let by = an(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
345+ let af = aq(by[v])
346+ let bk = aq(by[y])
347+ let bl = (aq(by[A]) - bQ)
348+ let bn = (aq(by[E]) + bQ)
349+ let bm = aq(by[F])
350+ let bz = an(invoke(this, "calculateKREADONLY", [bk, bl, af, bm, bn], nil))
351+ let bR = parseBigIntValue(as(bz[u]))
352+ let bS = fraction(toBigInt(bm), m, toBigInt((bm - bn)))
353+ let bT = fraction(bS, bS, m)
354+ let bU = fraction(bR, bT, m)
355+ let bV = toInt(fraction(bU, toBigInt(h), m))
356+ let bW = fraction(bV, h, af)
357+ $Tuple2(nil, [bV, bW])
329358 }
330359
331360
332361
333-@Callable(aP)
362+@Callable(aY)
334363 func calcNeutinoMetricsREADONLY () = {
335- let bN = getIntegerValue(aI, U())
336- let bO = valueOrElse(getInteger(aJ, P()), 0)
337- let bP = valueOrElse(getInteger(aJ, O()), 0)
338- let bx = (wavesBalance(aJ).regular - bP)
339- let bQ = ae(bx, bN)
340- let bR = (((bO + value(assetInfo(aM)).quantity) - assetBalance(aJ, aM)) - assetBalance(aL, aM))
341- let bS = (bQ - bR)
342- let bT = (bR - bQ)
343- let bU = if ((bR == 0))
364+ let bX = (aV - aW)
365+ let bY = (aW - aV)
366+ let bZ = if ((aW == 0))
344367 then 0
345- else (fraction(bS, h, bR) * 100)
346- let bB = if ((bR == 0))
347- then 0
348- else fraction(bQ, h, bR)
349- let bV = value(assetInfo(aN)).quantity
350- let bW = (bV - assetBalance(aK, aN))
351- let bX = value(assetInfo(aO)).quantity
352- $Tuple2(nil, [bN, bO, bP, bx, bQ, bR, bS, bU, bB, bW, bV, bX])
368+ else (fraction(bX, h, aW) * 100)
369+ let ca = value(assetInfo(aP)).quantity
370+ let cb = (ca - assetBalance(aM, aP))
371+ let cc = value(assetInfo(aQ)).quantity
372+ $Tuple2(nil, [aR, aS, aT, aU, aV, aW, bX, bZ, aX, cb, ca, cc])
353373 }
354374
355375
356376
357-@Callable(aP)
358-func getUnstakeComissionAmountREADONLY (ac,bY,bZ) = $Tuple2(nil, fraction(ac, pow(2, 0, fraction(-((height - bY)), j, bZ), 8, 8, HALFUP), j))
377+@Callable(aY)
378+func getUnstakeComissionAmountREADONLY (ae,cd,ce) = $Tuple2(nil, fraction(ae, pow(2, 0, fraction(-((height - cd)), j, ce), 8, 8, HALFUP), j))
359379
360380
361381
362-@Callable(aP)
363-func mergeStakesREADONLY (ca,cb,cc,cd,bZ) = {
364- let ce = fraction(cc, pow(2, 0, fraction((cd - cb), j, bZ), 8, 8, HALFUP), j)
365- let cf = fraction((ca + cc), j, (ca + ce))
366- $Tuple2(nil, (cb + ((e - (bZ * log(cf, 8, 2, 0, 8, HALFUP))) / j)))
382+@Callable(aY)
383+func mergeStakesREADONLY (cf,cg,ch,ci,ce) = {
384+ let cj = fraction(ch, pow(2, 0, fraction((ci - cg), j, ce), 8, 8, HALFUP), j)
385+ let ck = fraction((cf + ch), j, (cf + cj))
386+ $Tuple2(nil, (cg + ((e - (ce * log(ck, 8, 2, 0, 8, HALFUP))) / j)))
367387 }
368388
369389
370-@Verifier(cg)
371-func ch () = {
372- let ci = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], d)
373- let cj = split(valueOrElse(getString(aI, "%s__multisig"), ci), d)
374- let ck = ((((if (sigVerify(cg.bodyBytes, cg.proofs[0], fromBase58String(cj[0])))
390+@Verifier(cl)
391+func cm () = {
392+ let cn = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], d)
393+ let co = split(valueOrElse(getString(aK, "%s__multisig"), cn), d)
394+ let cp = ((((if (sigVerify(cl.bodyBytes, cl.proofs[0], fromBase58String(co[0])))
375395 then 1
376- else 0) + (if (sigVerify(cg.bodyBytes, cg.proofs[1], fromBase58String(cj[1])))
396+ else 0) + (if (sigVerify(cl.bodyBytes, cl.proofs[1], fromBase58String(co[1])))
377397 then 1
378- else 0)) + (if (sigVerify(cg.bodyBytes, cg.proofs[2], fromBase58String(cj[2])))
398+ else 0)) + (if (sigVerify(cl.bodyBytes, cl.proofs[2], fromBase58String(co[2])))
379399 then 1
380- else 0)) + (if (sigVerify(cg.bodyBytes, cg.proofs[3], fromBase58String(cj[3])))
400+ else 0)) + (if (sigVerify(cl.bodyBytes, cl.proofs[3], fromBase58String(co[3])))
381401 then 2
382402 else 0))
383- (ck >= 3)
403+ (cp >= 3)
384404 }
385405
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = ""
55
66 let b = 8
77
88 let c = 16
99
1010 let d = "__"
1111
1212 let e = 50000000
1313
1414 let f = toBigInt(27182818284590452)
1515
1616 let g = toBigInt(2)
1717
1818 let h = 1000000
1919
2020 let i = toBigInt(1000000)
2121
2222 let j = 100000000
2323
2424 let k = toBigInt(100000000)
2525
2626 let l = toBigInt(10000000000)
2727
2828 let m = toBigInt(10000000000000000)
2929
3030 let n = fromBase58String("WAVES")
3131
3232 let o = 0
3333
3434 let p = 1
3535
3636 let q = 2
3737
3838 let r = 3
3939
4040 let s = 4
4141
4242 let t = 5
4343
4444 let u = 6
4545
4646 let v = 0
4747
4848 let w = 1
4949
5050 let x = 2
5151
5252 let y = 3
5353
5454 let z = 4
5555
5656 let A = 5
5757
5858 let B = 6
5959
6060 let C = 7
6161
6262 let D = 8
6363
6464 let E = 9
6565
6666 let F = 10
6767
6868 let G = 11
6969
7070 func H () = "%s%s__config__neutrinoAddress"
7171
7272
7373 func I () = "%s%s__config__swapAParam"
7474
7575
7676 func J () = "%s%s__config__swapBParam"
7777
7878
79-func K () = "neutrino_asset_id"
79+func K () = "%s%s__config__usdnSwapAParam"
8080
8181
82-func L () = "bond_asset_id"
82+func L () = "%s%s__config__usdnSwapBParam"
8383
8484
85-func M () = "surf_asset_id"
85+func M () = "neutrino_asset_id"
8686
8787
88-func N () = "balance_lock_"
88+func N () = "bond_asset_id"
8989
9090
91-func O () = (N() + "waves")
91+func O () = "surf_asset_id"
9292
9393
94-func P () = (N() + "neutrino")
94+func P () = "balance_lock_"
9595
9696
97-func Q () = "swaps_timeframe"
97+func Q () = (P() + "waves")
9898
9999
100-func R (S) = makeString(["%s%s", "userLastQuickSwapHeight", S], d)
100+func R () = (P() + "neutrino")
101101
102102
103-func T (S) = makeString(["%s%s", "quickSwapUserSpentInPeriod", S], d)
103+func S () = "swaps_timeframe"
104104
105105
106-func U () = "price"
106+func T (U) = makeString(["%s%s", "userLastQuickSwapHeight", U], d)
107107
108108
109-func V (W,X) = valueOrErrorMessage(getString(W, X), makeString(["mandatory ", toString(W), ".", X, " is not defined"], ""))
109+func V (U) = makeString(["%s%s", "quickSwapUserSpentInPeriod", U], d)
110110
111111
112-func Y (W,X) = valueOrErrorMessage(getInteger(W, X), makeString(["mandatory ", toString(W), ".", X, " is not defined"], ""))
112+func W () = "price"
113113
114114
115-func Z (W,X) = valueOrElse(getInteger(W, X), 0)
115+func X (Y,Z) = valueOrErrorMessage(getString(Y, Z), makeString(["mandatory ", toString(Y), ".", Z, " is not defined"], ""))
116116
117117
118-func aa (W,X) = valueOrErrorMessage(getBoolean(W, X), makeString(["mandatory ", toString(W), ".", X, " is not defined"], ""))
118+func aa (Y,Z) = valueOrErrorMessage(getInteger(Y, Z), makeString(["mandatory ", toString(Y), ".", Z, " is not defined"], ""))
119119
120120
121-func ab (ac,ad) = fraction(ac, j, ad)
121+func ab (Y,Z) = valueOrElse(getInteger(Y, Z), 0)
122122
123123
124-func ae (ac,ad) = fraction(ac, ad, j)
124+func ac (Y,Z) = valueOrErrorMessage(getBoolean(Y, Z), makeString(["mandatory ", toString(Y), ".", Z, " is not defined"], ""))
125125
126126
127-func af (ag,ah) = fraction(toBigInt(ag), m, toBigInt(ah))
127+func ad (ae,af) = fraction(ae, j, af)
128128
129129
130-func ai (aj,ak) = toInt(fraction(aj, toBigInt(ak), m))
130+func ag (ae,af) = fraction(ae, af, j)
131131
132132
133-func al (aj) = {
134- let am = aj
135- if ($isInstanceOf(am, "List[Any]"))
133+func ah (ai,aj) = fraction(toBigInt(ai), m, toBigInt(aj))
134+
135+
136+func ak (al,am) = toInt(fraction(al, toBigInt(am), m))
137+
138+
139+func an (al) = {
140+ let ao = al
141+ if ($isInstanceOf(ao, "List[Any]"))
136142 then {
137- let an = am
138- an
143+ let ap = ao
144+ ap
139145 }
140146 else throw("fail to cast into List[Any]")
141147 }
142148
143149
144-func ao (aj) = {
145- let am = aj
146- if ($isInstanceOf(am, "Int"))
150+func aq (al) = {
151+ let ao = al
152+ if ($isInstanceOf(ao, "Int"))
147153 then {
148- let ap = am
149- ap
154+ let ar = ao
155+ ar
150156 }
151157 else throw("fail to cast into Int")
152158 }
153159
154160
155-func aq (aj) = {
156- let am = aj
157- if ($isInstanceOf(am, "String"))
161+func as (al) = {
162+ let ao = al
163+ if ($isInstanceOf(ao, "String"))
158164 then {
159- let ar = am
160- ar
165+ let at = ao
166+ at
161167 }
162168 else throw("fail to cast into String")
163169 }
164170
165171
166-let as = 1
172+let au = 1
167173
168-let at = 2
174+let av = 2
169175
170-let au = 3
176+let aw = 3
171177
172-let av = 4
178+let ax = 4
173179
174-let aw = 5
180+let ay = 5
175181
176-let ax = 6
182+let az = 6
177183
178-let ay = 7
184+let aA = 7
179185
180-let az = 8
186+let aB = 8
181187
182-let aA = 9
188+let aC = 9
183189
184-func aB () = "%s%s__config__controlAddress"
190+func aD () = "%s%s__config__controlAddress"
185191
186192
187-func aC () = "%s__controlConfig"
193+func aE () = "%s__controlConfig"
188194
189195
190-func aD (aE) = split(V(aE, aC()), d)
196+func aF (aG) = split(X(aG, aE()), d)
191197
192198
193-func aF (aG,aH) = valueOrErrorMessage(addressFromString(aG[aH]), ("Control cfg doesn't contain address at index " + toString(aH)))
199+func aH (aI,aJ) = valueOrErrorMessage(addressFromString(aI[aJ]), ("Control cfg doesn't contain address at index " + toString(aJ)))
194200
195201
196-let aI = addressFromStringValue(valueOrElse(getString(this, aB()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
202+let aK = addressFromStringValue(valueOrElse(getString(this, aD()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
197203
198-let aG = aD(aI)
204+let aI = aF(aK)
199205
200-let aJ = aF(aG, as)
206+let aL = aH(aI, au)
201207
202-let aK = aF(aG, at)
208+let aM = aH(aI, av)
203209
204-let aL = aF(aG, aw)
210+let aN = aH(aI, ay)
205211
206-let aM = fromBase58String(V(aJ, K()))
212+let aO = fromBase58String(X(aL, M()))
207213
208-let aN = fromBase58String(getStringValue(aJ, L()))
214+let aP = fromBase58String(getStringValue(aL, N()))
209215
210-let aO = fromBase58String(getStringValue(aK, M()))
216+let aQ = fromBase58String(getStringValue(aM, O()))
211217
212-@Callable(aP)
213-func constructor (aQ,aR,aS) = if ((aP.caller != this))
218+let aR = getIntegerValue(aK, W())
219+
220+let aS = valueOrElse(getInteger(aL, R()), 0)
221+
222+let aT = valueOrElse(getInteger(aL, Q()), 0)
223+
224+let aU = (wavesBalance(aL).regular - aT)
225+
226+let aV = ag(aU, aR)
227+
228+let aW = (((aS + value(assetInfo(aO)).quantity) - assetBalance(aL, aO)) - assetBalance(aN, aO))
229+
230+let aX = if ((aW == 0))
231+ then 0
232+ else fraction(aV, h, aW)
233+
234+@Callable(aY)
235+func constructor (aZ,ba,bb) = if ((aY.caller != this))
214236 then throw("not authorized")
215- else [StringEntry(H(), aQ), IntegerEntry(I(), aS)]
237+ else [StringEntry(H(), aZ), IntegerEntry(I(), bb)]
216238
217239
218240
219-@Callable(aP)
220-func calcSwapLimitREADONLY (aT) = {
221- let aU = if ((0 >= aT))
241+@Callable(aY)
242+func calcSwapLimitREADONLY (bc) = {
243+ let bd = if ((0 >= bc))
222244 then 0
223245 else {
224- let aV = toBigInt(Y(this, I()))
225- let aW = toBigInt(Y(this, J()))
226- let aX = pow(toBigInt(aT), 6, aW, 16, 8, CEILING)
227- toInt(fraction(aV, aX, l))
246+ let be = toBigInt(aa(this, I()))
247+ let bf = toBigInt(aa(this, J()))
248+ let bg = pow(toBigInt(bc), 6, bf, 16, 8, CEILING)
249+ toInt(fraction(be, bg, l))
228250 }
229- $Tuple2(nil, aU)
251+ let bh = ad(bd, aR)
252+ let bi = if ((0 >= bc))
253+ then 0
254+ else {
255+ let be = toBigInt(aa(this, K()))
256+ let bf = toBigInt(aa(this, L()))
257+ let bj = toBigInt(aX)
258+ let bg = pow(toBigInt(bc), 6, bf, 16, 8, CEILING)
259+ toInt(fraction(fraction(be, bg, l), bj, i))
260+ }
261+ $Tuple2(nil, [bd, bh, bi])
230262 }
231263
232264
233265
234-@Callable(aP)
235-func calculateKREADONLY (aY,aZ,ad,ba,bb) = {
236- let bc = toBigInt(2718281)
237- let bd = 6
238- let be = valueOrElse(getInteger(aK, "nsbtCurveParam_a"), 3)
239- let bf = valueOrElse(getInteger(aK, "nsbtCurveParam_b"), ((3 * h) / 10))
240- let bg = ae(aY, ad)
241- let bh = fraction(bg, j, aZ)
242- if ((bh > 10678564816))
243- then throw((("BR=" + toString(bh)) + " > 10678.564816% will overflow exponent"))
266+@Callable(aY)
267+func calculateKREADONLY (bk,bl,af,bm,bn) = {
268+ let bo = toBigInt(2718281)
269+ let bp = 6
270+ let bq = valueOrElse(getInteger(aM, "nsbtCurveParam_a"), 3)
271+ let br = valueOrElse(getInteger(aM, "nsbtCurveParam_b"), ((3 * h) / 10))
272+ let bs = ag(bk, af)
273+ let bt = fraction(bs, j, bl)
274+ if ((bt > 10678564816))
275+ then throw((("BR=" + toString(bt)) + " > 10678.564816% will overflow exponent"))
244276 else {
245- let bi = (be * (bh - j))
246- let bj = pow(bc, bd, toBigInt(bi), b, c, DOWN)
247- let bk = fraction(toBigInt(bf), bj, i)
248- $Tuple2(nil, [be, bf, bg, bh, bi, toString(bj), toString(bk)])
277+ let bu = (bq * (bt - j))
278+ let bv = pow(bo, bp, toBigInt(bu), b, c, DOWN)
279+ let bw = fraction(toBigInt(br), bv, i)
280+ $Tuple2(nil, [bq, br, bs, bt, bu, toString(bv), toString(bw)])
249281 }
250282 }
251283
252284
253285
254-@Callable(aP)
255-func curveFunctionREADONLY (bl) = {
256- let bm = al(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
257- let ad = ao(bm[v])
258- let aY = ao(bm[y])
259- let aZ = ao(bm[A])
260- let bb = ao(bm[E])
261- let ba = ao(bm[F])
262- let bn = al(invoke(this, "calculateKREADONLY", [aY, aZ, ad, ba, bb], nil))
263- let bk = parseBigIntValue(aq(bn[u]))
264- let bo = ae(bl, ad)
265- let bp = toBigInt(ba)
266- let bq = toBigInt((ba - bb))
267- let br = fraction(toBigInt(bo), m, bk)
268- let bs = fraction(br, bq, bp)
269- let bt = toInt(fraction(bq, bp, (bs + bp)))
270- let bu = ((ba - bb) - bt)
271- $Tuple2(nil, [bu, bo, aY, aZ, ba, bb, ao(bn[o]), ao(bn[p]), ao(bn[q]), ad, ao(bn[r]), ao(bn[s]), bn[t], bn[u], toString(br), toString(bs), bt])
286+@Callable(aY)
287+func curveFunctionREADONLY (bx) = {
288+ let by = an(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
289+ let af = aq(by[v])
290+ let bk = aq(by[y])
291+ let bl = aq(by[A])
292+ let bn = aq(by[E])
293+ let bm = aq(by[F])
294+ let bz = an(invoke(this, "calculateKREADONLY", [bk, bl, af, bm, bn], nil))
295+ let bw = parseBigIntValue(as(bz[u]))
296+ let bA = ag(bx, af)
297+ let bB = toBigInt(bm)
298+ let bC = toBigInt((bm - bn))
299+ let bD = fraction(toBigInt(bA), m, bw)
300+ let bE = fraction(bD, bC, bB)
301+ let bF = toInt(fraction(bC, bB, (bE + bB)))
302+ let bG = ((bm - bn) - bF)
303+ $Tuple2(nil, [bG, bA, bk, bl, bm, bn, aq(bz[o]), aq(bz[p]), aq(bz[q]), af, aq(bz[r]), aq(bz[s]), bz[t], bz[u], toString(bD), toString(bE), bF])
272304 }
273305
274306
275307
276-@Callable(aP)
277-func surfFunctionREADONLY (ac,bv) = if ((0 > ac))
308+@Callable(aY)
309+func surfFunctionREADONLY (ae,bH) = if ((0 > ae))
278310 then throw("amount should be positive")
279311 else {
280- let bm = al(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
281- let ad = ao(bm[v])
282- let bw = toBigInt(ad)
283- let bx = ao(bm[y])
284- let by = toBigInt(bx)
285- let bz = ao(bm[A])
286- let bA = toBigInt(bz)
287- let bB = ao(bm[D])
288- if ((bB >= h))
289- then throw((("BR = " + toString(bB)) + ", cannot buy SURF"))
312+ let af = aR
313+ let bI = toBigInt(af)
314+ let bJ = toBigInt(aU)
315+ let bK = aW
316+ let bL = toBigInt(bK)
317+ if ((aX >= h))
318+ then throw((("BR = " + toString(aX)) + ", cannot buy SURF"))
290319 else {
291- let bC = (fraction(bz, j, ad) - bx)
292- let bD = (bz - fraction(bx, ad, j))
293- let bE = if ((bv == aM))
294- then if ((ac > bD))
295- then bD
296- else ac
297- else if ((bv == n))
298- then if ((ac > bC))
299- then bC
300- else ac
320+ let bM = (fraction(bK, j, af) - aU)
321+ let bN = (bK - fraction(aU, af, j))
322+ let bO = if ((bH == aO))
323+ then if ((ae > bN))
324+ then bN
325+ else ae
326+ else if ((bH == n))
327+ then if ((ae > bM))
328+ then bM
329+ else ae
301330 else 0
302- let bF = toBigInt(bE)
303- if ((bv == aM))
304- then $Tuple2(nil, [toInt(fraction(fraction(bF, k, bw), (bA - (bF / g)), by)), 0, bE, bx, bz, bB, bx, (bz - bE), fraction(ae(bx, ad), h, (bz - bE)), (ac - bE), ad])
305- else if ((bv == n))
306- then $Tuple2(nil, [toInt(fraction(bA, log(fraction((by + bF), m, by), 16, f, 16, 16, HALFUP), m)), bE, 0, bx, bz, bB, (bx + bE), bz, fraction(ae((bx + bE), ad), h, bz), (ac - bE), ad])
331+ let bP = toBigInt(bO)
332+ if ((bH == aO))
333+ then $Tuple2(nil, [toInt(fraction(fraction(bP, k, bI), (bL - (bP / g)), bJ)), 0, bO, aU, bK, aX, aU, (bK - bO), fraction(ag(aU, af), h, (bK - bO)), (ae - bO), af])
334+ else if ((bH == n))
335+ then $Tuple2(nil, [toInt(fraction(bL, log(fraction((bJ + bP), m, bJ), 16, f, 16, 16, HALFUP), m)), bO, 0, aU, bK, aX, (aU + bO), bK, fraction(ag((aU + bO), af), h, bK), (ae - bO), af])
307336 else throw("Unsupported asset")
308337 }
309338 }
310339
311340
312341
313-@Callable(aP)
314-func calcContractNsbtPriceSYSREADONLY (bG) = {
315- let bm = al(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
316- let ad = ao(bm[v])
317- let aY = ao(bm[y])
318- let aZ = (ao(bm[A]) - bG)
319- let bb = (ao(bm[E]) + bG)
320- let ba = ao(bm[F])
321- let bn = al(invoke(this, "calculateKREADONLY", [aY, aZ, ad, ba, bb], nil))
322- let bH = parseBigIntValue(aq(bn[u]))
323- let bI = fraction(toBigInt(ba), m, toBigInt((ba - bb)))
324- let bJ = fraction(bI, bI, m)
325- let bK = fraction(bH, bJ, m)
326- let bL = toInt(fraction(bK, toBigInt(h), m))
327- let bM = fraction(bL, h, ad)
328- $Tuple2(nil, [bL, bM])
342+@Callable(aY)
343+func calcContractNsbtPriceSYSREADONLY (bQ) = {
344+ let by = an(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
345+ let af = aq(by[v])
346+ let bk = aq(by[y])
347+ let bl = (aq(by[A]) - bQ)
348+ let bn = (aq(by[E]) + bQ)
349+ let bm = aq(by[F])
350+ let bz = an(invoke(this, "calculateKREADONLY", [bk, bl, af, bm, bn], nil))
351+ let bR = parseBigIntValue(as(bz[u]))
352+ let bS = fraction(toBigInt(bm), m, toBigInt((bm - bn)))
353+ let bT = fraction(bS, bS, m)
354+ let bU = fraction(bR, bT, m)
355+ let bV = toInt(fraction(bU, toBigInt(h), m))
356+ let bW = fraction(bV, h, af)
357+ $Tuple2(nil, [bV, bW])
329358 }
330359
331360
332361
333-@Callable(aP)
362+@Callable(aY)
334363 func calcNeutinoMetricsREADONLY () = {
335- let bN = getIntegerValue(aI, U())
336- let bO = valueOrElse(getInteger(aJ, P()), 0)
337- let bP = valueOrElse(getInteger(aJ, O()), 0)
338- let bx = (wavesBalance(aJ).regular - bP)
339- let bQ = ae(bx, bN)
340- let bR = (((bO + value(assetInfo(aM)).quantity) - assetBalance(aJ, aM)) - assetBalance(aL, aM))
341- let bS = (bQ - bR)
342- let bT = (bR - bQ)
343- let bU = if ((bR == 0))
364+ let bX = (aV - aW)
365+ let bY = (aW - aV)
366+ let bZ = if ((aW == 0))
344367 then 0
345- else (fraction(bS, h, bR) * 100)
346- let bB = if ((bR == 0))
347- then 0
348- else fraction(bQ, h, bR)
349- let bV = value(assetInfo(aN)).quantity
350- let bW = (bV - assetBalance(aK, aN))
351- let bX = value(assetInfo(aO)).quantity
352- $Tuple2(nil, [bN, bO, bP, bx, bQ, bR, bS, bU, bB, bW, bV, bX])
368+ else (fraction(bX, h, aW) * 100)
369+ let ca = value(assetInfo(aP)).quantity
370+ let cb = (ca - assetBalance(aM, aP))
371+ let cc = value(assetInfo(aQ)).quantity
372+ $Tuple2(nil, [aR, aS, aT, aU, aV, aW, bX, bZ, aX, cb, ca, cc])
353373 }
354374
355375
356376
357-@Callable(aP)
358-func getUnstakeComissionAmountREADONLY (ac,bY,bZ) = $Tuple2(nil, fraction(ac, pow(2, 0, fraction(-((height - bY)), j, bZ), 8, 8, HALFUP), j))
377+@Callable(aY)
378+func getUnstakeComissionAmountREADONLY (ae,cd,ce) = $Tuple2(nil, fraction(ae, pow(2, 0, fraction(-((height - cd)), j, ce), 8, 8, HALFUP), j))
359379
360380
361381
362-@Callable(aP)
363-func mergeStakesREADONLY (ca,cb,cc,cd,bZ) = {
364- let ce = fraction(cc, pow(2, 0, fraction((cd - cb), j, bZ), 8, 8, HALFUP), j)
365- let cf = fraction((ca + cc), j, (ca + ce))
366- $Tuple2(nil, (cb + ((e - (bZ * log(cf, 8, 2, 0, 8, HALFUP))) / j)))
382+@Callable(aY)
383+func mergeStakesREADONLY (cf,cg,ch,ci,ce) = {
384+ let cj = fraction(ch, pow(2, 0, fraction((ci - cg), j, ce), 8, 8, HALFUP), j)
385+ let ck = fraction((cf + ch), j, (cf + cj))
386+ $Tuple2(nil, (cg + ((e - (ce * log(ck, 8, 2, 0, 8, HALFUP))) / j)))
367387 }
368388
369389
370-@Verifier(cg)
371-func ch () = {
372- let ci = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], d)
373- let cj = split(valueOrElse(getString(aI, "%s__multisig"), ci), d)
374- let ck = ((((if (sigVerify(cg.bodyBytes, cg.proofs[0], fromBase58String(cj[0])))
390+@Verifier(cl)
391+func cm () = {
392+ let cn = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], d)
393+ let co = split(valueOrElse(getString(aK, "%s__multisig"), cn), d)
394+ let cp = ((((if (sigVerify(cl.bodyBytes, cl.proofs[0], fromBase58String(co[0])))
375395 then 1
376- else 0) + (if (sigVerify(cg.bodyBytes, cg.proofs[1], fromBase58String(cj[1])))
396+ else 0) + (if (sigVerify(cl.bodyBytes, cl.proofs[1], fromBase58String(co[1])))
377397 then 1
378- else 0)) + (if (sigVerify(cg.bodyBytes, cg.proofs[2], fromBase58String(cj[2])))
398+ else 0)) + (if (sigVerify(cl.bodyBytes, cl.proofs[2], fromBase58String(co[2])))
379399 then 1
380- else 0)) + (if (sigVerify(cg.bodyBytes, cg.proofs[3], fromBase58String(cj[3])))
400+ else 0)) + (if (sigVerify(cl.bodyBytes, cl.proofs[3], fromBase58String(co[3])))
381401 then 2
382402 else 0))
383- (ck >= 3)
403+ (cp >= 3)
384404 }
385405

github/deemru/w8io/026f985 
122.04 ms