tx · 6wif2yK6gcf6RCoMe3aT1deE2gfFyxrL75DfaDgeUmyJ

3N3irEKCdj77h97aEbfj3fa3uMXCNCXVhKt:  -0.01300000 Waves

2023.12.11 10:41 [2881747] smart account 3N3irEKCdj77h97aEbfj3fa3uMXCNCXVhKt > SELF 0.00000000 Waves

{ "type": 13, "id": "6wif2yK6gcf6RCoMe3aT1deE2gfFyxrL75DfaDgeUmyJ", "fee": 1300000, "feeAssetId": null, "timestamp": 1702280580211, "version": 1, "sender": "3N3irEKCdj77h97aEbfj3fa3uMXCNCXVhKt", "senderPublicKey": "FACNGaFYnR8yFbQFg9sRBpzGVCyzMyLeVw3JMhGQT1wn", "proofs": [ "2iThgyQGKdWbWhc4xw3rTu28AvpWmXmvhDcVomZWcfuADdGEMpdjBDRZUAqT9Dj3cFsvo1RdVFoPAkfAb1uJ1MMR" ], "script": "base64:BgIWCAISBAoCCAESBQoDGBEBEgMKAQgSADAADGNvbnRyYWN0RmlsZQIRbDJtcF9zdGFraW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAAdzY2FsZTE4AICAkLu61q3wDQANc2NhbGUxOEJpZ0ludAkAtgIBBQdzY2FsZTE4ABJBRERSRVNTX0JZVEVTX1NJWkUAGgANQkxPQ0tTX0lOX0RBWQCgCwAMYWRtaW5BZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzTXBzN0NacUI5blViRWlyWXlDTU1vQTdWYnFyeEx2SkZTQgEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAATa2V5RW1pc3Npb25QZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDU0VQABlrZXlFbWlzc2lvblBlcmlvZEluQmxvY2tzCQC5CQIJAMwIAgICJXMJAMwIAgIWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVAAFmtleVRvdGFsTG9ja2VkTHBBbW91bnQJALkJAgkAzAgCAgIlcwkAzAgCAhN0b3RhbExvY2tlZExwQW1vdW50BQNuaWwFA1NFUAEPa2V5VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIMdXNlckxwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEVa2V5VXNlckxvY2tlZExwQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgISdXNlckxvY2tlZExwQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAETa2V5VXNlclN0YWtpbmdOb2RlcwELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICEHVzZXJTdGFraW5nTm9kZXMJAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQARlrZXlVc2VyU3Rha2luZ05vZGVzU2hhcmVzAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIWdXNlclN0YWtpbmdOb2Rlc1NoYXJlcwkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkDBHR5cGULdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQR0eXBlCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABDWZvcm1hdEhpc3RvcnkEC3RvdGFsUHJvZml0BXByaWNlEHRvdGFsQXNzZXRBbW91bnQNdG90YWxMcEFtb3VudAkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQULdG90YWxQcm9maXQJAMwIAgkApgMBBQVwcmljZQkAzAgCCQCkAwEFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkApAMBBQ10b3RhbExwQW1vdW50BQNuaWwFA1NFUAANdG90YWxMcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBrZXlUb3RhbExwQW1vdW50AAAAEHRvdGFsQXNzZXRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa2V5VG90YWxBc3NldEFtb3VudAAAABN0b3RhbExvY2tlZExwQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFmtleVRvdGFsTG9ja2VkTHBBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcAFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5RW1pc3Npb25QZXJpb2RJbkJsb2NrcwUNQkxPQ0tTX0lOX0RBWQAQZW1pc3Npb25QZXJCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlFbWlzc2lvblBlckJsb2NrAAAAEWVtaXNzaW9uUGVyUGVyaW9kCQBoAgUQZW1pc3Npb25QZXJCbG9jawUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwAKc3RhcnRCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQBGXN0cmluZ0xpc3RUb0ludExpc3RIZWxwZXICA2FjYwV2YWx1ZQkAzQgCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUFdmFsdWUBGGNhbGNUb3RhbFByb2ZpdEZvckhlaWdodAEBaAQLc3RhcnRQZXJpb2QJAGsDBQpzdGFydEJsb2NrAAEFFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MEDmVsYXBzZWRQZXJpb2RzCQBlAgkAaQIFAWgFFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MFC3N0YXJ0UGVyaW9kCQCWAwEJAMwIAgAACQDMCAIJAGgCBRFlbWlzc2lvblBlclBlcmlvZAUOZWxhcHNlZFBlcmlvZHMFA25pbAEPY2FsY1RvdGFsUHJvZml0AAkBGGNhbGNUb3RhbFByb2ZpdEZvckhlaWdodAEFBmhlaWdodAEUZ2V0TWF4QXNzZXRBdmFpbGFibGUABAckbWF0Y2gwBQxhc3NldElkQnl0ZXMDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAgJAO8HAQUEdGhpcwlhdmFpbGFibGUDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCQACAQILTWF0Y2ggZXJyb3IBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUBCGF0SGVpZ2h0BBp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAZAIFEHRvdGFsQXNzZXRBbW91bnQJARhjYWxjVG90YWxQcm9maXRGb3JIZWlnaHQBBQhhdEhlaWdodAQLdG90YWxBbW91bnQJAJcDAQkAzAgCBRp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAzAgCCQEUZ2V0TWF4QXNzZXRBdmFpbGFibGUABQNuaWwDCQAAAgUNdG90YWxMcEFtb3VudAAAAAAFC3RvdGFsQW1vdW50ARBnZXRQcmljZUF0SGVpZ2h0AQFoAwkBAiE9AgUNdG90YWxMcEFtb3VudAAACQC8AgMJALYCAQkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUBBQFoBQ1zY2FsZTE4QmlnSW50CQC2AgEFDXRvdGFsTHBBbW91bnQFDXNjYWxlMThCaWdJbnQBD2dldEN1cnJlbnRQcmljZQAJARBnZXRQcmljZUF0SGVpZ2h0AQUGaGVpZ2h0ARJnZXRSZW1haW5pbmdCbG9ja3MAAwkAAAIFEGVtaXNzaW9uUGVyQmxvY2sAAAAACQBrAwkAZQIJARRnZXRNYXhBc3NldEF2YWlsYWJsZQAJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAQUGaGVpZ2h0AAEFEGVtaXNzaW9uUGVyQmxvY2sBF2dldFVzZXJTdGFraW5nTm9kZXNEYXRhAQt1c2VyQWRkcmVzcwQIbm9kZXNSYXcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBE2tleVVzZXJTdGFraW5nTm9kZXMBBQt1c2VyQWRkcmVzcwIABAlzaGFyZXNSYXcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBGWtleVVzZXJTdGFraW5nTm9kZXNTaGFyZXMBBQt1c2VyQWRkcmVzcwIABAlub2Rlc0xpc3QDCQAAAgUIbm9kZXNSYXcCAAUDbmlsCQC1CQIFCG5vZGVzUmF3BQNTRVAEEHNoYXJlc1N0cmluZ0xpc3QDCQAAAgUJc2hhcmVzUmF3AgAFA25pbAkAtQkCBQlzaGFyZXNSYXcFA1NFUAQKc2hhcmVzTGlzdAoAAiRsBRBzaGFyZXNTdHJpbmdMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARlzdHJpbmdMaXN0VG9JbnRMaXN0SGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQJAJQKAgUJbm9kZXNMaXN0BQpzaGFyZXNMaXN0AQ9jYWxjQXNzZXRGcm9tTHACCGxwQW1vdW50CGF0SGVpZ2h0CQCWAwEJAMwIAgAACQDMCAIJAKADAQkAvAIDCQC2AgEFCGxwQW1vdW50CQEQZ2V0UHJpY2VBdEhlaWdodAEFCGF0SGVpZ2h0BQ1zY2FsZTE4QmlnSW50BQNuaWwBD2NhbGNMcEZyb21Bc3NldAILYXNzZXRBbW91bnQIYXRIZWlnaHQJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC8AgMJALYCAQULYXNzZXRBbW91bnQFDXNjYWxlMThCaWdJbnQJARBnZXRQcmljZUF0SGVpZ2h0AQUIYXRIZWlnaHQFA25pbAEPZ2V0VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MAAAEVZ2V0VXNlckxvY2tlZExwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEVa2V5VXNlckxvY2tlZExwQW1vdW50AQULdXNlckFkZHJlc3MAAAEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwkBD2NhbGNBc3NldEZyb21McAIFDHVzZXJMcEFtb3VudAUGaGVpZ2h0AQ9nZXRTdGFrZUFjdGlvbnMDAWkLdXNlckFkZHJlc3MLc3Rha2VIZWlnaHQEBmNoZWNrcwkAzAgCAwkAZwIFC3N0YWtlSGVpZ2h0BQpzdGFydEJsb2NrBgkBCHRocm93RXJyAQkAuQkCCQDMCAICDHN0YWtlSGVpZ2h0KAkAzAgCCQCkAwEFC3N0YWtlSGVpZ2h0CQDMCAICGykgaXMgbG93ZXIgdGhhbiBzdGFydEJsb2NrKAkAzAgCCQCkAwEFCnN0YXJ0QmxvY2sJAMwIAgIBKQUDbmlsAgAJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhhzaG91bGQgaW5jbHVkZSAxIHBheW1lbnQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJAKwCAgIVcGF5bWVudCBzaG91bGQgYmUgaW4gBQ1hc3NldElkU3RyaW5nCQDMCAIDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAYCJ3BheW1lbnQgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCAwkAAAIJAMgBAQkA2QQBBQt1c2VyQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIZdXNlciBhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1wYXltZW50QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPcGF5bWVudExwQW1vdW50CQEPY2FsY0xwRnJvbUFzc2V0AgUNcGF5bWVudEFtb3VudAULc3Rha2VIZWlnaHQEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBV1c2VyVG90YWxTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQULdXNlckFkZHJlc3MAAAQQbmV3VG90YWxMcEFtb3VudAkAZAIFDXRvdGFsTHBBbW91bnQFD3BheW1lbnRMcEFtb3VudAQTbmV3VG90YWxBc3NldEFtb3VudAkBD2NhbGNBc3NldEZyb21McAIFEG5ld1RvdGFsTHBBbW91bnQFC3N0YWtlSGVpZ2h0BA9uZXdVc2VyTHBBbW91bnQJAGQCBQx1c2VyTHBBbW91bnQFD3BheW1lbnRMcEFtb3VudAQYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50CQBkAgUVdXNlclRvdGFsU3Rha2VkQW1vdW50BQ1wYXltZW50QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlIaXN0b3J5AwIFc3Rha2UFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkCQENZm9ybWF0SGlzdG9yeQQJARhjYWxjVG90YWxQcm9maXRGb3JIZWlnaHQBBQtzdGFrZUhlaWdodAkBEGdldFByaWNlQXRIZWlnaHQBBQtzdGFrZUhlaWdodAUNdG90YWxMcEFtb3VudAUQdG90YWxBc3NldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5VG90YWxMcEFtb3VudAUQbmV3VG90YWxMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5VG90YWxBc3NldEFtb3VudAUTbmV3VG90YWxBc3NldEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBQ9uZXdVc2VyTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzBRhuZXdVc2VyVG90YWxTdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFC3N0YWtlSGVpZ2h0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAWkBDWFkbWluU3Rha2VGb3ICC3VzZXJBZGRyZXNzC3N0YWtlSGVpZ2h0BAVjaGVjawkAzAgCAwkAAAIIBQFpBmNhbGxlcgUMYWRtaW5BZGRyZXNzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAQ9nZXRTdGFrZUFjdGlvbnMDBQFpBQt1c2VyQWRkcmVzcwULc3Rha2VIZWlnaHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHYWlyZHJvcAMLYWRkcmVzc0xpc3QKYW1vdW50TGlzdA1haXJkcm9wSGVpZ2h0CgEDc3VtAgVhY2N1bQRuZXh0AwkAZgIAAAUEbmV4dAkBCHRocm93RXJyAQIjbmVnYXRpdmUgYW1vdW50IHZhbHVlIGluIGFtb3VudExpc3QJAGQCBQVhY2N1bQUEbmV4dAQNYW1vdW50TGlzdFN1bQoAAiRsBQphbW91bnRMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNzdW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDkwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaBAVjaGVjawkAzAgCAwkAAAIIBQFpBmNhbGxlcgUMYWRtaW5BZGRyZXNzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQJAMwIAgMJAGcCBQ1haXJkcm9wSGVpZ2h0BQpzdGFydEJsb2NrBgkBCHRocm93RXJyAQkAuQkCCQDMCAICDmFpcmRyb3BIZWlnaHQoCQDMCAIJAKQDAQUNYWlyZHJvcEhlaWdodAkAzAgCAhspIGlzIGxvd2VyIHRoYW4gc3RhcnRCbG9jaygJAMwIAgkApAMBBQpzdGFydEJsb2NrCQDMCAICASkFA25pbAIACQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIYc2hvdWxkIGluY2x1ZGUgMSBwYXltZW50CQDMCAIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQxhc3NldElkQnl0ZXMGCQEIdGhyb3dFcnIBCQCsAgICFXBheW1lbnQgc2hvdWxkIGJlIGluIAUNYXNzZXRJZFN0cmluZwkAzAgCAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAGAidwYXltZW50IGFtb3VudCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgMJAAACCQCQAwEFC2FkZHJlc3NMaXN0CQCQAwEFCmFtb3VudExpc3QGCQEIdGhyb3dFcnIBAi1hZGRyZXNzTGlzdCBzaG91bGQgYmUgc2FtZSBzaXplIGFzIGFtb3VudExpc3QJAMwIAgMJAGcCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYW1vdW50TGlzdFN1bQYJAQh0aHJvd0VycgECLXBheW1lbnQgYW1vdW50IGlzIGxlc3MgdGhhbiBzdW0gb2YgYW1vdW50TGlzdAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawoBFmdldEFpcmRyb3BTdGF0ZUNoYW5nZXMCBWFjY3VtC2Fzc2V0QW1vdW50BAskdDA4NDYxODUxMgUFYWNjdW0EBnJlc3VsdAgFCyR0MDg0NjE4NTEyAl8xBAVpbmRleAgFCyR0MDg0NjE4NTEyAl8yBAd0b3RhbExwCAULJHQwODQ2MTg1MTICXzMEDXByb2Nlc3NlZExpc3QIBQskdDA4NDYxODUxMgJfNAQNYWRkcmVzc1N0cmluZwkAkQMCBQthZGRyZXNzTGlzdAUFaW5kZXgEB2FkZHJlc3MEByRtYXRjaDAJAKYIAQUNYWRkcmVzc1N0cmluZwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBANhZHIFByRtYXRjaDAFA2FkcgkBCHRocm93RXJyAQIeaW52YWxpZCBhZGRyZXNzIGluIGFkZHJlc3NMaXN0BAJjaAkAzAgCAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUNcHJvY2Vzc2VkTGlzdAUHYWRkcmVzcwYJAQh0aHJvd0VycgECIGR1cGxpY2F0ZSBhZGRyZXNzIGlzIGFkZHJlc3NMaXN0BQNuaWwDCQAAAgUCY2gFAmNoBA1hZGRlZExwQW1vdW50CQEPY2FsY0xwRnJvbUFzc2V0AgULYXNzZXRBbW91bnQFDWFpcmRyb3BIZWlnaHQED3VzZXJMb2NrZWRMcEtleQkBFWtleVVzZXJMb2NrZWRMcEFtb3VudAEFDWFkZHJlc3NTdHJpbmcEC29sZExwQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFD3VzZXJMb2NrZWRMcEtleQAACQCWCgQJAM0IAgUGcmVzdWx0CQEMSW50ZWdlckVudHJ5AgUPdXNlckxvY2tlZExwS2V5CQBkAgULb2xkTHBBbW91bnQFDWFkZGVkTHBBbW91bnQJAGQCBQVpbmRleAABCQBkAgUHdG90YWxMcAUNYWRkZWRMcEFtb3VudAkAzQgCBQ1wcm9jZXNzZWRMaXN0BQdhZGRyZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAskdDA5MjkxOTQwOAoAAiRsBQphbW91bnRMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEBQNuaWwAAAAABQNuaWwKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBFmdldEFpcmRyb3BTdGF0ZUNoYW5nZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDkwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaBA5haXJkcm9wRW50cmllcwgFCyR0MDkyOTE5NDA4Al8xBAJfYQgFCyR0MDkyOTE5NDA4Al8yBBhhZGRlZFRvdGFsTG9ja2VkTHBBbW91bnQIBQskdDA5MjkxOTQwOAJfMwQCX2IIBQskdDA5MjkxOTQwOAJfNAQNbmV3VG90YWxBc3NldAkBD2NhbGNBc3NldEZyb21McAIJAGQCBQ10b3RhbExwQW1vdW50BRhhZGRlZFRvdGFsTG9ja2VkTHBBbW91bnQFDWFpcmRyb3BIZWlnaHQJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUWa2V5VG90YWxMb2NrZWRMcEFtb3VudAkAZAIFE3RvdGFsTG9ja2VkTHBBbW91bnQFGGFkZGVkVG90YWxMb2NrZWRMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa2V5VG90YWxMcEFtb3VudAkAZAIFDXRvdGFsTHBBbW91bnQFGGFkZGVkVG90YWxMb2NrZWRMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5VG90YWxBc3NldEFtb3VudAUNbmV3VG90YWxBc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa2V5U3RhcnRCbG9jawUNYWlyZHJvcEhlaWdodAUDbmlsBQ5haXJkcm9wRW50cmllcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVnZXRVc2VyQXNzZXRzUkVBRE9OTFkBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQSdXNlckxvY2tlZExwQW1vdW50CQEVZ2V0VXNlckxvY2tlZExwQW1vdW50AQULdXNlckFkZHJlc3MEFXVzZXJMb2NrZWRBc3NldEFtb3VudAkBD2NhbGNBc3NldEZyb21McAIFEnVzZXJMb2NrZWRMcEFtb3VudAUGaGVpZ2h0BBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQVdXNlclRvdGFsU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzAAAEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAEDSR0MDEwNzg4MTA4ODAJARdnZXRVc2VyU3Rha2luZ05vZGVzRGF0YQEFC3VzZXJBZGRyZXNzBBR1c2VyU3Rha2luZ05vZGVzTGlzdAgFDSR0MDEwNzg4MTA4ODACXzEEGXVzZXJTdGFraW5nTm9kZVNoYXJlc0xpc3QIBQ0kdDAxMDc4ODEwODgwAl8yCQCUCgIFA25pbAkAnAoKBQx1c2VyTHBBbW91bnQFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcJAQ9nZXRDdXJyZW50UHJpY2UABRV1c2VyVG90YWxTdGFrZWRBbW91bnQFF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduBRJ1c2VyTG9ja2VkTHBBbW91bnQFFXVzZXJMb2NrZWRBc3NldEFtb3VudAUUdXNlclN0YWtpbmdOb2Rlc0xpc3QFGXVzZXJTdGFraW5nTm9kZVNoYXJlc0xpc3QJARJnZXRSZW1haW5pbmdCbG9ja3MAAWkBFmdldFRvdGFsQXNzZXRzUkVBRE9OTFkACQCUCgIFA25pbAkAmAoGBQ10b3RhbExwQW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQEFBmhlaWdodAkBD2dldEN1cnJlbnRQcmljZQAFE3RvdGFsTG9ja2VkTHBBbW91bnQJAQ9jYWxjQXNzZXRGcm9tTHACBRN0b3RhbExvY2tlZExwQW1vdW50BQZoZWlnaHQJARJnZXRSZW1haW5pbmdCbG9ja3MAAAQ+V/4=", "chainId": 84, "height": 2881747, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3bYHppvuGMPf4D2KpSxGmrc5ka1ccq6UBsabKgr1j2aH Next: none Diff:
OldNewDifferences
1515
1616 let BLOCKS_IN_DAY = 1440
1717
18-let adminAddress = addressFromStringValue("3PHZKnwMi7dVAUdJvxMSN885zstyA3yf49t")
18+let adminAddress = addressFromStringValue("3Mps7CZqB9nUbEirYyCMMoA7VbqrxLvJFSB")
1919
2020 func throwErr (msg) = throw(((contractFile + ": ") + msg))
2121
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
18-let adminAddress = addressFromStringValue("3PHZKnwMi7dVAUdJvxMSN885zstyA3yf49t")
18+let adminAddress = addressFromStringValue("3Mps7CZqB9nUbEirYyCMMoA7VbqrxLvJFSB")
1919
2020 func throwErr (msg) = throw(((contractFile + ": ") + msg))
2121
2222
2323 let keyAssetId = makeString(["%s", "assetId"], SEP)
2424
2525 let keyEmissionPerBlock = makeString(["%s", "emissionPerBlock"], SEP)
2626
2727 let keyEmissionPeriodInBlocks = makeString(["%s", "emissionPeriodInBlocks"], SEP)
2828
2929 let keyStartBlock = makeString(["%s", "startBlock"], SEP)
3030
3131 let keyTotalLpAmount = makeString(["%s", "totalLpAmount"], SEP)
3232
3333 let keyTotalAssetAmount = makeString(["%s", "totalAssetAmount"], SEP)
3434
3535 let keyTotalLockedLpAmount = makeString(["%s", "totalLockedLpAmount"], SEP)
3636
3737 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
3838
3939
4040 func keyUserLockedLpAmount (userAddress) = makeString(["%s%s", "userLockedLpAmount", userAddress], SEP)
4141
4242
4343 func keyUserStakingNodes (userAddress) = makeString(["%s%s", "userStakingNodes", userAddress], SEP)
4444
4545
4646 func keyUserStakingNodesShares (userAddress) = makeString(["%s%s", "userStakingNodesShares", userAddress], SEP)
4747
4848
4949 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
5050
5151
5252 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
5353
5454
5555 func keyHistory (type,userAddress,txId) = makeString(["%s%s%s", type, userAddress, toBase58String(txId)], SEP)
5656
5757
5858 func formatHistory (totalProfit,price,totalAssetAmount,totalLpAmount) = makeString(["%d%d%d%d", toString(totalProfit), toString(price), toString(totalAssetAmount), toString(totalLpAmount)], SEP)
5959
6060
6161 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
6262
6363 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
6464
6565 let totalLockedLpAmount = valueOrElse(getInteger(this, keyTotalLockedLpAmount), 0)
6666
6767 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
6868
6969 let assetIdBytes = if ((assetIdString == "WAVES"))
7070 then unit
7171 else fromBase58String(assetIdString)
7272
7373 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
7474
7575 let emissionPerBlock = valueOrElse(getInteger(this, keyEmissionPerBlock), 0)
7676
7777 let emissionPerPeriod = (emissionPerBlock * emissionPeriodInBlocks)
7878
7979 let startBlock = valueOrElse(getInteger(this, keyStartBlock), height)
8080
8181 func stringListToIntListHelper (acc,value) = (acc :+ parseIntValue(value))
8282
8383
8484 func calcTotalProfitForHeight (h) = {
8585 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
8686 let elapsedPeriods = ((h / emissionPeriodInBlocks) - startPeriod)
8787 max([0, (emissionPerPeriod * elapsedPeriods)])
8888 }
8989
9090
9191 func calcTotalProfit () = calcTotalProfitForHeight(height)
9292
9393
9494 func getMaxAssetAvailable () = match assetIdBytes {
9595 case u: Unit =>
9696 wavesBalance(this).available
9797 case b: ByteVector =>
9898 assetBalance(this, b)
9999 case _ =>
100100 throw("Match error")
101101 }
102102
103103
104104 func getTotalAssetAmountWithProfitOrMaxAvailable (atHeight) = {
105105 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfitForHeight(atHeight))
106106 let totalAmount = min([totalAssetAmountWithProfit, getMaxAssetAvailable()])
107107 if ((totalLpAmount == 0))
108108 then 0
109109 else totalAmount
110110 }
111111
112112
113113 func getPriceAtHeight (h) = if ((totalLpAmount != 0))
114114 then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable(h)), scale18BigInt, toBigInt(totalLpAmount))
115115 else scale18BigInt
116116
117117
118118 func getCurrentPrice () = getPriceAtHeight(height)
119119
120120
121121 func getRemainingBlocks () = if ((emissionPerBlock == 0))
122122 then 0
123123 else fraction((getMaxAssetAvailable() - getTotalAssetAmountWithProfitOrMaxAvailable(height)), 1, emissionPerBlock)
124124
125125
126126 func getUserStakingNodesData (userAddress) = {
127127 let nodesRaw = valueOrElse(getString(this, keyUserStakingNodes(userAddress)), "")
128128 let sharesRaw = valueOrElse(getString(this, keyUserStakingNodesShares(userAddress)), "")
129129 let nodesList = if ((nodesRaw == ""))
130130 then nil
131131 else split(nodesRaw, SEP)
132132 let sharesStringList = if ((sharesRaw == ""))
133133 then nil
134134 else split(sharesRaw, SEP)
135135 let sharesList = {
136136 let $l = sharesStringList
137137 let $s = size($l)
138138 let $acc0 = nil
139139 func $f0_1 ($a,$i) = if (($i >= $s))
140140 then $a
141141 else stringListToIntListHelper($a, $l[$i])
142142
143143 func $f0_2 ($a,$i) = if (($i >= $s))
144144 then $a
145145 else throw("List size exceeds 20")
146146
147147 $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)
148148 }
149149 $Tuple2(nodesList, sharesList)
150150 }
151151
152152
153153 func calcAssetFromLp (lpAmount,atHeight) = max([0, toInt(fraction(toBigInt(lpAmount), getPriceAtHeight(atHeight), scale18BigInt))])
154154
155155
156156 func calcLpFromAsset (assetAmount,atHeight) = max([0, toInt(fraction(toBigInt(assetAmount), scale18BigInt, getPriceAtHeight(atHeight)))])
157157
158158
159159 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
160160
161161
162162 func getUserLockedLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLockedLpAmount(userAddress)), 0)
163163
164164
165165 func getUserAvailableAssetsToWithdraw (userAddress) = {
166166 let userLpAmount = getUserLpAmount(userAddress)
167167 calcAssetFromLp(userLpAmount, height)
168168 }
169169
170170
171171 func getStakeActions (i,userAddress,stakeHeight) = {
172172 let checks = [if ((stakeHeight >= startBlock))
173173 then true
174174 else throwErr(makeString(["stakeHeight(", toString(stakeHeight), ") is lower than startBlock(", toString(startBlock), ")"], "")), if ((size(i.payments) == 1))
175175 then true
176176 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
177177 then true
178178 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
179179 then true
180180 else "payment amount should be greater than 0", if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
181181 then true
182182 else throwErr("user address is not valid")]
183183 if ((checks == checks))
184184 then {
185185 let paymentAmount = i.payments[0].amount
186186 let paymentLpAmount = calcLpFromAsset(paymentAmount, stakeHeight)
187187 let userLpAmount = getUserLpAmount(userAddress)
188188 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
189189 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
190190 let newTotalAssetAmount = calcAssetFromLp(newTotalLpAmount, stakeHeight)
191191 let newUserLpAmount = (userLpAmount + paymentLpAmount)
192192 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
193193 [StringEntry(keyHistory("stake", userAddress, i.transactionId), formatHistory(calcTotalProfitForHeight(stakeHeight), getPriceAtHeight(stakeHeight), totalLpAmount, totalAssetAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount), IntegerEntry(keyStartBlock, stakeHeight)]
194194 }
195195 else throw("Strict value is not equal to itself.")
196196 }
197197
198198
199199 @Callable(i)
200200 func adminStakeFor (userAddress,stakeHeight) = {
201201 let check = [if ((i.caller == adminAddress))
202202 then true
203203 else throwErr("permission denied")]
204204 if ((check == check))
205205 then getStakeActions(i, userAddress, stakeHeight)
206206 else throw("Strict value is not equal to itself.")
207207 }
208208
209209
210210
211211 @Callable(i)
212212 func airdrop (addressList,amountList,airdropHeight) = {
213213 func sum (accum,next) = if ((0 > next))
214214 then throwErr("negative amount value in amountList")
215215 else (accum + next)
216216
217217 let amountListSum = {
218218 let $l = amountList
219219 let $s = size($l)
220220 let $acc0 = 0
221221 func $f0_1 ($a,$i) = if (($i >= $s))
222222 then $a
223223 else sum($a, $l[$i])
224224
225225 func $f0_2 ($a,$i) = if (($i >= $s))
226226 then $a
227227 else throw("List size exceeds 90")
228228
229229 $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)
230230 }
231231 let check = [if ((i.caller == adminAddress))
232232 then true
233233 else throwErr("permission denied"), if ((airdropHeight >= startBlock))
234234 then true
235235 else throwErr(makeString(["airdropHeight(", toString(airdropHeight), ") is lower than startBlock(", toString(startBlock), ")"], "")), if ((size(i.payments) == 1))
236236 then true
237237 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
238238 then true
239239 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
240240 then true
241241 else "payment amount should be greater than 0", if ((size(addressList) == size(amountList)))
242242 then true
243243 else throwErr("addressList should be same size as amountList"), if ((i.payments[0].amount >= amountListSum))
244244 then true
245245 else throwErr("payment amount is less than sum of amountList")]
246246 if ((check == check))
247247 then {
248248 func getAirdropStateChanges (accum,assetAmount) = {
249249 let $t084618512 = accum
250250 let result = $t084618512._1
251251 let index = $t084618512._2
252252 let totalLp = $t084618512._3
253253 let processedList = $t084618512._4
254254 let addressString = addressList[index]
255255 let address = match addressFromString(addressString) {
256256 case adr: Address =>
257257 adr
258258 case _ =>
259259 throwErr("invalid address in addressList")
260260 }
261261 let ch = [if (!(containsElement(processedList, address)))
262262 then true
263263 else throwErr("duplicate address is addressList")]
264264 if ((ch == ch))
265265 then {
266266 let addedLpAmount = calcLpFromAsset(assetAmount, airdropHeight)
267267 let userLockedLpKey = keyUserLockedLpAmount(addressString)
268268 let oldLpAmount = valueOrElse(getInteger(this, userLockedLpKey), 0)
269269 $Tuple4((result :+ IntegerEntry(userLockedLpKey, (oldLpAmount + addedLpAmount))), (index + 1), (totalLp + addedLpAmount), (processedList :+ address))
270270 }
271271 else throw("Strict value is not equal to itself.")
272272 }
273273
274274 let $t092919408 = {
275275 let $l = amountList
276276 let $s = size($l)
277277 let $acc0 = $Tuple4(nil, 0, 0, nil)
278278 func $f1_1 ($a,$i) = if (($i >= $s))
279279 then $a
280280 else getAirdropStateChanges($a, $l[$i])
281281
282282 func $f1_2 ($a,$i) = if (($i >= $s))
283283 then $a
284284 else throw("List size exceeds 90")
285285
286286 $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)
287287 }
288288 let airdropEntries = $t092919408._1
289289 let _a = $t092919408._2
290290 let addedTotalLockedLpAmount = $t092919408._3
291291 let _b = $t092919408._4
292292 let newTotalAsset = calcAssetFromLp((totalLpAmount + addedTotalLockedLpAmount), airdropHeight)
293293 ([IntegerEntry(keyTotalLockedLpAmount, (totalLockedLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalLpAmount, (totalLpAmount + addedTotalLockedLpAmount)), IntegerEntry(keyTotalAssetAmount, newTotalAsset), IntegerEntry(keyStartBlock, airdropHeight)] ++ airdropEntries)
294294 }
295295 else throw("Strict value is not equal to itself.")
296296 }
297297
298298
299299
300300 @Callable(i)
301301 func getUserAssetsREADONLY (userAddress) = {
302302 let userLpAmount = getUserLpAmount(userAddress)
303303 let userLockedLpAmount = getUserLockedLpAmount(userAddress)
304304 let userLockedAssetAmount = calcAssetFromLp(userLockedLpAmount, height)
305305 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
306306 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
307307 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
308308 let $t01078810880 = getUserStakingNodesData(userAddress)
309309 let userStakingNodesList = $t01078810880._1
310310 let userStakingNodeSharesList = $t01078810880._2
311311 $Tuple2(nil, $Tuple10(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn, userLockedLpAmount, userLockedAssetAmount, userStakingNodesList, userStakingNodeSharesList, getRemainingBlocks()))
312312 }
313313
314314
315315
316316 @Callable(i)
317317 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple6(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(height), getCurrentPrice(), totalLockedLpAmount, calcAssetFromLp(totalLockedLpAmount, height), getRemainingBlocks()))
318318
319319

github/deemru/w8io/6500d08 
87.27 ms