tx · 6i7xMng8mkhb4mekPKXfVms8LGm9mNMASFSiaP7JoUEL

3P7jrtZsbrDVZFcF8AgmpJ8qQxRAzxCNsit:  -0.00600000 Waves

2023.09.12 15:25 [3817935] smart account 3P7jrtZsbrDVZFcF8AgmpJ8qQxRAzxCNsit > SELF 0.00000000 Waves

{ "type": 13, "id": "6i7xMng8mkhb4mekPKXfVms8LGm9mNMASFSiaP7JoUEL", "fee": 600000, "feeAssetId": null, "timestamp": 1694521433631, "version": 1, "sender": "3P7jrtZsbrDVZFcF8AgmpJ8qQxRAzxCNsit", "senderPublicKey": "7jQAY4oPmY68S5ehfbKJcpYKYoUcTTRtQYvHWmCjp8kD", "proofs": [ "3j8z4Ti3f3nYuahZB2zUj3i4yNEvuy9KgygtdrbgqDNt3wc6Dcf7vNjg9JtF6WRvRYkJi66Lbi8yrLdsz8YiazKV" ], "script": "base64:BgIYCAISBAoCCAESAwoBARIAEgASABIDCgEIHwASY29uZmlnQWRkcmVzc1N0b3JlAg1jb25maWdBZGRyZXNzAA1jb25maWdBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFEmNvbmZpZ0FkZHJlc3NTdG9yZQIgdm90aW5nIHJld2FyZHM6IG5vIGNvbmZpZ0FkZHJlc3MCFmludmFsaWQgY29uZmlnIGFkZHJlc3MAD3N0YWtpbmdDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhBjb250cmFjdF9zdGFraW5nAhNubyBzdGFraW5nX2NvbnRyYWN0AhhpbnZhbGlkIHN0YWtpbmcgY29udHJhY3QADm1pbnRlckNvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCD2NvbnRyYWN0X21pbnRlcgISbm8gY29udHJhY3RfbWludGVyAhdpbnZhbGlkIG1pbnRlciBjb250cmFjdAAKcHdyQXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIMcG93ZXJBc3NldElkAhZwd3IgYXNzZXQgaWQgbm90IGZvdW5kAQh3cml0ZUludAIDa2V5BXZhbHVlAwkAZgIAAAUFdmFsdWUJAAIBCQCsAgIJAKwCAgkArAICAhd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkApAMBBQV2YWx1ZQIJIGZvciBrZXkgBQNrZXkJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlARB3cml0ZUNvbnN0U3RyaW5nAgNrZXkFdmFsdWUDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFA2tleQkBC1N0cmluZ0VudHJ5AgUDa2V5BQV2YWx1ZQkAAgEJAKwCAgIVYWxyZWFkeSBpbml0aWFsaXplZDogBQNrZXkBDXdyaXRlQ29uc3RJbnQCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwUDa2V5CQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQkAAgEJAKwCAgIQYWxyZWFkeSBleGlzdHM6IAUDa2V5AQhjaGFuZ2VCeQIDa2V5BXZhbHVlCQEId3JpdGVJbnQCBQNrZXkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAABQV2YWx1ZQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEJb3BBbGxvd2VkAQJvcAQBYQkA/AcEBQ1jb25maWdBZGRyZXNzAglvcEFsbG93ZWQJAMwIAgUCb3AFA25pbAUDbmlsAwkAAAIFAWEFAWEGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAZIRUlHSFQFBmhlaWdodAAPdm90aW5nRW5kc1N0b3JlAgt2b3RpbmdfZW5kcwAKZXBvY2hTdG9yZQIFZXBvY2gABWVwb2NoCQELdmFsdWVPckVsc2UCCQCfCAEFCmVwb2NoU3RvcmUAAAENZXBvY2hBcHJTdG9yZQEBZQkArAICCQCsAgICBmVwb2NoXwkApAMBBQFlAgRfYXByAQ9lcG9jaFBvd2VyU3RvcmUBAWUJAKwCAgkArAICAgZlcG9jaF8JAKQDAQUBZQIGX3Bvd2VyARBlcG9jaEhlaWdodFN0b3JlAQFlCQCsAgIJAKwCAgIGZXBvY2hfCQCkAwEFAWUCB19oZWlnaHQADmVwb2NoTWluQmxvY2tzCQELdmFsdWVPckVsc2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgkApQgBBQR0aGlzAhFfZXBvY2hfbWluX2Jsb2NrcwkAaAIAoAsADgAQdm90aW5nUmV3YXJkc0FwcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIJAKUIAQUEdGhpcwITX3ZvdGluZ19yZXdhcmRzX2FwcgC5AQAHQXByQmFzZQDoBwAFUkJhc2UAgICE/qbe4READWJsb2Nrc1BlclllYXIJAGgCCQBoAgDtAgAYADwBD3RvdGFsVm90ZXNTdG9yZQEBZQkArAICCQCsAgICBmVwb2NoXwkApAMBBQFlAgxfdG90YWxfdm90ZXMBDnVzZXJWb3Rlc1N0b3JlAgFlBHVzZXIJAKwCAgkArAICCQCsAgICBmVwb2NoXwkApAMBBQFlAgxfdXNlcl92b3Rlc18FBHVzZXIBFW5leHRDbGFpbWVkRXBvY2hTdG9yZQEEdXNlcgkArAICAhNuZXh0X2NsYWltZWRfZXBvY2hfBQR1c2VyARB1c2VyQ2xhaW1lZFN0b3JlAQR1c2VyCQCsAgICCGNsYWltZWRfBQR1c2VyARB0b3RhbFBvd2VyU3Rha2VkAAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCCnRvdGFsUG93ZXIFA25pbAUDbmlsAQxlcG9jaFJld2FyZHMDBHVzZXIBZQ9uZXh0RXBvY2hIZWlnaHQEBXRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEJAQ90b3RhbFZvdGVzU3RvcmUBBQFlAAADCQAAAgUFdG90YWwAAAAABAl1c2VyVm90ZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDnVzZXJWb3Rlc1N0b3JlAgUBZQUEdXNlcgAABAlSVXNlclBhcnQJAGsDBQl1c2VyVm90ZXMFBVJCYXNlBQV0b3RhbAQLZXBvY2hIZWlnaHQJAJ8IAQkBEGVwb2NoSGVpZ2h0U3RvcmUBBQFlAwkBASEBCQEJaXNEZWZpbmVkAQULZXBvY2hIZWlnaHQAAAQGYmxvY2tzCQBlAgUPbmV4dEVwb2NoSGVpZ2h0CQEFdmFsdWUBBQtlcG9jaEhlaWdodAMJAAACBQZibG9ja3MAAAAABANhcHIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ1lcG9jaEFwclN0b3JlAQUBZQQFcG93ZXIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ9lcG9jaFBvd2VyU3RvcmUBBQFlBAx0b3RhbFJld2FyZHMJAGsDBQVwb3dlcgkAaAIFBmJsb2NrcwUDYXByCQBoAgUHQXByQmFzZQUNYmxvY2tzUGVyWWVhcgkAawMFDHRvdGFsUmV3YXJkcwUJUlVzZXJQYXJ0BQVSQmFzZQEJY2xhaW1hYmxlAQR1c2VyBBBuZXh0Q2xhaW1lZEVwb2NoCQELdmFsdWVPckVsc2UCCQCfCAEJARVuZXh0Q2xhaW1lZEVwb2NoU3RvcmUBBQR1c2VyAAAKAQRmb2xkAgNhY2MDbmFfBAskdDAzNDc0MzQ5MgUDYWNjBAFlCAULJHQwMzQ3NDM0OTICXzEEA3N1bQgFCyR0MDM0NzQzNDkyAl8yBAV0b3RhbAkAnwgBCQEPdG90YWxWb3Rlc1N0b3JlAQUBZQMJAQEhAQkBCWlzRGVmaW5lZAEFBXRvdGFsBQNhY2MECnRvdGFsVmFsdWUJAQV2YWx1ZQEFBXRvdGFsBAluZXh0RXBvY2gJAGQCBQFlAAEDCQAAAgUKdG90YWxWYWx1ZQAACQCUCgIFCW5leHRFcG9jaAUDc3VtBAl1c2VyVm90ZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDnVzZXJWb3Rlc1N0b3JlAgUBZQUEdXNlcgAABAlSVXNlclBhcnQJAGsDBQl1c2VyVm90ZXMFBVJCYXNlBQp0b3RhbFZhbHVlBAtlcG9jaEhlaWdodAkAnwgBCQEQZXBvY2hIZWlnaHRTdG9yZQEFAWUED25leHRFcG9jaEhlaWdodAkAnwgBCQEQZXBvY2hIZWlnaHRTdG9yZQEFCW5leHRFcG9jaAMDCQEBIQEJAQlpc0RlZmluZWQBBQtlcG9jaEhlaWdodAYJAQEhAQkBCWlzRGVmaW5lZAEFD25leHRFcG9jaEhlaWdodAUDYWNjBAZibG9ja3MJAGUCCQEFdmFsdWUBBQ9uZXh0RXBvY2hIZWlnaHQJAQV2YWx1ZQEFC2Vwb2NoSGVpZ2h0BANhcHIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ1lcG9jaEFwclN0b3JlAQUBZQQFcG93ZXIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ9lcG9jaFBvd2VyU3RvcmUBBQFlBAx0b3RhbFJld2FyZHMJAGsDBQVwb3dlcgkAaAIFBmJsb2NrcwUDYXByCQBoAgUHQXByQmFzZQUNYmxvY2tzUGVyWWVhcgQLdXNlclJld2FyZHMJAGsDBQx0b3RhbFJld2FyZHMFCVJVc2VyUGFydAUFUkJhc2UJAJQKAgUJbmV4dEVwb2NoCQBkAgUDc3VtBQt1c2VyUmV3YXJkcwoAAiRsCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwkAzAgCABQFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABRBuZXh0Q2xhaW1lZEVwb2NoCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBCmFkdmlzZVVzZXIBB2FkZHJlc3MECyR0MDQ2MDM0NjUyCQEJY2xhaW1hYmxlAQUHYWRkcmVzcwQJbmV4dEVwb2NoCAULJHQwNDYwMzQ2NTICXzEECmNsYWltYWJsZTEIBQskdDA0NjAzNDY1MgJfMgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIIaGVpZ2h0OiAJAKQDAQUGSEVJR0hUAg0sIGNsYWltYWJsZTogCQCkAwEFCmNsYWltYWJsZTECESwgY2xhaW1hYmxlX3RpbGw6CQCkAwEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEGVwb2NoSGVpZ2h0U3RvcmUBBQluZXh0RXBvY2gA////////////AQILLCBjbGFpbWVkOiAJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEQdXNlckNsYWltZWRTdG9yZQEFB2FkZHJlc3MAAAILLCBwZW5kaW5nOiAJAKQDAQkBDGVwb2NoUmV3YXJkcwMFB2FkZHJlc3MFBWVwb2NoBQZIRUlHSFQGAWkBCWNvdW50Vm90ZQIEdXNlcgV2b3RlcwkAzAgCCQEIY2hhbmdlQnkCCQEPdG90YWxWb3Rlc1N0b3JlAQUFZXBvY2gFBXZvdGVzCQDMCAIJAQhjaGFuZ2VCeQIJAQ51c2VyVm90ZXNTdG9yZQIFBWVwb2NoBQR1c2VyBQV2b3RlcwUDbmlsAWkBCnZvdGluZ0VuZHMBAWgDCQBmAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ92b3RpbmdFbmRzU3RvcmUAAAUBaAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ92b3RpbmdFbmRzU3RvcmUFAWgFA25pbAFpAQxpbml0aWFsRXBvY2gACQDMCAIJAQ13cml0ZUNvbnN0SW50AgUKZXBvY2hTdG9yZQAACQDMCAIJAQ13cml0ZUNvbnN0SW50AgkBEGVwb2NoSGVpZ2h0U3RvcmUBAAAAxrPoAQkAzAgCCQENd3JpdGVDb25zdEludAIJAQ1lcG9jaEFwclN0b3JlAQAABRB2b3RpbmdSZXdhcmRzQXByCQDMCAIJAQ13cml0ZUNvbnN0SW50AgkBD2Vwb2NoUG93ZXJTdG9yZQEAAAkBEHRvdGFsUG93ZXJTdGFrZWQABQNuaWwBaQEJbmV4dEVwb2NoAAQGY2hlY2tzCQEJb3BBbGxvd2VkAQIgdm90aW5nX3Jld2FyZHNfbmV4dF9lcG9jaF9wYXVzZWQDCQAAAgUGY2hlY2tzBQZjaGVja3MDCQBmAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ92b3RpbmdFbmRzU3RvcmUAAAUGSEVJR0hUCQACAQIbdm90aW5nIGlzIGFjdGl2ZS4gdHJ5IGxhdGVyAwkAZgIJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARBlcG9jaEhlaWdodFN0b3JlAQUFZXBvY2gAAAUOZXBvY2hNaW5CbG9ja3MFBkhFSUdIVAkAAgECCXRvbyBlYXJseQQIbmV3RXBvY2gJAGQCBQVlcG9jaAABCQDMCAIJAQhjaGFuZ2VCeQIJAQ90b3RhbFZvdGVzU3RvcmUBBQVlcG9jaAAACQDMCAIJAQh3cml0ZUludAIFCmVwb2NoU3RvcmUFCG5ld0Vwb2NoCQDMCAIJAQ13cml0ZUNvbnN0SW50AgkBEGVwb2NoSGVpZ2h0U3RvcmUBBQhuZXdFcG9jaAUGSEVJR0hUCQDMCAIJAQ13cml0ZUNvbnN0SW50AgkBDWVwb2NoQXByU3RvcmUBBQhuZXdFcG9jaAUQdm90aW5nUmV3YXJkc0FwcgkAzAgCCQENd3JpdGVDb25zdEludAIJAQ9lcG9jaFBvd2VyU3RvcmUBBQhuZXdFcG9jaAkBEHRvdGFsUG93ZXJTdGFrZWQABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0ABAZjaGVja3MJAQlvcEFsbG93ZWQBAht2b3RpbmdfcmV3YXJkc19jbGFpbV9wYXVzZWQDCQAAAgUGY2hlY2tzBQZjaGVja3MEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAskdDA2MzQ3NjU3MAkBCWNsYWltYWJsZQEFBHVzZXIEE25ld05leHRDbGFpbWVkRXBvY2gIBQskdDA2MzQ3NjU3MAJfMQQHcmV3YXJkcwgFCyR0MDYzNDc2NTcwAl8yCQDMCAIJAQh3cml0ZUludAIJARVuZXh0Q2xhaW1lZEVwb2NoU3RvcmUBBQR1c2VyBRNuZXdOZXh0Q2xhaW1lZEVwb2NoCQDMCAIJAQhjaGFuZ2VCeQIJARB1c2VyQ2xhaW1lZFN0b3JlAQUEdXNlcgUHcmV3YXJkcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBGluaXQBBmNvbmZpZwkAzAgCCQEQd3JpdGVDb25zdFN0cmluZwIFEmNvbmZpZ0FkZHJlc3NTdG9yZQUGY29uZmlnBQNuaWwA4vNIrw==", "chainId": 87, "height": 3817935, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: J7oD1p8xudgnN3EtkDzKkPNEcinPxyMhVfBTyRZY14jv Next: AcJUmqbKU5rdASQSatyKku8N5Me3dqsoRUW8PnRCAgSz Diff:
OldNewDifferences
44 let configAddressStore = "configAddress"
55
66 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "voting rewards: no configAddress")), "invalid config address")
7-
8-let HEIGHT = height
97
108 let stakingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_staking"), "no staking_contract")), "invalid staking contract")
119
4745 }
4846
4947
48+let HEIGHT = height
49+
5050 let votingEndsStore = "voting_ends"
5151
5252 let epochStore = "epoch"
6262 func epochHeightStore (e) = (("epoch_" + toString(e)) + "_height")
6363
6464
65-let epochMinBlocks = valueOrElse(getInteger(configAddress, (toString(this) + "_epoch_min_blocks")), (1440 * 7))
65+let epochMinBlocks = valueOrElse(getInteger(configAddress, (toString(this) + "_epoch_min_blocks")), (1440 * 14))
6666
6767 let votingRewardsApr = valueOrElse(getInteger(configAddress, (toString(this) + "_voting_rewards_apr")), 185)
6868
9898 if (!(isDefined(epochHeight)))
9999 then 0
100100 else {
101- let blocks = (value(nextEpochHeight) - value(epochHeight))
102- let apr = getIntegerValue(epochAprStore(e))
103- let power = getIntegerValue(epochPowerStore(e))
104- let totalRewards = fraction(power, (blocks * apr), (AprBase * blocksPerYear))
105- fraction(totalRewards, RUserPart, RBase)
101+ let blocks = (nextEpochHeight - value(epochHeight))
102+ if ((blocks == 0))
103+ then 0
104+ else {
105+ let apr = getIntegerValue(epochAprStore(e))
106+ let power = getIntegerValue(epochPowerStore(e))
107+ let totalRewards = fraction(power, (blocks * apr), (AprBase * blocksPerYear))
108+ fraction(totalRewards, RUserPart, RBase)
109+ }
106110 }
107111 }
108112 }
111115 func claimable (user) = {
112116 let nextClaimedEpoch = valueOrElse(getInteger(nextClaimedEpochStore(user)), 0)
113117 func fold (acc,na_) = {
114- let $t034463464 = acc
115- let e = $t034463464._1
116- let sum = $t034463464._2
118+ let $t034743492 = acc
119+ let e = $t034743492._1
120+ let sum = $t034743492._2
117121 let total = getInteger(totalVotesStore(e))
118122 if (!(isDefined(total)))
119123 then acc
159163
160164
161165 func adviseUser (address) = {
162- let $t045754624 = claimable(address)
163- let nextEpoch = $t045754624._1
164- let claimable1 = $t045754624._2
165- ((((((("claimable: " + toString(claimable1)) + ", claimable_till:") + toString(valueOrElse(getInteger(epochHeightStore(nextEpoch)), -1))) + ", claimed: ") + toString(valueOrElse(getInteger(userClaimedStore(address)), 0))) + ", pending: ") + toString(epochRewards(address, epoch, HEIGHT)))
166+ let $t046034652 = claimable(address)
167+ let nextEpoch = $t046034652._1
168+ let claimable1 = $t046034652._2
169+ ((((((((("height: " + toString(HEIGHT)) + ", claimable: ") + toString(claimable1)) + ", claimable_till:") + toString(valueOrElse(getInteger(epochHeightStore(nextEpoch)), -1))) + ", claimed: ") + toString(valueOrElse(getInteger(userClaimedStore(address)), 0))) + ", pending: ") + toString(epochRewards(address, epoch, HEIGHT)))
166170 }
167171
168172
175179 func votingEnds (h) = if ((valueOrElse(getInteger(votingEndsStore), 0) > h))
176180 then nil
177181 else [IntegerEntry(votingEndsStore, h)]
182+
183+
184+
185+@Callable(i)
186+func initialEpoch () = [writeConstInt(epochStore, 0), writeConstInt(epochHeightStore(0), 3807686), writeConstInt(epochAprStore(0), votingRewardsApr), writeConstInt(epochPowerStore(0), totalPowerStaked())]
178187
179188
180189
201210 if ((checks == checks))
202211 then {
203212 let user = toString(i.caller)
204- let $t060416094 = claimable(user)
205- let newNextClaimedEpoch = $t060416094._1
206- let rewards = $t060416094._2
207- let m = invoke(minterContract, "mint", [rewards], nil)
208- if ((m == m))
209- then {
210- let s = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, rewards)])
211- if ((s == s))
212- then [writeInt(nextClaimedEpochStore(user), newNextClaimedEpoch), changeBy(userClaimedStore(user), rewards)]
213- else throw("Strict value is not equal to itself.")
214- }
215- else throw("Strict value is not equal to itself.")
213+ let $t063476570 = claimable(user)
214+ let newNextClaimedEpoch = $t063476570._1
215+ let rewards = $t063476570._2
216+[writeInt(nextClaimedEpochStore(user), newNextClaimedEpoch), changeBy(userClaimedStore(user), rewards)]
216217 }
217218 else throw("Strict value is not equal to itself.")
218219 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let configAddressStore = "configAddress"
55
66 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "voting rewards: no configAddress")), "invalid config address")
7-
8-let HEIGHT = height
97
108 let stakingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_staking"), "no staking_contract")), "invalid staking contract")
119
1210 let minterContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_minter"), "no contract_minter")), "invalid minter contract")
1311
1412 let pwrAssetId = fromBase58String(valueOrErrorMessage(getString(configAddress, "powerAssetId"), "pwr asset id not found"))
1513
1614 func writeInt (key,value) = if ((0 > value))
1715 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1816 else IntegerEntry(key, value)
1917
2018
2119 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
2220 then StringEntry(key, value)
2321 else throw(("already initialized: " + key))
2422
2523
2624 func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
2725 then IntegerEntry(key, value)
2826 else throw(("already exists: " + key))
2927
3028
3129 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
3230
3331
3432 func asInt (value) = match value {
3533 case int: Int =>
3634 int
3735 case _ =>
3836 throw("wrong type, expected: Int")
3937 }
4038
4139
4240 func opAllowed (op) = {
4341 let a = invoke(configAddress, "opAllowed", [op], nil)
4442 if ((a == a))
4543 then true
4644 else throw("Strict value is not equal to itself.")
4745 }
4846
4947
48+let HEIGHT = height
49+
5050 let votingEndsStore = "voting_ends"
5151
5252 let epochStore = "epoch"
5353
5454 let epoch = valueOrElse(getInteger(epochStore), 0)
5555
5656 func epochAprStore (e) = (("epoch_" + toString(e)) + "_apr")
5757
5858
5959 func epochPowerStore (e) = (("epoch_" + toString(e)) + "_power")
6060
6161
6262 func epochHeightStore (e) = (("epoch_" + toString(e)) + "_height")
6363
6464
65-let epochMinBlocks = valueOrElse(getInteger(configAddress, (toString(this) + "_epoch_min_blocks")), (1440 * 7))
65+let epochMinBlocks = valueOrElse(getInteger(configAddress, (toString(this) + "_epoch_min_blocks")), (1440 * 14))
6666
6767 let votingRewardsApr = valueOrElse(getInteger(configAddress, (toString(this) + "_voting_rewards_apr")), 185)
6868
6969 let AprBase = 1000
7070
7171 let RBase = 10000000000000000
7272
7373 let blocksPerYear = ((365 * 24) * 60)
7474
7575 func totalVotesStore (e) = (("epoch_" + toString(e)) + "_total_votes")
7676
7777
7878 func userVotesStore (e,user) = ((("epoch_" + toString(e)) + "_user_votes_") + user)
7979
8080
8181 func nextClaimedEpochStore (user) = ("next_claimed_epoch_" + user)
8282
8383
8484 func userClaimedStore (user) = ("claimed_" + user)
8585
8686
8787 func totalPowerStaked () = asInt(invoke(stakingContract, "totalPower", nil, nil))
8888
8989
9090 func epochRewards (user,e,nextEpochHeight) = {
9191 let total = valueOrElse(getInteger(totalVotesStore(e)), 0)
9292 if ((total == 0))
9393 then 0
9494 else {
9595 let userVotes = valueOrElse(getInteger(userVotesStore(e, user)), 0)
9696 let RUserPart = fraction(userVotes, RBase, total)
9797 let epochHeight = getInteger(epochHeightStore(e))
9898 if (!(isDefined(epochHeight)))
9999 then 0
100100 else {
101- let blocks = (value(nextEpochHeight) - value(epochHeight))
102- let apr = getIntegerValue(epochAprStore(e))
103- let power = getIntegerValue(epochPowerStore(e))
104- let totalRewards = fraction(power, (blocks * apr), (AprBase * blocksPerYear))
105- fraction(totalRewards, RUserPart, RBase)
101+ let blocks = (nextEpochHeight - value(epochHeight))
102+ if ((blocks == 0))
103+ then 0
104+ else {
105+ let apr = getIntegerValue(epochAprStore(e))
106+ let power = getIntegerValue(epochPowerStore(e))
107+ let totalRewards = fraction(power, (blocks * apr), (AprBase * blocksPerYear))
108+ fraction(totalRewards, RUserPart, RBase)
109+ }
106110 }
107111 }
108112 }
109113
110114
111115 func claimable (user) = {
112116 let nextClaimedEpoch = valueOrElse(getInteger(nextClaimedEpochStore(user)), 0)
113117 func fold (acc,na_) = {
114- let $t034463464 = acc
115- let e = $t034463464._1
116- let sum = $t034463464._2
118+ let $t034743492 = acc
119+ let e = $t034743492._1
120+ let sum = $t034743492._2
117121 let total = getInteger(totalVotesStore(e))
118122 if (!(isDefined(total)))
119123 then acc
120124 else {
121125 let totalValue = value(total)
122126 let nextEpoch = (e + 1)
123127 if ((totalValue == 0))
124128 then $Tuple2(nextEpoch, sum)
125129 else {
126130 let userVotes = valueOrElse(getInteger(userVotesStore(e, user)), 0)
127131 let RUserPart = fraction(userVotes, RBase, totalValue)
128132 let epochHeight = getInteger(epochHeightStore(e))
129133 let nextEpochHeight = getInteger(epochHeightStore(nextEpoch))
130134 if (if (!(isDefined(epochHeight)))
131135 then true
132136 else !(isDefined(nextEpochHeight)))
133137 then acc
134138 else {
135139 let blocks = (value(nextEpochHeight) - value(epochHeight))
136140 let apr = getIntegerValue(epochAprStore(e))
137141 let power = getIntegerValue(epochPowerStore(e))
138142 let totalRewards = fraction(power, (blocks * apr), (AprBase * blocksPerYear))
139143 let userRewards = fraction(totalRewards, RUserPart, RBase)
140144 $Tuple2(nextEpoch, (sum + userRewards))
141145 }
142146 }
143147 }
144148 }
145149
146150 let $l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
147151 let $s = size($l)
148152 let $acc0 = $Tuple2(0, nextClaimedEpoch)
149153 func $f0_1 ($a,$i) = if (($i >= $s))
150154 then $a
151155 else fold($a, $l[$i])
152156
153157 func $f0_2 ($a,$i) = if (($i >= $s))
154158 then $a
155159 else throw("List size exceeds 20")
156160
157161 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
158162 }
159163
160164
161165 func adviseUser (address) = {
162- let $t045754624 = claimable(address)
163- let nextEpoch = $t045754624._1
164- let claimable1 = $t045754624._2
165- ((((((("claimable: " + toString(claimable1)) + ", claimable_till:") + toString(valueOrElse(getInteger(epochHeightStore(nextEpoch)), -1))) + ", claimed: ") + toString(valueOrElse(getInteger(userClaimedStore(address)), 0))) + ", pending: ") + toString(epochRewards(address, epoch, HEIGHT)))
166+ let $t046034652 = claimable(address)
167+ let nextEpoch = $t046034652._1
168+ let claimable1 = $t046034652._2
169+ ((((((((("height: " + toString(HEIGHT)) + ", claimable: ") + toString(claimable1)) + ", claimable_till:") + toString(valueOrElse(getInteger(epochHeightStore(nextEpoch)), -1))) + ", claimed: ") + toString(valueOrElse(getInteger(userClaimedStore(address)), 0))) + ", pending: ") + toString(epochRewards(address, epoch, HEIGHT)))
166170 }
167171
168172
169173 @Callable(i)
170174 func countVote (user,votes) = [changeBy(totalVotesStore(epoch), votes), changeBy(userVotesStore(epoch, user), votes)]
171175
172176
173177
174178 @Callable(i)
175179 func votingEnds (h) = if ((valueOrElse(getInteger(votingEndsStore), 0) > h))
176180 then nil
177181 else [IntegerEntry(votingEndsStore, h)]
182+
183+
184+
185+@Callable(i)
186+func initialEpoch () = [writeConstInt(epochStore, 0), writeConstInt(epochHeightStore(0), 3807686), writeConstInt(epochAprStore(0), votingRewardsApr), writeConstInt(epochPowerStore(0), totalPowerStaked())]
178187
179188
180189
181190 @Callable(i)
182191 func nextEpoch () = {
183192 let checks = opAllowed("voting_rewards_next_epoch_paused")
184193 if ((checks == checks))
185194 then if ((valueOrElse(getInteger(votingEndsStore), 0) > HEIGHT))
186195 then throw("voting is active. try later")
187196 else if (((valueOrElse(getInteger(epochHeightStore(epoch)), 0) + epochMinBlocks) > HEIGHT))
188197 then throw("too early")
189198 else {
190199 let newEpoch = (epoch + 1)
191200 [changeBy(totalVotesStore(epoch), 0), writeInt(epochStore, newEpoch), writeConstInt(epochHeightStore(newEpoch), HEIGHT), writeConstInt(epochAprStore(newEpoch), votingRewardsApr), writeConstInt(epochPowerStore(newEpoch), totalPowerStaked())]
192201 }
193202 else throw("Strict value is not equal to itself.")
194203 }
195204
196205
197206
198207 @Callable(i)
199208 func claim () = {
200209 let checks = opAllowed("voting_rewards_claim_paused")
201210 if ((checks == checks))
202211 then {
203212 let user = toString(i.caller)
204- let $t060416094 = claimable(user)
205- let newNextClaimedEpoch = $t060416094._1
206- let rewards = $t060416094._2
207- let m = invoke(minterContract, "mint", [rewards], nil)
208- if ((m == m))
209- then {
210- let s = invoke(stakingContract, "stakeFor", [user], [AttachedPayment(pwrAssetId, rewards)])
211- if ((s == s))
212- then [writeInt(nextClaimedEpochStore(user), newNextClaimedEpoch), changeBy(userClaimedStore(user), rewards)]
213- else throw("Strict value is not equal to itself.")
214- }
215- else throw("Strict value is not equal to itself.")
213+ let $t063476570 = claimable(user)
214+ let newNextClaimedEpoch = $t063476570._1
215+ let rewards = $t063476570._2
216+[writeInt(nextClaimedEpochStore(user), newNextClaimedEpoch), changeBy(userClaimedStore(user), rewards)]
216217 }
217218 else throw("Strict value is not equal to itself.")
218219 }
219220
220221
221222
222223 @Callable(i)
223224 func init (config) = [writeConstString(configAddressStore, config)]
224225
225226

github/deemru/w8io/3ef1775 
38.43 ms