tx · Cu9nbuRYnzp6mnG9G5PtcXHEpno634FUkFhFcxZ8DiZC

3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS:  -0.05000000 Waves

2023.07.27 17:11 [2684367] smart account 3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS > SELF 0.00000000 Waves

{ "type": 13, "id": "Cu9nbuRYnzp6mnG9G5PtcXHEpno634FUkFhFcxZ8DiZC", "fee": 5000000, "feeAssetId": null, "timestamp": 1690467165280, "version": 2, "chainId": 84, "sender": "3N4yYqBkTUq1mDdHhvAd3St7spCbm84DytS", "senderPublicKey": "8h7G4haeVwXKNHXNHsWkC1miUp5CQtk3WmpBKazQPxRh", "proofs": [ "5Gvu5Usr9uFrxMvQbqXsBwxFU41x6g2yR83teEhoQwxMTojjiQjdJiQZLCuzbgQrK4AMgi95ZRdGAwQxM5yJJvg1" ], "script": "base64:BgIfCAISAwoBARIAEgMKAQgSAwoBARIDCgEIEgASAwoBCC4ADGNvbnRyYWN0RmlsZQIRbDJtcF9zdGFraW5nLnJpZGUAA1NFUAICX18ABnNjYWxlOACAwtcvABJBRERSRVNTX0JZVEVTX1NJWkUAGgANQkxPQ0tTX0lOX0RBWQCgCwEIdGhyb3dFcnIBA21zZwkAAgEJAKwCAgkArAICBQxjb250cmFjdEZpbGUCAjogBQNtc2cACmtleUFzc2V0SWQJALkJAgkAzAgCAgIlcwkAzAgCAgdhc3NldElkBQNuaWwFA1NFUAATa2V5RW1pc3Npb25QZXJCbG9jawkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uUGVyQmxvY2sFA25pbAUDU0VQABlrZXlFbWlzc2lvblBlcmlvZEluQmxvY2tzCQC5CQIJAMwIAgICJXMJAMwIAgIWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVABD2tleVVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDHVzZXJMcEFtb3VudAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAADXRvdGFsTHBBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQa2V5VG90YWxMcEFtb3VudAAAABB0b3RhbEFzc2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleVRvdGFsQXNzZXRBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcAFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5RW1pc3Npb25QZXJpb2RJbkJsb2NrcwUNQkxPQ0tTX0lOX0RBWQARZW1pc3Npb25QZXJQZXJpb2QJAGgCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleUVtaXNzaW9uUGVyQmxvY2sAAAUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwAPaGVpZ2h0SW5QZXJpb2RzCQBrAwUGaGVpZ2h0AAEFFmVtaXNzaW9uUGVyaW9kSW5CbG9ja3MAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDI2MzkyNjYzBQFhBAZyZXN1bHQIBQskdDAyNjM5MjY2MwJfMQQGcHJlZml4CAULJHQwMjYzOTI2NjMCXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAyODEwMjg5NAoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAyODEwMjg5NAJfMQQGcHJlZml4CAULJHQwMjgxMDI4OTQCXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BD2NhbGNUb3RhbFByb2ZpdAAECnN0YXJ0QmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUNa2V5U3RhcnRCbG9jawAABAtzdGFydFBlcmlvZAkAawMFCnN0YXJ0QmxvY2sAAQUWZW1pc3Npb25QZXJpb2RJbkJsb2NrcwQOZWxhcHNlZFBlcmlvZHMJAGUCBQ9oZWlnaHRJblBlcmlvZHMFC3N0YXJ0UGVyaW9kCQCWAwEJAMwIAgAACQDMCAIJAGgCBRFlbWlzc2lvblBlclBlcmlvZAUOZWxhcHNlZFBlcmlvZHMFA25pbAErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAEGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQBkAgUQdG90YWxBc3NldEFtb3VudAkBD2NhbGNUb3RhbFByb2ZpdAAEC3RvdGFsQW1vdW50BAckbWF0Y2gwBQxhc3NldElkQnl0ZXMDCQABAgUHJG1hdGNoMAIEVW5pdAQBdQUHJG1hdGNoMAkAlwMBCQDMCAIFGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQDMCAIICQDvBwEFBHRoaXMJYXZhaWxhYmxlBQNuaWwDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkAlwMBCQDMCAIFGnRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0CQDMCAIJAPAHAgUEdGhpcwUBYgUDbmlsCQACAQILTWF0Y2ggZXJyb3IDCQAAAgUNdG90YWxMcEFtb3VudAAAAAAFC3RvdGFsQW1vdW50AQ9nZXRDdXJyZW50UHJpY2UAAwkBAiE9AgUNdG90YWxMcEFtb3VudAAACQBrAwkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUABQZzY2FsZTgFDXRvdGFsTHBBbW91bnQJAGgCAAEFBnNjYWxlOAEPZ2V0VXNlckxwQW1vdW50AQt1c2VyQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MAAAEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBC3VzZXJBZGRyZXNzBAx1c2VyTHBBbW91bnQJAQ9nZXRVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwQcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkAawMFDHVzZXJMcEFtb3VudAkBD2dldEN1cnJlbnRQcmljZQAFBnNjYWxlOAMJAGYCAAAFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcAAAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwEPZ2V0U3Rha2VBY3Rpb25zAgFpC3VzZXJBZGRyZXNzBAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhhzaG91bGQgaW5jbHVkZSAxIHBheW1lbnQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJAKwCAgIVcGF5bWVudCBzaG91bGQgYmUgaW4gBQ1hc3NldElkU3RyaW5nCQDMCAIDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAYCJ3BheW1lbnQgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1wYXltZW50QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPcGF5bWVudExwQW1vdW50CQBrAwUNcGF5bWVudEFtb3VudAUGc2NhbGU4CQEPZ2V0Q3VycmVudFByaWNlAAQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEFXVzZXJUb3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwAABBBuZXdUb3RhbExwQW1vdW50CQBkAgUNdG90YWxMcEFtb3VudAUPcGF5bWVudExwQW1vdW50BBNuZXdUb3RhbEFzc2V0QW1vdW50CQBkAgUQdG90YWxBc3NldEFtb3VudAUNcGF5bWVudEFtb3VudAQPbmV3VXNlckxwQW1vdW50CQBkAgUMdXNlckxwQW1vdW50BQ9wYXltZW50THBBbW91bnQEGG5ld1VzZXJUb3RhbFN0YWtlZEFtb3VudAkAZAIFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUNcGF5bWVudEFtb3VudAQXdXBkYXRlU3RhcnRIZWlnaHRBY3Rpb24DCQAAAgUNdG90YWxMcEFtb3VudAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwUYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50BQNuaWwFF3VwZGF0ZVN0YXJ0SGVpZ2h0QWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARJnZXRXaXRoZHJhd0FjdGlvbnMCAWkVbHBBc3NldFdpdGhkcmF3QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBAVjaGVjawkAzAgCAwkAZgIFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAAABgkBCHRocm93RXJyAQIfTFAgYW1vdW50IHNob3VsZCBiZSBtb3JlIHRoYW4gMAkAzAgCAwkAZwIFDHVzZXJMcEFtb3VudAUVbHBBc3NldFdpdGhkcmF3QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICKGNhbm5vdCB3aXRoZHJhdyBtb3JlIHRoYW4gYXZhaWxhYmxlIExQICgJAKQDAQUMdXNlckxwQW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBA9uZXdVc2VyTHBBbW91bnQJAGUCBQx1c2VyTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTd2l0aGRyYXdBc3NldEFtb3VudAkAawMFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAkBD2dldEN1cnJlbnRQcmljZQAFBnNjYWxlOAQQbmV3VG90YWxMcEFtb3VudAkAZQIFDXRvdGFsTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTbmV3VG90YWxBc3NldEFtb3VudAkAawMFEG5ld1RvdGFsTHBBbW91bnQJAQ9nZXRDdXJyZW50UHJpY2UABQZzY2FsZTgEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAEGm5ld1VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQBkAgUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24FE3dpdGhkcmF3QXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwUabmV3VXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFE3dpdGhkcmF3QXNzZXRBbW91bnQFDGFzc2V0SWRCeXRlcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBwFpARNzZXRFbWlzc2lvblBlckJsb2NrARBlbWlzc2lvblBlckJsb2NrBAVjaGVjawkAzAgCAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5RW1pc3Npb25QZXJCbG9jawkAlgMBCQDMCAIAAAkAzAgCBRBlbWlzc2lvblBlckJsb2NrBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAJAQ9nZXRTdGFrZUFjdGlvbnMCBQFpCQClCAEIBQFpBmNhbGxlcgFpAQhzdGFrZUZvcgELdXNlckFkZHJlc3MEBWNoZWNrCQDMCAIDCQAAAgkAyAEBCQDZBAEFC3VzZXJBZGRyZXNzBRJBRERSRVNTX0JZVEVTX1NJWkUGCQEIdGhyb3dFcnIBAhRhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3ARN3aXRoZHJhd0Fzc2V0QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBJscEFtb3VudFRvV2l0aGRyYXcJAGsDBRN3aXRoZHJhd0Fzc2V0QW1vdW50BQZzY2FsZTgJAQ9nZXRDdXJyZW50UHJpY2UABBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQWbWluV2l0aGRyYXdBc3NldEFtb3VudAkAbgQJAQ9nZXRDdXJyZW50UHJpY2UAAAEFBnNjYWxlOAUHQ0VJTElORwQFY2hlY2sJAMwIAgMJAGYCBRN3aXRoZHJhd0Fzc2V0QW1vdW50AAAGCQEIdGhyb3dFcnIBAiV3aXRoZHJhdyBhbW91bnQgc2hvdWxkIGJlIG1vcmUgdGhhbiAwCQDMCAIDCQBnAgUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwUTd2l0aGRyYXdBc3NldEFtb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiVjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSAoCQCkAwEFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcCASkJAMwIAgMJAGcCBRN3aXRoZHJhd0Fzc2V0QW1vdW50BRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICJHdpdGhkcmF3IGFtb3VudCBpcyB0b28gc21hbGwuIE1pbjogKAkApAMBBRZtaW5XaXRoZHJhd0Fzc2V0QW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQESZ2V0V2l0aGRyYXdBY3Rpb25zAgUBaQUSbHBBbW91bnRUb1dpdGhkcmF3CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFWdldFVzZXJBc3NldHNSRUFET05MWQELdXNlckFkZHJlc3MEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQVdXNlclRvdGFsU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARdrZXlVc2VyVG90YWxBc3NldFN0YWtlZAEFC3VzZXJBZGRyZXNzAAAEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAJAJQKAgUDbmlsCQCXCgUFDHVzZXJMcEFtb3VudAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwkBD2dldEN1cnJlbnRQcmljZQAFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24BaQEWZ2V0VG90YWxBc3NldHNSRUFET05MWQAJAJQKAgUDbmlsCQCVCgMFDXRvdGFsTHBBbW91bnQJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAkBD2dldEN1cnJlbnRQcmljZQABaQELdm90ZUZvclR4SWQBBHR4SWQEE2NhbGxlckFkZHJlc3NTdHJpbmcJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJa2V5UHJlZml4CQEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQUEdHhJZAQGcmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlBbGxvd2VkVHhJZAAFBHR4SWQFA25pbAQRYWxsb3dlZFR4SWRPcHRpb24JAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAQDZXJyCQDMCAIDCQAAAgkAyAEBCQDZBAEFBHR4SWQFEVRYSURfQllURVNfTEVOR1RIBgkBCHRocm93RXJyAQkArAICBQR0eElkAhIgaXMgbm90IHZhbGlkIHR4SWQJAMwIAgMDCQAAAgURYWxsb3dlZFR4SWRPcHRpb24FBHVuaXQGCQECIT0CCQEFdmFsdWUBBRFhbGxvd2VkVHhJZE9wdGlvbgUEdHhJZAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAITIGlzIGFscmVhZHkgYWxsb3dlZAUDbmlsAwkAAAIFA2VycgUDZXJyCQEMdm90ZUlOVEVSTkFMBAUTY2FsbGVyQWRkcmVzc1N0cmluZwUJa2V5UHJlZml4BQZRVU9SVU0FBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAECGJ5QWRtaW5zCQAAAggFAnR4AmlkCQDZBAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleUFsbG93ZWRUeElkAAIABAdieU93bmVyAwkAZwIJAJADAQkBDWdldEFkbWluc0xpc3QABQZRVU9SVU0HCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5AwUIYnlBZG1pbnMGBQdieU93bmVyDjHUaQ==", "height": 2684367, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8aENJkbJ12YCMx44hF82LXTgr6rJ6jzBoDbzTfCgMZ9u Next: AGjL9A1ko7nEeKS1JH8h3fobUpARHArxZAdiyw2x6Vse 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
9187
9288
9389 func genVotesKeysHelper (a,adminAddress) = {
94- let $t027182742 = a
95- let result = $t027182742._1
96- let prefix = $t027182742._2
90+ let $t026392663 = a
91+ let result = $t026392663._1
92+ let prefix = $t026392663._2
9793 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
9894 }
9995
10096
10197 func genVotesKeys (keyPrefix) = {
10298 let adminList = keyAdminAddressList()
103- let $t028892973 = {
99+ let $t028102894 = {
104100 let $l = getAdminsList()
105101 let $s = size($l)
106102 let $acc0 = $Tuple2(nil, keyPrefix)
114110
115111 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
116112 }
117- let result = $t028892973._1
118- let prefix = $t028892973._2
113+ let result = $t028102894._1
114+ let prefix = $t028102894._2
119115 result
120116 }
121117
207203
208204
209205 func getCurrentPrice () = if ((totalLpAmount != 0))
210- then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
211- else scale18BigInt
206+ then fraction(getTotalAssetAmountWithProfitOrMaxAvailable(), scale8, totalLpAmount)
207+ else (1 * scale8)
212208
213209
214210 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
216212
217213 func getUserAvailableAssetsToWithdraw (userAddress) = {
218214 let userLpAmount = getUserLpAmount(userAddress)
219- let userAvailableAssetToWithdraw = toInt(fraction(toBigInt(userLpAmount), getCurrentPrice(), scale18BigInt))
215+ let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
220216 if ((0 > userAvailableAssetToWithdraw))
221217 then 0
222218 else userAvailableAssetToWithdraw
234230 if ((checks == checks))
235231 then {
236232 let paymentAmount = i.payments[0].amount
237- let paymentLpAmount = toInt(fraction(toBigInt(paymentAmount), scale18BigInt, getCurrentPrice()))
233+ let paymentLpAmount = fraction(paymentAmount, scale8, getCurrentPrice())
238234 let userLpAmount = getUserLpAmount(userAddress)
239235 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
240236 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
261257 if ((check == check))
262258 then {
263259 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
264- let withdrawAssetAmount = toInt(fraction(toBigInt(lpAssetWithdrawAmount), getCurrentPrice(), scale18BigInt))
260+ let withdrawAssetAmount = fraction(lpAssetWithdrawAmount, getCurrentPrice(), scale8)
265261 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
266- let newTotalAssetAmount = toInt(fraction(toBigInt(newTotalLpAmount), getCurrentPrice(), scale18BigInt))
262+ let newTotalAssetAmount = fraction(newTotalLpAmount, getCurrentPrice(), scale8)
267263 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
268264 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
269265 [IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
305301 func withdraw (withdrawAssetAmount) = {
306302 let userAddress = toString(i.caller)
307303 let userLpAmount = getUserLpAmount(userAddress)
308- let lpAmountToWithdraw = toInt(fraction(toBigInt(withdrawAssetAmount), scale18BigInt, getCurrentPrice()))
304+ let lpAmountToWithdraw = fraction(withdrawAssetAmount, scale8, getCurrentPrice())
309305 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
310- let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
306+ let minWithdrawAssetAmount = fraction(getCurrentPrice(), 1, scale8, CEILING)
311307 let check = [if ((withdrawAssetAmount > 0))
312308 then true
313309 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
4238 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
4339
4440 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
4541
4642 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
4743
4844 let assetIdBytes = if ((assetIdString == "WAVES"))
4945 then unit
5046 else fromBase58String(assetIdString)
5147
5248 let emissionPeriodInBlocks = valueOrElse(getInteger(this, keyEmissionPeriodInBlocks), BLOCKS_IN_DAY)
5349
5450 let emissionPerPeriod = (valueOrElse(getInteger(this, keyEmissionPerBlock), 0) * emissionPeriodInBlocks)
5551
5652 let heightInPeriods = fraction(height, 1, emissionPeriodInBlocks)
5753
5854 let ADMIN_LIST_SIZE = 5
5955
6056 let QUORUM = 3
6157
6258 let TXID_BYTES_LENGTH = 32
6359
6460 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
6561
6662
6763 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
6864
6965
7066 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
7167
7268
7369 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
7470
7571
7672 func getAdminVote (prefix,admin) = {
7773 let voteKey = keyFullAdminVote(prefix, admin)
7874 valueOrElse(getInteger(voteKey), 0)
7975 }
8076
8177
8278 func getAdminsList () = match getString(this, keyAdminAddressList()) {
8379 case s: String =>
8480 split(s, SEP)
8581 case _ =>
8682 nil
8783 }
8884
8985
9086 func isInAdminList (address) = containsElement(getAdminsList(), address)
9187
9288
9389 func genVotesKeysHelper (a,adminAddress) = {
94- let $t027182742 = a
95- let result = $t027182742._1
96- let prefix = $t027182742._2
90+ let $t026392663 = a
91+ let result = $t026392663._1
92+ let prefix = $t026392663._2
9793 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
9894 }
9995
10096
10197 func genVotesKeys (keyPrefix) = {
10298 let adminList = keyAdminAddressList()
103- let $t028892973 = {
99+ let $t028102894 = {
104100 let $l = getAdminsList()
105101 let $s = size($l)
106102 let $acc0 = $Tuple2(nil, keyPrefix)
107103 func $f0_1 ($a,$i) = if (($i >= $s))
108104 then $a
109105 else genVotesKeysHelper($a, $l[$i])
110106
111107 func $f0_2 ($a,$i) = if (($i >= $s))
112108 then $a
113109 else throw("List size exceeds 5")
114110
115111 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
116112 }
117- let result = $t028892973._1
118- let prefix = $t028892973._2
113+ let result = $t028102894._1
114+ let prefix = $t028102894._2
119115 result
120116 }
121117
122118
123119 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
124120
125121
126122 func countVotes (prefix) = {
127123 let votes = genVotesKeys(prefix)
128124 let $l = votes
129125 let $s = size($l)
130126 let $acc0 = 0
131127 func $f0_1 ($a,$i) = if (($i >= $s))
132128 then $a
133129 else countVotesHelper($a, $l[$i])
134130
135131 func $f0_2 ($a,$i) = if (($i >= $s))
136132 then $a
137133 else throw("List size exceeds 5")
138134
139135 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
140136 }
141137
142138
143139 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
144140
145141
146142 func getClearVoteEntries (prefix) = {
147143 let votes = genVotesKeys(prefix)
148144 let $l = votes
149145 let $s = size($l)
150146 let $acc0 = nil
151147 func $f0_1 ($a,$i) = if (($i >= $s))
152148 then $a
153149 else clearVotesHelper($a, $l[$i])
154150
155151 func $f0_2 ($a,$i) = if (($i >= $s))
156152 then $a
157153 else throw("List size exceeds 5")
158154
159155 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
160156 }
161157
162158
163159 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
164160 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
165161 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
166162 let err = if (!(isInAdminList(callerAddressString)))
167163 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
168164 else if ((adminCurrentVote == 1))
169165 then throwErr((voteKey + " you already voted"))
170166 else unit
171167 if ((err == err))
172168 then {
173169 let votes = countVotes(keyPrefix)
174170 if (((votes + 1) >= minVotes))
175171 then {
176172 let clearVoteEntries = getClearVoteEntries(keyPrefix)
177173 (clearVoteEntries ++ voteResult)
178174 }
179175 else [IntegerEntry(voteKey, 1)]
180176 }
181177 else throw("Strict value is not equal to itself.")
182178 }
183179
184180
185181 func calcTotalProfit () = {
186182 let startBlock = valueOrElse(getInteger(this, keyStartBlock), 0)
187183 let startPeriod = fraction(startBlock, 1, emissionPeriodInBlocks)
188184 let elapsedPeriods = (heightInPeriods - startPeriod)
189185 max([0, (emissionPerPeriod * elapsedPeriods)])
190186 }
191187
192188
193189 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
194190 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
195191 let totalAmount = match assetIdBytes {
196192 case u: Unit =>
197193 min([totalAssetAmountWithProfit, wavesBalance(this).available])
198194 case b: ByteVector =>
199195 min([totalAssetAmountWithProfit, assetBalance(this, b)])
200196 case _ =>
201197 throw("Match error")
202198 }
203199 if ((totalLpAmount == 0))
204200 then 0
205201 else totalAmount
206202 }
207203
208204
209205 func getCurrentPrice () = if ((totalLpAmount != 0))
210- then fraction(toBigInt(getTotalAssetAmountWithProfitOrMaxAvailable()), scale18BigInt, toBigInt(totalLpAmount))
211- else scale18BigInt
206+ then fraction(getTotalAssetAmountWithProfitOrMaxAvailable(), scale8, totalLpAmount)
207+ else (1 * scale8)
212208
213209
214210 func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
215211
216212
217213 func getUserAvailableAssetsToWithdraw (userAddress) = {
218214 let userLpAmount = getUserLpAmount(userAddress)
219- let userAvailableAssetToWithdraw = toInt(fraction(toBigInt(userLpAmount), getCurrentPrice(), scale18BigInt))
215+ let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
220216 if ((0 > userAvailableAssetToWithdraw))
221217 then 0
222218 else userAvailableAssetToWithdraw
223219 }
224220
225221
226222 func getStakeActions (i,userAddress) = {
227223 let checks = [if ((size(i.payments) == 1))
228224 then true
229225 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
230226 then true
231227 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
232228 then true
233229 else "payment amount should be greater than 0"]
234230 if ((checks == checks))
235231 then {
236232 let paymentAmount = i.payments[0].amount
237- let paymentLpAmount = toInt(fraction(toBigInt(paymentAmount), scale18BigInt, getCurrentPrice()))
233+ let paymentLpAmount = fraction(paymentAmount, scale8, getCurrentPrice())
238234 let userLpAmount = getUserLpAmount(userAddress)
239235 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
240236 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
241237 let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
242238 let newUserLpAmount = (userLpAmount + paymentLpAmount)
243239 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
244240 let updateStartHeightAction = if ((totalLpAmount == 0))
245241 then [IntegerEntry(keyStartBlock, height)]
246242 else nil
247243 ([IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount)] ++ updateStartHeightAction)
248244 }
249245 else throw("Strict value is not equal to itself.")
250246 }
251247
252248
253249 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
254250 let userAddress = toString(i.caller)
255251 let userLpAmount = getUserLpAmount(userAddress)
256252 let check = [if ((lpAssetWithdrawAmount > 0))
257253 then true
258254 else throwErr("LP amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
259255 then true
260256 else throwErr((("cannot withdraw more than available LP (" + toString(userLpAmount)) + ")"))]
261257 if ((check == check))
262258 then {
263259 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
264- let withdrawAssetAmount = toInt(fraction(toBigInt(lpAssetWithdrawAmount), getCurrentPrice(), scale18BigInt))
260+ let withdrawAssetAmount = fraction(lpAssetWithdrawAmount, getCurrentPrice(), scale8)
265261 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
266- let newTotalAssetAmount = toInt(fraction(toBigInt(newTotalLpAmount), getCurrentPrice(), scale18BigInt))
262+ let newTotalAssetAmount = fraction(newTotalLpAmount, getCurrentPrice(), scale8)
267263 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
268264 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
269265 [IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
270266 }
271267 else throw("Strict value is not equal to itself.")
272268 }
273269
274270
275271 @Callable(i)
276272 func setEmissionPerBlock (emissionPerBlock) = {
277273 let check = [if ((i.caller == this))
278274 then true
279275 else throwErr("permission denied")]
280276 if ((check == check))
281277 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
282278 else throw("Strict value is not equal to itself.")
283279 }
284280
285281
286282
287283 @Callable(i)
288284 func stake () = getStakeActions(i, toString(i.caller))
289285
290286
291287
292288 @Callable(i)
293289 func stakeFor (userAddress) = {
294290 let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
295291 then true
296292 else throwErr("address is not valid")]
297293 if ((check == check))
298294 then getStakeActions(i, userAddress)
299295 else throw("Strict value is not equal to itself.")
300296 }
301297
302298
303299
304300 @Callable(i)
305301 func withdraw (withdrawAssetAmount) = {
306302 let userAddress = toString(i.caller)
307303 let userLpAmount = getUserLpAmount(userAddress)
308- let lpAmountToWithdraw = toInt(fraction(toBigInt(withdrawAssetAmount), scale18BigInt, getCurrentPrice()))
304+ let lpAmountToWithdraw = fraction(withdrawAssetAmount, scale8, getCurrentPrice())
309305 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
310- let minWithdrawAssetAmount = toInt(fraction(getCurrentPrice(), toBigInt(1), scale18BigInt, CEILING))
306+ let minWithdrawAssetAmount = fraction(getCurrentPrice(), 1, scale8, CEILING)
311307 let check = [if ((withdrawAssetAmount > 0))
312308 then true
313309 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
314310 then true
315311 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")")), if ((withdrawAssetAmount >= minWithdrawAssetAmount))
316312 then true
317313 else throwErr((("withdraw amount is too small. Min: (" + toString(minWithdrawAssetAmount)) + ")"))]
318314 if ((check == check))
319315 then getWithdrawActions(i, lpAmountToWithdraw)
320316 else throw("Strict value is not equal to itself.")
321317 }
322318
323319
324320
325321 @Callable(i)
326322 func getUserAssetsREADONLY (userAddress) = {
327323 let userLpAmount = getUserLpAmount(userAddress)
328324 let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
329325 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
330326 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
331327 $Tuple2(nil, $Tuple5(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn))
332328 }
333329
334330
335331
336332 @Callable(i)
337333 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple3(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice()))
338334
339335
340336
341337 @Callable(i)
342338 func voteForTxId (txId) = {
343339 let callerAddressString = toBase58String(i.caller.bytes)
344340 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
345341 let result = [StringEntry(keyAllowedTxId(), txId)]
346342 let allowedTxIdOption = getString(this, keyAllowedTxId())
347343 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
348344 then true
349345 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
350346 then true
351347 else (value(allowedTxIdOption) != txId))
352348 then true
353349 else throwErr((txId + " is already allowed"))]
354350 if ((err == err))
355351 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
356352 else throw("Strict value is not equal to itself.")
357353 }
358354
359355
360356 @Verifier(tx)
361357 func verify () = {
362358 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
363359 let byOwner = if ((size(getAdminsList()) >= QUORUM))
364360 then false
365361 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
366362 if (byAdmins)
367363 then true
368364 else byOwner
369365 }
370366

github/deemru/w8io/3ef1775 
64.65 ms