tx · GRurAS6w5quEQFY2bEiB4F8jNAPmWxTUs3xH8MSURBEh

3MpMuGN8rW9EpPwzETAQz88Pe9TQhSwiriq:  -0.01400000 Waves

2023.07.21 14:57 [2675581] smart account 3MpMuGN8rW9EpPwzETAQz88Pe9TQhSwiriq > SELF 0.00000000 Waves

{ "type": 13, "id": "GRurAS6w5quEQFY2bEiB4F8jNAPmWxTUs3xH8MSURBEh", "fee": 1400000, "feeAssetId": null, "timestamp": 1689940660374, "version": 2, "chainId": 84, "sender": "3MpMuGN8rW9EpPwzETAQz88Pe9TQhSwiriq", "senderPublicKey": "57SkjQUEwC1ayCqLbXLuzBqifK6B6SR6rfxtGsbAo3zW", "proofs": [ "3AZya94uZFyd2jFckzse9EdqR9PmxBUgR7rvDGaCFiWaRSSBuVMnHD8CbTq2Mbx6DnHivewtocUJKxZFy5bxo1AR" ], "script": "base64:BgIfCAISAwoBARIAEgMKAQgSAwoBARIDCgEIEgASAwoBCCwADGNvbnRyYWN0RmlsZQIQbXB0X3N0YWtpbmcucmlkZQADU0VQAgJfXwAGc2NhbGU4AIDC1y8AEkFERFJFU1NfQllURVNfU0laRQAaAA1CTE9DS1NfSU5fREFZAKALAQh0aHJvd0VycgEDbXNnCQACAQkArAICCQCsAgIFDGNvbnRyYWN0RmlsZQICOiAFA21zZwAKa2V5QXNzZXRJZAkAuQkCCQDMCAICAiVzCQDMCAICB2Fzc2V0SWQFA25pbAUDU0VQABNrZXlFbWlzc2lvblBlckJsb2NrCQC5CQIJAMwIAgICJXMJAMwIAgIQZW1pc3Npb25QZXJCbG9jawUDbmlsBQNTRVAADWtleVN0YXJ0QmxvY2sJALkJAgkAzAgCAgIlcwkAzAgCAgpzdGFydEJsb2NrBQNuaWwFA1NFUAAQa2V5VG90YWxMcEFtb3VudAkAuQkCCQDMCAICAiVzCQDMCAICDXRvdGFsTHBBbW91bnQFA25pbAUDU0VQABNrZXlUb3RhbEFzc2V0QW1vdW50CQC5CQIJAMwIAgICJXMJAMwIAgIQdG90YWxBc3NldEFtb3VudAUDbmlsBQNTRVABD2tleVVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICDHVzZXJMcEFtb3VudAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITdG90YWxBc3NldFdpdGhkcmF3bgkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdG90YWxBc3NldFN0YWtlZAkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAADXRvdGFsTHBBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQa2V5VG90YWxMcEFtb3VudAAAABB0b3RhbEFzc2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFE2tleVRvdGFsQXNzZXRBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQprZXlBc3NldElkAgVXQVZFUwAMYXNzZXRJZEJ5dGVzAwkAAAIFDWFzc2V0SWRTdHJpbmcCBVdBVkVTBQR1bml0CQDZBAEFDWFzc2V0SWRTdHJpbmcADmVtaXNzaW9uUGVyRGF5CQBoAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRNrZXlFbWlzc2lvblBlckJsb2NrAAAFDUJMT0NLU19JTl9EQVkADGhlaWdodEluRGF5cwkAawMFBmhlaWdodAABBQ1CTE9DS1NfSU5fREFZAA9BRE1JTl9MSVNUX1NJWkUABQAGUVVPUlVNAAMAEVRYSURfQllURVNfTEVOR1RIACABGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAglhbGxvd1R4SWQJAMwIAgUEdHhJZAUDbmlsBQNTRVABEGtleUZ1bGxBZG1pblZvdGUCBnByZWZpeAxhZG1pbkFkZHJlc3MJALkJAgkAzAgCBQZwcmVmaXgJAMwIAgUMYWRtaW5BZGRyZXNzBQNuaWwFA1NFUAETa2V5QWRtaW5BZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBhZG1pbkFkZHJlc3NMaXN0BQNuaWwFA1NFUAEOa2V5QWxsb3dlZFR4SWQACQC5CQIJAMwIAgICJXMJAMwIAgIEdHhJZAUDbmlsBQNTRVABDGdldEFkbWluVm90ZQIGcHJlZml4BWFkbWluBAd2b3RlS2V5CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQ1nZXRBZG1pbnNMaXN0AAQHJG1hdGNoMAkAnQgCBQR0aGlzCQETa2V5QWRtaW5BZGRyZXNzTGlzdAADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMFA1NFUAUDbmlsAQ1pc0luQWRtaW5MaXN0AQdhZGRyZXNzCQEPY29udGFpbnNFbGVtZW50AgkBDWdldEFkbWluc0xpc3QABQdhZGRyZXNzARJnZW5Wb3Rlc0tleXNIZWxwZXICAWEMYWRtaW5BZGRyZXNzBAskdDAyNDEwMjQzNAUBYQQGcmVzdWx0CAULJHQwMjQxMDI0MzQCXzEEBnByZWZpeAgFCyR0MDI0MTAyNDM0Al8yCQCUCgIJAM0IAgUGcmVzdWx0CQEQa2V5RnVsbEFkbWluVm90ZQIFBnByZWZpeAUMYWRtaW5BZGRyZXNzBQZwcmVmaXgBDGdlblZvdGVzS2V5cwEJa2V5UHJlZml4BAlhZG1pbkxpc3QJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAQLJHQwMjU4MTI2NjUKAAIkbAkBDWdldEFkbWluc0xpc3QACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFCWtleVByZWZpeAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQESZ2VuVm90ZXNLZXlzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQGcmVzdWx0CAULJHQwMjU4MTI2NjUCXzEEBnByZWZpeAgFCyR0MDI1ODEyNjY1Al8yBQZyZXN1bHQBEGNvdW50Vm90ZXNIZWxwZXICBnJlc3VsdAd2b3RlS2V5CQBkAgUGcmVzdWx0CQELdmFsdWVPckVsc2UCCQCfCAEFB3ZvdGVLZXkAAAEKY291bnRWb3RlcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY291bnRWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBEGNsZWFyVm90ZXNIZWxwZXICBnJlc3VsdANrZXkJAM0IAgUGcmVzdWx0CQELRGVsZXRlRW50cnkBBQNrZXkBE2dldENsZWFyVm90ZUVudHJpZXMBBnByZWZpeAQFdm90ZXMJAQxnZW5Wb3Rlc0tleXMBBQZwcmVmaXgKAAIkbAUFdm90ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNsZWFyVm90ZXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAQx2b3RlSU5URVJOQUwEE2NhbGxlckFkZHJlc3NTdHJpbmcJa2V5UHJlZml4CG1pblZvdGVzCnZvdGVSZXN1bHQEB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBBBhZG1pbkN1cnJlbnRWb3RlCQEMZ2V0QWRtaW5Wb3RlAgUJa2V5UHJlZml4BRNjYWxsZXJBZGRyZXNzU3RyaW5nBANlcnIDCQEBIQEJAQ1pc0luQWRtaW5MaXN0AQUTY2FsbGVyQWRkcmVzc1N0cmluZwkBCHRocm93RXJyAQkArAICCQCsAgICCUFkZHJlc3M6IAUTY2FsbGVyQWRkcmVzc1N0cmluZwISIG5vdCBpbiBBZG1pbiBsaXN0AwkAAAIFEGFkbWluQ3VycmVudFZvdGUAAQkBCHRocm93RXJyAQkArAICBQd2b3RlS2V5AhIgeW91IGFscmVhZHkgdm90ZWQFBHVuaXQDCQAAAgUDZXJyBQNlcnIEBXZvdGVzCQEKY291bnRWb3RlcwEFCWtleVByZWZpeAMJAGcCCQBkAgUFdm90ZXMAAQUIbWluVm90ZXMEEGNsZWFyVm90ZUVudHJpZXMJARNnZXRDbGVhclZvdGVFbnRyaWVzAQUJa2V5UHJlZml4CQDOCAIFEGNsZWFyVm90ZUVudHJpZXMFCnZvdGVSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3ZvdGVLZXkAAQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9jYWxjVG90YWxQcm9maXQABApzdGFydEJsb2NrCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtleVN0YXJ0QmxvY2sAAAQIc3RhcnREYXkJAGsDBQpzdGFydEJsb2NrAAEFDUJMT0NLU19JTl9EQVkEC2VsYXBzZWREYXlzCQBlAgUMaGVpZ2h0SW5EYXlzBQhzdGFydERheQkAlgMBCQDMCAIAAAkAzAgCCQBoAgUOZW1pc3Npb25QZXJEYXkFC2VsYXBzZWREYXlzBQNuaWwBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUABBp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAZAIFEHRvdGFsQXNzZXRBbW91bnQJAQ9jYWxjVG90YWxQcm9maXQABAt0b3RhbEFtb3VudAQHJG1hdGNoMAUMYXNzZXRJZEJ5dGVzAwkAAQIFByRtYXRjaDACBFVuaXQEAXUFByRtYXRjaDAJAJcDAQkAzAgCBRp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAzAgCCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQUDbmlsAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJAJcDAQkAzAgCBRp0b3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdAkAzAgCCQDwBwIFBHRoaXMFAWIFA25pbAkAAgECC01hdGNoIGVycm9yAwkAAAIFDXRvdGFsTHBBbW91bnQAAAAABQt0b3RhbEFtb3VudAEPZ2V0Q3VycmVudFByaWNlAAMJAQIhPQIFDXRvdGFsTHBBbW91bnQAAAkAawMJAStnZXRUb3RhbEFzc2V0QW1vdW50V2l0aFByb2ZpdE9yTWF4QXZhaWxhYmxlAAUGc2NhbGU4BQ10b3RhbExwQW1vdW50CQBoAgABBQZzY2FsZTgBD2dldFVzZXJMcEFtb3VudAELdXNlckFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleVVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzAAABIGdldFVzZXJBdmFpbGFibGVBc3NldHNUb1dpdGhkcmF3AQt1c2VyQWRkcmVzcwQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcJAGsDBQx1c2VyTHBBbW91bnQJAQ9nZXRDdXJyZW50UHJpY2UABQZzY2FsZTgDCQBmAgkBD2dldEN1cnJlbnRQcmljZQAJAGgCBRx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3BQZzY2FsZTgAAAUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwEPZ2V0U3Rha2VBY3Rpb25zAgFpC3VzZXJBZGRyZXNzBAZjaGVja3MJAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAhhzaG91bGQgaW5jbHVkZSAxIHBheW1lbnQJAMwIAgMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDGFzc2V0SWRCeXRlcwYJAQh0aHJvd0VycgEJAKwCAgIVcGF5bWVudCBzaG91bGQgYmUgaW4gBQ1hc3NldElkU3RyaW5nCQDMCAIDCQBmAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAYCJ3BheW1lbnQgYW1vdW50IHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1wYXltZW50QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPcGF5bWVudExwQW1vdW50CQBrAwUNcGF5bWVudEFtb3VudAUGc2NhbGU4CQEPZ2V0Q3VycmVudFByaWNlAAQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEFXVzZXJUb3RhbFN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwAABBBuZXdUb3RhbExwQW1vdW50CQBkAgUNdG90YWxMcEFtb3VudAUPcGF5bWVudExwQW1vdW50BBNuZXdUb3RhbEFzc2V0QW1vdW50CQBkAgUQdG90YWxBc3NldEFtb3VudAUNcGF5bWVudEFtb3VudAQPbmV3VXNlckxwQW1vdW50CQBkAgUMdXNlckxwQW1vdW50BQ9wYXltZW50THBBbW91bnQEGG5ld1VzZXJUb3RhbFN0YWtlZEFtb3VudAkAZAIFFXVzZXJUb3RhbFN0YWtlZEFtb3VudAUNcGF5bWVudEFtb3VudAQXdXBkYXRlU3RhcnRIZWlnaHRBY3Rpb24DCQAAAgUNdG90YWxMcEFtb3VudAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rZXlTdGFydEJsb2NrBQZoZWlnaHQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VXNlclRvdGFsQXNzZXRTdGFrZWQBBQt1c2VyQWRkcmVzcwUYbmV3VXNlclRvdGFsU3Rha2VkQW1vdW50BQNuaWwFF3VwZGF0ZVN0YXJ0SGVpZ2h0QWN0aW9uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARJnZXRXaXRoZHJhd0FjdGlvbnMCAWkVbHBBc3NldFdpdGhkcmF3QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBAVjaGVjawkAzAgCAwkAZgIFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAAABgkBCHRocm93RXJyAQIcYW1vdW50IHNob3VsZCBiZSBtb3JlIHRoYW4gMAkAzAgCAwkAZwIFDHVzZXJMcEFtb3VudAUVbHBBc3NldFdpdGhkcmF3QW1vdW50BgkBCHRocm93RXJyAQkArAICCQCsAgICJWNhbm5vdCB3aXRoZHJhdyBtb3JlIHRoYW4gYXZhaWxhYmxlICgJAKQDAQUMdXNlckxwQW1vdW50AgEpBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBA9uZXdVc2VyTHBBbW91bnQJAGUCBQx1c2VyTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTd2l0aGRyYXdBc3NldEFtb3VudAkAawMFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAkBD2dldEN1cnJlbnRQcmljZQAFBnNjYWxlOAQQbmV3VG90YWxMcEFtb3VudAkAZQIFDXRvdGFsTHBBbW91bnQFFWxwQXNzZXRXaXRoZHJhd0Ftb3VudAQTbmV3VG90YWxBc3NldEFtb3VudAkAawMFEG5ld1RvdGFsTHBBbW91bnQJAQ9nZXRDdXJyZW50UHJpY2UABQZzY2FsZTgEF3VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARprZXlVc2VyVG90YWxBc3NldFdpdGhkcmF3bgEFC3VzZXJBZGRyZXNzAAAEGm5ld1VzZXJUb3RhbEFzc2V0V2l0aGRyYXduCQBkAgUXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24FE3dpdGhkcmF3QXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEGtleVRvdGFsTHBBbW91bnQFEG5ld1RvdGFsTHBBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tleVRvdGFsQXNzZXRBbW91bnQFE25ld1RvdGFsQXNzZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlVc2VyTHBBbW91bnQBBQt1c2VyQWRkcmVzcwUPbmV3VXNlckxwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5VXNlclRvdGFsQXNzZXRXaXRoZHJhd24BBQt1c2VyQWRkcmVzcwUabmV3VXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFE3dpdGhkcmF3QXNzZXRBbW91bnQFDGFzc2V0SWRCeXRlcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBwFpARNzZXRFbWlzc2lvblBlckJsb2NrARBlbWlzc2lvblBlckJsb2NrBAVjaGVjawkAzAgCAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrZXlUb3RhbEFzc2V0QW1vdW50CQErZ2V0VG90YWxBc3NldEFtb3VudFdpdGhQcm9maXRPck1heEF2YWlsYWJsZQAJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtleVN0YXJ0QmxvY2sFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa2V5RW1pc3Npb25QZXJCbG9jawkAlgMBCQDMCAIAAAkAzAgCBRBlbWlzc2lvblBlckJsb2NrBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAJAQ9nZXRTdGFrZUFjdGlvbnMCBQFpCQClCAEIBQFpBmNhbGxlcgFpAQhzdGFrZUZvcgELdXNlckFkZHJlc3MEBWNoZWNrCQDMCAIDCQAAAgkAyAEBCQDZBAEFC3VzZXJBZGRyZXNzBRJBRERSRVNTX0JZVEVTX1NJWkUGCQEIdGhyb3dFcnIBAhRhZGRyZXNzIGlzIG5vdCB2YWxpZAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawkBD2dldFN0YWtlQWN0aW9ucwIFAWkFC3VzZXJBZGRyZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3ARN3aXRoZHJhd0Fzc2V0QW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDHVzZXJMcEFtb3VudAkBD2dldFVzZXJMcEFtb3VudAEFC3VzZXJBZGRyZXNzBBJscEFtb3VudFRvV2l0aGRyYXcJAGsDBRN3aXRoZHJhd0Fzc2V0QW1vdW50BQZzY2FsZTgJAQ9nZXRDdXJyZW50UHJpY2UABBx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEgZ2V0VXNlckF2YWlsYWJsZUFzc2V0c1RvV2l0aGRyYXcBBQt1c2VyQWRkcmVzcwQFY2hlY2sJAMwIAgMJAGYCBRN3aXRoZHJhd0Fzc2V0QW1vdW50AAAGCQEIdGhyb3dFcnIBAiV3aXRoZHJhdyBhbW91bnQgc2hvdWxkIGJlIG1vcmUgdGhhbiAwCQDMCAIDCQBnAgUcdXNlckF2YWlsYWJsZUFzc2V0VG9XaXRoZHJhdwUTd2l0aGRyYXdBc3NldEFtb3VudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiVjYW5ub3Qgd2l0aGRyYXcgbW9yZSB0aGFuIGF2YWlsYWJsZSAoCQCkAwEFHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcCASkFA25pbAMJAAACBQVjaGVjawUFY2hlY2sJARJnZXRXaXRoZHJhd0FjdGlvbnMCBQFpBRJscEFtb3VudFRvV2l0aGRyYXcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVZ2V0VXNlckFzc2V0c1JFQURPTkxZAQt1c2VyQWRkcmVzcwQMdXNlckxwQW1vdW50CQEPZ2V0VXNlckxwQW1vdW50AQULdXNlckFkZHJlc3MEHHVzZXJBdmFpbGFibGVBc3NldFRvV2l0aGRyYXcJASBnZXRVc2VyQXZhaWxhYmxlQXNzZXRzVG9XaXRoZHJhdwEFC3VzZXJBZGRyZXNzBBV1c2VyVG90YWxTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBF2tleVVzZXJUb3RhbEFzc2V0U3Rha2VkAQULdXNlckFkZHJlc3MAAAQXdXNlclRvdGFsQXNzZXRXaXRoZHJhd24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBGmtleVVzZXJUb3RhbEFzc2V0V2l0aGRyYXduAQULdXNlckFkZHJlc3MAAAkAlAoCBQNuaWwJAJcKBQUMdXNlckxwQW1vdW50BRx1c2VyQXZhaWxhYmxlQXNzZXRUb1dpdGhkcmF3CQEPZ2V0Q3VycmVudFByaWNlAAUVdXNlclRvdGFsU3Rha2VkQW1vdW50BRd1c2VyVG90YWxBc3NldFdpdGhkcmF3bgFpARZnZXRUb3RhbEFzc2V0c1JFQURPTkxZAAkAlAoCBQNuaWwJAJUKAwUNdG90YWxMcEFtb3VudAkBK2dldFRvdGFsQXNzZXRBbW91bnRXaXRoUHJvZml0T3JNYXhBdmFpbGFibGUACQEPZ2V0Q3VycmVudFByaWNlAAFpAQt2b3RlRm9yVHhJZAEEdHhJZAQTY2FsbGVyQWRkcmVzc1N0cmluZwkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBAlrZXlQcmVmaXgJARhrZXlBbGxvd2VkVHhJZFZvdGVQcmVmaXgBBQR0eElkBAZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUFsbG93ZWRUeElkAAUEdHhJZAUDbmlsBBFhbGxvd2VkVHhJZE9wdGlvbgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQABANlcnIJAMwIAgMJAAACCQDIAQEJANkEAQUEdHhJZAURVFhJRF9CWVRFU19MRU5HVEgGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEiBpcyBub3QgdmFsaWQgdHhJZAkAzAgCAwMJAAACBRFhbGxvd2VkVHhJZE9wdGlvbgUEdW5pdAYJAQIhPQIJAQV2YWx1ZQEFEWFsbG93ZWRUeElkT3B0aW9uBQR0eElkBgkBCHRocm93RXJyAQkArAICBQR0eElkAhMgaXMgYWxyZWFkeSBhbGxvd2VkBQNuaWwDCQAAAgUDZXJyBQNlcnIJAQx2b3RlSU5URVJOQUwEBRNjYWxsZXJBZGRyZXNzU3RyaW5nBQlrZXlQcmVmaXgFBlFVT1JVTQUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQIYnlBZG1pbnMJAAACCAUCdHgCaWQJANkEAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5QWxsb3dlZFR4SWQAAgAEB2J5T3duZXIDCQBnAgkAkAMBCQENZ2V0QWRtaW5zTGlzdAAFBlFVT1JVTQcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDBQhieUFkbWlucwYFB2J5T3duZXJfo0xY", "height": 2675581, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8HvaFzBZdGMTEy4mA3ZfQZNcQJXywSRjMpEbNT9Mqz9B Next: J3tJi6bV1jGFPYQ4Z4eqyjZ4ZoQvHHE8P5BJQ9dQf2bS Diff:
OldNewDifferences
4747
4848 let heightInDays = fraction(height, 1, BLOCKS_IN_DAY)
4949
50-func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
51-
52-
5350 let ADMIN_LIST_SIZE = 5
5451
5552 let QUORUM = 3
8683
8784
8885 func genVotesKeysHelper (a,adminAddress) = {
89- let $t025162540 = a
90- let result = $t025162540._1
91- let prefix = $t025162540._2
86+ let $t024102434 = a
87+ let result = $t024102434._1
88+ let prefix = $t024102434._2
9289 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
9390 }
9491
9592
9693 func genVotesKeys (keyPrefix) = {
9794 let adminList = keyAdminAddressList()
98- let $t026872771 = {
95+ let $t025812665 = {
9996 let $l = getAdminsList()
10097 let $s = size($l)
10198 let $acc0 = $Tuple2(nil, keyPrefix)
109106
110107 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
111108 }
112- let result = $t026872771._1
113- let prefix = $t026872771._2
109+ let result = $t025812665._1
110+ let prefix = $t025812665._2
114111 result
115112 }
116113
206203 else (1 * scale8)
207204
208205
206+func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
207+
208+
209+func getUserAvailableAssetsToWithdraw (userAddress) = {
210+ let userLpAmount = getUserLpAmount(userAddress)
211+ let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
212+ if ((getCurrentPrice() > (userAvailableAssetToWithdraw * scale8)))
213+ then 0
214+ else userAvailableAssetToWithdraw
215+ }
216+
217+
209218 func getStakeActions (i,userAddress) = {
210219 let checks = [if ((size(i.payments) == 1))
211220 then true
289298 let userAddress = toString(i.caller)
290299 let userLpAmount = getUserLpAmount(userAddress)
291300 let lpAmountToWithdraw = fraction(withdrawAssetAmount, scale8, getCurrentPrice())
292- let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
301+ let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
293302 let check = [if ((withdrawAssetAmount > 0))
294303 then true
295304 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
296305 then true
297306 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")"))]
298307 if ((check == check))
299- then {
300- let actions = getWithdrawActions(i, lpAmountToWithdraw)
301- actions
302- }
308+ then getWithdrawActions(i, lpAmountToWithdraw)
303309 else throw("Strict value is not equal to itself.")
304310 }
305311
308314 @Callable(i)
309315 func getUserAssetsREADONLY (userAddress) = {
310316 let userLpAmount = getUserLpAmount(userAddress)
311- let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
317+ let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
312318 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
313319 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
314320 $Tuple2(nil, $Tuple5(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFile = "mpt_staking.ride"
55
66 let SEP = "__"
77
88 let scale8 = 100000000
99
1010 let ADDRESS_BYTES_SIZE = 26
1111
1212 let BLOCKS_IN_DAY = 1440
1313
1414 func throwErr (msg) = throw(((contractFile + ": ") + msg))
1515
1616
1717 let keyAssetId = makeString(["%s", "assetId"], SEP)
1818
1919 let keyEmissionPerBlock = makeString(["%s", "emissionPerBlock"], SEP)
2020
2121 let keyStartBlock = makeString(["%s", "startBlock"], SEP)
2222
2323 let keyTotalLpAmount = makeString(["%s", "totalLpAmount"], SEP)
2424
2525 let keyTotalAssetAmount = makeString(["%s", "totalAssetAmount"], SEP)
2626
2727 func keyUserLpAmount (userAddress) = makeString(["%s%s", "userLpAmount", userAddress], SEP)
2828
2929
3030 func keyUserTotalAssetWithdrawn (userAddress) = makeString(["%s%s", "totalAssetWithdrawn", userAddress], SEP)
3131
3232
3333 func keyUserTotalAssetStaked (userAddress) = makeString(["%s%s", "totalAssetStaked", userAddress], SEP)
3434
3535
3636 let totalLpAmount = valueOrElse(getInteger(this, keyTotalLpAmount), 0)
3737
3838 let totalAssetAmount = valueOrElse(getInteger(this, keyTotalAssetAmount), 0)
3939
4040 let assetIdString = valueOrElse(getString(this, keyAssetId), "WAVES")
4141
4242 let assetIdBytes = if ((assetIdString == "WAVES"))
4343 then unit
4444 else fromBase58String(assetIdString)
4545
4646 let emissionPerDay = (valueOrElse(getInteger(this, keyEmissionPerBlock), 0) * BLOCKS_IN_DAY)
4747
4848 let heightInDays = fraction(height, 1, BLOCKS_IN_DAY)
4949
50-func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
51-
52-
5350 let ADMIN_LIST_SIZE = 5
5451
5552 let QUORUM = 3
5653
5754 let TXID_BYTES_LENGTH = 32
5855
5956 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
6057
6158
6259 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
6360
6461
6562 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
6663
6764
6865 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
6966
7067
7168 func getAdminVote (prefix,admin) = {
7269 let voteKey = keyFullAdminVote(prefix, admin)
7370 valueOrElse(getInteger(voteKey), 0)
7471 }
7572
7673
7774 func getAdminsList () = match getString(this, keyAdminAddressList()) {
7875 case s: String =>
7976 split(s, SEP)
8077 case _ =>
8178 nil
8279 }
8380
8481
8582 func isInAdminList (address) = containsElement(getAdminsList(), address)
8683
8784
8885 func genVotesKeysHelper (a,adminAddress) = {
89- let $t025162540 = a
90- let result = $t025162540._1
91- let prefix = $t025162540._2
86+ let $t024102434 = a
87+ let result = $t024102434._1
88+ let prefix = $t024102434._2
9289 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
9390 }
9491
9592
9693 func genVotesKeys (keyPrefix) = {
9794 let adminList = keyAdminAddressList()
98- let $t026872771 = {
95+ let $t025812665 = {
9996 let $l = getAdminsList()
10097 let $s = size($l)
10198 let $acc0 = $Tuple2(nil, keyPrefix)
10299 func $f0_1 ($a,$i) = if (($i >= $s))
103100 then $a
104101 else genVotesKeysHelper($a, $l[$i])
105102
106103 func $f0_2 ($a,$i) = if (($i >= $s))
107104 then $a
108105 else throw("List size exceeds 5")
109106
110107 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
111108 }
112- let result = $t026872771._1
113- let prefix = $t026872771._2
109+ let result = $t025812665._1
110+ let prefix = $t025812665._2
114111 result
115112 }
116113
117114
118115 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
119116
120117
121118 func countVotes (prefix) = {
122119 let votes = genVotesKeys(prefix)
123120 let $l = votes
124121 let $s = size($l)
125122 let $acc0 = 0
126123 func $f0_1 ($a,$i) = if (($i >= $s))
127124 then $a
128125 else countVotesHelper($a, $l[$i])
129126
130127 func $f0_2 ($a,$i) = if (($i >= $s))
131128 then $a
132129 else throw("List size exceeds 5")
133130
134131 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
135132 }
136133
137134
138135 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
139136
140137
141138 func getClearVoteEntries (prefix) = {
142139 let votes = genVotesKeys(prefix)
143140 let $l = votes
144141 let $s = size($l)
145142 let $acc0 = nil
146143 func $f0_1 ($a,$i) = if (($i >= $s))
147144 then $a
148145 else clearVotesHelper($a, $l[$i])
149146
150147 func $f0_2 ($a,$i) = if (($i >= $s))
151148 then $a
152149 else throw("List size exceeds 5")
153150
154151 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
155152 }
156153
157154
158155 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
159156 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
160157 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
161158 let err = if (!(isInAdminList(callerAddressString)))
162159 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
163160 else if ((adminCurrentVote == 1))
164161 then throwErr((voteKey + " you already voted"))
165162 else unit
166163 if ((err == err))
167164 then {
168165 let votes = countVotes(keyPrefix)
169166 if (((votes + 1) >= minVotes))
170167 then {
171168 let clearVoteEntries = getClearVoteEntries(keyPrefix)
172169 (clearVoteEntries ++ voteResult)
173170 }
174171 else [IntegerEntry(voteKey, 1)]
175172 }
176173 else throw("Strict value is not equal to itself.")
177174 }
178175
179176
180177 func calcTotalProfit () = {
181178 let startBlock = valueOrElse(getInteger(this, keyStartBlock), 0)
182179 let startDay = fraction(startBlock, 1, BLOCKS_IN_DAY)
183180 let elapsedDays = (heightInDays - startDay)
184181 max([0, (emissionPerDay * elapsedDays)])
185182 }
186183
187184
188185 func getTotalAssetAmountWithProfitOrMaxAvailable () = {
189186 let totalAssetAmountWithProfit = (totalAssetAmount + calcTotalProfit())
190187 let totalAmount = match assetIdBytes {
191188 case u: Unit =>
192189 min([totalAssetAmountWithProfit, wavesBalance(this).available])
193190 case b: ByteVector =>
194191 min([totalAssetAmountWithProfit, assetBalance(this, b)])
195192 case _ =>
196193 throw("Match error")
197194 }
198195 if ((totalLpAmount == 0))
199196 then 0
200197 else totalAmount
201198 }
202199
203200
204201 func getCurrentPrice () = if ((totalLpAmount != 0))
205202 then fraction(getTotalAssetAmountWithProfitOrMaxAvailable(), scale8, totalLpAmount)
206203 else (1 * scale8)
207204
208205
206+func getUserLpAmount (userAddress) = valueOrElse(getInteger(this, keyUserLpAmount(userAddress)), 0)
207+
208+
209+func getUserAvailableAssetsToWithdraw (userAddress) = {
210+ let userLpAmount = getUserLpAmount(userAddress)
211+ let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
212+ if ((getCurrentPrice() > (userAvailableAssetToWithdraw * scale8)))
213+ then 0
214+ else userAvailableAssetToWithdraw
215+ }
216+
217+
209218 func getStakeActions (i,userAddress) = {
210219 let checks = [if ((size(i.payments) == 1))
211220 then true
212221 else throwErr("should include 1 payment"), if ((i.payments[0].assetId == assetIdBytes))
213222 then true
214223 else throwErr(("payment should be in " + assetIdString)), if ((i.payments[0].amount > 0))
215224 then true
216225 else "payment amount should be greater than 0"]
217226 if ((checks == checks))
218227 then {
219228 let paymentAmount = i.payments[0].amount
220229 let paymentLpAmount = fraction(paymentAmount, scale8, getCurrentPrice())
221230 let userLpAmount = getUserLpAmount(userAddress)
222231 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
223232 let newTotalLpAmount = (totalLpAmount + paymentLpAmount)
224233 let newTotalAssetAmount = (totalAssetAmount + paymentAmount)
225234 let newUserLpAmount = (userLpAmount + paymentLpAmount)
226235 let newUserTotalStakedAmount = (userTotalStakedAmount + paymentAmount)
227236 let updateStartHeightAction = if ((totalLpAmount == 0))
228237 then [IntegerEntry(keyStartBlock, height)]
229238 else nil
230239 ([IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetStaked(userAddress), newUserTotalStakedAmount)] ++ updateStartHeightAction)
231240 }
232241 else throw("Strict value is not equal to itself.")
233242 }
234243
235244
236245 func getWithdrawActions (i,lpAssetWithdrawAmount) = {
237246 let userAddress = toString(i.caller)
238247 let userLpAmount = getUserLpAmount(userAddress)
239248 let check = [if ((lpAssetWithdrawAmount > 0))
240249 then true
241250 else throwErr("amount should be more than 0"), if ((userLpAmount >= lpAssetWithdrawAmount))
242251 then true
243252 else throwErr((("cannot withdraw more than available (" + toString(userLpAmount)) + ")"))]
244253 if ((check == check))
245254 then {
246255 let newUserLpAmount = (userLpAmount - lpAssetWithdrawAmount)
247256 let withdrawAssetAmount = fraction(lpAssetWithdrawAmount, getCurrentPrice(), scale8)
248257 let newTotalLpAmount = (totalLpAmount - lpAssetWithdrawAmount)
249258 let newTotalAssetAmount = fraction(newTotalLpAmount, getCurrentPrice(), scale8)
250259 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
251260 let newUserTotalAssetWithdrawn = (userTotalAssetWithdrawn + withdrawAssetAmount)
252261 [IntegerEntry(keyTotalLpAmount, newTotalLpAmount), IntegerEntry(keyTotalAssetAmount, newTotalAssetAmount), IntegerEntry(keyUserLpAmount(userAddress), newUserLpAmount), IntegerEntry(keyUserTotalAssetWithdrawn(userAddress), newUserTotalAssetWithdrawn), IntegerEntry(keyStartBlock, height), ScriptTransfer(i.caller, withdrawAssetAmount, assetIdBytes)]
253262 }
254263 else throw("Strict value is not equal to itself.")
255264 }
256265
257266
258267 @Callable(i)
259268 func setEmissionPerBlock (emissionPerBlock) = {
260269 let check = [if ((i.caller == this))
261270 then true
262271 else throwErr("permission denied")]
263272 if ((check == check))
264273 then [IntegerEntry(keyTotalAssetAmount, getTotalAssetAmountWithProfitOrMaxAvailable()), IntegerEntry(keyStartBlock, height), IntegerEntry(keyEmissionPerBlock, max([0, emissionPerBlock]))]
265274 else throw("Strict value is not equal to itself.")
266275 }
267276
268277
269278
270279 @Callable(i)
271280 func stake () = getStakeActions(i, toString(i.caller))
272281
273282
274283
275284 @Callable(i)
276285 func stakeFor (userAddress) = {
277286 let check = [if ((size(fromBase58String(userAddress)) == ADDRESS_BYTES_SIZE))
278287 then true
279288 else throwErr("address is not valid")]
280289 if ((check == check))
281290 then getStakeActions(i, userAddress)
282291 else throw("Strict value is not equal to itself.")
283292 }
284293
285294
286295
287296 @Callable(i)
288297 func withdraw (withdrawAssetAmount) = {
289298 let userAddress = toString(i.caller)
290299 let userLpAmount = getUserLpAmount(userAddress)
291300 let lpAmountToWithdraw = fraction(withdrawAssetAmount, scale8, getCurrentPrice())
292- let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
301+ let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
293302 let check = [if ((withdrawAssetAmount > 0))
294303 then true
295304 else throwErr("withdraw amount should be more than 0"), if ((userAvailableAssetToWithdraw >= withdrawAssetAmount))
296305 then true
297306 else throwErr((("cannot withdraw more than available (" + toString(userAvailableAssetToWithdraw)) + ")"))]
298307 if ((check == check))
299- then {
300- let actions = getWithdrawActions(i, lpAmountToWithdraw)
301- actions
302- }
308+ then getWithdrawActions(i, lpAmountToWithdraw)
303309 else throw("Strict value is not equal to itself.")
304310 }
305311
306312
307313
308314 @Callable(i)
309315 func getUserAssetsREADONLY (userAddress) = {
310316 let userLpAmount = getUserLpAmount(userAddress)
311- let userAvailableAssetToWithdraw = fraction(userLpAmount, getCurrentPrice(), scale8)
317+ let userAvailableAssetToWithdraw = getUserAvailableAssetsToWithdraw(userAddress)
312318 let userTotalStakedAmount = valueOrElse(getInteger(this, keyUserTotalAssetStaked(userAddress)), 0)
313319 let userTotalAssetWithdrawn = valueOrElse(getInteger(this, keyUserTotalAssetWithdrawn(userAddress)), 0)
314320 $Tuple2(nil, $Tuple5(userLpAmount, userAvailableAssetToWithdraw, getCurrentPrice(), userTotalStakedAmount, userTotalAssetWithdrawn))
315321 }
316322
317323
318324
319325 @Callable(i)
320326 func getTotalAssetsREADONLY () = $Tuple2(nil, $Tuple3(totalLpAmount, getTotalAssetAmountWithProfitOrMaxAvailable(), getCurrentPrice()))
321327
322328
323329
324330 @Callable(i)
325331 func voteForTxId (txId) = {
326332 let callerAddressString = toBase58String(i.caller.bytes)
327333 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
328334 let result = [StringEntry(keyAllowedTxId(), txId)]
329335 let allowedTxIdOption = getString(this, keyAllowedTxId())
330336 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
331337 then true
332338 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
333339 then true
334340 else (value(allowedTxIdOption) != txId))
335341 then true
336342 else throwErr((txId + " is already allowed"))]
337343 if ((err == err))
338344 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
339345 else throw("Strict value is not equal to itself.")
340346 }
341347
342348
343349 @Verifier(tx)
344350 func verify () = {
345351 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(this, keyAllowedTxId()), "")))
346352 let byOwner = if ((size(getAdminsList()) >= QUORUM))
347353 then false
348354 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
349355 if (byAdmins)
350356 then true
351357 else byOwner
352358 }
353359

github/deemru/w8io/3ef1775 
57.96 ms