tx · 8KVacac9m7eKmZVAhyxYcahcpsa3ttdd5gPSwquDey4E

3P86ne9inVG1Cf4smrEGSdcXyBuEApPcMAc:  -0.00700000 Waves

2023.08.18 15:55 [3781738] smart account 3P86ne9inVG1Cf4smrEGSdcXyBuEApPcMAc > SELF 0.00000000 Waves

{ "type": 13, "id": "8KVacac9m7eKmZVAhyxYcahcpsa3ttdd5gPSwquDey4E", "fee": 700000, "feeAssetId": null, "timestamp": 1692363305246, "version": 1, "sender": "3P86ne9inVG1Cf4smrEGSdcXyBuEApPcMAc", "senderPublicKey": "6hjWe2YQdsZKtjcACiKTUMEGGnow19LjCF763eE2Tt91", "proofs": [ "2BiyfKuaYGMZEqHbp59bXKcVxjBysQcivjiSmaFPr7jKXkp2KuW6fGM9e1pBjcFNhkM4JniPuCJhE2iB47dopAAA" ], "script": "base64:BgIsCAISABIDCgEIEgMKAQgSAwoBARIECgIIARIDCgEIEgMKAQgSABIAEgMKAQgnARB3cml0ZUNvbnN0U3RyaW5nAgNrZXkFdmFsdWUDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFA2tleQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQkAAgEJAKwCAgIVYWxyZWFkeSBpbml0aWFsaXplZDogBQNrZXkBCHdyaXRlSW50AgNrZXkFdmFsdWUDCQBmAgAABQV2YWx1ZQkAAgEJAKwCAgkArAICCQCsAgICF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQCkAwEFBXZhbHVlAgkgZm9yIGtleSAFA2tleQkBDEludGVnZXJFbnRyeQIFA2tleQUFdmFsdWUBCGNoYW5nZUJ5AgNrZXkFdmFsdWUJAQh3cml0ZUludAIFA2tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAAFBXZhbHVlABJjb25maWdBZGRyZXNzU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRJjb25maWdBZGRyZXNzU3RvcmUCIXN0YWtpbmc6IGNvbmZpZyBhZGRyZXNzIG5vdCBmb3VuZAIWaW52YWxpZCBjb25maWcgYWRkcmVzcwEHYWxsb3dlZAECb3AJAPwHBAUNY29uZmlnQWRkcmVzcwIJb3BBbGxvd2VkCQDMCAIFAm9wBQNuaWwFA25pbAANcHdyQXNzZXRJZFN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHBvd2VyQXNzZXRJZAIWcHdyIGFzc2V0IGlkIG5vdCBmb3VuZAAKcHdyQXNzZXRJZAkA2QQBBQ1wd3JBc3NldElkU3RyAA5taW50ZXJDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAg9jb250cmFjdF9taW50ZXICEm5vIGNvbnRyYWN0X21pbnRlcgIXaW52YWxpZCBtaW50ZXIgY29udHJhY3QADW1haW5BZGRyZXNzZXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIObWFpbl9hZGRyZXNzZXMCAAALbWluTG9ja1RpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwIOX21pbl9sb2NrX3RpbWUCFW1pbl9sb2NrX3RpbWUgbm90IHNldAEPdXNlclNoYXJlc1N0b3JlAQR1c2VyCQCsAgIFBHVzZXICB19zaGFyZXMBC3N0b3JlSGVpZ2h0AQVzdG9yZQkArAICBQVzdG9yZQIHX2hlaWdodAEJc3RvcmVMb2NrAQVzdG9yZQkArAICBQVzdG9yZQIFX2xvY2sBC3N0YWtlSGVpZ2h0AQdhZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkBC3N0b3JlSGVpZ2h0AQkBD3VzZXJTaGFyZXNTdG9yZQEFB2FkZHJlc3MCD25vIHN0YWtlIGhlaWdodAEKbG9ja0hlaWdodAEHYWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEJc3RvcmVMb2NrAQkBD3VzZXJTaGFyZXNTdG9yZQEFB2FkZHJlc3MAAAEMdW5sb2NrSGVpZ2h0AQdhZGRyZXNzCQBkAgkBCmxvY2tIZWlnaHQBBQdhZGRyZXNzBQttaW5Mb2NrVGltZQENdW5zdGFrZUhlaWdodAEHYWRkcmVzcwkAZAIJAQtzdGFrZUhlaWdodAEFB2FkZHJlc3MFC21pbkxvY2tUaW1lAAhzbGFzaGVycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwIJX3NsYXNoZXJzAgAABkhFSUdIVAUGaGVpZ2h0ABFzdGFrZWRIZWlnaHRTdG9yZQIMc3Rha2VkSGVpZ2h0ABB0b3RhbFNoYXJlc1N0b3JlAgt0b3RhbFNoYXJlcwALc3Rha2VkU3RvcmUCBnN0YWtlZAAFUkJhc2UAgICE/qbe4REAA2FwcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgkApQgBBQR0aGlzAgtfc3Rha2VyX2FwcgINbm8gc3Rha2VyX2FwcgANYmxvY2tzUGVyWWVhcgkAaAIJAGgCAO0CABgAPAAJUlBlckJsb2NrCQBrAwUDYXByBQVSQmFzZQkAaAIA6AcFDWJsb2Nrc1BlclllYXIAC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC3N0YWtlZFN0b3JlAAAADWN1cnJlbnRTdGFrZWQEDHN0YWtlZEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFzdGFrZWRIZWlnaHRTdG9yZQAABAFkCQBlAgUGSEVJR0hUBQxzdGFrZWRIZWlnaHQEAXIJAGQCBQVSQmFzZQkAaAIFAWQFCVJQZXJCbG9jawkAawMFC3RvdGFsU3Rha2VkBQFyBQVSQmFzZQELcHdyVG9TaGFyZXMBCXB3ckFtb3VudAQLdG90YWxTaGFyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQdG90YWxTaGFyZXNTdG9yZQAAAwkAAAIFC3RvdGFsU2hhcmVzAAAFCXB3ckFtb3VudAkAawMFCXB3ckFtb3VudAULdG90YWxTaGFyZXMFDWN1cnJlbnRTdGFrZWQBC3NoYXJlc1RvUHdyAQxzaGFyZXNBbW91bnQEC3RvdGFsU2hhcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEHRvdGFsU2hhcmVzU3RvcmUAAAMJAAACBQt0b3RhbFNoYXJlcwAABQxzaGFyZXNBbW91bnQJAGsDBQxzaGFyZXNBbW91bnQFDWN1cnJlbnRTdGFrZWQFC3RvdGFsU2hhcmVzARBlbnN1cmVQd3JCYWxhbmNlAQZhbW91bnQECnB3ckJhbGFuY2UJAPAHAgUEdGhpcwUKcHdyQXNzZXRJZAMJAGYCBQZhbW91bnQFCnB3ckJhbGFuY2UEBG1pbnQJAPwHBAUObWludGVyQ29udHJhY3QCBG1pbnQJAMwIAgkAZQIFBmFtb3VudAUKcHdyQmFsYW5jZQUDbmlsBQNuaWwDCQAAAgUEbWludAUEbWludAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwBBnBheW91dAIEdXNlcgZhbW91bnQEBmVuc3VyZQkBEGVuc3VyZVB3ckJhbGFuY2UBBQZhbW91bnQDCQAAAgUGZW5zdXJlBQZlbnN1cmUJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHVzZXIFBmFtb3VudAUKcHdyQXNzZXRJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEGc2hhcmVzAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ91c2VyU2hhcmVzU3RvcmUBBQdhZGRyZXNzAAABBnN0YWtlZAEHYWRkcmVzcwkBC3NoYXJlc1RvUHdyAQkBBnNoYXJlcwEFB2FkZHJlc3MBBmFkdmlzZQAEC3RvdGFsU2hhcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEHRvdGFsU2hhcmVzU3RvcmUAAAQMdG90YWxTdGFrZWQxCQELc2hhcmVzVG9Qd3IBBQt0b3RhbFNoYXJlcwkArAICCQCsAgIJAKwCAgIIaGVpZ2h0OiAJAKQDAQUGSEVJR0hUAg8sIHRvdGFsU3Rha2VkOiAJAKQDAQUMdG90YWxTdGFrZWQxAQphZHZpc2VVc2VyAQR1c2VyBAdzaGFyZXMxCQEGc2hhcmVzAQUEdXNlcgQJYXZhaWxhYmxlCQELc2hhcmVzVG9Qd3IBBQdzaGFyZXMxBAxoZWlnaHRBbmRBY2MJAKwCAgkArAICCQCsAgICCGhlaWdodDogCQCkAwEFBkhFSUdIVAILLCBhY2NvdW50OiAFBHVzZXIDCQAAAgUHc2hhcmVzMQAACQCsAgIJAKwCAgkArAICBQxoZWlnaHRBbmRBY2MCCywgc3Rha2VkOiAwAhIsIHN0YWtlX2hlaWdodDogLTECFCwgdW5zdGFrZV9oZWlnaHQ6IC0xCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQxoZWlnaHRBbmRBY2MCCiwgc3Rha2VkOiAJAKQDAQUJYXZhaWxhYmxlAhAsIHN0YWtlX2hlaWdodDogCQCkAwEJAQtzdGFrZUhlaWdodAEFBHVzZXICEiwgdW5zdGFrZV9oZWlnaHQ6IAkApAMBCQENdW5zdGFrZUhlaWdodAEFBHVzZXIBC3N0YWtlRm9ySW50AgdhZGRyZXNzAXADCQECIT0CCAUBcAdhc3NldElkBQpwd3JBc3NldElkCQACAQIQaW52YWxpZCBhc3NldCBpZAQKYWRkaXRpb25hbAgFAXAGYW1vdW50BAxzaGFyZXNBbW91bnQJAQtwd3JUb1NoYXJlcwEFCmFkZGl0aW9uYWwJAMwIAgkBCHdyaXRlSW50AgULc3Rha2VkU3RvcmUJAGQCBQ1jdXJyZW50U3Rha2VkBQphZGRpdGlvbmFsCQDMCAIJAQh3cml0ZUludAIFEXN0YWtlZEhlaWdodFN0b3JlBQZIRUlHSFQJAMwIAgkBCGNoYW5nZUJ5AgUQdG90YWxTaGFyZXNTdG9yZQUMc2hhcmVzQW1vdW50CQDMCAIJAQhjaGFuZ2VCeQIJAQ91c2VyU2hhcmVzU3RvcmUBBQdhZGRyZXNzBQxzaGFyZXNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQtzdG9yZUhlaWdodAEJAQ91c2VyU2hhcmVzU3RvcmUBBQdhZGRyZXNzBQZIRUlHSFQFA25pbAEOdW5zdGFrZUZyb21JbnQDB2FkZHJlc3MNcGF5b3V0QWRkcmVzcwlwd3JBbW91bnQEB3NoYXJlczEJAQZzaGFyZXMBBQdhZGRyZXNzAwkAAAIFB3NoYXJlczEAAAkAAgECEm5vdGhpbmcgdG8gdW5zdGFrZQQMbWF4QXZhaWxhYmxlCQELc2hhcmVzVG9Qd3IBBQdzaGFyZXMxBAZhbW91bnQDCQAAAgUJcHdyQW1vdW50AP///////////wEFDG1heEF2YWlsYWJsZQUJcHdyQW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIeY2Fubm90IHVuc3Rha2UgbmVnYXRpdmUgYW1vdW50AwkAZgIFBmFtb3VudAUMbWF4QXZhaWxhYmxlCQACAQIhY2Fubm90IHVuc3Rha2UgbW9yZSB0aGFuIHlvdSBoYXZlBAxzaGFyZXNBbW91bnQJAJcDAQkAzAgCCQELcHdyVG9TaGFyZXMBBQZhbW91bnQJAMwIAgUHc2hhcmVzMQUDbmlsAwkAAAIFDHNoYXJlc0Ftb3VudAAACQACAQIXY2Fubm90IHVuc3Rha2UgMCBzaGFyZXMJAMwIAgkBCHdyaXRlSW50AgULc3Rha2VkU3RvcmUJAGUCBQ1jdXJyZW50U3Rha2VkBQZhbW91bnQJAMwIAgkBCHdyaXRlSW50AgURc3Rha2VkSGVpZ2h0U3RvcmUFBkhFSUdIVAkAzAgCCQEIY2hhbmdlQnkCBRB0b3RhbFNoYXJlc1N0b3JlCQEBLQEFDHNoYXJlc0Ftb3VudAkAzAgCCQEIY2hhbmdlQnkCCQEPdXNlclNoYXJlc1N0b3JlAQUHYWRkcmVzcwkBAS0BBQxzaGFyZXNBbW91bnQJAMwIAgkBBnBheW91dAIFDXBheW91dEFkZHJlc3MFBmFtb3VudAUDbmlsCgFpAQVzdGFrZQAEAWEJAQdhbGxvd2VkAQIFc3Rha2UDCQAAAgUBYQUBYQkBC3N0YWtlRm9ySW50AgkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzdGFrZUZvcgEHYWRkcmVzcwQBYQkBB2FsbG93ZWQBAghzdGFrZUZvcgMJAAACBQFhBQFhAwMJAQIhPQIFB2FkZHJlc3MJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQEBIQEJAQhjb250YWlucwIFDW1haW5BZGRyZXNzZXMJAKUIAQgFAWkGY2FsbGVyBwkAAgECBmRlbmllZAkBC3N0YWtlRm9ySW50AgUHYWRkcmVzcwkAkQMCCAUBaQhwYXltZW50cwAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnJlc3Rha2VGb3IBB2FkZHJlc3MEAWEJAQdhbGxvd2VkAQIKcmVzdGFrZUZvcgMJAAACBQFhBQFhAwkBASEBCQEIY29udGFpbnMCBQ1tYWluQWRkcmVzc2VzCQClCAEIBQFpBmNhbGxlcgkAAgECBmRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCXN0b3JlTG9jawEJAQ91c2VyU2hhcmVzU3RvcmUBBQdhZGRyZXNzBQZIRUlHSFQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnN0YWtlAQlwd3JBbW91bnQEAWEJAQdhbGxvd2VkAQIHdW5zdGFrZQMJAAACBQFhBQFhBAdhY2NvdW50CQClCAEIBQFpBmNhbGxlcgMJAGYCCQENdW5zdGFrZUhlaWdodAEFB2FjY291bnQFBkhFSUdIVAkAAgECF3N0aWxsIGxvY2tlZCBpbiBzdGFraW5nAwkAZgIJAQx1bmxvY2tIZWlnaHQBBQdhY2NvdW50BQZIRUlHSFQJAAIBAhZzdGlsbCBsb2NrZWQgaW4gdm90aW5nCQEOdW5zdGFrZUZyb21JbnQDBQdhY2NvdW50BQdhY2NvdW50BQlwd3JBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdW5zdGFrZUZyb20CB2FkZHJlc3MJcHdyQW1vdW50BAFhCQEHYWxsb3dlZAECC3Vuc3Rha2VGcm9tAwkAAAIFAWEFAWEECXBheW91dEFkcgkApQgBCAUBaQZjYWxsZXIDCQEBIQEJAQhjb250YWlucwIFDW1haW5BZGRyZXNzZXMFCXBheW91dEFkcgkAAgECBmRlbmllZAkBDnVuc3Rha2VGcm9tSW50AwUHYWRkcmVzcwUJcGF5b3V0QWRyBQlwd3JBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKdXNlclNoYXJlcwEHYWRkcmVzcwkAlAoCBQNuaWwJAQZzaGFyZXMBBQdhZGRyZXNzAWkBCXVzZXJQb3dlcgEHYWRkcmVzcwkAlAoCBQNuaWwJAQZzdGFrZWQBBQdhZGRyZXNzAWkBCnRvdGFsUG93ZXIACQCUCgIFA25pbAUNY3VycmVudFN0YWtlZAFpAQt0b3RhbFNoYXJlcwAJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCfCAEFEHRvdGFsU2hhcmVzU3RvcmUAAAFpAQRpbml0AQRjb25mCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgUSY29uZmlnQWRkcmVzc1N0b3JlBQRjb25mBQNuaWwAdE6KGA==", "chainId": 87, "height": 3781738, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CmDFvYjc4t2eKh83pJWUoLYRLMbZJa6rGU93pXjSrTMp Next: H2MMdyc8u9b2f4XCy8Boqx1ouR31Uj7M1VrmqijKMVaV Diff:
OldNewDifferences
3737 func storeHeight (store) = (store + "_height")
3838
3939
40+func storeLock (store) = (store + "_lock")
41+
42+
4043 func stakeHeight (address) = valueOrErrorMessage(getInteger(this, storeHeight(userSharesStore(address))), "no stake height")
44+
45+
46+func lockHeight (address) = valueOrElse(getInteger(this, storeLock(userSharesStore(address))), 0)
47+
48+
49+func unlockHeight (address) = (lockHeight(address) + minLockTime)
4150
4251
4352 func unstakeHeight (address) = (stakeHeight(address) + minLockTime)
192201 if ((a == a))
193202 then if (!(contains(mainAddresses, toString(i.caller))))
194203 then throw("denied")
195- else [writeInt(stakedHeightStore, HEIGHT)]
204+ else [IntegerEntry(storeLock(userSharesStore(address)), HEIGHT)]
196205 else throw("Strict value is not equal to itself.")
197206 }
198207
205214 then {
206215 let account = toString(i.caller)
207216 if ((unstakeHeight(account) > HEIGHT))
208- then throw("still locked")
209- else unstakeFromInt(account, account, pwrAmount)
217+ then throw("still locked in staking")
218+ else if ((unlockHeight(account) > HEIGHT))
219+ then throw("still locked in voting")
220+ else unstakeFromInt(account, account, pwrAmount)
210221 }
211222 else throw("Strict value is not equal to itself.")
212223 }
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), "staking: 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 mainAddresses = valueOrElse(getString(configAddress, "main_addresses"), "")
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
40+func storeLock (store) = (store + "_lock")
41+
42+
4043 func stakeHeight (address) = valueOrErrorMessage(getInteger(this, storeHeight(userSharesStore(address))), "no stake height")
44+
45+
46+func lockHeight (address) = valueOrElse(getInteger(this, storeLock(userSharesStore(address))), 0)
47+
48+
49+func unlockHeight (address) = (lockHeight(address) + minLockTime)
4150
4251
4352 func unstakeHeight (address) = (stakeHeight(address) + minLockTime)
4453
4554
4655 let slashers = valueOrElse(getString(configAddress, (toString(this) + "_slashers")), "")
4756
4857 let HEIGHT = height
4958
5059 let stakedHeightStore = "stakedHeight"
5160
5261 let totalSharesStore = "totalShares"
5362
5463 let stakedStore = "staked"
5564
5665 let RBase = 10000000000000000
5766
5867 let apr = valueOrErrorMessage(getInteger(configAddress, (toString(this) + "_staker_apr")), "no staker_apr")
5968
6069 let blocksPerYear = ((365 * 24) * 60)
6170
6271 let RPerBlock = fraction(apr, RBase, (1000 * blocksPerYear))
6372
6473 let totalStaked = valueOrElse(getInteger(this, stakedStore), 0)
6574
6675 let currentStaked = {
6776 let stakedHeight = valueOrElse(getInteger(this, stakedHeightStore), 0)
6877 let d = (HEIGHT - stakedHeight)
6978 let r = (RBase + (d * RPerBlock))
7079 fraction(totalStaked, r, RBase)
7180 }
7281
7382 func pwrToShares (pwrAmount) = {
7483 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
7584 if ((totalShares == 0))
7685 then pwrAmount
7786 else fraction(pwrAmount, totalShares, currentStaked)
7887 }
7988
8089
8190 func sharesToPwr (sharesAmount) = {
8291 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
8392 if ((totalShares == 0))
8493 then sharesAmount
8594 else fraction(sharesAmount, currentStaked, totalShares)
8695 }
8796
8897
8998 func ensurePwrBalance (amount) = {
9099 let pwrBalance = assetBalance(this, pwrAssetId)
91100 if ((amount > pwrBalance))
92101 then {
93102 let mint = invoke(minterContract, "mint", [(amount - pwrBalance)], nil)
94103 if ((mint == mint))
95104 then nil
96105 else throw("Strict value is not equal to itself.")
97106 }
98107 else nil
99108 }
100109
101110
102111 func payout (user,amount) = {
103112 let ensure = ensurePwrBalance(amount)
104113 if ((ensure == ensure))
105114 then ScriptTransfer(addressFromStringValue(user), amount, pwrAssetId)
106115 else throw("Strict value is not equal to itself.")
107116 }
108117
109118
110119 func shares (address) = valueOrElse(getInteger(this, userSharesStore(address)), 0)
111120
112121
113122 func staked (address) = sharesToPwr(shares(address))
114123
115124
116125 func advise () = {
117126 let totalShares = valueOrElse(getInteger(this, totalSharesStore), 0)
118127 let totalStaked1 = sharesToPwr(totalShares)
119128 ((("height: " + toString(HEIGHT)) + ", totalStaked: ") + toString(totalStaked1))
120129 }
121130
122131
123132 func adviseUser (user) = {
124133 let shares1 = shares(user)
125134 let available = sharesToPwr(shares1)
126135 let heightAndAcc = ((("height: " + toString(HEIGHT)) + ", account: ") + user)
127136 if ((shares1 == 0))
128137 then (((heightAndAcc + ", staked: 0") + ", stake_height: -1") + ", unstake_height: -1")
129138 else ((((((heightAndAcc + ", staked: ") + toString(available)) + ", stake_height: ") + toString(stakeHeight(user))) + ", unstake_height: ") + toString(unstakeHeight(user)))
130139 }
131140
132141
133142 func stakeForInt (address,p) = if ((p.assetId != pwrAssetId))
134143 then throw("invalid asset id")
135144 else {
136145 let additional = p.amount
137146 let sharesAmount = pwrToShares(additional)
138147 [writeInt(stakedStore, (currentStaked + additional)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, sharesAmount), changeBy(userSharesStore(address), sharesAmount), IntegerEntry(storeHeight(userSharesStore(address)), HEIGHT)]
139148 }
140149
141150
142151 func unstakeFromInt (address,payoutAddress,pwrAmount) = {
143152 let shares1 = shares(address)
144153 if ((shares1 == 0))
145154 then throw("nothing to unstake")
146155 else {
147156 let maxAvailable = sharesToPwr(shares1)
148157 let amount = if ((pwrAmount == -1))
149158 then maxAvailable
150159 else pwrAmount
151160 if ((0 > amount))
152161 then throw("cannot unstake negative amount")
153162 else if ((amount > maxAvailable))
154163 then throw("cannot unstake more than you have")
155164 else {
156165 let sharesAmount = min([pwrToShares(amount), shares1])
157166 if ((sharesAmount == 0))
158167 then throw("cannot unstake 0 shares")
159168 else [writeInt(stakedStore, (currentStaked - amount)), writeInt(stakedHeightStore, HEIGHT), changeBy(totalSharesStore, -(sharesAmount)), changeBy(userSharesStore(address), -(sharesAmount)), payout(payoutAddress, amount)]
160169 }
161170 }
162171 }
163172
164173
165174 @Callable(i)
166175 func stake () = {
167176 let a = allowed("stake")
168177 if ((a == a))
169178 then stakeForInt(toString(i.caller), i.payments[0])
170179 else throw("Strict value is not equal to itself.")
171180 }
172181
173182
174183
175184 @Callable(i)
176185 func stakeFor (address) = {
177186 let a = allowed("stakeFor")
178187 if ((a == a))
179188 then if (if ((address != toString(i.originCaller)))
180189 then !(contains(mainAddresses, toString(i.caller)))
181190 else false)
182191 then throw("denied")
183192 else stakeForInt(address, i.payments[0])
184193 else throw("Strict value is not equal to itself.")
185194 }
186195
187196
188197
189198 @Callable(i)
190199 func restakeFor (address) = {
191200 let a = allowed("restakeFor")
192201 if ((a == a))
193202 then if (!(contains(mainAddresses, toString(i.caller))))
194203 then throw("denied")
195- else [writeInt(stakedHeightStore, HEIGHT)]
204+ else [IntegerEntry(storeLock(userSharesStore(address)), HEIGHT)]
196205 else throw("Strict value is not equal to itself.")
197206 }
198207
199208
200209
201210 @Callable(i)
202211 func unstake (pwrAmount) = {
203212 let a = allowed("unstake")
204213 if ((a == a))
205214 then {
206215 let account = toString(i.caller)
207216 if ((unstakeHeight(account) > HEIGHT))
208- then throw("still locked")
209- else unstakeFromInt(account, account, pwrAmount)
217+ then throw("still locked in staking")
218+ else if ((unlockHeight(account) > HEIGHT))
219+ then throw("still locked in voting")
220+ else unstakeFromInt(account, account, pwrAmount)
210221 }
211222 else throw("Strict value is not equal to itself.")
212223 }
213224
214225
215226
216227 @Callable(i)
217228 func unstakeFrom (address,pwrAmount) = {
218229 let a = allowed("unstakeFrom")
219230 if ((a == a))
220231 then {
221232 let payoutAdr = toString(i.caller)
222233 if (!(contains(mainAddresses, payoutAdr)))
223234 then throw("denied")
224235 else unstakeFromInt(address, payoutAdr, pwrAmount)
225236 }
226237 else throw("Strict value is not equal to itself.")
227238 }
228239
229240
230241
231242 @Callable(i)
232243 func userShares (address) = $Tuple2(nil, shares(address))
233244
234245
235246
236247 @Callable(i)
237248 func userPower (address) = $Tuple2(nil, staked(address))
238249
239250
240251
241252 @Callable(i)
242253 func totalPower () = $Tuple2(nil, currentStaked)
243254
244255
245256
246257 @Callable(i)
247258 func totalShares () = $Tuple2(nil, valueOrElse(getInteger(totalSharesStore), 0))
248259
249260
250261
251262 @Callable(i)
252263 func init (conf) = [writeConstString(configAddressStore, conf)]
253264
254265

github/deemru/w8io/6500d08 
31.88 ms