tx · 8ysAkcjJGCMC2pkzZrv9BeymHcET4v1Fu3zP7QzL5yJQ

3NB8Yc3PYs2zCzFyyTZmP9PucxDB1obJXZB:  -0.00500000 Waves

2023.03.16 14:52 [2492543] smart account 3NB8Yc3PYs2zCzFyyTZmP9PucxDB1obJXZB > SELF 0.00000000 Waves

{ "type": 13, "id": "8ysAkcjJGCMC2pkzZrv9BeymHcET4v1Fu3zP7QzL5yJQ", "fee": 500000, "feeAssetId": null, "timestamp": 1678967551520, "version": 2, "chainId": 84, "sender": "3NB8Yc3PYs2zCzFyyTZmP9PucxDB1obJXZB", "senderPublicKey": "2WysCpmFpq5PHtT8uiLCYxeAmvDWeLtzBcci5UTkYDya", "proofs": [ "5BmDHGrcKMbrmry9LgChtGc81b7khGPhYji4h5rVh9CgtmC3GGPff2R5KVrNCugud6jZy3sSkvnhpZHFXs1yCdSK" ], "script": null, "height": 2492543, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9Vcb37WVJapTfnmTYgozzUAWdEiTTjXQDcAhXmKVjkku Next: 3etcdMAjmCSbxWnmjE1mDt5GHPGUgbpryzuUs5upxZ5k Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
2-{-# SCRIPT_TYPE ACCOUNT #-}
3-{-# CONTENT_TYPE DAPP #-}
4-let SEP = "__"
5-
6-let SCALE8 = 8
7-
8-let MULT8 = 100000000
9-
10-let POOLWEIGHTMULT = MULT8
11-
12-func wrapErr (msg) = makeString(["boosting.ride:", msg], " ")
13-
14-
15-func throwErr (msg) = throw(wrapErr(msg))
16-
17-
18-func strf (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
19-
20-
21-func ioz (address,key) = valueOrElse(getInteger(address, key), 0)
22-
23-
24-func iod (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
25-
26-
27-func iof (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
28-
29-
30-func abs (val) = if ((0 > val))
31- then -(val)
32- else val
33-
34-
35-func aal (val) = match val {
36- case valAnyLyst: List[Any] =>
37- valAnyLyst
38- case _ =>
39- throw("fail to cast into List[Any]")
40-}
41-
42-
43-func ai (val) = match val {
44- case valInt: Int =>
45- valInt
46- case _ =>
47- throw("fail to cast into Int")
48-}
49-
50-
51-func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
52-
53-
54-let referralsContractAddressOrFail = addressFromStringValue(strf(this, keyReferralsContractAddress()))
55-
56-let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
57-
58-let referralProgramNameDefault = "wxlock"
59-
60-let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
61-
62-func keyFactoryAddress () = "%s%s__config__factoryAddress"
63-
64-
65-let IdxFactoryCfgStakingDapp = 1
66-
67-let IdxFactoryCfgBoostingDapp = 2
68-
69-let IdxFactoryCfgIdoDapp = 3
70-
71-let IdxFactoryCfgTeamDapp = 4
72-
73-let IdxFactoryCfgEmissionDapp = 5
74-
75-let IdxFactoryCfgRestDapp = 6
76-
77-let IdxFactoryCfgSlippageDapp = 7
78-
79-let IdxFactoryCfgDaoDapp = 8
80-
81-let IdxFactoryCfgMarketingDapp = 9
82-
83-let IdxFactoryCfgGwxRewardDapp = 10
84-
85-let IdxFactoryCfgBirdsDapp = 11
86-
87-func keyFactoryCfg () = "%s__factoryConfig"
88-
89-
90-func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
91-
92-
93-func keyFactoryLpList () = "%s__lpTokensList"
94-
95-
96-func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
97-
98-
99-func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
100-
101-
102-func keyFactoryPoolWeightHistory (poolAddress,num) = ((("%s%s__poolWeight__" + poolAddress) + "__") + toString(num))
103-
104-
105-func readFactoryAddressOrFail () = addressFromStringValue(strf(this, keyFactoryAddress()))
106-
107-
108-func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
109-
110-
111-func readFactoryCfgOrFail (factory) = split(strf(factory, keyFactoryCfg()), SEP)
112-
113-
114-func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
115-
116-
117-func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
118-
119-
120-func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
121-
122-
123-func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgGwxRewardDapp])
124-
125-
126-func keyManagerPublicKey () = "%s__managerPublicKey"
127-
128-
129-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
130-
131-
132-func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
133-
134-
135-func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
136-
137-
138-func keyEmissionStartBlock () = "%s%s__emission__startBlock"
139-
140-
141-func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
142-
143-
144-func keyEmissionEndBlock () = "%s%s__emission__endBlock"
145-
146-
147-func keyNextPeriod () = "%s__nextPeriod"
148-
149-
150-func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
151-
152-
153-let IdxCfgAssetId = 1
154-
155-let IdxCfgMinLockAmount = 2
156-
157-let IdxCfgMinLockDuration = 3
158-
159-let IdxCfgMaxLockDuration = 4
160-
161-let IdxCfgMathContract = 5
162-
163-func keyConfig () = "%s__config"
164-
165-
166-func readConfigArrayOrFail () = split(strf(this, keyConfig()), SEP)
167-
168-
169-let mathContract = addressFromStringValue(readConfigArrayOrFail()[IdxCfgMathContract])
170-
171-func formatConfigS (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = makeString(["%s%d%d%d", assetId, minLockAmount, minLockDuration, maxLockDuration, mathContract], SEP)
172-
173-
174-func formatConfig (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = formatConfigS(assetId, toString(minLockAmount), toString(minLockDuration), toString(maxLockDuration), mathContract)
175-
176-
177-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
178- case s: String =>
179- fromBase58String(s)
180- case _: Unit =>
181- unit
182- case _ =>
183- throw("Match error")
184-}
185-
186-
187-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
188- case s: String =>
189- fromBase58String(s)
190- case _: Unit =>
191- unit
192- case _ =>
193- throw("Match error")
194-}
195-
196-
197-func mustManager (i) = {
198- let pd = throw("Permission denied")
199- match managerPublicKeyOrUnit() {
200- case pk: ByteVector =>
201- if ((i.callerPublicKey == pk))
202- then true
203- else pd
204- case _: Unit =>
205- if ((i.caller == this))
206- then true
207- else pd
208- case _ =>
209- throw("Match error")
210- }
211- }
212-
213-
214-let IdxLockUserNum = 1
215-
216-let IdxLockAmount = 2
217-
218-let IdxLockStart = 3
219-
220-let IdxLockDuration = 4
221-
222-let IdxLockParamK = 5
223-
224-let IdxLockParamB = 6
225-
226-func keyLockParamsRecord (userAddress) = makeString(["%s%s__lock", userAddress], SEP)
227-
228-
229-func readLockParamsRecordOrFail (userAddress) = split(strf(this, keyLockParamsRecord(userAddress)), SEP)
230-
231-
232-func formatLockParamsRecordS (userNum,amount,start,duration,paramK,paramB,lastUpdTimestamp,gwxAmount) = makeString(["%d%d%d%d%d%d%d%d", userNum, amount, start, duration, paramK, paramB, lastUpdTimestamp, gwxAmount], SEP)
233-
234-
235-func formatLockParamsRecord (userNum,amount,start,duration,paramK,paramB,gwxAmount) = formatLockParamsRecordS(userNum, toString(amount), toString(start), toString(duration), toString(paramK), toString(paramB), toString(lastBlock.timestamp), toString(gwxAmount))
236-
237-
238-func keyNextUserNum () = "%s__nextUserNum"
239-
240-
241-func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
242-
243-
244-func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
245-
246-
247-func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
248-
249-
250-func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
251-
252-
253-func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
254-
255-
256-func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
257-
258-
259-func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
260-
261-
262-func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
263-
264-
265-func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
266-
267-
268-func keyLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
269-
270-
271-func keyStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
272-
273-
274-func keyStatsLocksCount () = "%s%s__stats__locksCount"
275-
276-
277-func keyStatsUsersCount () = "%s%s__stats__activeUsersCount"
278-
279-
280-func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
281-
282-
283-func keyUserLpBoostEmissionLastINTEGRAL (userNum,lpAssetId) = makeString(["%s%d__userBoostEmissionLastInt", userNum, lpAssetId], SEP)
284-
285-
286-func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
287-
288-
289-func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
290-
291-
292-func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
293-
294-
295-func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
296-
297-
298-func keyTotalCachedGwx () = "%s%s__gwxCached__total"
299-
300-
301-func keyTotalCachedGwxCorrective () = "%s__gwxCachedTotalCorrective"
302-
303-
304-let factoryContract = readFactoryAddressOrFail()
305-
306-let factoryCfg = readFactoryCfgOrFail(factoryContract)
307-
308-let emissionContract = getEmissionAddressOrFail(factoryCfg)
309-
310-let stakingContract = getStakingAddressOrFail(factoryCfg)
311-
312-let gwxRewardContract = getGwxRewardAddressOrFail(factoryCfg)
313-
314-let lpStakingPoolsContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(makeString(["%s", "lpStakingPoolsContract"], SEP)), wrapErr("lp_staking_pools contract address is undefined"))), wrapErr("invalid lp_staking_pools contract address"))
315-
316-let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], SEP)
317-
318-let votingEmissionContract = addressFromStringValue(getStringValue(factoryContract, keyVotingEmissionContract))
319-
320-func getTotalCachedGwx (correct) = {
321- let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], SEP)
322- let currentEpochUi = getIntegerValue(votingEmissionContract, keyCurrentEpochUi)
323- let keyTargetEpoch = makeString(["%s%s", "totalCachedGwxCorrection__activationEpoch"], SEP)
324- let targetEpochOption = getInteger(this, keyTargetEpoch)
325- let totalCachedGwxRaw = valueOrElse(getInteger(this, keyTotalCachedGwx()), 0)
326- let isCorrectionActivated = if (isDefined(targetEpochOption))
327- then (currentEpochUi >= value(targetEpochOption))
328- else false
329- let corrective = if (if (isCorrectionActivated)
330- then correct
331- else false)
332- then valueOrElse(getInteger(this, keyTotalCachedGwxCorrective()), 0)
333- else 0
334- max([0, (totalCachedGwxRaw + corrective)])
335- }
336-
337-
338-func HistoryEntry (type,user,amount,lockStart,duration,k,b,i) = {
339- let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
340- let historyDATA = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(lockStart), toString(duration), toString(k), toString(b)], SEP)
341- StringEntry(historyKEY, historyDATA)
342- }
343-
344-
345-func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
346- let locksDurationSumInBlocksKEY = keyStatsLocksDurationSumInBlocks()
347- let locksCountKEY = keyStatsLocksCount()
348- let usersCountKEY = keyStatsUsersCount()
349- let totalAmountKEY = keyLockParamTotalAmount()
350- let locksDurationSumInBlocks = ioz(this, locksDurationSumInBlocksKEY)
351- let locksCount = ioz(this, locksCountKEY)
352- let usersCount = ioz(this, usersCountKEY)
353- let totalAmount = ioz(this, totalAmountKEY)
354-[IntegerEntry(locksDurationSumInBlocksKEY, (locksDurationSumInBlocks + durationInc)), IntegerEntry(locksCountKEY, (locksCount + lockCountInc)), IntegerEntry(usersCountKEY, (usersCount + usersCountInc)), IntegerEntry(totalAmountKEY, (totalAmount + totalLockedInc))]
355- }
356-
357-
358-func calcGwxAmount (kRaw,bRaw,h) = {
359- let SCALE = 1000
360- (((kRaw * h) + bRaw) / SCALE)
361- }
362-
363-
364-func LockParamsEntry (userAddress,userNum,amount,start,duration,k,b,period) = {
365- let userAmountKEY = keyLockParamUserAmount(userNum)
366- let startBlockKEY = keyLockParamStartBlock(userNum)
367- let durationKEY = keyLockParamDuration(userNum)
368- let kKEY = keyLockParamK(userNum)
369- let bKEY = keyLockParamB(userNum)
370- let kByPeriodKEY = keyLockParamByPeriodK(userNum, period)
371- let bByPeriodKEY = keyLockParamByPeriodB(userNum, period)
372- let gwxAmount = calcGwxAmount(k, b, height)
373-[IntegerEntry(userAmountKEY, amount), IntegerEntry(startBlockKEY, start), IntegerEntry(durationKEY, duration), IntegerEntry(kKEY, k), IntegerEntry(bKEY, b), IntegerEntry(kByPeriodKEY, k), IntegerEntry(bByPeriodKEY, b), StringEntry(keyLockParamsRecord(userAddress), formatLockParamsRecord(userNum, amount, start, duration, k, b, gwxAmount))]
374- }
375-
376-
377-func extractOptionalPaymentAmountOrFail (i,expectedAssetId) = if ((size(i.payments) > 1))
378- then throw("only one payment is allowed")
379- else if ((size(i.payments) == 0))
380- then 0
381- else {
382- let pmt = i.payments[0]
383- if ((value(pmt.assetId) != expectedAssetId))
384- then throw("invalid asset id in payment")
385- else pmt.amount
386- }
387-
388-
389-func calcUserGwxAmountAtHeight (userAddress,targetHeight) = {
390- let EMPTY = "empty"
391- let user2NumMappingKEY = keyUser2NumMapping(userAddress)
392- let userNum = valueOrElse(getString(user2NumMappingKEY), EMPTY)
393- let k = valueOrElse(getInteger(keyLockParamK(userNum)), 0)
394- let b = valueOrElse(getInteger(keyLockParamB(userNum)), 0)
395- let gwxAmountCalc = calcGwxAmount(k, b, targetHeight)
396- let gwxAmount = if ((0 > gwxAmountCalc))
397- then 0
398- else gwxAmountCalc
399- gwxAmount
400- }
401-
402-
403-func calcCurrentGwxAmount (userAddress) = calcUserGwxAmountAtHeight(userAddress, height)
404-
405-
406-func getVotingEmissionEpochInfo () = {
407- let keyCurrentEpochUi = makeString(["%s", "currentEpochUi"], SEP)
408- let $t01526715559 = {
409- let currentEpochUi = value(getInteger(votingEmissionContract, keyCurrentEpochUi))
410- let lastFinalizedEpoch = (currentEpochUi - 1)
411- if ((0 > lastFinalizedEpoch))
412- then throwErr("invalid epoch")
413- else $Tuple2(currentEpochUi, lastFinalizedEpoch)
414- }
415- let currentEpochUi = $t01526715559._1
416- let lastFinalizedEpoch = $t01526715559._2
417- func keyStartHeightByEpoch (epoch) = makeString(["%s%d", "startHeight", toString(epoch)], SEP)
418-
419- let currentEpochStartHeight = value(getInteger(votingEmissionContract, keyStartHeightByEpoch(currentEpochUi)))
420- $Tuple2(lastFinalizedEpoch, currentEpochStartHeight)
421- }
422-
423-
424-func keyVote (amountAssetId,priceAssetId,address,epoch) = makeString(["%s%s%s%s%d", "vote", amountAssetId, priceAssetId, toString(address), toString(epoch)], SEP)
425-
426-
427-func keyVotingResultStaked (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStaked", lpAssetIdStr, toString(epoch)], SEP)
428-
429-
430-func keyVotingResultStakedIntegral (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStakedIntegral", lpAssetIdStr, toString(epoch)], SEP)
431-
432-
433-func keyVotingResultStakedLastUpdateHeight (lpAssetIdStr,epoch) = makeString(["%s%s%d", "votingResultStakedIntegralLastUpdateHeight", lpAssetIdStr, toString(epoch)], SEP)
434-
435-
436-func keyVoteStakedIntegral (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegral", lpAssetIdStr, toString(address), toString(epoch)], SEP)
437-
438-
439-func keyVoteStakedLastUpdateHeight (lpAssetIdStr,address,epoch) = makeString(["%s%s%s%d", "voteStakedIntegralLastUpdateHeight", lpAssetIdStr, toString(address), toString(epoch)], SEP)
440-
441-
442-func getVotingResultStaked (lpAssetIdStr) = {
443- let $t01728317363 = getVotingEmissionEpochInfo()
444- let lastFinalizedEpoch = $t01728317363._1
445- let currentEpochStartHeight = $t01728317363._2
446- let votingResultStakedStart = valueOrElse(getInteger(votingEmissionContract, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), 0)
447- let votingResultStaked = valueOrElse(getInteger(this, keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch)), votingResultStakedStart)
448- votingResultStaked
449- }
450-
451-
452-func refreshVotingResultStakedIntegral (lpAssetIdStr,stakedVoteDelta) = {
453- let $t01789717977 = getVotingEmissionEpochInfo()
454- let lastFinalizedEpoch = $t01789717977._1
455- let currentEpochStartHeight = $t01789717977._2
456- let votingResultStaked = getVotingResultStaked(lpAssetIdStr)
457- let votingResultStakedNew = (votingResultStaked + stakedVoteDelta)
458- let votingResultStakedIntegralKey = keyVotingResultStakedIntegral(lpAssetIdStr, lastFinalizedEpoch)
459- let votingResultStakedIntegralPrev = valueOrElse(getInteger(this, votingResultStakedIntegralKey), 0)
460- let votingResultLastUpdateHeightKey = keyVotingResultStakedLastUpdateHeight(lpAssetIdStr, lastFinalizedEpoch)
461- let votingResultStakedLastUpdateHeight = valueOrElse(getInteger(this, votingResultLastUpdateHeightKey), currentEpochStartHeight)
462- let votingResultStakedIntegralDh = (height - votingResultStakedLastUpdateHeight)
463- let votingResultStakedIntegral = ((votingResultStakedIntegralDh * votingResultStaked) + votingResultStakedIntegralPrev)
464- $Tuple2([IntegerEntry(keyVotingResultStaked(lpAssetIdStr, lastFinalizedEpoch), votingResultStakedNew), IntegerEntry(votingResultLastUpdateHeightKey, height), IntegerEntry(votingResultStakedIntegralKey, votingResultStakedIntegral)], votingResultStakedIntegral)
465- }
466-
467-
468-func refreshVoteStakedIntegral (lpAssetIdStr,userAddressStr,edge) = {
469- let $t01920219282 = getVotingEmissionEpochInfo()
470- let lastFinalizedEpoch = $t01920219282._1
471- let currentEpochStartHeight = $t01920219282._2
472- let userAddress = addressFromStringValue(userAddressStr)
473- let idxAmountAssetId = 4
474- let idxPriceAssetId = 5
475- let poolCfg = {
476- let @ = invoke(factoryContract, "getPoolConfigByLpAssetId", [lpAssetIdStr], nil)
477- if ($isInstanceOf(@, "List[Any]"))
478- then @
479- else throw(($getType(@) + " couldn't be cast to List[Any]"))
480- }
481- let amountAssetId = {
482- let @ = poolCfg[idxAmountAssetId]
483- if ($isInstanceOf(@, "String"))
484- then @
485- else throw(($getType(@) + " couldn't be cast to String"))
486- }
487- let priceAssetId = {
488- let @ = poolCfg[idxPriceAssetId]
489- if ($isInstanceOf(@, "String"))
490- then @
491- else throw(($getType(@) + " couldn't be cast to String"))
492- }
493- let userVote = valueOrElse(getInteger(votingEmissionContract, keyVote(amountAssetId, priceAssetId, userAddress, lastFinalizedEpoch)), 0)
494- let actions = if ((userVote == 0))
495- then nil
496- else {
497- let stakedVoteDelta = if (edge)
498- then userVote
499- else -(userVote)
500- let $t01990020019 = refreshVotingResultStakedIntegral(lpAssetIdStr, stakedVoteDelta)
501- let votingResultActions = $t01990020019._1
502- let votingResultStakedIntegral = $t01990020019._2
503- let userVoteStaked = if (edge)
504- then 0
505- else userVote
506- let userVoteStakedIntegralKey = keyVoteStakedIntegral(lpAssetIdStr, userAddress, lastFinalizedEpoch)
507- let userVoteStakedIntegralPrev = valueOrElse(getInteger(this, userVoteStakedIntegralKey), 0)
508- let userVoteStakedLastUpdateHeightKey = keyVoteStakedLastUpdateHeight(lpAssetIdStr, userAddress, lastFinalizedEpoch)
509- let userVoteStakedLastUpdateHeight = valueOrElse(getInteger(this, userVoteStakedLastUpdateHeightKey), currentEpochStartHeight)
510- let userVoteStakedIntegralDh = (height - userVoteStakedLastUpdateHeight)
511- let userVoteStakedIntegral = ((userVoteStakedIntegralDh * userVoteStaked) + userVoteStakedIntegralPrev)
512- let voteActions = [IntegerEntry(userVoteStakedLastUpdateHeightKey, height), IntegerEntry(userVoteStakedIntegralKey, userVoteStakedIntegral)]
513- (votingResultActions ++ voteActions)
514- }
515- actions
516- }
517-
518-
519-func internalClaimWxBoost (lpAssetIdStr,userAddressStr,readOnly) = {
520- let EMPTY = "EMPTY"
521- let userRecordOrEmpty = valueOrElse(getString(this, keyLockParamsRecord(userAddressStr)), EMPTY)
522- if ((userRecordOrEmpty == EMPTY))
523- then $Tuple3(0, nil, "userRecord::is::empty")
524- else {
525- let userRecordArray = split(userRecordOrEmpty, SEP)
526- let userNumStr = userRecordArray[IdxLockUserNum]
527- let gwxRewardEmissionStartHeight = valueOrElse(getInteger(gwxRewardContract, keyGwxRewardEmissionStartHeight()), 0)
528- let EMPTYSTR = "empty"
529- let $t02152922107 = if ((lpAssetIdStr != EMPTYSTR))
530- then {
531- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
532- let pw1 = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
533- let pw0 = valueOrElse(getInteger(factoryContract, keyFactoryPoolWeightHistory(poolAddressStr, 0)), pw1)
534- $Tuple2(pw0, pw1)
535- }
536- else if (readOnly)
537- then $Tuple2(0, 0)
538- else throw(("not readonly mode: unsupported lp asset " + lpAssetIdStr))
539- let poolWeight0 = $t02152922107._1
540- let poolWeight1 = $t02152922107._2
541- let wxEmissionPerBlock = iof(emissionContract, keyEmissionRatePerBlockCurrent())
542- let emissionStart = iof(emissionContract, keyEmissionStartBlock())
543- let emissionEnd = iof(emissionContract, keyEmissionEndBlock())
544- let h = if ((height > emissionEnd))
545- then emissionEnd
546- else height
547- let dh = max([(h - emissionStart), 0])
548- let userLpBoostEmissionLastIntegralKEY = keyUserLpBoostEmissionLastINTEGRAL(userNumStr, lpAssetIdStr)
549- let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
550- let userBoostEmissionLastIntegral = valueOrElse(getInteger(this, userLpBoostEmissionLastIntegralKEY), ioz(this, userBoostEmissionLastIntegralKEY))
551- let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
552- let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
553- let udh = fraction(userBoostEmissionIntegral, 3, (2 * wxEmissionPerBlock))
554- let uLastH = (h - udh)
555- let udh0 = max([(gwxRewardEmissionStartHeight - uLastH), 0])
556- let udh1 = ((h - uLastH) - udh0)
557- if (if (if ((0 > uLastH))
558- then true
559- else (0 > udh1))
560- then true
561- else (abs(((udh0 + udh1) - udh)) >= 1))
562- then throw(((((((((((("invalid udh calc: udh=" + toString(udh)) + " uLastH=") + toString(uLastH)) + " udh0=") + toString(udh0)) + " udh1=") + toString(udh1)) + " lpAssetId=") + lpAssetIdStr) + " userAddress=") + userAddressStr))
563- else if ((0 > userBoostEmissionIntegral))
564- then throw("wrong calculations")
565- else {
566- let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
567- let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
568- let userMaxBoostInt = ioz(this, userMaxBoostIntegralKEY)
569- let totalMaxBoostInt = ioz(this, totalMaxBoostIntegralKEY)
570- let totalCachedGwxCorrected = getTotalCachedGwx(true)
571- let userCurrGwx = calcCurrentGwxAmount(userAddressStr)
572- let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
573- let userBoostAvaliableToClaimTotal = ioz(this, userBoostAvalaibleToClaimTotalKEY)
574- let userBoostEmissionIntegral0 = if ((udh == 0))
575- then 0
576- else fraction(userBoostEmissionIntegral, udh0, udh)
577- let userBoostEmissionIntegral1 = if ((udh == 0))
578- then 0
579- else fraction(userBoostEmissionIntegral, udh1, udh)
580- let poolUserBoostEmissionIntegral0 = fraction(userBoostEmissionIntegral0, poolWeight0, POOLWEIGHTMULT)
581- let poolUserBoostEmissionIntegral1 = fraction(userBoostEmissionIntegral1, poolWeight1, POOLWEIGHTMULT)
582- let userBoostAvaliableToClaimTotalNew0 = if ((totalCachedGwxCorrected == 0))
583- then 0
584- else fraction(poolUserBoostEmissionIntegral0, userCurrGwx, totalCachedGwxCorrected)
585- let userBoostAvaliableToClaimTotalNew1 = if ((totalCachedGwxCorrected == 0))
586- then 0
587- else fraction(poolUserBoostEmissionIntegral1, userCurrGwx, totalCachedGwxCorrected)
588- let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotalNew0 + userBoostAvaliableToClaimTotalNew1)
589- let userBoostClaimedKEY = keyUserBoostClaimed(userNumStr)
590- let userBoostClaimed = ioz(this, userBoostClaimedKEY)
591- let userBoostAvailable = (userBoostAvaliableToClaimTotalNew - userBoostClaimed)
592- let dataState = [IntegerEntry(userLpBoostEmissionLastIntegralKEY, boostEmissionIntegral)]
593- let debug = makeString([toString(userBoostEmissionLastIntegral), toString(userBoostEmissionIntegral), toString(userBoostClaimed), toString(userBoostAvailable), toString(poolWeight0), toString(poolWeight1), toString(h), toString(udh), toString(uLastH), toString(udh0), toString(udh1), toString(userCurrGwx), toString(totalCachedGwxCorrected)], ":")
594- $Tuple3(userBoostAvaliableToClaimTotalNew, dataState, debug)
595- }
596- }
597- }
598-
599-
600-func lockActions (i,duration) = {
601- let cfgArray = readConfigArrayOrFail()
602- let assetIdStr = cfgArray[IdxCfgAssetId]
603- let assetId = fromBase58String(assetIdStr)
604- let minLockAmount = parseIntValue(cfgArray[IdxCfgMinLockAmount])
605- let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
606- let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
607- if ((size(i.payments) != 1))
608- then throw("invalid payment - exact one payment must be attached")
609- else {
610- let pmt = i.payments[0]
611- let pmtAmount = pmt.amount
612- if ((assetId != value(pmt.assetId)))
613- then throw((("invalid asset is in payment - " + assetIdStr) + " is expected"))
614- else {
615- let nextUserNumKEY = keyNextUserNum()
616- let userAddressStr = toString(i.caller)
617- let userIsExisting = isDefined(getString(keyUser2NumMapping(userAddressStr)))
618- let userNumStr = if (userIsExisting)
619- then value(getString(keyUser2NumMapping(userAddressStr)))
620- else toString(iof(this, nextUserNumKEY))
621- let userNum = parseIntValue(userNumStr)
622- let lockStart = height
623- let startBlockKEY = keyLockParamStartBlock(userNumStr)
624- let durationKEY = keyLockParamDuration(userNumStr)
625- let userAmountKEY = keyLockParamUserAmount(userNumStr)
626- if (if ((minLockAmount > pmtAmount))
627- then (i.caller != lpStakingPoolsContract)
628- else false)
629- then throw(("amount is less then minLockAmount=" + toString(minLockAmount)))
630- else if ((minLockDuration > duration))
631- then throw(("passed duration is less then minLockDuration=" + toString(minLockDuration)))
632- else if ((duration > maxLockDuration))
633- then throw(("passed duration is greater then maxLockDuration=" + toString(maxLockDuration)))
634- else if (if (userIsExisting)
635- then ((iof(this, startBlockKEY) + iof(this, durationKEY)) >= lockStart)
636- else false)
637- then throw("there is an active lock - consider to use increaseLock")
638- else if ((ioz(this, userAmountKEY) > 0))
639- then throw(("there are locked WXs - consider to use increaseLock " + userAmountKEY))
640- else {
641- let coeffX8 = fraction(duration, MULT8, maxLockDuration)
642- let gWxAmountStart = fraction(pmtAmount, coeffX8, MULT8)
643- let gWxParamsResultList = aal(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStart, duration], nil))
644- let k = ai(gWxParamsResultList[0])
645- let b = ai(gWxParamsResultList[1])
646- let period = toString(ai(gWxParamsResultList[2]))
647- let wxEmissionPerBlock = iof(emissionContract, keyEmissionRatePerBlockCurrent())
648- let emissionStart = iof(emissionContract, keyEmissionStartBlock())
649- let emissionEnd = iof(emissionContract, keyEmissionEndBlock())
650- let h = if ((height > emissionEnd))
651- then emissionEnd
652- else height
653- let dh = max([(h - emissionStart), 0])
654- let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
655- let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
656- let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
657- let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
658- let userMaxBoostInt = ((gWxAmountStart * duration) / 2)
659- let totalMaxBoostInt = ioz(this, totalMaxBoostIntegralKEY)
660- let totalCachedGwxRaw = getTotalCachedGwx(false)
661- let arr = if (userIsExisting)
662- then nil
663- else [IntegerEntry(nextUserNumKEY, (userNum + 1)), StringEntry(keyUser2NumMapping(userAddressStr), userNumStr), StringEntry(keyNum2UserMapping(userNumStr), userAddressStr)]
664- $Tuple2(((((arr ++ LockParamsEntry(userAddressStr, userNumStr, pmtAmount, lockStart, duration, k, b, period)) ++ StatsEntry(pmtAmount, duration, 1, if (userIsExisting)
665- then 0
666- else 1)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, duration, k, b, i)) ++ [IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(keyTotalCachedGwx(), (totalCachedGwxRaw + gWxAmountStart))]), gWxAmountStart)
667- }
668- }
669- }
670- }
671-
672-
673-@Callable(i)
674-func constructor (factoryAddressStr,lockAssetIdStr,minLockAmount,minDuration,maxDuration,mathContract) = {
675- let checkCaller = mustManager(i)
676- if ((checkCaller == checkCaller))
677- then ([IntegerEntry(keyNextUserNum(), 0), StringEntry(keyConfig(), formatConfig(lockAssetIdStr, minLockAmount, minDuration, maxDuration, mathContract)), StringEntry(keyFactoryAddress(), factoryAddressStr)] ++ StatsEntry(0, 0, 0, 0))
678- else throw("Strict value is not equal to itself.")
679- }
680-
681-
682-
683-@Callable(i)
684-func lockRef (duration,referrerAddress,signature) = {
685- let $t03074230807 = lockActions(i, duration)
686- let lockActionsResult = $t03074230807._1
687- let gWxAmountStart = $t03074230807._2
688- let referralAddress = toString(i.caller)
689- let refInv = if (if ((referrerAddress == ""))
690- then true
691- else (signature == base58''))
692- then unit
693- else invoke(referralsContractAddressOrFail, "createPair", [referralProgramName, referrerAddress, referralAddress, signature], nil)
694- if ((refInv == refInv))
695- then {
696- let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
697- if ((updateRefActivity == updateRefActivity))
698- then $Tuple2(lockActionsResult, unit)
699- else throw("Strict value is not equal to itself.")
700- }
701- else throw("Strict value is not equal to itself.")
702- }
703-
704-
705-
706-@Callable(i)
707-func lock (duration) = {
708- let $t03127731342 = lockActions(i, duration)
709- let lockActionsResult = $t03127731342._1
710- let gWxAmountStart = $t03127731342._2
711- let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
712- if ((updateRefActivity == updateRefActivity))
713- then $Tuple2(lockActionsResult, unit)
714- else throw("Strict value is not equal to itself.")
715- }
716-
717-
718-
719-@Callable(i)
720-func increaseLock (deltaDuration) = {
721- let cfgArray = readConfigArrayOrFail()
722- let assetIdStr = cfgArray[IdxCfgAssetId]
723- let assetId = fromBase58String(assetIdStr)
724- let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
725- let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
726- let pmtAmount = extractOptionalPaymentAmountOrFail(i, assetId)
727- let userAddressStr = toString(i.caller)
728- let userRecordArray = readLockParamsRecordOrFail(userAddressStr)
729- let userNumStr = userRecordArray[IdxLockUserNum]
730- let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
731- let lockStart = parseIntValue(userRecordArray[IdxLockStart])
732- let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
733- let lockEnd = (lockStart + lockDuration)
734- let remainingDuration = max([(lockEnd - height), 0])
735- let userAmountNew = (userAmount + pmtAmount)
736- let lockDurationNew = (remainingDuration + deltaDuration)
737- if ((0 > deltaDuration))
738- then throw("duration is less then zero")
739- else if ((minLockDuration > lockDurationNew))
740- then throw(("lockDurationNew is less then minLockDuration=" + toString(minLockDuration)))
741- else if ((lockDurationNew > maxLockDuration))
742- then throw(("deltaDuration + existedLockDuration is greater then maxLockDuration=" + toString(maxLockDuration)))
743- else {
744- let coeffX8 = fraction(lockDurationNew, MULT8, maxLockDuration)
745- let gWxAmountStart = fraction(userAmountNew, coeffX8, MULT8)
746- let updateRefActivity = invoke(mathContract, "updateReferralActivity", [toString(i.caller), gWxAmountStart], nil)
747- if ((updateRefActivity == updateRefActivity))
748- then {
749- let lockStartNew = height
750- let gWxParamsResultList = aal(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStartNew, lockDurationNew], nil))
751- let k = ai(gWxParamsResultList[0])
752- let b = ai(gWxParamsResultList[1])
753- let period = toString(ai(gWxParamsResultList[2]))
754- let wxEmissionPerBlock = iof(emissionContract, keyEmissionRatePerBlockCurrent())
755- let emissionStart = iof(emissionContract, keyEmissionStartBlock())
756- let emissionEnd = iof(emissionContract, keyEmissionEndBlock())
757- let h = if ((height > emissionEnd))
758- then emissionEnd
759- else height
760- let dh = max([(h - emissionStart), 0])
761- let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
762- let userBoostEmissionLastIntegral = ioz(this, userBoostEmissionLastIntegralKEY)
763- let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
764- let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
765- if ((0 > userBoostEmissionIntegral))
766- then throw("wrong calculations")
767- else {
768- let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
769- let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
770- let userMaxBoostInt = ioz(this, userMaxBoostIntegralKEY)
771- let totalMaxBoostInt = ioz(this, totalMaxBoostIntegralKEY)
772- let currUserGwx = calcCurrentGwxAmount(userAddressStr)
773- let gwxDiff = (gWxAmountStart - currUserGwx)
774- if ((0 > gwxDiff))
775- then throw(("gwxDiff is less then 0: " + toString(gwxDiff)))
776- else {
777- let totalCachedGwxRaw = getTotalCachedGwx(false)
778- let totalCachedGwxCorrected = getTotalCachedGwx(true)
779- let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
780- let userBoostAvaliableToClaimTotal = ioz(this, userBoostAvalaibleToClaimTotalKEY)
781- let userBoostAvaliableToClaimTotalNew = fraction(userBoostEmissionIntegral, currUserGwx, totalCachedGwxCorrected)
782- let userMaxBoostIntNew = ((gWxAmountStart * lockDurationNew) / 2)
783- let remainingUserMaxBoostInt = ((currUserGwx * remainingDuration) / 2)
784- let userMaxBoostIntDiff = (userMaxBoostIntNew - remainingUserMaxBoostInt)
785- (((LockParamsEntry(userAddressStr, userNumStr, userAmountNew, lockStartNew, lockDurationNew, k, b, period) ++ StatsEntry(pmtAmount, deltaDuration, 0, 0)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, lockDurationNew, k, b, i)) ++ [IntegerEntry(keyTotalCachedGwx(), (totalCachedGwxRaw + gwxDiff))])
786- }
787- }
788- }
789- else throw("Strict value is not equal to itself.")
790- }
791- }
792-
793-
794-
795-@Callable(i)
796-func claimWxBoost (lpAssetIdStr,userAddressStr) = if ((stakingContract != i.caller))
797- then throw("permissions denied")
798- else {
799- let $t03641836520 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, false)
800- let userBoostAvailable = $t03641836520._1
801- let dataState = $t03641836520._2
802- let debug = $t03641836520._3
803- $Tuple2(dataState, [userBoostAvailable])
804- }
805-
806-
807-
808-@Callable(i)
809-func claimWxBoostREADONLY (lpAssetIdStr,userAddressStr) = {
810- let $t03665936760 = internalClaimWxBoost(lpAssetIdStr, userAddressStr, true)
811- let userBoostAvailable = $t03665936760._1
812- let dataState = $t03665936760._2
813- let debug = $t03665936760._3
814- $Tuple2(nil, [userBoostAvailable, debug])
815- }
816-
817-
818-
819-@Callable(i)
820-func unlock (userAddress) = {
821- let userRecordArray = readLockParamsRecordOrFail(userAddress)
822- let userNumStr = userRecordArray[IdxLockUserNum]
823- let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
824- let lockStart = parseIntValue(userRecordArray[IdxLockStart])
825- let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
826- let lockEnd = (lockStart + lockDuration)
827- let cfgArray = readConfigArrayOrFail()
828- let assetId = fromBase58String(cfgArray[IdxCfgAssetId])
829- if ((lockEnd >= height))
830- then throw((("wait " + toString(lockEnd)) + " to unlock"))
831- else if ((0 >= userAmount))
832- then throw("nothing to unlock")
833- else {
834- let period = valueOrElse(getInteger(mathContract, keyNextPeriod()), 0)
835- (((LockParamsEntry(userAddress, userNumStr, 0, lockStart, lockDuration, 0, 0, toString(period)) ++ StatsEntry(-(userAmount), 0, 0, -1)) :+ HistoryEntry("unlock", userAddress, userAmount, lockStart, lockDuration, 0, 0, i)) :+ ScriptTransfer(addressFromStringValue(userAddress), userAmount, assetId))
836- }
837- }
838-
839-
840-
841-@Callable(i)
842-func gwxUserInfoREADONLY (userAddress) = {
843- let gwxAmount = calcCurrentGwxAmount(userAddress)
844- $Tuple2(nil, [gwxAmount])
845- }
846-
847-
848-
849-@Callable(i)
850-func userMaxDurationREADONLY (userAddressStr) = {
851- let cfgArray = readConfigArrayOrFail()
852- let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
853- let userRecordOption = getString(this, keyLockParamsRecord(userAddressStr))
854- if ((userRecordOption == unit))
855- then $Tuple2(nil, $Tuple2("lock", maxLockDuration))
856- else {
857- let userRecordArray = split(value(userRecordOption), SEP)
858- let lockStart = parseIntValue(userRecordArray[IdxLockStart])
859- let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
860- let lockEnd = (lockStart + lockDuration)
861- let remainingDuration = max([(lockEnd - height), 0])
862- let maxDeltaDuration = (maxLockDuration - remainingDuration)
863- $Tuple2(nil, $Tuple2("increaseLock", maxDeltaDuration))
864- }
865- }
866-
867-
868-
869-@Callable(i)
870-func getUserGwxAmountAtHeightREADONLY (userAddress,targetHeight) = {
871- let gwxAmount = calcUserGwxAmountAtHeight(userAddress, targetHeight)
872- $Tuple2(nil, gwxAmount)
873- }
874-
875-
876-
877-@Callable(i)
878-func getTotalCachedGwxREADONLY () = $Tuple2(nil, getTotalCachedGwx(true))
879-
880-
881-
882-@Callable(i)
883-func onStakedVoteUpdate (lpAssetIdStr,userAddressStr,edge) = {
884- let checkCaller = if ((i.caller == stakingContract))
885- then true
886- else mustManager(i)
887- if ((checkCaller == checkCaller))
888- then {
889- let actions = refreshVoteStakedIntegral(lpAssetIdStr, userAddressStr, edge)
890- $Tuple2(actions, unit)
891- }
892- else throw("Strict value is not equal to itself.")
893- }
894-
895-
896-
897-@Callable(i)
898-func getVotingResultStakedREADONLY (lpAssetIdStr) = $Tuple2(nil, getVotingResultStaked(lpAssetIdStr))
899-
900-
901-
902-@Callable(i)
903-func setManager (pendingManagerPublicKey) = {
904- let checkCaller = mustManager(i)
905- if ((checkCaller == checkCaller))
906- then {
907- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
908- if ((checkManagerPublicKey == checkManagerPublicKey))
909- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
910- else throw("Strict value is not equal to itself.")
911- }
912- else throw("Strict value is not equal to itself.")
913- }
914-
915-
916-
917-@Callable(i)
918-func confirmManager () = {
919- let pm = pendingManagerPublicKeyOrUnit()
920- let hasPM = if (isDefined(pm))
921- then true
922- else throw("No pending manager")
923- if ((hasPM == hasPM))
924- then {
925- let checkPM = if ((i.callerPublicKey == value(pm)))
926- then true
927- else throw("You are not pending manager")
928- if ((checkPM == checkPM))
929- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
930- else throw("Strict value is not equal to itself.")
931- }
932- else throw("Strict value is not equal to itself.")
933- }
934-
935-
936-@Verifier(tx)
937-func verify () = {
938- let targetPublicKey = match managerPublicKeyOrUnit() {
939- case pk: ByteVector =>
940- pk
941- case _: Unit =>
942- tx.senderPublicKey
943- case _ =>
944- throw("Match error")
945- }
946- sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
947- }
948-
1+# no script

github/deemru/w8io/169f3d6 
50.29 ms