tx · GjW8VTNFxiB5gtx45z6SXibfwwsNDBaZZWw5tHFeZ48G

3P7Q9V1kRHf5QLwnCRdPqedtLSbWjsbdyT6:  -0.01700000 Waves

2022.10.13 14:07 [3335945] smart account 3P7Q9V1kRHf5QLwnCRdPqedtLSbWjsbdyT6 > SELF 0.00000000 Waves

{ "type": 13, "id": "GjW8VTNFxiB5gtx45z6SXibfwwsNDBaZZWw5tHFeZ48G", "fee": 1700000, "feeAssetId": null, "timestamp": 1665659219264, "version": 2, "chainId": 87, "sender": "3P7Q9V1kRHf5QLwnCRdPqedtLSbWjsbdyT6", "senderPublicKey": "3hg7tWuvw2tmKXMDJ1KvavAQEqFDv3Er4Agkri6WbWmo", "proofs": [ "5qMGCgmLVZvbtr6cTSk3XEmLQTrp2fRGS2sbWU3iR7UeYJsDd7QGSWQMy9mkAiuFNFmRBHCExMLXxdvoYbgjdHtT" ], "script": "base64:BgI/CAISBAoCCAgSCAoGCAEBCAgIEgQKAggBEgQKAggIEgQKAggEEgQKAggEEgASABIDCgEIEgUKAwgICBIDCgEIMwAJdW5kZWZpbmVkAgl1bmRlZmluZWQACXNlcGFyYXRvcgIBOwAQY29uZmlnQWRkcmVzc0tleQIGY29uZmlnABNjb2xsZWN0b3JBZGRyZXNzS2V5AhFjb2xsZWN0b3JfYWRkcmVzcwARaGlzdG9yeUFkZHJlc3NLZXkCD2hpc3RvcnlfYWRkcmVzcwAJYWRtaW5zS2V5AgZhZG1pbnMADWNvbmZpZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFEGNvbmZpZ0FkZHJlc3NLZXkAEGNvbGxlY3RvckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDWNvbmZpZ0FkZHJlc3MFE2NvbGxlY3RvckFkZHJlc3NLZXkADmhpc3RvcnlBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1jb25maWdBZGRyZXNzBRFoaXN0b3J5QWRkcmVzc0tleQEHaXNBZG1pbgEGY2FsbGVyBAZhZG1Sb3cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwUJYWRtaW5zS2V5AgADAwkAAAIFBmNhbGxlcgUEdGhpcwYJAQhjb250YWlucwIFBmFkbVJvdwkApQgBBQZjYWxsZXIGBwENZ2V0Q2hlY2tlcktleQEHY2hlY2tlcgkArAICAghjaGVja2VyXwUHY2hlY2tlcgEJaXNDaGVja2VyAQdjaGVja2VyBAhpc0V4aXN0cwkBCWlzRGVmaW5lZAEJAJ0IAgUNY29uZmlnQWRkcmVzcwkBDWdldENoZWNrZXJLZXkBCQClCAEFB2NoZWNrZXIFCGlzRXhpc3RzAARVU0ROASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAJbWluQW1vdW50AICt4gQADGZlZU51bWVyYXRvcgAFAA5mZWVEZW5vbWluYXRvcgBkAA1maXJzdEV2ZW50S2V5AgtmaXJzdF9ldmVudAAMbGFzdEV2ZW50S2V5AgpsYXN0X2V2ZW50ABVmaXNydEZpbmlzaGVkRXZlbnRLZXkCFGZpcnN0X2ZpbmlzaGVkX2V2ZW50ABRsYXN0RmluaXNoZWRFdmVudEtleQITbGFzdF9maW5pc2hlZF9ldmVudAATZmlzcnRBY3RpdmVFdmVudEtleQISZmlyc3RfYWN0aXZlX2V2ZW50ABJsYXN0QWN0aXZlRXZlbnRLZXkCEWxhc3RfYWN0aXZlX2V2ZW50ARBnZXRTdGFydEJsb2NrS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9zdGFydF9ibG9jawEOZ2V0RW5kQmxvY2tLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIKX2VuZF9ibG9jawEOZ2V0RmluaXNoQXRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIQX2ZpbmlzaF9hdF9ibG9jawEXZ2V0QW5zd2VyRGFwcEFkZHJlc3NLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIMX2Fuc3dlcl9kYXBwARdnZXRBbnN3ZXJGdW5jQWRkcmVzc0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgxfYW5zd2VyX2Z1bmMBDGdldFJlc3VsdEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAgdfcmVzdWx0AQhnZXRJZEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAgNfaWQBDWdldEFuc3dlck5LZXkCB2V2ZW50SWQBbgkArAICCQCsAgIFB2V2ZW50SWQCCF9hbnN3ZXJfCQCkAwEFAW4BEmdldEFuc3dlcnNDb3VudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAg5fYW5zd2Vyc19jb3VudAEMZ2V0U3RhdHVzS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCB19zdGF0dXMBCmdldERlc2NLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIMX2Rlc2NyaXB0aW9uAQ9nZXRQcmV2RXZlbnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAILX3ByZXZfZXZlbnQBD2dldE5leHRFdmVudEtleQEHZXZlbnRJZAkArAICBQdldmVudElkAgtfbmV4dF9ldmVudAEUZ2V0Q2xhaW1BdmFpbGFibGVLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIQX2NsYWltX2F2YWlsYWJsZQEMZ2V0UGFyYW1zS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCB19wYXJhbXMBEWdldFRvdGFsQW1vdW50S2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDV90b3RhbF9hbW91bnQBGWdldENsYWltZWRXaW5uZXJzQ291bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIWX2NsYWltZWRfd2lubmVyc19jb3VudAENZ2V0QW1vdW50TktleQIHZXZlbnRJZAFuCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfCQCkAwEFAW4CB19hbW91bnQBDGdldENvdW50TktleQIHZXZlbnRJZAFuCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfCQCkAwEFAW4CBl9jb3VudAETZ2V0QW1vdW50QWRkcmVzc0tleQIHZXZlbnRJZAdhZGRyZXNzCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfBQdhZGRyZXNzAgdfYW1vdW50ARNnZXRDaG9pY2VBZGRyZXNzS2V5AgdldmVudElkB2FkZHJlc3MJAKwCAgkArAICCQCsAgIFB2V2ZW50SWQCAV8FB2FkZHJlc3MCB19jaG9pY2UBG2dldEFscmVhZHlDbGFpbWVkQWRkcmVzc0tleQIHZXZlbnRJZAdhZGRyZXNzCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfBQdhZGRyZXNzAhBfYWxyZWFkeV9jbGFpbWVkAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgQjZXJyAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXgFByRtYXRjaDAFAXgJAAIBAgQjZXJyAQlnZXRTdGF0dXMBB2V2ZW50SWQEBnN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEMZ2V0U3RhdHVzS2V5AQUHZXZlbnRJZAIBIwMDAwkAAAIFBnN0YXR1cwIIZmluaXNoZWQGCQAAAgUGc3RhdHVzAgEjBgkAAAIFBnN0YXR1cwIFZW5kZWQFBnN0YXR1cwQIZmluaXNoQXQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRGaW5pc2hBdEtleQEFB2V2ZW50SWQECnN0YXJ0QmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARBnZXRTdGFydEJsb2NrS2V5AQUHZXZlbnRJZAQIZW5kQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQDCQBmAgUKc3RhcnRCbG9jawUGaGVpZ2h0Aghhd2FpdGluZwMDCQBnAgUGaGVpZ2h0BQpzdGFydEJsb2NrCQBnAgUIZW5kQmxvY2sFBmhlaWdodAcCBmFjdGl2ZQMDCQBmAgUGaGVpZ2h0BQhlbmRCbG9jawkAZwIFCGZpbmlzaEF0BQZoZWlnaHQHAgxjb25maXJtYXRpb24DCQBmAgUGaGVpZ2h0BQhmaW5pc2hBdAIIZmluaXNoZWQJAAIBAg51bmtub3duIHN0YXR1cwEQaXNDbGFpbUF2YWlsYWJsZQEHZXZlbnRJZAQBcgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQEUZ2V0Q2xhaW1BdmFpbGFibGVLZXkBBQdldmVudElkBwMJAAACBQFyBgYJAAIBAhZjbGFpbSBpcyBub3QgYXZhaWxhYmxlAQ1yZWdpc3RlckV2ZW50CAR0eGlkBGRlc2MKc3RhcnRCbG9jawhlbmRCbG9jawhmaW5pc2hBdAtjaGVja2VyRGFwcAtjaGVja2VyRnVuYwZwYXJhbXMEB2V2ZW50SWQFBHR4aWQEDGFuc3dlclJlc3VsdAkBBWFzSW50AQkA/AcEBQR0aGlzAgVjaGVjawkAzAgCBQtjaGVja2VyRGFwcAkAzAgCBQtjaGVja2VyRnVuYwkAzAgCBQZwYXJhbXMFA25pbAUDbmlsAwkAAAIFDGFuc3dlclJlc3VsdAUMYW5zd2VyUmVzdWx0BAZpbnNlcnQJAPwHBAUEdGhpcwIMaW5zZXJ0VG9MaXN0CQDMCAIFB2V2ZW50SWQJAMwIAgYFA25pbAUDbmlsAwkAAAIFBmluc2VydAUGaW5zZXJ0BAZjb25jYXQJAPwHBAUEdGhpcwILY29uY2F0TGlzdHMFA25pbAUDbmlsAwkAAAIFBmNvbmNhdAUGY29uY2F0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQZ2V0U3RhcnRCbG9ja0tleQEFB2V2ZW50SWQFCnN0YXJ0QmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQFCGVuZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0RmluaXNoQXRLZXkBBQdldmVudElkBQhmaW5pc2hBdAkAzAgCCQELU3RyaW5nRW50cnkCCQEXZ2V0QW5zd2VyRGFwcEFkZHJlc3NLZXkBBQdldmVudElkBQtjaGVja2VyRGFwcAkAzAgCCQELU3RyaW5nRW50cnkCCQEXZ2V0QW5zd2VyRnVuY0FkZHJlc3NLZXkBBQdldmVudElkBQtjaGVja2VyRnVuYwkAzAgCCQELU3RyaW5nRW50cnkCCQEKZ2V0RGVzY0tleQEFB2V2ZW50SWQFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFN0YXR1c0tleQEFB2V2ZW50SWQCBmFjdGl2ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEIZ2V0SWRLZXkBBQdldmVudElkBQdldmVudElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1nZXRBbnN3ZXJOS2V5AgUHZXZlbnRJZAABAgJOTwkAzAgCCQELU3RyaW5nRW50cnkCCQENZ2V0QW5zd2VyTktleQIFB2V2ZW50SWQAAgIDWUVTCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0QW5zd2Vyc0NvdW50S2V5AQUHZXZlbnRJZAACCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMZ2V0UmVzdWx0S2V5AQUHZXZlbnRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxnZXRQYXJhbXNLZXkBBQdldmVudElkBQZwYXJhbXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEHZ2V0SnNvbgEHc3RhcnRJZAQHZXZlbnRJZAkBCGFzU3RyaW5nAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEIZ2V0SWRLZXkBBQdzdGFydElkCQCdCAIFBHRoaXMFDWZpcnN0RXZlbnRLZXkEC25leHRFdmVudElkCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEPZ2V0TmV4dEV2ZW50S2V5AQUHZXZlbnRJZAQKc3RhcnRCbG9jawkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBEGdldFN0YXJ0QmxvY2tLZXkBBQdldmVudElkBAhlbmRCbG9jawkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDmdldEVuZEJsb2NrS2V5AQUHZXZlbnRJZAQLZmluaXNoQmxvY2sJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ5nZXRGaW5pc2hBdEtleQEFB2V2ZW50SWQEC2NoZWNrZXJEYXBwCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEXZ2V0QW5zd2VyRGFwcEFkZHJlc3NLZXkBBQdldmVudElkBAtjaGVja2VyRnVuYwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkBF2dldEFuc3dlckZ1bmNBZGRyZXNzS2V5AQUHZXZlbnRJZAQEZGVzYwkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkBCmdldERlc2NLZXkBBQdldmVudElkBAZzdGF0dXMJAQlnZXRTdGF0dXMBBQdldmVudElkBAZyZXN1bHQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQxnZXRSZXN1bHRLZXkBBQdldmVudElkBAxhbnN3ZXJzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARJnZXRBbnN3ZXJzQ291bnRLZXkBBQdldmVudElkBAxhbnN3ZXJzQXJyYXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAVsDCQBnAgUMYW5zd2Vyc0NvdW50AAEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgACBnsidiI6IgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkBDWdldEFuc3dlck5LZXkCBQdldmVudElk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ZXY0Al8xBQl1bmRlZmluZWQJAKwCAgIBLAgFA2V2NQJfMgIAAwkBAiE9AggFA2V2NQJfMQUJdW5kZWZpbmVkCQCsAgICASwIBQNldjYCXzICAAMJAQIhPQIIBQNldjYCXzEFCXVuZGVmaW5lZAkArAICAgEsCAUDZXY3Al8yAgADCQECIT0CCAUDZXY3Al8xBQl1bmRlZmluZWQJAKwCAgIBLAgFA2V2OAJfMgIAAwkBAiE9AggFA2V2OAJfMQUJdW5kZWZpbmVkCQCsAgICASwIBQNldjkCXzICAAIBXQkAlAoCCAUDZXY5Al8xBQVhcnJheQsBaQEEaW5pdAIGY29uZmlnBGRlc2MDCQEBIQEJAQdpc0FkbWluAQgFAWkGY2FsbGVyCQACAQIRb25seSBhZG1pbiBjYW4gZG8ECGlzRXhpc3RzCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBRBjb25maWdBZGRyZXNzS2V5AwkBASEBBQhpc0V4aXN0cwQDaW52CQD8BwQFDWNvbmZpZ0FkZHJlc3MCCnNldEV2ZW50ZXIJAMwIAgkApQgBBQR0aGlzCQDMCAIFBGRlc2MFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CQDMCAIJAQtTdHJpbmdFbnRyeQIFEGNvbmZpZ0FkZHJlc3NLZXkFBmNvbmZpZwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIOYWxyZWFkeSBpbml0ZWQBaQERZnVsbFJlZ2lzdGVyRXZlbnQGBGRlc2MKc3RhcnRCbG9jawhkdXJhdGlvbgtjaGVja2VyRGFwcAtjaGVja2VyRnVuYwZwYXJhbXMEDW5ld1N0YXJ0QmxvY2sDCQAAAgUKc3RhcnRCbG9jawAABQZoZWlnaHQFCnN0YXJ0QmxvY2sECGVuZEJsb2NrCQBkAgUNbmV3U3RhcnRCbG9jawUIZHVyYXRpb24ECGZpbmlzaEF0CQBkAgUIZW5kQmxvY2sAoAsDCQEBIQEJAQdpc0FkbWluAQgFAWkGY2FsbGVyCQACAQIRb25seSBhZG1pbiBjYW4gZG8EBHR4aWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBDXJlZ2lzdGVyRXZlbnQIBQR0eGlkBQRkZXNjBQ1uZXdTdGFydEJsb2NrBQhlbmRCbG9jawUIZmluaXNoQXQFC2NoZWNrZXJEYXBwBQtjaGVja2VyRnVuYwUGcGFyYW1zAWkBBmNob2ljZQIHZXZlbnRJZAZjaG9pY2UEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAVjaGVjawkA/AcEBQR0aGlzAgtjaGVja1Jlc3VsdAkAzAgCBQdldmVudElkBQNuaWwFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEBnN0YXR1cwkBCWdldFN0YXR1cwEFB2V2ZW50SWQDCQAAAgUGc3RhdHVzAgZhY3RpdmUDAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUEVVNETgcEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDCQBmAgUJbWluQW1vdW50BQZhbW91bnQJAAIBAhthbW91bnQgaXMgbGVzcyB0aGFuIGFsbG93ZWQEDGFuc3dlcnNDb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBEmdldEFuc3dlcnNDb3VudEtleQEFB2V2ZW50SWQDAwkAAAIFBmNob2ljZQAABgkAZgIFBmNob2ljZQUMYW5zd2Vyc0NvdW50CQACAQIRY2hvaWNlIGlzIGludmFsaWQEDGN1cnJlbnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQERZ2V0VG90YWxBbW91bnRLZXkBBQdldmVudElkAAAEC2Nob2ljZVRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ1nZXRBbW91bnROS2V5AgUHZXZlbnRJZAUGY2hvaWNlAAAEC2Nob2ljZUNvdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQxnZXRDb3VudE5LZXkCBQdldmVudElkBQZjaG9pY2UAAAQNYWRkcmVzc0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQETZ2V0QW1vdW50QWRkcmVzc0tleQIFB2V2ZW50SWQFB2FkZHJlc3MAAAMJAQIhPQIFDWFkZHJlc3NBbW91bnQAAAkAAgECI2JldHRpbmcgZnJvbSB0aGlzIGFkZHJlc3MgaXMgZXhpc3RzBARzYXZlCQD8BwQFDmhpc3RvcnlBZGRyZXNzAg1zYXZlVG9IaXN0b3J5CQDMCAIFB2V2ZW50SWQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwDCQAAAgUEc2F2ZQUEc2F2ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWdldFRvdGFsQW1vdW50S2V5AQUHZXZlbnRJZAkAZAIFDGN1cnJlbnRUb3RhbAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENZ2V0QW1vdW50TktleQIFB2V2ZW50SWQFBmNob2ljZQkAZAIFC2Nob2ljZVRvdGFsBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxnZXRDb3VudE5LZXkCBQdldmVudElkBQZjaG9pY2UJAGQCBQtjaG9pY2VDb3VudAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETZ2V0Q2hvaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQFB2FkZHJlc3MFBmNob2ljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2dldEFtb3VudEFkZHJlc3NLZXkCBQdldmVudElkBQdhZGRyZXNzBQZhbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECC0JhZCBwYXltZW50CQACAQIPWW91IGNhbmB0IGRvIGl0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAgdldmVudElkCnN0ckFkZHJlc3MDCQEBIQEJARBpc0NsYWltQXZhaWxhYmxlAQUHZXZlbnRJZAkAAgECFmNsYWltIGlzIG5vdCBhdmFpbGFibGUEB2FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCnN0ckFkZHJlc3MEBnN0YXR1cwkBCWdldFN0YXR1cwEFB2V2ZW50SWQDCQAAAgUGc3RhdHVzAghmaW5pc2hlZAQLdG90YWxBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARFnZXRUb3RhbEFtb3VudEtleQEFB2V2ZW50SWQEDmFscmVhZHlDbGFpbWVkCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARtnZXRBbHJlYWR5Q2xhaW1lZEFkZHJlc3NLZXkCBQdldmVudElkCQClCAEFB2FkZHJlc3MHAwUOYWxyZWFkeUNsYWltZWQJAAIBAhZSZXdhcmQgYWxyZWFkeSBjbGFpbWVkBA1hZGRyZXNzQ2hvaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQETZ2V0Q2hvaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQJAKUIAQUHYWRkcmVzcwQGcmVzdWx0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEMZ2V0UmVzdWx0S2V5AQUHZXZlbnRJZAQLY2hvaWNlVG90YWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ1nZXRBbW91bnROS2V5AgUHZXZlbnRJZAUGcmVzdWx0BA1hZGRyZXNzQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQETZ2V0QW1vdW50QWRkcmVzc0tleQIFB2V2ZW50SWQJAKUIAQUHYWRkcmVzcwMJAAACBQ1hZGRyZXNzQ2hvaWNlBQZyZXN1bHQEDWFkZHJlc3NSZXdhcmQJAGsDBQt0b3RhbEFtb3VudAUNYWRkcmVzc0Ftb3VudAULY2hvaWNlVG90YWwEA2ZlZQkAawMFDWFkZHJlc3NSZXdhcmQFDGZlZU51bWVyYXRvcgUOZmVlRGVub21pbmF0b3IEDmNsYWltZWRXaW5uZXJzCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEZZ2V0Q2xhaW1lZFdpbm5lcnNDb3VudEtleQEFB2V2ZW50SWQAAAABBAtjaG9pY2VDb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDGdldENvdW50TktleQIFB2V2ZW50SWQFBnJlc3VsdAMJAAACBQ5jbGFpbWVkV2lubmVycwULY2hvaWNlQ291bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFN0YXR1c0tleQEFB2V2ZW50SWQCBWVuZGVkCQDMCAIJAQxCb29sZWFuRW50cnkCCQETZ2V0Q2hvaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQJAKUIAQUHYWRkcmVzcwYJAMwIAgkBDEludGVnZXJFbnRyeQIJARlnZXRDbGFpbWVkV2lubmVyc0NvdW50S2V5AQUHZXZlbnRJZAUOY2xhaW1lZFdpbm5lcnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUHYWRkcmVzcwkAZQIFDWFkZHJlc3NSZXdhcmQFA2ZlZQUEVVNETgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRBjb2xsZWN0b3JBZGRyZXNzBQNmZWUFBFVTRE4FA25pbAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBE2dldENob2ljZUFkZHJlc3NLZXkCBQdldmVudElkCQClCAEFB2FkZHJlc3MGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZZ2V0Q2xhaW1lZFdpbm5lcnNDb3VudEtleQEFB2V2ZW50SWQFDmNsYWltZWRXaW5uZXJzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFB2FkZHJlc3MFDWFkZHJlc3NSZXdhcmQFBFVTRE4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQY29sbGVjdG9yQWRkcmVzcwUDZmVlBQRVU0ROBQNuaWwJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwkAAgECD1lvdSBjYW5gdCBkbyBpdAFpAQ5kZWxldGVGcm9tTGlzdAIHZXZlbnRJZAhpc0FjdGl2ZQMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECEG9ubHkgbWFpbiBjYW4gZG8EB2xhc3RLZXkDBQhpc0FjdGl2ZQUSbGFzdEFjdGl2ZUV2ZW50S2V5BRRsYXN0RmluaXNoZWRFdmVudEtleQQIZmlyc3RLZXkDBQhpc0FjdGl2ZQUTZmlzcnRBY3RpdmVFdmVudEtleQUVZmlzcnRGaW5pc2hlZEV2ZW50S2V5BAlwcmV2RXZlbnQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ9nZXRQcmV2RXZlbnRLZXkBBQdldmVudElkBAluZXh0RXZlbnQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ9nZXROZXh0RXZlbnRLZXkBBQdldmVudElkAwMJAAACBQlwcmV2RXZlbnQFCXVuZGVmaW5lZAkAAAIFCW5leHRFdmVudAUJdW5kZWZpbmVkBwkAzAgCCQELU3RyaW5nRW50cnkCBQhmaXJzdEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2xhc3RLZXkFCXVuZGVmaW5lZAUDbmlsAwMJAQIhPQIFCXByZXZFdmVudAUJdW5kZWZpbmVkCQECIT0CBQluZXh0RXZlbnQFCXVuZGVmaW5lZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2dldFByZXZFdmVudEtleQEFCW5leHRFdmVudAUJcHJldkV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXROZXh0RXZlbnRLZXkBBQlwcmV2RXZlbnQFCW5leHRFdmVudAUDbmlsAwkBAiE9AgUJcHJldkV2ZW50BQl1bmRlZmluZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUHbGFzdEtleQUJcHJldkV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXROZXh0RXZlbnRLZXkBBQlwcmV2RXZlbnQFCXVuZGVmaW5lZAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGZpcnN0S2V5BQluZXh0RXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2dldFByZXZFdmVudEtleQEFCW5leHRFdmVudAUJdW5kZWZpbmVkBQNuaWwBaQEMaW5zZXJ0VG9MaXN0AgdldmVudElkCGlzQWN0aXZlAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIQb25seSBtYWluIGNhbiBkbwQHbGFzdEtleQMFCGlzQWN0aXZlBRJsYXN0QWN0aXZlRXZlbnRLZXkFFGxhc3RGaW5pc2hlZEV2ZW50S2V5BAhmaXJzdEtleQMFCGlzQWN0aXZlBRNmaXNydEFjdGl2ZUV2ZW50S2V5BRVmaXNydEZpbmlzaGVkRXZlbnRLZXkECmZpcnN0RXZlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUIZmlyc3RLZXkFCXVuZGVmaW5lZAQJbGFzdEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFB2xhc3RLZXkFCXVuZGVmaW5lZAQQbmV3TGFzdE9yUHJldktleQMJAAACBQlsYXN0RXZlbnQFCXVuZGVmaW5lZAUHbGFzdEtleQkBD2dldFByZXZFdmVudEtleQEFCmZpcnN0RXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgUIZmlyc3RLZXkFB2V2ZW50SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUQbmV3TGFzdE9yUHJldktleQUHZXZlbnRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0TmV4dEV2ZW50S2V5AQUHZXZlbnRJZAUKZmlyc3RFdmVudAUDbmlsAWkBC2NvbmNhdExpc3RzAAMJAQEhAQkBB2lzQWRtaW4BCAUBaQZjYWxsZXIJAAIBAhFvbmx5IGFkbWluIGNhbiBkbwQQZmlyc3RBY3RpdmVFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRNmaXNydEFjdGl2ZUV2ZW50S2V5BQl1bmRlZmluZWQED2xhc3RBY3RpdmVFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRJsYXN0QWN0aXZlRXZlbnRLZXkFCXVuZGVmaW5lZAQSZmlyc3RGaW5pc2hlZEV2ZW50CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFFWZpc3J0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBBFsYXN0RmluaXNoZWRFdmVudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRRsYXN0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkBApmaXJzdEV2ZW50AwkBAiE9AgUQZmlyc3RBY3RpdmVFdmVudAUJdW5kZWZpbmVkBRBmaXJzdEFjdGl2ZUV2ZW50BRJmaXJzdEZpbmlzaGVkRXZlbnQECWxhc3RFdmVudAMJAQIhPQIFEWxhc3RGaW5pc2hlZEV2ZW50BQl1bmRlZmluZWQFEWxhc3RGaW5pc2hlZEV2ZW50BQ9sYXN0QWN0aXZlRXZlbnQDAwkBAiE9AgUSZmlyc3RGaW5pc2hlZEV2ZW50BQl1bmRlZmluZWQJAQIhPQIFD2xhc3RBY3RpdmVFdmVudAUJdW5kZWZpbmVkBwkAzAgCCQELU3RyaW5nRW50cnkCBQ1maXJzdEV2ZW50S2V5BQpmaXJzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJbGFzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9nZXROZXh0RXZlbnRLZXkBBQ9sYXN0QWN0aXZlRXZlbnQFEmZpcnN0RmluaXNoZWRFdmVudAkAzAgCCQELU3RyaW5nRW50cnkCCQEPZ2V0UHJldkV2ZW50S2V5AQUSZmlyc3RGaW5pc2hlZEV2ZW50BQ9sYXN0QWN0aXZlRXZlbnQFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQ1maXJzdEV2ZW50S2V5BQpmaXJzdEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFDGxhc3RFdmVudEtleQUJbGFzdEV2ZW50BQNuaWwBaQEJcmVzZXRMaXN0AAMJAQEhAQkBB2lzQWRtaW4BCAUBaQZjYWxsZXIJAAIBAhFvbmx5IGFkbWluIGNhbiBkbwkAzAgCCQELU3RyaW5nRW50cnkCBQ1maXJzdEV2ZW50S2V5BQl1bmRlZmluZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUMbGFzdEV2ZW50S2V5BQl1bmRlZmluZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUTZmlzcnRBY3RpdmVFdmVudEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFEmxhc3RBY3RpdmVFdmVudEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFFWZpc3J0RmluaXNoZWRFdmVudEtleQUJdW5kZWZpbmVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGxhc3RGaW5pc2hlZEV2ZW50S2V5BQl1bmRlZmluZWQFA25pbAFpAQphbGxvd0NsYWltAQdldmVudElkAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvCQDMCAIJAQxCb29sZWFuRW50cnkCCQEUZ2V0Q2xhaW1BdmFpbGFibGVLZXkBBQdldmVudElkBgUDbmlsAWkBBWNoZWNrAwRkYXBwCGZ1bmN0aW9uBnBhcmFtcwMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECEG9ubHkgbWFpbiBjYW4gZG8DCQEBIQEJAQlpc0NoZWNrZXIBCAUBaQZjYWxsZXIJAAIBAg5pcyBub3QgY2hlY2tlcgQMYW5zd2VyUmVzdWx0CQEFYXNJbnQBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGRhcHAFCGZ1bmN0aW9uCQDMCAIFBnBhcmFtcwUDbmlsBQNuaWwJAJQKAgUDbmlsBQxhbnN3ZXJSZXN1bHQBaQELY2hlY2tSZXN1bHQBB2V2ZW50SWQEBnN0YXR1cwkBCWdldFN0YXR1cwEFB2V2ZW50SWQDAwkAAAIFBnN0YXR1cwIGYWN0aXZlBgkAAAIFBnN0YXR1cwIMY29uZmlybWF0aW9uBAtjaGVja2VyRGFwcAkAnQgCBQR0aGlzCQEXZ2V0QW5zd2VyRGFwcEFkZHJlc3NLZXkBBQdldmVudElkBAtjaGVja2VyRnVuYwkAnQgCBQR0aGlzCQEXZ2V0QW5zd2VyRnVuY0FkZHJlc3NLZXkBBQdldmVudElkBAZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDGdldFBhcmFtc0tleQEFB2V2ZW50SWQCAAQNY3VycmVudFJlc3VsdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDGdldFJlc3VsdEtleQEFB2V2ZW50SWQEDGFuc3dlclJlc3VsdAkBBWFzSW50AQkA/AcEBQR0aGlzAgVjaGVjawkAzAgCBQtjaGVja2VyRGFwcAkAzAgCBQtjaGVja2VyRnVuYwkAzAgCBQZwYXJhbXMFA25pbAUDbmlsAwkAAAIFDGFuc3dlclJlc3VsdAUMYW5zd2VyUmVzdWx0AwkBAiE9AgUMYW5zd2VyUmVzdWx0BQ1jdXJyZW50UmVzdWx0BAZkZWxldGUJAPwHBAUEdGhpcwIOZGVsZXRlRnJvbUxpc3QJAMwIAgUHZXZlbnRJZAkAzAgCBgUDbmlsBQNuaWwDCQAAAgUGZGVsZXRlBQZkZWxldGUEBmNvbmNhdAkA/AcEBQR0aGlzAgtjb25jYXRMaXN0cwUDbmlsBQNuaWwDCQAAAgUGY29uY2F0BQZjb25jYXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACCAUBaQZjYWxsZXIFBHRoaXMFA25pbAkBBXRocm93AAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECEEV2ZW50IG5vdCBhY3RpdmUAarzOcA==", "height": 3335945, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GM6JjdpY33ZAwWTuRSmgFNVg8nbGJeyq3nvt6pdHx2Ns Next: 9TpvVJc4frA63PnCcgp2n8kpg13L5YwBtxaRaUxsZ7LR Diff:
OldNewDifferences
5151 let lastEventKey = "last_event"
5252
5353 let fisrtFinishedEventKey = "first_finished_event"
54+
55+let lastFinishedEventKey = "last_finished_event"
56+
57+let fisrtActiveEventKey = "first_active_event"
58+
59+let lastActiveEventKey = "last_active_event"
5460
5561 func getStartBlockKey (eventId) = (eventId + "_start_block")
5662
173179
174180 func registerEvent (txid,desc,startBlock,endBlock,finishAt,checkerDapp,checkerFunc,params) = {
175181 let eventId = txid
176- let firstEvent = valueOrElse(getString(this, firstEventKey), undefined)
177- let lastEvent = valueOrElse(getString(this, lastEventKey), undefined)
178- let firstFinished = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
179- let newFirstEvent = eventId
180- if ((newFirstEvent == newFirstEvent))
182+ let answerResult = asInt(invoke(this, "check", [checkerDapp, checkerFunc, params], nil))
183+ if ((answerResult == answerResult))
181184 then {
182- let newLastOrPrevKey = if ((lastEvent == undefined))
183- then lastEventKey
184- else getPrevEventKey(firstEvent)
185- if ((newLastOrPrevKey == newLastOrPrevKey))
185+ let insert = invoke(this, "insertToList", [eventId, true], nil)
186+ if ((insert == insert))
186187 then {
187- let newFirstFinishedKey = if (if ((lastEvent == undefined))
188- then (firstFinished != undefined)
189- else false)
190- then getPrevEventKey(firstFinished)
191- else undefined
192- if ((newFirstFinishedKey == newFirstFinishedKey))
193- then {
194- let newFirstFinishedValue = if (if ((lastEvent == undefined))
195- then (firstFinished != undefined)
196- else false)
197- then eventId
198- else undefined
199- if ((newFirstFinishedValue == newFirstFinishedValue))
200- then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getAnswersCountKey(eventId), 2), IntegerEntry(getResultKey(eventId), 1), StringEntry(firstEventKey, newFirstEvent), StringEntry(newLastOrPrevKey, eventId), StringEntry(getNextEventKey(eventId), firstEvent), StringEntry(newFirstFinishedKey, newFirstFinishedValue), StringEntry(getParamsKey(eventId), params)]
201- else throw("Strict value is not equal to itself.")
202- }
188+ let concat = invoke(this, "concatLists", nil, nil)
189+ if ((concat == concat))
190+ then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getAnswersCountKey(eventId), 2), IntegerEntry(getResultKey(eventId), 1), StringEntry(getParamsKey(eventId), params)]
203191 else throw("Strict value is not equal to itself.")
204192 }
205193 else throw("Strict value is not equal to itself.")
416404
417405
418406 @Callable(i)
419-func changeList (eventId) = if ((this != i.caller))
407+func deleteFromList (eventId,isActive) = if ((this != i.caller))
420408 then throw("only main can do")
421409 else {
422- let prevEvent = valueOrElse(getString(this, getPrevEventKey(eventId)), undefined)
423- let nextEvent = valueOrElse(getString(this, getNextEventKey(eventId)), undefined)
410+ let lastKey = if (isActive)
411+ then lastActiveEventKey
412+ else lastFinishedEventKey
413+ let firstKey = if (isActive)
414+ then fisrtActiveEventKey
415+ else fisrtFinishedEventKey
416+ let prevEvent = getStringValue(this, getPrevEventKey(eventId))
417+ let nextEvent = getStringValue(this, getNextEventKey(eventId))
424418 if (if ((prevEvent == undefined))
425419 then (nextEvent == undefined)
426420 else false)
427- then [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined)]
421+ then [StringEntry(firstKey, undefined), StringEntry(lastKey, undefined)]
428422 else if (if ((prevEvent != undefined))
429423 then (nextEvent != undefined)
430424 else false)
431425 then [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent)]
432426 else if ((prevEvent != undefined))
433- then [StringEntry(lastEventKey, prevEvent), StringEntry(getNextEventKey(prevEvent), undefined)]
434- else [StringEntry(firstEventKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined)]
427+ then [StringEntry(lastKey, prevEvent), StringEntry(getNextEventKey(prevEvent), undefined)]
428+ else [StringEntry(firstKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined)]
435429 }
436430
437431
438432
439433 @Callable(i)
440-func replaceEventToEnd (eventId) = if ((this != i.caller))
434+func insertToList (eventId,isActive) = if ((this != i.caller))
441435 then throw("only main can do")
442436 else {
443- let lastEvent = getStringValue(this, lastEventKey)
444- if ((lastEvent == lastEvent))
445- then {
446- let prevEvent = valueOrElse(getString(this, getPrevEventKey(eventId)), undefined)
447- let nextEvent = valueOrElse(getString(this, getNextEventKey(eventId)), undefined)
448- let firstFinishedEvent = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
449- if ((firstFinishedEvent == firstFinishedEvent))
450- then if (if ((prevEvent == undefined))
451- then (nextEvent == undefined)
452- else false)
453- then [StringEntry(fisrtFinishedEventKey, eventId), StringEntry(lastEventKey, undefined)]
454- else if (if ((prevEvent != undefined))
455- then (nextEvent != undefined)
456- else false)
457- then if ((firstFinishedEvent == undefined))
458- then [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent), StringEntry(getPrevEventKey(eventId), lastEvent), StringEntry(getNextEventKey(lastEvent), eventId), StringEntry(getNextEventKey(eventId), undefined), StringEntry(fisrtFinishedEventKey, eventId)]
459- else [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent), StringEntry(getPrevEventKey(eventId), lastEvent), StringEntry(getNextEventKey(eventId), firstFinishedEvent), StringEntry(getPrevEventKey(firstFinishedEvent), eventId), StringEntry(fisrtFinishedEventKey, eventId)]
460- else if ((prevEvent != undefined))
461- then [StringEntry(fisrtFinishedEventKey, eventId), StringEntry(lastEventKey, prevEvent)]
462- else if ((firstFinishedEvent == undefined))
463- then [StringEntry(firstEventKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined), StringEntry(getNextEventKey(eventId), firstFinishedEvent), StringEntry(fisrtFinishedEventKey, eventId)]
464- else [StringEntry(firstEventKey, eventId), StringEntry(lastEventKey, undefined), StringEntry(fisrtFinishedEventKey, eventId)]
465- else throw("Strict value is not equal to itself.")
466- }
467- else throw("Strict value is not equal to itself.")
437+ let lastKey = if (isActive)
438+ then lastActiveEventKey
439+ else lastFinishedEventKey
440+ let firstKey = if (isActive)
441+ then fisrtActiveEventKey
442+ else fisrtFinishedEventKey
443+ let firstEvent = valueOrElse(getString(this, firstKey), undefined)
444+ let lastEvent = valueOrElse(getString(this, lastKey), undefined)
445+ let newLastOrPrevKey = if ((lastEvent == undefined))
446+ then lastKey
447+ else getPrevEventKey(firstEvent)
448+[StringEntry(firstKey, eventId), StringEntry(newLastOrPrevKey, eventId), StringEntry(getNextEventKey(eventId), firstEvent)]
449+ }
450+
451+
452+
453+@Callable(i)
454+func concatLists () = if (!(isAdmin(i.caller)))
455+ then throw("only admin can do")
456+ else {
457+ let firstActiveEvent = valueOrElse(getString(this, fisrtActiveEventKey), undefined)
458+ let lastActiveEvent = valueOrElse(getString(this, lastActiveEventKey), undefined)
459+ let firstFinishedEvent = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
460+ let lastFinishedEvent = valueOrElse(getString(this, lastFinishedEventKey), undefined)
461+ let firstEvent = if ((firstActiveEvent != undefined))
462+ then firstActiveEvent
463+ else firstFinishedEvent
464+ let lastEvent = if ((lastFinishedEvent != undefined))
465+ then lastFinishedEvent
466+ else lastActiveEvent
467+ if (if ((firstFinishedEvent != undefined))
468+ then (lastActiveEvent != undefined)
469+ else false)
470+ then [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent), StringEntry(getNextEventKey(lastActiveEvent), firstFinishedEvent), StringEntry(getPrevEventKey(firstFinishedEvent), lastActiveEvent)]
471+ else [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent)]
468472 }
469473
470474
472476 @Callable(i)
473477 func resetList () = if (!(isAdmin(i.caller)))
474478 then throw("only admin can do")
475- else [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined), StringEntry(fisrtFinishedEventKey, undefined)]
479+ else [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined), StringEntry(fisrtActiveEventKey, undefined), StringEntry(lastActiveEventKey, undefined), StringEntry(fisrtFinishedEventKey, undefined), StringEntry(lastFinishedEventKey, undefined)]
476480
477481
478482
510514 if ((answerResult == answerResult))
511515 then if ((answerResult != currentResult))
512516 then {
513- let inv = invoke(this, "changeList", [eventId], nil)
514- if ((inv == inv))
515- then [StringEntry(getStatusKey(eventId), "finished"), IntegerEntry(getResultKey(eventId), answerResult)]
517+ let delete = invoke(this, "deleteFromList", [eventId, true], nil)
518+ if ((delete == delete))
519+ then {
520+ let concat = invoke(this, "concatLists", nil, nil)
521+ if ((concat == concat))
522+ then nil
523+ else throw("Strict value is not equal to itself.")
524+ }
516525 else throw("Strict value is not equal to itself.")
517526 }
518527 else if ((i.caller == this))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let undefined = "undefined"
55
66 let separator = ";"
77
88 let configAddressKey = "config"
99
1010 let collectorAddressKey = "collector_address"
1111
1212 let historyAddressKey = "history_address"
1313
1414 let adminsKey = "admins"
1515
1616 let configAddress = addressFromStringValue(getStringValue(this, configAddressKey))
1717
1818 let collectorAddress = addressFromStringValue(getStringValue(configAddress, collectorAddressKey))
1919
2020 let historyAddress = addressFromStringValue(getStringValue(configAddress, historyAddressKey))
2121
2222 func isAdmin (caller) = {
2323 let admRow = valueOrElse(getString(configAddress, adminsKey), "")
2424 if (if ((caller == this))
2525 then true
2626 else contains(admRow, toString(caller)))
2727 then true
2828 else false
2929 }
3030
3131
3232 func getCheckerKey (checker) = ("checker_" + checker)
3333
3434
3535 func isChecker (checker) = {
3636 let isExists = isDefined(getString(configAddress, getCheckerKey(toString(checker))))
3737 isExists
3838 }
3939
4040
4141 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
4242
4343 let minAmount = 10000000
4444
4545 let feeNumerator = 5
4646
4747 let feeDenominator = 100
4848
4949 let firstEventKey = "first_event"
5050
5151 let lastEventKey = "last_event"
5252
5353 let fisrtFinishedEventKey = "first_finished_event"
54+
55+let lastFinishedEventKey = "last_finished_event"
56+
57+let fisrtActiveEventKey = "first_active_event"
58+
59+let lastActiveEventKey = "last_active_event"
5460
5561 func getStartBlockKey (eventId) = (eventId + "_start_block")
5662
5763
5864 func getEndBlockKey (eventId) = (eventId + "_end_block")
5965
6066
6167 func getFinishAtKey (eventId) = (eventId + "_finish_at_block")
6268
6369
6470 func getAnswerDappAddressKey (eventId) = (eventId + "_answer_dapp")
6571
6672
6773 func getAnswerFuncAddressKey (eventId) = (eventId + "_answer_func")
6874
6975
7076 func getResultKey (eventId) = (eventId + "_result")
7177
7278
7379 func getIdKey (eventId) = (eventId + "_id")
7480
7581
7682 func getAnswerNKey (eventId,n) = ((eventId + "_answer_") + toString(n))
7783
7884
7985 func getAnswersCountKey (eventId) = (eventId + "_answers_count")
8086
8187
8288 func getStatusKey (eventId) = (eventId + "_status")
8389
8490
8591 func getDescKey (eventId) = (eventId + "_description")
8692
8793
8894 func getPrevEventKey (eventId) = (eventId + "_prev_event")
8995
9096
9197 func getNextEventKey (eventId) = (eventId + "_next_event")
9298
9399
94100 func getClaimAvailableKey (eventId) = (eventId + "_claim_available")
95101
96102
97103 func getParamsKey (eventId) = (eventId + "_params")
98104
99105
100106 func getTotalAmountKey (eventId) = (eventId + "_total_amount")
101107
102108
103109 func getClaimedWinnersCountKey (eventId) = (eventId + "_claimed_winners_count")
104110
105111
106112 func getAmountNKey (eventId,n) = (((eventId + "_") + toString(n)) + "_amount")
107113
108114
109115 func getCountNKey (eventId,n) = (((eventId + "_") + toString(n)) + "_count")
110116
111117
112118 func getAmountAddressKey (eventId,address) = (((eventId + "_") + address) + "_amount")
113119
114120
115121 func getChoiceAddressKey (eventId,address) = (((eventId + "_") + address) + "_choice")
116122
117123
118124 func getAlreadyClaimedAddressKey (eventId,address) = (((eventId + "_") + address) + "_already_claimed")
119125
120126
121127 func asInt (v) = match v {
122128 case x: Int =>
123129 x
124130 case t =>
125131 throw("#err")
126132 }
127133
128134
129135 func asString (v) = match v {
130136 case x: String =>
131137 x
132138 case _ =>
133139 throw("#err")
134140 }
135141
136142
137143 func getStatus (eventId) = {
138144 let status = valueOrElse(getString(this, getStatusKey(eventId)), "#")
139145 if (if (if ((status == "finished"))
140146 then true
141147 else (status == "#"))
142148 then true
143149 else (status == "ended"))
144150 then status
145151 else {
146152 let finishAt = getIntegerValue(this, getFinishAtKey(eventId))
147153 let startBlock = getIntegerValue(this, getStartBlockKey(eventId))
148154 let endBlock = getIntegerValue(this, getEndBlockKey(eventId))
149155 if ((startBlock > height))
150156 then "awaiting"
151157 else if (if ((height >= startBlock))
152158 then (endBlock >= height)
153159 else false)
154160 then "active"
155161 else if (if ((height > endBlock))
156162 then (finishAt >= height)
157163 else false)
158164 then "confirmation"
159165 else if ((height > finishAt))
160166 then "finished"
161167 else throw("unknown status")
162168 }
163169 }
164170
165171
166172 func isClaimAvailable (eventId) = {
167173 let r = valueOrElse(getBoolean(this, getClaimAvailableKey(eventId)), false)
168174 if ((r == true))
169175 then true
170176 else throw("claim is not available")
171177 }
172178
173179
174180 func registerEvent (txid,desc,startBlock,endBlock,finishAt,checkerDapp,checkerFunc,params) = {
175181 let eventId = txid
176- let firstEvent = valueOrElse(getString(this, firstEventKey), undefined)
177- let lastEvent = valueOrElse(getString(this, lastEventKey), undefined)
178- let firstFinished = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
179- let newFirstEvent = eventId
180- if ((newFirstEvent == newFirstEvent))
182+ let answerResult = asInt(invoke(this, "check", [checkerDapp, checkerFunc, params], nil))
183+ if ((answerResult == answerResult))
181184 then {
182- let newLastOrPrevKey = if ((lastEvent == undefined))
183- then lastEventKey
184- else getPrevEventKey(firstEvent)
185- if ((newLastOrPrevKey == newLastOrPrevKey))
185+ let insert = invoke(this, "insertToList", [eventId, true], nil)
186+ if ((insert == insert))
186187 then {
187- let newFirstFinishedKey = if (if ((lastEvent == undefined))
188- then (firstFinished != undefined)
189- else false)
190- then getPrevEventKey(firstFinished)
191- else undefined
192- if ((newFirstFinishedKey == newFirstFinishedKey))
193- then {
194- let newFirstFinishedValue = if (if ((lastEvent == undefined))
195- then (firstFinished != undefined)
196- else false)
197- then eventId
198- else undefined
199- if ((newFirstFinishedValue == newFirstFinishedValue))
200- then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getAnswersCountKey(eventId), 2), IntegerEntry(getResultKey(eventId), 1), StringEntry(firstEventKey, newFirstEvent), StringEntry(newLastOrPrevKey, eventId), StringEntry(getNextEventKey(eventId), firstEvent), StringEntry(newFirstFinishedKey, newFirstFinishedValue), StringEntry(getParamsKey(eventId), params)]
201- else throw("Strict value is not equal to itself.")
202- }
188+ let concat = invoke(this, "concatLists", nil, nil)
189+ if ((concat == concat))
190+ then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getAnswersCountKey(eventId), 2), IntegerEntry(getResultKey(eventId), 1), StringEntry(getParamsKey(eventId), params)]
203191 else throw("Strict value is not equal to itself.")
204192 }
205193 else throw("Strict value is not equal to itself.")
206194 }
207195 else throw("Strict value is not equal to itself.")
208196 }
209197
210198
211199 func getJson (startId) = {
212200 let eventId = asString(valueOrElse(getString(this, getIdKey(startId)), getString(this, firstEventKey)))
213201 let nextEventId = getStringValue(this, getNextEventKey(eventId))
214202 let startBlock = getIntegerValue(this, getStartBlockKey(eventId))
215203 let endBlock = getIntegerValue(this, getEndBlockKey(eventId))
216204 let finishBlock = getIntegerValue(this, getFinishAtKey(eventId))
217205 let checkerDapp = getStringValue(this, getAnswerDappAddressKey(eventId))
218206 let checkerFunc = getStringValue(this, getAnswerFuncAddressKey(eventId))
219207 let desc = getStringValue(this, getDescKey(eventId))
220208 let status = getStatus(eventId)
221209 let result = getIntegerValue(this, getResultKey(eventId))
222210 let answersCount = getIntegerValue(this, getAnswersCountKey(eventId))
223211 let answersArray = (((((("[" + (if ((answersCount >= 1))
224212 then ((((("" + "{\"v\":\"") + getStringValue(this, getAnswerNKey(eventId, 1))) + "\", \"a\":") + toString(valueOrElse(getInteger(this, getAmountNKey(eventId, 1)), 0))) + "}")
225213 else "")) + (if ((answersCount >= 2))
226214 then ((((("," + "{\"v\":\"") + getStringValue(this, getAnswerNKey(eventId, 2))) + "\", \"a\":") + toString(valueOrElse(getInteger(this, getAmountNKey(eventId, 2)), 0))) + "}")
227215 else "")) + (if ((answersCount >= 3))
228216 then ((((("," + "{\"v\":\"") + getStringValue(this, getAnswerNKey(eventId, 3))) + "\", \"a\":") + toString(valueOrElse(getInteger(this, getAmountNKey(eventId, 3)), 0))) + "}")
229217 else "")) + (if ((answersCount >= 4))
230218 then ((((("," + "{\"v\":\"") + getStringValue(this, getAnswerNKey(eventId, 4))) + "\", \"a\":") + toString(valueOrElse(getInteger(this, getAmountNKey(eventId, 4)), 0))) + "}")
231219 else "")) + (if ((answersCount >= 5))
232220 then ((((("," + "{\"v\":\"") + getStringValue(this, getAnswerNKey(eventId, 5))) + "\", \"a\":") + toString(valueOrElse(getInteger(this, getAmountNKey(eventId, 5)), 0))) + "}")
233221 else "")) + "]")
234222 let json = (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"") + "id") + "\"") + ":") + "\"") + eventId) + "\"") + ",") + "\"") + "startBlock") + "\"") + ":") + toString(startBlock)) + ",") + "\"") + "endBlock") + "\"") + ":") + toString(endBlock)) + ",") + "\"") + "finishBlock") + "\"") + ":") + toString(finishBlock)) + ",") + "\"") + "checkerDapp") + "\"") + ":") + "\"") + checkerDapp) + "\"") + ",") + "\"") + "checkerFunc") + "\"") + ":") + "\"") + checkerFunc) + "\"") + ",") + "\"") + "desc") + "\"") + ":") + "\"") + desc) + "\"") + ",") + "\"") + "status") + "\"") + ":") + "\"") + status) + "\"") + ",") + "\"") + "result") + "\"") + ":") + toString(result)) + ",") + "\"") + "answersCount") + "\"") + ":") + toString(answersCount)) + ",") + "\"") + "answers") + "\"") + ":") + "") + answersArray) + "") + "}")
235223 $Tuple2(nextEventId, json)
236224 }
237225
238226
239227 func getJsonArray (startId,count) = if (if (if ((count != 3))
240228 then (count != 6)
241229 else false)
242230 then (count != 9)
243231 else false)
244232 then throw(("only 3, 6 and 9 in array. Param = " + toString(count)))
245233 else {
246234 let ev1 = getJson(startId)
247235 let ev2 = if ((ev1._1 != undefined))
248236 then getJson(ev1._1)
249237 else $Tuple2(undefined, "")
250238 let ev3 = if ((ev2._1 != undefined))
251239 then getJson(ev2._1)
252240 else $Tuple2(undefined, "")
253241 let ev4 = if (if ((count >= 6))
254242 then (ev3._1 != undefined)
255243 else false)
256244 then getJson(ev3._1)
257245 else $Tuple2(undefined, "")
258246 let ev5 = if (if ((count >= 6))
259247 then (ev4._1 != undefined)
260248 else false)
261249 then getJson(ev4._1)
262250 else $Tuple2(undefined, "")
263251 let ev6 = if (if ((count >= 6))
264252 then (ev5._1 != undefined)
265253 else false)
266254 then getJson(ev5._1)
267255 else $Tuple2(undefined, "")
268256 let ev7 = if (if ((count >= 9))
269257 then (ev6._1 != undefined)
270258 else false)
271259 then getJson(ev6._1)
272260 else $Tuple2(undefined, "")
273261 let ev8 = if (if ((count >= 9))
274262 then (ev7._1 != undefined)
275263 else false)
276264 then getJson(ev7._1)
277265 else $Tuple2(undefined, "")
278266 let ev9 = if (if ((count >= 9))
279267 then (ev8._1 != undefined)
280268 else false)
281269 then getJson(ev8._1)
282270 else $Tuple2(undefined, "")
283271 let array = (((((((((("[" + ev1._2) + (if ((ev1._1 != undefined))
284272 then ("," + ev2._2)
285273 else "")) + (if ((ev2._1 != undefined))
286274 then ("," + ev3._2)
287275 else "")) + (if ((ev3._1 != undefined))
288276 then ("," + ev4._2)
289277 else "")) + (if ((ev4._1 != undefined))
290278 then ("," + ev5._2)
291279 else "")) + (if ((ev5._1 != undefined))
292280 then ("," + ev6._2)
293281 else "")) + (if ((ev6._1 != undefined))
294282 then ("," + ev7._2)
295283 else "")) + (if ((ev7._1 != undefined))
296284 then ("," + ev8._2)
297285 else "")) + (if ((ev8._1 != undefined))
298286 then ("," + ev9._2)
299287 else "")) + "]")
300288 $Tuple2(ev9._1, array)
301289 }
302290
303291
304292 @Callable(i)
305293 func init (config,desc) = if (!(isAdmin(i.caller)))
306294 then throw("only admin can do")
307295 else {
308296 let isExists = isDefined(getString(this, configAddressKey))
309297 if (!(isExists))
310298 then {
311299 let inv = invoke(configAddress, "setEventer", [toString(this), desc], nil)
312300 if ((inv == inv))
313301 then [StringEntry(configAddressKey, config)]
314302 else throw("Strict value is not equal to itself.")
315303 }
316304 else throw("already inited")
317305 }
318306
319307
320308
321309 @Callable(i)
322310 func fullRegisterEvent (desc,startBlock,duration,checkerDapp,checkerFunc,params) = {
323311 let newStartBlock = if ((startBlock == 0))
324312 then height
325313 else startBlock
326314 let endBlock = (newStartBlock + duration)
327315 let finishAt = (endBlock + 1440)
328316 if (!(isAdmin(i.caller)))
329317 then throw("only admin can do")
330318 else {
331319 let txid = toBase58String(i.transactionId)
332320 registerEvent(txid, desc, newStartBlock, endBlock, finishAt, checkerDapp, checkerFunc, params)
333321 }
334322 }
335323
336324
337325
338326 @Callable(i)
339327 func choice (eventId,choice) = {
340328 let address = toString(i.caller)
341329 let check = invoke(this, "checkResult", [eventId], nil)
342330 if ((check == check))
343331 then {
344332 let status = getStatus(eventId)
345333 if ((status == "active"))
346334 then if (if ((size(i.payments) == 1))
347335 then (i.payments[0].assetId == USDN)
348336 else false)
349337 then {
350338 let amount = i.payments[0].amount
351339 if ((minAmount > amount))
352340 then throw("amount is less than allowed")
353341 else {
354342 let answersCount = getIntegerValue(this, getAnswersCountKey(eventId))
355343 if (if ((choice == 0))
356344 then true
357345 else (choice > answersCount))
358346 then throw("choice is invalid")
359347 else {
360348 let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
361349 let choiceTotal = valueOrElse(getInteger(this, getAmountNKey(eventId, choice)), 0)
362350 let choiceCount = valueOrElse(getInteger(this, getCountNKey(eventId, choice)), 0)
363351 let addressAmount = valueOrElse(getInteger(this, getAmountAddressKey(eventId, address)), 0)
364352 if ((addressAmount != 0))
365353 then throw("betting from this address is exists")
366354 else {
367355 let save = invoke(historyAddress, "saveToHistory", [eventId, address], nil)
368356 if ((save == save))
369357 then [IntegerEntry(getTotalAmountKey(eventId), (currentTotal + amount)), IntegerEntry(getAmountNKey(eventId, choice), (choiceTotal + amount)), IntegerEntry(getCountNKey(eventId, choice), (choiceCount + 1)), IntegerEntry(getChoiceAddressKey(eventId, address), choice), IntegerEntry(getAmountAddressKey(eventId, address), amount)]
370358 else throw("Strict value is not equal to itself.")
371359 }
372360 }
373361 }
374362 }
375363 else throw("Bad payment")
376364 else throw("You can`t do it")
377365 }
378366 else throw("Strict value is not equal to itself.")
379367 }
380368
381369
382370
383371 @Callable(i)
384372 func claim (eventId,strAddress) = if (!(isClaimAvailable(eventId)))
385373 then throw("claim is not available")
386374 else {
387375 let address = addressFromStringValue(strAddress)
388376 let status = getStatus(eventId)
389377 if ((status == "finished"))
390378 then {
391379 let totalAmount = getIntegerValue(this, getTotalAmountKey(eventId))
392380 let alreadyClaimed = valueOrElse(getBoolean(this, getAlreadyClaimedAddressKey(eventId, toString(address))), false)
393381 if (alreadyClaimed)
394382 then throw("Reward already claimed")
395383 else {
396384 let addressChoice = getIntegerValue(this, getChoiceAddressKey(eventId, toString(address)))
397385 let result = getIntegerValue(this, getResultKey(eventId))
398386 let choiceTotal = getIntegerValue(this, getAmountNKey(eventId, result))
399387 let addressAmount = getIntegerValue(this, getAmountAddressKey(eventId, toString(address)))
400388 if ((addressChoice == result))
401389 then {
402390 let addressReward = fraction(totalAmount, addressAmount, choiceTotal)
403391 let fee = fraction(addressReward, feeNumerator, feeDenominator)
404392 let claimedWinners = (valueOrElse(getInteger(this, getClaimedWinnersCountKey(eventId)), 0) + 1)
405393 let choiceCount = getIntegerValue(this, getCountNKey(eventId, result))
406394 if ((claimedWinners == choiceCount))
407395 then [StringEntry(getStatusKey(eventId), "ended"), BooleanEntry(getChoiceAddressKey(eventId, toString(address)), true), IntegerEntry(getClaimedWinnersCountKey(eventId), claimedWinners), ScriptTransfer(address, (addressReward - fee), USDN), ScriptTransfer(collectorAddress, fee, USDN)]
408396 else [BooleanEntry(getChoiceAddressKey(eventId, toString(address)), true), IntegerEntry(getClaimedWinnersCountKey(eventId), claimedWinners), ScriptTransfer(address, addressReward, USDN), ScriptTransfer(collectorAddress, fee, USDN)]
409397 }
410398 else throw("Something went wrong")
411399 }
412400 }
413401 else throw("You can`t do it")
414402 }
415403
416404
417405
418406 @Callable(i)
419-func changeList (eventId) = if ((this != i.caller))
407+func deleteFromList (eventId,isActive) = if ((this != i.caller))
420408 then throw("only main can do")
421409 else {
422- let prevEvent = valueOrElse(getString(this, getPrevEventKey(eventId)), undefined)
423- let nextEvent = valueOrElse(getString(this, getNextEventKey(eventId)), undefined)
410+ let lastKey = if (isActive)
411+ then lastActiveEventKey
412+ else lastFinishedEventKey
413+ let firstKey = if (isActive)
414+ then fisrtActiveEventKey
415+ else fisrtFinishedEventKey
416+ let prevEvent = getStringValue(this, getPrevEventKey(eventId))
417+ let nextEvent = getStringValue(this, getNextEventKey(eventId))
424418 if (if ((prevEvent == undefined))
425419 then (nextEvent == undefined)
426420 else false)
427- then [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined)]
421+ then [StringEntry(firstKey, undefined), StringEntry(lastKey, undefined)]
428422 else if (if ((prevEvent != undefined))
429423 then (nextEvent != undefined)
430424 else false)
431425 then [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent)]
432426 else if ((prevEvent != undefined))
433- then [StringEntry(lastEventKey, prevEvent), StringEntry(getNextEventKey(prevEvent), undefined)]
434- else [StringEntry(firstEventKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined)]
427+ then [StringEntry(lastKey, prevEvent), StringEntry(getNextEventKey(prevEvent), undefined)]
428+ else [StringEntry(firstKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined)]
435429 }
436430
437431
438432
439433 @Callable(i)
440-func replaceEventToEnd (eventId) = if ((this != i.caller))
434+func insertToList (eventId,isActive) = if ((this != i.caller))
441435 then throw("only main can do")
442436 else {
443- let lastEvent = getStringValue(this, lastEventKey)
444- if ((lastEvent == lastEvent))
445- then {
446- let prevEvent = valueOrElse(getString(this, getPrevEventKey(eventId)), undefined)
447- let nextEvent = valueOrElse(getString(this, getNextEventKey(eventId)), undefined)
448- let firstFinishedEvent = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
449- if ((firstFinishedEvent == firstFinishedEvent))
450- then if (if ((prevEvent == undefined))
451- then (nextEvent == undefined)
452- else false)
453- then [StringEntry(fisrtFinishedEventKey, eventId), StringEntry(lastEventKey, undefined)]
454- else if (if ((prevEvent != undefined))
455- then (nextEvent != undefined)
456- else false)
457- then if ((firstFinishedEvent == undefined))
458- then [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent), StringEntry(getPrevEventKey(eventId), lastEvent), StringEntry(getNextEventKey(lastEvent), eventId), StringEntry(getNextEventKey(eventId), undefined), StringEntry(fisrtFinishedEventKey, eventId)]
459- else [StringEntry(getPrevEventKey(nextEvent), prevEvent), StringEntry(getNextEventKey(prevEvent), nextEvent), StringEntry(getPrevEventKey(eventId), lastEvent), StringEntry(getNextEventKey(eventId), firstFinishedEvent), StringEntry(getPrevEventKey(firstFinishedEvent), eventId), StringEntry(fisrtFinishedEventKey, eventId)]
460- else if ((prevEvent != undefined))
461- then [StringEntry(fisrtFinishedEventKey, eventId), StringEntry(lastEventKey, prevEvent)]
462- else if ((firstFinishedEvent == undefined))
463- then [StringEntry(firstEventKey, nextEvent), StringEntry(getPrevEventKey(nextEvent), undefined), StringEntry(getNextEventKey(eventId), firstFinishedEvent), StringEntry(fisrtFinishedEventKey, eventId)]
464- else [StringEntry(firstEventKey, eventId), StringEntry(lastEventKey, undefined), StringEntry(fisrtFinishedEventKey, eventId)]
465- else throw("Strict value is not equal to itself.")
466- }
467- else throw("Strict value is not equal to itself.")
437+ let lastKey = if (isActive)
438+ then lastActiveEventKey
439+ else lastFinishedEventKey
440+ let firstKey = if (isActive)
441+ then fisrtActiveEventKey
442+ else fisrtFinishedEventKey
443+ let firstEvent = valueOrElse(getString(this, firstKey), undefined)
444+ let lastEvent = valueOrElse(getString(this, lastKey), undefined)
445+ let newLastOrPrevKey = if ((lastEvent == undefined))
446+ then lastKey
447+ else getPrevEventKey(firstEvent)
448+[StringEntry(firstKey, eventId), StringEntry(newLastOrPrevKey, eventId), StringEntry(getNextEventKey(eventId), firstEvent)]
449+ }
450+
451+
452+
453+@Callable(i)
454+func concatLists () = if (!(isAdmin(i.caller)))
455+ then throw("only admin can do")
456+ else {
457+ let firstActiveEvent = valueOrElse(getString(this, fisrtActiveEventKey), undefined)
458+ let lastActiveEvent = valueOrElse(getString(this, lastActiveEventKey), undefined)
459+ let firstFinishedEvent = valueOrElse(getString(this, fisrtFinishedEventKey), undefined)
460+ let lastFinishedEvent = valueOrElse(getString(this, lastFinishedEventKey), undefined)
461+ let firstEvent = if ((firstActiveEvent != undefined))
462+ then firstActiveEvent
463+ else firstFinishedEvent
464+ let lastEvent = if ((lastFinishedEvent != undefined))
465+ then lastFinishedEvent
466+ else lastActiveEvent
467+ if (if ((firstFinishedEvent != undefined))
468+ then (lastActiveEvent != undefined)
469+ else false)
470+ then [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent), StringEntry(getNextEventKey(lastActiveEvent), firstFinishedEvent), StringEntry(getPrevEventKey(firstFinishedEvent), lastActiveEvent)]
471+ else [StringEntry(firstEventKey, firstEvent), StringEntry(lastEventKey, lastEvent)]
468472 }
469473
470474
471475
472476 @Callable(i)
473477 func resetList () = if (!(isAdmin(i.caller)))
474478 then throw("only admin can do")
475- else [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined), StringEntry(fisrtFinishedEventKey, undefined)]
479+ else [StringEntry(firstEventKey, undefined), StringEntry(lastEventKey, undefined), StringEntry(fisrtActiveEventKey, undefined), StringEntry(lastActiveEventKey, undefined), StringEntry(fisrtFinishedEventKey, undefined), StringEntry(lastFinishedEventKey, undefined)]
476480
477481
478482
479483 @Callable(i)
480484 func allowClaim (eventId) = if (!(isAdmin(i.caller)))
481485 then throw("only admin can do")
482486 else [BooleanEntry(getClaimAvailableKey(eventId), true)]
483487
484488
485489
486490 @Callable(i)
487491 func check (dapp,function,params) = if ((this != i.caller))
488492 then throw("only main can do")
489493 else if (!(isChecker(i.caller)))
490494 then throw("is not checker")
491495 else {
492496 let answerResult = asInt(invoke(addressFromStringValue(dapp), function, [params], nil))
493497 $Tuple2(nil, answerResult)
494498 }
495499
496500
497501
498502 @Callable(i)
499503 func checkResult (eventId) = {
500504 let status = getStatus(eventId)
501505 if (if ((status == "active"))
502506 then true
503507 else (status == "confirmation"))
504508 then {
505509 let checkerDapp = getString(this, getAnswerDappAddressKey(eventId))
506510 let checkerFunc = getString(this, getAnswerFuncAddressKey(eventId))
507511 let params = valueOrElse(getString(this, getParamsKey(eventId)), "")
508512 let currentResult = getIntegerValue(this, getResultKey(eventId))
509513 let answerResult = asInt(invoke(this, "check", [checkerDapp, checkerFunc, params], nil))
510514 if ((answerResult == answerResult))
511515 then if ((answerResult != currentResult))
512516 then {
513- let inv = invoke(this, "changeList", [eventId], nil)
514- if ((inv == inv))
515- then [StringEntry(getStatusKey(eventId), "finished"), IntegerEntry(getResultKey(eventId), answerResult)]
517+ let delete = invoke(this, "deleteFromList", [eventId, true], nil)
518+ if ((delete == delete))
519+ then {
520+ let concat = invoke(this, "concatLists", nil, nil)
521+ if ((concat == concat))
522+ then nil
523+ else throw("Strict value is not equal to itself.")
524+ }
516525 else throw("Strict value is not equal to itself.")
517526 }
518527 else if ((i.caller == this))
519528 then nil
520529 else throw()
521530 else throw("Strict value is not equal to itself.")
522531 }
523532 else throw("Event not active")
524533 }
525534
526535

github/deemru/w8io/3ef1775 
62.94 ms