tx · Ey95ev4ZQjzjxifq5tnLJ3VFZQkinZJpDAYq35oyXxuo

3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS:  -0.05000000 Waves

2023.07.28 14:27 [2685653] smart account 3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS > SELF 0.00000000 Waves

{ "type": 13, "id": "Ey95ev4ZQjzjxifq5tnLJ3VFZQkinZJpDAYq35oyXxuo", "fee": 5000000, "feeAssetId": null, "timestamp": 1690543652550, "version": 2, "chainId": 84, "sender": "3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS", "senderPublicKey": "8h7G4haeVwXKNHXNHsWkC1miUp5CQtk3WmpBKazQPxRh", "proofs": [ "3T8Hv2aaZDYrV94qkDe1oLjHDD2cg2XEqNQdDkFcEcZoaMkikhGM2iPTcTHxDSjHt76eoqyz9Ajq2DkzZhH3Boyx" ], "script": "base64:BgIfCAISAwoBARIAEgMKAQgSAwoBARIDCgEIEgASAwoBCC4ADGNvbnRyYWN0RmlsZQIRbDJtcF9zdGFraW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvABJBRERSRVNTX0JZVEVTX1NJWkUAGgANQkxPQ0tTX0lOX0RBWQCgCwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAATa2V5RW1pc3Npb25QZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDU0VQABlrZXlFbWlzc2lvblBlcmlvZEluQmxvY2tzCQC5CQIJAMwIAgICJXMJAMwIAgIWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVABD2tleVVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDHVzZXJMcEFtb3VudAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAADXRvdGFsTHBBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQa2V5VG90YWxMcEFtb3VudAAAABB0b3RhbEFzc2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleVRvdGFsQXNzZXRBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcAFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5RW1pc3Npb25QZXJpb2RJbkJsb2NrcwUNQkxPQ0tTX0lOX0RBWQARZW1pc3Npb25QZXJQZXJpb2QJAGgCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleUVtaXNzaW9uUGVyQmxvY2sAAAUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwAPaGVpZ2h0SW5QZXJpb2RzCQBrAwUGaGVpZ2h0AAEFFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDI2MzkyNjYzBQFhBAZyZXN1bHQIBQskdDAyNjM5MjY2MwJfMQQGcHJlZml4CAULJHQwMjYzOTI2NjMCXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAyODEwMjg5NAoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAyODEwMjg5NAJfMQQGcHJlZml4CAULJHQwMjgxMDI4OTQCXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2NhbGNUb3RhbFByb2ZpdAAECnN0YXJ0QmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUNa2V5U3RhcnRCbG9jawAABAtzdGFydFBlcmlvZAkAawMFCnN0YXJ0QmxvY2sAAQUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwQOZWxhcHNlZFBlcmlvZHMJAGUCBQ9oZWlnaHRJblBlcmlvZHMFC3N0YXJ0UGVyaW9kCQCWAwEJAMwIAgAACQDMCAIJAGgCBRFlbWlzc2lvblBlclBlcmlvZAUOZWxhcHNlZFBlcmlvZHMFA25pbAErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAEGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQBkAgUQdG90YWxBc3NldEFtb3VudAkBD2NhbGNUb3RhbFByb2ZpdAAEC3RvdGFsQW1vdW50BAckbWF0Y2gwBQxhc3NldElkQnl0ZXMDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAkAlwMBCQDMCAIFGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQDMCAIICQDvBwEFBHRoaXMJYXZhaWxhYmxlBQNuaWwDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkAlwMBCQDMCAIFGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQDMCAIJAPAHAgUEdGhpcwUBYgUDbmlsCQACAQILTWF0Y2ggZXJyb3IDCQAAAgUNdG90YWxMcEFtb3VudAAAAAAFC3RvdGFsQW1vdW50AQ9nZXRDdXJyZW50UHJpY2UAAwkBAiE9AgUNdG90YWxMcEFtb3VudAAACQBrAwkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUABQZzY2FsZTgFDXRvdGFsTHBBbW91bnQJAGgCAAEFBnNjYWxlOAEPZ2V0VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MAAAEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkAawMFDHVzZXJMcEFtb3VudAkBD2dldEN1cnJlbnRQcmljZQAFBnNjYWxlOAMJAGYCAAAFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcAAAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwEPZ2V0U3Rha2VBY3Rpb25zAgFpC3VzZXJBZGRyZXNzBAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhhzaG91bGQgaW5jbHVkZSAxIHBheW1lbnQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJAKwCAgIVcGF5bWVudCBzaG91bGQgYmUgaW4gBQ1hc3NldElkU3RyaW5nCQDMCAIDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAYCJ3BheW1lbnQgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1wYXltZW50QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPcGF5bWVudExwQW1vdW50CQBrAwUNcGF5bWVudEFtb3VudAUGc2NhbGU4CQEPZ2V0Q3VycmVudFByaWNlAAQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEFXVzZXJUb3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwAABBBuZXdUb3RhbExwQW1vdW50CQBkAgUNdG90YWxMcEFtb3VudAUPcGF5bWVudExwQW1vdW50BBNuZXdUb3RhbEFzc2V0QW1vdW50CQBkAgUQdG90YWxBc3NldEFtb3VudAUNcGF5bWVudEFtb3VudAQPbmV3VXNlckxwQW1vdW50CQBkAgUMdXNlckxwQW1vdW50BQ9wYXltZW50THBBbW91bnQEGG5ld1VzZXJUb3RhbFN0YWtlZEFtb3VudAkAZAIFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUNcGF5bWVudEFtb3VudAQXdXBkYXRlU3RhcnRIZWlnaHRBY3Rpb24DCQAAAgUNdG90YWxMcEFtb3VudAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwUYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50BQNuaWwFF3VwZGF0ZVN0YXJ0SGVpZ2h0QWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARJnZXRXaXRoZHJhd0FjdGlvbnMCAWkVbHBBc3NldFdpdGhkcmF3QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBAVjaGVjawkAzAgCAwkAZgIFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAAABgkBCHRocm93RXJyAQIfTFAgYW1vdW50IHNob3VsZCBiZSBtb3JlIHRoYW4gMAkAzAgCAwkAZwIFDHVzZXJMcEFtb3VudAUVbHBBc3NldFdpdGhkcmF3QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICKGNhbm5vdCB3aXRoZHJhdyBtb3JlIHRoYW4gYXZhaWxhYmxlIExQICgJAKQDAQUMdXNlckxwQW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBA9uZXdVc2VyTHBBbW91bnQJAGUCBQx1c2VyTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTd2l0aGRyYXdBc3NldEFtb3VudAkAawMFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAkBD2dldEN1cnJlbnRQcmljZQAFBnNjYWxlOAQQbmV3VG90YWxMcEFtb3VudAkAZQIFDXRvdGFsTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTbmV3VG90YWxBc3NldEFtb3VudAkAawMFEG5ld1RvdGFsTHBBbW91bnQJAQ9nZXRDdXJyZW50UHJpY2UABQZzY2FsZTgEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAEGm5ld1VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQBkAgUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24FE3dpdGhkcmF3QXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwUabmV3VXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFE3dpdGhkcmF3QXNzZXRBbW91bnQFDGFzc2V0SWRCeXRlcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBwFpARNzZXRFbWlzc2lvblBlckJsb2NrARBlbWlzc2lvblBlckJsb2NrBAVjaGVjawkAzAgCAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5RW1pc3Npb25QZXJCbG9jawkAlgMBCQDMCAIAAAkAzAgCBRBlbWlzc2lvblBlckJsb2NrBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAJAQ9nZXRTdGFrZUFjdGlvbnMCBQFpCQClCAEIBQFpBmNhbGxlcgFpAQhzdGFrZUZvcgELdXNlckFkZHJlc3MEBWNoZWNrCQDMCAIDCQAAAgkAyAEBCQDZBAEFC3VzZXJBZGRyZXNzBRJBRERSRVNTX0JZVEVTX1NJWkUGCQEIdGhyb3dFcnIBAhRhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3ARN3aXRoZHJhd0Fzc2V0QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBJscEFtb3VudFRvV2l0aGRyYXcJAGsDBRN3aXRoZHJhd0Fzc2V0QW1vdW50BQZzY2FsZTgJAQ9nZXRDdXJyZW50UHJpY2UABBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQWbWluV2l0aGRyYXdBc3NldEFtb3VudAkAbgQJAQ9nZXRDdXJyZW50UHJpY2UAAAEFBnNjYWxlOAUHQ0VJTElORwQFY2hlY2sJAMwIAgMJAGYCBRN3aXRoZHJhd0Fzc2V0QW1vdW50AAAGCQEIdGhyb3dFcnIBAiV3aXRoZHJhdyBhbW91bnQgc2hvdWxkIGJlIG1vcmUgdGhhbiAwCQDMCAIDCQBnAgUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwUTd2l0aGRyYXdBc3NldEFtb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiVjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSAoCQCkAwEFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcCASkJAMwIAgMJAGcCBRN3aXRoZHJhd0Fzc2V0QW1vdW50BRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICJHdpdGhkcmF3IGFtb3VudCBpcyB0b28gc21hbGwuIE1pbjogKAkApAMBBRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQESZ2V0V2l0aGRyYXdBY3Rpb25zAgUBaQUSbHBBbW91bnRUb1dpdGhkcmF3CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFWdldFVzZXJBc3NldHNSRUFET05MWQELdXNlckFkZHJlc3MEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQVdXNlclRvdGFsU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzAAAEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAJAJQKAgUDbmlsCQCXCgUFDHVzZXJMcEFtb3VudAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkBD2dldEN1cnJlbnRQcmljZQAFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24BaQEWZ2V0VG90YWxBc3NldHNSRUFET05MWQAJAJQKAgUDbmlsCQCVCgMFDXRvdGFsTHBBbW91bnQJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAkBD2dldEN1cnJlbnRQcmljZQABaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVyDjHUaQ==", "height": 2685653, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: vHYMbbJP8uE7VcxZnHFz9nBMBeSLdy1SCisTgNfkDs3 Next: DcnuuFfkHwSRmQJz4b88tRFeeyGNbMcGQ8Tetory6KJB Diff:
OldNewDifferences
66 let SEP = "__"
77
88 let scale8 = 100000000
9-
10-let scale18 = 1000000000000000000
11-
12-let scale18BigInt = toBigInt(scale18)
139
1410 let ADDRESS_BYTES_SIZE = 26
1511
3935 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
4036
4137
42-func keyHistory (type,userAddress,txId) = makeString(["%s%s%s", type, userAddress, toBase58String(txId)], SEP)
43-
44-
45-func formatHistory (totalProfit,price,totalAssetAmount,totalLpAmount) = makeString(["%d%d", toString(totalProfit), toString(price), toString(totalAssetAmount), toString(totalLpAmount)], SEP)
46-
47-
4838 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
4939
5040 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
5848 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
5949
6050 let emissionPerPeriod = (valueOrElse(getInteger(this, keyEmissionPerBlock), 0) * emissionPeriodInBlocks)
51+
52+let heightInPeriods = fraction(height, 1, emissionPeriodInBlocks)
6153
6254 let ADMIN_LIST_SIZE = 5
6355
9587
9688
9789 func genVotesKeysHelper (a,adminAddress) = {
98- let $t030453069 = a
99- let result = $t030453069._1
100- let prefix = $t030453069._2
90+ let $t026392663 = a
91+ let result = $t026392663._1
92+ let prefix = $t026392663._2
10193 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
10294 }
10395
10496
10597 func genVotesKeys (keyPrefix) = {
10698 let adminList = keyAdminAddressList()
107- let $t032163300 = {
99+ let $t028102894 = {
108100 let $l = getAdminsList()
109101 let $s = size($l)
110102 let $acc0 = $Tuple2(nil, keyPrefix)
118110
119111 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
120112 }
121- let result = $t032163300._1
122- let prefix = $t032163300._2
113+ let result = $t028102894._1
114+ let prefix = $t028102894._2
123115 result
124116 }
125117
186178 }
187179
188180
189-func calcTotalProfitForHeight (h) = {
181+func calcTotalProfit () = {
190182 let startBlock = valueOrElse(getInteger(this, keyStartBlock), 0)
191183 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
192- let elapsedPeriods = ((h / emissionPeriodInBlocks) - startPeriod)
184+ let elapsedPeriods = (heightInPeriods - startPeriod)
193185 max([0, (emissionPerPeriod * elapsedPeriods)])
194186 }
195-
196-
197-func calcTotalProfit () = calcTotalProfitForHeight(height)
198187
199188
200189 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
214203
215204
216205 func getCurrentPrice () = if ((totalLpAmount != 0))
217- then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
218- else scale18BigInt
206+ then fraction(getTotalAssetAmountWithProfitOrMaxAvailable(), scale8, totalLpAmount)
207+ else (1 * scale8)
219208
220209
221210 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
223212
224213 func getUserAvailableAssetsToWithdraw (userAddress) = {
225214 let userLpAmount = getUserLpAmount(userAddress)
226- let userAvailableAssetToWithdraw = toInt(fraction(toBigInt(userLpAmount), getCurrentPrice(), scale18BigInt))
215+ let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
227216 if ((0 > userAvailableAssetToWithdraw))
228217 then 0
229218 else userAvailableAssetToWithdraw
241230 if ((checks == checks))
242231 then {
243232 let paymentAmount = i.payments[0].amount
244- let paymentLpAmount = toInt(fraction(toBigInt(paymentAmount), scale18BigInt, getCurrentPrice()))
233+ let paymentLpAmount = fraction(paymentAmount, scale8, getCurrentPrice())
245234 let userLpAmount = getUserLpAmount(userAddress)
246235 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
247236 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
251240 let updateStartHeightAction = if ((totalLpAmount == 0))
252241 then [IntegerEntry(keyStartBlock, height)]
253242 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)
243+ ([IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount)] ++ updateStartHeightAction)
255244 }
256245 else throw("Strict value is not equal to itself.")
257246 }
268257 if ((check == check))
269258 then {
270259 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
271- let withdrawAssetAmount = toInt(fraction(toBigInt(lpAssetWithdrawAmount), getCurrentPrice(), scale18BigInt))
260+ let withdrawAssetAmount = fraction(lpAssetWithdrawAmount, getCurrentPrice(), scale8)
272261 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
273- let newTotalAssetAmount = toInt(fraction(toBigInt(newTotalLpAmount), getCurrentPrice(), scale18BigInt))
262+ let newTotalAssetAmount = fraction(newTotalLpAmount, getCurrentPrice(), scale8)
274263 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
275264 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
276-[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)]
265+[IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
277266 }
278267 else throw("Strict value is not equal to itself.")
279268 }
312301 func withdraw (withdrawAssetAmount) = {
313302 let userAddress = toString(i.caller)
314303 let userLpAmount = getUserLpAmount(userAddress)
315- let lpAmountToWithdraw = toInt(fraction(toBigInt(withdrawAssetAmount), scale18BigInt, getCurrentPrice()))
304+ let lpAmountToWithdraw = fraction(withdrawAssetAmount, scale8, getCurrentPrice())
316305 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
317- let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
306+ let minWithdrawAssetAmount = fraction(getCurrentPrice(), 1, scale8, CEILING)
318307 let check = [if ((withdrawAssetAmount > 0))
319308 then true
320309 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
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
9-
10-let scale18 = 1000000000000000000
11-
12-let scale18BigInt = toBigInt(scale18)
139
1410 let ADDRESS_BYTES_SIZE = 26
1511
1612 let BLOCKS_IN_DAY = 1440
1713
1814 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1915
2016
2117 let keyAssetId = makeString(["%s", "assetId"], SEP)
2218
2319 let keyEmissionPerBlock = makeString(["%s", "emissionPerBlock"], SEP)
2420
2521 let keyEmissionPeriodInBlocks = makeString(["%s", "emissionPeriodInBlocks"], SEP)
2622
2723 let keyStartBlock = makeString(["%s", "startBlock"], SEP)
2824
2925 let keyTotalLpAmount = makeString(["%s", "totalLpAmount"], SEP)
3026
3127 let keyTotalAssetAmount = makeString(["%s", "totalAssetAmount"], SEP)
3228
3329 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
3430
3531
3632 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
3733
3834
3935 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
4036
4137
42-func keyHistory (type,userAddress,txId) = makeString(["%s%s%s", type, userAddress, toBase58String(txId)], SEP)
43-
44-
45-func formatHistory (totalProfit,price,totalAssetAmount,totalLpAmount) = makeString(["%d%d", toString(totalProfit), toString(price), toString(totalAssetAmount), toString(totalLpAmount)], SEP)
46-
47-
4838 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
4939
5040 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
5141
5242 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
5343
5444 let assetIdBytes = if ((assetIdString == "WAVES"))
5545 then unit
5646 else fromBase58String(assetIdString)
5747
5848 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
5949
6050 let emissionPerPeriod = (valueOrElse(getInteger(this, keyEmissionPerBlock), 0) * emissionPeriodInBlocks)
51+
52+let heightInPeriods = fraction(height, 1, emissionPeriodInBlocks)
6153
6254 let ADMIN_LIST_SIZE = 5
6355
6456 let QUORUM = 3
6557
6658 let TXID_BYTES_LENGTH = 32
6759
6860 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
6961
7062
7163 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
7264
7365
7466 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
7567
7668
7769 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
7870
7971
8072 func getAdminVote (prefix,admin) = {
8173 let voteKey = keyFullAdminVote(prefix, admin)
8274 valueOrElse(getInteger(voteKey), 0)
8375 }
8476
8577
8678 func getAdminsList () = match getString(this, keyAdminAddressList()) {
8779 case s: String =>
8880 split(s, SEP)
8981 case _ =>
9082 nil
9183 }
9284
9385
9486 func isInAdminList (address) = containsElement(getAdminsList(), address)
9587
9688
9789 func genVotesKeysHelper (a,adminAddress) = {
98- let $t030453069 = a
99- let result = $t030453069._1
100- let prefix = $t030453069._2
90+ let $t026392663 = a
91+ let result = $t026392663._1
92+ let prefix = $t026392663._2
10193 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
10294 }
10395
10496
10597 func genVotesKeys (keyPrefix) = {
10698 let adminList = keyAdminAddressList()
107- let $t032163300 = {
99+ let $t028102894 = {
108100 let $l = getAdminsList()
109101 let $s = size($l)
110102 let $acc0 = $Tuple2(nil, keyPrefix)
111103 func $f0_1 ($a,$i) = if (($i >= $s))
112104 then $a
113105 else genVotesKeysHelper($a, $l[$i])
114106
115107 func $f0_2 ($a,$i) = if (($i >= $s))
116108 then $a
117109 else throw("List size exceeds 5")
118110
119111 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
120112 }
121- let result = $t032163300._1
122- let prefix = $t032163300._2
113+ let result = $t028102894._1
114+ let prefix = $t028102894._2
123115 result
124116 }
125117
126118
127119 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
128120
129121
130122 func countVotes (prefix) = {
131123 let votes = genVotesKeys(prefix)
132124 let $l = votes
133125 let $s = size($l)
134126 let $acc0 = 0
135127 func $f0_1 ($a,$i) = if (($i >= $s))
136128 then $a
137129 else countVotesHelper($a, $l[$i])
138130
139131 func $f0_2 ($a,$i) = if (($i >= $s))
140132 then $a
141133 else throw("List size exceeds 5")
142134
143135 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
144136 }
145137
146138
147139 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
148140
149141
150142 func getClearVoteEntries (prefix) = {
151143 let votes = genVotesKeys(prefix)
152144 let $l = votes
153145 let $s = size($l)
154146 let $acc0 = nil
155147 func $f0_1 ($a,$i) = if (($i >= $s))
156148 then $a
157149 else clearVotesHelper($a, $l[$i])
158150
159151 func $f0_2 ($a,$i) = if (($i >= $s))
160152 then $a
161153 else throw("List size exceeds 5")
162154
163155 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
164156 }
165157
166158
167159 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
168160 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
169161 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
170162 let err = if (!(isInAdminList(callerAddressString)))
171163 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
172164 else if ((adminCurrentVote == 1))
173165 then throwErr((voteKey + " you already voted"))
174166 else unit
175167 if ((err == err))
176168 then {
177169 let votes = countVotes(keyPrefix)
178170 if (((votes + 1) >= minVotes))
179171 then {
180172 let clearVoteEntries = getClearVoteEntries(keyPrefix)
181173 (clearVoteEntries ++ voteResult)
182174 }
183175 else [IntegerEntry(voteKey, 1)]
184176 }
185177 else throw("Strict value is not equal to itself.")
186178 }
187179
188180
189-func calcTotalProfitForHeight (h) = {
181+func calcTotalProfit () = {
190182 let startBlock = valueOrElse(getInteger(this, keyStartBlock), 0)
191183 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
192- let elapsedPeriods = ((h / emissionPeriodInBlocks) - startPeriod)
184+ let elapsedPeriods = (heightInPeriods - startPeriod)
193185 max([0, (emissionPerPeriod * elapsedPeriods)])
194186 }
195-
196-
197-func calcTotalProfit () = calcTotalProfitForHeight(height)
198187
199188
200189 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
201190 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
202191 let totalAmount = match assetIdBytes {
203192 case u: Unit =>
204193 min([totalAssetAmountWithProfit, wavesBalance(this).available])
205194 case b: ByteVector =>
206195 min([totalAssetAmountWithProfit, assetBalance(this, b)])
207196 case _ =>
208197 throw("Match error")
209198 }
210199 if ((totalLpAmount == 0))
211200 then 0
212201 else totalAmount
213202 }
214203
215204
216205 func getCurrentPrice () = if ((totalLpAmount != 0))
217- then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
218- else scale18BigInt
206+ then fraction(getTotalAssetAmountWithProfitOrMaxAvailable(), scale8, totalLpAmount)
207+ else (1 * scale8)
219208
220209
221210 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
222211
223212
224213 func getUserAvailableAssetsToWithdraw (userAddress) = {
225214 let userLpAmount = getUserLpAmount(userAddress)
226- let userAvailableAssetToWithdraw = toInt(fraction(toBigInt(userLpAmount), getCurrentPrice(), scale18BigInt))
215+ let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
227216 if ((0 > userAvailableAssetToWithdraw))
228217 then 0
229218 else userAvailableAssetToWithdraw
230219 }
231220
232221
233222 func getStakeActions (i,userAddress) = {
234223 let checks = [if ((size(i.payments) == 1))
235224 then true
236225 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
237226 then true
238227 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
239228 then true
240229 else "payment amount should be greater than 0"]
241230 if ((checks == checks))
242231 then {
243232 let paymentAmount = i.payments[0].amount
244- let paymentLpAmount = toInt(fraction(toBigInt(paymentAmount), scale18BigInt, getCurrentPrice()))
233+ let paymentLpAmount = fraction(paymentAmount, scale8, getCurrentPrice())
245234 let userLpAmount = getUserLpAmount(userAddress)
246235 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
247236 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
248237 let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
249238 let newUserLpAmount = (userLpAmount + paymentLpAmount)
250239 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
251240 let updateStartHeightAction = if ((totalLpAmount == 0))
252241 then [IntegerEntry(keyStartBlock, height)]
253242 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)
243+ ([IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount)] ++ updateStartHeightAction)
255244 }
256245 else throw("Strict value is not equal to itself.")
257246 }
258247
259248
260249 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
261250 let userAddress = toString(i.caller)
262251 let userLpAmount = getUserLpAmount(userAddress)
263252 let check = [if ((lpAssetWithdrawAmount > 0))
264253 then true
265254 else throwErr("LP amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
266255 then true
267256 else throwErr((("cannot withdraw more than available LP (" + toString(userLpAmount)) + ")"))]
268257 if ((check == check))
269258 then {
270259 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
271- let withdrawAssetAmount = toInt(fraction(toBigInt(lpAssetWithdrawAmount), getCurrentPrice(), scale18BigInt))
260+ let withdrawAssetAmount = fraction(lpAssetWithdrawAmount, getCurrentPrice(), scale8)
272261 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
273- let newTotalAssetAmount = toInt(fraction(toBigInt(newTotalLpAmount), getCurrentPrice(), scale18BigInt))
262+ let newTotalAssetAmount = fraction(newTotalLpAmount, getCurrentPrice(), scale8)
274263 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
275264 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
276-[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)]
265+[IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
277266 }
278267 else throw("Strict value is not equal to itself.")
279268 }
280269
281270
282271 @Callable(i)
283272 func setEmissionPerBlock (emissionPerBlock) = {
284273 let check = [if ((i.caller == this))
285274 then true
286275 else throwErr("permission denied")]
287276 if ((check == check))
288277 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
289278 else throw("Strict value is not equal to itself.")
290279 }
291280
292281
293282
294283 @Callable(i)
295284 func stake () = getStakeActions(i, toString(i.caller))
296285
297286
298287
299288 @Callable(i)
300289 func stakeFor (userAddress) = {
301290 let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
302291 then true
303292 else throwErr("address is not valid")]
304293 if ((check == check))
305294 then getStakeActions(i, userAddress)
306295 else throw("Strict value is not equal to itself.")
307296 }
308297
309298
310299
311300 @Callable(i)
312301 func withdraw (withdrawAssetAmount) = {
313302 let userAddress = toString(i.caller)
314303 let userLpAmount = getUserLpAmount(userAddress)
315- let lpAmountToWithdraw = toInt(fraction(toBigInt(withdrawAssetAmount), scale18BigInt, getCurrentPrice()))
304+ let lpAmountToWithdraw = fraction(withdrawAssetAmount, scale8, getCurrentPrice())
316305 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
317- let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
306+ let minWithdrawAssetAmount = fraction(getCurrentPrice(), 1, scale8, CEILING)
318307 let check = [if ((withdrawAssetAmount > 0))
319308 then true
320309 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
321310 then true
322311 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")")), if ((withdrawAssetAmount >= minWithdrawAssetAmount))
323312 then true
324313 else throwErr((("withdraw amount is too small. Min: (" + toString(minWithdrawAssetAmount)) + ")"))]
325314 if ((check == check))
326315 then getWithdrawActions(i, lpAmountToWithdraw)
327316 else throw("Strict value is not equal to itself.")
328317 }
329318
330319
331320
332321 @Callable(i)
333322 func getUserAssetsREADONLY (userAddress) = {
334323 let userLpAmount = getUserLpAmount(userAddress)
335324 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
336325 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
337326 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
338327 $Tuple2(nil, $Tuple5(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn))
339328 }
340329
341330
342331
343332 @Callable(i)
344333 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple3(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice()))
345334
346335
347336
348337 @Callable(i)
349338 func voteForTxId (txId) = {
350339 let callerAddressString = toBase58String(i.caller.bytes)
351340 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
352341 let result = [StringEntry(keyAllowedTxId(), txId)]
353342 let allowedTxIdOption = getString(this, keyAllowedTxId())
354343 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
355344 then true
356345 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
357346 then true
358347 else (value(allowedTxIdOption) != txId))
359348 then true
360349 else throwErr((txId + " is already allowed"))]
361350 if ((err == err))
362351 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
363352 else throw("Strict value is not equal to itself.")
364353 }
365354
366355
367356 @Verifier(tx)
368357 func verify () = {
369358 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
370359 let byOwner = if ((size(getAdminsList()) >= QUORUM))
371360 then false
372361 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
373362 if (byAdmins)
374363 then true
375364 else byOwner
376365 }
377366

github/deemru/w8io/3ef1775 
81.13 ms