tx · HJNhZQNg5ezL4soXxMnfjduCJKqV4KbDVkNp9WXyG9Tw

3NCroKxpCWCYijwjiVBg6hc2T7DaajrHuBr:  -0.02100000 Waves

2023.05.10 13:15 [2571655] smart account 3NCroKxpCWCYijwjiVBg6hc2T7DaajrHuBr > SELF 0.00000000 Waves

{ "type": 13, "id": "HJNhZQNg5ezL4soXxMnfjduCJKqV4KbDVkNp9WXyG9Tw", "fee": 2100000, "feeAssetId": null, "timestamp": 1683713746908, "version": 2, "chainId": 84, "sender": "3NCroKxpCWCYijwjiVBg6hc2T7DaajrHuBr", "senderPublicKey": "4j5ighurrUZ2WcdBTRGqBfXs5fz9YDA76D4gtpZ9basj", "proofs": [ "62rPxd54LARcoie8qHstFMmS4MYijsoZjwniJxPSGzrVTHd8Y2s3sCqkxsiDccGrUfyMNPAViqvwH9sxSYf6EgdL" ], "script": "base64:AAIFAAAAAAAACXEIAhIDCgEIEgkKBwgICAgBCAgSAwoBARIAEgASBQoDCAgIEgQKAggBEgMKAQgiA1NFUCIFRU1QVFkiD2dldFN0cmluZ09yRmFpbCIDa2V5IhBnZXRCb29sZWFuT3JGYWlsIhNrZXlNYW5hZ2VyUHVibGljS2V5IhZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIgckbWF0Y2gwIgFzIg5mYWlsRXhlY3V0ZUdldCIDbXNnIgxiYXNlQXNzZXRTdHIiDnVzZXJBZGRyZXNzU3RyIgpnZXRUeElkU3RyIhZrZXlBc3NldHNTdG9yZUNvbnRyYWN0IgtrZXlBc3NldENmZyIPa2V5UHJveHlBZGRyZXNzIgdhc3NldElkIgprZXlCYWxhbmNlIhZrZXlOZXh0SW50ZXJuYWxBc3NldElkIgxrZXlQcmljZUxhc3QiFWludGVybmFsQmFzZXRBc3NldFN0ciISa2V5VG9wVXBMYXN0SGVpZ2h0IgZzZW5kZXIiD2tleVByaWNlSGlzdG9yeSIBaCIJdGltZXN0YW1wIg5rZXlUb3RhbExvY2tlZCIUa2V5VG90YWxMb2NrZWRCeVVzZXIiFGludGVybmFsQmFzZUFzc2V0U3RyIh9rZXlNYXBwaW5nc0ludGVybmFsMmJhc2VBc3NldElkIhFpbnRlcm5hbEJhc2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIca2V5TWFwcGluZ3NTaGFyZTJiYXNlQXNzZXRJZCINc2hhcmVBc3NldFN0ciIca2V5TWFwcGluZ3NCYXNlQXNzZXQyc2hhcmVJZCIXa2V5U2h1dGRvd25QdXRPcGVyYXRpb24iEmtleVNodXRkb3duTWFuYWdlciITYXNzZXRzU3RvcmVDb250cmFjdCISSWR4Q2ZnU2hhcmVBc3NldElkIhdJZHhDZmdJbnRlcm5hbEJhc2VBc3NldCIcSWR4Q2ZnRGVjaW1hbHNNdWx0Qm90aEFzc2V0cyIXSWR4Q2ZnRGVjaW1hbHNNdWx0UHJpY2UiFElkeENmZ0dldERlbGF5QmxvY2tzIgxkYXRhQXNzZXRDZmciFmRlY2ltYWxzTXVsdEJvdGhBc3NldHMiEWRlY2ltYWxzTXVsdFByaWNlIhBnZXREZWxheUluQmxvY2tzIhNJZHhUb3RhbExvY2tlZFNoYXJlIhJJZHhUb3RhbExvY2tlZEJhc2UiD2RhdGFUb3RhbExvY2tlZCIQc2hhcmVBc3NldEFtb3VudCIPYmFzZUFzc2V0QW1vdW50Ig9yZWFkVG90YWxMb2NrZWQiEHRvdGFsTG9ja2VkQXJyYXkiDGtleU9wZXJhdGlvbiINb3BlcmF0aW9uVHlwZSILdXNlckFkZHJlc3MiBHR4SWQiDUlkeE9wZXJTdGF0dXMiD0lkeE9wZXJJbkFtb3VudCIMSWR4T3BlclByaWNlIhBJZHhPcGVyT3V0QW1vdW50IhJJZHhPcGVyU3RhcnRIZWlnaHQiFUlkeE9wZXJTdGFydFRpbWVzdGFtcCIQSWR4T3BlckVuZEhlaWdodCITSWR4T3BlckVuZFRpbWVzdGFtcCIecHJpdmF0ZURhdGFPcGVyYXRpb25BbGxTdHJpbmdzIgZzdGF0dXMiDWluQXNzZXRBbW91bnQiBXByaWNlIg5vdXRBc3NldEFtb3VudCILc3RhcnRIZWlnaHQiDnN0YXJ0VGltZXN0YW1wIgllbmRIZWlnaHQiDGVuZFRpbWVzdGFtcCINZGF0YU9wZXJhdGlvbiIcZGF0YU9wZXJhdGlvbkV4ZWN1dGlvblVwZGF0ZSINY3Vyck9wZXJBcnJheSIJbmV3U3RhdHVzIg9uZXdFbmRUaW1lc3RhbXAiEnJlYWRBc3NldENmZ09yRmFpbCIUaW5jcmVtZW50VG90YWxMb2NrZWQiCWRhdGFBcnJheSIUZGVjcmVtZW50VG90YWxMb2NrZWQiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiE21hbmFnZXJWYXVsdEFkZHJlc3MiDWJhbGFuY2VPclplcm8iCWNhbGNQcmljZSILYmFzZUFzc2V0SWQiD3RvcFVwQmFzZUFtb3VudCIMc2hhcmVBc3NldElkIhV0b3RhbExvY2tlZEJhc2VBbW91bnQiEGJhc2VBc3NldEJhbGFuY2UiH2Jhc2VBc3NldEJhbGFuY2VDb25zaWRlcmluZ0xvY2siDXNoYXJlRW1pc3Npb24iCGdldFByaWNlIhtwcml2YXRlQ3VycmVudFN5c1BhcmFtc1JFU1QiCGNmZ0FycmF5IghzeXNTdGF0ZSIPdG9wVXBMYXN0SGVpZ2h0IgttdXN0TWFuYWdlciIBaSICcGQiAnBrIhBtdXN0UHJveHlBZGRyZXNzIgdpc1Byb3h5IgtjaGVja0NhbGxlciIOc2hhcmVBc3NldE5hbWUiD3NoYXJlQXNzZXREZXNjciIOc2hhcmVBc3NldExvZ28iEGdldERlbGF5aW5CbG9ja3MiFnNodXRkb3duTWFuYWdlckFkZHJlc3MiDHByb3h5QWRkcmVzcyIIZGVjaW1hbHMiBWNoZWNrIhVzaGFyZUFzc2V0SXNzdWVBY3Rpb24iCnN0YXJ0UHJpY2UiFGludGVybmFsQmFzZUFzc2V0dElkIg5jcmVhdGVPclVwZGF0ZSIIYWRkTGFiZWwiE2ludGVybmFsQmFzZUFzc2V0SWQiFmludGVybmFsQmFzZUFzc2V0SWRTdHIiDmJhc2VBc3NldElkU3RyIgNwbXQiDGlzUHV0QmxvY2tlZCIKbmV3QmFsYW5jZSIMY2FsbGVyUHViU3RyIg5nZXREZWxheUJsb2NrcyIMb3BlcmF0aW9uS2V5Ig1vcGVyYXRpb25EYXRhIg1hc3NldENmZ0FycmF5Ig5vcGVyYXRpb25BcnJheSINaW5TaGFyZUFtb3VudCINb3V0QmFzZUFtb3VudCIFZGVsdGEiCnBtdEFzc2V0SWQiC3BtdEFzc2V0U3RyIhJ0b3BVcExhc3RIZWlnaHRLRVkiBmNoZWNrcyINc3lzU3RhdGVUdXBsZSIIcmVzdERhdGEiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleQAAADkAAAAAAWECAAAAAl9fAAAAAAFiAgAAAAABAAAAAWMAAAABAAAAAWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAFkCQABLAAAAAICAAAAFU5vIGRhdGEgZm9yIHRoaXMua2V5PQUAAAABZAEAAAABZQAAAAEAAAABZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAAWQJAAEsAAAAAgIAAAAVTm8gZGF0YSBmb3IgdGhpcy5rZXk9BQAAAAFkAQAAAAFmAAAAAAkABLkAAAACCQAETAAAAAICAAAA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", "height": 2571655, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7QoC1hiV52ZP4cNmGRURc8xASNFewmF68ghT4gEpo8cr Next: none Diff:
OldNewDifferences
1414 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
1515
1616
17-func keyPendingManagerPublicKey () = makeString(["%s", "pendingManagerPublicKey"], SEP)
17+func keyManagerVaultAddress () = "%s__managerVaultAddress"
18+
19+
20+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
21+ case s: String =>
22+ addressFromStringValue(s)
23+ case _ =>
24+ this
25+}
1826
1927
2028 func failExecuteGet (msg,baseAssetStr,userAddressStr,getTxIdStr) = throw(((((((msg + ": baseAssetStr=") + baseAssetStr) + " userAddressStr=") + userAddressStr) + " getTxIdStr=") + getTxIdStr))
143151 }
144152
145153
146-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
147- case s: String =>
148- fromBase58String(s)
149- case _: Unit =>
150- unit
151- case _ =>
152- throw("Match error")
153-}
154-
155-
156-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
157- case s: String =>
158- fromBase58String(s)
159- case _: Unit =>
160- unit
161- case _ =>
162- throw("Match error")
163-}
154+func managerPublicKeyOrUnit () = {
155+ let managerVaultAddress = getManagerVaultAddressOrThis()
156+ match getString(managerVaultAddress, keyManagerPublicKey()) {
157+ case s: String =>
158+ fromBase58String(s)
159+ case _: Unit =>
160+ unit
161+ case _ =>
162+ throw("Match error")
163+ }
164+ }
164165
165166
166167 func balanceOrZero (assetId) = valueOrElse(getInteger(keyBalance(assetId)), 0)
420421 }
421422
422423
423-
424-@Callable(i)
425-func setManager (pendingManagerPublicKey) = {
426- let checkCaller = mustManager(i)
427- if ((checkCaller == checkCaller))
428- then {
429- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
430- if ((checkManagerPublicKey == checkManagerPublicKey))
431- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
432- else throw("Strict value is not equal to itself.")
433- }
434- else throw("Strict value is not equal to itself.")
435- }
436-
437-
438-
439-@Callable(i)
440-func confirmManager () = {
441- let pm = pendingManagerPublicKeyOrUnit()
442- let hasPM = if (isDefined(pm))
443- then true
444- else throw("no pending manager")
445- if ((hasPM == hasPM))
446- then {
447- let checkPM = if ((i.callerPublicKey == value(pm)))
448- then true
449- else throw("you are not pending manager")
450- if ((checkPM == checkPM))
451- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
452- else throw("Strict value is not equal to itself.")
453- }
454- else throw("Strict value is not equal to itself.")
455- }
456-
457-
458424 @Verifier(tx)
459425 func verify () = {
460426 let targetPublicKey = match managerPublicKeyOrUnit() {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let EMPTY = ""
77
88 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), ("No data for this.key=" + key))
99
1010
1111 func getBooleanOrFail (key) = valueOrErrorMessage(getBoolean(this, key), ("No data for this.key=" + key))
1212
1313
1414 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
1515
1616
17-func keyPendingManagerPublicKey () = makeString(["%s", "pendingManagerPublicKey"], SEP)
17+func keyManagerVaultAddress () = "%s__managerVaultAddress"
18+
19+
20+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
21+ case s: String =>
22+ addressFromStringValue(s)
23+ case _ =>
24+ this
25+}
1826
1927
2028 func failExecuteGet (msg,baseAssetStr,userAddressStr,getTxIdStr) = throw(((((((msg + ": baseAssetStr=") + baseAssetStr) + " userAddressStr=") + userAddressStr) + " getTxIdStr=") + getTxIdStr))
2129
2230
2331 func keyAssetsStoreContract () = makeString(["%s", "assetsStoreContract"], SEP)
2432
2533
2634 func keyAssetCfg (baseAssetStr) = ("%s%s%s__config__asset__" + baseAssetStr)
2735
2836
2937 func keyProxyAddress (assetId) = makeString(["%s%s", "proxyAddress", assetId], SEP)
3038
3139
3240 func keyBalance (assetId) = makeString(["%s%s", "balance", assetId], SEP)
3341
3442
3543 func keyNextInternalAssetId () = "%s__nextInternalAssetId"
3644
3745
3846 func keyPriceLast (internalBasetAssetStr) = ("%s%s%d__price__last__" + internalBasetAssetStr)
3947
4048
4149 func keyTopUpLastHeight (internalBasetAssetStr,sender) = makeString(["%s%s%s%d%s__topup__last__height", internalBasetAssetStr, sender], SEP)
4250
4351
4452 func keyPriceHistory (internalBasetAssetStr,h,timestamp) = makeString(["%s%s%d%d%d__price__history", internalBasetAssetStr, toString(h), toString(timestamp)], SEP)
4553
4654
4755 func keyTotalLocked (internalBasetAssetStr) = ("%s%s%d__total__locked__" + internalBasetAssetStr)
4856
4957
5058 func keyTotalLockedByUser (internalBaseAssetStr,userAddressStr) = makeString(["%s%s%d%s__total__locked", internalBaseAssetStr, userAddressStr], SEP)
5159
5260
5361 func keyMappingsInternal2baseAssetId (internalBaseAsset) = ("%s%s%d__mappings__internal2baseAssetId__" + toString(internalBaseAsset))
5462
5563
5664 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
5765
5866
5967 func keyMappingsShare2baseAssetId (shareAssetStr) = ("%s%s%s__mappings__share2baseAssetId__" + shareAssetStr)
6068
6169
6270 func keyMappingsBaseAsset2shareId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2shareId__" + baseAssetStr)
6371
6472
6573 func keyShutdownPutOperation (internalBaseAssetStr) = ("%s%s%d__shutdown__put__" + internalBaseAssetStr)
6674
6775
6876 func keyShutdownManager (internalBaseAssetStr) = ("%s%s%d__shutdown__manager__" + internalBaseAssetStr)
6977
7078
7179 func assetsStoreContract () = addressFromStringValue(value(getString(keyAssetsStoreContract())))
7280
7381
7482 let IdxCfgShareAssetId = 1
7583
7684 let IdxCfgInternalBaseAsset = 2
7785
7886 let IdxCfgDecimalsMultBothAssets = 3
7987
8088 let IdxCfgDecimalsMultPrice = 4
8189
8290 let IdxCfgGetDelayBlocks = 5
8391
8492 func dataAssetCfg (shareAssetStr,internalBaseAssetStr,decimalsMultBothAssets,decimalsMultPrice,getDelayInBlocks) = makeString(["%s%d%d%d%d", shareAssetStr, internalBaseAssetStr, toString(decimalsMultBothAssets), toString(decimalsMultPrice), toString(getDelayInBlocks)], SEP)
8593
8694
8795 let IdxTotalLockedShare = 1
8896
8997 let IdxTotalLockedBase = 2
9098
9199 func dataTotalLocked (shareAssetAmount,baseAssetAmount) = makeString(["%d%d", toString(shareAssetAmount), toString(baseAssetAmount)], SEP)
92100
93101
94102 func readTotalLocked (key) = {
95103 let totalLockedArray = split(valueOrElse(getString(this, key), dataTotalLocked(0, 0)), SEP)
96104 [-1, parseIntValue(totalLockedArray[IdxTotalLockedShare]), parseIntValue(totalLockedArray[IdxTotalLockedBase])]
97105 }
98106
99107
100108 func keyOperation (operationType,internalBaseAssetStr,userAddress,txId) = makeString(["%s%d%s%s", operationType, internalBaseAssetStr, userAddress, txId], SEP)
101109
102110
103111 let IdxOperStatus = 1
104112
105113 let IdxOperInAmount = 2
106114
107115 let IdxOperPrice = 3
108116
109117 let IdxOperOutAmount = 4
110118
111119 let IdxOperStartHeight = 5
112120
113121 let IdxOperStartTimestamp = 6
114122
115123 let IdxOperEndHeight = 7
116124
117125 let IdxOperEndTimestamp = 8
118126
119127 func privateDataOperationAllStrings (status,inAssetAmount,price,outAssetAmount,startHeight,startTimestamp,endHeight,endTimestamp) = makeString(["%s%d%d%d%d%d%d%d", status, inAssetAmount, price, outAssetAmount, startHeight, startTimestamp, endHeight, endTimestamp], SEP)
120128
121129
122130 func dataOperation (status,inAssetAmount,price,outAssetAmount,startHeight,startTimestamp,endHeight,endTimestamp) = privateDataOperationAllStrings(status, toString(inAssetAmount), toString(price), toString(outAssetAmount), toString(startHeight), toString(startTimestamp), toString(endHeight), toString(endTimestamp))
123131
124132
125133 func dataOperationExecutionUpdate (currOperArray,newStatus,newEndTimestamp) = privateDataOperationAllStrings(newStatus, currOperArray[IdxOperInAmount], currOperArray[IdxOperPrice], currOperArray[IdxOperOutAmount], currOperArray[IdxOperStartHeight], currOperArray[IdxOperStartTimestamp], currOperArray[IdxOperEndHeight], toString(newEndTimestamp))
126134
127135
128136 func readAssetCfgOrFail (baseAssetStr) = {
129137 let key = keyAssetCfg(baseAssetStr)
130138 split(getStringOrFail(key), SEP)
131139 }
132140
133141
134142 func incrementTotalLocked (key,shareAssetAmount,baseAssetAmount) = {
135143 let dataArray = readTotalLocked(key)
136144 StringEntry(key, dataTotalLocked((dataArray[IdxTotalLockedShare] + shareAssetAmount), (dataArray[IdxTotalLockedBase] + baseAssetAmount)))
137145 }
138146
139147
140148 func decrementTotalLocked (key,shareAssetAmount,baseAssetAmount) = {
141149 let dataArray = readTotalLocked(key)
142150 StringEntry(key, dataTotalLocked((dataArray[IdxTotalLockedShare] - shareAssetAmount), (dataArray[IdxTotalLockedBase] - baseAssetAmount)))
143151 }
144152
145153
146-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
147- case s: String =>
148- fromBase58String(s)
149- case _: Unit =>
150- unit
151- case _ =>
152- throw("Match error")
153-}
154-
155-
156-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
157- case s: String =>
158- fromBase58String(s)
159- case _: Unit =>
160- unit
161- case _ =>
162- throw("Match error")
163-}
154+func managerPublicKeyOrUnit () = {
155+ let managerVaultAddress = getManagerVaultAddressOrThis()
156+ match getString(managerVaultAddress, keyManagerPublicKey()) {
157+ case s: String =>
158+ fromBase58String(s)
159+ case _: Unit =>
160+ unit
161+ case _ =>
162+ throw("Match error")
163+ }
164+ }
164165
165166
166167 func balanceOrZero (assetId) = valueOrElse(getInteger(keyBalance(assetId)), 0)
167168
168169
169170 func calcPrice (internalBaseAssetStr,baseAssetId,topUpBaseAmount,shareAssetId,decimalsMultBothAssets,decimalsMultPrice) = {
170171 let totalLockedArray = readTotalLocked(keyTotalLocked(internalBaseAssetStr))
171172 let totalLockedBaseAmount = totalLockedArray[IdxTotalLockedBase]
172173 let baseAssetBalance = balanceOrZero(toBase58String(baseAssetId))
173174 let baseAssetBalanceConsideringLock = (baseAssetBalance + topUpBaseAmount)
174175 if ((0 > baseAssetBalanceConsideringLock))
175176 then throw(((("baseAssetBalanceConsideringLock < 0: baseAssetBalance=" + toString(baseAssetBalance)) + " baseAssetBalanceConsideringLock=") + toString(baseAssetBalanceConsideringLock)))
176177 else {
177178 let shareEmission = value(assetInfo(shareAssetId)).quantity
178179 let price = if ((shareEmission == 0))
179180 then (1 * decimalsMultPrice)
180181 else fraction(baseAssetBalanceConsideringLock, decimalsMultPrice, shareEmission)
181182 $Tuple5(price, baseAssetBalance, totalLockedBaseAmount, baseAssetBalanceConsideringLock, shareEmission)
182183 }
183184 }
184185
185186
186187 func getPrice (internalBaseAssetStr,baseAssetId,shareAssetId,decimalsMultBothAssets,decimalsMultPrice) = {
187188 let totalLockedArray = readTotalLocked(keyTotalLocked(internalBaseAssetStr))
188189 let totalLockedBaseAmount = totalLockedArray[IdxTotalLockedBase]
189190 let baseAssetBalance = balanceOrZero(toBase58String(baseAssetId))
190191 let baseAssetBalanceConsideringLock = baseAssetBalance
191192 let shareEmission = value(assetInfo(shareAssetId)).quantity
192193 let price = value(getInteger(keyPriceLast(internalBaseAssetStr)))
193194 $Tuple5(price, baseAssetBalance, totalLockedBaseAmount, baseAssetBalanceConsideringLock, shareEmission)
194195 }
195196
196197
197198 func privateCurrentSysParamsREST (baseAssetStr) = {
198199 let baseAssetId = fromBase58String(baseAssetStr)
199200 let cfgArray = readAssetCfgOrFail(baseAssetStr)
200201 let shareAssetStr = cfgArray[IdxCfgShareAssetId]
201202 let shareAssetId = fromBase58String(shareAssetStr)
202203 let decimalsMultBothAssets = parseIntValue(cfgArray[IdxCfgDecimalsMultBothAssets])
203204 let decimalsMultPrice = parseIntValue(cfgArray[IdxCfgDecimalsMultPrice])
204205 let internalBaseAssetStr = cfgArray[IdxCfgInternalBaseAsset]
205206 let sysState = getPrice(internalBaseAssetStr, baseAssetId, shareAssetId, decimalsMultBothAssets, decimalsMultPrice)
206207 let topUpLastHeight = match getInteger(keyTopUpLastHeight(internalBaseAssetStr, getStringValue(keyProxyAddress(baseAssetStr)))) {
207208 case h: Int =>
208209 value(h)
209210 case _: Unit =>
210211 getIntegerValue(keyTopUpLastHeight(internalBaseAssetStr, toString(addressFromPublicKey(fromBase58String(getStringValue(keyManagerPublicKey()))))))
211212 case _ =>
212213 throw("undefined behaviour in privateCurrentSysParamsREST match")
213214 }
214215 $Tuple8(IntegerEntry("price", sysState._1), IntegerEntry("decimalsMultPrice", decimalsMultPrice), IntegerEntry("baseAssetBalance", sysState._2), IntegerEntry("totalLockedBaseAmount", sysState._3), IntegerEntry("baseAssetBalanceConsideringLock", sysState._4), IntegerEntry("shareEmission", sysState._5), IntegerEntry("baseAssetDecimals", value(assetInfo(baseAssetId)).decimals), IntegerEntry("lastTopUpTimestamp", value(blockInfoByHeight(topUpLastHeight)).timestamp))
215216 }
216217
217218
218219 func mustManager (i) = {
219220 let pd = throw("permission denied")
220221 match managerPublicKeyOrUnit() {
221222 case pk: ByteVector =>
222223 if ((i.callerPublicKey == pk))
223224 then true
224225 else pd
225226 case _: Unit =>
226227 if ((i.caller == this))
227228 then true
228229 else pd
229230 case _ =>
230231 throw("Match error")
231232 }
232233 }
233234
234235
235236 func mustProxyAddress (i,assetId) = {
236237 let isProxy = (toString(i.caller) == valueOrElse(getString(keyProxyAddress(assetId)), EMPTY))
237238 if (isProxy)
238239 then true
239240 else {
240241 let checkCaller = mustManager(i)
241242 if ((checkCaller == checkCaller))
242243 then true
243244 else throw("Strict value is not equal to itself.")
244245 }
245246 }
246247
247248
248249 @Callable(i)
249250 func constructor (assetsStoreContract) = {
250251 let checkCaller = mustManager(i)
251252 if ((checkCaller == checkCaller))
252253 then [StringEntry(keyAssetsStoreContract(), assetsStoreContract)]
253254 else throw("Strict value is not equal to itself.")
254255 }
255256
256257
257258
258259 @Callable(i)
259260 func adminRegisterAsset (baseAssetStr,shareAssetName,shareAssetDescr,shareAssetLogo,getDelayinBlocks,shutdownManagerAddress,proxyAddress) = {
260261 let baseAssetId = fromBase58String(baseAssetStr)
261262 let decimals = value(assetInfo(baseAssetId)).decimals
262263 let check = mustManager(i)
263264 if ((check == check))
264265 then if ((toString(addressFromStringValue(shutdownManagerAddress)) != shutdownManagerAddress))
265266 then throw("invalid shutdownManagerAddress")
266267 else if ((0 > getDelayinBlocks))
267268 then throw(("invalid getDelayinBlocks=" + toString(getDelayinBlocks)))
268269 else {
269270 let shareAssetIssueAction = Issue(shareAssetName, shareAssetDescr, 1, decimals, true)
270271 let shareAssetId = calculateAssetId(shareAssetIssueAction)
271272 let shareAssetStr = toBase58String(shareAssetId)
272273 let decimalsMultPrice = ((100 * 1000) * 1000)
273274 let decimalsMultBothAssets = pow(10, 0, decimals, 0, 0, DOWN)
274275 let startPrice = (1 * decimalsMultPrice)
275276 let internalBaseAssettId = valueOrElse(getInteger(this, keyNextInternalAssetId()), 0)
276277 let internalBaseAssetStr = toString(internalBaseAssettId)
277278 let createOrUpdate = invoke(assetsStoreContract(), "createOrUpdate", [shareAssetStr, shareAssetLogo, false], nil)
278279 if ((createOrUpdate == createOrUpdate))
279280 then {
280281 let addLabel = invoke(assetsStoreContract(), "addLabel", [shareAssetStr, "STAKING_LP"], nil)
281282 if ((addLabel == addLabel))
282283 then [StringEntry(keyAssetCfg(baseAssetStr), dataAssetCfg(shareAssetStr, internalBaseAssetStr, decimalsMultBothAssets, decimalsMultPrice, getDelayinBlocks)), StringEntry(keyMappingsInternal2baseAssetId(internalBaseAssettId), baseAssetStr), StringEntry(keyMappingsBaseAsset2internalId(baseAssetStr), internalBaseAssetStr), StringEntry(keyMappingsShare2baseAssetId(shareAssetStr), baseAssetStr), StringEntry(keyMappingsBaseAsset2shareId(baseAssetStr), shareAssetStr), BooleanEntry(keyShutdownPutOperation(internalBaseAssetStr), false), StringEntry(keyShutdownManager(internalBaseAssetStr), shutdownManagerAddress), IntegerEntry(keyNextInternalAssetId(), (internalBaseAssettId + 1)), IntegerEntry(keyPriceLast(internalBaseAssetStr), startPrice), IntegerEntry(keyPriceHistory(internalBaseAssetStr, height, lastBlock.timestamp), startPrice), shareAssetIssueAction, Burn(shareAssetId, 1), StringEntry(keyProxyAddress(baseAssetStr), proxyAddress)]
283284 else throw("Strict value is not equal to itself.")
284285 }
285286 else throw("Strict value is not equal to itself.")
286287 }
287288 else throw("Strict value is not equal to itself.")
288289 }
289290
290291
291292
292293 @Callable(i)
293294 func shutdownPut (internalBaseAssetId) = {
294295 let internalBaseAssetIdStr = toString(internalBaseAssetId)
295296 let baseAssetIdStr = getStringOrFail(keyMappingsInternal2baseAssetId(internalBaseAssetId))
296297 let shutdownManagerAddress = getStringOrFail(keyShutdownManager(internalBaseAssetIdStr))
297298 if ((1 > size(baseAssetIdStr)))
298299 then throw("invalid internalBaseAssetId")
299300 else if ((toString(i.caller) != shutdownManagerAddress))
300301 then throw("access denied")
301302 else [BooleanEntry(keyShutdownPutOperation(toString(internalBaseAssetId)), true)]
302303 }
303304
304305
305306
306307 @Callable(i)
307308 func put () = {
308309 let pmt = value(i.payments[0])
309310 let baseAssetId = value(pmt.assetId)
310311 let baseAssetStr = toBase58String(baseAssetId)
311312 let userAddressStr = toString(i.caller)
312313 let cfgArray = readAssetCfgOrFail(baseAssetStr)
313314 let shareAssetStr = cfgArray[IdxCfgShareAssetId]
314315 let shareAssetId = fromBase58String(shareAssetStr)
315316 let decimalsMultBothAssets = parseIntValue(cfgArray[IdxCfgDecimalsMultBothAssets])
316317 let decimalsMultPrice = parseIntValue(cfgArray[IdxCfgDecimalsMultPrice])
317318 let internalBaseAssetStr = cfgArray[IdxCfgInternalBaseAsset]
318319 let isPutBlocked = getBooleanOrFail(keyShutdownPutOperation(internalBaseAssetStr))
319320 if (isPutBlocked)
320321 then throw("put operation is blocked")
321322 else {
322323 let newBalance = (balanceOrZero(baseAssetStr) + pmt.amount)
323324 let price = getPrice(internalBaseAssetStr, baseAssetId, shareAssetId, decimalsMultBothAssets, decimalsMultPrice)._1
324325 let shareAssetAmount = fraction(pmt.amount, decimalsMultPrice, price, CEILING)
325326 [Reissue(shareAssetId, shareAssetAmount, true), ScriptTransfer(i.caller, shareAssetAmount, shareAssetId), StringEntry(keyOperation("P", internalBaseAssetStr, userAddressStr, toBase58String(i.transactionId)), dataOperation("FINISHED", pmt.amount, price, shareAssetAmount, height, lastBlock.timestamp, height, lastBlock.timestamp)), ScriptTransfer(addressFromStringValue(value(getString(keyProxyAddress(baseAssetStr)))), pmt.amount, baseAssetId), IntegerEntry(keyBalance(baseAssetStr), newBalance)]
326327 }
327328 }
328329
329330
330331
331332 @Callable(i)
332333 func submitGetRequest () = {
333334 let pmt = value(i.payments[0])
334335 let shareAssetId = value(pmt.assetId)
335336 let shareAssetStr = toBase58String(shareAssetId)
336337 let callerPubStr = toBase58String(i.callerPublicKey)
337338 let userAddress = i.caller
338339 let userAddressStr = toString(userAddress)
339340 let shareAssetAmount = pmt.amount
340341 let baseAssetStr = getStringOrFail(keyMappingsShare2baseAssetId(shareAssetStr))
341342 let baseAssetId = fromBase58String(baseAssetStr)
342343 let cfgArray = readAssetCfgOrFail(baseAssetStr)
343344 let decimalsMultBothAssets = parseIntValue(cfgArray[IdxCfgDecimalsMultBothAssets])
344345 let decimalsMultPrice = parseIntValue(cfgArray[IdxCfgDecimalsMultPrice])
345346 let getDelayBlocks = parseIntValue(cfgArray[IdxCfgGetDelayBlocks])
346347 let internalBaseAssetStr = cfgArray[IdxCfgInternalBaseAsset]
347348 let price = getPrice(internalBaseAssetStr, baseAssetId, shareAssetId, decimalsMultBothAssets, decimalsMultPrice)._1
348349 let baseAssetAmount = fraction(shareAssetAmount, price, decimalsMultPrice)
349350 let operationKey = keyOperation("G", internalBaseAssetStr, userAddressStr, toBase58String(i.transactionId))
350351 let operationData = dataOperation("PENDING", shareAssetAmount, price, baseAssetAmount, height, lastBlock.timestamp, (height + getDelayBlocks), 0)
351352 [Burn(shareAssetId, shareAssetAmount), StringEntry(operationKey, operationData), incrementTotalLocked(keyTotalLocked(internalBaseAssetStr), shareAssetAmount, baseAssetAmount), incrementTotalLocked(keyTotalLockedByUser(internalBaseAssetStr, userAddressStr), shareAssetAmount, baseAssetAmount), IntegerEntry(keyBalance(baseAssetStr), (balanceOrZero(baseAssetStr) - baseAssetAmount))]
352353 }
353354
354355
355356
356357 @Callable(i)
357358 func executeGetRequest (baseAssetStr,userAddressStr,getTxIdStr) = {
358359 let userAddress = addressFromStringValue(userAddressStr)
359360 let assetCfgArray = readAssetCfgOrFail(baseAssetStr)
360361 let shareAssetId = fromBase58String(assetCfgArray[IdxCfgShareAssetId])
361362 let baseAssetId = fromBase58String(baseAssetStr)
362363 let internalBaseAssetStr = assetCfgArray[IdxCfgInternalBaseAsset]
363364 let operationKey = keyOperation("G", internalBaseAssetStr, userAddressStr, getTxIdStr)
364365 let operationArray = split(getStringOrFail(operationKey), SEP)
365366 let status = operationArray[IdxOperStatus]
366367 let endHeight = parseIntValue(operationArray[IdxOperEndHeight])
367368 let inShareAmount = parseIntValue(operationArray[IdxOperInAmount])
368369 let outBaseAmount = parseIntValue(operationArray[IdxOperOutAmount])
369370 if ((status != "PENDING"))
370371 then failExecuteGet("Status is not PENDING", baseAssetStr, userAddressStr, getTxIdStr)
371372 else if ((endHeight > height))
372373 then failExecuteGet(((("EndHeight[" + toString(endHeight)) + "] > ") + toString(height)), baseAssetStr, userAddressStr, getTxIdStr)
373374 else [ScriptTransfer(userAddress, outBaseAmount, baseAssetId), StringEntry(operationKey, dataOperationExecutionUpdate(operationArray, "FINISHED", lastBlock.timestamp)), decrementTotalLocked(keyTotalLocked(internalBaseAssetStr), inShareAmount, outBaseAmount), decrementTotalLocked(keyTotalLockedByUser(internalBaseAssetStr, userAddressStr), inShareAmount, outBaseAmount)]
374375 }
375376
376377
377378
378379 @Callable(i)
379380 func topUpBalance (baseAssetStr,delta) = {
380381 let assetCfgArray = readAssetCfgOrFail(baseAssetStr)
381382 let pmt = value(i.payments[0])
382383 let pmtAssetId = value(pmt.assetId)
383384 let pmtAssetStr = toBase58String(pmtAssetId)
384385 let shareAssetId = fromBase58String(assetCfgArray[IdxCfgShareAssetId])
385386 let decimalsMultBothAssets = parseIntValue(assetCfgArray[IdxCfgDecimalsMultBothAssets])
386387 let decimalsMultPrice = parseIntValue(assetCfgArray[IdxCfgDecimalsMultPrice])
387388 let internalBaseAssetStr = assetCfgArray[IdxCfgInternalBaseAsset]
388389 let topUpLastHeightKEY = keyTopUpLastHeight(internalBaseAssetStr, toString(i.caller))
389390 let topUpLastHeight = valueOrElse(getInteger(this, topUpLastHeightKEY), 0)
390391 let checks = [mustProxyAddress(i, baseAssetStr), if ((topUpLastHeight != height))
391392 then true
392393 else throw("only one topUp per block is allowed"), if ((delta > 0))
393394 then true
394395 else throw("only positive delta is allowed")]
395396 if ((checks == checks))
396397 then if ((baseAssetStr != pmtAssetStr))
397398 then throw("attached payment's asset id is NOT matched passed baseAssetStr")
398399 else if ((size(i.payments) > 1))
399400 then throw("only one payment can be attached")
400401 else {
401402 let price = calcPrice(internalBaseAssetStr, pmtAssetId, delta, shareAssetId, decimalsMultBothAssets, decimalsMultPrice)._1
402403 [IntegerEntry(keyPriceLast(internalBaseAssetStr), price), IntegerEntry(keyPriceHistory(internalBaseAssetStr, height, lastBlock.timestamp), price), IntegerEntry(topUpLastHeightKEY, height), IntegerEntry(keyBalance(pmtAssetStr), (balanceOrZero(pmtAssetStr) + delta))]
403404 }
404405 else throw("Strict value is not equal to itself.")
405406 }
406407
407408
408409
409410 @Callable(i)
410411 func currentSysParamsREST (baseAssetStr) = {
411412 let sysStateTuple = privateCurrentSysParamsREST(baseAssetStr)
412413 let price = sysStateTuple._1.value
413414 let decimalsMultPrice = sysStateTuple._2.value
414415 let baseAssetBalance = sysStateTuple._3.value
415416 let totalLockedBaseAmount = sysStateTuple._4.value
416417 let baseAssetBalanceConsideringLock = sysStateTuple._5.value
417418 let shareEmission = sysStateTuple._6.value
418419 let restData = makeString(["startCurrentSysParamsREST", toString(price), toString(decimalsMultPrice), toString(baseAssetBalance), toString(totalLockedBaseAmount), toString(baseAssetBalanceConsideringLock), toString(shareEmission), "endCurrentSysParamsREST"], SEP)
419420 throw(restData)
420421 }
421422
422423
423-
424-@Callable(i)
425-func setManager (pendingManagerPublicKey) = {
426- let checkCaller = mustManager(i)
427- if ((checkCaller == checkCaller))
428- then {
429- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
430- if ((checkManagerPublicKey == checkManagerPublicKey))
431- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
432- else throw("Strict value is not equal to itself.")
433- }
434- else throw("Strict value is not equal to itself.")
435- }
436-
437-
438-
439-@Callable(i)
440-func confirmManager () = {
441- let pm = pendingManagerPublicKeyOrUnit()
442- let hasPM = if (isDefined(pm))
443- then true
444- else throw("no pending manager")
445- if ((hasPM == hasPM))
446- then {
447- let checkPM = if ((i.callerPublicKey == value(pm)))
448- then true
449- else throw("you are not pending manager")
450- if ((checkPM == checkPM))
451- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
452- else throw("Strict value is not equal to itself.")
453- }
454- else throw("Strict value is not equal to itself.")
455- }
456-
457-
458424 @Verifier(tx)
459425 func verify () = {
460426 let targetPublicKey = match managerPublicKeyOrUnit() {
461427 case pk: ByteVector =>
462428 pk
463429 case _: Unit =>
464430 tx.senderPublicKey
465431 case _ =>
466432 throw("Match error")
467433 }
468434 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
469435 }
470436

github/deemru/w8io/169f3d6 
75.56 ms