tx · BjQC1wRfmE3xTrYs2ZdEMVZJCUXqpeiBRqVKZ9AHgoVU

3MuAPY3jP4q2AoNYX27B5BU9EoLU77mr7pS:  -0.02000000 Waves

2022.02.24 15:56 [1937753] smart account 3MuAPY3jP4q2AoNYX27B5BU9EoLU77mr7pS > SELF 0.00000000 Waves

{ "type": 13, "id": "BjQC1wRfmE3xTrYs2ZdEMVZJCUXqpeiBRqVKZ9AHgoVU", "fee": 2000000, "feeAssetId": null, "timestamp": 1645707432648, "version": 1, "sender": "3MuAPY3jP4q2AoNYX27B5BU9EoLU77mr7pS", "senderPublicKey": "rqCnkHfz5ix6HNKiVvYE3URUtLs6f2nWzt4hpdGGQdm", "proofs": [ "4dzv8Bd1jSzCiEQHcQwUdSPu78rhMADfdZxuZWXAR2esRjDyxipHa5cNM5nKKHcKhvdZ6oyv8zw9sXvLgKMfVog1" ], "script": "base64:AAIFAAAAAAAAACoIAhIFCgMICAgSABIDCgEIEgMKAQgSAwoBARIAEgYKBAEBAQESBAoCAQEAAAA4AAAAAAhQUklDRUxFVAAAAAAAAA9CQAAAAAAJTVVMVFNDQUxFAAAAAAAAAAAIAAAAAAtFVUxFUk5VTUJFUgAAAAAAEDPE1gAAAAAGc2NhbGU2AAAAAAAAD0JAAAAAAAxzY2FsZTZCaWdJbnQJAAE2AAAAAQAAAAAAAA9CQAAAAAAGc2NhbGU4AAAAAAAF9eEAAAAAAAxzY2FsZThCaWdJbnQJAAE2AAAAAQAAAAAABfXhAAAAAAAHc2NhbGUxOAkAATYAAAABAA3gtrOnZAAAAAAAAANTRVACAAAAAl9fAQAAABJrZXlOZXV0cmlub0FkZHJlc3MAAAAAAgAAAB0lcyVzX19jb25maWdfX25ldXRyaW5vQWRkcmVzcwEAAAASa2V5TmV1dHJpbm9Bc3NldElkAAAAAAIAAAARbmV1dHJpbm9fYXNzZXRfaWQBAAAAHWtleUxpcXVpZGF0aW9uQ29udHJhY3RBZGRyZXNzAAAAAAIAAAAUbGlxdWlkYXRpb25fY29udHJhY3QBAAAADmtleVJQRENvbnRyYWN0AAAAAAIAAAAMcnBkX2NvbnRyYWN0AQAAABJrZXlBdWN0aW9uQ29udHJhY3QAAAAAAgAAABBhdWN0aW9uX2NvbnRyYWN0AQAAABFrZXlDb250b2xDb250cmFjdAAAAAACAAAAEGNvbnRyb2xfY29udHJhY3QBAAAADmtleUJvbmRBc3NldElkAAAAAAIAAAANYm9uZF9hc3NldF9pZAEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAADWJhbGFuY2VfbG9ja18BAAAAFWtleVdhdmVzTG9ja2VkQmFsYW5jZQAAAAAJAAEsAAAAAgkBAAAAEGtleUJhbGFuY2VMb2NrZWQAAAAAAgAAAAV3YXZlcwEAAAAYa2V5TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAAkAASwAAAACCQEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAACG5ldXRyaW5vAQAAABVrZXlNaW5XYXZlc1N3YXBBbW91bnQAAAAAAgAAABVtaW5fd2F2ZXNfc3dhcF9hbW91bnQBAAAAGGtleU1pbk5ldXRyaW5vU3dhcEFtb3VudAAAAAACAAAAGG1pbl9uZXV0cmlub19zd2FwX2Ftb3VudAEAAAASa2V5V2F2ZXNPdXRGZWVQYXJ0AAAAAAIAAAAVd2F2ZXNPdXRfc3dhcF9mZWVQYXJ0AQAAABVrZXlOZXV0cmlub091dEZlZVBhcnQAAAAAAgAAABhuZXV0cmlub091dF9zd2FwX2ZlZVBhcnQBAAAAE2tleU5zYnRMb2NrQ29udHJhY3QAAAAAAgAAABQlc19fbnNidExvY2tDb250cmFjdAEAAAAPa2V5TWF0aENvbnRyYWN0AAAAAAIAAAAQJXNfX21hdGhDb250cmFjdAEAAAAZa2V5UXVpY2tTd2FwTGltaXREdXJhdGlvbgAAAAACAAAAGiVzX19xdWlja1N3YXBMaW1pdER1cmF0aW9uAQAAABprZXlVc2VyTGFzdFF1aWNrU3dhcEhlaWdodAAAAAEAAAALdXNlckFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAAQlcyVzCQAETAAAAAICAAAAF3VzZXJMYXN0UXVpY2tTd2FwSGVpZ2h0CQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzBQAAAANuaWwFAAAAA1NFUAEAAAAda2V5UXVpY2tTd2FwVXNlclNwZW50SW5QZXJpb2QAAAABAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAEJXMlcwkABEwAAAACAgAAABpxdWlja1N3YXBVc2VyU3BlbnRJblBlcmlvZAkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAADbmlsBQAAAANTRVABAAAAG2tleUJhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbAAAAAACAAAAG2JhbGFuY2Vfd2F2ZXNfbG9ja19pbnRlcnZhbAEAAAAea2V5QmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsAAAAAAIAAAAeYmFsYW5jZV9uZXV0cmlub19sb2NrX2ludGVydmFsAQAAAAhrZXlQcmljZQAAAAACAAAABXByaWNlAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQAAAAt1c2VyQWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABiVzJXMlcwkABEwAAAACAgAAAAtwYXJhbUJ5VXNlcgkABEwAAAAC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AAACAAAAA3ZhbAAAAA9yZXN1bHRTY2FsZU11bHQJAAGgAAAAAQkAATwAAAADBQAAAAN2YWwJAAE2AAAAAQUAAAAPcmVzdWx0U2NhbGVNdWx0BQAAAAdzY2FsZTE4AAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAAAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABFrZXlDb250b2xDb250cmFjdAAAAAAAAAAAD2F1Y3Rpb25Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABJrZXlBdWN0aW9uQ29udHJhY3QAAAAAAAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAHWtleUxpcXVpZGF0aW9uQ29udHJhY3RBZGRyZXNzAAAAAAAAAAALcnBkQ29udHJhY3QJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAOa2V5UlBEQ29udHJhY3QAAAAAAAAAAAxtYXRoQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAAPa2V5TWF0aENvbnRyYWN0AAAAAAAAAAATbnNidFN0YWtpbmdDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAABNrZXlOc2J0TG9ja0NvbnRyYWN0AAAAAAAAAAAVbmV1dHJpbm9Bc3NldElkU3RyaW5nCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEmtleU5ldXRyaW5vQXNzZXRJZAAAAAAAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABBQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcAAAAADm5zYnRBc3NldElkU3RyCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAOa2V5Qm9uZEFzc2V0SWQAAAAAAAAAAAtuc2J0QXNzZXRJZAkAAlkAAAABBQAAAA5uc2J0QXNzZXRJZFN0cgAAAAgAAAABaQEAAAALY29uc3RydWN0b3IAAAADAAAAD25ldXRyaW5vQWRkcmVzcwAAAA9uc2J0TG9ja0FkZHJlc3MAAAALbWF0aEFkZHJlc3MDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAObm90IGF1dGhvcml6ZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAAFAAAAD25ldXRyaW5vQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATa2V5TnNidExvY2tDb250cmFjdAAAAAAFAAAAD25zYnRMb2NrQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5TWF0aENvbnRyYWN0AAAAAAUAAAALbWF0aEFkZHJlc3MFAAAAA25pbAAAAAFpAQAAABVuZXV0cmlub1N0YXRzUkVBRE9OTFkAAAAABAAAAA9uZXV0cmlub01ldHJpY3MJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAWY2FsY05ldXRpbm9NZXRyaWNzTUFUSAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAPbmV1dHJpbm9NZXRyaWNzBAAAAAZwcmljZXMJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAbY2FsY0NvbnRyYWN0TnNidFByaWNlTUFU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bENvbnRyYWN0CQEAAAAIa2V5UHJpY2UAAAAABAAAAA9taW5XYXZlc1N3YXBBbXQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABVrZXlNaW5XYXZlc1N3YXBBbW91bnQAAAAABAAAAA5taW5Vc2RuU3dhcEFtdAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAGGtleU1pbk5ldXRyaW5vU3dhcEFtb3VudAAAAAAEAAAADXdhdmVzMlVzZG5GZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABJrZXlXYXZlc091dEZlZVBhcnQAAAAABAAAAA11c2RuMldhdmVzRmVlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAVa2V5TmV1dHJpbm9PdXRGZWVQYXJ0AAAAAAQAAAAVdXNkblN3YXBEZWxheUR1cmF0aW9uCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAea2V5QmFsYW5jZU5ldXRyaW5vTG9ja0ludGVydmFsAAAAAAQAAAAWd2F2ZXNTd2FwRGVsYXlEdXJhdGlvbgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAG2tleUJhbGFuY2VXYXZlc0xvY2tJbnRlcnZhbAAAAAAEAAAACyR0MDc2Nzg4NzcyAwkAAAAAAAACBQAAAA51c2VyQWRkcmVzc1N0cgIAAAAACQAFFgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAD3VzZXJHTnNidEFtb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyAAAAAAAAAAAAAwkAAAAAAAACBQAAAA91c2VyR05zYnRBbW91bnQFAAAAD3VzZXJHTnNidEFtb3VudAQAAAAKdXNkbkxtdE1heAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAEWNhbGNTd2FwTGltaXRNQVRICQAETAAAAAIFAAAAD3VzZXJHTnNidEFtb3VudAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACnVzZG5MbXRNYXgFAAAACnVzZG5MbXRNYXgEAAAAFHF1aWNrU3dhcFJlc2V0QmxvY2tzCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAZa2V5UXVpY2tTd2FwTGltaXREdXJhdGlvbgAAAAAEAAAAEmxhc3RRdWlja1N3YXBCbG9jawkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAaa2V5VXNlckxhc3RRdWlja1N3YXBIZWlnaHQAAAABBQAAAA51c2VyQWRkcmVzc1N0cgAAAAAAAAAAAAQAAAAUaXNOZXdRdWlja1N3YXBQZXJpb2QJAABmAAAAAgkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEmxhc3RRdWlja1N3YXBCbG9jawUAAAAUcXVpY2tTd2FwUmVzZXRCbG9ja3MEAAAAEnF1aWNrU3dhcFVzZXJTcGVudAMFAAAAFGlzTmV3UXVpY2tTd2FwUGVyaW9kAAAAAAAAAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAB1rZXlRdWlja1N3YXBVc2VyU3BlbnRJblBlcmlvZAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyAAAAAAAAAAAABAAAAA5ibGNrczJMbXRSZXNldAMFAAAAFGlzTmV3UXVpY2tTd2FwUGVyaW9kAAAAAAAAAAAACQAAZQAAAAIFAAAAFHF1aWNrU3dhcFJlc2V0QmxvY2tzCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdFF1aWNrU3dhcEJsb2NrBAAAAAt3YXZlc0xtdE1heAkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACBQAAAAp1c2RuTG10TWF4BQAAAAxjdXJy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", "chainId": 84, "height": 1937753, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 34zHoGHvjSXGZvqWXDCh9bsrgQVah1DfVqgKrW1ZYwzM Next: FGSr975LS85EETM9t5fSqMTrCSqm1CkbfTjD49RhZbqx Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let WAVELET = 100000000
5-
6-let PAULI = 1000000
7-
8-let BIGPAULI = toBigInt(1000000)
9-
104 let PRICELET = 1000000
115
12-let MULT = 100000000
13-
14-let BIGMULT16 = toBigInt(10000000000000000)
15-
166 let MULTSCALE = 8
17-
18-let SCALE16 = 16
19-
20-let SEP = "__"
21-
22-let HALF8 = 50000000
237
248 let EULERNUMBER = 271828182
259
2711
2812 let scale6BigInt = toBigInt(1000000)
2913
14+let scale8 = 100000000
15+
16+let scale8BigInt = toBigInt(100000000)
17+
18+let scale18 = toBigInt(1000000000000000000)
19+
20+let SEP = "__"
21+
3022 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
31-
32-
33-func keySwapAmountAParam () = "%s%s__config__swapAParam"
3423
3524
3625 func keyNeutrinoAssetId () = "neutrino_asset_id"
7564 func keyNsbtLockContract () = "%s__nsbtLockContract"
7665
7766
67+func keyMathContract () = "%s__mathContract"
68+
69+
7870 func keyQuickSwapLimitDuration () = "%s__quickSwapLimitDuration"
7971
8072
8476 func keyQuickSwapUserSpentInPeriod (userAddress) = makeString(["%s%s", "quickSwapUserSpentInPeriod", userAddress], SEP)
8577
8678
79+func keyBalanceWavesLockInterval () = "balance_waves_lock_interval"
80+
81+
82+func keyBalanceNeutrinoLockInterval () = "balance_neutrino_lock_interval"
83+
84+
8785 func keyPrice () = "price"
8886
8987
90-func keyHalfLife () = "%s__halfLife"
88+func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "amount"], SEP)
9189
9290
93-func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "amount"], SEP)
91+func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
92+
93+
94+func keyMinLockAmount () = "%s__minLockAmount"
95+
96+
97+func keyMinWavesForNsbtBuy () = "min_waves_nsbt_buy"
9498
9599
96100 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
102106 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
103107
104108
105-func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
109+func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), scale8, scale6)
106110
107111
108-func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
109-
110-
111-func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), BIGMULT16, toBigInt(origScaleMult))
112-
113-
114-func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), BIGMULT16))
112+func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), scale6, scale8)
115113
116114
117115 func asAnyList (val) = match val {
118- case valAnyLyst: List[Any] =>
119- valAnyLyst
116+ case valAnyList: List[Any] =>
117+ valAnyList
120118 case _ =>
121119 throw("fail to cast into List[Any]")
122120 }
138136 }
139137
140138
139+func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
140+
141+
142+func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
143+
144+
141145 let neutrinoContract = addressFromStringValue(getStringOrFail(this, keyNeutrinoAddress()))
142146
143147 let controlContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyContolContract()))
147151 let liquidationContract = getStringOrFail(neutrinoContract, keyLiquidationContractAddress())
148152
149153 let rpdContract = getStringOrFail(neutrinoContract, keyRPDContract())
154+
155+let mathContract = addressFromStringValue(getStringOrFail(this, keyMathContract()))
150156
151157 let nsbtStakingContract = addressFromStringValue(getStringOrFail(this, keyNsbtLockContract()))
152158
159165 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
160166
161167 @Callable(i)
162-func constructor (neutrinoAddress,nsbtLockAddress,swapAmountAParam) = if ((i.caller != this))
168+func constructor (neutrinoAddress,nsbtLockAddress,mathAddress) = if ((i.caller != this))
163169 then throw("not authorized")
164- else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), StringEntry(keyNsbtLockContract(), nsbtLockAddress), IntegerEntry(keySwapAmountAParam(), swapAmountAParam)]
170+ else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), StringEntry(keyNsbtLockContract(), nsbtLockAddress), StringEntry(keyMathContract(), mathAddress)]
165171
166172
167173
168174 @Callable(i)
169-func calcSwapLimitMATH (gNsbtAmount) = {
170- let usdnSwapDelayDuration = valueOrErrorMessage(getIntegerValue(this, keySwapAmountAParam()), "Swap parameter A missed.")
171- let gNsbtAmountBigInt = toBigInt(gNsbtAmount)
172- let limitPowPart = pow(gNsbtAmountBigInt, 0, toBigInt(EULERNUMBER), 8, 0, DOWN)
173- let limit = fraction(toBigInt(usdnSwapDelayDuration), limitPowPart, scale6BigInt)
174- $Tuple2(nil, limit)
175- }
176-
177-
178-
179-@Callable(i)
180-func calculateKMATH (wRaw,uRaw,price,mRaw,sRaw) = {
181- let EXP = toBigInt(2718281)
182- let EXPSCALE = 6
183- let a = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_a"), 3)
184- let paulB = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_b"), ((3 * PAULI) / 10))
185- let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
186- let multBR = fraction(wReservesInUsdn, MULT, uRaw)
187- if ((multBR > 10678564816))
188- then throw("BR > 10678.564816% will overflow exponent")
189- else {
190- let multPower = (a * (multBR - MULT))
191- let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), MULTSCALE, SCALE16, DOWN)
192- let multK = fraction(toBigInt(paulB), multExpInPower, BIGPAULI)
193- $Tuple2(nil, $Tuple7(a, paulB, wReservesInUsdn, multBR, multPower, toString(multExpInPower), toString(multK)))
194- }
195- }
196-
197-
198-
199-@Callable(i)
200-func curveFunctionMATH (wRaw,uRaw,price,mRaw,sRaw,wavesPayRaw) = {
201- let kCalcArray = asAnyList(invoke(this, "calculateKMATH", [wRaw, uRaw, price, mRaw, sRaw], nil))
202- if ((kCalcArray == kCalcArray))
203- then {
204- let multK = parseBigIntValue(asString(kCalcArray[7]))
205- let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
206- let bigMaxNsbtSupply = toBigInt(mRaw)
207- let bigNsbtSupply = toBigInt((mRaw - sRaw))
208- let step1 = fraction(toBigInt(usdnPay), BIGMULT16, multK)
209- let step2 = fraction(step1, bigNsbtSupply, bigMaxNsbtSupply)
210- let step3 = toInt(fraction(bigNsbtSupply, bigMaxNsbtSupply, (step2 + bigMaxNsbtSupply)))
211- let nsbtAmountRaw = ((mRaw - sRaw) - step3)
212- $Tuple2(nil, $Tuple17(nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, asInt(kCalcArray[1]), asInt(kCalcArray[2]), asInt(kCalcArray[3]), asInt(price), asInt(kCalcArray[4]), asInt(kCalcArray[5]), kCalcArray[6], kCalcArray[7], toString(step1), toString(step2), toString(step3)))
213- }
214- else throw("Strict value is not equal to itself.")
215- }
216-
217-
218-
219-@Callable(i)
220-func calcContractNsbtPriceMATH () = {
221- let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
222- let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsMATH", nil, nil))
175+func neutrinoStatsREADONLY () = {
176+ let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsMATH", nil, nil))
223177 if ((neutrinoMetrics == neutrinoMetrics))
224178 then {
225- let nsbtSupply = asInt(neutrinoMetrics[10])
226- let currentPrice = asInt(neutrinoMetrics[1])
227- let kCalcArray = asAnyList(invoke(this, "calculateKMATH", [asInt(neutrinoMetrics[4]), asInt(neutrinoMetrics[6]), currentPrice, nsbtSupplyMAX, nsbtSupply], nil))
228- if ((kCalcArray == kCalcArray))
179+ let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceMATH()", nil, nil))
180+ if ((prices == prices))
229181 then {
230- let multK = parseBigIntValue(asString(kCalcArray[7]))
231- let mK = fromX16(multK, MULT)
232- let multStep1 = fraction(nsbtSupplyMAX, MULT, (nsbtSupplyMAX - nsbtSupply))
233- let multStep2 = fraction(multStep1, multStep1, MULT)
234- let multNsbt2usdnPrice = fraction(mK, multStep2, MULT)
235- let nsbt2usdnPrice = fraction(multNsbt2usdnPrice, PAULI, MULT)
236- let nsbt2wavesPrice = fraction(nsbt2usdnPrice, PAULI, currentPrice)
237- $Tuple2(nil, $Tuple2(nsbt2usdnPrice, nsbt2wavesPrice))
182+ let currentPrice = asInt(neutrinoMetrics[1])
183+ let neutrinoLockedBalance = asInt(neutrinoMetrics[2])
184+ let wavesLockedBalance = asInt(neutrinoMetrics[3])
185+ let reservesInWaves = asInt(neutrinoMetrics[4])
186+ let reservesInUsdn = asInt(neutrinoMetrics[5])
187+ let neutrinoSupply = asInt(neutrinoMetrics[6])
188+ let surplus = asInt(neutrinoMetrics[7])
189+ let surplusPercent = asInt(neutrinoMetrics[8])
190+ let BR = asInt(neutrinoMetrics[9])
191+ let nsbtSupply = asInt(neutrinoMetrics[10])
192+ let maxNsbtSupply = asInt(neutrinoMetrics[11])
193+ let nsbt2usdnPrice = asInt(prices[1])
194+ let nsbt2wavesPrice = asInt(prices[2])
195+ let minWaves4NsbtBuy = getIntegerValue(auctionContract, keyMinWavesForNsbtBuy())
196+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply), toString(maxNsbtSupply), toString(nsbt2usdnPrice), toString(nsbt2wavesPrice), toString(minWaves4NsbtBuy)], SEP))
238197 }
239198 else throw("Strict value is not equal to itself.")
240199 }
244203
245204
246205 @Callable(i)
247-func calcUserSwapLimitsMATH (userAddressStr) = {
248- let userGNsbtAmount = valueOrElse(getInteger(nsbtStakingContract, keyLockParamUserAmount(userAddressStr)), 0)
249- let usdnLmtMax = asInt(invoke(this, "calcSwapLimitMATH", [userGNsbtAmount], nil))
250- if ((usdnLmtMax == usdnLmtMax))
251- then {
252- let quickSwapResetBlocks = getIntegerValue(neutrinoContract, keyQuickSwapLimitDuration())
253- let lastQuickSwapBlock = valueOrElse(getInteger(neutrinoContract, keyUserLastQuickSwapHeight(userAddressStr)), 0)
254- let isNewQuickSwapPeriod = ((height - lastQuickSwapBlock) > quickSwapResetBlocks)
255- let quickSwapUserSpent = if (isNewQuickSwapPeriod)
256- then 0
257- else valueOrElse(getInteger(neutrinoContract, keyQuickSwapUserSpentInPeriod(userAddressStr)), 0)
258- $Tuple2(nil, $Tuple2(usdnLmtMax, quickSwapUserSpent))
206+func swapInfoREADONLY (userAddressStr) = {
207+ let currentPrice = getIntegerValue(controlContract, keyPrice())
208+ let minWavesSwapAmt = getIntegerValue(neutrinoContract, keyMinWavesSwapAmount())
209+ let minUsdnSwapAmt = getIntegerValue(neutrinoContract, keyMinNeutrinoSwapAmount())
210+ let waves2UsdnFee = getIntegerValue(neutrinoContract, keyWavesOutFeePart())
211+ let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
212+ let usdnSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
213+ let wavesSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
214+ let $t076788772 = if ((userAddressStr == ""))
215+ then $Tuple4(0, 0, 0, 0)
216+ else {
217+ let userGNsbtAmount = valueOrElse(getInteger(nsbtStakingContract, keyLockParamUserAmount(userAddressStr)), 0)
218+ if ((userGNsbtAmount == userGNsbtAmount))
219+ then {
220+ let usdnLmtMax = asInt(invoke(mathContract, "calcSwapLimitMATH", [userGNsbtAmount], nil))
221+ if ((usdnLmtMax == usdnLmtMax))
222+ then {
223+ let quickSwapResetBlocks = getIntegerValue(neutrinoContract, keyQuickSwapLimitDuration())
224+ let lastQuickSwapBlock = valueOrElse(getInteger(neutrinoContract, keyUserLastQuickSwapHeight(userAddressStr)), 0)
225+ let isNewQuickSwapPeriod = ((height - lastQuickSwapBlock) > quickSwapResetBlocks)
226+ let quickSwapUserSpent = if (isNewQuickSwapPeriod)
227+ then 0
228+ else valueOrElse(getInteger(neutrinoContract, keyQuickSwapUserSpentInPeriod(userAddressStr)), 0)
229+ let blcks2LmtReset = if (isNewQuickSwapPeriod)
230+ then 0
231+ else (quickSwapResetBlocks - (height - lastQuickSwapBlock))
232+ let wavesLmtMax = convertNeutrinoToWaves(usdnLmtMax, currentPrice)
233+ $Tuple4(quickSwapUserSpent, blcks2LmtReset, usdnLmtMax, wavesLmtMax)
234+ }
235+ else throw("Strict value is not equal to itself.")
236+ }
237+ else throw("Strict value is not equal to itself.")
259238 }
239+ let quickSwapUserSpent = $t076788772._1
240+ let blocks2LimitReset = $t076788772._2
241+ let maxUsdnLimit = $t076788772._3
242+ let maxWavesLimit = $t076788772._4
243+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(minWavesSwapAmt), toString(minUsdnSwapAmt), toString(waves2UsdnFee), toString(usdn2WavesFee), toString(usdnSwapDelayDuration), toString(wavesSwapDelayDuration), toString(blocks2LimitReset), toString(maxWavesLimit), toString(maxUsdnLimit), toString(quickSwapUserSpent)], SEP))
244+ }
245+
246+
247+
248+@Callable(i)
249+func gnsbtInfoREADONLY (userAddressStr) = {
250+ let gnsbtShare = 10000
251+ let claimedTotalInUsdn = 10000
252+ let claimedUsdn = 10000
253+ let claimedWaves = 10000
254+ let unclaimedTotalInUsdn = 10000
255+ let unclaimedUsdn = 10000
256+ let unclaimedWaves = 10000
257+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(gnsbtShare), toString(claimedTotalInUsdn), toString(claimedUsdn), toString(claimedWaves), toString(unclaimedTotalInUsdn), toString(unclaimedUsdn), toString(unclaimedWaves)], SEP))
258+ }
259+
260+
261+
262+@Callable(i)
263+func buyNsbtREADONLY (wavesPay) = {
264+ let minWavesAmountNsbtBuy = valueOrElse(getInteger(auctionContract, keyMinWavesForNsbtBuy()), 10)
265+ if (((minWavesAmountNsbtBuy * scale8) > wavesPay))
266+ then throw((("min " + toString(minWavesAmountNsbtBuy)) + " waves expected"))
267+ else {
268+ let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsMATH", nil, nil))
269+ if ((neutrinoMetrics == neutrinoMetrics))
270+ then {
271+ let currentPrice = asInt(neutrinoMetrics[1])
272+ let reserve = asInt(neutrinoMetrics[4])
273+ let neutrinoSupply = asInt(neutrinoMetrics[6])
274+ let nsbtSupply = asInt(neutrinoMetrics[10])
275+ let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
276+ let curveResult = asAnyList(invoke(mathContract, "curveFunctionMATH", [reserve, neutrinoSupply, currentPrice, nsbtSupplyMAX, nsbtSupply, wavesPay], nil))
277+ if ((curveResult == curveResult))
278+ then {
279+ let nsbtAmount = asInt(curveResult[1])
280+ if ((0 >= nsbtAmount))
281+ then throw("nsbtAmount <= 0")
282+ else if ((wavesPay > (nsbtAmount * 9223372)))
283+ then throw(((("Nsbt2Waves price exceeds MAX_INT: " + toString(wavesPay)) + "/") + toString(nsbtAmount)))
284+ else $Tuple2(nil, makeString(["%d", toString(nsbtAmount)], SEP))
285+ }
286+ else throw("Strict value is not equal to itself.")
287+ }
288+ else throw("Strict value is not equal to itself.")
289+ }
290+ }
291+
292+
293+
294+@Callable(i)
295+func minStakedAmountREADONLY () = $Tuple2(nil, makeString(["%d", toString(getIntOrFail(nsbtStakingContract, keyMinLockAmount()))], SEP))
296+
297+
298+
299+@Callable(i)
300+func mergedStakeREADONLY (amount1,height1,amount2,height2) = {
301+ let h = asInt(invoke(mathContract, "mergeStakesMATH", [amount1, height1, amount2, height2], nil))
302+ if ((h == h))
303+ then $Tuple2(nil, makeString(["%d%d", toString((amount1 + amount2)), toString(h)], SEP))
260304 else throw("Strict value is not equal to itself.")
261305 }
262306
263307
264308
265309 @Callable(i)
266-func calcNeutinoMetricsMATH () = {
267- let currentPrice = getIntegerValue(controlContract, keyPrice())
268- let neutrinoLockedBalance = valueOrElse(getInteger(neutrinoContract, keyNeutrinoLockedBalance()), 0)
269- let wavesLockedBalance = valueOrElse(getInteger(neutrinoContract, keyWavesLockedBalance()), 0)
270- let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
271- let reservesInUsdn = convertWavesToNeutrino(reserve, currentPrice)
272- let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
273- let surplus = (reservesInUsdn - neutrinoSupply)
274- let deficit = (neutrinoSupply - reservesInUsdn)
275- let surplusPercent = (fraction(surplus, PAULI, neutrinoSupply) * 100)
276- let BR = fraction(reservesInUsdn, PAULI, neutrinoSupply)
277- let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
278- let nsbtSupply = (nsbtSupplyMAX - assetBalance(auctionContract, nsbtAssetId))
279- $Tuple2(nil, $Tuple11(currentPrice, neutrinoLockedBalance, wavesLockedBalance, reserve, reservesInUsdn, neutrinoSupply, surplus, surplusPercent, BR, nsbtSupply, nsbtSupplyMAX))
280- }
281-
282-
283-
284-@Callable(i)
285-func getUnstakeComissionAmountMATH (amount,startHeight) = {
286- let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
287- $Tuple2(nil, fraction(amount, pow(2, 0, fraction(-((height - startHeight)), MULT, halfLife), 8, 8, HALFUP), MULT))
288- }
289-
290-
291-
292-@Callable(i)
293-func mergeStakesMATH (amount1,height1,amount2,height2) = {
294- let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
295- let w = fraction(amount2, pow(2, 0, fraction((height2 - height1), MULT, halfLife), 8, 8, HALFUP), MULT)
296- let v = fraction((amount1 + amount2), MULT, (amount1 + w))
297- $Tuple2(nil, (height1 + ((HALF8 - (halfLife * log(v, 8, 2, 0, 8, HALFUP))) / MULT)))
310+func unstakeComissionAmountREADONLY (amount,startHeight) = {
311+ let a = asInt(invoke(mathContract, "getUnstakeComissionAmountMATH", [amount, startHeight], nil))
312+ if ((a == a))
313+ then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
314+ else throw("Strict value is not equal to itself.")
298315 }
299316
300317
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let WAVELET = 100000000
5-
6-let PAULI = 1000000
7-
8-let BIGPAULI = toBigInt(1000000)
9-
104 let PRICELET = 1000000
115
12-let MULT = 100000000
13-
14-let BIGMULT16 = toBigInt(10000000000000000)
15-
166 let MULTSCALE = 8
17-
18-let SCALE16 = 16
19-
20-let SEP = "__"
21-
22-let HALF8 = 50000000
237
248 let EULERNUMBER = 271828182
259
2610 let scale6 = 1000000
2711
2812 let scale6BigInt = toBigInt(1000000)
2913
14+let scale8 = 100000000
15+
16+let scale8BigInt = toBigInt(100000000)
17+
18+let scale18 = toBigInt(1000000000000000000)
19+
20+let SEP = "__"
21+
3022 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
31-
32-
33-func keySwapAmountAParam () = "%s%s__config__swapAParam"
3423
3524
3625 func keyNeutrinoAssetId () = "neutrino_asset_id"
3726
3827
3928 func keyLiquidationContractAddress () = "liquidation_contract"
4029
4130
4231 func keyRPDContract () = "rpd_contract"
4332
4433
4534 func keyAuctionContract () = "auction_contract"
4635
4736
4837 func keyContolContract () = "control_contract"
4938
5039
5140 func keyBondAssetId () = "bond_asset_id"
5241
5342
5443 func keyBalanceLocked () = "balance_lock_"
5544
5645
5746 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
5847
5948
6049 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
6150
6251
6352 func keyMinWavesSwapAmount () = "min_waves_swap_amount"
6453
6554
6655 func keyMinNeutrinoSwapAmount () = "min_neutrino_swap_amount"
6756
6857
6958 func keyWavesOutFeePart () = "wavesOut_swap_feePart"
7059
7160
7261 func keyNeutrinoOutFeePart () = "neutrinoOut_swap_feePart"
7362
7463
7564 func keyNsbtLockContract () = "%s__nsbtLockContract"
7665
7766
67+func keyMathContract () = "%s__mathContract"
68+
69+
7870 func keyQuickSwapLimitDuration () = "%s__quickSwapLimitDuration"
7971
8072
8173 func keyUserLastQuickSwapHeight (userAddress) = makeString(["%s%s", "userLastQuickSwapHeight", userAddress], SEP)
8274
8375
8476 func keyQuickSwapUserSpentInPeriod (userAddress) = makeString(["%s%s", "quickSwapUserSpentInPeriod", userAddress], SEP)
8577
8678
79+func keyBalanceWavesLockInterval () = "balance_waves_lock_interval"
80+
81+
82+func keyBalanceNeutrinoLockInterval () = "balance_neutrino_lock_interval"
83+
84+
8785 func keyPrice () = "price"
8886
8987
90-func keyHalfLife () = "%s__halfLife"
88+func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "amount"], SEP)
9189
9290
93-func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "amount"], SEP)
91+func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
92+
93+
94+func keyMinLockAmount () = "%s__minLockAmount"
95+
96+
97+func keyMinWavesForNsbtBuy () = "min_waves_nsbt_buy"
9498
9599
96100 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
97101
98102
99103 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
100104
101105
102106 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
103107
104108
105-func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), WAVELET, PAULI)
109+func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, PRICELET, price), scale8, scale6)
106110
107111
108-func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), PAULI, WAVELET)
109-
110-
111-func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), BIGMULT16, toBigInt(origScaleMult))
112-
113-
114-func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), BIGMULT16))
112+func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, PRICELET), scale6, scale8)
115113
116114
117115 func asAnyList (val) = match val {
118- case valAnyLyst: List[Any] =>
119- valAnyLyst
116+ case valAnyList: List[Any] =>
117+ valAnyList
120118 case _ =>
121119 throw("fail to cast into List[Any]")
122120 }
123121
124122
125123 func asInt (val) = match val {
126124 case valInt: Int =>
127125 valInt
128126 case _ =>
129127 throw("fail to cast into Int")
130128 }
131129
132130
133131 func asString (val) = match val {
134132 case valStr: String =>
135133 valStr
136134 case _ =>
137135 throw("fail to cast into String")
138136 }
139137
140138
139+func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
140+
141+
142+func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
143+
144+
141145 let neutrinoContract = addressFromStringValue(getStringOrFail(this, keyNeutrinoAddress()))
142146
143147 let controlContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyContolContract()))
144148
145149 let auctionContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyAuctionContract()))
146150
147151 let liquidationContract = getStringOrFail(neutrinoContract, keyLiquidationContractAddress())
148152
149153 let rpdContract = getStringOrFail(neutrinoContract, keyRPDContract())
154+
155+let mathContract = addressFromStringValue(getStringOrFail(this, keyMathContract()))
150156
151157 let nsbtStakingContract = addressFromStringValue(getStringOrFail(this, keyNsbtLockContract()))
152158
153159 let neutrinoAssetIdString = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
154160
155161 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
156162
157163 let nsbtAssetIdStr = getStringValue(neutrinoContract, keyBondAssetId())
158164
159165 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
160166
161167 @Callable(i)
162-func constructor (neutrinoAddress,nsbtLockAddress,swapAmountAParam) = if ((i.caller != this))
168+func constructor (neutrinoAddress,nsbtLockAddress,mathAddress) = if ((i.caller != this))
163169 then throw("not authorized")
164- else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), StringEntry(keyNsbtLockContract(), nsbtLockAddress), IntegerEntry(keySwapAmountAParam(), swapAmountAParam)]
170+ else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), StringEntry(keyNsbtLockContract(), nsbtLockAddress), StringEntry(keyMathContract(), mathAddress)]
165171
166172
167173
168174 @Callable(i)
169-func calcSwapLimitMATH (gNsbtAmount) = {
170- let usdnSwapDelayDuration = valueOrErrorMessage(getIntegerValue(this, keySwapAmountAParam()), "Swap parameter A missed.")
171- let gNsbtAmountBigInt = toBigInt(gNsbtAmount)
172- let limitPowPart = pow(gNsbtAmountBigInt, 0, toBigInt(EULERNUMBER), 8, 0, DOWN)
173- let limit = fraction(toBigInt(usdnSwapDelayDuration), limitPowPart, scale6BigInt)
174- $Tuple2(nil, limit)
175- }
176-
177-
178-
179-@Callable(i)
180-func calculateKMATH (wRaw,uRaw,price,mRaw,sRaw) = {
181- let EXP = toBigInt(2718281)
182- let EXPSCALE = 6
183- let a = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_a"), 3)
184- let paulB = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_b"), ((3 * PAULI) / 10))
185- let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
186- let multBR = fraction(wReservesInUsdn, MULT, uRaw)
187- if ((multBR > 10678564816))
188- then throw("BR > 10678.564816% will overflow exponent")
189- else {
190- let multPower = (a * (multBR - MULT))
191- let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), MULTSCALE, SCALE16, DOWN)
192- let multK = fraction(toBigInt(paulB), multExpInPower, BIGPAULI)
193- $Tuple2(nil, $Tuple7(a, paulB, wReservesInUsdn, multBR, multPower, toString(multExpInPower), toString(multK)))
194- }
195- }
196-
197-
198-
199-@Callable(i)
200-func curveFunctionMATH (wRaw,uRaw,price,mRaw,sRaw,wavesPayRaw) = {
201- let kCalcArray = asAnyList(invoke(this, "calculateKMATH", [wRaw, uRaw, price, mRaw, sRaw], nil))
202- if ((kCalcArray == kCalcArray))
203- then {
204- let multK = parseBigIntValue(asString(kCalcArray[7]))
205- let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
206- let bigMaxNsbtSupply = toBigInt(mRaw)
207- let bigNsbtSupply = toBigInt((mRaw - sRaw))
208- let step1 = fraction(toBigInt(usdnPay), BIGMULT16, multK)
209- let step2 = fraction(step1, bigNsbtSupply, bigMaxNsbtSupply)
210- let step3 = toInt(fraction(bigNsbtSupply, bigMaxNsbtSupply, (step2 + bigMaxNsbtSupply)))
211- let nsbtAmountRaw = ((mRaw - sRaw) - step3)
212- $Tuple2(nil, $Tuple17(nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, asInt(kCalcArray[1]), asInt(kCalcArray[2]), asInt(kCalcArray[3]), asInt(price), asInt(kCalcArray[4]), asInt(kCalcArray[5]), kCalcArray[6], kCalcArray[7], toString(step1), toString(step2), toString(step3)))
213- }
214- else throw("Strict value is not equal to itself.")
215- }
216-
217-
218-
219-@Callable(i)
220-func calcContractNsbtPriceMATH () = {
221- let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
222- let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsMATH", nil, nil))
175+func neutrinoStatsREADONLY () = {
176+ let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsMATH", nil, nil))
223177 if ((neutrinoMetrics == neutrinoMetrics))
224178 then {
225- let nsbtSupply = asInt(neutrinoMetrics[10])
226- let currentPrice = asInt(neutrinoMetrics[1])
227- let kCalcArray = asAnyList(invoke(this, "calculateKMATH", [asInt(neutrinoMetrics[4]), asInt(neutrinoMetrics[6]), currentPrice, nsbtSupplyMAX, nsbtSupply], nil))
228- if ((kCalcArray == kCalcArray))
179+ let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceMATH()", nil, nil))
180+ if ((prices == prices))
229181 then {
230- let multK = parseBigIntValue(asString(kCalcArray[7]))
231- let mK = fromX16(multK, MULT)
232- let multStep1 = fraction(nsbtSupplyMAX, MULT, (nsbtSupplyMAX - nsbtSupply))
233- let multStep2 = fraction(multStep1, multStep1, MULT)
234- let multNsbt2usdnPrice = fraction(mK, multStep2, MULT)
235- let nsbt2usdnPrice = fraction(multNsbt2usdnPrice, PAULI, MULT)
236- let nsbt2wavesPrice = fraction(nsbt2usdnPrice, PAULI, currentPrice)
237- $Tuple2(nil, $Tuple2(nsbt2usdnPrice, nsbt2wavesPrice))
182+ let currentPrice = asInt(neutrinoMetrics[1])
183+ let neutrinoLockedBalance = asInt(neutrinoMetrics[2])
184+ let wavesLockedBalance = asInt(neutrinoMetrics[3])
185+ let reservesInWaves = asInt(neutrinoMetrics[4])
186+ let reservesInUsdn = asInt(neutrinoMetrics[5])
187+ let neutrinoSupply = asInt(neutrinoMetrics[6])
188+ let surplus = asInt(neutrinoMetrics[7])
189+ let surplusPercent = asInt(neutrinoMetrics[8])
190+ let BR = asInt(neutrinoMetrics[9])
191+ let nsbtSupply = asInt(neutrinoMetrics[10])
192+ let maxNsbtSupply = asInt(neutrinoMetrics[11])
193+ let nsbt2usdnPrice = asInt(prices[1])
194+ let nsbt2wavesPrice = asInt(prices[2])
195+ let minWaves4NsbtBuy = getIntegerValue(auctionContract, keyMinWavesForNsbtBuy())
196+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply), toString(maxNsbtSupply), toString(nsbt2usdnPrice), toString(nsbt2wavesPrice), toString(minWaves4NsbtBuy)], SEP))
238197 }
239198 else throw("Strict value is not equal to itself.")
240199 }
241200 else throw("Strict value is not equal to itself.")
242201 }
243202
244203
245204
246205 @Callable(i)
247-func calcUserSwapLimitsMATH (userAddressStr) = {
248- let userGNsbtAmount = valueOrElse(getInteger(nsbtStakingContract, keyLockParamUserAmount(userAddressStr)), 0)
249- let usdnLmtMax = asInt(invoke(this, "calcSwapLimitMATH", [userGNsbtAmount], nil))
250- if ((usdnLmtMax == usdnLmtMax))
251- then {
252- let quickSwapResetBlocks = getIntegerValue(neutrinoContract, keyQuickSwapLimitDuration())
253- let lastQuickSwapBlock = valueOrElse(getInteger(neutrinoContract, keyUserLastQuickSwapHeight(userAddressStr)), 0)
254- let isNewQuickSwapPeriod = ((height - lastQuickSwapBlock) > quickSwapResetBlocks)
255- let quickSwapUserSpent = if (isNewQuickSwapPeriod)
256- then 0
257- else valueOrElse(getInteger(neutrinoContract, keyQuickSwapUserSpentInPeriod(userAddressStr)), 0)
258- $Tuple2(nil, $Tuple2(usdnLmtMax, quickSwapUserSpent))
206+func swapInfoREADONLY (userAddressStr) = {
207+ let currentPrice = getIntegerValue(controlContract, keyPrice())
208+ let minWavesSwapAmt = getIntegerValue(neutrinoContract, keyMinWavesSwapAmount())
209+ let minUsdnSwapAmt = getIntegerValue(neutrinoContract, keyMinNeutrinoSwapAmount())
210+ let waves2UsdnFee = getIntegerValue(neutrinoContract, keyWavesOutFeePart())
211+ let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
212+ let usdnSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
213+ let wavesSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
214+ let $t076788772 = if ((userAddressStr == ""))
215+ then $Tuple4(0, 0, 0, 0)
216+ else {
217+ let userGNsbtAmount = valueOrElse(getInteger(nsbtStakingContract, keyLockParamUserAmount(userAddressStr)), 0)
218+ if ((userGNsbtAmount == userGNsbtAmount))
219+ then {
220+ let usdnLmtMax = asInt(invoke(mathContract, "calcSwapLimitMATH", [userGNsbtAmount], nil))
221+ if ((usdnLmtMax == usdnLmtMax))
222+ then {
223+ let quickSwapResetBlocks = getIntegerValue(neutrinoContract, keyQuickSwapLimitDuration())
224+ let lastQuickSwapBlock = valueOrElse(getInteger(neutrinoContract, keyUserLastQuickSwapHeight(userAddressStr)), 0)
225+ let isNewQuickSwapPeriod = ((height - lastQuickSwapBlock) > quickSwapResetBlocks)
226+ let quickSwapUserSpent = if (isNewQuickSwapPeriod)
227+ then 0
228+ else valueOrElse(getInteger(neutrinoContract, keyQuickSwapUserSpentInPeriod(userAddressStr)), 0)
229+ let blcks2LmtReset = if (isNewQuickSwapPeriod)
230+ then 0
231+ else (quickSwapResetBlocks - (height - lastQuickSwapBlock))
232+ let wavesLmtMax = convertNeutrinoToWaves(usdnLmtMax, currentPrice)
233+ $Tuple4(quickSwapUserSpent, blcks2LmtReset, usdnLmtMax, wavesLmtMax)
234+ }
235+ else throw("Strict value is not equal to itself.")
236+ }
237+ else throw("Strict value is not equal to itself.")
259238 }
239+ let quickSwapUserSpent = $t076788772._1
240+ let blocks2LimitReset = $t076788772._2
241+ let maxUsdnLimit = $t076788772._3
242+ let maxWavesLimit = $t076788772._4
243+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(minWavesSwapAmt), toString(minUsdnSwapAmt), toString(waves2UsdnFee), toString(usdn2WavesFee), toString(usdnSwapDelayDuration), toString(wavesSwapDelayDuration), toString(blocks2LimitReset), toString(maxWavesLimit), toString(maxUsdnLimit), toString(quickSwapUserSpent)], SEP))
244+ }
245+
246+
247+
248+@Callable(i)
249+func gnsbtInfoREADONLY (userAddressStr) = {
250+ let gnsbtShare = 10000
251+ let claimedTotalInUsdn = 10000
252+ let claimedUsdn = 10000
253+ let claimedWaves = 10000
254+ let unclaimedTotalInUsdn = 10000
255+ let unclaimedUsdn = 10000
256+ let unclaimedWaves = 10000
257+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(gnsbtShare), toString(claimedTotalInUsdn), toString(claimedUsdn), toString(claimedWaves), toString(unclaimedTotalInUsdn), toString(unclaimedUsdn), toString(unclaimedWaves)], SEP))
258+ }
259+
260+
261+
262+@Callable(i)
263+func buyNsbtREADONLY (wavesPay) = {
264+ let minWavesAmountNsbtBuy = valueOrElse(getInteger(auctionContract, keyMinWavesForNsbtBuy()), 10)
265+ if (((minWavesAmountNsbtBuy * scale8) > wavesPay))
266+ then throw((("min " + toString(minWavesAmountNsbtBuy)) + " waves expected"))
267+ else {
268+ let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsMATH", nil, nil))
269+ if ((neutrinoMetrics == neutrinoMetrics))
270+ then {
271+ let currentPrice = asInt(neutrinoMetrics[1])
272+ let reserve = asInt(neutrinoMetrics[4])
273+ let neutrinoSupply = asInt(neutrinoMetrics[6])
274+ let nsbtSupply = asInt(neutrinoMetrics[10])
275+ let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
276+ let curveResult = asAnyList(invoke(mathContract, "curveFunctionMATH", [reserve, neutrinoSupply, currentPrice, nsbtSupplyMAX, nsbtSupply, wavesPay], nil))
277+ if ((curveResult == curveResult))
278+ then {
279+ let nsbtAmount = asInt(curveResult[1])
280+ if ((0 >= nsbtAmount))
281+ then throw("nsbtAmount <= 0")
282+ else if ((wavesPay > (nsbtAmount * 9223372)))
283+ then throw(((("Nsbt2Waves price exceeds MAX_INT: " + toString(wavesPay)) + "/") + toString(nsbtAmount)))
284+ else $Tuple2(nil, makeString(["%d", toString(nsbtAmount)], SEP))
285+ }
286+ else throw("Strict value is not equal to itself.")
287+ }
288+ else throw("Strict value is not equal to itself.")
289+ }
290+ }
291+
292+
293+
294+@Callable(i)
295+func minStakedAmountREADONLY () = $Tuple2(nil, makeString(["%d", toString(getIntOrFail(nsbtStakingContract, keyMinLockAmount()))], SEP))
296+
297+
298+
299+@Callable(i)
300+func mergedStakeREADONLY (amount1,height1,amount2,height2) = {
301+ let h = asInt(invoke(mathContract, "mergeStakesMATH", [amount1, height1, amount2, height2], nil))
302+ if ((h == h))
303+ then $Tuple2(nil, makeString(["%d%d", toString((amount1 + amount2)), toString(h)], SEP))
260304 else throw("Strict value is not equal to itself.")
261305 }
262306
263307
264308
265309 @Callable(i)
266-func calcNeutinoMetricsMATH () = {
267- let currentPrice = getIntegerValue(controlContract, keyPrice())
268- let neutrinoLockedBalance = valueOrElse(getInteger(neutrinoContract, keyNeutrinoLockedBalance()), 0)
269- let wavesLockedBalance = valueOrElse(getInteger(neutrinoContract, keyWavesLockedBalance()), 0)
270- let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
271- let reservesInUsdn = convertWavesToNeutrino(reserve, currentPrice)
272- let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
273- let surplus = (reservesInUsdn - neutrinoSupply)
274- let deficit = (neutrinoSupply - reservesInUsdn)
275- let surplusPercent = (fraction(surplus, PAULI, neutrinoSupply) * 100)
276- let BR = fraction(reservesInUsdn, PAULI, neutrinoSupply)
277- let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
278- let nsbtSupply = (nsbtSupplyMAX - assetBalance(auctionContract, nsbtAssetId))
279- $Tuple2(nil, $Tuple11(currentPrice, neutrinoLockedBalance, wavesLockedBalance, reserve, reservesInUsdn, neutrinoSupply, surplus, surplusPercent, BR, nsbtSupply, nsbtSupplyMAX))
280- }
281-
282-
283-
284-@Callable(i)
285-func getUnstakeComissionAmountMATH (amount,startHeight) = {
286- let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
287- $Tuple2(nil, fraction(amount, pow(2, 0, fraction(-((height - startHeight)), MULT, halfLife), 8, 8, HALFUP), MULT))
288- }
289-
290-
291-
292-@Callable(i)
293-func mergeStakesMATH (amount1,height1,amount2,height2) = {
294- let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
295- let w = fraction(amount2, pow(2, 0, fraction((height2 - height1), MULT, halfLife), 8, 8, HALFUP), MULT)
296- let v = fraction((amount1 + amount2), MULT, (amount1 + w))
297- $Tuple2(nil, (height1 + ((HALF8 - (halfLife * log(v, 8, 2, 0, 8, HALFUP))) / MULT)))
310+func unstakeComissionAmountREADONLY (amount,startHeight) = {
311+ let a = asInt(invoke(mathContract, "getUnstakeComissionAmountMATH", [amount, startHeight], nil))
312+ if ((a == a))
313+ then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
314+ else throw("Strict value is not equal to itself.")
298315 }
299316
300317

github/deemru/w8io/c3f4982 
47.92 ms