tx · 6HAYEmA4ZGBVsGuw6R1KU3YyEyXRLTfK1G5S5TnkVVtM

3N4ziXSMRverXyxHDUKKMR9MHXnB3TyU3Yh:  -0.01000000 Waves

2023.05.17 11:17 [2581698] smart account 3N4ziXSMRverXyxHDUKKMR9MHXnB3TyU3Yh > SELF 0.00000000 Waves

{ "type": 13, "id": "6HAYEmA4ZGBVsGuw6R1KU3YyEyXRLTfK1G5S5TnkVVtM", "fee": 1000000, "feeAssetId": null, "timestamp": 1684311497743, "version": 2, "chainId": 84, "sender": "3N4ziXSMRverXyxHDUKKMR9MHXnB3TyU3Yh", "senderPublicKey": "EU9obW1yVhR8qug3EmXPeew3DMagvJFQzY5Ku8bmcsU7", "proofs": [ "2GxGs1M3zD34fzSDa6Q1Ki4EEdNAtgJE1D97Cvez1ujNPAxG6CJvkYd6P1zzXBYBhy1H35vyXoJekpmwrpDfgZro" ], "script": "base64:BgIbCAISBwoFCAgBAQESABIDCgEBEgASAwoBARIAGgAJc2VwYXJhdG9yAgJfXwAOa2V5RXBvY2hMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgtlcG9jaExlbmd0aAUDbmlsBQlzZXBhcmF0b3IAE2tleUVtaXNzaW9uQ29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAhBlbWlzc2lvbkNvbnRyYWN0BQNuaWwFCXNlcGFyYXRvcgATa2V5Qm9vc3RpbmdDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUJc2VwYXJhdG9yAAxrZXlUaHJlc2hvbGQJALkJAgkAzAgCAgIlcwkAzAgCAg92b3RpbmdUaHJlc2hvbGQFA25pbAUJc2VwYXJhdG9yAA9rZXlSYXRlUGVyQmxvY2sJALkJAgkAzAgCAgQlcyVzCQDMCAICDHJhdGVQZXJCbG9jawkAzAgCAgdjdXJyZW50BQNuaWwFCXNlcGFyYXRvcgASa2V5UmF0ZVBlckJsb2NrTWF4CQC5CQIJAMwIAgIEJXMlcwkAzAgCAg9yYXRlUGVyQmxvY2tNYXgJAMwIAgIHY3VycmVudAUDbmlsBQlzZXBhcmF0b3IAEWtleVJhdGVDaGFuZ2VTdGVwCQC5CQIJAMwIAgICJXMJAMwIAgIOcmF0ZUNoYW5nZVN0ZXAFA25pbAUJc2VwYXJhdG9yAQ9nZXRTdHJpbmdPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDmtleVN0YXJ0SGVpZ2h0AAkAuQkCCQDMCAICAiVzCQDMCAICC3N0YXJ0SGVpZ2h0BQNuaWwFCXNlcGFyYXRvcgEPa2V5Vm90aW5nUmVzdWx0AAkAuQkCCQDMCAICAiVzCQDMCAICDHZvdGluZ1Jlc3VsdAUDbmlsBQlzZXBhcmF0b3IBCnRvdGFsVm90ZXMDDXRvdGFsSW5jcmVhc2UJdG90YWxOb25lDXRvdGFsRGVjcmVhc2UJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgUNdG90YWxJbmNyZWFzZQkAzAgCBQl0b3RhbE5vbmUJAMwIAgUNdG90YWxEZWNyZWFzZQUDbmlsBQlzZXBhcmF0b3IBB2tleVZvdGUBDHZvdGVyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIEdm90ZQkAzAgCBQx2b3RlckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yAQxrZXlWb3RlVmFsdWUCCWd3eEFtb3VudAR2b3RlBANrZXkDCQAAAgUEdm90ZQABCQC5CQIJAMwIAgIEJWQlcwkAzAgCBQlnd3hBbW91bnQJAMwIAgIIaW5jcmVhc2UFA25pbAUJc2VwYXJhdG9yAwkAAAIFBHZvdGUA////////////AQkAuQkCCQDMCAICBCVkJXMJAMwIAgUJZ3d4QW1vdW50CQDMCAICCGRlY3JlYXNlBQNuaWwFCXNlcGFyYXRvcgkAuQkCCQDMCAICBCVkJXMJAMwIAgUJZ3d4QW1vdW50CQDMCAICBG5vbmUFA25pbAUJc2VwYXJhdG9yBQNrZXkAEGJvb3N0aW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBBRNrZXlCb29zdGluZ0NvbnRyYWN0ABBlbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQUTa2V5RW1pc3Npb25Db250cmFjdAETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMABAckbWF0Y2gwCQCiCAEJARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXMFBHRoaXMBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABBNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAJ0IAgUTbWFuYWdlclZhdWx0QWRkcmVzcwkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEJaXNNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkDCQEJaXNNYW5hZ2VyAQUBaQYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhtmYWlsZWQgdG8gY2FzdCBpbnRvIEludGVnZXIBC2NhbGNOZXdSYXRlAw9yYXRlUGVyQmxvY2tNYXgMcmF0ZVBlckJsb2NrCmNoYW5nZVN0ZXAECm1heEFsbG93ZWQJAGsDAGQFD3JhdGVQZXJCbG9ja01heAB4BA1pbmNyZWFzZWRSYXRlCQCXAwEJAMwIAgkAawMJAGQCAGQFCmNoYW5nZVN0ZXAFDHJhdGVQZXJCbG9jawBkCQDMCAIFCm1heEFsbG93ZWQFA25pbAQNZGVjcmVhc2VkUmF0ZQkAlgMBCQDMCAIJAGsDCQBlAgBkBQpjaGFuZ2VTdGVwBQxyYXRlUGVyQmxvY2sAZAkAzAgCAAAFA25pbAkAlQoDBQ1pbmNyZWFzZWRSYXRlBQxyYXRlUGVyQmxvY2sFDWRlY3JlYXNlZFJhdGUBHGdldFJhdGVDaGFuZ2VBbW91bnRzSU5URVJOQUwABA9yYXRlUGVyQmxvY2tNYXgJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEGVtaXNzaW9uQ29udHJhY3QFEmtleVJhdGVQZXJCbG9ja01heAQMcmF0ZVBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBRBlbWlzc2lvbkNvbnRyYWN0BQ9rZXlSYXRlUGVyQmxvY2sEDnJhdGVDaGFuZ2VTdGVwCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrZXlSYXRlQ2hhbmdlU3RlcAkBC2NhbGNOZXdSYXRlAwUPcmF0ZVBlckJsb2NrTWF4BQxyYXRlUGVyQmxvY2sFDnJhdGVDaGFuZ2VTdGVwBgFpAQtjb25zdHJ1Y3RvcgUTYm9vc3RpbmdDb250cmFjdFBybRNlbWlzc2lvbkNvbnRyYWN0UHJtEXZvdGluZ0R1cmF0aW9uUHJtCXRocmVzaG9sZA5yYXRlQ2hhbmdlU3RlcAQGY2hlY2tzCQDMCAIDCQEJaXNEZWZpbmVkAQkApggBBRNib29zdGluZ0NvbnRyYWN0UHJtBgkAAgECIUludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBCWlzRGVmaW5lZAEJAKYIAQUTZW1pc3Npb25Db250cmFjdFBybQYJAAIBAiFJbnZhbGlkIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBRF2b3RpbmdEdXJhdGlvblBybQAABgkAAgECF0ludmFsaWQgdm90aW5nIGR1cmF0aW9uCQDMCAIDCQBmAgUJdGhyZXNob2xkAAAGCQACAQIRaW52YWxpZCB0aHJlc2hvbGQJAMwIAgMJAGYCBQ5yYXRlQ2hhbmdlU3RlcAAABgkAAgECFmludmFsaWQgcmF0ZUNoYW5nZVN0ZXAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFE2tleUJvb3N0aW5nQ29udHJhY3QFE2Jvb3N0aW5nQ29udHJhY3RQcm0JAMwIAgkBC1N0cmluZ0VudHJ5AgUTa2V5RW1pc3Npb25Db250cmFjdAUTZW1pc3Npb25Db250cmFjdFBybQkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa2V5RXBvY2hMZW5ndGgFEXZvdGluZ0R1cmF0aW9uUHJtCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrZXlUaHJlc2hvbGQFCXRocmVzaG9sZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5UmF0ZUNoYW5nZVN0ZXAFDnJhdGVDaGFuZ2VTdGVwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5U3RhcnRIZWlnaHQABQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVZvdGluZ1Jlc3VsdAAJAQp0b3RhbFZvdGVzAwIBMAIBMAIBMAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHGdldFJhdGVDaGFuZ2VBbW91bnRzUkVBRE9OTFkACQCUCgIFA25pbAkBHGdldFJhdGVDaGFuZ2VBbW91bnRzSU5URVJOQUwAAWkBBHZvdGUBB2luRmF2b3IEEnZvdGluZ0ZpbmlzaEhlaWdodAkAZAIJAQV2YWx1ZQEJAJ8IAQkBDmtleVN0YXJ0SGVpZ2h0AAkBBXZhbHVlAQkAnwgBBQ5rZXlFcG9jaExlbmd0aAQGY2hlY2tzCQDMCAIDCQBmAgUSdm90aW5nRmluaXNoSGVpZ2h0BQZoZWlnaHQGCQACAQIQdG9vIGxhdGUgdG8gdm90ZQkAzAgCAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgABCQDMCAIAAAkAzAgCAP///////////wEFA25pbAUHaW5GYXZvcgYJAAIBAhJub3QgdmFsaWQgYXJndW1lbnQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQJZ3d4QW1vdW50CQD8BwQFEGJvb3N0aW5nQ29udHJhY3QCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFEnZvdGluZ0ZpbmlzaEhlaWdodAUDbmlsBQNuaWwEB25vdFplcm8DCQBmAgkBBWFzSW50AQUJZ3d4QW1vdW50AAAGCQACAQISeW91IGRvbid0IGhhdmUgZ3d4AwkAAAIFB25vdFplcm8FB25vdFplcm8EBHZvdGUEByRtYXRjaDAJAKIIAQkBB2tleVZvdGUBCQClCAEIBQFpBmNhbGxlcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAEBHZvdGUJALUJAgUBcwUJc2VwYXJhdG9yBAl2b3RlVmFsdWUJAJEDAgUEdm90ZQABBAh2b3RlVHlwZQkAkQMCBQR2b3RlAAIEEWlzVm90ZVR5cGVTaW1pbGFyAwMDCQAAAgUIdm90ZVR5cGUCCGluY3JlYXNlCQAAAgUHaW5GYXZvcgABBwYDCQAAAgUIdm90ZVR5cGUCCGRlY3JlYXNlCQAAAgUHaW5GYXZvcgD///////////8BBwYDCQAAAgUIdm90ZVR5cGUCBG5vbmUJAAACBQdpbkZhdm9yAAAHBBJpc1ZvdGVWYWx1ZVNpbWlsYXIDBRFpc1ZvdGVUeXBlU2ltaWxhcgkAAAIJAQVhc0ludAEFCWd3eEFtb3VudAkBDXBhcnNlSW50VmFsdWUBBQl2b3RlVmFsdWUHBBBpc05ld1ZvdGVTaW1pbGFyAwMFEWlzVm90ZVR5cGVTaW1pbGFyBRJpc1ZvdGVWYWx1ZVNpbWlsYXIHCQACAQIReW91IGFscmVhZHkgdm90ZWQJAPwHBAUEdGhpcwIKY2FuY2VsVm90ZQUDbmlsBQNuaWwFEGlzTmV3Vm90ZVNpbWlsYXIDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAUBdQkAAgECC01hdGNoIGVycm9yAwkAAAIFBHZvdGUFBHZvdGUEDHZvdGluZ1Jlc3VsdAkAtQkCCQEFdmFsdWUBCQCiCAEJAQ9rZXlWb3RpbmdSZXN1bHQABQlzZXBhcmF0b3IED3ZvdGVzVG9JbmNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAQQLdm90ZXNUb05vbmUJAJEDAgUMdm90aW5nUmVzdWx0AAIED3ZvdGVzVG9EZWNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAwQbbmV3UG9zaXRpdmVBbmROZWdhdGl2ZVZvdGVzAwkAAAIFB2luRmF2b3IAAQQQbmV3UG9zaXRpdmVWb3RlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQUPdm90ZXNUb0luY3JlYXNlCQEFYXNJbnQBBQlnd3hBbW91bnQJAMwIAgkApAMBBRBuZXdQb3NpdGl2ZVZvdGVzCQDMCAIFC3ZvdGVzVG9Ob25lCQDMCAIFD3ZvdGVzVG9EZWNyZWFzZQUDbmlsAwkAAAIFB2luRmF2b3IA////////////AQQQbmV3TmVnYXRpdmVWb3RlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQULdm90ZXNUb05vbmUJAQVhc0ludAEFCWd3eEFtb3VudAkAzAgCBQ92b3Rlc1RvSW5jcmVhc2UJAMwIAgULdm90ZXNUb05vbmUJAMwIAgkApAMBBRBuZXdOZWdhdGl2ZVZvdGVzBQNuaWwEDG5ld05vbmVWb3RlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQULdm90ZXNUb05vbmUJAQVhc0ludAEFCWd3eEFtb3VudAkAzAgCBQ92b3Rlc1RvSW5jcmVhc2UJAMwIAgkApAMBBQxuZXdOb25lVm90ZXMJAMwIAgUPdm90ZXNUb0RlY3JlYXNlBQNuaWwEB3ZvdGVLZXkJAQdrZXlWb3RlAQkApQgBCAUBaQZjYWxsZXIECXZvdGVWYWx1ZQkBDGtleVZvdGVWYWx1ZQIJAKQDAQkBBWFzSW50AQUJZ3d4QW1vdW50BQdpbkZhdm9yCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVZvdGluZ1Jlc3VsdAAJAQp0b3RhbFZvdGVzAwkAkQMCBRtuZXdQb3NpdGl2ZUFuZE5lZ2F0aXZlVm90ZXMAAAkAkQMCBRtuZXdQb3NpdGl2ZUFuZE5lZ2F0aXZlVm90ZXMAAQkAkQMCBRtuZXdQb3NpdGl2ZUFuZE5lZ2F0aXZlVm90ZXMAAgkAzAgCCQELU3RyaW5nRW50cnkCBQd2b3RlS2V5BQl2b3RlVmFsdWUFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjYW5jZWxWb3RlAAQLdXNlckFkZHJlc3MDCQAAAggFAWkGY2FsbGVyBQR0aGlzCQClCAEIBQFpDG9yaWdpbkNhbGxlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkAzAgCAwkBCWlzRGVmaW5lZAEJAKIIAQkBD2tleVZvdGluZ1Jlc3VsdAAGCQACAQIHbm8gdm90ZQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAR2b3RlCQC1CQIJAQV2YWx1ZQEJAKIIAQkBB2tleVZvdGUBBQt1c2VyQWRkcmVzcwUJc2VwYXJhdG9yBAl2b3RlVmFsdWUJAJEDAgUEdm90ZQABBAh2b3RlVHlwZQkAkQMCBQR2b3RlAAIEDHZvdGluZ1Jlc3VsdAkAtQkCCQEFdmFsdWUBCQCiCAEJAQ9rZXlWb3RpbmdSZXN1bHQABQlzZXBhcmF0b3IED3ZvdGVzVG9JbmNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAQQLdm90ZXNUb05vbmUJAJEDAgUMdm90aW5nUmVzdWx0AAIED3ZvdGVzVG9EZWNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAwQHYWN0aW9ucwMJAAACBQh2b3RlVHlwZQIIaW5jcmVhc2UEEG5ld0luY3JlYXNlVm90ZXMJAGUCCQENcGFyc2VJbnRWYWx1ZQEFD3ZvdGVzVG9JbmNyZWFzZQkBDXBhcnNlSW50VmFsdWUBBQl2b3RlVmFsdWUJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5Vm90aW5nUmVzdWx0AAkBCnRvdGFsVm90ZXMDCQCkAwEFEG5ld0luY3JlYXNlVm90ZXMFC3ZvdGVzVG9Ob25lBQ92b3Rlc1RvRGVjcmVhc2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVZvdGUBBQt1c2VyQWRkcmVzcwUDbmlsBQR1bml0AwkAAAIFCHZvdGVUeXBlAghkZWNyZWFzZQQQbmV3RGVjcmVhc2VWb3RlcwkAZQIJAQ1wYXJzZUludFZhbHVlAQUPdm90ZXNUb0RlY3JlYXNlCQENcGFyc2VJbnRWYWx1ZQEFCXZvdGVWYWx1ZQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlWb3RpbmdSZXN1bHQACQEKdG90YWxWb3RlcwMFD3ZvdGVzVG9JbmNyZWFzZQULdm90ZXNUb05vbmUJAKQDAQUQbmV3RGVjcmVhc2VWb3RlcwkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Vm90ZQEFC3VzZXJBZGRyZXNzBQNuaWwFBHVuaXQEDG5ld05vbmVWb3RlcwkAZQIJAQ1wYXJzZUludFZhbHVlAQULdm90ZXNUb05vbmUJAQ1wYXJzZUludFZhbHVlAQUJdm90ZVZhbHVlCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVZvdGluZ1Jlc3VsdAAJAQp0b3RhbFZvdGVzAwUPdm90ZXNUb0luY3JlYXNlCQCkAwEFDG5ld05vbmVWb3RlcwUPdm90ZXNUb0RlY3JlYXNlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlWb3RlAQULdXNlckFkZHJlc3MFA25pbAUEdW5pdAUHYWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxzZXRUaHJlc2hvbGQBDG5ld1RocmVzaG9sZAQGY2hlY2tzCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAGYCBQxuZXdUaHJlc2hvbGQAAAYJAAIBAhFpbnZhbGlkIHRocmVzaG9sZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtleVRocmVzaG9sZAUMbmV3VGhyZXNob2xkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZmluYWxpemUABBJ2b3RpbmdGaW5pc2hIZWlnaHQJAGQCCQEFdmFsdWUBCQCfCAEJAQ5rZXlTdGFydEhlaWdodAAJAQV2YWx1ZQEJAJ8IAQUOa2V5RXBvY2hMZW5ndGgEBmNoZWNrcwkAzAgCAwkAZwIFBmhlaWdodAUSdm90aW5nRmluaXNoSGVpZ2h0BgkAAgECImluc3VmZmljaWVudCBoZWlnaHQgZm9yIGNvbXBsZXRpb24FA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQMdm90aW5nUmVzdWx0CQC1CQIJAQV2YWx1ZQEJAKIIAQkBD2tleVZvdGluZ1Jlc3VsdAAFCXNlcGFyYXRvcgQPdm90ZXNUb0luY3JlYXNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMdm90aW5nUmVzdWx0AAEEC3ZvdGVzVG9Ob25lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMdm90aW5nUmVzdWx0AAIED3ZvdGVzVG9EZWNyZWFzZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHZvdGluZ1Jlc3VsdAADBAhhbGxWb3RlcwkAZAIJAGQCBQ92b3Rlc1RvSW5jcmVhc2UFC3ZvdGVzVG9Ob25lBQ92b3Rlc1RvRGVjcmVhc2UECXRocmVzaG9sZAkBDGdldEludE9yRmFpbAEFDGtleVRocmVzaG9sZAQLJHQwODgwOTg4ODkJARxnZXRSYXRlQ2hhbmdlQW1vdW50c0lOVEVSTkFMAAQNaW5jcmVhc2VkUmF0ZQgFCyR0MDg4MDk4ODg5Al8xBAtjdXJyZW50UmF0ZQgFCyR0MDg4MDk4ODg5Al8yBA1kZWNyZWFzZWRSYXRlCAULJHQwODgwOTg4ODkCXzMECXZvdGVzTGlzdAkAzAgCBQ92b3Rlc1RvSW5jcmVhc2UJAMwIAgULdm90ZXNUb05vbmUJAMwIAgUPdm90ZXNUb0RlY3JlYXNlBQNuaWwEB2FjdGlvbnMDCQBmAgUJdGhyZXNob2xkBQhhbGxWb3RlcwUDbmlsAwkAAAIFC3ZvdGVzVG9Ob25lCQCWAwEFCXZvdGVzTGlzdAkAzAgCCQELU3RyaW5nRW50cnkCAgNmb28CBE5PTkUFA25pbAMJAAACBQ92b3Rlc1RvSW5jcmVhc2UJAJYDAQUJdm90ZXNMaXN0CQDMCAIJAQtTdHJpbmdFbnRyeQICA2ZvbwIDSU5DBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgIDZm9vAgNERUMFA25pbAkAzggCBQdhY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5U3RhcnRIZWlnaHQABQZoZWlnaHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgBlgtUC", "height": 2581698, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3rumRM2sxAoLHRrmj6QFirWw72dUrnBugoEkG5231xGq Next: 75H7XxBiqjXVS1RAzut7RK42aV16oZ1xhQGzPfdHXfD9 Diff:
OldNewDifferences
295295 else if ((votesToIncrease == max(votesList)))
296296 then [StringEntry("foo", "INC")]
297297 else [StringEntry("foo", "DEC")]
298- actions
298+ (actions ++ [IntegerEntry(keyStartHeight(), height)])
299299 }
300300 else throw("Strict value is not equal to itself.")
301301 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let keyEpochLength = makeString(["%s", "epochLength"], separator)
77
88 let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
99
1010 let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
1111
1212 let keyThreshold = makeString(["%s", "votingThreshold"], separator)
1313
1414 let keyRatePerBlock = makeString(["%s%s", "ratePerBlock", "current"], separator)
1515
1616 let keyRatePerBlockMax = makeString(["%s%s", "ratePerBlockMax", "current"], separator)
1717
1818 let keyRateChangeStep = makeString(["%s", "rateChangeStep"], separator)
1919
2020 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
2121
2222
2323 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (key + " is not defined"))
2424
2525
2626 func keyStartHeight () = makeString(["%s", "startHeight"], separator)
2727
2828
2929 func keyVotingResult () = makeString(["%s", "votingResult"], separator)
3030
3131
3232 func totalVotes (totalIncrease,totalNone,totalDecrease) = makeString(["%d%d%d", totalIncrease, totalNone, totalDecrease], separator)
3333
3434
3535 func keyVote (voterAddress) = makeString(["%s%s", "vote", voterAddress], separator)
3636
3737
3838 func keyVoteValue (gwxAmount,vote) = {
3939 let key = if ((vote == 1))
4040 then makeString(["%d%s", gwxAmount, "increase"], separator)
4141 else if ((vote == -1))
4242 then makeString(["%d%s", gwxAmount, "decrease"], separator)
4343 else makeString(["%d%s", gwxAmount, "none"], separator)
4444 key
4545 }
4646
4747
4848 let boostingContract = addressFromStringValue(getStringOrFail(keyBoostingContract))
4949
5050 let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract))
5151
5252 func keyManagerPublicKey () = "%s__managerPublicKey"
5353
5454
5555 func keyManagerVaultAddress () = "%s__managerVaultAddress"
5656
5757
5858 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
5959 case s: String =>
6060 addressFromStringValue(s)
6161 case _ =>
6262 this
6363 }
6464
6565
6666 func managerPublicKeyOrUnit () = {
6767 let managerVaultAddress = getManagerVaultAddressOrThis()
6868 match getString(managerVaultAddress, keyManagerPublicKey()) {
6969 case s: String =>
7070 fromBase58String(s)
7171 case _: Unit =>
7272 unit
7373 case _ =>
7474 throw("Match error")
7575 }
7676 }
7777
7878
7979 func isManager (i) = match managerPublicKeyOrUnit() {
8080 case pk: ByteVector =>
8181 (i.callerPublicKey == pk)
8282 case _: Unit =>
8383 (i.caller == this)
8484 case _ =>
8585 throw("Match error")
8686 }
8787
8888
8989 func mustManager (i) = if (isManager(i))
9090 then true
9191 else throw("permission denied")
9292
9393
9494 func asInt (val) = match val {
9595 case valInt: Int =>
9696 valInt
9797 case _ =>
9898 throw("failed to cast into Integer")
9999 }
100100
101101
102102 func calcNewRate (ratePerBlockMax,ratePerBlock,changeStep) = {
103103 let maxAllowed = fraction(100, ratePerBlockMax, 120)
104104 let increasedRate = min([fraction((100 + changeStep), ratePerBlock, 100), maxAllowed])
105105 let decreasedRate = max([fraction((100 - changeStep), ratePerBlock, 100), 0])
106106 $Tuple3(increasedRate, ratePerBlock, decreasedRate)
107107 }
108108
109109
110110 func getRateChangeAmountsINTERNAL () = {
111111 let ratePerBlockMax = getIntegerValue(emissionContract, keyRatePerBlockMax)
112112 let ratePerBlock = getIntegerValue(emissionContract, keyRatePerBlock)
113113 let rateChangeStep = getIntegerValue(this, keyRateChangeStep)
114114 calcNewRate(ratePerBlockMax, ratePerBlock, rateChangeStep)
115115 }
116116
117117
118118 @Callable(i)
119119 func constructor (boostingContractPrm,emissionContractPrm,votingDurationPrm,threshold,rateChangeStep) = {
120120 let checks = [if (isDefined(addressFromString(boostingContractPrm)))
121121 then true
122122 else throw("Invalid boosting contract address"), if (isDefined(addressFromString(emissionContractPrm)))
123123 then true
124124 else throw("Invalid emission contract address"), if ((votingDurationPrm > 0))
125125 then true
126126 else throw("Invalid voting duration"), if ((threshold > 0))
127127 then true
128128 else throw("invalid threshold"), if ((rateChangeStep > 0))
129129 then true
130130 else throw("invalid rateChangeStep")]
131131 if ((checks == checks))
132132 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)
133133 else throw("Strict value is not equal to itself.")
134134 }
135135
136136
137137
138138 @Callable(i)
139139 func getRateChangeAmountsREADONLY () = $Tuple2(nil, getRateChangeAmountsINTERNAL())
140140
141141
142142
143143 @Callable(i)
144144 func vote (inFavor) = {
145145 let votingFinishHeight = (value(getInteger(keyStartHeight())) + value(getInteger(keyEpochLength)))
146146 let checks = [if ((votingFinishHeight > height))
147147 then true
148148 else throw("too late to vote"), if (containsElement([1, 0, -1], inFavor))
149149 then true
150150 else throw("not valid argument")]
151151 if ((checks == checks))
152152 then {
153153 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [toString(i.caller), votingFinishHeight], nil)
154154 let notZero = if ((asInt(gwxAmount) > 0))
155155 then true
156156 else throw("you don't have gwx")
157157 if ((notZero == notZero))
158158 then {
159159 let vote = match getString(keyVote(toString(i.caller))) {
160160 case s: String =>
161161 let vote = split(s, separator)
162162 let voteValue = vote[1]
163163 let voteType = vote[2]
164164 let isVoteTypeSimilar = if (if (if ((voteType == "increase"))
165165 then (inFavor == 1)
166166 else false)
167167 then true
168168 else if ((voteType == "decrease"))
169169 then (inFavor == -1)
170170 else false)
171171 then true
172172 else if ((voteType == "none"))
173173 then (inFavor == 0)
174174 else false
175175 let isVoteValueSimilar = if (isVoteTypeSimilar)
176176 then (asInt(gwxAmount) == parseIntValue(voteValue))
177177 else false
178178 let isNewVoteSimilar = if (if (isVoteTypeSimilar)
179179 then isVoteValueSimilar
180180 else false)
181181 then throw("you already voted")
182182 else invoke(this, "cancelVote", nil, nil)
183183 isNewVoteSimilar
184184 case u: Unit =>
185185 u
186186 case _ =>
187187 throw("Match error")
188188 }
189189 if ((vote == vote))
190190 then {
191191 let votingResult = split(value(getString(keyVotingResult())), separator)
192192 let votesToIncrease = votingResult[1]
193193 let votesToNone = votingResult[2]
194194 let votesToDecrease = votingResult[3]
195195 let newPositiveAndNegativeVotes = if ((inFavor == 1))
196196 then {
197197 let newPositiveVotes = (parseIntValue(votesToIncrease) + asInt(gwxAmount))
198198 [toString(newPositiveVotes), votesToNone, votesToDecrease]
199199 }
200200 else if ((inFavor == -1))
201201 then {
202202 let newNegativeVotes = (parseIntValue(votesToNone) + asInt(gwxAmount))
203203 [votesToIncrease, votesToNone, toString(newNegativeVotes)]
204204 }
205205 else {
206206 let newNoneVotes = (parseIntValue(votesToNone) + asInt(gwxAmount))
207207 [votesToIncrease, toString(newNoneVotes), votesToDecrease]
208208 }
209209 let voteKey = keyVote(toString(i.caller))
210210 let voteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
211211 $Tuple2([StringEntry(keyVotingResult(), totalVotes(newPositiveAndNegativeVotes[0], newPositiveAndNegativeVotes[1], newPositiveAndNegativeVotes[2])), StringEntry(voteKey, voteValue)], unit)
212212 }
213213 else throw("Strict value is not equal to itself.")
214214 }
215215 else throw("Strict value is not equal to itself.")
216216 }
217217 else throw("Strict value is not equal to itself.")
218218 }
219219
220220
221221
222222 @Callable(i)
223223 func cancelVote () = {
224224 let userAddress = if ((i.caller == this))
225225 then toString(i.originCaller)
226226 else toString(i.caller)
227227 let checks = [if (isDefined(getString(keyVotingResult())))
228228 then true
229229 else throw("no vote")]
230230 if ((checks == checks))
231231 then {
232232 let vote = split(value(getString(keyVote(userAddress))), separator)
233233 let voteValue = vote[1]
234234 let voteType = vote[2]
235235 let votingResult = split(value(getString(keyVotingResult())), separator)
236236 let votesToIncrease = votingResult[1]
237237 let votesToNone = votingResult[2]
238238 let votesToDecrease = votingResult[3]
239239 let actions = if ((voteType == "increase"))
240240 then {
241241 let newIncreaseVotes = (parseIntValue(votesToIncrease) - parseIntValue(voteValue))
242242 $Tuple2([StringEntry(keyVotingResult(), totalVotes(toString(newIncreaseVotes), votesToNone, votesToDecrease)), DeleteEntry(keyVote(userAddress))], unit)
243243 }
244244 else if ((voteType == "decrease"))
245245 then {
246246 let newDecreaseVotes = (parseIntValue(votesToDecrease) - parseIntValue(voteValue))
247247 $Tuple2([StringEntry(keyVotingResult(), totalVotes(votesToIncrease, votesToNone, toString(newDecreaseVotes))), DeleteEntry(keyVote(userAddress))], unit)
248248 }
249249 else {
250250 let newNoneVotes = (parseIntValue(votesToNone) - parseIntValue(voteValue))
251251 $Tuple2([StringEntry(keyVotingResult(), totalVotes(votesToIncrease, toString(newNoneVotes), votesToDecrease)), DeleteEntry(keyVote(userAddress))], unit)
252252 }
253253 actions
254254 }
255255 else throw("Strict value is not equal to itself.")
256256 }
257257
258258
259259
260260 @Callable(i)
261261 func setThreshold (newThreshold) = {
262262 let checks = [mustManager(i), if ((newThreshold > 0))
263263 then true
264264 else throw("invalid threshold")]
265265 if ((checks == checks))
266266 then $Tuple2([IntegerEntry(keyThreshold, newThreshold)], unit)
267267 else throw("Strict value is not equal to itself.")
268268 }
269269
270270
271271
272272 @Callable(i)
273273 func finalize () = {
274274 let votingFinishHeight = (value(getInteger(keyStartHeight())) + value(getInteger(keyEpochLength)))
275275 let checks = [if ((height >= votingFinishHeight))
276276 then true
277277 else throw("insufficient height for completion")]
278278 if ((checks == checks))
279279 then {
280280 let votingResult = split(value(getString(keyVotingResult())), separator)
281281 let votesToIncrease = parseIntValue(votingResult[1])
282282 let votesToNone = parseIntValue(votingResult[2])
283283 let votesToDecrease = parseIntValue(votingResult[3])
284284 let allVotes = ((votesToIncrease + votesToNone) + votesToDecrease)
285285 let threshold = getIntOrFail(keyThreshold)
286286 let $t088098889 = getRateChangeAmountsINTERNAL()
287287 let increasedRate = $t088098889._1
288288 let currentRate = $t088098889._2
289289 let decreasedRate = $t088098889._3
290290 let votesList = [votesToIncrease, votesToNone, votesToDecrease]
291291 let actions = if ((threshold > allVotes))
292292 then nil
293293 else if ((votesToNone == max(votesList)))
294294 then [StringEntry("foo", "NONE")]
295295 else if ((votesToIncrease == max(votesList)))
296296 then [StringEntry("foo", "INC")]
297297 else [StringEntry("foo", "DEC")]
298- actions
298+ (actions ++ [IntegerEntry(keyStartHeight(), height)])
299299 }
300300 else throw("Strict value is not equal to itself.")
301301 }
302302
303303

github/deemru/w8io/169f3d6 
75.95 ms