tx · C535cxDyehEmG37nqYHoKcV4GDUjkKMxvz6SPyNuZYeX

3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS:  -0.02300000 Waves

2023.11.30 15:48 [2866157] smart account 3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS > SELF 0.00000000 Waves

{ "type": 13, "id": "C535cxDyehEmG37nqYHoKcV4GDUjkKMxvz6SPyNuZYeX", "fee": 2300000, "feeAssetId": null, "timestamp": 1701348549104, "version": 1, "sender": "3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS", "senderPublicKey": "8h7G4haeVwXKNHXNHsWkC1miUp5CQtk3WmpBKazQPxRh", "proofs": [ "4sLWUkX2PrGcEAWVVJGkDXkE34ENNAteQABDARdVpH87L2bku1GWCpB81ZAyVXLp26aTb2YZ4SJHxxZxVfJJpk2u" ], "script": "base64:BgI6CAISAwoBARIDCgEBEgASAwoBCBIDCgEBEgMKAQgSAwoBCBIECgIICBIECgIYERIDCgEIEgASAwoBCEEADGNvbnRyYWN0RmlsZQIRbDJtcF9zdGFraW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAAdzY2FsZTE4AICAkLu61q3wDQANc2NhbGUxOEJpZ0ludAkAtgIBBQdzY2FsZTE4ABJBRERSRVNTX0JZVEVTX1NJWkUAGgANQkxPQ0tTX0lOX0RBWQCgCwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAATa2V5RW1pc3Npb25QZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDU0VQABlrZXlFbWlzc2lvblBlcmlvZEluQmxvY2tzCQC5CQIJAMwIAgICJXMJAMwIAgIWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVAAFmtleVRvdGFsTG9ja2VkTHBBbW91bnQJALkJAgkAzAgCAgIlcwkAzAgCAhN0b3RhbExvY2tlZExwQW1vdW50BQNuaWwFA1NFUAEPa2V5VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIMdXNlckxwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEVa2V5VXNlckxvY2tlZExwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgISdXNlckxvY2tlZExwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAETa2V5VXNlclN0YWtpbmdOb2RlcwELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICEHVzZXJTdGFraW5nTm9kZXMJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIWdXNlclN0YWtpbmdOb2Rlc1NoYXJlcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkDBHR5cGULdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQR0eXBlCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABDWZvcm1hdEhpc3RvcnkEC3RvdGFsUHJvZml0BXByaWNlEHRvdGFsQXNzZXRBbW91bnQNdG90YWxMcEFtb3VudAkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQULdG90YWxQcm9maXQJAMwIAgkApgMBBQVwcmljZQkAzAgCCQCkAwEFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkApAMBBQ10b3RhbExwQW1vdW50BQNuaWwFA1NFUAANdG90YWxMcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBrZXlUb3RhbExwQW1vdW50AAAAEHRvdGFsQXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa2V5VG90YWxBc3NldEFtb3VudAAAABN0b3RhbExvY2tlZExwQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFmtleVRvdGFsTG9ja2VkTHBBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcAFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5RW1pc3Npb25QZXJpb2RJbkJsb2NrcwUNQkxPQ0tTX0lOX0RBWQAQZW1pc3Npb25QZXJCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlFbWlzc2lvblBlckJsb2NrAAAAEWVtaXNzaW9uUGVyUGVyaW9kCQBoAgUQZW1pc3Npb25QZXJCbG9jawUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwAPQURNSU5fTElTVF9TSVpFAAUABlFVT1JVTQADABFUWElEX0JZVEVTX0xFTkdUSAAgARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBHR4SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIJYWxsb3dUeElkCQDMCAIFBHR4SWQFA25pbAUDU0VQARBrZXlGdWxsQWRtaW5Wb3RlAgZwcmVmaXgMYWRtaW5BZGRyZXNzCQC5CQIJAMwIAgUGcHJlZml4CQDMCAIFDGFkbWluQWRkcmVzcwUDbmlsBQNTRVABE2tleUFkbWluQWRkcmVzc0xpc3QACQC5CQIJAMwIAgICJXMJAMwIAgIQYWRtaW5BZGRyZXNzTGlzdAUDbmlsBQNTRVABDmtleUFsbG93ZWRUeElkAAkAuQkCCQDMCAICAiVzCQDMCAICBHR4SWQFA25pbAUDU0VQAQxnZXRBZG1pblZvdGUCBnByZWZpeAVhZG1pbgQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFBWFkbWluCQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAENZ2V0QWRtaW5zTGlzdAAEByRtYXRjaDAJAJ0IAgUEdGhpcwkBE2tleUFkbWluQWRkcmVzc0xpc3QAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkAtQkCBQFzBQNTRVAFA25pbAENaXNJbkFkbWluTGlzdAEHYWRkcmVzcwkBD2NvbnRhaW5zRWxlbWVudAIJAQ1nZXRBZG1pbnNMaXN0AAUHYWRkcmVzcwESZ2VuVm90ZXNLZXlzSGVscGVyAgFhDGFkbWluQWRkcmVzcwQLJHQwMzU5NTM2MTkFAWEEBnJlc3VsdAgFCyR0MDM1OTUzNjE5Al8xBAZwcmVmaXgIBQskdDAzNTk1MzYxOQJfMgkAlAoCCQDNCAIFBnJlc3VsdAkBEGtleUZ1bGxBZG1pblZvdGUCBQZwcmVmaXgFDGFkbWluQWRkcmVzcwUGcHJlZml4AQxnZW5Wb3Rlc0tleXMBCWtleVByZWZpeAQJYWRtaW5MaXN0CQETa2V5QWRtaW5BZGRyZXNzTGlzdAAECyR0MDM3NjYzODUwCgACJGwJAQ1nZXRBZG1pbnNMaXN0AAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQlrZXlQcmVmaXgKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdlblZvdGVzS2V5c0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEBnJlc3VsdAgFCyR0MDM3NjYzODUwAl8xBAZwcmVmaXgIBQskdDAzNzY2Mzg1MAJfMgUGcmVzdWx0ARBjb3VudFZvdGVzSGVscGVyAgZyZXN1bHQHdm90ZUtleQkAZAIFBnJlc3VsdAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABCmNvdW50Vm90ZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNvdW50Vm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFARBjbGVhclZvdGVzSGVscGVyAgZyZXN1bHQDa2V5CQDNCAIFBnJlc3VsdAkBC0RlbGV0ZUVudHJ5AQUDa2V5ARNnZXRDbGVhclZvdGVFbnRyaWVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjbGVhclZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEMdm90ZUlOVEVSTkFMBBNjYWxsZXJBZGRyZXNzU3RyaW5nCWtleVByZWZpeAhtaW5Wb3Rlcwp2b3RlUmVzdWx0BAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQQYWRtaW5DdXJyZW50Vm90ZQkBDGdldEFkbWluVm90ZQIFCWtleVByZWZpeAUTY2FsbGVyQWRkcmVzc1N0cmluZwQDZXJyAwkBASEBCQENaXNJbkFkbWluTGlzdAEFE2NhbGxlckFkZHJlc3NTdHJpbmcJAQh0aHJvd0VycgEJAKwCAgkArAICAglBZGRyZXNzOiAFE2NhbGxlckFkZHJlc3NTdHJpbmcCEiBub3QgaW4gQWRtaW4gbGlzdAMJAAACBRBhZG1pbkN1cnJlbnRWb3RlAAEJAQh0aHJvd0VycgEJAKwCAgUHdm90ZUtleQISIHlvdSBhbHJlYWR5IHZvdGVkBQR1bml0AwkAAAIFA2VycgUDZXJyBAV2b3RlcwkBCmNvdW50Vm90ZXMBBQlrZXlQcmVmaXgDCQBnAgkAZAIFBXZvdGVzAAEFCG1pblZvdGVzBBBjbGVhclZvdGVFbnRyaWVzCQETZ2V0Q2xlYXJWb3RlRW50cmllcwEFCWtleVByZWZpeAkAzggCBRBjbGVhclZvdGVFbnRyaWVzBQp2b3RlUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd2b3RlS2V5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEZc3RyaW5nTGlzdFRvSW50TGlzdEhlbHBlcgIDYWNjBXZhbHVlCQDNCAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQV2YWx1ZQEYY2FsY1RvdGFsUHJvZml0Rm9ySGVpZ2h0AQFoBApzdGFydEJsb2NrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAQLc3RhcnRQZXJpb2QJAGsDBQpzdGFydEJsb2NrAAEFFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MEDmVsYXBzZWRQZXJpb2RzCQBlAgkAaQIFAWgFFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MFC3N0YXJ0UGVyaW9kCQCWAwEJAMwIAgAACQDMCAIJAGgCBRFlbWlzc2lvblBlclBlcmlvZAUOZWxhcHNlZFBlcmlvZHMFA25pbAEPY2FsY1RvdGFsUHJvZml0AAkBGGNhbGNUb3RhbFByb2ZpdEZvckhlaWdodAEFBmhlaWdodAEUZ2V0TWF4QXNzZXRBdmFpbGFibGUABAckbWF0Y2gwBQxhc3NldElkQnl0ZXMDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCQACAQILTWF0Y2ggZXJyb3IBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUABBp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAZAIFEHRvdGFsQXNzZXRBbW91bnQJAQ9jYWxjVG90YWxQcm9maXQABAt0b3RhbEFtb3VudAkAlwMBCQDMCAIFGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQDMCAIJARRnZXRNYXhBc3NldEF2YWlsYWJsZQAFA25pbAMJAAACBQ10b3RhbExwQW1vdW50AAAAAAULdG90YWxBbW91bnQBD2dldEN1cnJlbnRQcmljZQADCQECIT0CBQ10b3RhbExwQW1vdW50AAAJALwCAwkAtgIBCQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAFDXNjYWxlMThCaWdJbnQJALYCAQUNdG90YWxMcEFtb3VudAUNc2NhbGUxOEJpZ0ludAESZ2V0UmVtYWluaW5nQmxvY2tzAAMJAAACBRBlbWlzc2lvblBlckJsb2NrAAAAAAkAawMJAGUCCQEUZ2V0TWF4QXNzZXRBdmFpbGFibGUACQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAAAQUQZW1pc3Npb25QZXJCbG9jawEXZ2V0VXNlclN0YWtpbmdOb2Rlc0RhdGEBC3VzZXJBZGRyZXNzBAhub2Rlc1JhdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQETa2V5VXNlclN0YWtpbmdOb2RlcwEFC3VzZXJBZGRyZXNzAgAECXNoYXJlc1JhdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEZa2V5VXNlclN0YWtpbmdOb2Rlc1NoYXJlcwEFC3VzZXJBZGRyZXNzAgAECW5vZGVzTGlzdAMJAAACBQhub2Rlc1JhdwIABQNuaWwJALUJAgUIbm9kZXNSYXcFA1NFUAQQc2hhcmVzU3RyaW5nTGlzdAMJAAACBQlzaGFyZXNSYXcCAAUDbmlsCQC1CQIFCXNoYXJlc1JhdwUDU0VQBApzaGFyZXNMaXN0CgACJGwFEHNoYXJlc1N0cmluZ0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBGXN0cmluZ0xpc3RUb0ludExpc3RIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAkAlAoCBQlub2Rlc0xpc3QFCnNoYXJlc0xpc3QBD2NhbGNBc3NldEZyb21McAEIbHBBbW91bnQJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC8AgMJALYCAQUIbHBBbW91bnQJAQ9nZXRDdXJyZW50UHJpY2UABQ1zY2FsZTE4QmlnSW50BQNuaWwBD2NhbGNMcEZyb21Bc3NldAELYXNzZXRBbW91bnQJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC8AgMJALYCAQULYXNzZXRBbW91bnQFDXNjYWxlMThCaWdJbnQJAQ9nZXRDdXJyZW50UHJpY2UABQNuaWwBD2dldFVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleVVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzAAABFWdldFVzZXJMb2NrZWRMcEFtb3VudAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFWtleVVzZXJMb2NrZWRMcEFtb3VudAEFC3VzZXJBZGRyZXNzAAABIGdldFVzZXJBdmFpbGFibGVBc3NldHNUb1dpdGhkcmF3AQt1c2VyQWRkcmVzcwQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MJAQ9jYWxjQXNzZXRGcm9tTHABBQx1c2VyTHBBbW91bnQBG2dldENsZWFyU3Rha2luZ05vZGVzQWN0aW9ucwELdXNlckFkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBE2tleVVzZXJTdGFraW5nTm9kZXMBBQt1c2VyQWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEZa2V5VXNlclN0YWtpbmdOb2Rlc1NoYXJlcwEFC3VzZXJBZGRyZXNzBQNuaWwBD2dldFN0YWtlQWN0aW9ucwIBaQt1c2VyQWRkcmVzcwQGY2hlY2tzCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIYc2hvdWxkIGluY2x1ZGUgMSBwYXltZW50CQDMCAIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQxhc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQCsAgICFXBheW1lbnQgc2hvdWxkIGJlIGluIAUNYXNzZXRJZFN0cmluZwkAzAgCAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAGAidwYXltZW50IGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAAACCQDIAQEJANkEAQULdXNlckFkZHJlc3MFEkFERFJFU1NfQllURVNfU0laRQYJAQh0aHJvd0VycgECGXVzZXIgYWRkcmVzcyBpcyBub3QgdmFsaWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQNcGF5bWVudEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQED3BheW1lbnRMcEFtb3VudAkBD2NhbGNMcEZyb21Bc3NldAEFDXBheW1lbnRBbW91bnQEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBV1c2VyVG90YWxTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQULdXNlckFkZHJlc3MAAAQQbmV3VG90YWxMcEFtb3VudAkAZAIFDXRvdGFsTHBBbW91bnQFD3BheW1lbnRMcEFtb3VudAQTbmV3VG90YWxBc3NldEFtb3VudAkBD2NhbGNBc3NldEZyb21McAEFEG5ld1RvdGFsTHBBbW91bnQED25ld1VzZXJMcEFtb3VudAkAZAIFDHVzZXJMcEFtb3VudAUPcGF5bWVudExwQW1vdW50BBhuZXdVc2VyVG90YWxTdGFrZWRBbW91bnQJAGQCBRV1c2VyVG90YWxTdGFrZWRBbW91bnQFDXBheW1lbnRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUhpc3RvcnkDAgVzdGFrZQULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAQ1mb3JtYXRIaXN0b3J5BAkBD2NhbGNUb3RhbFByb2ZpdAAJAQ9nZXRDdXJyZW50UHJpY2UABQ10b3RhbExwQW1vdW50BRB0b3RhbEFzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlUb3RhbExwQW1vdW50BRBuZXdUb3RhbExwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50BRNuZXdUb3RhbEFzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MFD25ld1VzZXJMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQULdXNlckFkZHJlc3MFGG5ld1VzZXJUb3RhbFN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa2V5U3RhcnRCbG9jawUGaGVpZ2h0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEmdldFdpdGhkcmF3QWN0aW9ucwIBaRVscEFzc2V0V2l0aGRyYXdBbW91bnQEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEBWNoZWNrCQDMCAIDCQBmAgUVbHBBc3NldFdpdGhkcmF3QW1vdW50AAAGCQEIdGhyb3dFcnIBAh9MUCBhbW91bnQgc2hvdWxkIGJlIG1vcmUgdGhhbiAwCQDMCAIDCQBnAgUMdXNlckxwQW1vdW50BRVscEFzc2V0V2l0aGRyYXdBbW91bnQGCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIoY2Fubm90IHdpdGhkcmF3IG1vcmUgdGhhbiBhdmFpbGFibGUgTFAgKAkApAMBBQx1c2VyTHBBbW91bnQCASkFA25pbAMJAAACBQVjaGVjawUFY2hlY2sED25ld1VzZXJMcEFtb3VudAkAZQIFDHVzZXJMcEFtb3VudAUVbHBBc3NldFdpdGhkcmF3QW1vdW50BBN3aXRoZHJhd0Fzc2V0QW1vdW50CQEPY2FsY0Fzc2V0RnJvbUxwAQUVbHBBc3NldFdpdGhkcmF3QW1vdW50BBBuZXdUb3RhbExwQW1vdW50CQBlAgUNdG90YWxMcEFtb3VudAUVbHBBc3NldFdpdGhkcmF3QW1vdW50BBNuZXdUb3RhbEFzc2V0QW1vdW50CQEPY2FsY0Fzc2V0RnJvbUxwAQUQbmV3VG90YWxMcEFtb3VudAQXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQULdXNlckFkZHJlc3MAAAQabmV3VXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAGQCBRd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgUTd2l0aGRyYXdBc3NldEFtb3VudAQXY2xlYXJTdGFraW5nTm9kZXNBY3Rpb24DCQAAAgUPbmV3VXNlckxwQW1vdW50AAAJARtnZXRDbGVhclN0YWtpbmdOb2Rlc0FjdGlvbnMBBQt1c2VyQWRkcmVzcwUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUhpc3RvcnkDAgh3aXRoZHJhdwULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAQ1mb3JtYXRIaXN0b3J5BAkBD2NhbGNUb3RhbFByb2ZpdAAJAQ9nZXRDdXJyZW50UHJpY2UABQ10b3RhbExwQW1vdW50BRB0b3RhbEFzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlUb3RhbExwQW1vdW50BRBuZXdUb3RhbExwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50BRNuZXdUb3RhbEFzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MFD25ld1VzZXJMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQULdXNlckFkZHJlc3MFGm5ld1VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRN3aXRoZHJhd0Fzc2V0QW1vdW50BQxhc3NldElkQnl0ZXMFA25pbAUXY2xlYXJTdGFraW5nTm9kZXNBY3Rpb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGGdldFNldFN0YWtpbmdOb2RlQWN0aW9ucwMLdXNlckFkZHJlc3MLbm9kZUFkZHJlc3MJbm9kZVNoYXJlBAVjaGVjawkAzAgCAwkAAAIJAMgBAQkA2QQBBQt1c2VyQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIZdXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZAkAzAgCAwkAAAIJAMgBAQkA2QQBBQtub2RlQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIZbm9kZSBhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5VXNlclN0YWtpbmdOb2RlcwEFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEZa2V5VXNlclN0YWtpbmdOb2Rlc1NoYXJlcwEFC3VzZXJBZGRyZXNzCQCkAwEFCW5vZGVTaGFyZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuDAFpARNzZXRFbWlzc2lvblBlckJsb2NrARBlbWlzc2lvblBlckJsb2NrBAVjaGVjawkAzAgCAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5RW1pc3Npb25QZXJCbG9jawkAlgMBCQDMCAIAAAkAzAgCBRBlbWlzc2lvblBlckJsb2NrBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlzZXRFbWlzc2lvblBlcmlvZEluQmxvY2tzAQFwBAVjaGVjawkAzAgCAwkAZgIFAXAAAAYJAQh0aHJvd0VycgECKGVtaXNzaW9uIHBlcmlvZCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5VG90YWxBc3NldEFtb3VudAkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFGWtleUVtaXNzaW9uUGVyaW9kSW5CbG9ja3MFAXAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzAWkBCHN0YWtlRm9yAQt1c2VyQWRkcmVzcwkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzAWkBCHdpdGhkcmF3ARN3aXRoZHJhd0Fzc2V0QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBJscEFtb3VudFRvV2l0aGRyYXcJAQ9jYWxjTHBGcm9tQXNzZXQBBRN3aXRoZHJhd0Fzc2V0QW1vdW50BBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQWbWluV2l0aGRyYXdBc3NldEFtb3VudAkAoAMBCQC9AgQJAQ9nZXRDdXJyZW50UHJpY2UACQC2AgEAAQUNc2NhbGUxOEJpZ0ludAUHQ0VJTElORwQFY2hlY2sJAMwIAgMJAGYCBRN3aXRoZHJhd0Fzc2V0QW1vdW50AAAGCQEIdGhyb3dFcnIBAiV3aXRoZHJhdyBhbW91bnQgc2hvdWxkIGJlIG1vcmUgdGhhbiAwCQDMCAIDCQBnAgUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwUTd2l0aGRyYXdBc3NldEFtb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiVjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSAoCQCkAwEFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcCASkJAMwIAgMJAGcCBRN3aXRoZHJhd0Fzc2V0QW1vdW50BRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICJHdpdGhkcmF3IGFtb3VudCBpcyB0b28gc21hbGwuIE1pbjogKAkApAMBBRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQESZ2V0V2l0aGRyYXdBY3Rpb25zAgUBaQkAlwMBCQDMCAIFDHVzZXJMcEFtb3VudAkAzAgCCQBkAgUSbHBBbW91bnRUb1dpdGhkcmF3AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5zZXRTdGFraW5nTm9kZQELbm9kZUFkZHJlc3MEC3VzZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgkBGGdldFNldFN0YWtpbmdOb2RlQWN0aW9ucwMFC3VzZXJBZGRyZXNzBQtub2RlQWRkcmVzcwBkAWkBFnN0YWtlQW5kU2V0U3Rha2luZ05vZGUBC25vZGVBZGRyZXNzBAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIJAM4IAgkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzCQEYZ2V0U2V0U3Rha2luZ05vZGVBY3Rpb25zAwULdXNlckFkZHJlc3MFC25vZGVBZGRyZXNzAGQBaQESc3Rha2VGb3JTd2FwSEVMUEVSAgt1c2VyQWRkcmVzcwtub2RlQWRkcmVzcwQFY2hlY2sJAMwIAgMJAAACCQClCAEIBQFpDG9yaWdpbkNhbGxlcgULdXNlckFkZHJlc3MGCQEIdGhyb3dFcnIBAi1pLm9yaWdpbkNhbGxlciBzaG91bGQgYmUgZXF1YWwgdG8gdXNlckFkZHJlc3MFA25pbAMJAAACBQVjaGVjawUFY2hlY2sEFXNldFN0YWtpbmdOb2RlQWN0aW9ucwMJAAACBQtub2RlQWRkcmVzcwIABQNuaWwJARhnZXRTZXRTdGFraW5nTm9kZUFjdGlvbnMDBQt1c2VyQWRkcmVzcwULbm9kZUFkZHJlc3MAZAkAzggCCQEPZ2V0U3Rha2VBY3Rpb25zAgUBaQULdXNlckFkZHJlc3MFFXNldFN0YWtpbmdOb2RlQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdhaXJkcm9wAgthZGRyZXNzTGlzdAphbW91bnRMaXN0CgEDc3VtAgVhY2N1bQRuZXh0CQBkAgUFYWNjdW0FBG5leHQEDWFtb3VudExpc3RTdW0KAAIkbAUKYW1vdW50TGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDc3VtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA5MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgQFY2hlY2sJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhhzaG91bGQgaW5jbHVkZSAxIHBheW1lbnQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJAKwCAgIVcGF5bWVudCBzaG91bGQgYmUgaW4gBQ1hc3NldElkU3RyaW5nCQDMCAIDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAYCJ3BheW1lbnQgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAAAIJAJADAQULYWRkcmVzc0xpc3QJAJADAQUKYW1vdW50TGlzdAYJAQh0aHJvd0VycgECLWFkZHJlc3NMaXN0IHNob3VsZCBiZSBzYW1lIHNpemUgYXMgYW1vdW50TGlzdAkAzAgCAwkAZwIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ1hbW91bnRMaXN0U3VtBgkBCHRocm93RXJyAQItcGF5bWVudCBhbW91bnQgaXMgbGVzcyB0aGFuIHN1bSBvZiBhbW91bnRMaXN0BQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCgEWZ2V0QWlyZHJvcFN0YXRlQ2hhbmdlcwIFYWNjdW0LYXNzZXRBbW91bnQEDSR0MDE1MDEzMTUwNDkFBWFjY3VtBAZyZXN1bHQIBQ0kdDAxNTAxMzE1MDQ5Al8xBAVpbmRleAgFDSR0MDE1MDEzMTUwNDkCXzIEB3RvdGFsTHAIBQ0kdDAxNTAxMzE1MDQ5Al8zBA1hZGRlZExwQW1vdW50CQEPY2FsY0xwRnJvbUFzc2V0AQULYXNzZXRBbW91bnQED3VzZXJMb2NrZWRMcEtleQkBFWtleVVzZXJMb2NrZWRMcEFtb3VudAEJAJEDAgULYWRkcmVzc0xpc3QFBWluZGV4BAtvbGRMcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ91c2VyTG9ja2VkTHBLZXkAAAkAlQoDCQDNCAIFBnJlc3VsdAkBDEludGVnZXJFbnRyeQIFD3VzZXJMb2NrZWRMcEtleQkAZAIFC29sZExwQW1vdW50BQ1hZGRlZExwQW1vdW50CQBkAgUFaW5kZXgAAQkAZAIFB3RvdGFsTHAFDWFkZGVkTHBBbW91bnQEDSR0MDE1MzgwMTU0ODkKAAIkbAUKYW1vdW50TGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAAAAAAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEWZ2V0QWlyZHJvcFN0YXRlQ2hhbmdlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgOTAJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoEDmFpcmRyb3BFbnRyaWVzCAUNJHQwMTUzODAxNTQ4OQJfMQQCX2EIBQ0kdDAxNTM4MDE1NDg5Al8yBBhhZGRlZFRvdGFsTG9ja2VkTHBBbW91bnQIBQ0kdDAxNTM4MDE1NDg5Al8zBA1uZXdUb3RhbEFzc2V0CQEPY2FsY0Fzc2V0RnJvbUxwAQkAZAIFDXRvdGFsTHBBbW91bnQFGGFkZGVkVG90YWxMb2NrZWRMcEFtb3VudAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZrZXlUb3RhbExvY2tlZExwQW1vdW50CQBkAgUTdG90YWxMb2NrZWRMcEFtb3VudAUYYWRkZWRUb3RhbExvY2tlZExwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlUb3RhbExwQW1vdW50CQBkAgUNdG90YWxMcEFtb3VudAUYYWRkZWRUb3RhbExvY2tlZExwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50BQ1uZXdUb3RhbEFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQFA25pbAUOYWlyZHJvcEVudHJpZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVZ2V0VXNlckFzc2V0c1JFQURPTkxZAQt1c2VyQWRkcmVzcwQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEEnVzZXJMb2NrZWRMcEFtb3VudAkBFWdldFVzZXJMb2NrZWRMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBV1c2VyTG9ja2VkQXNzZXRBbW91bnQJAQ9jYWxjQXNzZXRGcm9tTHABBRJ1c2VyTG9ja2VkTHBBbW91bnQEHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcJASBnZXRVc2VyQXZhaWxhYmxlQXNzZXRzVG9XaXRoZHJhdwEFC3VzZXJBZGRyZXNzBBV1c2VyVG90YWxTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQULdXNlckFkZHJlc3MAAAQXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQULdXNlckFkZHJlc3MAAAQNJHQwMTY4MzkxNjkzMQkBF2dldFVzZXJTdGFraW5nTm9kZXNEYXRhAQULdXNlckFkZHJlc3MEFHVzZXJTdGFraW5nTm9kZXNMaXN0CAUNJHQwMTY4MzkxNjkzMQJfMQQZdXNlclN0YWtpbmdOb2RlU2hhcmVzTGlzdAgFDSR0MDE2ODM5MTY5MzECXzIJAJQKAgUDbmlsCQCcCgoFDHVzZXJMcEFtb3VudAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkBD2dldEN1cnJlbnRQcmljZQAFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24FEnVzZXJMb2NrZWRMcEFtb3VudAUVdXNlckxvY2tlZEFzc2V0QW1vdW50BRR1c2VyU3Rha2luZ05vZGVzTGlzdAUZdXNlclN0YWtpbmdOb2RlU2hhcmVzTGlzdAkBEmdldFJlbWFpbmluZ0Jsb2NrcwABaQEWZ2V0VG90YWxBc3NldHNSRUFET05MWQAJAJQKAgUDbmlsCQCYCgYFDXRvdGFsTHBBbW91bnQJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAkBD2dldEN1cnJlbnRQcmljZQAFE3RvdGFsTG9ja2VkTHBBbW91bnQJAQ9jYWxjQXNzZXRGcm9tTHABBRN0b3RhbExvY2tlZExwQW1vdW50CQESZ2V0UmVtYWluaW5nQmxvY2tzAAFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDBQhieUFkbWlucwYFB2J5T3duZXKPUI2p", "chainId": 84, "height": 2866157, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: J4Grg3KAFzWz6BRLjFozgvfhG2DzZQtL8uo4HD7zLT8w Next: K6qhCjDGRdUw15DWpLt1CAdsCyZ9FuT3uGvnq6L7S8m Diff:
OldNewDifferences
289289 }
290290
291291
292+func getClearStakingNodesActions (userAddress) = [DeleteEntry(keyUserStakingNodes(userAddress)), DeleteEntry(keyUserStakingNodesShares(userAddress))]
293+
294+
292295 func getStakeActions (i,userAddress) = {
293296 let checks = [if ((size(i.payments) == 1))
294297 then true
331334 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount)
332335 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
333336 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
334-[StringEntry(keyHistory("withdraw", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
337+ let clearStakingNodesAction = if ((newUserLpAmount == 0))
338+ then getClearStakingNodesActions(userAddress)
339+ else nil
340+ ([StringEntry(keyHistory("withdraw", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)] ++ clearStakingNodesAction)
335341 }
336342 else throw("Strict value is not equal to itself.")
337343 }
426432
427433
428434 @Callable(i)
435+func stakeForSwapHELPER (userAddress,nodeAddress) = {
436+ let check = [if ((toString(i.originCaller) == userAddress))
437+ then true
438+ else throwErr("i.originCaller should be equal to userAddress")]
439+ if ((check == check))
440+ then {
441+ let setStakingNodeActions = if ((nodeAddress == ""))
442+ then nil
443+ else getSetStakingNodeActions(userAddress, nodeAddress, 100)
444+ (getStakeActions(i, userAddress) ++ setStakingNodeActions)
445+ }
446+ else throw("Strict value is not equal to itself.")
447+ }
448+
449+
450+
451+@Callable(i)
429452 func airdrop (addressList,amountList) = {
430453 func sum (accum,next) = (accum + next)
431454
457480 if ((check == check))
458481 then {
459482 func getAirdropStateChanges (accum,assetAmount) = {
460- let $t01426114297 = accum
461- let result = $t01426114297._1
462- let index = $t01426114297._2
463- let totalLp = $t01426114297._3
483+ let $t01501315049 = accum
484+ let result = $t01501315049._1
485+ let index = $t01501315049._2
486+ let totalLp = $t01501315049._3
464487 let addedLpAmount = calcLpFromAsset(assetAmount)
465488 let userLockedLpKey = keyUserLockedLpAmount(addressList[index])
466489 let oldLpAmount = valueOrElse(getInteger(this, userLockedLpKey), 0)
467490 $Tuple3((result :+ IntegerEntry(userLockedLpKey, (oldLpAmount + addedLpAmount))), (index + 1), (totalLp + addedLpAmount))
468491 }
469492
470- let $t01462814737 = {
493+ let $t01538015489 = {
471494 let $l = amountList
472495 let $s = size($l)
473496 let $acc0 = $Tuple3(nil, 0, 0)
481504
482505 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_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)
483506 }
484- let airdropEntries = $t01462814737._1
485- let _a = $t01462814737._2
486- let addedTotalLockedLpAmount = $t01462814737._3
507+ let airdropEntries = $t01538015489._1
508+ let _a = $t01538015489._2
509+ let addedTotalLockedLpAmount = $t01538015489._3
487510 let newTotalAsset = calcAssetFromLp((totalLpAmount + addedTotalLockedLpAmount))
488511 ([IntegerEntry(keyTotalLockedLpAmount, (totalLockedLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalLpAmount, (totalLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalAssetAmount, newTotalAsset), IntegerEntry(keyStartBlock, height)] ++ airdropEntries)
489512 }
500523 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
501524 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
502525 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
503- let $t01608716179 = getUserStakingNodesData(userAddress)
504- let userStakingNodesList = $t01608716179._1
505- let userStakingNodeSharesList = $t01608716179._2
526+ let $t01683916931 = getUserStakingNodesData(userAddress)
527+ let userStakingNodesList = $t01683916931._1
528+ let userStakingNodeSharesList = $t01683916931._2
506529 $Tuple2(nil, $Tuple10(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn, userLockedLpAmount, userLockedAssetAmount, userStakingNodesList, userStakingNodeSharesList, getRemainingBlocks()))
507530 }
508531
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "l2mp_staking.ride"
55
66 let SEP = "__"
77
88 let scale8 = 100000000
99
1010 let scale18 = 1000000000000000000
1111
1212 let scale18BigInt = toBigInt(scale18)
1313
1414 let ADDRESS_BYTES_SIZE = 26
1515
1616 let BLOCKS_IN_DAY = 1440
1717
1818 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1919
2020
2121 let keyAssetId = makeString(["%s", "assetId"], SEP)
2222
2323 let keyEmissionPerBlock = makeString(["%s", "emissionPerBlock"], SEP)
2424
2525 let keyEmissionPeriodInBlocks = makeString(["%s", "emissionPeriodInBlocks"], SEP)
2626
2727 let keyStartBlock = makeString(["%s", "startBlock"], SEP)
2828
2929 let keyTotalLpAmount = makeString(["%s", "totalLpAmount"], SEP)
3030
3131 let keyTotalAssetAmount = makeString(["%s", "totalAssetAmount"], SEP)
3232
3333 let keyTotalLockedLpAmount = makeString(["%s", "totalLockedLpAmount"], SEP)
3434
3535 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
3636
3737
3838 func keyUserLockedLpAmount (userAddress) = makeString(["%s%s", "userLockedLpAmount", userAddress], SEP)
3939
4040
4141 func keyUserStakingNodes (userAddress) = makeString(["%s%s", "userStakingNodes", userAddress], SEP)
4242
4343
4444 func keyUserStakingNodesShares (userAddress) = makeString(["%s%s", "userStakingNodesShares", userAddress], SEP)
4545
4646
4747 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
4848
4949
5050 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
5151
5252
5353 func keyHistory (type,userAddress,txId) = makeString(["%s%s%s", type, userAddress, toBase58String(txId)], SEP)
5454
5555
5656 func formatHistory (totalProfit,price,totalAssetAmount,totalLpAmount) = makeString(["%d%d%d%d", toString(totalProfit), toString(price), toString(totalAssetAmount), toString(totalLpAmount)], SEP)
5757
5858
5959 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
6060
6161 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
6262
6363 let totalLockedLpAmount = valueOrElse(getInteger(this, keyTotalLockedLpAmount), 0)
6464
6565 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
6666
6767 let assetIdBytes = if ((assetIdString == "WAVES"))
6868 then unit
6969 else fromBase58String(assetIdString)
7070
7171 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
7272
7373 let emissionPerBlock = valueOrElse(getInteger(this, keyEmissionPerBlock), 0)
7474
7575 let emissionPerPeriod = (emissionPerBlock * emissionPeriodInBlocks)
7676
7777 let ADMIN_LIST_SIZE = 5
7878
7979 let QUORUM = 3
8080
8181 let TXID_BYTES_LENGTH = 32
8282
8383 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
8484
8585
8686 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
8787
8888
8989 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
9090
9191
9292 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
9393
9494
9595 func getAdminVote (prefix,admin) = {
9696 let voteKey = keyFullAdminVote(prefix, admin)
9797 valueOrElse(getInteger(voteKey), 0)
9898 }
9999
100100
101101 func getAdminsList () = match getString(this, keyAdminAddressList()) {
102102 case s: String =>
103103 split(s, SEP)
104104 case _ =>
105105 nil
106106 }
107107
108108
109109 func isInAdminList (address) = containsElement(getAdminsList(), address)
110110
111111
112112 func genVotesKeysHelper (a,adminAddress) = {
113113 let $t035953619 = a
114114 let result = $t035953619._1
115115 let prefix = $t035953619._2
116116 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
117117 }
118118
119119
120120 func genVotesKeys (keyPrefix) = {
121121 let adminList = keyAdminAddressList()
122122 let $t037663850 = {
123123 let $l = getAdminsList()
124124 let $s = size($l)
125125 let $acc0 = $Tuple2(nil, keyPrefix)
126126 func $f0_1 ($a,$i) = if (($i >= $s))
127127 then $a
128128 else genVotesKeysHelper($a, $l[$i])
129129
130130 func $f0_2 ($a,$i) = if (($i >= $s))
131131 then $a
132132 else throw("List size exceeds 5")
133133
134134 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
135135 }
136136 let result = $t037663850._1
137137 let prefix = $t037663850._2
138138 result
139139 }
140140
141141
142142 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
143143
144144
145145 func countVotes (prefix) = {
146146 let votes = genVotesKeys(prefix)
147147 let $l = votes
148148 let $s = size($l)
149149 let $acc0 = 0
150150 func $f0_1 ($a,$i) = if (($i >= $s))
151151 then $a
152152 else countVotesHelper($a, $l[$i])
153153
154154 func $f0_2 ($a,$i) = if (($i >= $s))
155155 then $a
156156 else throw("List size exceeds 5")
157157
158158 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
159159 }
160160
161161
162162 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
163163
164164
165165 func getClearVoteEntries (prefix) = {
166166 let votes = genVotesKeys(prefix)
167167 let $l = votes
168168 let $s = size($l)
169169 let $acc0 = nil
170170 func $f0_1 ($a,$i) = if (($i >= $s))
171171 then $a
172172 else clearVotesHelper($a, $l[$i])
173173
174174 func $f0_2 ($a,$i) = if (($i >= $s))
175175 then $a
176176 else throw("List size exceeds 5")
177177
178178 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
179179 }
180180
181181
182182 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
183183 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
184184 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
185185 let err = if (!(isInAdminList(callerAddressString)))
186186 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
187187 else if ((adminCurrentVote == 1))
188188 then throwErr((voteKey + " you already voted"))
189189 else unit
190190 if ((err == err))
191191 then {
192192 let votes = countVotes(keyPrefix)
193193 if (((votes + 1) >= minVotes))
194194 then {
195195 let clearVoteEntries = getClearVoteEntries(keyPrefix)
196196 (clearVoteEntries ++ voteResult)
197197 }
198198 else [IntegerEntry(voteKey, 1)]
199199 }
200200 else throw("Strict value is not equal to itself.")
201201 }
202202
203203
204204 func stringListToIntListHelper (acc,value) = (acc :+ parseIntValue(value))
205205
206206
207207 func calcTotalProfitForHeight (h) = {
208208 let startBlock = valueOrElse(getInteger(this, keyStartBlock), height)
209209 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
210210 let elapsedPeriods = ((h / emissionPeriodInBlocks) - startPeriod)
211211 max([0, (emissionPerPeriod * elapsedPeriods)])
212212 }
213213
214214
215215 func calcTotalProfit () = calcTotalProfitForHeight(height)
216216
217217
218218 func getMaxAssetAvailable () = match assetIdBytes {
219219 case u: Unit =>
220220 wavesBalance(this).available
221221 case b: ByteVector =>
222222 assetBalance(this, b)
223223 case _ =>
224224 throw("Match error")
225225 }
226226
227227
228228 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
229229 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
230230 let totalAmount = min([totalAssetAmountWithProfit, getMaxAssetAvailable()])
231231 if ((totalLpAmount == 0))
232232 then 0
233233 else totalAmount
234234 }
235235
236236
237237 func getCurrentPrice () = if ((totalLpAmount != 0))
238238 then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
239239 else scale18BigInt
240240
241241
242242 func getRemainingBlocks () = if ((emissionPerBlock == 0))
243243 then 0
244244 else fraction((getMaxAssetAvailable() - getTotalAssetAmountWithProfitOrMaxAvailable()), 1, emissionPerBlock)
245245
246246
247247 func getUserStakingNodesData (userAddress) = {
248248 let nodesRaw = valueOrElse(getString(this, keyUserStakingNodes(userAddress)), "")
249249 let sharesRaw = valueOrElse(getString(this, keyUserStakingNodesShares(userAddress)), "")
250250 let nodesList = if ((nodesRaw == ""))
251251 then nil
252252 else split(nodesRaw, SEP)
253253 let sharesStringList = if ((sharesRaw == ""))
254254 then nil
255255 else split(sharesRaw, SEP)
256256 let sharesList = {
257257 let $l = sharesStringList
258258 let $s = size($l)
259259 let $acc0 = nil
260260 func $f0_1 ($a,$i) = if (($i >= $s))
261261 then $a
262262 else stringListToIntListHelper($a, $l[$i])
263263
264264 func $f0_2 ($a,$i) = if (($i >= $s))
265265 then $a
266266 else throw("List size exceeds 20")
267267
268268 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
269269 }
270270 $Tuple2(nodesList, sharesList)
271271 }
272272
273273
274274 func calcAssetFromLp (lpAmount) = max([0, toInt(fraction(toBigInt(lpAmount), getCurrentPrice(), scale18BigInt))])
275275
276276
277277 func calcLpFromAsset (assetAmount) = max([0, toInt(fraction(toBigInt(assetAmount), scale18BigInt, getCurrentPrice()))])
278278
279279
280280 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
281281
282282
283283 func getUserLockedLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLockedLpAmount(userAddress)), 0)
284284
285285
286286 func getUserAvailableAssetsToWithdraw (userAddress) = {
287287 let userLpAmount = getUserLpAmount(userAddress)
288288 calcAssetFromLp(userLpAmount)
289289 }
290290
291291
292+func getClearStakingNodesActions (userAddress) = [DeleteEntry(keyUserStakingNodes(userAddress)), DeleteEntry(keyUserStakingNodesShares(userAddress))]
293+
294+
292295 func getStakeActions (i,userAddress) = {
293296 let checks = [if ((size(i.payments) == 1))
294297 then true
295298 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
296299 then true
297300 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
298301 then true
299302 else "payment amount should be greater than 0", if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
300303 then true
301304 else throwErr("user address is not valid")]
302305 if ((checks == checks))
303306 then {
304307 let paymentAmount = i.payments[0].amount
305308 let paymentLpAmount = calcLpFromAsset(paymentAmount)
306309 let userLpAmount = getUserLpAmount(userAddress)
307310 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
308311 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
309312 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount)
310313 let newUserLpAmount = (userLpAmount + paymentLpAmount)
311314 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
312315 [StringEntry(keyHistory("stake", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount), IntegerEntry(keyStartBlock, height)]
313316 }
314317 else throw("Strict value is not equal to itself.")
315318 }
316319
317320
318321 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
319322 let userAddress = toString(i.caller)
320323 let userLpAmount = getUserLpAmount(userAddress)
321324 let check = [if ((lpAssetWithdrawAmount > 0))
322325 then true
323326 else throwErr("LP amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
324327 then true
325328 else throwErr((("cannot withdraw more than available LP (" + toString(userLpAmount)) + ")"))]
326329 if ((check == check))
327330 then {
328331 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
329332 let withdrawAssetAmount = calcAssetFromLp(lpAssetWithdrawAmount)
330333 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
331334 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount)
332335 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
333336 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
334-[StringEntry(keyHistory("withdraw", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
337+ let clearStakingNodesAction = if ((newUserLpAmount == 0))
338+ then getClearStakingNodesActions(userAddress)
339+ else nil
340+ ([StringEntry(keyHistory("withdraw", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)] ++ clearStakingNodesAction)
335341 }
336342 else throw("Strict value is not equal to itself.")
337343 }
338344
339345
340346 func getSetStakingNodeActions (userAddress,nodeAddress,nodeShare) = {
341347 let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
342348 then true
343349 else throwErr("user address is not valid"), if ((size(fromBase58String(nodeAddress)) == ADDRESS_BYTES_SIZE))
344350 then true
345351 else throwErr("node address is not valid")]
346352 if ((check == check))
347353 then [StringEntry(keyUserStakingNodes(userAddress), nodeAddress), StringEntry(keyUserStakingNodesShares(userAddress), toString(nodeShare))]
348354 else throw("Strict value is not equal to itself.")
349355 }
350356
351357
352358 @Callable(i)
353359 func setEmissionPerBlock (emissionPerBlock) = {
354360 let check = [if ((i.caller == this))
355361 then true
356362 else throwErr("permission denied")]
357363 if ((check == check))
358364 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
359365 else throw("Strict value is not equal to itself.")
360366 }
361367
362368
363369
364370 @Callable(i)
365371 func setEmissionPeriodInBlocks (p) = {
366372 let check = [if ((p > 0))
367373 then true
368374 else throwErr("emission period should be greater than 0"), if ((i.caller == this))
369375 then true
370376 else throwErr("permission denied")]
371377 if ((check == check))
372378 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPeriodInBlocks, p)]
373379 else throw("Strict value is not equal to itself.")
374380 }
375381
376382
377383
378384 @Callable(i)
379385 func stake () = {
380386 let userAddress = toString(i.caller)
381387 getStakeActions(i, userAddress)
382388 }
383389
384390
385391
386392 @Callable(i)
387393 func stakeFor (userAddress) = getStakeActions(i, userAddress)
388394
389395
390396
391397 @Callable(i)
392398 func withdraw (withdrawAssetAmount) = {
393399 let userAddress = toString(i.caller)
394400 let userLpAmount = getUserLpAmount(userAddress)
395401 let lpAmountToWithdraw = calcLpFromAsset(withdrawAssetAmount)
396402 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
397403 let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
398404 let check = [if ((withdrawAssetAmount > 0))
399405 then true
400406 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
401407 then true
402408 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")")), if ((withdrawAssetAmount >= minWithdrawAssetAmount))
403409 then true
404410 else throwErr((("withdraw amount is too small. Min: (" + toString(minWithdrawAssetAmount)) + ")"))]
405411 if ((check == check))
406412 then getWithdrawActions(i, min([userLpAmount, (lpAmountToWithdraw + 1)]))
407413 else throw("Strict value is not equal to itself.")
408414 }
409415
410416
411417
412418 @Callable(i)
413419 func setStakingNode (nodeAddress) = {
414420 let userAddress = toString(i.caller)
415421 getSetStakingNodeActions(userAddress, nodeAddress, 100)
416422 }
417423
418424
419425
420426 @Callable(i)
421427 func stakeAndSetStakingNode (nodeAddress) = {
422428 let userAddress = toString(i.caller)
423429 (getStakeActions(i, userAddress) ++ getSetStakingNodeActions(userAddress, nodeAddress, 100))
424430 }
425431
426432
427433
428434 @Callable(i)
435+func stakeForSwapHELPER (userAddress,nodeAddress) = {
436+ let check = [if ((toString(i.originCaller) == userAddress))
437+ then true
438+ else throwErr("i.originCaller should be equal to userAddress")]
439+ if ((check == check))
440+ then {
441+ let setStakingNodeActions = if ((nodeAddress == ""))
442+ then nil
443+ else getSetStakingNodeActions(userAddress, nodeAddress, 100)
444+ (getStakeActions(i, userAddress) ++ setStakingNodeActions)
445+ }
446+ else throw("Strict value is not equal to itself.")
447+ }
448+
449+
450+
451+@Callable(i)
429452 func airdrop (addressList,amountList) = {
430453 func sum (accum,next) = (accum + next)
431454
432455 let amountListSum = {
433456 let $l = amountList
434457 let $s = size($l)
435458 let $acc0 = 0
436459 func $f0_1 ($a,$i) = if (($i >= $s))
437460 then $a
438461 else sum($a, $l[$i])
439462
440463 func $f0_2 ($a,$i) = if (($i >= $s))
441464 then $a
442465 else throw("List size exceeds 90")
443466
444467 $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($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)
445468 }
446469 let check = [if ((size(i.payments) == 1))
447470 then true
448471 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
449472 then true
450473 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
451474 then true
452475 else "payment amount should be greater than 0", if ((size(addressList) == size(amountList)))
453476 then true
454477 else throwErr("addressList should be same size as amountList"), if ((i.payments[0].amount >= amountListSum))
455478 then true
456479 else throwErr("payment amount is less than sum of amountList")]
457480 if ((check == check))
458481 then {
459482 func getAirdropStateChanges (accum,assetAmount) = {
460- let $t01426114297 = accum
461- let result = $t01426114297._1
462- let index = $t01426114297._2
463- let totalLp = $t01426114297._3
483+ let $t01501315049 = accum
484+ let result = $t01501315049._1
485+ let index = $t01501315049._2
486+ let totalLp = $t01501315049._3
464487 let addedLpAmount = calcLpFromAsset(assetAmount)
465488 let userLockedLpKey = keyUserLockedLpAmount(addressList[index])
466489 let oldLpAmount = valueOrElse(getInteger(this, userLockedLpKey), 0)
467490 $Tuple3((result :+ IntegerEntry(userLockedLpKey, (oldLpAmount + addedLpAmount))), (index + 1), (totalLp + addedLpAmount))
468491 }
469492
470- let $t01462814737 = {
493+ let $t01538015489 = {
471494 let $l = amountList
472495 let $s = size($l)
473496 let $acc0 = $Tuple3(nil, 0, 0)
474497 func $f1_1 ($a,$i) = if (($i >= $s))
475498 then $a
476499 else getAirdropStateChanges($a, $l[$i])
477500
478501 func $f1_2 ($a,$i) = if (($i >= $s))
479502 then $a
480503 else throw("List size exceeds 90")
481504
482505 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_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)
483506 }
484- let airdropEntries = $t01462814737._1
485- let _a = $t01462814737._2
486- let addedTotalLockedLpAmount = $t01462814737._3
507+ let airdropEntries = $t01538015489._1
508+ let _a = $t01538015489._2
509+ let addedTotalLockedLpAmount = $t01538015489._3
487510 let newTotalAsset = calcAssetFromLp((totalLpAmount + addedTotalLockedLpAmount))
488511 ([IntegerEntry(keyTotalLockedLpAmount, (totalLockedLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalLpAmount, (totalLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalAssetAmount, newTotalAsset), IntegerEntry(keyStartBlock, height)] ++ airdropEntries)
489512 }
490513 else throw("Strict value is not equal to itself.")
491514 }
492515
493516
494517
495518 @Callable(i)
496519 func getUserAssetsREADONLY (userAddress) = {
497520 let userLpAmount = getUserLpAmount(userAddress)
498521 let userLockedLpAmount = getUserLockedLpAmount(userAddress)
499522 let userLockedAssetAmount = calcAssetFromLp(userLockedLpAmount)
500523 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
501524 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
502525 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
503- let $t01608716179 = getUserStakingNodesData(userAddress)
504- let userStakingNodesList = $t01608716179._1
505- let userStakingNodeSharesList = $t01608716179._2
526+ let $t01683916931 = getUserStakingNodesData(userAddress)
527+ let userStakingNodesList = $t01683916931._1
528+ let userStakingNodeSharesList = $t01683916931._2
506529 $Tuple2(nil, $Tuple10(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn, userLockedLpAmount, userLockedAssetAmount, userStakingNodesList, userStakingNodeSharesList, getRemainingBlocks()))
507530 }
508531
509532
510533
511534 @Callable(i)
512535 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple6(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice(), totalLockedLpAmount, calcAssetFromLp(totalLockedLpAmount), getRemainingBlocks()))
513536
514537
515538
516539 @Callable(i)
517540 func voteForTxId (txId) = {
518541 let callerAddressString = toBase58String(i.caller.bytes)
519542 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
520543 let result = [StringEntry(keyAllowedTxId(), txId)]
521544 let allowedTxIdOption = getString(this, keyAllowedTxId())
522545 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
523546 then true
524547 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
525548 then true
526549 else (value(allowedTxIdOption) != txId))
527550 then true
528551 else throwErr((txId + " is already allowed"))]
529552 if ((err == err))
530553 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
531554 else throw("Strict value is not equal to itself.")
532555 }
533556
534557
535558 @Verifier(tx)
536559 func verify () = {
537560 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
538561 let byOwner = if ((size(getAdminsList()) >= QUORUM))
539562 then false
540563 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
541564 if (byAdmins)
542565 then true
543566 else byOwner
544567 }
545568

github/deemru/w8io/026f985 
79.23 ms