tx · BZMywJpmoKuadKgJyJyj9intus8ZMRMHRyVGW3uqx1MN

3N5d1PpYH9xHZPCxsbYU9kzHgoxbVn4Fauh:  -0.10000000 Waves

2022.08.17 15:17 [2188449] smart account 3N5d1PpYH9xHZPCxsbYU9kzHgoxbVn4Fauh > SELF 0.00000000 Waves

{ "type": 13, "id": "BZMywJpmoKuadKgJyJyj9intus8ZMRMHRyVGW3uqx1MN", "fee": 10000000, "feeAssetId": null, "timestamp": 1660738647067, "version": 1, "sender": "3N5d1PpYH9xHZPCxsbYU9kzHgoxbVn4Fauh", "senderPublicKey": "AKzdeowuDBBcD9jmkPGtdKmvtc1C1szMaeAhf5498ZGU", "proofs": [ "32BmTijR5z1mkZYdfR8i7m3SHd8fDGHDJEHmC2jrAvqe7VNs8oSpj8h2FQL91QCZf6Q2XcVT8mB6qwPpkRvH8Vdy" ], "script": "base64:BgI1CAISABIDCgEBEgASAwoBCBIECgIICBIECgIICBIAEgYKBAgICAESAwoBCBIDCgEEEgMKAQgmAAtNQVhfUkVXQVJEUwAFAAVvd25lcgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIFb3duZXIABXRva2VuCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzAgV0b2tlbgAHcmV3YXJkcwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwIHcmV3YXJkcwAMcmV3YXJkc19saXN0CQC1CQIFB3Jld2FyZHMCASwABnBlcmlvZAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIGcGVyaW9kAAlpc19raWxsZWQJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMCCWlzX2tpbGxlZAANY29uZmlnQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzAgZjb25maWcCE25vIHNldHRpbmdzIGRlZmluZWQCFGJhZCBzZXR0aW5ncyBhZGRyZXNzAAZIRUlHSFQFBmhlaWdodAAPc3luY19oZWlnaHRfa2V5AgtzeW5jX2hlaWdodAALc3luY19oZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUPc3luY19oZWlnaHRfa2V5AAAAEHRva2VuX2Ftb3VudF9rZXkCBnRva2VucwAMdG9rZW5fYW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEHRva2VuX2Ftb3VudF9rZXkAAAEPdXNlcl9hbW91bnRfa2V5AQR1c2VyCQCsAgIFBHVzZXICB19hbW91bnQBC3VzZXJfYW1vdW50AQR1c2VyCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ91c2VyX2Ftb3VudF9rZXkBBQR1c2VyAAABF3VzZXJfYXNzZXRfYWRqdXN0ZWRfa2V5AgR1c2VyBWFzc2V0CQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVhc3NldAIJX2FkanVzdGVkARN1c2VyX2Fzc2V0X2FkanVzdGVkAgR1c2VyBWFzc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARd1c2VyX2Fzc2V0X2FkanVzdGVkX2tleQIFBHVzZXIFBWFzc2V0AAABFnVzZXJfYXNzZXRfY2xhaW1lZF9rZXkCBHVzZXIFYXNzZXQJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBWFzc2V0AghfY2xhaW1lZAESdXNlcl9hc3NldF9jbGFpbWVkAgR1c2VyBWFzc2V0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARZ1c2VyX2Fzc2V0X2NsYWltZWRfa2V5AgUEdXNlcgUFYXNzZXQAAAEQYXNzZXRfcmV3YXJkX2tleQEFYXNzZXQJAKwCAgUFYXNzZXQCB19yZXdhcmQBDGFzc2V0X3Jld2FyZAEFYXNzZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEGFzc2V0X3Jld2FyZF9rZXkBBQVhc3NldAAAAQ9hc3NldF9zcGVlZF9rZXkBBWFzc2V0CQCsAgIFBWFzc2V0AgZfc3BlZWQBC2Fzc2V0X3NwZWVkAQVhc3NldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPYXNzZXRfc3BlZWRfa2V5AQUFYXNzZXQAAAEOYXNzZXRfbGVmdF9rZXkBBWFzc2V0CQCsAgIFBWFzc2V0AgVfbGVmdAEKYXNzZXRfbGVmdAEFYXNzZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDmFzc2V0X2xlZnRfa2V5AQUFYXNzZXQAAAERYXNzZXRfY29udHJvbF9rZXkBBWFzc2V0CQCsAgIFBWFzc2V0AghfY29udHJvbAENYXNzZXRfY29udHJvbAEFYXNzZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBEWFzc2V0X2NvbnRyb2xfa2V5AQUFYXNzZXQAAAEMY2hlY2tBZGRyZXNzAQNhNTgEAWEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFA2E1OAkApQgBBQFhAQpjaGVja0Fzc2V0AQdhc3NldDU4AwkAAAIFB2Fzc2V0NTgCBVdBVkVTAgVXQVZFUwQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQdhc3NldDU4CQCsAgICFldyb25nIGFzc2V0IGVuY29kaW5nOiAFB2Fzc2V0NTgEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQVhc3NldAkArAICAhJXcm9uZyBhc3NldCBpbmZvOiAFB2Fzc2V0NTgDCQAAAgUEaW5mbwUEaW5mbwUHYXNzZXQ1OAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEFYXNzZXQBAWEDCQAAAgUBYQIFV0FWRVMFBHVuaXQJANkEAQUBYQEMYXNzZXRfc3RyaW5nAQFhBAckbWF0Y2gwBQFhAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBDWFzc2V0X2JhbGFuY2UBAWEDCQAAAgUBYQIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUBYQEMc3RvcF9yZXdhcmRzAAoBBGZvbGQCA2FjYwVhc3NldAkAzggCBQNhY2MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9hc3NldF9zcGVlZF9rZXkBBQVhc3NldAAABQNuaWwKAAIkbAUMcmV3YXJkc19saXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2hlY2twb2ludF9hc3NldAIDYWNjBWFzc2V0BA1fYXNzZXRfcmV3YXJkCQEMYXNzZXRfcmV3YXJkAQUFYXNzZXQEDF9hc3NldF9zcGVlZAkBC2Fzc2V0X3NwZWVkAQUFYXNzZXQEC19hc3NldF9sZWZ0CQEKYXNzZXRfbGVmdAEFBWFzc2V0BA9lc3RpbWF0ZV9yZXdhcmQJAGgCCQBlAgUGSEVJR0hUBQtzeW5jX2hlaWdodAUMX2Fzc2V0X3NwZWVkBAtyZWFsX3Jld2FyZAMJAGYCBQ9lc3RpbWF0ZV9yZXdhcmQFC19hc3NldF9sZWZ0BQtfYXNzZXRfbGVmdAUPZXN0aW1hdGVfcmV3YXJkBBJjbGFpbV9hc3NldF9yZXdhcmQJAGQCBQ1fYXNzZXRfcmV3YXJkBQtyZWFsX3Jld2FyZAQQY2xhaW1fYXNzZXRfbGVmdAkAZQIFC19hc3NldF9sZWZ0BQtyZWFsX3Jld2FyZAQRY2xhaW1fYXNzZXRfc3BlZWQDCQBmAgUQY2xhaW1fYXNzZXRfbGVmdAAABQxfYXNzZXRfc3BlZWQAAAQNcmV3YXJkX2FjdGlvbgMJAAACBRJjbGFpbV9hc3NldF9yZXdhcmQFDV9hc3NldF9yZXdhcmQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGFzc2V0X3Jld2FyZF9rZXkBBQVhc3NldAUSY2xhaW1fYXNzZXRfcmV3YXJkBQNuaWwEDl9hc3NldF9iYWxhbmNlCQENYXNzZXRfYmFsYW5jZQEFBWFzc2V0BA5fYXNzZXRfY29udHJvbAkBDWFzc2V0X2NvbnRyb2wBBQVhc3NldAMJAGYCBQ5fYXNzZXRfY29udHJvbAUOX2Fzc2V0X2JhbGFuY2UJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIFBWFzc2V0AhsgYmFsYW5jZSBsZWFrYWdlIGRldGVjdGVkOiAJAKQDAQUOX2Fzc2V0X2NvbnRyb2wCAyA+IAkApAMBBQ5fYXNzZXRfYmFsYW5jZQQScGVyaW9kX25ld19iYWxhbmNlCQBlAgUOX2Fzc2V0X2JhbGFuY2UFDl9hc3NldF9jb250cm9sBBRwZXJpb2RfYXNzZXRfYmFsYW5jZQkAZAIFEGNsYWltX2Fzc2V0X2xlZnQFEnBlcmlvZF9uZXdfYmFsYW5jZQQScGVyaW9kX2Fzc2V0X3NwZWVkCQBpAgUUcGVyaW9kX2Fzc2V0X2JhbGFuY2UFBnBlcmlvZAMDCQBnAgURY2xhaW1fYXNzZXRfc3BlZWQFEnBlcmlvZF9hc3NldF9zcGVlZAkAZwIFEGNsYWltX2Fzc2V0X2xlZnQFEnBlcmlvZF9uZXdfYmFsYW5jZQcEDHNwZWVkX2FjdGlvbgMJAAACBRFjbGFpbV9hc3NldF9zcGVlZAUMX2Fzc2V0X3NwZWVkBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9hc3NldF9zcGVlZF9rZXkBBQVhc3NldAURY2xhaW1fYXNzZXRfc3BlZWQFA25pbAQLbGVmdF9hY3Rpb24DCQAAAgUQY2xhaW1fYXNzZXRfbGVmdAULX2Fzc2V0X2xlZnQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmFzc2V0X2xlZnRfa2V5AQUFYXNzZXQFEGNsYWltX2Fzc2V0X2xlZnQFA25pbAkAzggCCQDOCAIJAM4IAgUDYWNjBQ1yZXdhcmRfYWN0aW9uBQxzcGVlZF9hY3Rpb24FC2xlZnRfYWN0aW9uBBFwZXJpb2RfYXNzZXRfbGVmdAkAaAIFEnBlcmlvZF9hc3NldF9zcGVlZAUGcGVyaW9kBBFwZXJpb2RfYXNzZXRfZHVzdAkAZQIFFHBlcmlvZF9hc3NldF9iYWxhbmNlBRFwZXJpb2RfYXNzZXRfbGVmdAQTcGVyaW9kX2Fzc2V0X2NvbnRvbAkAZQIFDl9hc3NldF9iYWxhbmNlBRFwZXJpb2RfYXNzZXRfZHVzdAkAzggCCQDOCAIFA2FjYwUNcmV3YXJkX2FjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2Fzc2V0X3NwZWVkX2tleQEFBWFzc2V0BRJwZXJpb2RfYXNzZXRfc3BlZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5hc3NldF9sZWZ0X2tleQEFBWFzc2V0BRFwZXJpb2RfYXNzZXRfbGVmdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWFzc2V0X2NvbnRyb2xfa2V5AQUFYXNzZXQFE3BlcmlvZF9hc3NldF9jb250b2wFA25pbAEEc3luYwADBQlpc19raWxsZWQFA25pbAkA/AcEBQR0aGlzAgpjaGVja3BvaW50BQNuaWwFA25pbAESY2hlY2twb2ludF9hY3Rpb25zAAQLc3luY19hY3Rpb24DCQAAAgULc3luY19oZWlnaHQFBkhFSUdIVAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9zeW5jX2hlaWdodF9rZXkFBkhFSUdIVAUDbmlsCQDOCAIFC3N5bmNfYWN0aW9uCgACJGwFDHJld2FyZHNfbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2hlY2twb2ludF9hc3NldAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBC3VwZGF0ZV91c2VyAgR1c2VyBmNoYW5nZQQPbmV3X3VzZXJfYW1vdW50CQBkAgkBC3VzZXJfYW1vdW50AQUEdXNlcgUGY2hhbmdlAwkAZgIAAAUPbmV3X3VzZXJfYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIMQmFkIGFtb3VudDogCQCkAwEFBmNoYW5nZQIULCBhdmFpbGFibGUgYW1vdW50OiAJAKQDAQkBC3VzZXJfYW1vdW50AQUEdXNlcgQQbmV3X3Rva2VuX2Ftb3VudAkAZAIFDHRva2VuX2Ftb3VudAUGY2hhbmdlAwkAZgIFEG5ld190b2tlbl9hbW91bnQJAQ1hc3NldF9iYWxhbmNlAQUFdG9rZW4JAAIBCQCsAgIJAKwCAgkArAICAiBUb2tlbiBiYWxhbmNlIGxlYWthZ2UgZGV0ZWN0ZWQ6IAkApAMBBRBuZXdfdG9rZW5fYW1vdW50AgMgPiAJAKQDAQkBDWFzc2V0X2JhbGFuY2UBBQV0b2tlbgQBcwkBBHN5bmMAAwkAAAIFAXMFAXMKAQRmb2xkAgNhY2MFYXNzZXQJAM4IAgUDYWNjBA1fYXNzZXRfcmV3YXJkCQEMYXNzZXRfcmV3YXJkAQUFYXNzZXQEFF91c2VyX2Fzc2V0X2FkanVzdGVkCQETdXNlcl9hc3NldF9hZGp1c3RlZAIFBHVzZXIFBWFzc2V0BBBuZXdfYXNzZXRfcmV3YXJkAwkAAAIFDHRva2VuX2Ftb3VudAAABQ1fYXNzZXRfcmV3YXJkCQBrAwUNX2Fzc2V0X3Jld2FyZAUQbmV3X3Rva2VuX2Ftb3VudAUMdG9rZW5fYW1vdW50BBduZXdfdXNlcl9hc3NldF9hZGp1c3RlZAkAZAIFFF91c2VyX2Fzc2V0X2FkanVzdGVkAwkAAAIFEG5ld190b2tlbl9hbW91bnQAAAUNX2Fzc2V0X3Jld2FyZAkBAS0BCQBrAwUQbmV3X2Fzc2V0X3Jld2FyZAUGY2hhbmdlBRBuZXdfdG9rZW5fYW1vdW50BA1yZXdhcmRfYWN0aW9uAwkAAAIFDV9hc3NldF9yZXdhcmQFEG5ld19hc3NldF9yZXdhcmQFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGFzc2V0X3Jld2FyZF9rZXkBBQVhc3NldAUQbmV3X2Fzc2V0X3Jld2FyZAUDbmlsBA1hZGp1c3RfYWN0aW9uAwkAAAIFFF91c2VyX2Fzc2V0X2FkanVzdGVkBRduZXdfdXNlcl9hc3NldF9hZGp1c3RlZAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXdXNlcl9hc3NldF9hZGp1c3RlZF9rZXkCBQR1c2VyBQVhc3NldAUXbmV3X3VzZXJfYXNzZXRfYWRqdXN0ZWQFA25pbAkAzggCBQ1yZXdhcmRfYWN0aW9uBQ1hZGp1c3RfYWN0aW9uBAxzdG9wX2FjdGlvbnMDCQAAAgUQbmV3X3Rva2VuX2Ftb3VudAAACQEMc3RvcF9yZXdhcmRzAAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdG9rZW5fYW1vdW50X2tleQUQbmV3X3Rva2VuX2Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD3VzZXJfYW1vdW50X2tleQEFBHVzZXIFD25ld191c2VyX2Ftb3VudAUDbmlsCgACJGwFDHJld2FyZHNfbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUFDHN0b3BfYWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQY2hlY2tSZXdhcmRzTGlzdAIIX3Jld2FyZHMGX3Rva2VuBA1fcmV3YXJkc19saXN0CQC1CQIFCF9yZXdhcmRzAgEsAwkAZgIJAJADAQUNX3Jld2FyZHNfbGlzdAULTUFYX1JFV0FSRFMJAAIBAhBUb28gbWFueSByZXdhcmRzCgEEZm9sZAIDYWNjBWFzc2V0AwkAAAIJAQpjaGVja0Fzc2V0AQUFYXNzZXQFBl90b2tlbgkAAgECGlJld2FyZCBjYW5ub3QgYmUgdGhlIHRva2VuAwkBD2NvbnRhaW5zRWxlbWVudAIFA2FjYwUFYXNzZXQJAAIBAhlEdXBsaWNhdGVkIHJld2FyZCBpbiBsaXN0CQDOCAIFA2FjYwkAzAgCBQVhc3NldAUDbmlsCQC5CQIKAAIkbAUNX3Jld2FyZHNfbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUCASwLA21zZwEHZGVwb3NpdAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECI1dyb25nIHBheW1lbnRzLCBzaG91bGQgYmUgMSBwYXltZW50BAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAMJAQIhPQIJAQxhc3NldF9zdHJpbmcBCAUHcGF5bWVudAdhc3NldElkBQV0b2tlbgkAAgEJAKwCAgkArAICCQCsAgICDVdyb25nIHRva2VuOiAJAQxhc3NldF9zdHJpbmcBCAUHcGF5bWVudAdhc3NldElkAgQgIT0gBQV0b2tlbgMJAGcCAAAIBQdwYXltZW50BmFtb3VudAkAAgECIFdyb25nIGFtb3VudCwgc2hvdWxkIGJlIHBvc2l0aXZlCQELdXBkYXRlX3VzZXICCQClCAEIBQNtc2cGY2FsbGVyCAUHcGF5bWVudAZhbW91bnQDbXNnAQh3aXRoZHJhdwEGYW1vdW50AwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAAJAAIBAh9Xcm9uZyBwYXltZW50cywgc2hvdWxkIGJlIGVtcHR5AwkAZwIAAAUGYW1vdW50CQACAQIgV3JvbmcgYW1vdW50LCBzaG91bGQgYmUgcG9zaXRpdmUJAM4IAgkBC3VwZGF0ZV91c2VyAgkApQgBCAUDbXNnBmNhbGxlcgkBAS0BBQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFA21zZwZjYWxsZXIFBmFtb3VudAkBBWFzc2V0AQUFdG9rZW4FA25pbANtc2cBBWNsYWltAAMJAQIhPQIJAJADAQgFA21zZwhwYXltZW50cwAACQACAQIfV3JvbmcgcGF5bWVudHMsIHNob3VsZCBiZSBlbXB0eQQBcwMJAGYCBQx0b2tlbl9hbW91bnQAAAkBBHN5bmMABQNuaWwDCQAAAgUBcwUBcwQEdXNlcgkApQgBCAUDbXNnBmNhbGxlcgoBBGZvbGQCA2FjYwVhc3NldAkAzggCBQNhY2MEDV9hc3NldF9yZXdhcmQJAQxhc3NldF9yZXdhcmQBBQVhc3NldAQLYWNjdW11bGF0ZWQJAGQCCQETdXNlcl9hc3NldF9hZGp1c3RlZAIFBHVzZXIFBWFzc2V0AwkAAAIFDHRva2VuX2Ftb3VudAAAAAAJAGsDBQ1fYXNzZXRfcmV3YXJkCQELdXNlcl9hbW91bnQBBQR1c2VyBQx0b2tlbl9hbW91bnQEB2NsYWltZWQJARJ1c2VyX2Fzc2V0X2NsYWltZWQCBQR1c2VyBQVhc3NldAQGYW1vdW50CQBlAgULYWNjdW11bGF0ZWQFB2NsYWltZWQDCQAAAgUGYW1vdW50AAAFA25pbAMJAGYCAAAFBmFtb3VudAkAAgEJAKwCAgkArAICBQVhc3NldAIcIGJhZCBjbGFpbSBhbW91bnQgZGV0ZWN0ZWQ6IAkApAMBBQZhbW91bnQEDl9hc3NldF9jb250cm9sCQENYXNzZXRfY29udHJvbAEFBWFzc2V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQZhbW91bnQJAQVhc3NldAEFBWFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWdXNlcl9hc3NldF9jbGFpbWVkX2tleQIFBHVzZXIFBWFzc2V0CQBkAgUHY2xhaW1lZAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERYXNzZXRfY29udHJvbF9rZXkBBQVhc3NldAkAZQIFDl9hc3NldF9jb250cm9sBQZhbW91bnQFA25pbAQNY2xhaW1fYWN0aW9ucwoAAiRsBQxyZXdhcmRzX2xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAwkAAAIJAJADAQUNY2xhaW1fYWN0aW9ucwAACQACAQIQTm90aGluZyB0byBjbGFpbQUNY2xhaW1fYWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBEGNsYWltYWJsZV90b2tlbnMBBHVzZXIJAJQKAgUDbmlsCQELdXNlcl9hbW91bnQBBQR1c2VyA21zZwEOY2xhaW1lZF9yZXdhcmQCBHVzZXIFYXNzZXQJAJQKAgUDbmlsCQESdXNlcl9hc3NldF9jbGFpbWVkAgUEdXNlcgUFYXNzZXQDbXNnARBjbGFpbWFibGVfcmV3YXJkAgR1c2VyBWFzc2V0BAFzAwkAZgIFDHRva2VuX2Ftb3VudAAACQEEc3luYwAFA25pbAMJAAACBQFzBQFzBA1fYXNzZXRfcmV3YXJkCQEMYXNzZXRfcmV3YXJkAQUFYXNzZXQEC2FjY3VtdWxhdGVkCQBkAgkBE3VzZXJfYXNzZXRfYWRqdXN0ZWQCBQR1c2VyBQVhc3NldAMJAAACBQx0b2tlbl9hbW91bnQAAAAACQBrAwUNX2Fzc2V0X3Jld2FyZAkBC3VzZXJfYW1vdW50AQUEdXNlcgUMdG9rZW5fYW1vdW50BAdjbGFpbWVkCQESdXNlcl9hc3NldF9jbGFpbWVkAgUEdXNlcgUFYXNzZXQEBmFtb3VudAkAZQIFC2FjY3VtdWxhdGVkBQdjbGFpbWVkCQCUCgIFA25pbAUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEKY2hlY2twb2ludAADBQlpc19raWxsZWQJAAIBAhRDaGVja3BvaW50IGlzIGtpbGxlZAMDCQAAAgUMdG9rZW5fYW1vdW50AAAJAQIhPQIIBQNtc2cGY2FsbGVyBQR0aGlzBwkAAgECFkNoZWNrcG9pbnQgdW5hdmFpbGFibGUJARJjaGVja3BvaW50X2FjdGlvbnMAA21zZwEEaW5pdAQGX293bmVyBl90b2tlbghfcmV3YXJkcwdfcGVyaW9kAwkBASEBCQCeCAEFBHRoaXMJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkAwkBAiE9AggFA21zZwZjYWxsZXIFBHRoaXMJAAIBAhhTZWxmIGluaXRpYWxpemF0aW9uIG9ubHkDCQBnAgAABQdfcGVyaW9kCQACAQIKQmFkIHBlcmlvZAkAzAgCCQELU3RyaW5nRW50cnkCAgVvd25lcgkBDGNoZWNrQWRkcmVzcwEFBl9vd25lcgkAzAgCCQELU3RyaW5nRW50cnkCAgV0b2tlbgkBCmNoZWNrQXNzZXQBBQZfdG9rZW4JAMwIAgkBC1N0cmluZ0VudHJ5AgIHcmV3YXJkcwkBEGNoZWNrUmV3YXJkc0xpc3QCBQhfcmV3YXJkcwUGX3Rva2VuCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgZwZXJpb2QFB19wZXJpb2QJAMwIAgkBDEJvb2xlYW5FbnRyeQICCWlzX2tpbGxlZAcFA25pbANtc2cBCmFkZF9yZXdhcmQBBnJld2FyZAMJAQIhPQIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCk93bmVyIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIHcmV3YXJkcwkBEGNoZWNrUmV3YXJkc0xpc3QCCQCsAgIJAKwCAgUHcmV3YXJkcwIBLAUGcmV3YXJkBQV0b2tlbgUDbmlsA21zZwEKc2V0X2tpbGxlZAEKX2lzX2tpbGxlZAMJAQIhPQIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCk93bmVyIG9ubHkDCQAAAgUJaXNfa2lsbGVkBQpfaXNfa2lsbGVkCQACAQIKU2FtZSBzdGF0ZQQMc3RvcF9hY3Rpb25zAwUKX2lzX2tpbGxlZAkBDHN0b3BfcmV3YXJkcwAFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCAglpc19raWxsZWQFCl9pc19raWxsZWQFA25pbAUMc3RvcF9hY3Rpb25zA21zZwEKc2V0X2NvbmZpZwEHX2NvbmZpZwMJAQIhPQIIBQNtc2cGY2FsbGVyBQVvd25lcgkAAgECCk93bmVyIG9ubHkJAMwIAgkBC1N0cmluZ0VudHJ5AgIGY29uZmlnCQEMY2hlY2tBZGRyZXNzAQUHX2NvbmZpZwUDbmlsAMAxjCU=", "chainId": 84, "height": 2188449, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let MAX_REWARDS = 5
5+
6+let owner = addressFromStringValue(getStringValue(this, "owner"))
7+
8+let token = getStringValue(this, "token")
9+
10+let rewards = getStringValue(this, "rewards")
11+
12+let rewards_list = split(rewards, ",")
13+
14+let period = getIntegerValue(this, "period")
15+
16+let is_killed = getBooleanValue(this, "is_killed")
17+
18+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "config"), "no settings defined")), "bad settings address")
19+
20+let HEIGHT = height
21+
22+let sync_height_key = "sync_height"
23+
24+let sync_height = valueOrElse(getInteger(this, sync_height_key), 0)
25+
26+let token_amount_key = "tokens"
27+
28+let token_amount = valueOrElse(getInteger(this, token_amount_key), 0)
29+
30+func user_amount_key (user) = (user + "_amount")
31+
32+
33+func user_amount (user) = valueOrElse(getInteger(this, user_amount_key(user)), 0)
34+
35+
36+func user_asset_adjusted_key (user,asset) = (((user + "_") + asset) + "_adjusted")
37+
38+
39+func user_asset_adjusted (user,asset) = valueOrElse(getInteger(this, user_asset_adjusted_key(user, asset)), 0)
40+
41+
42+func user_asset_claimed_key (user,asset) = (((user + "_") + asset) + "_claimed")
43+
44+
45+func user_asset_claimed (user,asset) = valueOrElse(getInteger(this, user_asset_claimed_key(user, asset)), 0)
46+
47+
48+func asset_reward_key (asset) = (asset + "_reward")
49+
50+
51+func asset_reward (asset) = valueOrElse(getInteger(this, asset_reward_key(asset)), 0)
52+
53+
54+func asset_speed_key (asset) = (asset + "_speed")
55+
56+
57+func asset_speed (asset) = valueOrElse(getInteger(this, asset_speed_key(asset)), 0)
58+
59+
60+func asset_left_key (asset) = (asset + "_left")
61+
62+
63+func asset_left (asset) = valueOrElse(getInteger(this, asset_left_key(asset)), 0)
64+
65+
66+func asset_control_key (asset) = (asset + "_control")
67+
68+
69+func asset_control (asset) = valueOrElse(getInteger(this, asset_control_key(asset)), 0)
70+
71+
72+func checkAddress (a58) = {
73+ let a = addressFromStringValue(a58)
74+ toString(a)
75+ }
76+
77+
78+func checkAsset (asset58) = if ((asset58 == "WAVES"))
79+ then "WAVES"
80+ else {
81+ let asset = valueOrErrorMessage(fromBase58String(asset58), ("Wrong asset encoding: " + asset58))
82+ let info = valueOrErrorMessage(assetInfo(asset), ("Wrong asset info: " + asset58))
83+ if ((info == info))
84+ then asset58
85+ else throw("Strict value is not equal to itself.")
86+ }
87+
88+
89+func asset (a) = if ((a == "WAVES"))
90+ then unit
91+ else fromBase58String(a)
92+
93+
94+func asset_string (a) = match a {
95+ case b: ByteVector =>
96+ toBase58String(b)
97+ case _ =>
98+ "WAVES"
99+}
100+
101+
102+func asset_balance (a) = if ((a == "WAVES"))
103+ then wavesBalance(this).available
104+ else assetBalance(this, fromBase58String(a))
105+
106+
107+func stop_rewards () = {
108+ func fold (acc,asset) = (acc ++ [IntegerEntry(asset_speed_key(asset), 0)])
109+
110+ let $l = rewards_list
111+ let $s = size($l)
112+ let $acc0 = nil
113+ func $f0_1 ($a,$i) = if (($i >= $s))
114+ then $a
115+ else fold($a, $l[$i])
116+
117+ func $f0_2 ($a,$i) = if (($i >= $s))
118+ then $a
119+ else throw("List size exceeds 5")
120+
121+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
122+ }
123+
124+
125+func checkpoint_asset (acc,asset) = {
126+ let _asset_reward = asset_reward(asset)
127+ let _asset_speed = asset_speed(asset)
128+ let _asset_left = asset_left(asset)
129+ let estimate_reward = ((HEIGHT - sync_height) * _asset_speed)
130+ let real_reward = if ((estimate_reward > _asset_left))
131+ then _asset_left
132+ else estimate_reward
133+ let claim_asset_reward = (_asset_reward + real_reward)
134+ let claim_asset_left = (_asset_left - real_reward)
135+ let claim_asset_speed = if ((claim_asset_left > 0))
136+ then _asset_speed
137+ else 0
138+ let reward_action = if ((claim_asset_reward == _asset_reward))
139+ then nil
140+ else [IntegerEntry(asset_reward_key(asset), claim_asset_reward)]
141+ let _asset_balance = asset_balance(asset)
142+ let _asset_control = asset_control(asset)
143+ if ((_asset_control > _asset_balance))
144+ then throw(((((asset + " balance leakage detected: ") + toString(_asset_control)) + " > ") + toString(_asset_balance)))
145+ else {
146+ let period_new_balance = (_asset_balance - _asset_control)
147+ let period_asset_balance = (claim_asset_left + period_new_balance)
148+ let period_asset_speed = (period_asset_balance / period)
149+ if (if ((claim_asset_speed >= period_asset_speed))
150+ then (claim_asset_left >= period_new_balance)
151+ else false)
152+ then {
153+ let speed_action = if ((claim_asset_speed == _asset_speed))
154+ then nil
155+ else [IntegerEntry(asset_speed_key(asset), claim_asset_speed)]
156+ let left_action = if ((claim_asset_left == _asset_left))
157+ then nil
158+ else [IntegerEntry(asset_left_key(asset), claim_asset_left)]
159+ (((acc ++ reward_action) ++ speed_action) ++ left_action)
160+ }
161+ else {
162+ let period_asset_left = (period_asset_speed * period)
163+ let period_asset_dust = (period_asset_balance - period_asset_left)
164+ let period_asset_contol = (_asset_balance - period_asset_dust)
165+ ((acc ++ reward_action) ++ [IntegerEntry(asset_speed_key(asset), period_asset_speed), IntegerEntry(asset_left_key(asset), period_asset_left), IntegerEntry(asset_control_key(asset), period_asset_contol)])
166+ }
167+ }
168+ }
169+
170+
171+func sync () = if (is_killed)
172+ then nil
173+ else invoke(this, "checkpoint", nil, nil)
174+
175+
176+func checkpoint_actions () = {
177+ let sync_action = if ((sync_height == HEIGHT))
178+ then nil
179+ else [IntegerEntry(sync_height_key, HEIGHT)]
180+ (sync_action ++ {
181+ let $l = rewards_list
182+ let $s = size($l)
183+ let $acc0 = nil
184+ func $f0_1 ($a,$i) = if (($i >= $s))
185+ then $a
186+ else checkpoint_asset($a, $l[$i])
187+
188+ func $f0_2 ($a,$i) = if (($i >= $s))
189+ then $a
190+ else throw("List size exceeds 5")
191+
192+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
193+ })
194+ }
195+
196+
197+func update_user (user,change) = {
198+ let new_user_amount = (user_amount(user) + change)
199+ if ((0 > new_user_amount))
200+ then throw(((("Bad amount: " + toString(change)) + ", available amount: ") + toString(user_amount(user))))
201+ else {
202+ let new_token_amount = (token_amount + change)
203+ if ((new_token_amount > asset_balance(token)))
204+ then throw(((("Token balance leakage detected: " + toString(new_token_amount)) + " > ") + toString(asset_balance(token))))
205+ else {
206+ let s = sync()
207+ if ((s == s))
208+ then {
209+ func fold (acc,asset) = (acc ++ {
210+ let _asset_reward = asset_reward(asset)
211+ let _user_asset_adjusted = user_asset_adjusted(user, asset)
212+ let new_asset_reward = if ((token_amount == 0))
213+ then _asset_reward
214+ else fraction(_asset_reward, new_token_amount, token_amount)
215+ let new_user_asset_adjusted = (_user_asset_adjusted + (if ((new_token_amount == 0))
216+ then _asset_reward
217+ else -(fraction(new_asset_reward, change, new_token_amount))))
218+ let reward_action = if ((_asset_reward == new_asset_reward))
219+ then nil
220+ else [IntegerEntry(asset_reward_key(asset), new_asset_reward)]
221+ let adjust_action = if ((_user_asset_adjusted == new_user_asset_adjusted))
222+ then nil
223+ else [IntegerEntry(user_asset_adjusted_key(user, asset), new_user_asset_adjusted)]
224+ (reward_action ++ adjust_action)
225+ })
226+
227+ let stop_actions = if ((new_token_amount == 0))
228+ then stop_rewards()
229+ else nil
230+ (([IntegerEntry(token_amount_key, new_token_amount), IntegerEntry(user_amount_key(user), new_user_amount)] ++ {
231+ let $l = rewards_list
232+ let $s = size($l)
233+ let $acc0 = nil
234+ func $f0_1 ($a,$i) = if (($i >= $s))
235+ then $a
236+ else fold($a, $l[$i])
237+
238+ func $f0_2 ($a,$i) = if (($i >= $s))
239+ then $a
240+ else throw("List size exceeds 5")
241+
242+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
243+ }) ++ stop_actions)
244+ }
245+ else throw("Strict value is not equal to itself.")
246+ }
247+ }
248+ }
249+
250+
251+func checkRewardsList (_rewards,_token) = {
252+ let _rewards_list = split(_rewards, ",")
253+ if ((size(_rewards_list) > MAX_REWARDS))
254+ then throw("Too many rewards")
255+ else {
256+ func fold (acc,asset) = if ((checkAsset(asset) == _token))
257+ then throw("Reward cannot be the token")
258+ else if (containsElement(acc, asset))
259+ then throw("Duplicated reward in list")
260+ else (acc ++ [asset])
261+
262+ makeString({
263+ let $l = _rewards_list
264+ let $s = size($l)
265+ let $acc0 = nil
266+ func $f0_1 ($a,$i) = if (($i >= $s))
267+ then $a
268+ else fold($a, $l[$i])
269+
270+ func $f0_2 ($a,$i) = if (($i >= $s))
271+ then $a
272+ else throw("List size exceeds 5")
273+
274+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
275+ }, ",")
276+ }
277+ }
278+
279+
280+@Callable(msg)
281+func deposit () = if ((size(msg.payments) != 1))
282+ then throw("Wrong payments, should be 1 payment")
283+ else {
284+ let payment = msg.payments[0]
285+ if ((asset_string(payment.assetId) != token))
286+ then throw(((("Wrong token: " + asset_string(payment.assetId)) + " != ") + token))
287+ else if ((0 >= payment.amount))
288+ then throw("Wrong amount, should be positive")
289+ else update_user(toString(msg.caller), payment.amount)
290+ }
291+
292+
293+
294+@Callable(msg)
295+func withdraw (amount) = if ((size(msg.payments) != 0))
296+ then throw("Wrong payments, should be empty")
297+ else if ((0 >= amount))
298+ then throw("Wrong amount, should be positive")
299+ else (update_user(toString(msg.caller), -(amount)) ++ [ScriptTransfer(msg.caller, amount, asset(token))])
300+
301+
302+
303+@Callable(msg)
304+func claim () = if ((size(msg.payments) != 0))
305+ then throw("Wrong payments, should be empty")
306+ else {
307+ let s = if ((token_amount > 0))
308+ then sync()
309+ else nil
310+ if ((s == s))
311+ then {
312+ let user = toString(msg.caller)
313+ func fold (acc,asset) = (acc ++ {
314+ let _asset_reward = asset_reward(asset)
315+ let accumulated = (user_asset_adjusted(user, asset) + (if ((token_amount == 0))
316+ then 0
317+ else fraction(_asset_reward, user_amount(user), token_amount)))
318+ let claimed = user_asset_claimed(user, asset)
319+ let amount = (accumulated - claimed)
320+ if ((amount == 0))
321+ then nil
322+ else if ((0 > amount))
323+ then throw(((asset + " bad claim amount detected: ") + toString(amount)))
324+ else {
325+ let _asset_control = asset_control(asset)
326+[ScriptTransfer(msg.caller, amount, asset(asset)), IntegerEntry(user_asset_claimed_key(user, asset), (claimed + amount)), IntegerEntry(asset_control_key(asset), (_asset_control - amount))]
327+ }
328+ })
329+
330+ let claim_actions = {
331+ let $l = rewards_list
332+ let $s = size($l)
333+ let $acc0 = nil
334+ func $f0_1 ($a,$i) = if (($i >= $s))
335+ then $a
336+ else fold($a, $l[$i])
337+
338+ func $f0_2 ($a,$i) = if (($i >= $s))
339+ then $a
340+ else throw("List size exceeds 5")
341+
342+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
343+ }
344+ if ((size(claim_actions) == 0))
345+ then throw("Nothing to claim")
346+ else claim_actions
347+ }
348+ else throw("Strict value is not equal to itself.")
349+ }
350+
351+
352+
353+@Callable(msg)
354+func claimable_tokens (user) = $Tuple2(nil, user_amount(user))
355+
356+
357+
358+@Callable(msg)
359+func claimed_reward (user,asset) = $Tuple2(nil, user_asset_claimed(user, asset))
360+
361+
362+
363+@Callable(msg)
364+func claimable_reward (user,asset) = {
365+ let s = if ((token_amount > 0))
366+ then sync()
367+ else nil
368+ if ((s == s))
369+ then {
370+ let _asset_reward = asset_reward(asset)
371+ let accumulated = (user_asset_adjusted(user, asset) + (if ((token_amount == 0))
372+ then 0
373+ else fraction(_asset_reward, user_amount(user), token_amount)))
374+ let claimed = user_asset_claimed(user, asset)
375+ let amount = (accumulated - claimed)
376+ $Tuple2(nil, amount)
377+ }
378+ else throw("Strict value is not equal to itself.")
379+ }
380+
381+
382+
383+@Callable(msg)
384+func checkpoint () = if (is_killed)
385+ then throw("Checkpoint is killed")
386+ else if (if ((token_amount == 0))
387+ then (msg.caller != this)
388+ else false)
389+ then throw("Checkpoint unavailable")
390+ else checkpoint_actions()
391+
392+
393+
394+@Callable(msg)
395+func init (_owner,_token,_rewards,_period) = if (!(isDataStorageUntouched(this)))
396+ then throw("Already initialized")
397+ else if ((msg.caller != this))
398+ then throw("Self initialization only")
399+ else if ((0 >= _period))
400+ then throw("Bad period")
401+ else [StringEntry("owner", checkAddress(_owner)), StringEntry("token", checkAsset(_token)), StringEntry("rewards", checkRewardsList(_rewards, _token)), IntegerEntry("period", _period), BooleanEntry("is_killed", false)]
402+
403+
404+
405+@Callable(msg)
406+func add_reward (reward) = if ((msg.caller != owner))
407+ then throw("Owner only")
408+ else [StringEntry("rewards", checkRewardsList(((rewards + ",") + reward), token))]
409+
410+
411+
412+@Callable(msg)
413+func set_killed (_is_killed) = if ((msg.caller != owner))
414+ then throw("Owner only")
415+ else if ((is_killed == _is_killed))
416+ then throw("Same state")
417+ else {
418+ let stop_actions = if (_is_killed)
419+ then stop_rewards()
420+ else nil
421+ ([BooleanEntry("is_killed", _is_killed)] ++ stop_actions)
422+ }
423+
424+
425+
426+@Callable(msg)
427+func set_config (_config) = if ((msg.caller != owner))
428+ then throw("Owner only")
429+ else [StringEntry("config", checkAddress(_config))]
430+
431+

github/deemru/w8io/169f3d6 
57.13 ms