tx · 8V6zX15XfwwRAg9PVokpSssAHhNzuWyoN4HW2wiZk6K9

3MuqubsQAq9mrsN65SePHeThcN3JVAbgZ9d:  -0.01000000 Waves

2023.05.19 10:40 [2584543] smart account 3MuqubsQAq9mrsN65SePHeThcN3JVAbgZ9d > SELF 0.00000000 Waves

{ "type": 13, "id": "8V6zX15XfwwRAg9PVokpSssAHhNzuWyoN4HW2wiZk6K9", "fee": 1000000, "feeAssetId": null, "timestamp": 1684482012431, "version": 2, "chainId": 84, "sender": "3MuqubsQAq9mrsN65SePHeThcN3JVAbgZ9d", "senderPublicKey": "GWTozVWP9MvUxrEuz1BPrNAbtLYAec9LrT4U82jWG6KX", "proofs": [ "4zWZBkM5CZTvtDbhST7abmwsqgekKonV6rvtXfqPWu5HPHrkJZEW6uoLZrUfUcwP2p7KxSrd6VcLCqX59fbALryk" ], "script": "base64:BgIbCAISBwoFCAgBAQESABIDCgEBEgASAwoBARIAHAAJc2VwYXJhdG9yAgJfXwAQY29udHJhY3RGaWxlbmFtZQIZdm90aW5nX2VtaXNzaW9uX3JhdGUucmlkZQAOa2V5RXBvY2hMZW5ndGgJALkJAgkAzAgCAgIlcwkAzAgCAgtlcG9jaExlbmd0aAUDbmlsBQlzZXBhcmF0b3IAE2tleUVtaXNzaW9uQ29udHJhY3QJALkJAgkAzAgCAgIlcwkAzAgCAhBlbWlzc2lvbkNvbnRyYWN0BQNuaWwFCXNlcGFyYXRvcgATa2V5Qm9vc3RpbmdDb250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICEGJvb3N0aW5nQ29udHJhY3QFA25pbAUJc2VwYXJhdG9yAAxrZXlUaHJlc2hvbGQJALkJAgkAzAgCAgIlcwkAzAgCAg92b3RpbmdUaHJlc2hvbGQFA25pbAUJc2VwYXJhdG9yAA9rZXlSYXRlUGVyQmxvY2sJALkJAgkAzAgCAgQlcyVzCQDMCAICDHJhdGVQZXJCbG9jawkAzAgCAgdjdXJyZW50BQNuaWwFCXNlcGFyYXRvcgASa2V5UmF0ZVBlckJsb2NrTWF4CQC5CQIJAMwIAgIEJXMlcwkAzAgCAg9yYXRlUGVyQmxvY2tNYXgJAMwIAgIHY3VycmVudAUDbmlsBQlzZXBhcmF0b3IAEWtleVJhdGVDaGFuZ2VTdGVwCQC5CQIJAMwIAgICJXMJAMwIAgIOcmF0ZUNoYW5nZVN0ZXAFA25pbAUJc2VwYXJhdG9yAA5rZXlTdGFydEhlaWdodAkAuQkCCQDMCAICAiVzCQDMCAICC3N0YXJ0SGVpZ2h0BQNuaWwFCXNlcGFyYXRvcgAPa2V5Vm90aW5nUmVzdWx0CQC5CQIJAMwIAgICJXMJAMwIAgIMdm90aW5nUmVzdWx0BQNuaWwFCXNlcGFyYXRvcgEIdGhyb3dFcnIBAXMJAAIBCQCsAgIJAKwCAgUQY29udHJhY3RGaWxlbmFtZQICOiAFAXMBD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIFA2tleQIPIGlzIG5vdCBkZWZpbmVkAQxnZXRJbnRPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFA2tleQkArAICBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEKdG90YWxWb3RlcwMNdG90YWxJbmNyZWFzZQx0b3RhbEN1cnJlbnQNdG90YWxEZWNyZWFzZQkAuQkCCQDMCAICBiVkJWQlZAkAzAgCBQ10b3RhbEluY3JlYXNlCQDMCAIFDHRvdGFsQ3VycmVudAkAzAgCBQ10b3RhbERlY3JlYXNlBQNuaWwFCXNlcGFyYXRvcgEHa2V5Vm90ZQIMdm90ZXJBZGRyZXNzC3N0YXJ0SGVpZ2h0CQC5CQIJAMwIAgIGJXMlcyVkCQDMCAICBHZvdGUJAMwIAgUMdm90ZXJBZGRyZXNzCQDMCAIJAKQDAQULc3RhcnRIZWlnaHQFA25pbAUJc2VwYXJhdG9yAQxrZXlWb3RlVmFsdWUCCWd3eEFtb3VudAR2b3RlBANrZXkDCQAAAgUEdm90ZQABCQC5CQIJAMwIAgIEJWQlcwkAzAgCBQlnd3hBbW91bnQJAMwIAgIIaW5jcmVhc2UFA25pbAUJc2VwYXJhdG9yAwkAAAIFBHZvdGUA////////////AQkAuQkCCQDMCAICBCVkJXMJAMwIAgUJZ3d4QW1vdW50CQDMCAICCGRlY3JlYXNlBQNuaWwFCXNlcGFyYXRvcgkAuQkCCQDMCAICBCVkJXMJAMwIAgUJZ3d4QW1vdW50CQDMCAICB2N1cnJlbnQFA25pbAUJc2VwYXJhdG9yBQNrZXkAEGJvb3N0aW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBBRNrZXlCb29zdGluZ0NvbnRyYWN0ABBlbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQUTa2V5RW1pc3Npb25Db250cmFjdAETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMABAckbWF0Y2gwCQCiCAEJARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAXMFBHRoaXMBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABBNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAJ0IAgUTbWFuYWdlclZhdWx0QWRkcmVzcwkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEJaXNNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkDCQEJaXNNYW5hZ2VyAQUBaQYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAQVhc0ludAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIDSW50BAZ2YWxJbnQFByRtYXRjaDAFBnZhbEludAkBCHRocm93RXJyAQIbZmFpbGVkIHRvIGNhc3QgaW50byBJbnRlZ2VyAQtjYWxjTmV3UmF0ZQMPcmF0ZVBlckJsb2NrTWF4DHJhdGVQZXJCbG9jawpjaGFuZ2VTdGVwBAptYXhBbGxvd2VkCQBrAwBkBQ9yYXRlUGVyQmxvY2tNYXgAeAQNaW5jcmVhc2VkUmF0ZQkAlwMBCQDMCAIJAGsDCQBkAgBkBQpjaGFuZ2VTdGVwBQxyYXRlUGVyQmxvY2sAZAkAzAgCBQptYXhBbGxvd2VkBQNuaWwEDWRlY3JlYXNlZFJhdGUJAJYDAQkAzAgCCQBrAwkAZQIAZAUKY2hhbmdlU3RlcAUMcmF0ZVBlckJsb2NrAGQJAMwIAgAABQNuaWwJAJUKAwUNaW5jcmVhc2VkUmF0ZQUMcmF0ZVBlckJsb2NrBQ1kZWNyZWFzZWRSYXRlARxnZXRSYXRlQ2hhbmdlQW1vdW50c0lOVEVSTkFMAAQPcmF0ZVBlckJsb2NrTWF4CQERQGV4dHJOYXRpdmUoMTA1MCkCBRBlbWlzc2lvbkNvbnRyYWN0BRJrZXlSYXRlUGVyQmxvY2tNYXgEDHJhdGVQZXJCbG9jawkBEUBleHRyTmF0aXZlKDEwNTApAgUQZW1pc3Npb25Db250cmFjdAUPa2V5UmF0ZVBlckJsb2NrBA5yYXRlQ2hhbmdlU3RlcAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwURa2V5UmF0ZUNoYW5nZVN0ZXAJAQtjYWxjTmV3UmF0ZQMFD3JhdGVQZXJCbG9ja01heAUMcmF0ZVBlckJsb2NrBQ5yYXRlQ2hhbmdlU3RlcAYBaQELY29uc3RydWN0b3IFE2Jvb3N0aW5nQ29udHJhY3RQcm0TZW1pc3Npb25Db250cmFjdFBybRF2b3RpbmdEdXJhdGlvblBybQl0aHJlc2hvbGQOcmF0ZUNoYW5nZVN0ZXAEBmNoZWNrcwkAzAgCAwkBCWlzRGVmaW5lZAEJAKYIAQUTYm9vc3RpbmdDb250cmFjdFBybQYJAQh0aHJvd0VycgECIUludmFsaWQgYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcwkAzAgCAwkBCWlzRGVmaW5lZAEJAKYIAQUTZW1pc3Npb25Db250cmFjdFBybQYJAQh0aHJvd0VycgECIUludmFsaWQgZW1pc3Npb24gY29udHJhY3QgYWRkcmVzcwkAzAgCAwkAZgIFEXZvdGluZ0R1cmF0aW9uUHJtAAAGCQEIdGhyb3dFcnIBAhdJbnZhbGlkIHZvdGluZyBkdXJhdGlvbgkAzAgCAwkAZgIFCXRocmVzaG9sZAAABgkBCHRocm93RXJyAQIRaW52YWxpZCB0aHJlc2hvbGQJAMwIAgMJAGYCBQ5yYXRlQ2hhbmdlU3RlcAAABgkBCHRocm93RXJyAQIWaW52YWxpZCByYXRlQ2hhbmdlU3RlcAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUTa2V5Qm9vc3RpbmdDb250cmFjdAUTYm9vc3RpbmdDb250cmFjdFBybQkAzAgCCQELU3RyaW5nRW50cnkCBRNrZXlFbWlzc2lvbkNvbnRyYWN0BRNlbWlzc2lvbkNvbnRyYWN0UHJtCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5rZXlFcG9jaExlbmd0aAURdm90aW5nRHVyYXRpb25Qcm0JAMwIAgkBDEludGVnZXJFbnRyeQIFDGtleVRocmVzaG9sZAUJdGhyZXNob2xkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrZXlSYXRlQ2hhbmdlU3RlcAUOcmF0ZUNoYW5nZVN0ZXAJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtleVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa2V5Vm90aW5nUmVzdWx0CQEKdG90YWxWb3RlcwMCATACATACATAFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARxnZXRSYXRlQ2hhbmdlQW1vdW50c1JFQURPTkxZAAkAlAoCBQNuaWwJARxnZXRSYXRlQ2hhbmdlQW1vdW50c0lOVEVSTkFMAAFpAQR2b3RlAQdpbkZhdm9yBAtzdGFydEhlaWdodAkBEUBleHRyTmF0aXZlKDEwNTUpAQUOa2V5U3RhcnRIZWlnaHQEEnZvdGluZ0ZpbmlzaEhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1NSkBBQ5rZXlFcG9jaExlbmd0aAQGY2hlY2tzCQDMCAIDCQBmAgUSdm90aW5nRmluaXNoSGVpZ2h0BQZoZWlnaHQGCQEIdGhyb3dFcnIBAhB0b28gbGF0ZSB0byB2b3RlCQDMCAIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAAEJAMwIAgAACQDMCAIA////////////AQUDbmlsBQdpbkZhdm9yBgkBCHRocm93RXJyAQISbm90IHZhbGlkIGFyZ3VtZW50BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECWd3eEFtb3VudAkA/AcEBRBib29zdGluZ0NvbnRyYWN0AiBnZXRVc2VyR3d4QW1vdW50QXRIZWlnaHRSRUFET05MWQkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBRJ2b3RpbmdGaW5pc2hIZWlnaHQFA25pbAUDbmlsBAdub3RaZXJvAwkAZgIJAQVhc0ludAEFCWd3eEFtb3VudAAABgkBCHRocm93RXJyAQISeW91IGRvbid0IGhhdmUgZ3d4AwkAAAIFB25vdFplcm8FB25vdFplcm8EBHZvdGUEByRtYXRjaDAJAKIIAQkBB2tleVZvdGUCCQClCAEIBQFpBmNhbGxlcgULc3RhcnRIZWlnaHQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBAR2b3RlCQC1CQIFAXMFCXNlcGFyYXRvcgQJdm90ZVZhbHVlCQCRAwIFBHZvdGUAAQQIdm90ZVR5cGUJAJEDAgUEdm90ZQACBBFpc1ZvdGVUeXBlU2ltaWxhcgMDAwkAAAIFCHZvdGVUeXBlAghpbmNyZWFzZQkAAAIFB2luRmF2b3IAAQcGAwkAAAIFCHZvdGVUeXBlAghkZWNyZWFzZQkAAAIFB2luRmF2b3IA////////////AQcGAwkAAAIFCHZvdGVUeXBlAgdjdXJyZW50CQAAAgUHaW5GYXZvcgAABwQSaXNWb3RlVmFsdWVTaW1pbGFyAwURaXNWb3RlVHlwZVNpbWlsYXIJAAACCQEFYXNJbnQBBQlnd3hBbW91bnQJAQ1wYXJzZUludFZhbHVlAQUJdm90ZVZhbHVlBwQQaXNOZXdWb3RlU2ltaWxhcgMDBRFpc1ZvdGVUeXBlU2ltaWxhcgUSaXNWb3RlVmFsdWVTaW1pbGFyBwkBCHRocm93RXJyAQIReW91IGFscmVhZHkgdm90ZWQJAPwHBAUEdGhpcwIKY2FuY2VsVm90ZQUDbmlsBQNuaWwFEGlzTmV3Vm90ZVNpbWlsYXIDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAUBdQkAAgECC01hdGNoIGVycm9yAwkAAAIFBHZvdGUFBHZvdGUEDHZvdGluZ1Jlc3VsdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ9rZXlWb3RpbmdSZXN1bHQFCXNlcGFyYXRvcgQQdm90ZXNGb3JJbmNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAQQPdm90ZXNGb3JDdXJyZW50CQCRAwIFDHZvdGluZ1Jlc3VsdAACBBB2b3Rlc0ZvckRlY3JlYXNlCQCRAwIFDHZvdGluZ1Jlc3VsdAADBBtuZXdQb3NpdGl2ZUFuZE5lZ2F0aXZlVm90ZXMDCQAAAgUHaW5GYXZvcgABBBBuZXdQb3NpdGl2ZVZvdGVzCQBkAgkBDXBhcnNlSW50VmFsdWUBBRB2b3Rlc0ZvckluY3JlYXNlCQEFYXNJbnQBBQlnd3hBbW91bnQJAMwIAgkApAMBBRBuZXdQb3NpdGl2ZVZvdGVzCQDMCAIFD3ZvdGVzRm9yQ3VycmVudAkAzAgCBRB2b3Rlc0ZvckRlY3JlYXNlBQNuaWwDCQAAAgUHaW5GYXZvcgD///////////8BBBBuZXdOZWdhdGl2ZVZvdGVzCQBkAgkBDXBhcnNlSW50VmFsdWUBBQ92b3Rlc0ZvckN1cnJlbnQJAQVhc0ludAEFCWd3eEFtb3VudAkAzAgCBRB2b3Rlc0ZvckluY3JlYXNlCQDMCAIFD3ZvdGVzRm9yQ3VycmVudAkAzAgCCQCkAwEFEG5ld05lZ2F0aXZlVm90ZXMFA25pbAQPbmV3Q3VycmVudFZvdGVzCQBkAgkBDXBhcnNlSW50VmFsdWUBBQ92b3Rlc0ZvckN1cnJlbnQJAQVhc0ludAEFCWd3eEFtb3VudAkAzAgCBRB2b3Rlc0ZvckluY3JlYXNlCQDMCAIJAKQDAQUPbmV3Q3VycmVudFZvdGVzCQDMCAIFEHZvdGVzRm9yRGVjcmVhc2UFA25pbAQHdm90ZUtleQkBB2tleVZvdGUCCQClCAEIBQFpBmNhbGxlcgULc3RhcnRIZWlnaHQECXZvdGVWYWx1ZQkBDGtleVZvdGVWYWx1ZQIJAKQDAQkBBWFzSW50AQUJZ3d4QW1vdW50BQdpbkZhdm9yCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa2V5Vm90aW5nUmVzdWx0CQEKdG90YWxWb3RlcwMJAJEDAgUbbmV3UG9zaXRpdmVBbmROZWdhdGl2ZVZvdGVzAAAJAJEDAgUbbmV3UG9zaXRpdmVBbmROZWdhdGl2ZVZvdGVzAAEJAJEDAgUbbmV3UG9zaXRpdmVBbmROZWdhdGl2ZVZvdGVzAAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUHdm90ZUtleQUJdm90ZVZhbHVlBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY2FuY2VsVm90ZQAEC3N0YXJ0SGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1NSkBBQ5rZXlTdGFydEhlaWdodAQSdm90aW5nRmluaXNoSGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDU1KQEFDmtleUVwb2NoTGVuZ3RoBAt1c2VyQWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFBHRoaXMJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQGY2hlY2tzCQDMCAIDCQBmAgUSdm90aW5nRmluaXNoSGVpZ2h0BQZoZWlnaHQGCQEIdGhyb3dFcnIBAhd0b28gbGF0ZSB0byBjYW5jZWwgdm90ZQkAzAgCAwkBCWlzRGVmaW5lZAEJAKIIAQUPa2V5Vm90aW5nUmVzdWx0BgkBCHRocm93RXJyAQIHbm8gdm90ZQkAzAgCAwkBCWlzRGVmaW5lZAEJAKIIAQkBB2tleVZvdGUCBQt1c2VyQWRkcmVzcwULc3RhcnRIZWlnaHQGCQEIdGhyb3dFcnIBAgxubyB1c2VyIHZvdGUFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQEdm90ZQkAtQkCCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEHa2V5Vm90ZQIFC3VzZXJBZGRyZXNzBQtzdGFydEhlaWdodAUJc2VwYXJhdG9yBAl2b3RlVmFsdWUJAJEDAgUEdm90ZQABBAh2b3RlVHlwZQkAkQMCBQR2b3RlAAIEDHZvdGluZ1Jlc3VsdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1OCkBBQ9rZXlWb3RpbmdSZXN1bHQFCXNlcGFyYXRvcgQQdm90ZXNGb3JJbmNyZWFzZQkAkQMCBQx2b3RpbmdSZXN1bHQAAQQPdm90ZXNGb3JDdXJyZW50CQCRAwIFDHZvdGluZ1Jlc3VsdAACBBB2b3Rlc0ZvckRlY3JlYXNlCQCRAwIFDHZvdGluZ1Jlc3VsdAADBAdhY3Rpb25zAwkAAAIFCHZvdGVUeXBlAghpbmNyZWFzZQQQbmV3SW5jcmVhc2VWb3RlcwkAZQIJAQ1wYXJzZUludFZhbHVlAQUQdm90ZXNGb3JJbmNyZWFzZQkBDXBhcnNlSW50VmFsdWUBBQl2b3RlVmFsdWUJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa2V5Vm90aW5nUmVzdWx0CQEKdG90YWxWb3RlcwMJAKQDAQUQbmV3SW5jcmVhc2VWb3RlcwUPdm90ZXNGb3JDdXJyZW50BRB2b3Rlc0ZvckRlY3JlYXNlBQNuaWwDCQAAAgUIdm90ZVR5cGUCCGRlY3JlYXNlBBBuZXdEZWNyZWFzZVZvdGVzCQBlAgkBDXBhcnNlSW50VmFsdWUBBRB2b3Rlc0ZvckRlY3JlYXNlCQENcGFyc2VJbnRWYWx1ZQEFCXZvdGVWYWx1ZQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rZXlWb3RpbmdSZXN1bHQJAQp0b3RhbFZvdGVzAwUQdm90ZXNGb3JJbmNyZWFzZQUPdm90ZXNGb3JDdXJyZW50CQCkAwEFEG5ld0RlY3JlYXNlVm90ZXMFA25pbAQPbmV3Q3VycmVudFZvdGVzCQBlAgkBDXBhcnNlSW50VmFsdWUBBQ92b3Rlc0ZvckN1cnJlbnQJAQ1wYXJzZUludFZhbHVlAQUJdm90ZVZhbHVlCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tleVZvdGluZ1Jlc3VsdAkBCnRvdGFsVm90ZXMDBRB2b3Rlc0ZvckluY3JlYXNlCQCkAwEFD25ld0N1cnJlbnRWb3RlcwUQdm90ZXNGb3JEZWNyZWFzZQUDbmlsBA5kZWZhdWx0QWN0aW9ucwkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Vm90ZQIFC3VzZXJBZGRyZXNzBQtzdGFydEhlaWdodAUDbmlsCQDOCAIFB2FjdGlvbnMFDmRlZmF1bHRBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHNldFRocmVzaG9sZAEMbmV3VGhyZXNob2xkBAZjaGVja3MJAMwIAgkBC211c3RNYW5hZ2VyAQUBaQkAzAgCAwkAZgIFDG5ld1RocmVzaG9sZAAABgkBCHRocm93RXJyAQIRaW52YWxpZCB0aHJlc2hvbGQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrZXlUaHJlc2hvbGQFDG5ld1RocmVzaG9sZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGZpbmFsaXplAAQSdm90aW5nRmluaXNoSGVpZ2h0CQBkAgkBEUBleHRyTmF0aXZlKDEwNTUpAQUOa2V5U3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJ8IAQUOa2V5RXBvY2hMZW5ndGgEBmNoZWNrcwkAzAgCAwkAZwIFBmhlaWdodAUSdm90aW5nRmluaXNoSGVpZ2h0BgkBCHRocm93RXJyAQIiaW5zdWZmaWNpZW50IGhlaWdodCBmb3IgY29tcGxldGlvbgUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAx2b3RpbmdSZXN1bHQJALUJAgkBBXZhbHVlAQkAoggBBQ9rZXlWb3RpbmdSZXN1bHQFCXNlcGFyYXRvcgQQdm90ZXNGb3JJbmNyZWFzZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHZvdGluZ1Jlc3VsdAABBA92b3Rlc0ZvckN1cnJlbnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQx2b3RpbmdSZXN1bHQAAgQQdm90ZXNGb3JEZWNyZWFzZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHZvdGluZ1Jlc3VsdAADBAhhbGxWb3RlcwkAZAIJAGQCBRB2b3Rlc0ZvckluY3JlYXNlBQ92b3Rlc0ZvckN1cnJlbnQFEHZvdGVzRm9yRGVjcmVhc2UECXRocmVzaG9sZAkBDGdldEludE9yRmFpbAEFDGtleVRocmVzaG9sZAQLJHQwOTQ2NDk1NDQJARxnZXRSYXRlQ2hhbmdlQW1vdW50c0lOVEVSTkFMAAQNaW5jcmVhc2VkUmF0ZQgFCyR0MDk0NjQ5NTQ0Al8xBAtjdXJyZW50UmF0ZQgFCyR0MDk0NjQ5NTQ0Al8yBA1kZWNyZWFzZWRSYXRlCAULJHQwOTQ2NDk1NDQCXzMECXZvdGVzTGlzdAkAzAgCBRB2b3Rlc0ZvckluY3JlYXNlCQDMCAIFD3ZvdGVzRm9yQ3VycmVudAkAzAgCBRB2b3Rlc0ZvckRlY3JlYXNlBQNuaWwEB25ld1JhdGUDAwkAZgIFCXRocmVzaG9sZAUIYWxsVm90ZXMGCQAAAgUPdm90ZXNGb3JDdXJyZW50CQCWAwEFCXZvdGVzTGlzdAUEdW5pdAMJAAACBRB2b3Rlc0ZvckluY3JlYXNlCQCWAwEFCXZvdGVzTGlzdAUNaW5jcmVhc2VkUmF0ZQUNZGVjcmVhc2VkUmF0ZQQQY2hhbmdlUmF0ZUludm9rZQQHJG1hdGNoMAUHbmV3UmF0ZQMJAAECBQckbWF0Y2gwAgNJbnQEBHJhdGUFByRtYXRjaDAJAPwHBAUQZW1pc3Npb25Db250cmFjdAISY2hhbmdlUmF0ZVBlckJsb2NrCQDMCAIFBHJhdGUFA25pbAUDbmlsBQR1bml0AwkAAAIFEGNoYW5nZVJhdGVJbnZva2UFEGNoYW5nZVJhdGVJbnZva2UJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtleVN0YXJ0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPa2V5Vm90aW5nUmVzdWx0CQEKdG90YWxWb3RlcwMCATACATACATAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleXjIzUE=", "height": 2584543, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: AKjNfCdj57XgrEKNhJbUNidDzfpdt8edMHyLi8vV1yHZ Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let separator = "__"
5+
6+let contractFilename = "voting_emission_rate.ride"
7+
8+let keyEpochLength = makeString(["%s", "epochLength"], separator)
9+
10+let keyEmissionContract = makeString(["%s", "emissionContract"], separator)
11+
12+let keyBoostingContract = makeString(["%s", "boostingContract"], separator)
13+
14+let keyThreshold = makeString(["%s", "votingThreshold"], separator)
15+
16+let keyRatePerBlock = makeString(["%s%s", "ratePerBlock", "current"], separator)
17+
18+let keyRatePerBlockMax = makeString(["%s%s", "ratePerBlockMax", "current"], separator)
19+
20+let keyRateChangeStep = makeString(["%s", "rateChangeStep"], separator)
21+
22+let keyStartHeight = makeString(["%s", "startHeight"], separator)
23+
24+let keyVotingResult = makeString(["%s", "votingResult"], separator)
25+
26+func throwErr (s) = throw(((contractFilename + ": ") + s))
27+
28+
29+func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
30+
31+
32+func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (key + " is not defined"))
33+
34+
35+func totalVotes (totalIncrease,totalCurrent,totalDecrease) = makeString(["%d%d%d", totalIncrease, totalCurrent, totalDecrease], separator)
36+
37+
38+func keyVote (voterAddress,startHeight) = makeString(["%s%s%d", "vote", voterAddress, toString(startHeight)], separator)
39+
40+
41+func keyVoteValue (gwxAmount,vote) = {
42+ let key = if ((vote == 1))
43+ then makeString(["%d%s", gwxAmount, "increase"], separator)
44+ else if ((vote == -1))
45+ then makeString(["%d%s", gwxAmount, "decrease"], separator)
46+ else makeString(["%d%s", gwxAmount, "current"], separator)
47+ key
48+ }
49+
50+
51+let boostingContract = addressFromStringValue(getStringOrFail(keyBoostingContract))
52+
53+let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract))
54+
55+func keyManagerPublicKey () = "%s__managerPublicKey"
56+
57+
58+func keyManagerVaultAddress () = "%s__managerVaultAddress"
59+
60+
61+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
62+ case s: String =>
63+ addressFromStringValue(s)
64+ case _ =>
65+ this
66+}
67+
68+
69+func managerPublicKeyOrUnit () = {
70+ let managerVaultAddress = getManagerVaultAddressOrThis()
71+ match getString(managerVaultAddress, keyManagerPublicKey()) {
72+ case s: String =>
73+ fromBase58String(s)
74+ case _: Unit =>
75+ unit
76+ case _ =>
77+ throw("Match error")
78+ }
79+ }
80+
81+
82+func isManager (i) = match managerPublicKeyOrUnit() {
83+ case pk: ByteVector =>
84+ (i.callerPublicKey == pk)
85+ case _: Unit =>
86+ (i.caller == this)
87+ case _ =>
88+ throw("Match error")
89+}
90+
91+
92+func mustManager (i) = if (isManager(i))
93+ then true
94+ else throwErr("permission denied")
95+
96+
97+func asInt (val) = match val {
98+ case valInt: Int =>
99+ valInt
100+ case _ =>
101+ throwErr("failed to cast into Integer")
102+}
103+
104+
105+func calcNewRate (ratePerBlockMax,ratePerBlock,changeStep) = {
106+ let maxAllowed = fraction(100, ratePerBlockMax, 120)
107+ let increasedRate = min([fraction((100 + changeStep), ratePerBlock, 100), maxAllowed])
108+ let decreasedRate = max([fraction((100 - changeStep), ratePerBlock, 100), 0])
109+ $Tuple3(increasedRate, ratePerBlock, decreasedRate)
110+ }
111+
112+
113+func getRateChangeAmountsINTERNAL () = {
114+ let ratePerBlockMax = getIntegerValue(emissionContract, keyRatePerBlockMax)
115+ let ratePerBlock = getIntegerValue(emissionContract, keyRatePerBlock)
116+ let rateChangeStep = getIntegerValue(this, keyRateChangeStep)
117+ calcNewRate(ratePerBlockMax, ratePerBlock, rateChangeStep)
118+ }
119+
120+
121+@Callable(i)
122+func constructor (boostingContractPrm,emissionContractPrm,votingDurationPrm,threshold,rateChangeStep) = {
123+ let checks = [if (isDefined(addressFromString(boostingContractPrm)))
124+ then true
125+ else throwErr("Invalid boosting contract address"), if (isDefined(addressFromString(emissionContractPrm)))
126+ then true
127+ else throwErr("Invalid emission contract address"), if ((votingDurationPrm > 0))
128+ then true
129+ else throwErr("Invalid voting duration"), if ((threshold > 0))
130+ then true
131+ else throwErr("invalid threshold"), if ((rateChangeStep > 0))
132+ then true
133+ else throwErr("invalid rateChangeStep")]
134+ 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)
136+ else throw("Strict value is not equal to itself.")
137+ }
138+
139+
140+
141+@Callable(i)
142+func getRateChangeAmountsREADONLY () = $Tuple2(nil, getRateChangeAmountsINTERNAL())
143+
144+
145+
146+@Callable(i)
147+func vote (inFavor) = {
148+ let startHeight = getIntegerValue(keyStartHeight)
149+ let votingFinishHeight = (startHeight + getIntegerValue(keyEpochLength))
150+ let checks = [if ((votingFinishHeight > height))
151+ then true
152+ else throwErr("too late to vote"), if (containsElement([1, 0, -1], inFavor))
153+ then true
154+ else throwErr("not valid argument")]
155+ if ((checks == checks))
156+ then {
157+ let gwxAmount = invoke(boostingContract, "getUserGwxAmountAtHeightREADONLY", [toString(i.caller), votingFinishHeight], nil)
158+ let notZero = if ((asInt(gwxAmount) > 0))
159+ then true
160+ else throwErr("you don't have gwx")
161+ if ((notZero == notZero))
162+ then {
163+ let vote = match getString(keyVote(toString(i.caller), startHeight)) {
164+ case s: String =>
165+ let vote = split(s, separator)
166+ let voteValue = vote[1]
167+ let voteType = vote[2]
168+ let isVoteTypeSimilar = if (if (if ((voteType == "increase"))
169+ then (inFavor == 1)
170+ else false)
171+ then true
172+ else if ((voteType == "decrease"))
173+ then (inFavor == -1)
174+ else false)
175+ then true
176+ else if ((voteType == "current"))
177+ then (inFavor == 0)
178+ else false
179+ let isVoteValueSimilar = if (isVoteTypeSimilar)
180+ then (asInt(gwxAmount) == parseIntValue(voteValue))
181+ else false
182+ let isNewVoteSimilar = if (if (isVoteTypeSimilar)
183+ then isVoteValueSimilar
184+ else false)
185+ then throwErr("you already voted")
186+ else invoke(this, "cancelVote", nil, nil)
187+ isNewVoteSimilar
188+ case u: Unit =>
189+ u
190+ case _ =>
191+ throw("Match error")
192+ }
193+ if ((vote == vote))
194+ then {
195+ let votingResult = split(getStringValue(keyVotingResult), separator)
196+ let votesForIncrease = votingResult[1]
197+ let votesForCurrent = votingResult[2]
198+ let votesForDecrease = votingResult[3]
199+ let newPositiveAndNegativeVotes = if ((inFavor == 1))
200+ then {
201+ let newPositiveVotes = (parseIntValue(votesForIncrease) + asInt(gwxAmount))
202+[toString(newPositiveVotes), votesForCurrent, votesForDecrease]
203+ }
204+ else if ((inFavor == -1))
205+ then {
206+ let newNegativeVotes = (parseIntValue(votesForCurrent) + asInt(gwxAmount))
207+[votesForIncrease, votesForCurrent, toString(newNegativeVotes)]
208+ }
209+ else {
210+ let newCurrentVotes = (parseIntValue(votesForCurrent) + asInt(gwxAmount))
211+[votesForIncrease, toString(newCurrentVotes), votesForDecrease]
212+ }
213+ let voteKey = keyVote(toString(i.caller), startHeight)
214+ let voteValue = keyVoteValue(toString(asInt(gwxAmount)), inFavor)
215+ $Tuple2([StringEntry(keyVotingResult, totalVotes(newPositiveAndNegativeVotes[0], newPositiveAndNegativeVotes[1], newPositiveAndNegativeVotes[2])), StringEntry(voteKey, voteValue)], unit)
216+ }
217+ else throw("Strict value is not equal to itself.")
218+ }
219+ else throw("Strict value is not equal to itself.")
220+ }
221+ else throw("Strict value is not equal to itself.")
222+ }
223+
224+
225+
226+@Callable(i)
227+func cancelVote () = {
228+ let startHeight = getIntegerValue(keyStartHeight)
229+ let votingFinishHeight = (startHeight + getIntegerValue(keyEpochLength))
230+ let userAddress = if ((i.caller == this))
231+ then toString(i.originCaller)
232+ else toString(i.caller)
233+ let checks = [if ((votingFinishHeight > height))
234+ then true
235+ else throwErr("too late to cancel vote"), if (isDefined(getString(keyVotingResult)))
236+ then true
237+ else throwErr("no vote"), if (isDefined(getString(keyVote(userAddress, startHeight))))
238+ then true
239+ else throwErr("no user vote")]
240+ if ((checks == checks))
241+ then {
242+ let vote = split(getStringValue(keyVote(userAddress, startHeight)), separator)
243+ let voteValue = vote[1]
244+ let voteType = vote[2]
245+ let votingResult = split(getStringValue(keyVotingResult), separator)
246+ let votesForIncrease = votingResult[1]
247+ let votesForCurrent = votingResult[2]
248+ let votesForDecrease = votingResult[3]
249+ let actions = if ((voteType == "increase"))
250+ then {
251+ let newIncreaseVotes = (parseIntValue(votesForIncrease) - parseIntValue(voteValue))
252+[StringEntry(keyVotingResult, totalVotes(toString(newIncreaseVotes), votesForCurrent, votesForDecrease))]
253+ }
254+ else if ((voteType == "decrease"))
255+ then {
256+ let newDecreaseVotes = (parseIntValue(votesForDecrease) - parseIntValue(voteValue))
257+[StringEntry(keyVotingResult, totalVotes(votesForIncrease, votesForCurrent, toString(newDecreaseVotes)))]
258+ }
259+ else {
260+ let newCurrentVotes = (parseIntValue(votesForCurrent) - parseIntValue(voteValue))
261+[StringEntry(keyVotingResult, totalVotes(votesForIncrease, toString(newCurrentVotes), votesForDecrease))]
262+ }
263+ let defaultActions = [DeleteEntry(keyVote(userAddress, startHeight))]
264+ (actions ++ defaultActions)
265+ }
266+ else throw("Strict value is not equal to itself.")
267+ }
268+
269+
270+
271+@Callable(i)
272+func setThreshold (newThreshold) = {
273+ let checks = [mustManager(i), if ((newThreshold > 0))
274+ then true
275+ else throwErr("invalid threshold")]
276+ if ((checks == checks))
277+ then $Tuple2([IntegerEntry(keyThreshold, newThreshold)], unit)
278+ else throw("Strict value is not equal to itself.")
279+ }
280+
281+
282+
283+@Callable(i)
284+func finalize () = {
285+ let votingFinishHeight = (getIntegerValue(keyStartHeight) + value(getInteger(keyEpochLength)))
286+ let checks = [if ((height >= votingFinishHeight))
287+ then true
288+ else throwErr("insufficient height for completion")]
289+ if ((checks == checks))
290+ then {
291+ let votingResult = split(value(getString(keyVotingResult)), separator)
292+ let votesForIncrease = parseIntValue(votingResult[1])
293+ let votesForCurrent = parseIntValue(votingResult[2])
294+ let votesForDecrease = parseIntValue(votingResult[3])
295+ let allVotes = ((votesForIncrease + votesForCurrent) + votesForDecrease)
296+ let threshold = getIntOrFail(keyThreshold)
297+ let $t094649544 = getRateChangeAmountsINTERNAL()
298+ let increasedRate = $t094649544._1
299+ let currentRate = $t094649544._2
300+ let decreasedRate = $t094649544._3
301+ let votesList = [votesForIncrease, votesForCurrent, votesForDecrease]
302+ let newRate = if (if ((threshold > allVotes))
303+ then true
304+ else (votesForCurrent == max(votesList)))
305+ then unit
306+ else if ((votesForIncrease == max(votesList)))
307+ then increasedRate
308+ else decreasedRate
309+ let changeRateInvoke = match newRate {
310+ case rate: Int =>
311+ invoke(emissionContract, "changeRatePerBlock", [rate], nil)
312+ case _ =>
313+ unit
314+ }
315+ if ((changeRateInvoke == changeRateInvoke))
316+ then [IntegerEntry(keyStartHeight, height), StringEntry(keyVotingResult, totalVotes("0", "0", "0"))]
317+ else throw("Strict value is not equal to itself.")
318+ }
319+ else throw("Strict value is not equal to itself.")
320+ }
321+
322+
323+@Verifier(tx)
324+func verify () = {
325+ let targetPublicKey = match managerPublicKeyOrUnit() {
326+ case pk: ByteVector =>
327+ pk
328+ case _: Unit =>
329+ tx.senderPublicKey
330+ case _ =>
331+ throw("Match error")
332+ }
333+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
334+ }
335+

github/deemru/w8io/3ef1775 
47.46 ms