tx · 3rumRM2sxAoLHRrmj6QFirWw72dUrnBugoEkG5231xGq

3N4ziXSMRverXyxHDUKKMR9MHXnB3TyU3Yh:  -0.01000000 Waves

2023.05.17 11:13 [2581693] smart account 3N4ziXSMRverXyxHDUKKMR9MHXnB3TyU3Yh > SELF 0.00000000 Waves

{ "type": 13, "id": "3rumRM2sxAoLHRrmj6QFirWw72dUrnBugoEkG5231xGq", "fee": 1000000, "feeAssetId": null, "timestamp": 1684311215271, "version": 2, "chainId": 84, "sender": "3N4ziXSMRverXyxHDUKKMR9MHXnB3TyU3Yh", "senderPublicKey": "EU9obW1yVhR8qug3EmXPeew3DMagvJFQzY5Ku8bmcsU7", "proofs": [ "4BKV5F5aVBiZtFqNcfBkw7bPdFGyrGPEUSFTH8MbhkQNQrL2ZPtUP7o5CPDDQZ4TjmxAHnxah6qfLfnrzSQtKqrB" ], "script": "base64:BgIbCAISBwoFCAgBAQESABIDCgEBEgASAwoBARIAGgAJc2VwYXJhdG9yAgJfXwAOa2V5RXBvY2hMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgtlcG9jaExlbmd0aAUDbmlsBQlzZXBhcmF0b3IAE2tleUVtaXNzaW9uQ29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAhBlbWlzc2lvbkNvbnRyYWN0BQNuaWwFCXNlcGFyYXRvcgATa2V5Qm9vc3RpbmdDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUJc2VwYXJhdG9yAAxrZXlUaHJlc2hvbGQJALkJAgkAzAgCAgIlcwkAzAgCAg92b3RpbmdUaHJlc2hvbGQFA25pbAUJc2VwYXJhdG9yAA9rZXlSYXRlUGVyQmxvY2sJALkJAgkAzAgCAgQlcyVzCQDMCAICDHJhdGVQZXJCbG9jawkAzAgCAgdjdXJyZW50BQNuaWwFCXNlcGFyYXRvcgASa2V5UmF0ZVBlckJsb2NrTWF4CQC5CQIJAMwIAgIEJXMlcwkAzAgCAg9yYXRlUGVyQmxvY2tNYXgJAMwIAgIHY3VycmVudAUDbmlsBQlzZXBhcmF0b3IAEWtleVJhdGVDaGFuZ2VTdGVwCQC5CQIJAMwIAgICJXMJAMwIAgIOcmF0ZUNoYW5nZVN0ZXAFA25pbAUJc2VwYXJhdG9yAQ9nZXRTdHJpbmdPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDmtleVN0YXJ0SGVpZ2h0AAkAuQkCCQDMCAICAiVzCQDMCAICC3N0YXJ0SGVpZ2h0BQNuaWwFCXNlcGFyYXRvcgEPa2V5Vm90aW5nUmVzdWx0AAkAuQkCCQDMCAICAiVzCQDMCAICDHZvdGluZ1Jlc3VsdAUDbmlsBQlzZXBhcmF0b3IBCnRvdGFsVm90ZXMDDXRvdGFsSW5jcmVhc2UJdG90YWxOb25lDXRvdGFsRGVjcmVhc2UJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgUNdG90YWxJbmNyZWFzZQkAzAgCBQl0b3RhbE5vbmUJAMwIAgUNdG90YWxEZWNyZWFzZQUDbmlsBQlzZXBhcmF0b3IBB2tleVZvdGUBDHZvdGVyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIEdm90ZQkAzAgCBQx2b3RlckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yAQxrZXlWb3RlVmFsdWUCCWd3eEFtb3VudAR2b3RlBANrZXkDCQAAAgUEdm90ZQABCQC5CQIJAMwIAgIEJWQlcwkAzAgCBQlnd3hBbW91bnQJAMwIAgIIaW5jcmVhc2UFA25pbAUJc2VwYXJhdG9yAwkAAAIFBHZvdGUA////////////AQkAuQkCCQDMCAICBCVkJXMJAMwIAgUJZ3d4QW1vdW50CQDMCAICCGRlY3JlYXNlBQNuaWwFCXNlcGFyYXRvcgkAuQkCCQDMCAICBCVkJXMJAMwIAgUJZ3d4QW1vdW50CQDMCAICBG5vbmUFA25pbAUJc2VwYXJhdG9yBQNrZXkAEGJvb3N0aW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBBRNrZXlCb29zdGluZ0NvbnRyYWN0ABBlbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQUTa2V5RW1pc3Npb25Db250cmFjdAETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMABAckbWF0Y2gwCQCiCAEJARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXMFBHRoaXMBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABBNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAJ0IAgUTbWFuYWdlclZhdWx0QWRkcmVzcwkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEJaXNNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkDCQEJaXNNYW5hZ2VyAQUBaQYJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhtmYWlsZWQgdG8gY2FzdCBpbnRvIEludGVnZXIBC2NhbGNOZXdSYXRlAw9yYXRlUGVyQmxvY2tNYXgMcmF0ZVBlckJsb2NrCmNoYW5nZVN0ZXAECm1heEFsbG93ZWQJAGsDAGQFD3JhdGVQZXJCbG9ja01heAB4BA1pbmNyZWFzZWRSYXRlCQCXAwEJAMwIAgkAawMJAGQCAGQFCmNoYW5nZVN0ZXAFDHJhdGVQZXJCbG9jawBkCQDMCAIFCm1heEFsbG93ZWQFA25pbAQNZGVjcmVhc2VkUmF0ZQkAlgMBCQDMCAIJAGsDCQBlAgBkBQpjaGFuZ2VTdGVwBQxyYXRlUGVyQmxvY2sAZAkAzAgCAAAFA25pbAkAlQoDBQ1pbmNyZWFzZWRSYXRlBQxyYXRlUGVyQmxvY2sFDWRlY3JlYXNlZFJhdGUBHGdldFJhdGVDaGFuZ2VBbW91bnRzSU5URVJOQUwABA9yYXRlUGVyQmxvY2tNYXgJARFAZXh0ck5hdGl2ZSgxMDUwKQIFEGVtaXNzaW9uQ29udHJhY3QFEmtleVJhdGVQZXJCbG9ja01heAQMcmF0ZVBlckJsb2NrCQERQGV4dHJOYXRpdmUoMTA1MCkCBRBlbWlzc2lvbkNvbnRyYWN0BQ9rZXlSYXRlUGVyQmxvY2sEDnJhdGVDaGFuZ2VTdGVwCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRFrZXlSYXRlQ2hhbmdlU3RlcAkBC2NhbGNOZXdSYXRlAwUPcmF0ZVBlckJsb2NrTWF4BQxyYXRlUGVyQmxvY2sFDnJhdGVDaGFuZ2VTdGVwBgFpAQtjb25zdHJ1Y3RvcgUTYm9vc3RpbmdDb250cmFjdFBybRNlbWlzc2lvbkNvbnRyYWN0UHJtEXZvdGluZ0R1cmF0aW9uUHJtCXRocmVzaG9sZA5yYXRlQ2hhbmdlU3RlcAQGY2hlY2tzCQDMCAIDCQEJaXNEZWZpbmVkAQkApggBBRNib29zdGluZ0NvbnRyYWN0UHJtBgkAAgECIUludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBCWlzRGVmaW5lZAEJAKYIAQUTZW1pc3Npb25Db250cmFjdFBybQYJAAIBAiFJbnZhbGlkIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MJAMwIAgMJAGYCBRF2b3RpbmdEdXJhdGlvblBybQAABgkAAgECF0ludmFsaWQgdm90aW5nIGR1cmF0aW9uCQDMCAIDCQBmAgUJdGhyZXNob2xkAAAGCQACAQIRaW52YWxpZCB0aHJlc2hvbGQJAMwIAgMJAGYCBQ5yYXRlQ2hhbmdlU3RlcAAABgkAAgECFmludmFsaWQgcmF0ZUNoYW5nZVN0ZXAFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFE2tleUJvb3N0aW5nQ29udHJhY3QFE2Jvb3N0aW5nQ29udHJhY3RQcm0JAMwIAgkBC1N0cmluZ0VudHJ5AgUTa2V5RW1pc3Npb25Db250cmFjdAUTZW1pc3Npb25Db250cmFjdFBybQkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa2V5RXBvY2hMZW5ndGgFEXZvdGluZ0R1cmF0aW9uUHJtCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrZXlUaHJlc2hvbGQFCXRocmVzaG9sZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa2V5UmF0ZUNoYW5nZVN0ZXAFDnJhdGVDaGFuZ2VTdGVwCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5U3RhcnRIZWlnaHQABQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVZvdGluZ1Jlc3VsdAAJAQp0b3RhbFZvdGVzAwIBMAIBMAIBMAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHGdldFJhdGVDaGFuZ2VBbW91bnRzUkVBRE9OTFkACQCUCgIFA25pbAkBHGdldFJhdGVDaGFuZ2VBbW91bnRzSU5URVJOQUwAAWkBBHZvdGUBB2luRmF2b3IEEnZvdGluZ0ZpbmlzaEhlaWdodAkAZAIJAQV2YWx1ZQEJAJ8IAQkBDmtleVN0YXJ0SGVpZ2h0AAkBBXZhbHVlAQkAnwgBBQ5rZXlFcG9jaExlbmd0aAQGY2hlY2tzCQDMCAIDCQBmAgUSdm90aW5nRmluaXNoSGVpZ2h0BQZoZWlnaHQGCQACAQIQdG9vIGxhdGUgdG8gdm90ZQkAzAgCAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgABCQDMCAIAAAkAzAgCAP///////////wEFA25pbAUHaW5GYXZvcgYJAAIBAhJub3QgdmFsaWQgYXJndW1lbnQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQJZ3d4QW1vdW50CQD8BwQFEGJvb3N0aW5nQ29udHJhY3QCIGdldFVzZXJHd3hBbW91bnRBdEhlaWdodFJFQURPTkxZCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFEnZvdGluZ0ZpbmlzaEhlaWdodAUDbmlsBQNuaWwEB25vdFplcm8DCQBmAgkBBWFzSW50AQUJZ3d4QW1vdW50AAAGCQACAQISeW91IGRvbid0IGhhdmUgZ3d4AwkAAAIFB25vdFplcm8FB25vdFplcm8EBHZvdGUEByRtYXRjaDAJAKIIAQkBB2tleVZvdGUBCQClCAEIBQFpBmNhbGxlcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAEBHZvdGUJALUJAgUBcwUJc2VwYXJhdG9yBAl2b3RlVmFsdWUJAJEDAgUEdm90ZQABBAh2b3RlVHlwZQkAkQMCBQR2b3RlAAIEEWlzVm90ZVR5cGVTaW1pbGFyAwMDCQAAAgUIdm90ZVR5cGUCCGluY3JlYXNlCQAAAgUHaW5GYXZvcgABBwYDCQAAAgUIdm90ZVR5cGUCCGRlY3JlYXNlCQAAAgUHaW5GYXZvcgD///////////8BBwYDCQAAAgUIdm90ZVR5cGUCBG5vbmUJAAACBQdpbkZhdm9yAAAHBBJpc1ZvdGVWYWx1ZVNpbWlsYXIDBRFpc1ZvdGVUeXBlU2ltaWxhcgkAAAIJAQVhc0ludAEFCWd3eEFtb3VudAkBDXBhcnNlSW50VmFsdWUBBQl2b3RlVmFsdWUHBBBpc05ld1ZvdGVTaW1pbGFyAwMFEWlzVm90ZVR5cGVTaW1pbGFyBRJpc1ZvdGVWYWx1ZVNpbWlsYXIHCQACAQIReW91IGFscmVhZHkgdm90ZWQJAPwHBAUEdGhpcwIKY2FuY2VsVm90ZQUDbmlsBQNuaWwFEGlzTmV3Vm90ZVNpbWlsYXIDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAUBdQkAAgECC01hdGNoIGVycm9yAwkAAAIFBHZvdGUFBHZvdGUEDHZvdGluZ1Jlc3VsdAkAtQkCCQEFdmFsdWUBCQCiCAEJAQ9rZXlWb3RpbmdSZXN1bHQABQlzZXBhcmF0b3IED3ZvdGVzVG9JbmNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAQQLdm90ZXNUb05vbmUJAJEDAgUMdm90aW5nUmVzdWx0AAIED3ZvdGVzVG9EZWNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAwQbbmV3UG9zaXRpdmVBbmROZWdhdGl2ZVZvdGVzAwkAAAIFB2luRmF2b3IAAQQQbmV3UG9zaXRpdmVWb3RlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQUPdm90ZXNUb0luY3JlYXNlCQEFYXNJbnQBBQlnd3hBbW91bnQJAMwIAgkApAMBBRBuZXdQb3NpdGl2ZVZvdGVzCQDMCAIFC3ZvdGVzVG9Ob25lCQDMCAIFD3ZvdGVzVG9EZWNyZWFzZQUDbmlsAwkAAAIFB2luRmF2b3IA////////////AQQQbmV3TmVnYXRpdmVWb3RlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQULdm90ZXNUb05vbmUJAQVhc0ludAEFCWd3eEFtb3VudAkAzAgCBQ92b3Rlc1RvSW5jcmVhc2UJAMwIAgULdm90ZXNUb05vbmUJAMwIAgkApAMBBRBuZXdOZWdhdGl2ZVZvdGVzBQNuaWwEDG5ld05vbmVWb3RlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQULdm90ZXNUb05vbmUJAQVhc0ludAEFCWd3eEFtb3VudAkAzAgCBQ92b3Rlc1RvSW5jcmVhc2UJAMwIAgkApAMBBQxuZXdOb25lVm90ZXMJAMwIAgUPdm90ZXNUb0RlY3JlYXNlBQNuaWwEB3ZvdGVLZXkJAQdrZXlWb3RlAQkApQgBCAUBaQZjYWxsZXIECXZvdGVWYWx1ZQkBDGtleVZvdGVWYWx1ZQIJAKQDAQkBBWFzSW50AQUJZ3d4QW1vdW50BQdpbkZhdm9yCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVZvdGluZ1Jlc3VsdAAJAQp0b3RhbFZvdGVzAwkAkQMCBRtuZXdQb3NpdGl2ZUFuZE5lZ2F0aXZlVm90ZXMAAAkAkQMCBRtuZXdQb3NpdGl2ZUFuZE5lZ2F0aXZlVm90ZXMAAQkAkQMCBRtuZXdQb3NpdGl2ZUFuZE5lZ2F0aXZlVm90ZXMAAgkAzAgCCQELU3RyaW5nRW50cnkCBQd2b3RlS2V5BQl2b3RlVmFsdWUFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjYW5jZWxWb3RlAAQLdXNlckFkZHJlc3MDCQAAAggFAWkGY2FsbGVyBQR0aGlzCQClCAEIBQFpDG9yaWdpbkNhbGxlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkAzAgCAwkBCWlzRGVmaW5lZAEJAKIIAQkBD2tleVZvdGluZ1Jlc3VsdAAGCQACAQIHbm8gdm90ZQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAR2b3RlCQC1CQIJAQV2YWx1ZQEJAKIIAQkBB2tleVZvdGUBBQt1c2VyQWRkcmVzcwUJc2VwYXJhdG9yBAl2b3RlVmFsdWUJAJEDAgUEdm90ZQABBAh2b3RlVHlwZQkAkQMCBQR2b3RlAAIEDHZvdGluZ1Jlc3VsdAkAtQkCCQEFdmFsdWUBCQCiCAEJAQ9rZXlWb3RpbmdSZXN1bHQABQlzZXBhcmF0b3IED3ZvdGVzVG9JbmNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAQQLdm90ZXNUb05vbmUJAJEDAgUMdm90aW5nUmVzdWx0AAIED3ZvdGVzVG9EZWNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAwQHYWN0aW9ucwMJAAACBQh2b3RlVHlwZQIIaW5jcmVhc2UEEG5ld0luY3JlYXNlVm90ZXMJAGUCCQENcGFyc2VJbnRWYWx1ZQEFD3ZvdGVzVG9JbmNyZWFzZQkBDXBhcnNlSW50VmFsdWUBBQl2b3RlVmFsdWUJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5Vm90aW5nUmVzdWx0AAkBCnRvdGFsVm90ZXMDCQCkAwEFEG5ld0luY3JlYXNlVm90ZXMFC3ZvdGVzVG9Ob25lBQ92b3Rlc1RvRGVjcmVhc2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVZvdGUBBQt1c2VyQWRkcmVzcwUDbmlsBQR1bml0AwkAAAIFCHZvdGVUeXBlAghkZWNyZWFzZQQQbmV3RGVjcmVhc2VWb3RlcwkAZQIJAQ1wYXJzZUludFZhbHVlAQUPdm90ZXNUb0RlY3JlYXNlCQENcGFyc2VJbnRWYWx1ZQEFCXZvdGVWYWx1ZQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlWb3RpbmdSZXN1bHQACQEKdG90YWxWb3RlcwMFD3ZvdGVzVG9JbmNyZWFzZQULdm90ZXNUb05vbmUJAKQDAQUQbmV3RGVjcmVhc2VWb3RlcwkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Vm90ZQEFC3VzZXJBZGRyZXNzBQNuaWwFBHVuaXQEDG5ld05vbmVWb3RlcwkAZQIJAQ1wYXJzZUludFZhbHVlAQULdm90ZXNUb05vbmUJAQ1wYXJzZUludFZhbHVlAQUJdm90ZVZhbHVlCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleVZvdGluZ1Jlc3VsdAAJAQp0b3RhbFZvdGVzAwUPdm90ZXNUb0luY3JlYXNlCQCkAwEFDG5ld05vbmVWb3RlcwUPdm90ZXNUb0RlY3JlYXNlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlWb3RlAQULdXNlckFkZHJlc3MFA25pbAUEdW5pdAUHYWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxzZXRUaHJlc2hvbGQBDG5ld1RocmVzaG9sZAQGY2hlY2tzCQDMCAIJAQttdXN0TWFuYWdlcgEFAWkJAMwIAgMJAGYCBQxuZXdUaHJlc2hvbGQAAAYJAAIBAhFpbnZhbGlkIHRocmVzaG9sZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtleVRocmVzaG9sZAUMbmV3VGhyZXNob2xkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZmluYWxpemUABBJ2b3RpbmdGaW5pc2hIZWlnaHQJAGQCCQEFdmFsdWUBCQCfCAEJAQ5rZXlTdGFydEhlaWdodAAJAQV2YWx1ZQEJAJ8IAQUOa2V5RXBvY2hMZW5ndGgEBmNoZWNrcwkAzAgCAwkAZwIFBmhlaWdodAUSdm90aW5nRmluaXNoSGVpZ2h0BgkAAgECImluc3VmZmljaWVudCBoZWlnaHQgZm9yIGNvbXBsZXRpb24FA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQMdm90aW5nUmVzdWx0CQC1CQIJAQV2YWx1ZQEJAKIIAQkBD2tleVZvdGluZ1Jlc3VsdAAFCXNlcGFyYXRvcgQPdm90ZXNUb0luY3JlYXNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMdm90aW5nUmVzdWx0AAEEC3ZvdGVzVG9Ob25lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUMdm90aW5nUmVzdWx0AAIED3ZvdGVzVG9EZWNyZWFzZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHZvdGluZ1Jlc3VsdAADBAhhbGxWb3RlcwkAZAIJAGQCBQ92b3Rlc1RvSW5jcmVhc2UFC3ZvdGVzVG9Ob25lBQ92b3Rlc1RvRGVjcmVhc2UECXRocmVzaG9sZAkBDGdldEludE9yRmFpbAEFDGtleVRocmVzaG9sZAQLJHQwODgwOTg4ODkJARxnZXRSYXRlQ2hhbmdlQW1vdW50c0lOVEVSTkFMAAQNaW5jcmVhc2VkUmF0ZQgFCyR0MDg4MDk4ODg5Al8xBAtjdXJyZW50UmF0ZQgFCyR0MDg4MDk4ODg5Al8yBA1kZWNyZWFzZWRSYXRlCAULJHQwODgwOTg4ODkCXzMECXZvdGVzTGlzdAkAzAgCBQ92b3Rlc1RvSW5jcmVhc2UJAMwIAgULdm90ZXNUb05vbmUJAMwIAgUPdm90ZXNUb0RlY3JlYXNlBQNuaWwEB2FjdGlvbnMDCQBmAgUJdGhyZXNob2xkBQhhbGxWb3RlcwUDbmlsAwkAAAIFC3ZvdGVzVG9Ob25lCQCWAwEFCXZvdGVzTGlzdAkAzAgCCQELU3RyaW5nRW50cnkCAgNmb28CBE5PTkUFA25pbAMJAAACBQ92b3Rlc1RvSW5jcmVhc2UJAJYDAQUJdm90ZXNMaXN0CQDMCAIJAQtTdHJpbmdFbnRyeQICA2ZvbwIDSU5DBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgIDZm9vAgNERUMFA25pbAUHYWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAJwDcT", "height": 2581693, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DpmvtTasrt98ejUqEgP7ocHmstWxCAMJf5kLLgK9RQnz Next: 6HAYEmA4ZGBVsGuw6R1KU3YyEyXRLTfK1G5S5TnkVVtM Diff:
OldNewDifferences
107107 }
108108
109109
110+func getRateChangeAmountsINTERNAL () = {
111+ let ratePerBlockMax = getIntegerValue(emissionContract, keyRatePerBlockMax)
112+ let ratePerBlock = getIntegerValue(emissionContract, keyRatePerBlock)
113+ let rateChangeStep = getIntegerValue(this, keyRateChangeStep)
114+ calcNewRate(ratePerBlockMax, ratePerBlock, rateChangeStep)
115+ }
116+
117+
110118 @Callable(i)
111119 func constructor (boostingContractPrm,emissionContractPrm,votingDurationPrm,threshold,rateChangeStep) = {
112120 let checks = [if (isDefined(addressFromString(boostingContractPrm)))
128136
129137
130138 @Callable(i)
131-func getRateChangeAmountsREADONLY () = {
132- let ratePerBlockMax = getIntegerValue(emissionContract, keyRatePerBlockMax)
133- let ratePerBlock = getIntegerValue(emissionContract, keyRatePerBlock)
134- let rateChangeStep = getIntegerValue(this, keyRateChangeStep)
135- $Tuple2(nil, calcNewRate(ratePerBlockMax, ratePerBlock, rateChangeStep))
136- }
139+func getRateChangeAmountsREADONLY () = $Tuple2(nil, getRateChangeAmountsINTERNAL())
137140
138141
139142
280283 let votesToDecrease = parseIntValue(votingResult[3])
281284 let allVotes = ((votesToIncrease + votesToNone) + votesToDecrease)
282285 let threshold = getIntOrFail(keyThreshold)
283- let actions = if (if ((allVotes >= threshold))
284- then true
285- else false)
286+ let $t088098889 = getRateChangeAmountsINTERNAL()
287+ let increasedRate = $t088098889._1
288+ let currentRate = $t088098889._2
289+ let decreasedRate = $t088098889._3
290+ let votesList = [votesToIncrease, votesToNone, votesToDecrease]
291+ let actions = if ((threshold > allVotes))
286292 then nil
287- else nil
293+ else if ((votesToNone == max(votesList)))
294+ then [StringEntry("foo", "NONE")]
295+ else if ((votesToIncrease == max(votesList)))
296+ then [StringEntry("foo", "INC")]
297+ else [StringEntry("foo", "DEC")]
288298 actions
289299 }
290300 else throw("Strict value is not equal to itself.")
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
110+func getRateChangeAmountsINTERNAL () = {
111+ let ratePerBlockMax = getIntegerValue(emissionContract, keyRatePerBlockMax)
112+ let ratePerBlock = getIntegerValue(emissionContract, keyRatePerBlock)
113+ let rateChangeStep = getIntegerValue(this, keyRateChangeStep)
114+ calcNewRate(ratePerBlockMax, ratePerBlock, rateChangeStep)
115+ }
116+
117+
110118 @Callable(i)
111119 func constructor (boostingContractPrm,emissionContractPrm,votingDurationPrm,threshold,rateChangeStep) = {
112120 let checks = [if (isDefined(addressFromString(boostingContractPrm)))
113121 then true
114122 else throw("Invalid boosting contract address"), if (isDefined(addressFromString(emissionContractPrm)))
115123 then true
116124 else throw("Invalid emission contract address"), if ((votingDurationPrm > 0))
117125 then true
118126 else throw("Invalid voting duration"), if ((threshold > 0))
119127 then true
120128 else throw("invalid threshold"), if ((rateChangeStep > 0))
121129 then true
122130 else throw("invalid rateChangeStep")]
123131 if ((checks == checks))
124132 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)
125133 else throw("Strict value is not equal to itself.")
126134 }
127135
128136
129137
130138 @Callable(i)
131-func getRateChangeAmountsREADONLY () = {
132- let ratePerBlockMax = getIntegerValue(emissionContract, keyRatePerBlockMax)
133- let ratePerBlock = getIntegerValue(emissionContract, keyRatePerBlock)
134- let rateChangeStep = getIntegerValue(this, keyRateChangeStep)
135- $Tuple2(nil, calcNewRate(ratePerBlockMax, ratePerBlock, rateChangeStep))
136- }
139+func getRateChangeAmountsREADONLY () = $Tuple2(nil, getRateChangeAmountsINTERNAL())
137140
138141
139142
140143 @Callable(i)
141144 func vote (inFavor) = {
142145 let votingFinishHeight = (value(getInteger(keyStartHeight())) + value(getInteger(keyEpochLength)))
143146 let checks = [if ((votingFinishHeight > height))
144147 then true
145148 else throw("too late to vote"), if (containsElement([1, 0, -1], inFavor))
146149 then true
147150 else throw("not valid argument")]
148151 if ((checks == checks))
149152 then {
150153 let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [toString(i.caller), votingFinishHeight], nil)
151154 let notZero = if ((asInt(gwxAmount) > 0))
152155 then true
153156 else throw("you don't have gwx")
154157 if ((notZero == notZero))
155158 then {
156159 let vote = match getString(keyVote(toString(i.caller))) {
157160 case s: String =>
158161 let vote = split(s, separator)
159162 let voteValue = vote[1]
160163 let voteType = vote[2]
161164 let isVoteTypeSimilar = if (if (if ((voteType == "increase"))
162165 then (inFavor == 1)
163166 else false)
164167 then true
165168 else if ((voteType == "decrease"))
166169 then (inFavor == -1)
167170 else false)
168171 then true
169172 else if ((voteType == "none"))
170173 then (inFavor == 0)
171174 else false
172175 let isVoteValueSimilar = if (isVoteTypeSimilar)
173176 then (asInt(gwxAmount) == parseIntValue(voteValue))
174177 else false
175178 let isNewVoteSimilar = if (if (isVoteTypeSimilar)
176179 then isVoteValueSimilar
177180 else false)
178181 then throw("you already voted")
179182 else invoke(this, "cancelVote", nil, nil)
180183 isNewVoteSimilar
181184 case u: Unit =>
182185 u
183186 case _ =>
184187 throw("Match error")
185188 }
186189 if ((vote == vote))
187190 then {
188191 let votingResult = split(value(getString(keyVotingResult())), separator)
189192 let votesToIncrease = votingResult[1]
190193 let votesToNone = votingResult[2]
191194 let votesToDecrease = votingResult[3]
192195 let newPositiveAndNegativeVotes = if ((inFavor == 1))
193196 then {
194197 let newPositiveVotes = (parseIntValue(votesToIncrease) + asInt(gwxAmount))
195198 [toString(newPositiveVotes), votesToNone, votesToDecrease]
196199 }
197200 else if ((inFavor == -1))
198201 then {
199202 let newNegativeVotes = (parseIntValue(votesToNone) + asInt(gwxAmount))
200203 [votesToIncrease, votesToNone, toString(newNegativeVotes)]
201204 }
202205 else {
203206 let newNoneVotes = (parseIntValue(votesToNone) + asInt(gwxAmount))
204207 [votesToIncrease, toString(newNoneVotes), votesToDecrease]
205208 }
206209 let voteKey = keyVote(toString(i.caller))
207210 let voteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
208211 $Tuple2([StringEntry(keyVotingResult(), totalVotes(newPositiveAndNegativeVotes[0], newPositiveAndNegativeVotes[1], newPositiveAndNegativeVotes[2])), StringEntry(voteKey, voteValue)], unit)
209212 }
210213 else throw("Strict value is not equal to itself.")
211214 }
212215 else throw("Strict value is not equal to itself.")
213216 }
214217 else throw("Strict value is not equal to itself.")
215218 }
216219
217220
218221
219222 @Callable(i)
220223 func cancelVote () = {
221224 let userAddress = if ((i.caller == this))
222225 then toString(i.originCaller)
223226 else toString(i.caller)
224227 let checks = [if (isDefined(getString(keyVotingResult())))
225228 then true
226229 else throw("no vote")]
227230 if ((checks == checks))
228231 then {
229232 let vote = split(value(getString(keyVote(userAddress))), separator)
230233 let voteValue = vote[1]
231234 let voteType = vote[2]
232235 let votingResult = split(value(getString(keyVotingResult())), separator)
233236 let votesToIncrease = votingResult[1]
234237 let votesToNone = votingResult[2]
235238 let votesToDecrease = votingResult[3]
236239 let actions = if ((voteType == "increase"))
237240 then {
238241 let newIncreaseVotes = (parseIntValue(votesToIncrease) - parseIntValue(voteValue))
239242 $Tuple2([StringEntry(keyVotingResult(), totalVotes(toString(newIncreaseVotes), votesToNone, votesToDecrease)), DeleteEntry(keyVote(userAddress))], unit)
240243 }
241244 else if ((voteType == "decrease"))
242245 then {
243246 let newDecreaseVotes = (parseIntValue(votesToDecrease) - parseIntValue(voteValue))
244247 $Tuple2([StringEntry(keyVotingResult(), totalVotes(votesToIncrease, votesToNone, toString(newDecreaseVotes))), DeleteEntry(keyVote(userAddress))], unit)
245248 }
246249 else {
247250 let newNoneVotes = (parseIntValue(votesToNone) - parseIntValue(voteValue))
248251 $Tuple2([StringEntry(keyVotingResult(), totalVotes(votesToIncrease, toString(newNoneVotes), votesToDecrease)), DeleteEntry(keyVote(userAddress))], unit)
249252 }
250253 actions
251254 }
252255 else throw("Strict value is not equal to itself.")
253256 }
254257
255258
256259
257260 @Callable(i)
258261 func setThreshold (newThreshold) = {
259262 let checks = [mustManager(i), if ((newThreshold > 0))
260263 then true
261264 else throw("invalid threshold")]
262265 if ((checks == checks))
263266 then $Tuple2([IntegerEntry(keyThreshold, newThreshold)], unit)
264267 else throw("Strict value is not equal to itself.")
265268 }
266269
267270
268271
269272 @Callable(i)
270273 func finalize () = {
271274 let votingFinishHeight = (value(getInteger(keyStartHeight())) + value(getInteger(keyEpochLength)))
272275 let checks = [if ((height >= votingFinishHeight))
273276 then true
274277 else throw("insufficient height for completion")]
275278 if ((checks == checks))
276279 then {
277280 let votingResult = split(value(getString(keyVotingResult())), separator)
278281 let votesToIncrease = parseIntValue(votingResult[1])
279282 let votesToNone = parseIntValue(votingResult[2])
280283 let votesToDecrease = parseIntValue(votingResult[3])
281284 let allVotes = ((votesToIncrease + votesToNone) + votesToDecrease)
282285 let threshold = getIntOrFail(keyThreshold)
283- let actions = if (if ((allVotes >= threshold))
284- then true
285- else false)
286+ let $t088098889 = getRateChangeAmountsINTERNAL()
287+ let increasedRate = $t088098889._1
288+ let currentRate = $t088098889._2
289+ let decreasedRate = $t088098889._3
290+ let votesList = [votesToIncrease, votesToNone, votesToDecrease]
291+ let actions = if ((threshold > allVotes))
286292 then nil
287- else nil
293+ else if ((votesToNone == max(votesList)))
294+ then [StringEntry("foo", "NONE")]
295+ else if ((votesToIncrease == max(votesList)))
296+ then [StringEntry("foo", "INC")]
297+ else [StringEntry("foo", "DEC")]
288298 actions
289299 }
290300 else throw("Strict value is not equal to itself.")
291301 }
292302
293303

github/deemru/w8io/026f985 
41.32 ms