tx · 3UUptsikgKCj112zBsATb7bVuSv6R9vYwAs52jZwe8Q8

3P86ne9inVG1Cf4smrEGSdcXyBuEApPcMAc:  -0.00600000 Waves

2023.03.22 20:30 [3567114] smart account 3P86ne9inVG1Cf4smrEGSdcXyBuEApPcMAc > SELF 0.00000000 Waves

{ "type": 13, "id": "3UUptsikgKCj112zBsATb7bVuSv6R9vYwAs52jZwe8Q8", "fee": 600000, "feeAssetId": null, "timestamp": 1679506259687, "version": 1, "sender": "3P86ne9inVG1Cf4smrEGSdcXyBuEApPcMAc", "senderPublicKey": "6hjWe2YQdsZKtjcACiKTUMEGGnow19LjCF763eE2Tt91", "proofs": [ "3fWyt36TknNBy6PDgFM4SzoxGEvwtzTdyziNvoD8aQAAHJ7FWFh3i2tbF5gC5BPSGzsxaPGVtEK6NwpDgEsBYvqu" ], "script": "base64:BgIaCAISABIDCgEIEgMKAQESAwoBCBIAEgMKAQgjARB3cml0ZUNvbnN0U3RyaW5nAgNrZXkFdmFsdWUDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFA2tleQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQkAAgEJAKwCAgIVYWxyZWFkeSBpbml0aWFsaXplZDogBQNrZXkBCHdyaXRlSW50AgNrZXkFdmFsdWUDCQBmAgAABQV2YWx1ZQkAAgEJAKwCAgkArAICCQCsAgICF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQCkAwEFBXZhbHVlAgkgZm9yIGtleSAFA2tleQkBDEludGVnZXJFbnRyeQIFA2tleQUFdmFsdWUBCGNoYW5nZUJ5AgNrZXkFdmFsdWUJAQh3cml0ZUludAIFA2tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAAFBXZhbHVlABJjb25maWdBZGRyZXNzU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRJjb25maWdBZGRyZXNzU3RvcmUCGGNvbmZpZyBhZGRyZXNzIG5vdCBmb3VuZAIWaW52YWxpZCBjb25maWcgYWRkcmVzcwEHYWxsb3dlZAECb3AJAPwHBAUNY29uZmlnQWRkcmVzcwIJb3BBbGxvd2VkCQDMCAIFAm9wBQNuaWwFA25pbAANcHdyQXNzZXRJZFN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHBvd2VyQXNzZXRJZAIWcHdyIGFzc2V0IGlkIG5vdCBmb3VuZAAKcHdyQXNzZXRJZAkA2QQBBQ1wd3JBc3NldElkU3RyAA5taW50ZXJDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAg9jb250cmFjdF9taW50ZXICEm5vIGNvbnRyYWN0X21pbnRlcgIXaW52YWxpZCBtaW50ZXIgY29udHJhY3QAEHN0YWtpbmdBZGRyZXNzZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwkArAICCQClCAEFBHRoaXMCCF9zdGFrZXJzAgAAC21pbkxvY2tUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICCQClCAEFBHRoaXMCDl9taW5fbG9ja190aW1lAhVtaW5fbG9ja190aW1lIG5vdCBzZXQBD3VzZXJTaGFyZXNTdG9yZQEEdXNlcgkArAICBQR1c2VyAgdfc2hhcmVzAQtzdG9yZUhlaWdodAEFc3RvcmUJAKwCAgUFc3RvcmUCB19oZWlnaHQBC3N0YWtlSGVpZ2h0AQdhZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkBC3N0b3JlSGVpZ2h0AQkBD3VzZXJTaGFyZXNTdG9yZQEFB2FkZHJlc3MCD25vIHN0YWtlIGhlaWdodAENdW5zdGFrZUhlaWdodAEHYWRkcmVzcwkAZAIJAQtzdGFrZUhlaWdodAEFB2FkZHJlc3MFC21pbkxvY2tUaW1lAAhzbGFzaGVycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwIJX3NsYXNoZXJzAgAABkhFSUdIVAUGaGVpZ2h0ABFzdGFrZWRIZWlnaHRTdG9yZQIMc3Rha2VkSGVpZ2h0ABB0b3RhbFNoYXJlc1N0b3JlAgt0b3RhbFNoYXJlcwALc3Rha2VkU3RvcmUCBnN0YWtlZAAFUkJhc2UAgICE/qbe4REAA2FwcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgkApQgBBQR0aGlzAgtfc3Rha2VyX2FwcgINbm8gc3Rha2VyX2FwcgANYmxvY2tzUGVyWWVhcgkAaAIJAGgCAO0CABgAPAAJUlBlckJsb2NrCQBrAwUDYXByBQVSQmFzZQkAaAIA6AcFDWJsb2Nrc1BlclllYXIAC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC3N0YWtlZFN0b3JlAAAADWN1cnJlbnRTdGFrZWQEDHN0YWtlZEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFzdGFrZWRIZWlnaHRTdG9yZQAABAFkCQBlAgUGSEVJR0hUBQxzdGFrZWRIZWlnaHQEAXIJAGQCBQVSQmFzZQkAaAIFAWQFCVJQZXJCbG9jawkAawMFC3RvdGFsU3Rha2VkBQFyBQVSQmFzZQELcHdyVG9TaGFyZXMBCXB3ckFtb3VudAQLdG90YWxTaGFyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQdG90YWxTaGFyZXNTdG9yZQAAAwkAAAIFC3RvdGFsU2hhcmVzAAAFCXB3ckFtb3VudAkAawMFCXB3ckFtb3VudAULdG90YWxTaGFyZXMFDWN1cnJlbnRTdGFrZWQBC3NoYXJlc1RvUHdyAQxzaGFyZXNBbW91bnQEC3RvdGFsU2hhcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEHRvdGFsU2hhcmVzU3RvcmUAAAMJAAACBQt0b3RhbFNoYXJlcwAABQxzaGFyZXNBbW91bnQJAGsDBQxzaGFyZXNBbW91bnQFDWN1cnJlbnRTdGFrZWQFC3RvdGFsU2hhcmVzARBlbnN1cmVQd3JCYWxhbmNlAQZhbW91bnQECnB3ckJhbGFuY2UJAPAHAgUEdGhpcwUKcHdyQXNzZXRJZAMJAGYCBQZhbW91bnQFCnB3ckJhbGFuY2UEBG1pbnQJAPwHBAUObWludGVyQ29udHJhY3QCBG1pbnQJAMwIAgkAZQIFBmFtb3VudAUKcHdyQmFsYW5jZQUDbmlsBQNuaWwDCQAAAgUEbWludAUEbWludAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwBBnBheW91dAIEdXNlcgZhbW91bnQEBmVuc3VyZQkBEGVuc3VyZVB3ckJhbGFuY2UBBQZhbW91bnQDCQAAAgUGZW5zdXJlBQZlbnN1cmUJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHVzZXIFBmFtb3VudAUKcHdyQXNzZXRJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKdXNlclNoYXJlcwEHYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPdXNlclNoYXJlc1N0b3JlAQUHYWRkcmVzcwAAAQZzdGFrZWQBB2FkZHJlc3MJAQtzaGFyZXNUb1B3cgEJAQp1c2VyU2hhcmVzAQUHYWRkcmVzcwEGYWR2aXNlAAQLdG90YWxTaGFyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQdG90YWxTaGFyZXNTdG9yZQAABAx0b3RhbFN0YWtlZDEJAQtzaGFyZXNUb1B3cgEFC3RvdGFsU2hhcmVzCQCsAgIJAKwCAgkArAICAghoZWlnaHQ6IAkApAMBBQZIRUlHSFQCDywgdG90YWxTdGFrZWQ6IAkApAMBBQx0b3RhbFN0YWtlZDEBCmFkdmlzZVVzZXIBBHVzZXIEBnNoYXJlcwkBCnVzZXJTaGFyZXMBBQR1c2VyBAlhdmFpbGFibGUJAQtzaGFyZXNUb1B3cgEFBnNoYXJlcwQMaGVpZ2h0QW5kQWNjCQCsAgIJAKwCAgkArAICAghoZWlnaHQ6IAkApAMBBQZIRUlHSFQCCywgYWNjb3VudDogBQR1c2VyAwkAAAIFBnNoYXJlcwAACQCsAgIJAKwCAgkArAICBQxoZWlnaHRBbmRBY2MCCywgc3Rha2VkOiAwAhIsIHN0YWtlX2hlaWdodDogLTECFCwgdW5zdGFrZV9oZWlnaHQ6IC0xCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQxoZWlnaHRBbmRBY2MCCiwgc3Rha2VkOiAJAKQDAQUJYXZhaWxhYmxlAhAsIHN0YWtlX2hlaWdodDogCQCkAwEJAQtzdGFrZUhlaWdodAEFBHVzZXICEiwgdW5zdGFrZV9oZWlnaHQ6IAkApAMBCQENdW5zdGFrZUhlaWdodAEFBHVzZXIBC3N0YWtlRm9ySW50AgdhZGRyZXNzAXADCQECIT0CCAUBcAdhc3NldElkBQpwd3JBc3NldElkCQACAQIQaW52YWxpZCBhc3NldCBpZAQKYWRkaXRpb25hbAgFAXAGYW1vdW50BAxzaGFyZXNBbW91bnQJAQtwd3JUb1NoYXJlcwEFCmFkZGl0aW9uYWwJAMwIAgkBCHdyaXRlSW50AgULc3Rha2VkU3RvcmUJAGQCBQ1jdXJyZW50U3Rha2VkBQphZGRpdGlvbmFsCQDMCAIJAQh3cml0ZUludAIFEXN0YWtlZEhlaWdodFN0b3JlBQZIRUlHSFQJAMwIAgkBCGNoYW5nZUJ5AgUQdG90YWxTaGFyZXNTdG9yZQUMc2hhcmVzQW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJAQ91c2VyU2hhcmVzU3RvcmUBBQdhZGRyZXNzBQxzaGFyZXNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtzdG9yZUhlaWdodAEJAQ91c2VyU2hhcmVzU3RvcmUBBQdhZGRyZXNzBQZIRUlHSFQFA25pbAYBaQEFc3Rha2UABAFhCQEHYWxsb3dlZAECBXN0YWtlAwkAAAIFAWEFAWEJAQtzdGFrZUZvckludAIJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc3Rha2VGb3IBB2FkZHJlc3MEAWEJAQdhbGxvd2VkAQIIc3Rha2VGb3IDCQAAAgUBYQUBYQMDCQECIT0CBQdhZGRyZXNzCQClCAEIBQFpDG9yaWdpbkNhbGxlcgkBASEBCQEIY29udGFpbnMCBRBzdGFraW5nQWRkcmVzc2VzCQClCAEIBQFpBmNhbGxlcgcJAAIBAgZkZW5pZWQJAQtzdGFrZUZvckludAIFB2FkZHJlc3MJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnN0YWtlAQlwd3JBbW91bnQEAWEJAQdhbGxvd2VkAQIHdW5zdGFrZQMJAAACBQFhBQFhBAdhY2NvdW50CQClCAEIBQFpBmNhbGxlcgMJAGYCCQENdW5zdGFrZUhlaWdodAEFB2FjY291bnQFBkhFSUdIVAkAAgECDHN0aWxsIGxvY2tlZAQGc2hhcmVzCQEKdXNlclNoYXJlcwEFB2FjY291bnQDCQAAAgUGc2hhcmVzAAAJAAIBAhJub3RoaW5nIHRvIHVuc3Rha2UEDG1heEF2YWlsYWJsZQkBC3NoYXJlc1RvUHdyAQUGc2hhcmVzBAZhbW91bnQDCQAAAgUJcHdyQW1vdW50AP///////////wEFDG1heEF2YWlsYWJsZQUJcHdyQW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIeY2Fubm90IHVuc3Rha2UgbmVnYXRpdmUgYW1vdW50AwkAZgIFBmFtb3VudAUMbWF4QXZhaWxhYmxlCQACAQIhY2Fubm90IHVuc3Rha2UgbW9yZSB0aGFuIHlvdSBoYXZlBAxzaGFyZXNBbW91bnQJAJcDAQkAzAgCCQELcHdyVG9TaGFyZXMBBQZhbW91bnQJAMwIAgUGc2hhcmVzBQNuaWwDCQAAAgUMc2hhcmVzQW1vdW50AAAJAAIBAhdjYW5ub3QgdW5zdGFrZSAwIHNoYXJlcwkAzAgCCQEId3JpdGVJbnQCBQtzdGFrZWRTdG9yZQkAZQIFDWN1cnJlbnRTdGFrZWQFBmFtb3VudAkAzAgCCQEId3JpdGVJbnQCBRFzdGFrZWRIZWlnaHRTdG9yZQUGSEVJR0hUCQDMCAIJAQhjaGFuZ2VCeQIFEHRvdGFsU2hhcmVzU3RvcmUJAQEtAQUMc2hhcmVzQW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJAQ91c2VyU2hhcmVzU3RvcmUBBQdhY2NvdW50CQEBLQEFDHNoYXJlc0Ftb3VudAkAzAgCCQEGcGF5b3V0AgUHYWNjb3VudAUGYW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJdXNlclBvd2VyAQdhZGRyZXNzCQCUCgIFA25pbAkBCnVzZXJTaGFyZXMBBQdhZGRyZXNzAWkBCnRvdGFsUG93ZXIACQCUCgIFA25pbAULdG90YWxTdGFrZWQBaQEEaW5pdAEEY29uZgkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFEmNvbmZpZ0FkZHJlc3NTdG9yZQUEY29uZgUDbmlsAN+y2e4=", "chainId": 87, "height": 3567114, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8KeJAT4FmrHhoZBhEnuqifRZDBXJ9PKZ4C1WM6RJmpDk Next: EnPoZD1ZfUJVB8aPQ8xjQw7zyCXpVvUkrx2wPo73Nxxi Diff:
OldNewDifferences
4343 func unstakeHeight (address) = (stakeHeight(address) + minLockTime)
4444
4545
46-let minSentinels = valueOrErrorMessage(getInteger(configAddress, "min_sentinels"), "min_sentinels not set")
47-
48-let sentinels = size(split(valueOrErrorMessage(getString(configAddress, "sentinels"), "no sentinels"), ","))
49-
5046 let slashers = valueOrElse(getString(configAddress, (toString(this) + "_slashers")), "")
5147
5248 let HEIGHT = height
6561
6662 let RPerBlock = fraction(apr, RBase, (1000 * blocksPerYear))
6763
64+let totalStaked = valueOrElse(getInteger(this, stakedStore), 0)
65+
6866 let currentStaked = {
6967 let stakedHeight = valueOrElse(getInteger(this, stakedHeightStore), 0)
70- let staked = valueOrElse(getInteger(this, stakedStore), 0)
7168 let d = (HEIGHT - stakedHeight)
7269 let r = (RBase + (d * RPerBlock))
73- fraction(staked, r, RBase)
70+ fraction(totalStaked, r, RBase)
7471 }
7572
7673 func pwrToShares (pwrAmount) = {
110107 }
111108
112109
113-func staked (address) = {
114- let userShares = valueOrElse(getInteger(this, userSharesStore(address)), 0)
115- sharesToPwr(userShares)
116- }
110+func userShares (address) = valueOrElse(getInteger(this, userSharesStore(address)), 0)
111+
112+
113+func staked (address) = sharesToPwr(userShares(address))
117114
118115
119116 func advise () = {
120117 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
121118 let totalStaked1 = sharesToPwr(totalShares)
122- ("totalStaked: " + toString(totalStaked1))
119+ ((("height: " + toString(HEIGHT)) + ", totalStaked: ") + toString(totalStaked1))
123120 }
124121
125122
126123 func adviseUser (user) = {
127- let userShares = valueOrElse(getInteger(this, userSharesStore(user)), 0)
128- let available = sharesToPwr(userShares)
124+ let shares = userShares(user)
125+ let available = sharesToPwr(shares)
129126 let heightAndAcc = ((("height: " + toString(HEIGHT)) + ", account: ") + user)
130- if ((userShares == 0))
127+ if ((shares == 0))
131128 then (((heightAndAcc + ", staked: 0") + ", stake_height: -1") + ", unstake_height: -1")
132129 else ((((((heightAndAcc + ", staked: ") + toString(available)) + ", stake_height: ") + toString(stakeHeight(user))) + ", unstake_height: ") + toString(unstakeHeight(user)))
133130 }
170167 func unstake (pwrAmount) = {
171168 let a = allowed("unstake")
172169 if ((a == a))
173- then if ((minSentinels > sentinels))
174- then throw("sentinels not elected yet")
175- else {
176- let account = toString(i.caller)
177- if ((unstakeHeight(account) > HEIGHT))
178- then throw("still locked")
179- else {
180- let userShares = valueOrElse(getInteger(userSharesStore(account)), 0)
181- if ((userShares == 0))
182- then throw("nothing to unstake")
183- else {
184- let maxAvailable = sharesToPwr(userShares)
185- let amount = if ((pwrAmount == -1))
186- then maxAvailable
187- else pwrAmount
188- if ((0 > amount))
189- then throw("cannot unstake negative amount")
190- else if ((amount > maxAvailable))
191- then throw("cannot unstake more than you have")
192- else {
193- let sharesAmount = min([pwrToShares(amount), userShares])
194- if ((sharesAmount == 0))
195- then throw("cannot unstake 0 shares")
196- else [writeInt(stakedStore, (currentStaked - amount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(sharesAmount)), changeBy(userSharesStore(account), -(sharesAmount)), payout(account, amount)]
197- }
198- }
199- }
200- }
170+ then {
171+ let account = toString(i.caller)
172+ if ((unstakeHeight(account) > HEIGHT))
173+ then throw("still locked")
174+ else {
175+ let shares = userShares(account)
176+ if ((shares == 0))
177+ then throw("nothing to unstake")
178+ else {
179+ let maxAvailable = sharesToPwr(shares)
180+ let amount = if ((pwrAmount == -1))
181+ then maxAvailable
182+ else pwrAmount
183+ if ((0 > amount))
184+ then throw("cannot unstake negative amount")
185+ else if ((amount > maxAvailable))
186+ then throw("cannot unstake more than you have")
187+ else {
188+ let sharesAmount = min([pwrToShares(amount), shares])
189+ if ((sharesAmount == 0))
190+ then throw("cannot unstake 0 shares")
191+ else [writeInt(stakedStore, (currentStaked - amount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(sharesAmount)), changeBy(userSharesStore(account), -(sharesAmount)), payout(account, amount)]
192+ }
193+ }
194+ }
195+ }
201196 else throw("Strict value is not equal to itself.")
202197 }
203198
204199
205200
206201 @Callable(i)
207-func userPower (address) = $Tuple2(nil, staked(address))
202+func userPower (address) = $Tuple2(nil, userShares(address))
208203
209204
210205
211206 @Callable(i)
212-func totalPower () = $Tuple2(nil, currentStaked)
207+func totalPower () = $Tuple2(nil, totalStaked)
213208
214209
215210
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
55 then StringEntry(key, value)
66 else throw(("already initialized: " + key))
77
88
99 func writeInt (key,value) = if ((0 > value))
1010 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1111 else IntegerEntry(key, value)
1212
1313
1414 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
1515
1616
1717 let configAddressStore = "config"
1818
1919 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "config address not found")), "invalid config address")
2020
2121 func allowed (op) = invoke(configAddress, "opAllowed", [op], nil)
2222
2323
2424 let pwrAssetIdStr = valueOrErrorMessage(getString(configAddress, "powerAssetId"), "pwr asset id not found")
2525
2626 let pwrAssetId = fromBase58String(pwrAssetIdStr)
2727
2828 let minterContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_minter"), "no contract_minter")), "invalid minter contract")
2929
3030 let stakingAddresses = valueOrElse(getString(configAddress, (toString(this) + "_stakers")), "")
3131
3232 let minLockTime = valueOrErrorMessage(getInteger(configAddress, (toString(this) + "_min_lock_time")), "min_lock_time not set")
3333
3434 func userSharesStore (user) = (user + "_shares")
3535
3636
3737 func storeHeight (store) = (store + "_height")
3838
3939
4040 func stakeHeight (address) = valueOrErrorMessage(getInteger(this, storeHeight(userSharesStore(address))), "no stake height")
4141
4242
4343 func unstakeHeight (address) = (stakeHeight(address) + minLockTime)
4444
4545
46-let minSentinels = valueOrErrorMessage(getInteger(configAddress, "min_sentinels"), "min_sentinels not set")
47-
48-let sentinels = size(split(valueOrErrorMessage(getString(configAddress, "sentinels"), "no sentinels"), ","))
49-
5046 let slashers = valueOrElse(getString(configAddress, (toString(this) + "_slashers")), "")
5147
5248 let HEIGHT = height
5349
5450 let stakedHeightStore = "stakedHeight"
5551
5652 let totalSharesStore = "totalShares"
5753
5854 let stakedStore = "staked"
5955
6056 let RBase = 10000000000000000
6157
6258 let apr = valueOrErrorMessage(getInteger(configAddress, (toString(this) + "_staker_apr")), "no staker_apr")
6359
6460 let blocksPerYear = ((365 * 24) * 60)
6561
6662 let RPerBlock = fraction(apr, RBase, (1000 * blocksPerYear))
6763
64+let totalStaked = valueOrElse(getInteger(this, stakedStore), 0)
65+
6866 let currentStaked = {
6967 let stakedHeight = valueOrElse(getInteger(this, stakedHeightStore), 0)
70- let staked = valueOrElse(getInteger(this, stakedStore), 0)
7168 let d = (HEIGHT - stakedHeight)
7269 let r = (RBase + (d * RPerBlock))
73- fraction(staked, r, RBase)
70+ fraction(totalStaked, r, RBase)
7471 }
7572
7673 func pwrToShares (pwrAmount) = {
7774 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
7875 if ((totalShares == 0))
7976 then pwrAmount
8077 else fraction(pwrAmount, totalShares, currentStaked)
8178 }
8279
8380
8481 func sharesToPwr (sharesAmount) = {
8582 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
8683 if ((totalShares == 0))
8784 then sharesAmount
8885 else fraction(sharesAmount, currentStaked, totalShares)
8986 }
9087
9188
9289 func ensurePwrBalance (amount) = {
9390 let pwrBalance = assetBalance(this, pwrAssetId)
9491 if ((amount > pwrBalance))
9592 then {
9693 let mint = invoke(minterContract, "mint", [(amount - pwrBalance)], nil)
9794 if ((mint == mint))
9895 then nil
9996 else throw("Strict value is not equal to itself.")
10097 }
10198 else nil
10299 }
103100
104101
105102 func payout (user,amount) = {
106103 let ensure = ensurePwrBalance(amount)
107104 if ((ensure == ensure))
108105 then ScriptTransfer(addressFromStringValue(user), amount, pwrAssetId)
109106 else throw("Strict value is not equal to itself.")
110107 }
111108
112109
113-func staked (address) = {
114- let userShares = valueOrElse(getInteger(this, userSharesStore(address)), 0)
115- sharesToPwr(userShares)
116- }
110+func userShares (address) = valueOrElse(getInteger(this, userSharesStore(address)), 0)
111+
112+
113+func staked (address) = sharesToPwr(userShares(address))
117114
118115
119116 func advise () = {
120117 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
121118 let totalStaked1 = sharesToPwr(totalShares)
122- ("totalStaked: " + toString(totalStaked1))
119+ ((("height: " + toString(HEIGHT)) + ", totalStaked: ") + toString(totalStaked1))
123120 }
124121
125122
126123 func adviseUser (user) = {
127- let userShares = valueOrElse(getInteger(this, userSharesStore(user)), 0)
128- let available = sharesToPwr(userShares)
124+ let shares = userShares(user)
125+ let available = sharesToPwr(shares)
129126 let heightAndAcc = ((("height: " + toString(HEIGHT)) + ", account: ") + user)
130- if ((userShares == 0))
127+ if ((shares == 0))
131128 then (((heightAndAcc + ", staked: 0") + ", stake_height: -1") + ", unstake_height: -1")
132129 else ((((((heightAndAcc + ", staked: ") + toString(available)) + ", stake_height: ") + toString(stakeHeight(user))) + ", unstake_height: ") + toString(unstakeHeight(user)))
133130 }
134131
135132
136133 func stakeForInt (address,p) = if ((p.assetId != pwrAssetId))
137134 then throw("invalid asset id")
138135 else {
139136 let additional = p.amount
140137 let sharesAmount = pwrToShares(additional)
141138 [writeInt(stakedStore, (currentStaked + additional)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, sharesAmount), changeBy(userSharesStore(address), sharesAmount), IntegerEntry(storeHeight(userSharesStore(address)), HEIGHT)]
142139 }
143140
144141
145142 @Callable(i)
146143 func stake () = {
147144 let a = allowed("stake")
148145 if ((a == a))
149146 then stakeForInt(toString(i.caller), i.payments[0])
150147 else throw("Strict value is not equal to itself.")
151148 }
152149
153150
154151
155152 @Callable(i)
156153 func stakeFor (address) = {
157154 let a = allowed("stakeFor")
158155 if ((a == a))
159156 then if (if ((address != toString(i.originCaller)))
160157 then !(contains(stakingAddresses, toString(i.caller)))
161158 else false)
162159 then throw("denied")
163160 else stakeForInt(address, i.payments[0])
164161 else throw("Strict value is not equal to itself.")
165162 }
166163
167164
168165
169166 @Callable(i)
170167 func unstake (pwrAmount) = {
171168 let a = allowed("unstake")
172169 if ((a == a))
173- then if ((minSentinels > sentinels))
174- then throw("sentinels not elected yet")
175- else {
176- let account = toString(i.caller)
177- if ((unstakeHeight(account) > HEIGHT))
178- then throw("still locked")
179- else {
180- let userShares = valueOrElse(getInteger(userSharesStore(account)), 0)
181- if ((userShares == 0))
182- then throw("nothing to unstake")
183- else {
184- let maxAvailable = sharesToPwr(userShares)
185- let amount = if ((pwrAmount == -1))
186- then maxAvailable
187- else pwrAmount
188- if ((0 > amount))
189- then throw("cannot unstake negative amount")
190- else if ((amount > maxAvailable))
191- then throw("cannot unstake more than you have")
192- else {
193- let sharesAmount = min([pwrToShares(amount), userShares])
194- if ((sharesAmount == 0))
195- then throw("cannot unstake 0 shares")
196- else [writeInt(stakedStore, (currentStaked - amount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(sharesAmount)), changeBy(userSharesStore(account), -(sharesAmount)), payout(account, amount)]
197- }
198- }
199- }
200- }
170+ then {
171+ let account = toString(i.caller)
172+ if ((unstakeHeight(account) > HEIGHT))
173+ then throw("still locked")
174+ else {
175+ let shares = userShares(account)
176+ if ((shares == 0))
177+ then throw("nothing to unstake")
178+ else {
179+ let maxAvailable = sharesToPwr(shares)
180+ let amount = if ((pwrAmount == -1))
181+ then maxAvailable
182+ else pwrAmount
183+ if ((0 > amount))
184+ then throw("cannot unstake negative amount")
185+ else if ((amount > maxAvailable))
186+ then throw("cannot unstake more than you have")
187+ else {
188+ let sharesAmount = min([pwrToShares(amount), shares])
189+ if ((sharesAmount == 0))
190+ then throw("cannot unstake 0 shares")
191+ else [writeInt(stakedStore, (currentStaked - amount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(sharesAmount)), changeBy(userSharesStore(account), -(sharesAmount)), payout(account, amount)]
192+ }
193+ }
194+ }
195+ }
201196 else throw("Strict value is not equal to itself.")
202197 }
203198
204199
205200
206201 @Callable(i)
207-func userPower (address) = $Tuple2(nil, staked(address))
202+func userPower (address) = $Tuple2(nil, userShares(address))
208203
209204
210205
211206 @Callable(i)
212-func totalPower () = $Tuple2(nil, currentStaked)
207+func totalPower () = $Tuple2(nil, totalStaked)
213208
214209
215210
216211 @Callable(i)
217212 func init (conf) = [writeConstString(configAddressStore, conf)]
218213
219214

github/deemru/w8io/6500d08 
38.79 ms