tx · 6vhLGh96MbmdqQWmujMthfGUM6XwRatwQJYQ9mMgmP58

3MuqubsQAq9mrsN65SePHeThcN3JVAbgZ9d:  -0.01100000 Waves

2023.05.31 11:32 [2601903] smart account 3MuqubsQAq9mrsN65SePHeThcN3JVAbgZ9d > SELF 0.00000000 Waves

{ "type": 13, "id": "6vhLGh96MbmdqQWmujMthfGUM6XwRatwQJYQ9mMgmP58", "fee": 1100000, "feeAssetId": null, "timestamp": 1685521976879, "version": 2, "chainId": 84, "sender": "3MuqubsQAq9mrsN65SePHeThcN3JVAbgZ9d", "senderPublicKey": "GWTozVWP9MvUxrEuz1BPrNAbtLYAec9LrT4U82jWG6KX", "proofs": [ "UZW6EyJfjZvb6a46X9kXre9B35kVVauh6vg3z6jEqkFxYhJxzG7SHxMqEF5UFjEGkJMCX6PGhZqJGfFQGHuh91e" ], "script": "base64:BgLXCggCEgcKBQgICAEBEgASAwoBARIAEgMKAQESACIJc2VwYXJhdG9yIhBjb250cmFjdEZpbGVuYW1lIgtFUE9DSF9DT1VOVCIOa2V5RXBvY2hMZW5ndGgiE2tleUVtaXNzaW9uQ29udHJhY3QiGWtleVZvdGluZ0VtaXNzaW9uQ29udHJhY3QiE2tleUJvb3N0aW5nQ29udHJhY3QiDGtleVRocmVzaG9sZCIPa2V5UmF0ZVBlckJsb2NrIhJrZXlSYXRlUGVyQmxvY2tNYXgiEWtleVJhdGVDaGFuZ2VTdGVwIg5rZXlTdGFydEhlaWdodCIPa2V5Vm90aW5nUmVzdWx0Igh0aHJvd0VyciIBcyIPZ2V0U3RyaW5nT3JGYWlsIgNrZXkiDGdldEludE9yRmFpbCIKdG90YWxWb3RlcyINdG90YWxJbmNyZWFzZSIMdG90YWxDdXJyZW50Ig10b3RhbERlY3JlYXNlIgdrZXlWb3RlIgx2b3RlckFkZHJlc3MiC3N0YXJ0SGVpZ2h0IgxrZXlWb3RlVmFsdWUiCWd3eEFtb3VudCIEdm90ZSIQYm9vc3RpbmdDb250cmFjdCIQZW1pc3Npb25Db250cmFjdCIWdm90aW5nRW1pc3Npb25Db250cmFjdCITa2V5TWFuYWdlclB1YmxpY0tleSIWa2V5TWFuYWdlclZhdWx0QWRkcmVzcyIcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcyIHJG1hdGNoMCIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCITbWFuYWdlclZhdWx0QWRkcmVzcyIJaXNNYW5hZ2VyIgFpIgJwayILbXVzdE1hbmFnZXIiBWFzSW50IgN2YWwiBnZhbEludCILY2FsY05ld1JhdGUiD3JhdGVQZXJCbG9ja01heCIMcmF0ZVBlckJsb2NrIgpjaGFuZ2VTdGVwIgptYXhBbGxvd2VkIg1pbmNyZWFzZWRSYXRlIg1kZWNyZWFzZWRSYXRlIhxnZXRSYXRlQ2hhbmdlQW1vdW50c0lOVEVSTkFMIg5yYXRlQ2hhbmdlU3RlcCIOZ2V0RXBvY2hMZW5ndGgiEXZvdGluZ0Vwb2NoTGVuZ3RoIhF2b3RpbmdTdGFydExlbmd0aCITYm9vc3RpbmdDb250cmFjdFBybSITZW1pc3Npb25Db250cmFjdFBybSIZdm90aW5nRW1pc3Npb25Db250cmFjdFBybSIJdGhyZXNob2xkIgZjaGVja3MiDnZvdGluZ0VtaXNzaW9uIgdpbkZhdm9yIhJ2b3RpbmdGaW5pc2hIZWlnaHQiC3VzZXJBZGRyZXNzIgdub3RaZXJvIgx2b3RpbmdSZXN1bHQiEHZvdGVzRm9ySW5jcmVhc2UiD3ZvdGVzRm9yQ3VycmVudCIQdm90ZXNGb3JEZWNyZWFzZSIbbmV3UG9zaXRpdmVBbmROZWdhdGl2ZVZvdGVzIhBuZXdJbmNyZWFzZVZvdGVzIhBuZXdEZWNyZWFzZVZvdGVzIg9uZXdDdXJyZW50Vm90ZXMiB3ZvdGVLZXkiCXZvdGVWYWx1ZSIIdm90ZVR5cGUiB2FjdGlvbnMiDmRlZmF1bHRBY3Rpb25zIgxuZXdUaHJlc2hvbGQiCGFsbFZvdGVzIgskdDA5NjMwOTcxMCILY3VycmVudFJhdGUiCXZvdGVzTGlzdCIHbmV3UmF0ZSIRY2hhbmdlUmF0ZUludm9rZXMiAXIiEmVtaXNzaW9uQ2hhbmdlUmF0ZSICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IAABYQICX18AAWICGXZvdGluZ19lbWlzc2lvbl9yYXRlLnJpZGUAAWMABAABZAkAuQkCCQDMCAICAiVzCQDMCAICC2Vwb2NoTGVuZ3RoBQNuaWwFAWEAAWUJALkJAgkAzAgCAgIlcwkAzAgCAhBlbWlzc2lvbkNvbnRyYWN0BQNuaWwFAWEAAWYJALkJAgkAzAgCAgIlcwkAzAgCAhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0BQNuaWwFAWEAAWcJALkJAgkAzAgCAgIlcwkAzAgCAhBib29zdGluZ0NvbnRyYWN0BQNuaWwFAWEAAWgJALkJAgkAzAgCAgIlcwkAzAgCAg92b3RpbmdUaHJlc2hvbGQFA25pbAUBYQABaQkAuQkCCQDMCAICBCVzJXMJAMwIAgIMcmF0ZVBlckJsb2NrCQDMCAICB2N1cnJlbnQFA25pbAUBYQABagkAuQkCCQDMCAICBCVzJXMJAMwIAgIPcmF0ZVBlckJsb2NrTWF4CQDMCAICB2N1cnJlbnQFA25pbAUBYQABawkAuQkCCQDMCAICAiVzCQDMCAICDnJhdGVDaGFuZ2VTdGVwBQNuaWwFAWEAAWwJALkJAgkAzAgCAgIlcwkAzAgCAgtzdGFydEhlaWdodAUDbmlsBQFhAAFtCQC5CQIJAMwIAgICJXMJAMwIAgIMdm90aW5nUmVzdWx0BQNuaWwFAWEBAW4BAW8JAAIBCQCsAgIJAKwCAgUBYgICOiAFAW8BAXABAXEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQFxCQCsAgIFAXECDyBpcyBub3QgZGVmaW5lZAEBcgEBcQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFAXEJAKwCAgUBcQIPIGlzIG5vdCBkZWZpbmVkAQFzAwF0AXUBdgkAuQkCCQDMCAICBiVkJWQlZAkAzAgCBQF0CQDMCAIFAXUJAMwIAgUBdgUDbmlsBQFhAQF3AgF4AXkJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIEdm90ZQkAzAgCBQF4CQDMCAIJAKQDAQUBeQUDbmlsBQFhAQF6AgFBAUIEAXEDCQAAAgUBQgABCQC5CQIJAMwIAgIEJWQlcwkAzAgCBQFBCQDMCAICCGluY3JlYXNlBQNuaWwFAWEDCQAAAgUBQgD///////////8BCQC5CQIJAMwIAgIEJWQlcwkAzAgCBQFBCQDMCAICCGRlY3JlYXNlBQNuaWwFAWEJALkJAgkAzAgCAgQlZCVzCQDMCAIFAUEJAMwIAgIHY3VycmVudAUDbmlsBQFhBQFxAAFDCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBcAEFAWcAAUQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFwAQUBZQABRQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAXABBQFmAQFGAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAUcAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwEBSAAEAUkJAKIIAQkBAUcAAwkAAQIFAUkCBlN0cmluZwQBbwUBSQkBEUBleHRyTmF0aXZlKDEwNjIpAQUBbwUEdGhpcwEBSgAEAUsJAQFIAAQBSQkAnQgCBQFLCQEBRgADCQABAgUBSQIGU3RyaW5nBAFvBQFJCQDZBAEFAW8DCQABAgUBSQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQFMAQFNBAFJCQEBSgADCQABAgUBSQIKQnl0ZVZlY3RvcgQBTgUBSQkAAAIIBQFND2NhbGxlclB1YmxpY0tleQUBTgMJAAECBQFJAgRVbml0CQAAAggFAU0GY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAU8BAU0DCQEBTAEFAU0GCQEBbgECEXBlcm1pc3Npb24gZGVuaWVkAQFQAQFRBAFJBQFRAwkAAQIFAUkCA0ludAQBUgUBSQUBUgkBAW4BAhtmYWlsZWQgdG8gY2FzdCBpbnRvIEludGVnZXIBAVMDAVQBVQFWBAFXCQBrAwBkBQFUAHgEAVgJAJcDAQkAzAgCCQBrAwkAZAIAZAUBVgUBVQBkCQDMCAIFAVcFA25pbAQBWQkAlgMBCQDMCAIJAGsDCQBlAgBkBQFWBQFVAGQJAMwIAgAABQNuaWwJAJUKAwUBWAUBVQUBWQEBWgAEAVQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFAUQFAWoEAVUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFAUQFAWkEAmFhCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQFrCQEBUwMFAVQFAVUFAmFhAQJhYgEBRQQCYWMJARFAZXh0ck5hdGl2ZSgxMDUwKQIFAUUFAWQEAmFkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQFFBQFsCQBlAgkAZQIJAGQCBQJhZAkAaAIFAmFjBQFjBQZoZWlnaHQAAQYBTQELY29uc3RydWN0b3IFAmFlAmFmAmFnAmFoAmFhBAJhaQkAzAgCCQEBTwEFAU0JAMwIAgMJAQlpc0RlZmluZWQBCQCmCAEFAmFlBgkBAW4BAiFJbnZhbGlkIGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQlpc0RlZmluZWQBCQCmCAEFAmFmBgkBAW4BAiFJbnZhbGlkIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAQlpc0RlZmluZWQBCQCmCAEFAmFnBgkBAW4BAiFJbnZhbGlkIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBQJhaAAABgkBAW4BAhFpbnZhbGlkIHRocmVzaG9sZAkAzAgCAwkAZgIFAmFhAAAGCQEBbgECFmludmFsaWQgcmF0ZUNoYW5nZVN0ZXAFA25pbAMJAAACBQJhaQUCYWkEAmFqCQERQGV4dHJOYXRpdmUoMTA2MikBBQJhZwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWcFAmFlCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWUFAmFmCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWYFAmFnCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFkCQECYWIBBQJhagkAzAgCCQEMSW50ZWdlckVudHJ5AgUBaAUCYWgJAMwIAgkBDEludGVnZXJFbnRyeQIFAWsFAmFhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFsBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbQkBAXMDAgEwAgEwAgEwBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BTQEcZ2V0UmF0ZUNoYW5nZUFtb3VudHNSRUFET05MWQAJAJQKAgUDbmlsCQEBWgABTQEEdm90ZQECYWsEAXkJARFAZXh0ck5hdGl2ZSgxMDU1KQEFAWwEAmFsCQBkAgUBeQkBEUBleHRyTmF0aXZlKDEwNTUpAQUBZAQCYW0JAKUIAQgFAU0GY2FsbGVyBAJhaQkAzAgCAwkAZgIFAmFsBQZoZWlnaHQGCQEBbgECEHRvbyBsYXRlIHRvIHZvdGUJAMwIAgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIAAQkAzAgCAAAJAMwIAgD///////////8BBQNuaWwFAmFrBgkBAW4BAhJub3QgdmFsaWQgYXJndW1lbnQJAMwIAgMJAQEhAQkBCWlzRGVmaW5lZAEJAKIIAQkBAXcCBQJhbQUBeQYJAQFuAQIReW91IGFscmVhZHkgdm90ZWQFA25pbAMJAAACBQJhaQUCYWkEAUEJAPwHBAUBQwIgZ2V0VXNlckd3eEFtb3VudEF0SGVpZ2h0UkVBRE9OTFkJAMwIAgUCYW0JAMwIAgUCYWwFA25pbAUDbmlsBAJhbgMJAGYCCQEBUAEFAUEAAAYJAQFuAQISeW91IGRvbid0IGhhdmUgZ3d4AwkAAAIFAmFuBQJhbgQCYW8JALUJAgkBEUBleHRyTmF0aXZlKDEwNTgpAQUBbQUBYQQCYXAJAJEDAgUCYW8AAQQCYXEJAJEDAgUCYW8AAgQCYXIJAJEDAgUCYW8AAwQCYXMDCQAAAgUCYWsAAQQCYXQJAGQCCQENcGFyc2VJbnRWYWx1ZQEFAmFwCQEBUAEFAUEJAMwIAgkApAMBBQJhdAkAzAgCBQJhcQkAzAgCBQJhcgUDbmlsAwkAAAIFAmFrAP///////////wEEAmF1CQBkAgkBDXBhcnNlSW50VmFsdWUBBQJhcgkBAVABBQFBCQDMCAIFAmFwCQDMCAIFAmFxCQDMCAIJAKQDAQUCYXUFA25pbAQCYXYJAGQCCQENcGFyc2VJbnRWYWx1ZQEFAmFxCQEBUAEFAUEJAMwIAgUCYXAJAMwIAgkApAMBBQJhdgkAzAgCBQJhcgUDbmlsBAJhdwkBAXcCCQClCAEIBQFNBmNhbGxlcgUBeQQCYXgJAQF6AgkApAMBCQEBUAEFAUEFAmFrCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbQkBAXMDCQCRAwIFAmFzAAAJAJEDAgUCYXMAAQkAkQMCBQJhcwACCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmF3BQJheAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAU0BCmNhbmNlbFZvdGUABAF5CQERQGV4dHJOYXRpdmUoMTA1NSkBBQFsBAJhbAkAZAIFAXkJARFAZXh0ck5hdGl2ZSgxMDU1KQEFAWQEAmFtAwkAAAIIBQFNBmNhbGxlcgUEdGhpcwkApQgBCAUBTQxvcmlnaW5DYWxsZXIJAKUIAQgFAU0GY2FsbGVyBAJhaQkAzAgCAwkAZgIFAmFsBQZoZWlnaHQGCQEBbgECF3RvbyBsYXRlIHRvIGNhbmNlbCB2b3RlCQDMCAIDCQEJaXNEZWZpbmVkAQkAoggBBQFtBgkBAW4BAgdubyB2b3RlCQDMCAIDCQEJaXNEZWZpbmVkAQkAoggBCQEBdwIFAmFtBQF5BgkBAW4BAgxubyB1c2VyIHZvdGUFA25pbAMJAAACBQJhaQUCYWkEAUIJALUJAgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBAXcCBQJhbQUBeQUBYQQCYXgJAJEDAgUBQgABBAJheQkAkQMCBQFCAAIEAmFvCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDU4KQEFAW0FAWEEAmFwCQCRAwIFAmFvAAEEAmFxCQCRAwIFAmFvAAIEAmFyCQCRAwIFAmFvAAMEAmF6AwkAAAIFAmF5AghpbmNyZWFzZQQCYXQJAGUCCQENcGFyc2VJbnRWYWx1ZQEFAmFwCQENcGFyc2VJbnRWYWx1ZQEFAmF4CQDMCAIJAQtTdHJpbmdFbnRyeQIFAW0JAQFzAwkApAMBBQJhdAUCYXEFAmFyBQNuaWwDCQAAAgUCYXkCCGRlY3JlYXNlBAJhdQkAZQIJAQ1wYXJzZUludFZhbHVlAQUCYXIJAQ1wYXJzZUludFZhbHVlAQUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbQkBAXMDBQJhcAUCYXEJAKQDAQUCYXUFA25pbAQCYXYJAGUCCQENcGFyc2VJbnRWYWx1ZQEFAmFxCQENcGFyc2VJbnRWYWx1ZQEFAmF4CQDMCAIJAQtTdHJpbmdFbnRyeQIFAW0JAQFzAwUCYXAJAKQDAQUCYXYFAmFyBQNuaWwEAmFBCQDMCAIJAQtEZWxldGVFbnRyeQEJAQF3AgUCYW0FAXkFA25pbAkAzggCBQJhegUCYUEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BTQEMc2V0VGhyZXNob2xkAQJhQgQCYWkJAMwIAgkBAU8BBQFNCQDMCAIDCQBmAgUCYUIAAAYJAQFuAQIRaW52YWxpZCB0aHJlc2hvbGQFA25pbAMJAAACBQJhaQUCYWkJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUBaAUCYUIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFNAQhmaW5hbGl6ZQAEAmFsCQBkAgkBEUBleHRyTmF0aXZlKDEwNTUpAQUBbAkBBXZhbHVlAQkAnwgBBQFkAwkAZwIFBmhlaWdodAUCYWwEAmFvCQC1CQIJAQV2YWx1ZQEJAKIIAQUBbQUBYQQCYXAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhbwABBAJhcQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFvAAIEAmFyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYW8AAwQCYUMJAGQCCQBkAgUCYXAFAmFxBQJhcgQCYWgJAQFyAQUBaAQCYUQJAQFaAAQBWAgFAmFEAl8xBAJhRQgFAmFEAl8yBAFZCAUCYUQCXzMEAmFGCQDMCAIFAmFwCQDMCAIFAmFxCQDMCAIFAmFyBQNuaWwEAmFHAwMJAGYCBQJhaAUCYUMGCQAAAgUCYXEJAJYDAQUCYUYFBHVuaXQDCQAAAgUCYXAJAJYDAQUCYUYFAVgFAVkEAmFIBAFJBQJhRwMJAAECBQFJAgNJbnQEAmFJBQFJBAJhSgkA/AcEBQFEAhJjaGFuZ2VSYXRlUGVyQmxvY2sJAMwIAgUCYUkFA25pbAUDbmlsAwkAAAIFAmFKBQJhSgUCYUoJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FBHVuaXQDCQAAAgUCYUgFAmFICQDMCAIJAQxJbnRlZ2VyRW50cnkCBQFsBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFAWQJAQJhYgEFAUUJAMwIAgkBC1N0cmluZ0VudHJ5AgUBbQkBAXMDAgEwAgEwAgEwBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAECYUsBAmFMAAQCYU0EAUkJAQFKAAMJAAECBQFJAgpCeXRlVmVjdG9yBAFOBQFJBQFOAwkAAQIFAUkCBFVuaXQIBQJhSw9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCYUsJYm9keUJ5dGVzCQCRAwIIBQJhSwZwcm9vZnMAAAUCYU211i/S", "height": 2601903, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bw1XQnLWJhCfBzyZvcvJn1KYeMGu76eap1zCdAYY3nw4 Next: 3mEnHtDAiz3rdVtukSzPUohFFnqja5FjmDC7orgw374o Diff:
OldNewDifferences
55
66 let contractFilename = "voting_emission_rate.ride"
77
8+let EPOCH_COUNT = 4
9+
810 let keyEpochLength = makeString(["%s", "epochLength"], separator)
911
1012 let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
13+
14+let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], separator)
1115
1216 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
1317
5155 let boostingContract = addressFromStringValue(getStringOrFail(keyBoostingContract))
5256
5357 let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract))
58+
59+let votingEmissionContract = addressFromStringValue(getStringOrFail(keyVotingEmissionContract))
5460
5561 func keyManagerPublicKey () = "%s__managerPublicKey"
5662
118124 }
119125
120126
127+func getEpochLength (votingEmissionContract) = {
128+ let votingEpochLength = getIntegerValue(votingEmissionContract, keyEpochLength)
129+ let votingStartLength = getIntegerValue(votingEmissionContract, keyStartHeight)
130+ (((votingStartLength + (votingEpochLength * EPOCH_COUNT)) - height) - 1)
131+ }
132+
133+
121134 @Callable(i)
122-func constructor (boostingContractPrm,emissionContractPrm,votingDurationPrm,threshold,rateChangeStep) = {
135+func constructor (boostingContractPrm,emissionContractPrm,votingEmissionContractPrm,threshold,rateChangeStep) = {
123136 let checks = [mustManager(i), if (isDefined(addressFromString(boostingContractPrm)))
124137 then true
125138 else throwErr("Invalid boosting contract address"), if (isDefined(addressFromString(emissionContractPrm)))
126139 then true
127- else throwErr("Invalid emission contract address"), if ((votingDurationPrm > 0))
140+ else throwErr("Invalid emission contract address"), if (isDefined(addressFromString(votingEmissionContractPrm)))
128141 then true
129- else throwErr("Invalid voting duration"), if ((threshold > 0))
142+ else throwErr("Invalid emission contract address"), if ((threshold > 0))
130143 then true
131144 else throwErr("invalid threshold"), if ((rateChangeStep > 0))
132145 then true
133146 else throwErr("invalid rateChangeStep")]
134147 if ((checks == checks))
135- then $Tuple2([StringEntry(keyBoostingContract, boostingContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), IntegerEntry(keyEpochLength, votingDurationPrm), IntegerEntry(keyThreshold, threshold), IntegerEntry(keyRateChangeStep, rateChangeStep), IntegerEntry(keyStartHeight, height), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))], unit)
148+ then {
149+ let votingEmission = addressFromStringValue(votingEmissionContractPrm)
150+ $Tuple2([StringEntry(keyBoostingContract, boostingContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), StringEntry(keyVotingEmissionContract, votingEmissionContractPrm), IntegerEntry(keyEpochLength, getEpochLength(votingEmission)), IntegerEntry(keyThreshold, threshold), IntegerEntry(keyRateChangeStep, rateChangeStep), IntegerEntry(keyStartHeight, height), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))], unit)
151+ }
136152 else throw("Strict value is not equal to itself.")
137153 }
138154
252268 @Callable(i)
253269 func finalize () = {
254270 let votingFinishHeight = (getIntegerValue(keyStartHeight) + value(getInteger(keyEpochLength)))
255- let checks = [if ((height >= votingFinishHeight))
256- then true
257- else throwErr("insufficient height for completion")]
258- if ((checks == checks))
271+ if ((height >= votingFinishHeight))
259272 then {
260273 let votingResult = split(value(getString(keyVotingResult)), separator)
261274 let votesForIncrease = parseIntValue(votingResult[1])
263276 let votesForDecrease = parseIntValue(votingResult[3])
264277 let allVotes = ((votesForIncrease + votesForCurrent) + votesForDecrease)
265278 let threshold = getIntOrFail(keyThreshold)
266- let $t089058985 = getRateChangeAmountsINTERNAL()
267- let increasedRate = $t089058985._1
268- let currentRate = $t089058985._2
269- let decreasedRate = $t089058985._3
279+ let $t096309710 = getRateChangeAmountsINTERNAL()
280+ let increasedRate = $t096309710._1
281+ let currentRate = $t096309710._2
282+ let decreasedRate = $t096309710._3
270283 let votesList = [votesForIncrease, votesForCurrent, votesForDecrease]
271284 let newRate = if (if ((threshold > allVotes))
272285 then true
277290 else decreasedRate
278291 let changeRateInvokes = match newRate {
279292 case r: Int =>
280- unit
293+ let emissionChangeRate = invoke(emissionContract, "changeRatePerBlock", [r], nil)
294+ if ((emissionChangeRate == emissionChangeRate))
295+ then emissionChangeRate
296+ else throw("Strict value is not equal to itself.")
281297 case _ =>
282298 unit
283299 }
284300 if ((changeRateInvokes == changeRateInvokes))
285- then [IntegerEntry(keyStartHeight, height), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))]
301+ then [IntegerEntry(keyStartHeight, height), IntegerEntry(keyEpochLength, getEpochLength(votingEmissionContract)), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))]
286302 else throw("Strict value is not equal to itself.")
287303 }
288- else throw("Strict value is not equal to itself.")
304+ else nil
289305 }
290306
291307
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let contractFilename = "voting_emission_rate.ride"
77
8+let EPOCH_COUNT = 4
9+
810 let keyEpochLength = makeString(["%s", "epochLength"], separator)
911
1012 let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
13+
14+let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], separator)
1115
1216 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
1317
1418 let keyThreshold = makeString(["%s", "votingThreshold"], separator)
1519
1620 let keyRatePerBlock = makeString(["%s%s", "ratePerBlock", "current"], separator)
1721
1822 let keyRatePerBlockMax = makeString(["%s%s", "ratePerBlockMax", "current"], separator)
1923
2024 let keyRateChangeStep = makeString(["%s", "rateChangeStep"], separator)
2125
2226 let keyStartHeight = makeString(["%s", "startHeight"], separator)
2327
2428 let keyVotingResult = makeString(["%s", "votingResult"], separator)
2529
2630 func throwErr (s) = throw(((contractFilename + ": ") + s))
2731
2832
2933 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
3034
3135
3236 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (key + " is not defined"))
3337
3438
3539 func totalVotes (totalIncrease,totalCurrent,totalDecrease) = makeString(["%d%d%d", totalIncrease, totalCurrent, totalDecrease], separator)
3640
3741
3842 func keyVote (voterAddress,startHeight) = makeString(["%s%s%d", "vote", voterAddress, toString(startHeight)], separator)
3943
4044
4145 func keyVoteValue (gwxAmount,vote) = {
4246 let key = if ((vote == 1))
4347 then makeString(["%d%s", gwxAmount, "increase"], separator)
4448 else if ((vote == -1))
4549 then makeString(["%d%s", gwxAmount, "decrease"], separator)
4650 else makeString(["%d%s", gwxAmount, "current"], separator)
4751 key
4852 }
4953
5054
5155 let boostingContract = addressFromStringValue(getStringOrFail(keyBoostingContract))
5256
5357 let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract))
58+
59+let votingEmissionContract = addressFromStringValue(getStringOrFail(keyVotingEmissionContract))
5460
5561 func keyManagerPublicKey () = "%s__managerPublicKey"
5662
5763
5864 func keyManagerVaultAddress () = "%s__managerVaultAddress"
5965
6066
6167 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
6268 case s: String =>
6369 addressFromStringValue(s)
6470 case _ =>
6571 this
6672 }
6773
6874
6975 func managerPublicKeyOrUnit () = {
7076 let managerVaultAddress = getManagerVaultAddressOrThis()
7177 match getString(managerVaultAddress, keyManagerPublicKey()) {
7278 case s: String =>
7379 fromBase58String(s)
7480 case _: Unit =>
7581 unit
7682 case _ =>
7783 throw("Match error")
7884 }
7985 }
8086
8187
8288 func isManager (i) = match managerPublicKeyOrUnit() {
8389 case pk: ByteVector =>
8490 (i.callerPublicKey == pk)
8591 case _: Unit =>
8692 (i.caller == this)
8793 case _ =>
8894 throw("Match error")
8995 }
9096
9197
9298 func mustManager (i) = if (isManager(i))
9399 then true
94100 else throwErr("permission denied")
95101
96102
97103 func asInt (val) = match val {
98104 case valInt: Int =>
99105 valInt
100106 case _ =>
101107 throwErr("failed to cast into Integer")
102108 }
103109
104110
105111 func calcNewRate (ratePerBlockMax,ratePerBlock,changeStep) = {
106112 let maxAllowed = fraction(100, ratePerBlockMax, 120)
107113 let increasedRate = min([fraction((100 + changeStep), ratePerBlock, 100), maxAllowed])
108114 let decreasedRate = max([fraction((100 - changeStep), ratePerBlock, 100), 0])
109115 $Tuple3(increasedRate, ratePerBlock, decreasedRate)
110116 }
111117
112118
113119 func getRateChangeAmountsINTERNAL () = {
114120 let ratePerBlockMax = getIntegerValue(emissionContract, keyRatePerBlockMax)
115121 let ratePerBlock = getIntegerValue(emissionContract, keyRatePerBlock)
116122 let rateChangeStep = getIntegerValue(this, keyRateChangeStep)
117123 calcNewRate(ratePerBlockMax, ratePerBlock, rateChangeStep)
118124 }
119125
120126
127+func getEpochLength (votingEmissionContract) = {
128+ let votingEpochLength = getIntegerValue(votingEmissionContract, keyEpochLength)
129+ let votingStartLength = getIntegerValue(votingEmissionContract, keyStartHeight)
130+ (((votingStartLength + (votingEpochLength * EPOCH_COUNT)) - height) - 1)
131+ }
132+
133+
121134 @Callable(i)
122-func constructor (boostingContractPrm,emissionContractPrm,votingDurationPrm,threshold,rateChangeStep) = {
135+func constructor (boostingContractPrm,emissionContractPrm,votingEmissionContractPrm,threshold,rateChangeStep) = {
123136 let checks = [mustManager(i), if (isDefined(addressFromString(boostingContractPrm)))
124137 then true
125138 else throwErr("Invalid boosting contract address"), if (isDefined(addressFromString(emissionContractPrm)))
126139 then true
127- else throwErr("Invalid emission contract address"), if ((votingDurationPrm > 0))
140+ else throwErr("Invalid emission contract address"), if (isDefined(addressFromString(votingEmissionContractPrm)))
128141 then true
129- else throwErr("Invalid voting duration"), if ((threshold > 0))
142+ else throwErr("Invalid emission contract address"), if ((threshold > 0))
130143 then true
131144 else throwErr("invalid threshold"), if ((rateChangeStep > 0))
132145 then true
133146 else throwErr("invalid rateChangeStep")]
134147 if ((checks == checks))
135- then $Tuple2([StringEntry(keyBoostingContract, boostingContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), IntegerEntry(keyEpochLength, votingDurationPrm), IntegerEntry(keyThreshold, threshold), IntegerEntry(keyRateChangeStep, rateChangeStep), IntegerEntry(keyStartHeight, height), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))], unit)
148+ then {
149+ let votingEmission = addressFromStringValue(votingEmissionContractPrm)
150+ $Tuple2([StringEntry(keyBoostingContract, boostingContractPrm), StringEntry(keyEmissionContract, emissionContractPrm), StringEntry(keyVotingEmissionContract, votingEmissionContractPrm), IntegerEntry(keyEpochLength, getEpochLength(votingEmission)), IntegerEntry(keyThreshold, threshold), IntegerEntry(keyRateChangeStep, rateChangeStep), IntegerEntry(keyStartHeight, height), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))], unit)
151+ }
136152 else throw("Strict value is not equal to itself.")
137153 }
138154
139155
140156
141157 @Callable(i)
142158 func getRateChangeAmountsREADONLY () = $Tuple2(nil, getRateChangeAmountsINTERNAL())
143159
144160
145161
146162 @Callable(i)
147163 func vote (inFavor) = {
148164 let startHeight = getIntegerValue(keyStartHeight)
149165 let votingFinishHeight = (startHeight + getIntegerValue(keyEpochLength))
150166 let userAddress = toString(i.caller)
151167 let checks = [if ((votingFinishHeight > height))
152168 then true
153169 else throwErr("too late to vote"), if (containsElement([1, 0, -1], inFavor))
154170 then true
155171 else throwErr("not valid argument"), if (!(isDefined(getString(keyVote(userAddress, startHeight)))))
156172 then true
157173 else throwErr("you already voted")]
158174 if ((checks == checks))
159175 then {
160176 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [userAddress, votingFinishHeight], nil)
161177 let notZero = if ((asInt(gwxAmount) > 0))
162178 then true
163179 else throwErr("you don't have gwx")
164180 if ((notZero == notZero))
165181 then {
166182 let votingResult = split(getStringValue(keyVotingResult), separator)
167183 let votesForIncrease = votingResult[1]
168184 let votesForCurrent = votingResult[2]
169185 let votesForDecrease = votingResult[3]
170186 let newPositiveAndNegativeVotes = if ((inFavor == 1))
171187 then {
172188 let newIncreaseVotes = (parseIntValue(votesForIncrease) + asInt(gwxAmount))
173189 [toString(newIncreaseVotes), votesForCurrent, votesForDecrease]
174190 }
175191 else if ((inFavor == -1))
176192 then {
177193 let newDecreaseVotes = (parseIntValue(votesForDecrease) + asInt(gwxAmount))
178194 [votesForIncrease, votesForCurrent, toString(newDecreaseVotes)]
179195 }
180196 else {
181197 let newCurrentVotes = (parseIntValue(votesForCurrent) + asInt(gwxAmount))
182198 [votesForIncrease, toString(newCurrentVotes), votesForDecrease]
183199 }
184200 let voteKey = keyVote(toString(i.caller), startHeight)
185201 let voteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
186202 $Tuple2([StringEntry(keyVotingResult, totalVotes(newPositiveAndNegativeVotes[0], newPositiveAndNegativeVotes[1], newPositiveAndNegativeVotes[2])), StringEntry(voteKey, voteValue)], unit)
187203 }
188204 else throw("Strict value is not equal to itself.")
189205 }
190206 else throw("Strict value is not equal to itself.")
191207 }
192208
193209
194210
195211 @Callable(i)
196212 func cancelVote () = {
197213 let startHeight = getIntegerValue(keyStartHeight)
198214 let votingFinishHeight = (startHeight + getIntegerValue(keyEpochLength))
199215 let userAddress = if ((i.caller == this))
200216 then toString(i.originCaller)
201217 else toString(i.caller)
202218 let checks = [if ((votingFinishHeight > height))
203219 then true
204220 else throwErr("too late to cancel vote"), if (isDefined(getString(keyVotingResult)))
205221 then true
206222 else throwErr("no vote"), if (isDefined(getString(keyVote(userAddress, startHeight))))
207223 then true
208224 else throwErr("no user vote")]
209225 if ((checks == checks))
210226 then {
211227 let vote = split(getStringValue(keyVote(userAddress, startHeight)), separator)
212228 let voteValue = vote[1]
213229 let voteType = vote[2]
214230 let votingResult = split(getStringValue(keyVotingResult), separator)
215231 let votesForIncrease = votingResult[1]
216232 let votesForCurrent = votingResult[2]
217233 let votesForDecrease = votingResult[3]
218234 let actions = if ((voteType == "increase"))
219235 then {
220236 let newIncreaseVotes = (parseIntValue(votesForIncrease) - parseIntValue(voteValue))
221237 [StringEntry(keyVotingResult, totalVotes(toString(newIncreaseVotes), votesForCurrent, votesForDecrease))]
222238 }
223239 else if ((voteType == "decrease"))
224240 then {
225241 let newDecreaseVotes = (parseIntValue(votesForDecrease) - parseIntValue(voteValue))
226242 [StringEntry(keyVotingResult, totalVotes(votesForIncrease, votesForCurrent, toString(newDecreaseVotes)))]
227243 }
228244 else {
229245 let newCurrentVotes = (parseIntValue(votesForCurrent) - parseIntValue(voteValue))
230246 [StringEntry(keyVotingResult, totalVotes(votesForIncrease, toString(newCurrentVotes), votesForDecrease))]
231247 }
232248 let defaultActions = [DeleteEntry(keyVote(userAddress, startHeight))]
233249 (actions ++ defaultActions)
234250 }
235251 else throw("Strict value is not equal to itself.")
236252 }
237253
238254
239255
240256 @Callable(i)
241257 func setThreshold (newThreshold) = {
242258 let checks = [mustManager(i), if ((newThreshold > 0))
243259 then true
244260 else throwErr("invalid threshold")]
245261 if ((checks == checks))
246262 then $Tuple2([IntegerEntry(keyThreshold, newThreshold)], unit)
247263 else throw("Strict value is not equal to itself.")
248264 }
249265
250266
251267
252268 @Callable(i)
253269 func finalize () = {
254270 let votingFinishHeight = (getIntegerValue(keyStartHeight) + value(getInteger(keyEpochLength)))
255- let checks = [if ((height >= votingFinishHeight))
256- then true
257- else throwErr("insufficient height for completion")]
258- if ((checks == checks))
271+ if ((height >= votingFinishHeight))
259272 then {
260273 let votingResult = split(value(getString(keyVotingResult)), separator)
261274 let votesForIncrease = parseIntValue(votingResult[1])
262275 let votesForCurrent = parseIntValue(votingResult[2])
263276 let votesForDecrease = parseIntValue(votingResult[3])
264277 let allVotes = ((votesForIncrease + votesForCurrent) + votesForDecrease)
265278 let threshold = getIntOrFail(keyThreshold)
266- let $t089058985 = getRateChangeAmountsINTERNAL()
267- let increasedRate = $t089058985._1
268- let currentRate = $t089058985._2
269- let decreasedRate = $t089058985._3
279+ let $t096309710 = getRateChangeAmountsINTERNAL()
280+ let increasedRate = $t096309710._1
281+ let currentRate = $t096309710._2
282+ let decreasedRate = $t096309710._3
270283 let votesList = [votesForIncrease, votesForCurrent, votesForDecrease]
271284 let newRate = if (if ((threshold > allVotes))
272285 then true
273286 else (votesForCurrent == max(votesList)))
274287 then unit
275288 else if ((votesForIncrease == max(votesList)))
276289 then increasedRate
277290 else decreasedRate
278291 let changeRateInvokes = match newRate {
279292 case r: Int =>
280- unit
293+ let emissionChangeRate = invoke(emissionContract, "changeRatePerBlock", [r], nil)
294+ if ((emissionChangeRate == emissionChangeRate))
295+ then emissionChangeRate
296+ else throw("Strict value is not equal to itself.")
281297 case _ =>
282298 unit
283299 }
284300 if ((changeRateInvokes == changeRateInvokes))
285- then [IntegerEntry(keyStartHeight, height), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))]
301+ then [IntegerEntry(keyStartHeight, height), IntegerEntry(keyEpochLength, getEpochLength(votingEmissionContract)), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))]
286302 else throw("Strict value is not equal to itself.")
287303 }
288- else throw("Strict value is not equal to itself.")
304+ else nil
289305 }
290306
291307
292308 @Verifier(tx)
293309 func verify () = {
294310 let targetPublicKey = match managerPublicKeyOrUnit() {
295311 case pk: ByteVector =>
296312 pk
297313 case _: Unit =>
298314 tx.senderPublicKey
299315 case _ =>
300316 throw("Match error")
301317 }
302318 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
303319 }
304320

github/deemru/w8io/3ef1775 
67.90 ms