tx · vHYMbbJP8uE7VcxZnHFz9nBMBeSLdy1SCisTgNfkDs3

3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS:  -0.01600000 Waves

2023.07.28 11:02 [2685447] smart account 3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS > SELF 0.00000000 Waves

{ "type": 13, "id": "vHYMbbJP8uE7VcxZnHFz9nBMBeSLdy1SCisTgNfkDs3", "fee": 1600000, "feeAssetId": null, "timestamp": 1690531352536, "version": 2, "chainId": 84, "sender": "3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS", "senderPublicKey": "8h7G4haeVwXKNHXNHsWkC1miUp5CQtk3WmpBKazQPxRh", "proofs": [ "29iSqfKej98ihTTj6Tor3svtDqt6G3AajFtuLHtBnooyPPmjhLcrio7LhyMc741cNukeUbibJ6PyLFgLEFaDjw7d" ], "script": "base64:BgIfCAISAwoBARIAEgMKAQgSAwoBARIDCgEIEgASAwoBCDIADGNvbnRyYWN0RmlsZQIRbDJtcF9zdGFraW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvAAdzY2FsZTE4AICAkLu61q3wDQANc2NhbGUxOEJpZ0ludAkAtgIBBQdzY2FsZTE4ABJBRERSRVNTX0JZVEVTX1NJWkUAGgANQkxPQ0tTX0lOX0RBWQCgCwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAATa2V5RW1pc3Npb25QZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDU0VQABlrZXlFbWlzc2lvblBlcmlvZEluQmxvY2tzCQC5CQIJAMwIAgICJXMJAMwIAgIWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVABD2tleVVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDHVzZXJMcEFtb3VudAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABCmtleUhpc3RvcnkDBHR5cGULdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCBQR0eXBlCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABDWZvcm1hdEhpc3RvcnkEC3RvdGFsUHJvZml0BXByaWNlEHRvdGFsQXNzZXRBbW91bnQNdG90YWxMcEFtb3VudAkAuQkCCQDMCAICBCVkJWQJAMwIAgkApAMBBQt0b3RhbFByb2ZpdAkAzAgCCQCmAwEFBXByaWNlCQDMCAIJAKQDAQUQdG90YWxBc3NldEFtb3VudAkAzAgCCQCkAwEFDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQAA10b3RhbExwQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEGtleVRvdGFsTHBBbW91bnQAAAAQdG90YWxBc3NldEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlUb3RhbEFzc2V0QW1vdW50AAAADWFzc2V0SWRTdHJpbmcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUKa2V5QXNzZXRJZAIFV0FWRVMADGFzc2V0SWRCeXRlcwMJAAACBQ1hc3NldElkU3RyaW5nAgVXQVZFUwUEdW5pdAkA2QQBBQ1hc3NldElkU3RyaW5nABZlbWlzc2lvblBlcmlvZEluQmxvY2tzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleUVtaXNzaW9uUGVyaW9kSW5CbG9ja3MFDUJMT0NLU19JTl9EQVkAEWVtaXNzaW9uUGVyUGVyaW9kCQBoAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlFbWlzc2lvblBlckJsb2NrAAAFFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDMwNDUzMDY5BQFhBAZyZXN1bHQIBQskdDAzMDQ1MzA2OQJfMQQGcHJlZml4CAULJHQwMzA0NTMwNjkCXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAzMjE2MzMwMAoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAzMjE2MzMwMAJfMQQGcHJlZml4CAULJHQwMzIxNjMzMDACXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGGNhbGNUb3RhbFByb2ZpdEZvckhlaWdodAEBaAQKc3RhcnRCbG9jawkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ1rZXlTdGFydEJsb2NrAAAEC3N0YXJ0UGVyaW9kCQBrAwUKc3RhcnRCbG9jawABBRZlbWlzc2lvblBlcmlvZEluQmxvY2tzBA5lbGFwc2VkUGVyaW9kcwkAZQIJAGkCBQFoBRZlbWlzc2lvblBlcmlvZEluQmxvY2tzBQtzdGFydFBlcmlvZAkAlgMBCQDMCAIAAAkAzAgCCQBoAgURZW1pc3Npb25QZXJQZXJpb2QFDmVsYXBzZWRQZXJpb2RzBQNuaWwBD2NhbGNUb3RhbFByb2ZpdAAJARhjYWxjVG90YWxQcm9maXRGb3JIZWlnaHQBBQZoZWlnaHQBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUABBp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAZAIFEHRvdGFsQXNzZXRBbW91bnQJAQ9jYWxjVG90YWxQcm9maXQABAt0b3RhbEFtb3VudAQHJG1hdGNoMAUMYXNzZXRJZEJ5dGVzAwkAAQIFByRtYXRjaDACBFVuaXQEAXUFByRtYXRjaDAJAJcDAQkAzAgCBRp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAzAgCCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQUDbmlsAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJAJcDAQkAzAgCBRp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAzAgCCQDwBwIFBHRoaXMFAWIFA25pbAkAAgECC01hdGNoIGVycm9yAwkAAAIFDXRvdGFsTHBBbW91bnQAAAAABQt0b3RhbEFtb3VudAEPZ2V0Q3VycmVudFByaWNlAAMJAQIhPQIFDXRvdGFsTHBBbW91bnQAAAkAvAIDCQC2AgEJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAUNc2NhbGUxOEJpZ0ludAkAtgIBBQ10b3RhbExwQW1vdW50BQ1zY2FsZTE4QmlnSW50AQ9nZXRVc2VyTHBBbW91bnQBC3VzZXJBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwAAASBnZXRVc2VyQXZhaWxhYmxlQXNzZXRzVG9XaXRoZHJhdwELdXNlckFkZHJlc3MEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQCgAwEJALwCAwkAtgIBBQx1c2VyTHBBbW91bnQJAQ9nZXRDdXJyZW50UHJpY2UABQ1zY2FsZTE4QmlnSW50AwkAZgIAAAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwAABRx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3AQ9nZXRTdGFrZUFjdGlvbnMCAWkLdXNlckFkZHJlc3MEBmNoZWNrcwkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECGHNob3VsZCBpbmNsdWRlIDEgcGF5bWVudAkAzAgCAwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMYXNzZXRJZEJ5dGVzBgkBCHRocm93RXJyAQkArAICAhVwYXltZW50IHNob3VsZCBiZSBpbiAFDWFzc2V0SWRTdHJpbmcJAMwIAgMJAGYCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABgIncGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDXBheW1lbnRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA9wYXltZW50THBBbW91bnQJAKADAQkAvAIDCQC2AgEFDXBheW1lbnRBbW91bnQFDXNjYWxlMThCaWdJbnQJAQ9nZXRDdXJyZW50UHJpY2UABAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQVdXNlclRvdGFsU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzAAAEEG5ld1RvdGFsTHBBbW91bnQJAGQCBQ10b3RhbExwQW1vdW50BQ9wYXltZW50THBBbW91bnQEE25ld1RvdGFsQXNzZXRBbW91bnQJAGQCBRB0b3RhbEFzc2V0QW1vdW50BQ1wYXltZW50QW1vdW50BA9uZXdVc2VyTHBBbW91bnQJAGQCBQx1c2VyTHBBbW91bnQFD3BheW1lbnRMcEFtb3VudAQYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50CQBkAgUVdXNlclRvdGFsU3Rha2VkQW1vdW50BQ1wYXltZW50QW1vdW50BBd1cGRhdGVTdGFydEhlaWdodEFjdGlvbgMJAAACBQ10b3RhbExwQW1vdW50AAAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5SGlzdG9yeQMCBXN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkBDWZvcm1hdEhpc3RvcnkECQEPY2FsY1RvdGFsUHJvZml0AAkBD2dldEN1cnJlbnRQcmljZQAFDXRvdGFsTHBBbW91bnQFEHRvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwUYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50BQNuaWwFF3VwZGF0ZVN0YXJ0SGVpZ2h0QWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARJnZXRXaXRoZHJhd0FjdGlvbnMCAWkVbHBBc3NldFdpdGhkcmF3QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBAVjaGVjawkAzAgCAwkAZgIFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAAABgkBCHRocm93RXJyAQIfTFAgYW1vdW50IHNob3VsZCBiZSBtb3JlIHRoYW4gMAkAzAgCAwkAZwIFDHVzZXJMcEFtb3VudAUVbHBBc3NldFdpdGhkcmF3QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICKGNhbm5vdCB3aXRoZHJhdyBtb3JlIHRoYW4gYXZhaWxhYmxlIExQICgJAKQDAQUMdXNlckxwQW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBA9uZXdVc2VyTHBBbW91bnQJAGUCBQx1c2VyTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTd2l0aGRyYXdBc3NldEFtb3VudAkAoAMBCQC8AgMJALYCAQUVbHBBc3NldFdpdGhkcmF3QW1vdW50CQEPZ2V0Q3VycmVudFByaWNlAAUNc2NhbGUxOEJpZ0ludAQQbmV3VG90YWxMcEFtb3VudAkAZQIFDXRvdGFsTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTbmV3VG90YWxBc3NldEFtb3VudAkAoAMBCQC8AgMJALYCAQUQbmV3VG90YWxMcEFtb3VudAkBD2dldEN1cnJlbnRQcmljZQAFDXNjYWxlMThCaWdJbnQEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAEGm5ld1VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQBkAgUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24FE3dpdGhkcmF3QXNzZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUhpc3RvcnkDAgh3aXRoZHJhdwULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAQ1mb3JtYXRIaXN0b3J5BAkBD2NhbGNUb3RhbFByb2ZpdAAJAQ9nZXRDdXJyZW50UHJpY2UABRB0b3RhbEFzc2V0QW1vdW50BQ10b3RhbExwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrZXlUb3RhbExwQW1vdW50BRBuZXdUb3RhbExwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50BRNuZXdUb3RhbEFzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MFD25ld1VzZXJMcEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQULdXNlckFkZHJlc3MFGm5ld1VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRN3aXRoZHJhd0Fzc2V0QW1vdW50BQxhc3NldElkQnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgcBaQETc2V0RW1pc3Npb25QZXJCbG9jawEQZW1pc3Npb25QZXJCbG9jawQFY2hlY2sJAMwIAgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5VG90YWxBc3NldEFtb3VudAkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleUVtaXNzaW9uUGVyQmxvY2sJAJYDAQkAzAgCAAAJAMwIAgUQZW1pc3Npb25QZXJCbG9jawUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFc3Rha2UACQEPZ2V0U3Rha2VBY3Rpb25zAgUBaQkApQgBCAUBaQZjYWxsZXIBaQEIc3Rha2VGb3IBC3VzZXJBZGRyZXNzBAVjaGVjawkAzAgCAwkAAAIJAMgBAQkA2QQBBQt1c2VyQWRkcmVzcwUSQUREUkVTU19CWVRFU19TSVpFBgkBCHRocm93RXJyAQIUYWRkcmVzcyBpcyBub3QgdmFsaWQFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJAQ9nZXRTdGFrZUFjdGlvbnMCBQFpBQt1c2VyQWRkcmVzcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwETd2l0aGRyYXdBc3NldEFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQSbHBBbW91bnRUb1dpdGhkcmF3CQCgAwEJALwCAwkAtgIBBRN3aXRoZHJhd0Fzc2V0QW1vdW50BQ1zY2FsZTE4QmlnSW50CQEPZ2V0Q3VycmVudFByaWNlAAQcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkBIGdldFVzZXJBdmFpbGFibGVBc3NldHNUb1dpdGhkcmF3AQULdXNlckFkZHJlc3MEFm1pbldpdGhkcmF3QXNzZXRBbW91bnQJAKADAQkAvQIECQEPZ2V0Q3VycmVudFByaWNlAAkAtgIBAAEFDXNjYWxlMThCaWdJbnQFB0NFSUxJTkcEBWNoZWNrCQDMCAIDCQBmAgUTd2l0aGRyYXdBc3NldEFtb3VudAAABgkBCHRocm93RXJyAQIld2l0aGRyYXcgYW1vdW50IHNob3VsZCBiZSBtb3JlIHRoYW4gMAkAzAgCAwkAZwIFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcFE3dpdGhkcmF3QXNzZXRBbW91bnQGCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIlY2Fubm90IHdpdGhkcmF3IG1vcmUgdGhhbiBhdmFpbGFibGUgKAkApAMBBRx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3AgEpCQDMCAIDCQBnAgUTd2l0aGRyYXdBc3NldEFtb3VudAUWbWluV2l0aGRyYXdBc3NldEFtb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiR3aXRoZHJhdyBhbW91bnQgaXMgdG9vIHNtYWxsLiBNaW46ICgJAKQDAQUWbWluV2l0aGRyYXdBc3NldEFtb3VudAIBKQUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkBEmdldFdpdGhkcmF3QWN0aW9ucwIFAWkFEmxwQW1vdW50VG9XaXRoZHJhdwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVnZXRVc2VyQXNzZXRzUkVBRE9OTFkBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkBIGdldFVzZXJBdmFpbGFibGVBc3NldHNUb1dpdGhkcmF3AQULdXNlckFkZHJlc3MEFXVzZXJUb3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwAABBd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwAACQCUCgIFA25pbAkAlwoFBQx1c2VyTHBBbW91bnQFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcJAQ9nZXRDdXJyZW50UHJpY2UABRV1c2VyVG90YWxTdGFrZWRBbW91bnQFF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduAWkBFmdldFRvdGFsQXNzZXRzUkVBRE9OTFkACQCUCgIFA25pbAkAlQoDBQ10b3RhbExwQW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAQ9nZXRDdXJyZW50UHJpY2UAAWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAACAAQHYnlPd25lcgMJAGcCCQCQAwEJAQ1nZXRBZG1pbnNMaXN0AAUGUVVPUlVNBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQMFCGJ5QWRtaW5zBgUHYnlPd25lcnkSETs=", "height": 2685447, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GwY8ni9MGY3Vmj3bvYihiGcQWLeiJkohEMVoV11CA9nW Next: Ey95ev4ZQjzjxifq5tnLJ3VFZQkinZJpDAYq35oyXxuo Diff:
OldNewDifferences
242242 then {
243243 let paymentAmount = i.payments[0].amount
244244 let paymentLpAmount = toInt(fraction(toBigInt(paymentAmount), scale18BigInt, getCurrentPrice()))
245- if ((paymentLpAmount == paymentLpAmount))
246- then {
247- let userLpAmount = getUserLpAmount(userAddress)
248- let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
249- let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
250- let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
251- let newUserLpAmount = (userLpAmount + paymentLpAmount)
252- let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
253- let updateStartHeightAction = if ((totalLpAmount == 0))
254- then [IntegerEntry(keyStartBlock, height)]
255- else nil
256- ([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)] ++ updateStartHeightAction)
257- }
258- else throw("Strict value is not equal to itself.")
245+ let userLpAmount = getUserLpAmount(userAddress)
246+ let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
247+ let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
248+ let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
249+ let newUserLpAmount = (userLpAmount + paymentLpAmount)
250+ let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
251+ let updateStartHeightAction = if ((totalLpAmount == 0))
252+ then [IntegerEntry(keyStartBlock, height)]
253+ else nil
254+ ([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)] ++ updateStartHeightAction)
259255 }
260256 else throw("Strict value is not equal to itself.")
261257 }
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 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
3434
3535
3636 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
3737
3838
3939 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
4040
4141
4242 func keyHistory (type,userAddress,txId) = makeString(["%s%s%s", type, userAddress, toBase58String(txId)], SEP)
4343
4444
4545 func formatHistory (totalProfit,price,totalAssetAmount,totalLpAmount) = makeString(["%d%d", toString(totalProfit), toString(price), toString(totalAssetAmount), toString(totalLpAmount)], SEP)
4646
4747
4848 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
4949
5050 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
5151
5252 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
5353
5454 let assetIdBytes = if ((assetIdString == "WAVES"))
5555 then unit
5656 else fromBase58String(assetIdString)
5757
5858 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
5959
6060 let emissionPerPeriod = (valueOrElse(getInteger(this, keyEmissionPerBlock), 0) * emissionPeriodInBlocks)
6161
6262 let ADMIN_LIST_SIZE = 5
6363
6464 let QUORUM = 3
6565
6666 let TXID_BYTES_LENGTH = 32
6767
6868 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
6969
7070
7171 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
7272
7373
7474 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
7575
7676
7777 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
7878
7979
8080 func getAdminVote (prefix,admin) = {
8181 let voteKey = keyFullAdminVote(prefix, admin)
8282 valueOrElse(getInteger(voteKey), 0)
8383 }
8484
8585
8686 func getAdminsList () = match getString(this, keyAdminAddressList()) {
8787 case s: String =>
8888 split(s, SEP)
8989 case _ =>
9090 nil
9191 }
9292
9393
9494 func isInAdminList (address) = containsElement(getAdminsList(), address)
9595
9696
9797 func genVotesKeysHelper (a,adminAddress) = {
9898 let $t030453069 = a
9999 let result = $t030453069._1
100100 let prefix = $t030453069._2
101101 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
102102 }
103103
104104
105105 func genVotesKeys (keyPrefix) = {
106106 let adminList = keyAdminAddressList()
107107 let $t032163300 = {
108108 let $l = getAdminsList()
109109 let $s = size($l)
110110 let $acc0 = $Tuple2(nil, keyPrefix)
111111 func $f0_1 ($a,$i) = if (($i >= $s))
112112 then $a
113113 else genVotesKeysHelper($a, $l[$i])
114114
115115 func $f0_2 ($a,$i) = if (($i >= $s))
116116 then $a
117117 else throw("List size exceeds 5")
118118
119119 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
120120 }
121121 let result = $t032163300._1
122122 let prefix = $t032163300._2
123123 result
124124 }
125125
126126
127127 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
128128
129129
130130 func countVotes (prefix) = {
131131 let votes = genVotesKeys(prefix)
132132 let $l = votes
133133 let $s = size($l)
134134 let $acc0 = 0
135135 func $f0_1 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else countVotesHelper($a, $l[$i])
138138
139139 func $f0_2 ($a,$i) = if (($i >= $s))
140140 then $a
141141 else throw("List size exceeds 5")
142142
143143 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
144144 }
145145
146146
147147 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
148148
149149
150150 func getClearVoteEntries (prefix) = {
151151 let votes = genVotesKeys(prefix)
152152 let $l = votes
153153 let $s = size($l)
154154 let $acc0 = nil
155155 func $f0_1 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else clearVotesHelper($a, $l[$i])
158158
159159 func $f0_2 ($a,$i) = if (($i >= $s))
160160 then $a
161161 else throw("List size exceeds 5")
162162
163163 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
164164 }
165165
166166
167167 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
168168 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
169169 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
170170 let err = if (!(isInAdminList(callerAddressString)))
171171 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
172172 else if ((adminCurrentVote == 1))
173173 then throwErr((voteKey + " you already voted"))
174174 else unit
175175 if ((err == err))
176176 then {
177177 let votes = countVotes(keyPrefix)
178178 if (((votes + 1) >= minVotes))
179179 then {
180180 let clearVoteEntries = getClearVoteEntries(keyPrefix)
181181 (clearVoteEntries ++ voteResult)
182182 }
183183 else [IntegerEntry(voteKey, 1)]
184184 }
185185 else throw("Strict value is not equal to itself.")
186186 }
187187
188188
189189 func calcTotalProfitForHeight (h) = {
190190 let startBlock = valueOrElse(getInteger(this, keyStartBlock), 0)
191191 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
192192 let elapsedPeriods = ((h / emissionPeriodInBlocks) - startPeriod)
193193 max([0, (emissionPerPeriod * elapsedPeriods)])
194194 }
195195
196196
197197 func calcTotalProfit () = calcTotalProfitForHeight(height)
198198
199199
200200 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
201201 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
202202 let totalAmount = match assetIdBytes {
203203 case u: Unit =>
204204 min([totalAssetAmountWithProfit, wavesBalance(this).available])
205205 case b: ByteVector =>
206206 min([totalAssetAmountWithProfit, assetBalance(this, b)])
207207 case _ =>
208208 throw("Match error")
209209 }
210210 if ((totalLpAmount == 0))
211211 then 0
212212 else totalAmount
213213 }
214214
215215
216216 func getCurrentPrice () = if ((totalLpAmount != 0))
217217 then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
218218 else scale18BigInt
219219
220220
221221 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
222222
223223
224224 func getUserAvailableAssetsToWithdraw (userAddress) = {
225225 let userLpAmount = getUserLpAmount(userAddress)
226226 let userAvailableAssetToWithdraw = toInt(fraction(toBigInt(userLpAmount), getCurrentPrice(), scale18BigInt))
227227 if ((0 > userAvailableAssetToWithdraw))
228228 then 0
229229 else userAvailableAssetToWithdraw
230230 }
231231
232232
233233 func getStakeActions (i,userAddress) = {
234234 let checks = [if ((size(i.payments) == 1))
235235 then true
236236 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
237237 then true
238238 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
239239 then true
240240 else "payment amount should be greater than 0"]
241241 if ((checks == checks))
242242 then {
243243 let paymentAmount = i.payments[0].amount
244244 let paymentLpAmount = toInt(fraction(toBigInt(paymentAmount), scale18BigInt, getCurrentPrice()))
245- if ((paymentLpAmount == paymentLpAmount))
246- then {
247- let userLpAmount = getUserLpAmount(userAddress)
248- let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
249- let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
250- let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
251- let newUserLpAmount = (userLpAmount + paymentLpAmount)
252- let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
253- let updateStartHeightAction = if ((totalLpAmount == 0))
254- then [IntegerEntry(keyStartBlock, height)]
255- else nil
256- ([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)] ++ updateStartHeightAction)
257- }
258- else throw("Strict value is not equal to itself.")
245+ let userLpAmount = getUserLpAmount(userAddress)
246+ let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
247+ let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
248+ let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
249+ let newUserLpAmount = (userLpAmount + paymentLpAmount)
250+ let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
251+ let updateStartHeightAction = if ((totalLpAmount == 0))
252+ then [IntegerEntry(keyStartBlock, height)]
253+ else nil
254+ ([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)] ++ updateStartHeightAction)
259255 }
260256 else throw("Strict value is not equal to itself.")
261257 }
262258
263259
264260 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
265261 let userAddress = toString(i.caller)
266262 let userLpAmount = getUserLpAmount(userAddress)
267263 let check = [if ((lpAssetWithdrawAmount > 0))
268264 then true
269265 else throwErr("LP amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
270266 then true
271267 else throwErr((("cannot withdraw more than available LP (" + toString(userLpAmount)) + ")"))]
272268 if ((check == check))
273269 then {
274270 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
275271 let withdrawAssetAmount = toInt(fraction(toBigInt(lpAssetWithdrawAmount), getCurrentPrice(), scale18BigInt))
276272 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
277273 let newTotalAssetAmount = toInt(fraction(toBigInt(newTotalLpAmount), getCurrentPrice(), scale18BigInt))
278274 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
279275 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
280276 [StringEntry(keyHistory("withdraw", userAddress, i.transactionId), formatHistory(calcTotalProfit(), getCurrentPrice(), totalAssetAmount, totalLpAmount)), IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
281277 }
282278 else throw("Strict value is not equal to itself.")
283279 }
284280
285281
286282 @Callable(i)
287283 func setEmissionPerBlock (emissionPerBlock) = {
288284 let check = [if ((i.caller == this))
289285 then true
290286 else throwErr("permission denied")]
291287 if ((check == check))
292288 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
293289 else throw("Strict value is not equal to itself.")
294290 }
295291
296292
297293
298294 @Callable(i)
299295 func stake () = getStakeActions(i, toString(i.caller))
300296
301297
302298
303299 @Callable(i)
304300 func stakeFor (userAddress) = {
305301 let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
306302 then true
307303 else throwErr("address is not valid")]
308304 if ((check == check))
309305 then getStakeActions(i, userAddress)
310306 else throw("Strict value is not equal to itself.")
311307 }
312308
313309
314310
315311 @Callable(i)
316312 func withdraw (withdrawAssetAmount) = {
317313 let userAddress = toString(i.caller)
318314 let userLpAmount = getUserLpAmount(userAddress)
319315 let lpAmountToWithdraw = toInt(fraction(toBigInt(withdrawAssetAmount), scale18BigInt, getCurrentPrice()))
320316 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
321317 let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
322318 let check = [if ((withdrawAssetAmount > 0))
323319 then true
324320 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
325321 then true
326322 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")")), if ((withdrawAssetAmount >= minWithdrawAssetAmount))
327323 then true
328324 else throwErr((("withdraw amount is too small. Min: (" + toString(minWithdrawAssetAmount)) + ")"))]
329325 if ((check == check))
330326 then getWithdrawActions(i, lpAmountToWithdraw)
331327 else throw("Strict value is not equal to itself.")
332328 }
333329
334330
335331
336332 @Callable(i)
337333 func getUserAssetsREADONLY (userAddress) = {
338334 let userLpAmount = getUserLpAmount(userAddress)
339335 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
340336 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
341337 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
342338 $Tuple2(nil, $Tuple5(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn))
343339 }
344340
345341
346342
347343 @Callable(i)
348344 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple3(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice()))
349345
350346
351347
352348 @Callable(i)
353349 func voteForTxId (txId) = {
354350 let callerAddressString = toBase58String(i.caller.bytes)
355351 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
356352 let result = [StringEntry(keyAllowedTxId(), txId)]
357353 let allowedTxIdOption = getString(this, keyAllowedTxId())
358354 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
359355 then true
360356 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
361357 then true
362358 else (value(allowedTxIdOption) != txId))
363359 then true
364360 else throwErr((txId + " is already allowed"))]
365361 if ((err == err))
366362 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
367363 else throw("Strict value is not equal to itself.")
368364 }
369365
370366
371367 @Verifier(tx)
372368 func verify () = {
373369 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
374370 let byOwner = if ((size(getAdminsList()) >= QUORUM))
375371 then false
376372 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
377373 if (byAdmins)
378374 then true
379375 else byOwner
380376 }
381377

github/deemru/w8io/3ef1775 
193.86 ms