tx · 5ovLnpNu9M5ipxknLn33RyM8TfZd5ajEGE9ZRPaJcKJb

3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1:  -0.01200000 Waves

2024.04.16 13:26 [4131176] smart account 3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1 > SELF 0.00000000 Waves

{ "type": 13, "id": "5ovLnpNu9M5ipxknLn33RyM8TfZd5ajEGE9ZRPaJcKJb", "fee": 1200000, "feeAssetId": null, "timestamp": 1713263259876, "version": 1, "sender": "3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1", "senderPublicKey": "CySLWUjPdfjfB7gvJBekkUcTuL6EKAnbmMcUJqLbqGFS", "proofs": [ "3FZ6CVg7R6qGYTW4vF5d62mW8jipVgsuwEv4nWbsuxUfzDrKcsM7oKwpBPQF5FB8ok2Tmjpzk6MztDMfYUEPGHfM" ], "script": "base64:BgIoCAISBwoFAQEBERgSBwoFAQgBCAESBwoFARIREQgSAwoBARIAEgASABkACE1pbmVyRmVlAAUAEVBheW91dEVtcHR5U3RhdHVzAAAAFVBheW91dEluaXRpYXRlZFN0YXR1cwABABVQYXlvdXRDb21wbGV0ZWRTdGF0dXMAAgASQmxvY2tzQmF0Y2hNYXhTaXplAAoAFlJlY2lwaWVudHNCYXRjaE1heFNpemUAZAAGSGVpZ2h0BQZoZWlnaHQAB0NoYWluSWQAVwAFQXJyMTAJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJBQNuaWwADUNhbGxlckFkZHJlc3MJAQdBZGRyZXNzAQEaAVeRb/9MO+Y2oXlOclma/+zWZ/8p9xI+BWcAFldhdmVzRGFvRmFjdG9yeUFkZHJlc3MJAQdBZGRyZXNzAQEaAVe1uWNW+XgkQF1z4GTqhH6ffsW4z6s/7OoAD1NldHRpbmdzQWRkcmVzcwkBB0FkZHJlc3MBARoBV5SInsY9MNwVf44xErG3rzop4KWD6zFYHAAXUHV6emxlQWdncmVnYXRvckFkZHJlc3MJAQdBZGRyZXNzAQEaAVedDKrGE1GpbsuA92N9wWR44u9yTagMutMAEU1haW50YWluZXJBZGRyZXNzCQEHQWRkcmVzcwEBGgFX3GhhfGXViVO9QBvk9y3fJdl+RLjStgT4ABFQdXp6bGVUZWFtQWRkcmVzcwkBB0FkZHJlc3MBARoBV5nuQ1M10C8v8E1ER39n72R9o33ljxcGWQAHV2F2ZXNJZAIFV0FWRVMADUxhc3RQYXlvdXRLZXkCCmxhc3RQYXlvdXQAE01hc3NUcmFuc2ZlckZlZXNLZXkCEG1hc3NUcmFuc2ZlckZlZXMBEW1ha2VQYXlvdXREYXRhS2V5AQhwYXlvdXRJZAkArAICAgtwYXlvdXREYXRhXwkApAMBBQhwYXlvdXRJZAETbWFrZVBheW91dFN0YXR1c0tleQEIcGF5b3V0SWQJAKwCAgINcGF5b3V0U3RhdHVzXwkApAMBBQhwYXlvdXRJZAEebWFrZVBheW91dEFkZGl0aW9uYWxSZXdhcmRzS2V5AQhwYXlvdXRJZAkArAICAhhwYXlvdXRBZGRpdGlvbmFsUmV3YXJkc18JAKQDAQUIcGF5b3V0SWQBDWdldExhc3RQYXlvdXQACQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1MYXN0UGF5b3V0S2V5AQ1nZXRQYXlvdXREYXRhAQhwYXlvdXRJZAQMcGF5b3V0U3RyaW5nCQERQGV4dHJOYXRpdmUoMTA1OCkBCQERbWFrZVBheW91dERhdGFLZXkBBQhwYXlvdXRJZAQOcGF5b3V0RGF0YUxpc3QJALUJAgUMcGF5b3V0U3RyaW5nAgFfBAtzdGFydEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDnBheW91dERhdGFMaXN0AAAECWVuZEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDnBheW91dERhdGFMaXN0AAEJAJQKAgULc3RhcnRIZWlnaHQFCWVuZEhlaWdodAEPZ2V0UGF5b3V0U3RhdHVzAQhwYXlvdXRJZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETbWFrZVBheW91dFN0YXR1c0tleQEFCHBheW91dElkBRFQYXlvdXRFbXB0eVN0YXR1cwEaZ2V0UGF5b3V0QWRkaXRpb25hbFJld2FyZHMBCHBheW91dElkCQELdmFsdWVPckVsc2UCCQCfCAEJAR5tYWtlUGF5b3V0QWRkaXRpb25hbFJld2FyZHNLZXkBBQhwYXlvdXRJZAAABwFpAQ5pbml0aWF0ZVBheW91dAUIcGF5b3V0SWQLc3RhcnRIZWlnaHQJZW5kSGVpZ2h0B2Ftb3VudHMGYXNzZXRzAwkBAiE9AggFAWkGY2FsbGVyBQ1DYWxsZXJBZGRyZXNzCQACAQINQWNjZXNzIGRlbmllZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECF1BheW1lbnRzIGFyZSBwcm9oaWJpdGVkBApsYXN0UGF5b3V0CQENZ2V0TGFzdFBheW91dAADCQECIT0CBQhwYXlvdXRJZAkAZAIFCmxhc3RQYXlvdXQAAQkAAgEJAKwCAgkArAICCQCsAgICEFdyb25nIHBheW91dElkOiAJAKQDAQUIcGF5b3V0SWQCDSwgc2hvdWxkIGJlOiAJAKQDAQkAZAIFCmxhc3RQYXlvdXQAAQQQbGFzdFBheW91dFN0YXR1cwkBD2dldFBheW91dFN0YXR1cwEFCmxhc3RQYXlvdXQDCQECIT0CBRBsYXN0UGF5b3V0U3RhdHVzBRVQYXlvdXRDb21wbGV0ZWRTdGF0dXMJAAIBCQCsAgIJAKwCAgINTGFzdCBwYXlvdXQ6IAkApAMBBQpsYXN0UGF5b3V0AhIgd2FzIG5vdCBjb21wbGV0ZWQECyR0MDI0NDYyNTEwCQENZ2V0UGF5b3V0RGF0YQEFCmxhc3RQYXlvdXQED2xhc3RTdGFydEhlaWdodAgFCyR0MDI0NDYyNTEwAl8xBA1sYXN0RW5kSGVpZ2h0CAULJHQwMjQ0NjI1MTACXzIDCQECIT0CBQtzdGFydEhlaWdodAkAZAIFDWxhc3RFbmRIZWlnaHQAAQkAAgEJAKwCAgkArAICCQCsAgICE1dyb25nIHN0YXJ0SGVpZ2h0OiAJAKQDAQULc3RhcnRIZWlnaHQCDSwgc2hvdWxkIGJlOiAJAKQDAQkAZAIFDWxhc3RFbmRIZWlnaHQAAQMJAGYCBQtzdGFydEhlaWdodAUJZW5kSGVpZ2h0CQACAQkArAICCQCsAgIJAKwCAgILZW5kSGVpZ2h0OiAJAKQDAQUJZW5kSGVpZ2h0AhggbGVzcyB0aGFuIHN0YXJ0SGVpZ2h0OiAJAKQDAQULc3RhcnRIZWlnaHQEDmlucHV0c1F1YW50aXR5CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9TZXR0aW5nc0FkZHJlc3MCDmlucHV0c1F1YW50aXR5BAthbW91bnRzU2l6ZQkAkAMBBQdhbW91bnRzBAphc3NldHNTaXplCQCQAwEFBmFzc2V0cwMDCQECIT0CBQthbW91bnRzU2l6ZQUKYXNzZXRzU2l6ZQYJAQIhPQIFC2Ftb3VudHNTaXplBQ5pbnB1dHNRdWFudGl0eQkAAgECH1dyb25nIHNpemUgb2YgYW1vdW50cyBvciBhc3NldHMEGmF2YWlsYWJsZVdhdmVzRGFvTHBUb0NsYWltCQELdmFsdWVPckVsc2UCCQCaCAIFFldhdmVzRGFvRmFjdG9yeUFkZHJlc3MJAKwCAgIRJXMlc19fYXZhaWxhYmxlX18JAKUIAQUEdGhpcwAABBp3YXZlc0Rhb05leHRCbG9ja1RvUHJvY2VzcwkBEUBleHRyTmF0aXZlKDEwNTApAgUWV2F2ZXNEYW9GYWN0b3J5QWRkcmVzcwIWJXNfX25leHRCbG9ja1RvUHJvY2VzcwQNd2F2ZXNEbHBDbGFpbQMDCQBmAgUaYXZhaWxhYmxlV2F2ZXNEYW9McFRvQ2xhaW0AAAkAZwIJAGQCBRp3YXZlc0Rhb05leHRCbG9ja1RvUHJvY2VzcwUSQmxvY2tzQmF0Y2hNYXhTaXplBQZIZWlnaHQHCQD8BwQFFldhdmVzRGFvRmFjdG9yeUFkZHJlc3MCB2NsYWltTFAFA25pbAUDbmlsBQR1bml0AwkAAAIFDXdhdmVzRGxwQ2xhaW0FDXdhdmVzRGxwQ2xhaW0EGGN1cnJlbnRBZGRpdGlvbmFsUmV3YXJkcwkBGmdldFBheW91dEFkZGl0aW9uYWxSZXdhcmRzAQUIcGF5b3V0SWQKAQphc3NldHNGb2xkAgVhY2N1bQVpbmRleAMJAGcCBQVpbmRleAUKYXNzZXRzU2l6ZQUFYWNjdW0ECGFzc2V0U3RyCQCRAwIFBmFzc2V0cwUFaW5kZXgDCQAAAgkAmggCBQ9TZXR0aW5nc0FkZHJlc3MJAKwCAgIQaW5wdXRBc3NldEluZGV4XwUIYXNzZXRTdHIFBHVuaXQJAAIBCQCsAgICD1Vua25vd24gaW5wdXQ6IAUIYXNzZXRTdHIECyR0MDM5MTI0MDkxAwkAAAIFCGFzc2V0U3RyBQdXYXZlc0lkCQCUCgIFBHVuaXQJAGQCCQCRAwIFB2Ftb3VudHMFBWluZGV4BRhjdXJyZW50QWRkaXRpb25hbFJld2FyZHMJAJQKAgkA2QQBBQhhc3NldFN0cgkAkQMCBQdhbW91bnRzBQVpbmRleAQFYXNzZXQIBQskdDAzOTEyNDA5MQJfMQQGYW1vdW50CAULJHQwMzkxMjQwOTECXzIDCQBmAgAABQZhbW91bnQJAAIBCQCsAgIJAKwCAgIUV3JvbmcgYXNzZXQgYW1vdW50OiAJAKQDAQUGYW1vdW50AhwsIHNob3VsZCBiZSBwb3NpdGl2ZSBvciB6ZXJvBAhtaW5lckZlZQkAawMFBmFtb3VudAUITWluZXJGZWUAZAQNbWFpbnRhaW5lckZlZQkAaQIFCG1pbmVyRmVlAAIEDXB1enpsZVRlYW1GZWUJAGUCBQhtaW5lckZlZQUNbWFpbnRhaW5lckZlZQQNbGVzc29yc0Ftb3VudAkAZQIJAGUCBQZhbW91bnQFDW1haW50YWluZXJGZWUFDXB1enpsZVRlYW1GZWUJAJQKAgkAzQgCCQDNCAIIBQVhY2N1bQJfMQkBDlNjcmlwdFRyYW5zZmVyAwURTWFpbnRhaW5lckFkZHJlc3MFDW1haW50YWluZXJGZWUFBWFzc2V0CQEOU2NyaXB0VHJhbnNmZXIDBRFQdXp6bGVUZWFtQWRkcmVzcwUNcHV6emxlVGVhbUZlZQUFYXNzZXQJAM0IAggFBWFjY3VtAl8yCQCkAwEFDWxlc3NvcnNBbW91bnQECyR0MDQ2NjM0NzMwCgACJGwFBUFycjEwCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKYXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQJdHJhbnNmZXJzCAULJHQwNDY2MzQ3MzACXzEECmFtb3VudEtleXMIBQskdDA0NjYzNDczMAJfMgQNbmV3UGF5b3V0RGF0YQkAuQkCCQDOCAIJAMwIAgkApAMBBQtzdGFydEhlaWdodAkAzAgCCQCkAwEFCWVuZEhlaWdodAUDbmlsBQphbW91bnRLZXlzAgFfCQDOCAIFCXRyYW5zZmVycwkAzAgCCQEMSW50ZWdlckVudHJ5AgUNTGFzdFBheW91dEtleQUIcGF5b3V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEW1ha2VQYXlvdXREYXRhS2V5AQUIcGF5b3V0SWQFDW5ld1BheW91dERhdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJARNtYWtlUGF5b3V0U3RhdHVzS2V5AQUIcGF5b3V0SWQFFVBheW91dEluaXRpYXRlZFN0YXR1cwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHN3YXAFCHBheW91dElkCHN3YXBGcm9tCGFtb3VudEluBXJvdXRlDG1pblRvUmVjZWl2ZQMJAQIhPQIIBQFpBmNhbGxlcgUNQ2FsbGVyQWRkcmVzcwkAAgECDUFjY2VzcyBkZW5pZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhdQYXltZW50cyBhcmUgcHJvaGliaXRlZAQKbGFzdFBheW91dAkBDWdldExhc3RQYXlvdXQAAwkBAiE9AgUKbGFzdFBheW91dAUIcGF5b3V0SWQJAAIBCQCsAgIJAKwCAgkArAICAhBXcm9uZyBwYXlvdXRJZDogCQCkAwEFCHBheW91dElkAg0sIHNob3VsZCBiZTogCQCkAwEFCmxhc3RQYXlvdXQEDHBheW91dFN0YXR1cwkBD2dldFBheW91dFN0YXR1cwEFCHBheW91dElkAwkBAiE9AgUMcGF5b3V0U3RhdHVzBRVQYXlvdXRJbml0aWF0ZWRTdGF0dXMJAAIBCQCsAgIJAKwCAgIVV3JvbmcgcGF5b3V0IHN0YXR1czogCQCkAwEFDHBheW91dFN0YXR1cwINLCBzaG91bGQgYmUgMQQLJHQwNTY4MTU5MzADCQAAAgUIc3dhcEZyb20FB1dhdmVzSWQJAJQKAggJAO8HAQUEdGhpcwlhdmFpbGFibGUFBHVuaXQEB2Fzc2V0SWQJANkEAQUIc3dhcEZyb20JAJQKAgkA8AcCBQR0aGlzBQdhc3NldElkBQdhc3NldElkBBNiYWxhbmNlSW5CZWZvcmVTd2FwCAULJHQwNTY4MTU5MzACXzEECnN3YXBGcm9tSWQIBQskdDA1NjgxNTkzMAJfMgQKc3dhcEludm9rZQkA/AcEBRdQdXp6bGVBZ2dyZWdhdG9yQWRkcmVzcwIQc3dhcFdpdGhSZWZlcnJhbAkAzAgCBQVyb3V0ZQkAzAgCBQxtaW5Ub1JlY2VpdmUJAMwIAgIKcHV6emxlbm9kZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpzd2FwRnJvbUlkBQhhbW91bnRJbgUDbmlsAwkAAAIFCnN3YXBJbnZva2UFCnN3YXBJbnZva2UEEmJhbGFuY2VJbkFmdGVyU3dhcAMJAAACBQhzd2FwRnJvbQUHV2F2ZXNJZAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkBBXZhbHVlAQUKc3dhcEZyb21JZAQGcmVmdW5kCQBlAgUSYmFsYW5jZUluQWZ0ZXJTd2FwCQBlAgUTYmFsYW5jZUluQmVmb3JlU3dhcAUIYW1vdW50SW4DCQBmAgUGcmVmdW5kAAoJAAIBCQCsAgICHFJvbGxiYWNrIGFnZ3JlZ2F0b3IgcmVmdW5kOiAJAKQDAQUGcmVmdW5kBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQZGlzdHJpYnV0ZVRva2VucwUIcGF5b3V0SWQKcmVjaXBpZW50cwdhbW91bnRzBmFzc2V0cwphdHRhY2htZW50AwkBAiE9AggFAWkGY2FsbGVyBQ1DYWxsZXJBZGRyZXNzCQACAQINQWNjZXNzIGRlbmllZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECF1BheW1lbnRzIGFyZSBwcm9oaWJpdGVkBApsYXN0UGF5b3V0CQENZ2V0TGFzdFBheW91dAADCQECIT0CBQpsYXN0UGF5b3V0BQhwYXlvdXRJZAkAAgEJAKwCAgkArAICCQCsAgICEFdyb25nIHBheW91dElkOiAJAKQDAQUIcGF5b3V0SWQCDSwgc2hvdWxkIGJlOiAJAKQDAQUKbGFzdFBheW91dAQMcGF5b3V0U3RhdHVzCQEPZ2V0UGF5b3V0U3RhdHVzAQUIcGF5b3V0SWQDCQECIT0CBQxwYXlvdXRTdGF0dXMFFVBheW91dEluaXRpYXRlZFN0YXR1cwkAAgEJAKwCAgkArAICAhVXcm9uZyBwYXlvdXQgc3RhdHVzOiAJAKQDAQUMcGF5b3V0U3RhdHVzAg0sIHNob3VsZCBiZSAxBA5yZWNpcGllbnRzU2l6ZQkAkAMBBQpyZWNpcGllbnRzBAthbW91bnRzU2l6ZQkAkAMBBQdhbW91bnRzBAphc3NldHNTaXplCQCQAwEFBmFzc2V0cwMDCQECIT0CBQ5yZWNpcGllbnRzU2l6ZQULYW1vdW50c1NpemUGCQECIT0CBQ5yZWNpcGllbnRzU2l6ZQUKYXNzZXRzU2l6ZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhdXcm9uZyByZWNpcGllbnRzIHNpemU6IAkApAMBBQ5yZWNpcGllbnRzU2l6ZQIQLCBhbW91bnRzIHNpemU6IAkApAMBBQthbW91bnRzU2l6ZQIPLCBhc3NldHMgc2l6ZTogCQCkAwEFCmFzc2V0c1NpemUDCQAAAgUOcmVjaXBpZW50c1NpemUAAAkAAgECI1JlY2lwaWVudHMgbGlzdCBzaG91bGQgbm90IGJlIGVtcHR5AwkAZgIFDnJlY2lwaWVudHNTaXplBRZSZWNpcGllbnRzQmF0Y2hNYXhTaXplCQACAQkArAICCQCsAgIJAKwCAgIbU2hvdWxkIGJlIG5vdCBncmVhdGVyIHRoYW4gCQCkAwEFFlJlY2lwaWVudHNCYXRjaE1heFNpemUCFiByZWNpcGllbnRzLCBjdXJyZW50OiAJAKQDAQUOcmVjaXBpZW50c1NpemUECW1hZ2ljQnl0ZQkAygECCQCaAwEAAQAHBAtjaGFpbklkQnl0ZQkAygECCQCaAwEFB0NoYWluSWQABwQNYWRkcmVzc1ByZWZpeAkAywECBQltYWdpY0J5dGUFC2NoYWluSWRCeXRlCgETc2NyaXB0VHJhbnNmZXJzRm9sZAIFYWNjdW0FaW5kZXgDCQBnAgUFaW5kZXgFDnJlY2lwaWVudHNTaXplBQVhY2N1bQQNcHVibGljS2V5SGFzaAkAkQMCBQpyZWNpcGllbnRzBQVpbmRleAQLYWRkcmVzc0RhdGEJAMsBAgUNYWRkcmVzc1ByZWZpeAUNcHVibGljS2V5SGFzaAQPYWRkcmVzc0NoZWNrc3VtCQDJAQIJAPUDAQkA9gMBBQthZGRyZXNzRGF0YQAEBAlyZWNpcGllbnQJAQdBZGRyZXNzAQkAywECBQthZGRyZXNzRGF0YQUPYWRkcmVzc0NoZWNrc3VtBAZhbW91bnQJAJEDAgUHYW1vdW50cwUFaW5kZXgECmFzc2V0SW5kZXgJAJEDAgUGYXNzZXRzBQVpbmRleAQHYXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTIpAgUPU2V0dGluZ3NBZGRyZXNzCQCsAgICCGFzc2V0SWRfCQCkAwEFCmFzc2V0SW5kZXgEBWFzc2V0AwkAAAIFB2Fzc2V0SWQBAAUEdW5pdAUHYXNzZXRJZAkAzQgCBQVhY2N1bQkBDlNjcmlwdFRyYW5zZmVyAwUJcmVjaXBpZW50BQZhbW91bnQFBWFzc2V0BAdpbmRleGVzCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwkAzAgCABAJAMwIAgARCQDMCAIAEgkAzAgCABMJAMwIAgAUCQDMCAIAFQkAzAgCABYJAMwIAgAXCQDMCAIAGAkAzAgCABkJAMwIAgAaCQDMCAIAGwkAzAgCABwJAMwIAgAdCQDMCAIAHgkAzAgCAB8JAMwIAgAgCQDMCAIAIQkAzAgCACIJAMwIAgAjCQDMCAIAJAkAzAgCACUJAMwIAgAmCQDMCAIAJwkAzAgCACgJAMwIAgApCQDMCAIAKgkAzAgCACsJAMwIAgAsCQDMCAIALQkAzAgCAC4JAMwIAgAvCQDMCAIAMAkAzAgCADEJAMwIAgAyCQDMCAIAMwkAzAgCADQJAMwIAgA1CQDMCAIANgkAzAgCADcJAMwIAgA4CQDMCAIAOQkAzAgCADoJAMwIAgA7CQDMCAIAPAkAzAgCAD0JAMwIAgA+CQDMCAIAPwkAzAgCAEAJAMwIAgBBCQDMCAIAQgkAzAgCAEMJAMwIAgBECQDMCAIARQkAzAgCAEYJAMwIAgBHCQDMCAIASAkAzAgCAEkJAMwIAgBKCQDMCAIASwkAzAgCAEwJAMwIAgBNCQDMCAIATgkAzAgCAE8JAMwIAgBQCQDMCAIAUQkAzAgCAFIJAMwIAgBTCQDMCAIAVAkAzAgCAFUJAMwIAgBWCQDMCAIAVwkAzAgCAFgJAMwIAgBZCQDMCAIAWgkAzAgCAFsJAMwIAgBcCQDMCAIAXQkAzAgCAF4JAMwIAgBfCQDMCAIAYAkAzAgCAGEJAMwIAgBiCQDMCAIAYwUDbmlsCgACJGwFB2luZGV4ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBE3NjcmlwdFRyYW5zZmVyc0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFUxpc3Qgc2l6ZSBleGNlZWRzIDEwMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAWkBDmZpbmFsaXplUGF5b3V0AQhwYXlvdXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUNQ2FsbGVyQWRkcmVzcwkAAgECDUFjY2VzcyBkZW5pZWQECmxhc3RQYXlvdXQJAQ1nZXRMYXN0UGF5b3V0AAMJAQIhPQIFCmxhc3RQYXlvdXQFCHBheW91dElkCQACAQkArAICCQCsAgIJAKwCAgIQV3JvbmcgcGF5b3V0SWQ6IAkApAMBBQhwYXlvdXRJZAINLCBzaG91bGQgYmU6IAkApAMBBQpsYXN0UGF5b3V0BAxwYXlvdXRTdGF0dXMJAQ9nZXRQYXlvdXRTdGF0dXMBBQpsYXN0UGF5b3V0AwkBAiE9AgUMcGF5b3V0U3RhdHVzBRVQYXlvdXRJbml0aWF0ZWRTdGF0dXMJAAIBCQCsAgIJAKwCAgIVV3JvbmcgcGF5b3V0IHN0YXR1czogCQCkAwEFDHBheW91dFN0YXR1cwIOLCBzaG91bGQgYmU6IDEJAMwIAgkBDEludGVnZXJFbnRyeQIJARNtYWtlUGF5b3V0U3RhdHVzS2V5AQUKbGFzdFBheW91dAUVUGF5b3V0Q29tcGxldGVkU3RhdHVzBQNuaWwBaQEUYWRkQWRkaXRpb25hbFJld2FyZHMAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQInQXQgbGVhc3Qgb25lIHBheW1lbnQgc2hvdWxkIGJlIGF0dGFjaGVkAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0CQACAQIaT25seSB3YXZlcyBjYW4gYmUgYXR0YWNoZWQECmxhc3RQYXlvdXQJAQ1nZXRMYXN0UGF5b3V0AAQQbGFzdFBheW91dFN0YXR1cwkBD2dldFBheW91dFN0YXR1cwEFCmxhc3RQYXlvdXQDCQECIT0CBRBsYXN0UGF5b3V0U3RhdHVzBRVQYXlvdXRDb21wbGV0ZWRTdGF0dXMJAAIBCQCsAgIJAKwCAgINTGFzdCBwYXlvdXQ6IAkApAMBBQpsYXN0UGF5b3V0AhIgd2FzIG5vdCBjb21wbGV0ZWQEDG5leHRQYXlvdXRJZAkAZAIFCmxhc3RQYXlvdXQAAQQYY3VycmVudEFkZGl0aW9uYWxSZXdhcmRzCQEaZ2V0UGF5b3V0QWRkaXRpb25hbFJld2FyZHMBBQxuZXh0UGF5b3V0SWQEFG5ld0FkZGl0aW9uYWxSZXdhcmRzCQBkAgUYY3VycmVudEFkZGl0aW9uYWxSZXdhcmRzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHm1ha2VQYXlvdXRBZGRpdGlvbmFsUmV3YXJkc0tleQEFDG5leHRQYXlvdXRJZAUUbmV3QWRkaXRpb25hbFJld2FyZHMFA25pbAFpARNhZGRNYXNzVHJhbnNmZXJGZWVzAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECJ0F0IGxlYXN0IG9uZSBwYXltZW50IHNob3VsZCBiZSBhdHRhY2hlZAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUEdW5pdAkAAgECGk9ubHkgd2F2ZXMgY2FuIGJlIGF0dGFjaGVkBBdjdXJyZW50TWFzc1RyYW5zZmVyRmVlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRNNYXNzVHJhbnNmZXJGZWVzS2V5AAAEE25ld01hc3NUcmFuc2ZlckZlZXMJAGQCBRdjdXJyZW50TWFzc1RyYW5zZmVyRmVlcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE01hc3NUcmFuc2ZlckZlZXNLZXkFE25ld01hc3NUcmFuc2ZlckZlZXMFA25pbAFpARh3aXRoZHJhd01hc3NUcmFuc2ZlckZlZXMAAwkBAiE9AggFAWkGY2FsbGVyBRFNYWludGFpbmVyQWRkcmVzcwkAAgECDUFjY2VzcyBkZW5pZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhdQYXltZW50cyBhcmUgcHJvaGliaXRlZAQXY3VycmVudE1hc3NUcmFuc2ZlckZlZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUTTWFzc1RyYW5zZmVyRmVlc0tleQAAAwkAAAIFF2N1cnJlbnRNYXNzVHJhbnNmZXJGZWVzAAAJAAIBAhNOb3RoaW5nIHRvIHdpdGhkcmF3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNNYXNzVHJhbnNmZXJGZWVzS2V5AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwURTWFpbnRhaW5lckFkZHJlc3MFF2N1cnJlbnRNYXNzVHJhbnNmZXJGZWVzBQR1bml0BQNuaWwBAnR4AQZ2ZXJpZnkABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdNYXNzVHJhbnNmZXJUcmFuc2FjdGlvbgQGbWFzc1R4BQckbWF0Y2gwCQDIEwMIBQZtYXNzVHgJYm9keUJ5dGVzCQCRAwIIBQZtYXNzVHgGcHJvb2ZzAAABIBf5r1FS82Z+mjmsTfGderqq/fweMToIpjHdE68W448DCQDIEwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAAASA2GsDjKZgTxa/YnKuG/MKmgMlHa5/5oYxSDcNpEI/KGI7rf/g=", "chainId": 87, "height": 4131176, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G6fuQQ9RF373z6SFWSmo1NFPnhkrh6e3j1VPvsDNYw3x Next: 4afX7ozzxNVQ3MTmdbQsUyoj5x7QcDtuy8srMw8yo3MK Diff:
OldNewDifferences
1717
1818 let ChainId = 87
1919
20-let WavesDlpId = base58'HYogWffUjS8Uw4bYA1Dn3qrGmJerMqkf139aJcHhk8yq'
20+let Arr10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2121
2222 let CallerAddress = Address(base58'3PFBtsmUJSVWHUaoYMDgvLygcmczJzYQBEe')
2323
2424 let WavesDaoFactoryAddress = Address(base58'3PJVm7xLPabmYohbnvdgGDYHMwnZxF2x18m')
2525
26-let SettingsAddress = Address(base58'3P7Jqt9meoym7YhUTEXe3nRYXVe8kuCuMSr')
26+let SettingsAddress = Address(base58'3PFUGQBAF7w9rYLvLyNZzRSq1x6stxsmV1D')
2727
2828 let PuzzleAggregatorAddress = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
2929
5454 let payoutDataList = split(payoutString, "_")
5555 let startHeight = parseIntValue(payoutDataList[0])
5656 let endHeight = parseIntValue(payoutDataList[1])
57- let wavesAmount = parseIntValue(payoutDataList[2])
58- let wavesDaoLpAmount = parseIntValue(payoutDataList[3])
59- $Tuple4(startHeight, endHeight, wavesAmount, wavesDaoLpAmount)
57+ $Tuple2(startHeight, endHeight)
6058 }
6159
6260
6765
6866
6967 @Callable(i)
70-func initiatePayout (payoutId,startHeight,endHeight,wavesAmount,wavesDaoLpAmount) = if ((i.caller != CallerAddress))
68+func initiatePayout (payoutId,startHeight,endHeight,amounts,assets) = if ((i.caller != CallerAddress))
7169 then throw("Access denied")
7270 else if ((size(i.payments) != 0))
7371 then throw("Payments are prohibited")
8078 if ((lastPayoutStatus != PayoutCompletedStatus))
8179 then throw((("Last payout: " + toString(lastPayout)) + " was not completed"))
8280 else {
83- let $t026202723 = getPayoutData(lastPayout)
84- let lastStartHeight = $t026202723._1
85- let lastEndHeight = $t026202723._2
86- let lastWavesAmount = $t026202723._3
87- let lastWavesDaoLpAmount = $t026202723._4
81+ let $t024462510 = getPayoutData(lastPayout)
82+ let lastStartHeight = $t024462510._1
83+ let lastEndHeight = $t024462510._2
8884 if ((startHeight != (lastEndHeight + 1)))
8985 then throw(((("Wrong startHeight: " + toString(startHeight)) + ", should be: ") + toString((lastEndHeight + 1))))
9086 else if ((startHeight > endHeight))
9187 then throw(((("endHeight: " + toString(endHeight)) + " less than startHeight: ") + toString(startHeight)))
92- else if ((0 >= wavesAmount))
93- then throw((("Wrong wavesAmount: " + toString(wavesAmount)) + ", should be positive"))
94- else if ((0 > wavesDaoLpAmount))
95- then throw((("Wrong wavesDaoLpAmount: " + toString(wavesDaoLpAmount)) + ", should be positive or zero"))
88+ else {
89+ let inputsQuantity = getIntegerValue(SettingsAddress, "inputsQuantity")
90+ let amountsSize = size(amounts)
91+ let assetsSize = size(assets)
92+ if (if ((amountsSize != assetsSize))
93+ then true
94+ else (amountsSize != inputsQuantity))
95+ then throw("Wrong size of amounts or assets")
9696 else {
9797 let availableWavesDaoLpToClaim = valueOrElse(getInteger(WavesDaoFactoryAddress, ("%s%s__available__" + toString(this))), 0)
9898 let wavesDaoNextBlockToProcess = getIntegerValue(WavesDaoFactoryAddress, "%s__nextBlockToProcess")
104104 if ((wavesDlpClaim == wavesDlpClaim))
105105 then {
106106 let currentAdditionalRewards = getPayoutAdditionalRewards(payoutId)
107- let totalWavesAmount = (currentAdditionalRewards + wavesAmount)
108- let minerWavesFee = fraction(totalWavesAmount, MinerFee, 100)
109- let maintainerWavesFee = (minerWavesFee / 2)
110- let puzzleTeamWavesFee = (minerWavesFee - maintainerWavesFee)
111- let lessorsWavesAmount = ((totalWavesAmount - maintainerWavesFee) - puzzleTeamWavesFee)
112- let minerWavesDaoLpFee = fraction(wavesDaoLpAmount, MinerFee, 100)
113- let maintainerWavesDaoLpFee = (minerWavesDaoLpFee / 2)
114- let puzzleTeamWavesDaoLpFee = (minerWavesDaoLpFee - maintainerWavesDaoLpFee)
115- let lessorsWavesDaoLpAmount = ((wavesDaoLpAmount - maintainerWavesDaoLpFee) - puzzleTeamWavesDaoLpFee)
116- let newPayoutData = makeString([toString(startHeight), toString(endHeight), toString(lessorsWavesAmount), toString(lessorsWavesDaoLpAmount)], "_")
117-[ScriptTransfer(MaintainerAddress, maintainerWavesFee, unit), ScriptTransfer(MaintainerAddress, maintainerWavesDaoLpFee, WavesDlpId), ScriptTransfer(PuzzleTeamAddress, puzzleTeamWavesFee, unit), ScriptTransfer(PuzzleTeamAddress, puzzleTeamWavesDaoLpFee, WavesDlpId), IntegerEntry(LastPayoutKey, payoutId), StringEntry(makePayoutDataKey(payoutId), newPayoutData), IntegerEntry(makePayoutStatusKey(payoutId), PayoutInitiatedStatus)]
107+ func assetsFold (accum,index) = if ((index >= assetsSize))
108+ then accum
109+ else {
110+ let assetStr = assets[index]
111+ if ((getInteger(SettingsAddress, ("inputAssetIndex_" + assetStr)) == unit))
112+ then throw(("Unknown input: " + assetStr))
113+ else {
114+ let $t039124091 = if ((assetStr == WavesId))
115+ then $Tuple2(unit, (amounts[index] + currentAdditionalRewards))
116+ else $Tuple2(fromBase58String(assetStr), amounts[index])
117+ let asset = $t039124091._1
118+ let amount = $t039124091._2
119+ if ((0 > amount))
120+ then throw((("Wrong asset amount: " + toString(amount)) + ", should be positive or zero"))
121+ else {
122+ let minerFee = fraction(amount, MinerFee, 100)
123+ let maintainerFee = (minerFee / 2)
124+ let puzzleTeamFee = (minerFee - maintainerFee)
125+ let lessorsAmount = ((amount - maintainerFee) - puzzleTeamFee)
126+ $Tuple2(((accum._1 :+ ScriptTransfer(MaintainerAddress, maintainerFee, asset)) :+ ScriptTransfer(PuzzleTeamAddress, puzzleTeamFee, asset)), (accum._2 :+ toString(lessorsAmount)))
127+ }
128+ }
129+ }
130+
131+ let $t046634730 = {
132+ let $l = Arr10
133+ let $s = size($l)
134+ let $acc0 = $Tuple2(nil, nil)
135+ func $f0_1 ($a,$i) = if (($i >= $s))
136+ then $a
137+ else assetsFold($a, $l[$i])
138+
139+ func $f0_2 ($a,$i) = if (($i >= $s))
140+ then $a
141+ else throw("List size exceeds 10")
142+
143+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
144+ }
145+ let transfers = $t046634730._1
146+ let amountKeys = $t046634730._2
147+ let newPayoutData = makeString(([toString(startHeight), toString(endHeight)] ++ amountKeys), "_")
148+ (transfers ++ [IntegerEntry(LastPayoutKey, payoutId), StringEntry(makePayoutDataKey(payoutId), newPayoutData), IntegerEntry(makePayoutStatusKey(payoutId), PayoutInitiatedStatus)])
118149 }
119150 else throw("Strict value is not equal to itself.")
120151 }
152+ }
121153 }
122154 }
123155 }
138170 if ((payoutStatus != PayoutInitiatedStatus))
139171 then throw((("Wrong payout status: " + toString(payoutStatus)) + ", should be 1"))
140172 else {
141- let $t057636012 = if ((swapFrom == WavesId))
173+ let $t056815930 = if ((swapFrom == WavesId))
142174 then $Tuple2(wavesBalance(this).available, unit)
143175 else {
144176 let assetId = fromBase58String(swapFrom)
145177 $Tuple2(assetBalance(this, assetId), assetId)
146178 }
147- let balanceInBeforeSwap = $t057636012._1
148- let swapFromId = $t057636012._2
179+ let balanceInBeforeSwap = $t056815930._1
180+ let swapFromId = $t056815930._2
149181 let swapInvoke = invoke(PuzzleAggregatorAddress, "swapWithReferral", [route, minToReceive, "puzzlenode"], [AttachedPayment(swapFromId, amountIn)])
150182 if ((swapInvoke == swapInvoke))
151183 then {
232264 @Callable(i)
233265 func finalizePayout (payoutId) = if ((i.caller != CallerAddress))
234266 then throw("Access denied")
235- else if ((size(i.payments) != 1))
236- then throw("At least one payment should be attached")
237- else if ((i.payments[0].assetId != unit))
238- then throw("Only waves can be attached")
267+ else {
268+ let lastPayout = getLastPayout()
269+ if ((lastPayout != payoutId))
270+ then throw(((("Wrong payoutId: " + toString(payoutId)) + ", should be: ") + toString(lastPayout)))
239271 else {
240- let lastPayout = getLastPayout()
241- if ((lastPayout != payoutId))
242- then throw(((("Wrong payoutId: " + toString(payoutId)) + ", should be: ") + toString(lastPayout)))
243- else {
244- let payoutStatus = getPayoutStatus(lastPayout)
245- if ((payoutStatus != PayoutInitiatedStatus))
246- then throw((("Wrong payout status: " + toString(payoutStatus)) + ", should be: 1"))
247- else [IntegerEntry(makePayoutStatusKey(lastPayout), PayoutCompletedStatus)]
248- }
272+ let payoutStatus = getPayoutStatus(lastPayout)
273+ if ((payoutStatus != PayoutInitiatedStatus))
274+ then throw((("Wrong payout status: " + toString(payoutStatus)) + ", should be: 1"))
275+ else [IntegerEntry(makePayoutStatusKey(lastPayout), PayoutCompletedStatus)]
249276 }
277+ }
250278
251279
252280
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let MinerFee = 5
55
66 let PayoutEmptyStatus = 0
77
88 let PayoutInitiatedStatus = 1
99
1010 let PayoutCompletedStatus = 2
1111
1212 let BlocksBatchMaxSize = 10
1313
1414 let RecipientsBatchMaxSize = 100
1515
1616 let Height = height
1717
1818 let ChainId = 87
1919
20-let WavesDlpId = base58'HYogWffUjS8Uw4bYA1Dn3qrGmJerMqkf139aJcHhk8yq'
20+let Arr10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2121
2222 let CallerAddress = Address(base58'3PFBtsmUJSVWHUaoYMDgvLygcmczJzYQBEe')
2323
2424 let WavesDaoFactoryAddress = Address(base58'3PJVm7xLPabmYohbnvdgGDYHMwnZxF2x18m')
2525
26-let SettingsAddress = Address(base58'3P7Jqt9meoym7YhUTEXe3nRYXVe8kuCuMSr')
26+let SettingsAddress = Address(base58'3PFUGQBAF7w9rYLvLyNZzRSq1x6stxsmV1D')
2727
2828 let PuzzleAggregatorAddress = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
2929
3030 let MaintainerAddress = Address(base58'3PN2JRxJxjjZo1YJGyQrxdhoEbijc24BMY3')
3131
3232 let PuzzleTeamAddress = Address(base58'3PFxoYQ6ZFp8sLkrbeJEyaFFyKpHifV2jRS')
3333
3434 let WavesId = "WAVES"
3535
3636 let LastPayoutKey = "lastPayout"
3737
3838 let MassTransferFeesKey = "massTransferFees"
3939
4040 func makePayoutDataKey (payoutId) = ("payoutData_" + toString(payoutId))
4141
4242
4343 func makePayoutStatusKey (payoutId) = ("payoutStatus_" + toString(payoutId))
4444
4545
4646 func makePayoutAdditionalRewardsKey (payoutId) = ("payoutAdditionalRewards_" + toString(payoutId))
4747
4848
4949 func getLastPayout () = getIntegerValue(this, LastPayoutKey)
5050
5151
5252 func getPayoutData (payoutId) = {
5353 let payoutString = getStringValue(makePayoutDataKey(payoutId))
5454 let payoutDataList = split(payoutString, "_")
5555 let startHeight = parseIntValue(payoutDataList[0])
5656 let endHeight = parseIntValue(payoutDataList[1])
57- let wavesAmount = parseIntValue(payoutDataList[2])
58- let wavesDaoLpAmount = parseIntValue(payoutDataList[3])
59- $Tuple4(startHeight, endHeight, wavesAmount, wavesDaoLpAmount)
57+ $Tuple2(startHeight, endHeight)
6058 }
6159
6260
6361 func getPayoutStatus (payoutId) = valueOrElse(getInteger(makePayoutStatusKey(payoutId)), PayoutEmptyStatus)
6462
6563
6664 func getPayoutAdditionalRewards (payoutId) = valueOrElse(getInteger(makePayoutAdditionalRewardsKey(payoutId)), 0)
6765
6866
6967 @Callable(i)
70-func initiatePayout (payoutId,startHeight,endHeight,wavesAmount,wavesDaoLpAmount) = if ((i.caller != CallerAddress))
68+func initiatePayout (payoutId,startHeight,endHeight,amounts,assets) = if ((i.caller != CallerAddress))
7169 then throw("Access denied")
7270 else if ((size(i.payments) != 0))
7371 then throw("Payments are prohibited")
7472 else {
7573 let lastPayout = getLastPayout()
7674 if ((payoutId != (lastPayout + 1)))
7775 then throw(((("Wrong payoutId: " + toString(payoutId)) + ", should be: ") + toString((lastPayout + 1))))
7876 else {
7977 let lastPayoutStatus = getPayoutStatus(lastPayout)
8078 if ((lastPayoutStatus != PayoutCompletedStatus))
8179 then throw((("Last payout: " + toString(lastPayout)) + " was not completed"))
8280 else {
83- let $t026202723 = getPayoutData(lastPayout)
84- let lastStartHeight = $t026202723._1
85- let lastEndHeight = $t026202723._2
86- let lastWavesAmount = $t026202723._3
87- let lastWavesDaoLpAmount = $t026202723._4
81+ let $t024462510 = getPayoutData(lastPayout)
82+ let lastStartHeight = $t024462510._1
83+ let lastEndHeight = $t024462510._2
8884 if ((startHeight != (lastEndHeight + 1)))
8985 then throw(((("Wrong startHeight: " + toString(startHeight)) + ", should be: ") + toString((lastEndHeight + 1))))
9086 else if ((startHeight > endHeight))
9187 then throw(((("endHeight: " + toString(endHeight)) + " less than startHeight: ") + toString(startHeight)))
92- else if ((0 >= wavesAmount))
93- then throw((("Wrong wavesAmount: " + toString(wavesAmount)) + ", should be positive"))
94- else if ((0 > wavesDaoLpAmount))
95- then throw((("Wrong wavesDaoLpAmount: " + toString(wavesDaoLpAmount)) + ", should be positive or zero"))
88+ else {
89+ let inputsQuantity = getIntegerValue(SettingsAddress, "inputsQuantity")
90+ let amountsSize = size(amounts)
91+ let assetsSize = size(assets)
92+ if (if ((amountsSize != assetsSize))
93+ then true
94+ else (amountsSize != inputsQuantity))
95+ then throw("Wrong size of amounts or assets")
9696 else {
9797 let availableWavesDaoLpToClaim = valueOrElse(getInteger(WavesDaoFactoryAddress, ("%s%s__available__" + toString(this))), 0)
9898 let wavesDaoNextBlockToProcess = getIntegerValue(WavesDaoFactoryAddress, "%s__nextBlockToProcess")
9999 let wavesDlpClaim = if (if ((availableWavesDaoLpToClaim > 0))
100100 then ((wavesDaoNextBlockToProcess + BlocksBatchMaxSize) >= Height)
101101 else false)
102102 then invoke(WavesDaoFactoryAddress, "claimLP", nil, nil)
103103 else unit
104104 if ((wavesDlpClaim == wavesDlpClaim))
105105 then {
106106 let currentAdditionalRewards = getPayoutAdditionalRewards(payoutId)
107- let totalWavesAmount = (currentAdditionalRewards + wavesAmount)
108- let minerWavesFee = fraction(totalWavesAmount, MinerFee, 100)
109- let maintainerWavesFee = (minerWavesFee / 2)
110- let puzzleTeamWavesFee = (minerWavesFee - maintainerWavesFee)
111- let lessorsWavesAmount = ((totalWavesAmount - maintainerWavesFee) - puzzleTeamWavesFee)
112- let minerWavesDaoLpFee = fraction(wavesDaoLpAmount, MinerFee, 100)
113- let maintainerWavesDaoLpFee = (minerWavesDaoLpFee / 2)
114- let puzzleTeamWavesDaoLpFee = (minerWavesDaoLpFee - maintainerWavesDaoLpFee)
115- let lessorsWavesDaoLpAmount = ((wavesDaoLpAmount - maintainerWavesDaoLpFee) - puzzleTeamWavesDaoLpFee)
116- let newPayoutData = makeString([toString(startHeight), toString(endHeight), toString(lessorsWavesAmount), toString(lessorsWavesDaoLpAmount)], "_")
117-[ScriptTransfer(MaintainerAddress, maintainerWavesFee, unit), ScriptTransfer(MaintainerAddress, maintainerWavesDaoLpFee, WavesDlpId), ScriptTransfer(PuzzleTeamAddress, puzzleTeamWavesFee, unit), ScriptTransfer(PuzzleTeamAddress, puzzleTeamWavesDaoLpFee, WavesDlpId), IntegerEntry(LastPayoutKey, payoutId), StringEntry(makePayoutDataKey(payoutId), newPayoutData), IntegerEntry(makePayoutStatusKey(payoutId), PayoutInitiatedStatus)]
107+ func assetsFold (accum,index) = if ((index >= assetsSize))
108+ then accum
109+ else {
110+ let assetStr = assets[index]
111+ if ((getInteger(SettingsAddress, ("inputAssetIndex_" + assetStr)) == unit))
112+ then throw(("Unknown input: " + assetStr))
113+ else {
114+ let $t039124091 = if ((assetStr == WavesId))
115+ then $Tuple2(unit, (amounts[index] + currentAdditionalRewards))
116+ else $Tuple2(fromBase58String(assetStr), amounts[index])
117+ let asset = $t039124091._1
118+ let amount = $t039124091._2
119+ if ((0 > amount))
120+ then throw((("Wrong asset amount: " + toString(amount)) + ", should be positive or zero"))
121+ else {
122+ let minerFee = fraction(amount, MinerFee, 100)
123+ let maintainerFee = (minerFee / 2)
124+ let puzzleTeamFee = (minerFee - maintainerFee)
125+ let lessorsAmount = ((amount - maintainerFee) - puzzleTeamFee)
126+ $Tuple2(((accum._1 :+ ScriptTransfer(MaintainerAddress, maintainerFee, asset)) :+ ScriptTransfer(PuzzleTeamAddress, puzzleTeamFee, asset)), (accum._2 :+ toString(lessorsAmount)))
127+ }
128+ }
129+ }
130+
131+ let $t046634730 = {
132+ let $l = Arr10
133+ let $s = size($l)
134+ let $acc0 = $Tuple2(nil, nil)
135+ func $f0_1 ($a,$i) = if (($i >= $s))
136+ then $a
137+ else assetsFold($a, $l[$i])
138+
139+ func $f0_2 ($a,$i) = if (($i >= $s))
140+ then $a
141+ else throw("List size exceeds 10")
142+
143+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
144+ }
145+ let transfers = $t046634730._1
146+ let amountKeys = $t046634730._2
147+ let newPayoutData = makeString(([toString(startHeight), toString(endHeight)] ++ amountKeys), "_")
148+ (transfers ++ [IntegerEntry(LastPayoutKey, payoutId), StringEntry(makePayoutDataKey(payoutId), newPayoutData), IntegerEntry(makePayoutStatusKey(payoutId), PayoutInitiatedStatus)])
118149 }
119150 else throw("Strict value is not equal to itself.")
120151 }
152+ }
121153 }
122154 }
123155 }
124156
125157
126158
127159 @Callable(i)
128160 func swap (payoutId,swapFrom,amountIn,route,minToReceive) = if ((i.caller != CallerAddress))
129161 then throw("Access denied")
130162 else if ((size(i.payments) != 0))
131163 then throw("Payments are prohibited")
132164 else {
133165 let lastPayout = getLastPayout()
134166 if ((lastPayout != payoutId))
135167 then throw(((("Wrong payoutId: " + toString(payoutId)) + ", should be: ") + toString(lastPayout)))
136168 else {
137169 let payoutStatus = getPayoutStatus(payoutId)
138170 if ((payoutStatus != PayoutInitiatedStatus))
139171 then throw((("Wrong payout status: " + toString(payoutStatus)) + ", should be 1"))
140172 else {
141- let $t057636012 = if ((swapFrom == WavesId))
173+ let $t056815930 = if ((swapFrom == WavesId))
142174 then $Tuple2(wavesBalance(this).available, unit)
143175 else {
144176 let assetId = fromBase58String(swapFrom)
145177 $Tuple2(assetBalance(this, assetId), assetId)
146178 }
147- let balanceInBeforeSwap = $t057636012._1
148- let swapFromId = $t057636012._2
179+ let balanceInBeforeSwap = $t056815930._1
180+ let swapFromId = $t056815930._2
149181 let swapInvoke = invoke(PuzzleAggregatorAddress, "swapWithReferral", [route, minToReceive, "puzzlenode"], [AttachedPayment(swapFromId, amountIn)])
150182 if ((swapInvoke == swapInvoke))
151183 then {
152184 let balanceInAfterSwap = if ((swapFrom == WavesId))
153185 then wavesBalance(this).available
154186 else assetBalance(this, value(swapFromId))
155187 let refund = (balanceInAfterSwap - (balanceInBeforeSwap - amountIn))
156188 if ((refund > 10))
157189 then throw(("Rollback aggregator refund: " + toString(refund)))
158190 else nil
159191 }
160192 else throw("Strict value is not equal to itself.")
161193 }
162194 }
163195 }
164196
165197
166198
167199 @Callable(i)
168200 func distributeTokens (payoutId,recipients,amounts,assets,attachment) = if ((i.caller != CallerAddress))
169201 then throw("Access denied")
170202 else if ((size(i.payments) != 0))
171203 then throw("Payments are prohibited")
172204 else {
173205 let lastPayout = getLastPayout()
174206 if ((lastPayout != payoutId))
175207 then throw(((("Wrong payoutId: " + toString(payoutId)) + ", should be: ") + toString(lastPayout)))
176208 else {
177209 let payoutStatus = getPayoutStatus(payoutId)
178210 if ((payoutStatus != PayoutInitiatedStatus))
179211 then throw((("Wrong payout status: " + toString(payoutStatus)) + ", should be 1"))
180212 else {
181213 let recipientsSize = size(recipients)
182214 let amountsSize = size(amounts)
183215 let assetsSize = size(assets)
184216 if (if ((recipientsSize != amountsSize))
185217 then true
186218 else (recipientsSize != assetsSize))
187219 then throw(((((("Wrong recipients size: " + toString(recipientsSize)) + ", amounts size: ") + toString(amountsSize)) + ", assets size: ") + toString(assetsSize)))
188220 else if ((recipientsSize == 0))
189221 then throw("Recipients list should not be empty")
190222 else if ((recipientsSize > RecipientsBatchMaxSize))
191223 then throw(((("Should be not greater than " + toString(RecipientsBatchMaxSize)) + " recipients, current: ") + toString(recipientsSize)))
192224 else {
193225 let magicByte = drop(toBytes(1), 7)
194226 let chainIdByte = drop(toBytes(ChainId), 7)
195227 let addressPrefix = (magicByte + chainIdByte)
196228 func scriptTransfersFold (accum,index) = if ((index >= recipientsSize))
197229 then accum
198230 else {
199231 let publicKeyHash = recipients[index]
200232 let addressData = (addressPrefix + publicKeyHash)
201233 let addressChecksum = take(keccak256(blake2b256(addressData)), 4)
202234 let recipient = Address((addressData + addressChecksum))
203235 let amount = amounts[index]
204236 let assetIndex = assets[index]
205237 let assetId = getBinaryValue(SettingsAddress, ("assetId_" + toString(assetIndex)))
206238 let asset = if ((assetId == base58''))
207239 then unit
208240 else assetId
209241 (accum :+ ScriptTransfer(recipient, amount, asset))
210242 }
211243
212244 let indexes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
213245 let $l = indexes
214246 let $s = size($l)
215247 let $acc0 = nil
216248 func $f0_1 ($a,$i) = if (($i >= $s))
217249 then $a
218250 else scriptTransfersFold($a, $l[$i])
219251
220252 func $f0_2 ($a,$i) = if (($i >= $s))
221253 then $a
222254 else throw("List size exceeds 100")
223255
224256 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
225257 }
226258 }
227259 }
228260 }
229261
230262
231263
232264 @Callable(i)
233265 func finalizePayout (payoutId) = if ((i.caller != CallerAddress))
234266 then throw("Access denied")
235- else if ((size(i.payments) != 1))
236- then throw("At least one payment should be attached")
237- else if ((i.payments[0].assetId != unit))
238- then throw("Only waves can be attached")
267+ else {
268+ let lastPayout = getLastPayout()
269+ if ((lastPayout != payoutId))
270+ then throw(((("Wrong payoutId: " + toString(payoutId)) + ", should be: ") + toString(lastPayout)))
239271 else {
240- let lastPayout = getLastPayout()
241- if ((lastPayout != payoutId))
242- then throw(((("Wrong payoutId: " + toString(payoutId)) + ", should be: ") + toString(lastPayout)))
243- else {
244- let payoutStatus = getPayoutStatus(lastPayout)
245- if ((payoutStatus != PayoutInitiatedStatus))
246- then throw((("Wrong payout status: " + toString(payoutStatus)) + ", should be: 1"))
247- else [IntegerEntry(makePayoutStatusKey(lastPayout), PayoutCompletedStatus)]
248- }
272+ let payoutStatus = getPayoutStatus(lastPayout)
273+ if ((payoutStatus != PayoutInitiatedStatus))
274+ then throw((("Wrong payout status: " + toString(payoutStatus)) + ", should be: 1"))
275+ else [IntegerEntry(makePayoutStatusKey(lastPayout), PayoutCompletedStatus)]
249276 }
277+ }
250278
251279
252280
253281 @Callable(i)
254282 func addAdditionalRewards () = if ((size(i.payments) != 1))
255283 then throw("At least one payment should be attached")
256284 else if ((i.payments[0].assetId != unit))
257285 then throw("Only waves can be attached")
258286 else {
259287 let lastPayout = getLastPayout()
260288 let lastPayoutStatus = getPayoutStatus(lastPayout)
261289 if ((lastPayoutStatus != PayoutCompletedStatus))
262290 then throw((("Last payout: " + toString(lastPayout)) + " was not completed"))
263291 else {
264292 let nextPayoutId = (lastPayout + 1)
265293 let currentAdditionalRewards = getPayoutAdditionalRewards(nextPayoutId)
266294 let newAdditionalRewards = (currentAdditionalRewards + i.payments[0].amount)
267295 [IntegerEntry(makePayoutAdditionalRewardsKey(nextPayoutId), newAdditionalRewards)]
268296 }
269297 }
270298
271299
272300
273301 @Callable(i)
274302 func addMassTransferFees () = if ((size(i.payments) != 1))
275303 then throw("At least one payment should be attached")
276304 else if ((i.payments[0].assetId != unit))
277305 then throw("Only waves can be attached")
278306 else {
279307 let currentMassTransferFees = valueOrElse(getInteger(MassTransferFeesKey), 0)
280308 let newMassTransferFees = (currentMassTransferFees + i.payments[0].amount)
281309 [IntegerEntry(MassTransferFeesKey, newMassTransferFees)]
282310 }
283311
284312
285313
286314 @Callable(i)
287315 func withdrawMassTransferFees () = if ((i.caller != MaintainerAddress))
288316 then throw("Access denied")
289317 else if ((size(i.payments) != 0))
290318 then throw("Payments are prohibited")
291319 else {
292320 let currentMassTransferFees = valueOrElse(getInteger(MassTransferFeesKey), 0)
293321 if ((currentMassTransferFees == 0))
294322 then throw("Nothing to withdraw")
295323 else [IntegerEntry(MassTransferFeesKey, 0), ScriptTransfer(MaintainerAddress, currentMassTransferFees, unit)]
296324 }
297325
298326
299327 @Verifier(tx)
300328 func verify () = match tx {
301329 case massTx: MassTransferTransaction =>
302330 sigVerify_128Kb(massTx.bodyBytes, massTx.proofs[0], base58'2cbCaPrCUFJSpoBfd1vzYB6ZVGRgjRky7u7bAqf2zjgE')
303331 case _ =>
304332 sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], base58'4eCgF1voXpsudbxN4FRQG2NCBP5QVeyJpNsfqMDQvPHh')
305333 }
306334

github/deemru/w8io/6500d08 
52.85 ms