tx · ApMe4NwyrUccmhwNhunZjggVJ6t45xrwj6VF2s43Tz9h

3MxPzqFNhXfv22CkzhhrnvdBQRwtYyYJo8d:  -0.01800000 Waves

2023.05.04 13:13 [2562879] smart account 3MxPzqFNhXfv22CkzhhrnvdBQRwtYyYJo8d > SELF 0.00000000 Waves

{ "type": 13, "id": "ApMe4NwyrUccmhwNhunZjggVJ6t45xrwj6VF2s43Tz9h", "fee": 1800000, "feeAssetId": null, "timestamp": 1683195271419, "version": 2, "chainId": 84, "sender": "3MxPzqFNhXfv22CkzhhrnvdBQRwtYyYJo8d", "senderPublicKey": "29woGLpVKdVUuqfnN2trGx417VC6TpVxd2gCYBAqh8xP", "proofs": [ "uxMd6Lxu8jat6Duft3BBdrajbtKCEYnrPPGbDhFnRPDS6FLRaKVZ62tUYMJFig4iyXW6TbTSxHR11AwizbwKCyS" ], "script": "base64:BgIvCAISCQoHCAgIGAEIARIAEgASCAoGCAgICAgIEgMKARgSAwoBCBIAEgASBAoCCAhBABBjb250cmFjdEZpbGVuYW1lAg91c2VyX3Bvb2xzLnJpZGUAA1NFUAICX18ADHdhdmVzQXNzZXRJZAIFV0FWRVMAB1ZMVFBPT0wCB1ZMVFBPT0wACFNUQkxQT09MAghTVEJMUE9PTAARaW52YWxpZFByaWNlQXNzZXQCE0ludmFsaWQgcHJpY2UgYXNzZXQBB3dyYXBFcnIBA21zZwkAuQkCCQDMCAIFEGNvbnRyYWN0RmlsZW5hbWUJAMwIAgICOiAJAMwIAgUDbXNnBQNuaWwCAAEIdGhyb3dFcnIBA21zZwkAAgEJAQd3cmFwRXJyAQUDbXNnAQd0aHJvd1BEAAkBCHRocm93RXJyAQIRUGVybWlzc2lvbiBkZW5pZWQBFHRocm93Q3JlYXRlTm90Q2FsbGVkAAkBCHRocm93RXJyAQIkQ3JlYXRlIGlzIG5vdCBjYWxsZWQgZm9yIGFzc2V0cyBwYWlyARF0aHJvd1lvdU5vdElzc3VlcgAJAQh0aHJvd0VycgECHllvdSBhcmUgbm90IGFtb3VudEFzc2V0IGlzc3VlcgEPdGhyb3dQb29sRXhpc3RzAAkBCHRocm93RXJyAQIkUG9vbCB3aXRoIHN1Y2ggYXNzZXRzIGFscmVhZHkgZXhpc3RzARV0aHJvd0Fzc2V0Tm90VmVyaWZpZWQACQEIdGhyb3dFcnIBAhVBc3NldCBpcyBub3QgdmVyaWZpZWQBFnRocm93SW52YWxpZFByaWNlQXNzZXQACQEIdGhyb3dFcnIBBRFpbnZhbGlkUHJpY2VBc3NldAEUdGhyb3dJbnZhbGlkRmVlQXNzZXQACQEIdGhyb3dFcnIBAhFJbnZhbGlkIGZlZSBhc3NldAEXdGhyb3dJbnZhbGlkQW1vdW50QXNzZXQACQEIdGhyb3dFcnIBAh1JbnZhbGlkIGFtb3VudCBhc3NldCBhdHRhY2hlZAESdGhyb3dJbnZhbGlkU3RhdHVzAAkBCHRocm93RXJyAQIOSW52YWxpZCBzdGF0dXMBH3Rocm93Q2FuQWN0aXZhdGVPbmx5UGVuZGluZ1Bvb2wACQEIdGhyb3dFcnIBAipDYW4gYWN0aXZhdGUgcG9vbCBvbmx5IGluICdwZW5kaW5nJyBzdGF0dXMBHXRocm93RmFjdG9yeVJldHVybmVkTm90U3RyaW5nAAkBCHRocm93RXJyAQIdRmFjdG9yeVYyIHJldHVybmVkIG5vdCBzdHJpbmcBHHRocm93SW52YWxpZFByaWNlQXNzZXRBbW91bnQACQEIdGhyb3dFcnIBAhppbnZhbGlkIHByaWNlIGFzc2V0IGFtb3VudAEPdGhyb3dJbnZhbGlkRmVlAAkBCHRocm93RXJyAQILaW52YWxpZCBmZWUBFXRocm93SW52YWxpZEFzc2V0UGFpcgAJAQh0aHJvd0VycgECEmludmFsaWQgYXNzZXQgcGFpcgETa2V5TWFuYWdlclB1YmxpY0tleQAJALkJAgkAzAgCAgIlcwkAzAgCAhBtYW5hZ2VyUHVibGljS2V5BQNuaWwFA1NFUAEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkACQC5CQIJAMwIAgICJXMJAMwIAgIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFA25pbAUDU0VQAQ9rZXlBZG1pblB1YktleXMACQC5CQIJAMwIAgICJXMJAMwIAgIMYWRtaW5QdWJLZXlzBQNuaWwFA1NFUAEJa2V5U3RhdHVzAg1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZzdGF0dXMJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQFA25pbAUDU0VQARJrZXlGYWN0b3J5Q29udHJhY3QACQC5CQIJAMwIAgICJXMJAMwIAgIPZmFjdG9yeUNvbnRyYWN0BQNuaWwFA1NFUAEWa2V5QXNzZXRzU3RvcmVDb250cmFjdAAJALkJAgkAzAgCAgIlcwkAzAgCAhNhc3NldHNTdG9yZUNvbnRyYWN0BQNuaWwFA1NFUAETa2V5RW1pc3Npb25Db250cmFjdAAJALkJAgkAzAgCAgIlcwkAzAgCAhBlbWlzc2lvbkNvbnRyYWN0BQNuaWwFA1NFUAEJa2V5U3VmZml4Ag1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZzdWZmaXgJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQFA25pbAUDU0VQAQxrZXlMYXN0SW5kZXgACQC5CQIJAMwIAgICJXMJAMwIAgIJbGFzdEluZGV4BQNuaWwFA1NFUAALaW5kZXhTdWZmaXgCAXUADXN0YXR1c1BlbmRpbmcCB3BlbmRpbmcADnN0YXR1c0RlY2xpbmVkAghkZWNsaW5lZAAMc3RhdHVzQWN0aXZlAgZhY3RpdmUACHN0YXR1c2VzCQDMCAIFDXN0YXR1c1BlbmRpbmcJAMwIAgUOc3RhdHVzRGVjbGluZWQJAMwIAgUMc3RhdHVzQWN0aXZlBQNuaWwBD2tleUNyZWF0ZUNhbGxlZAINYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIMY3JlYXRlQ2FsbGVkCQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkBQNuaWwFA1NFUAEPa2V5Q3JlYXRlQ2FsbGVyAg1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgxjcmVhdGVDYWxsZXIJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQFA25pbAUDU0VQARRrZXlBbW91bnRBc3NldEFtb3VudAINYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRYW1vdW50QXNzZXRBbW91bnQJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQFA25pbAUDU0VQARNrZXlQcmljZUFzc2V0QW1vdW50Ag1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhBwcmljZUFzc2V0QW1vdW50CQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkBQNuaWwFA1NFUAEJa2V5SGVpZ2h0Ag1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZoZWlnaHQJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQFA25pbAUDU0VQAQtrZXlQb29sVHlwZQINYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcG9vbFR5cGUJAMwIAgUNYW1vdW50QXNzZXRJZAkAzAgCBQxwcmljZUFzc2V0SWQFA25pbAUDU0VQAQ1rZXlGZWVBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCmZlZUFzc2V0SWQFA25pbAUDU0VQAQxrZXlGZWVBbW91bnQACQC5CQIJAMwIAgICJXMJAMwIAgIJZmVlQW1vdW50BQNuaWwFA1NFUAEXa2V5QW1vdW50QXNzZXRNaW5BbW91bnQACQC5CQIJAMwIAgICJXMJAMwIAgIUYW1vdW50QXNzZXRNaW5BbW91bnQFA25pbAUDU0VQARdrZXlQcmljZUFzc2V0c01pbkFtb3VudAAJALkJAgkAzAgCAgIlcwkAzAgCAhRwcmljZUFzc2V0c01pbkFtb3VudAUDbmlsBQNTRVABDmtleVByaWNlQXNzZXRzAAkAuQkCCQDMCAICAiVzCQDMCAICC3ByaWNlQXNzZXRzBQNuaWwFA1NFUAEPZ2V0U3RyaW5nT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQNrZXkJAKwCAgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBEnN0cmluZ09wdGlvblRvTGlzdAEMc3RyaW5nT3JVbml0BAckbWF0Y2gwBQxzdHJpbmdPclVuaXQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwAwkAAAIJALECAQUBcwAABQNuaWwJALUJAgUBcwUDU0VQAwkAAQIFByRtYXRjaDACBFVuaXQFA25pbAkAAgECC01hdGNoIGVycm9yAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBCQESa2V5RmFjdG9yeUNvbnRyYWN0AAAZa2V5Vm90aW5nRW1pc3Npb25Db250cmFjdAkAuQkCCQDMCAICAiVzCQDMCAICFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QFA25pbAUDU0VQABZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPZmFjdG9yeUNvbnRyYWN0BRlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0CQEHd3JhcEVycgECLHZvdGluZyBlbWlzc2lvbiBjb250cmFjdCBhZGRyZXNzIGlzIHJlcXVpcmVkACJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0CQC5CQIJAMwIAgICJXMJAMwIAgIfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUDbmlsBQNTRVAAH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBRZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0BSJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0CQEHd3JhcEVycgECNnZvdGluZyBlbWlzc2lvbiBjYW5kaWRhdGUgY29udHJhY3QgYWRkcmVzcyBpcyByZXF1aXJlZAEOaXNDcmVhdGVDYWxsZWQCDWFtb3VudEFzc2V0SWQMcHJpY2VBc3NldElkCQELdmFsdWVPckVsc2UCCQCgCAEJAQ9rZXlDcmVhdGVDYWxsZWQCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQHARBtdXN0Q3JlYXRlQ2FsbGVkAg1hbW91bnRBc3NldElkDHByaWNlQXNzZXRJZAMJAQ5pc0NyZWF0ZUNhbGxlZAIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAYJARR0aHJvd0NyZWF0ZU5vdENhbGxlZAABFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEJaXNNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkDCQEJaXNNYW5hZ2VyAQUBaQYJAQd0aHJvd1BEAAEJbXVzdEFkbWluAQFpBAhhZG1pblBLcwkBEnN0cmluZ09wdGlvblRvTGlzdAEJAKIIAQkBD2tleUFkbWluUHViS2V5cwADCQEPY29udGFpbnNFbGVtZW50AgUIYWRtaW5QS3MJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BgkBC211c3RNYW5hZ2VyAQUBaQEKaXNWZXJpZmllZAEHYXNzZXRJZAkAAAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBD2dldFN0cmluZ09yRmFpbAEJARZrZXlBc3NldHNTdG9yZUNvbnRyYWN0AAkArAICCQCsAgICCHN0YXR1c188BQdhc3NldElkAgE+AAAAAgEMZ2V0SWRBbmRJbmZvAQdwYXltZW50BAckbWF0Y2gwCAUHcGF5bWVudAdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBARpbmZvCQEFdmFsdWUBCQDsBwEFAmlkCQCUCgIJANgEAQUCaWQFBGluZm8DCQABAgUHJG1hdGNoMAIEVW5pdAkAlAoCBQx3YXZlc0Fzc2V0SWQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgELdmFsaWRTdGF0dXMBBnN0YXR1cwkBD2NvbnRhaW5zRWxlbWVudAIFCHN0YXR1c2VzBQZzdGF0dXMBB19jcmVhdGUCAWkIcG9vbFR5cGUEDWFzc2V0MVBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQNYXNzZXQyUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBA9mZWVBc3NldFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAgQLJHQwNjQwNzY0NjQJAQxnZXRJZEFuZEluZm8BBQ1hc3NldDFQYXltZW50BAhhc3NldDFJZAgFCyR0MDY0MDc2NDY0Al8xBAphc3NldDFJbmZvCAULJHQwNjQwNzY0NjQCXzIECyR0MDY0Njc2NTI0CQEMZ2V0SWRBbmRJbmZvAQUNYXNzZXQyUGF5bWVudAQIYXNzZXQySWQIBQskdDA2NDY3NjUyNAJfMQQKYXNzZXQySW5mbwgFCyR0MDY0Njc2NTI0Al8yBAskdDA2NTI3NjU5MAkBDGdldElkQW5kSW5mbwEFD2ZlZUFzc2V0UGF5bWVudAQKZmVlQXNzZXRJZAgFCyR0MDY1Mjc2NTkwAl8xBAxmZWVBc3NldEluZm8IBQskdDA2NTI3NjU5MAJfMgQPcHJpY2VBc3NldHNMaXN0CQESc3RyaW5nT3B0aW9uVG9MaXN0AQkAnQgCBQ9mYWN0b3J5Q29udHJhY3QJAQ5rZXlQcmljZUFzc2V0cwAEE2NoZWNrQXNzZXRzTm90RXF1YWwDCQECIT0CBQhhc3NldDFJZAUIYXNzZXQySWQGCQEVdGhyb3dJbnZhbGlkQXNzZXRQYWlyAAMJAAACBRNjaGVja0Fzc2V0c05vdEVxdWFsBRNjaGVja0Fzc2V0c05vdEVxdWFsBAskdDA2NzY0NzIyNQMDCQEJaXNNYW5hZ2VyAQUBaQYDCQEPY29udGFpbnNFbGVtZW50AgUPcHJpY2VBc3NldHNMaXN0BQhhc3NldDJJZAkBCmlzVmVyaWZpZWQBBQhhc3NldDFJZAcJAJYKBAUIYXNzZXQxSWQIBQ1hc3NldDFQYXltZW50BmFtb3VudAUIYXNzZXQySWQIBQ1hc3NldDJQYXltZW50BmFtb3VudAMDCQEPY29udGFpbnNFbGVtZW50AgUPcHJpY2VBc3NldHNMaXN0BQhhc3NldDFJZAkBCmlzVmVyaWZpZWQBBQhhc3NldDJJZAcJAJYKBAUIYXNzZXQySWQIBQ1hc3NldDJQYXltZW50BmFtb3VudAUIYXNzZXQxSWQIBQ1hc3NldDFQYXltZW50BmFtb3VudAkBFXRocm93SW52YWxpZEFzc2V0UGFpcgAEDWFtb3VudEFzc2V0SWQIBQskdDA2NzY0NzIyNQJfMQQRYW1vdW50QXNzZXRBbW91bnQIBQskdDA2NzY0NzIyNQJfMgQMcHJpY2VBc3NldElkCAULJHQwNjc2NDcyMjUCXzMEEHByaWNlQXNzZXRBbW91bnQIBQskdDA2NzY0NzIyNQJfNAQabWFuYWdlclByaWNlQXNzZXRNaW5BbW91bnQAAQQTcHJpY2VBc3NldE1pbkFtb3VudAMJAQlpc01hbmFnZXIBBQFpBRptYW5hZ2VyUHJpY2VBc3NldE1pbkFtb3VudAQQcHJpY2VBc3NldHNJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFD3ByaWNlQXNzZXRzTGlzdAUMcHJpY2VBc3NldElkBRFpbnZhbGlkUHJpY2VBc3NldAkBBXZhbHVlAQkAtgkBCQCRAwIJARJzdHJpbmdPcHRpb25Ub0xpc3QBCQCiCAEJARdrZXlQcmljZUFzc2V0c01pbkFtb3VudAAFEHByaWNlQXNzZXRzSW5kZXgECWxhc3RJbmRleAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEMa2V5TGFzdEluZGV4AAAABAhjdXJJbmRleAkAZAIFCWxhc3RJbmRleAABBBBlbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQkBE2tleUVtaXNzaW9uQ29udHJhY3QABApwb29sRXhpc3RzCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCEnBvb2xFeGlzdHNSRUFET05MWQkAzAgCBQ1hbW91bnRBc3NldElkCQDMCAIFDHByaWNlQXNzZXRJZAUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EBmNoZWNrcwkAzAgCAwkBASEBCQEOaXNDcmVhdGVDYWxsZWQCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQGCQEPdGhyb3dQb29sRXhpc3RzAAkAzAgCAwkBASEBBQpwb29sRXhpc3RzBgkBD3Rocm93UG9vbEV4aXN0cwAJAMwIAgMDCQEJaXNNYW5hZ2VyAQUBaQYJAAACCQCiCAEJAQ1rZXlGZWVBc3NldElkAAUKZmVlQXNzZXRJZAYJARR0aHJvd0ludmFsaWRGZWVBc3NldAAJAMwIAgMDCQEJaXNNYW5hZ2VyAQUBaQYJAGcCBRFhbW91bnRBc3NldEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBF2tleUFtb3VudEFzc2V0TWluQW1vdW50AAYJARd0aHJvd0ludmFsaWRBbW91bnRBc3NldAAJAMwIAgMDCQEJaXNNYW5hZ2VyAQUBaQYJAGcCBRBwcmljZUFzc2V0QW1vdW50BRNwcmljZUFzc2V0TWluQW1vdW50BgkBHHRocm93SW52YWxpZFByaWNlQXNzZXRBbW91bnQACQDMCAIDAwkBCWlzTWFuYWdlcgEFAWkGCQAAAggFD2ZlZUFzc2V0UGF5bWVudAZhbW91bnQJAJ8IAQkBDGtleUZlZUFtb3VudAAGCQEPdGhyb3dJbnZhbGlkRmVlAAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBNwYXltZW50c1dpdGhGZWVTaXplAAMED2J1cm5FbWlzc2lvbkludgMJAGcCCQCQAwEIBQFpCHBheW1lbnRzBRNwYXltZW50c1dpdGhGZWVTaXplCQD8BwQFEGVtaXNzaW9uQ29udHJhY3QCBGJ1cm4FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQpmZWVBc3NldElkCAUPZmVlQXNzZXRQYXltZW50BmFtb3VudAUDbmlsBQR1bml0AwkAAAIFD2J1cm5FbWlzc2lvbkludgUPYnVybkVtaXNzaW9uSW52CQDMCAIJAQxCb29sZWFuRW50cnkCCQEPa2V5Q3JlYXRlQ2FsbGVkAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBgkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5Q3JlYXRlQ2FsbGVyAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkCQClCAEIBQFpBmNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleUxhc3RJbmRleAAFCGN1ckluZGV4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQlrZXlTdWZmaXgCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQJAKwCAgkApAMBBQhjdXJJbmRleAULaW5kZXhTdWZmaXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlIZWlnaHQCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5U3RhdHVzAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBQ1zdGF0dXNQZW5kaW5nCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5QW1vdW50QXNzZXRBbW91bnQCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQFEWFtb3VudEFzc2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5UHJpY2VBc3NldEFtb3VudAIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAUQcHJpY2VBc3NldEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQELa2V5UG9vbFR5cGUCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQFCHBvb2xUeXBlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAWkBC2NvbnN0cnVjdG9yBxBmYWN0b3J5VjJBZGRyZXNzEmFzc2V0c1N0b3JlQWRkcmVzcw9lbWlzc2lvbkFkZHJlc3MUcHJpY2VBc3NldHNNaW5BbW91bnQUYW1vdW50QXNzZXRNaW5BbW91bnQKZmVlQXNzZXRJZAlmZWVBbW91bnQEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5RmFjdG9yeUNvbnRyYWN0AAUQZmFjdG9yeVYyQWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5QXNzZXRzU3RvcmVDb250cmFjdAAFEmFzc2V0c1N0b3JlQWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5RW1pc3Npb25Db250cmFjdAAFD2VtaXNzaW9uQWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEXa2V5UHJpY2VBc3NldHNNaW5BbW91bnQACQC5CQIFFHByaWNlQXNzZXRzTWluQW1vdW50BQNTRVAJAMwIAgkBDEludGVnZXJFbnRyeQIJARdrZXlBbW91bnRBc3NldE1pbkFtb3VudAAFFGFtb3VudEFzc2V0TWluQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlGZWVBc3NldElkAAUKZmVlQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGtleUZlZUFtb3VudAAFCWZlZUFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBmNyZWF0ZQAJAQdfY3JlYXRlAgUBaQUHVkxUUE9PTAFpAQxjcmVhdGVTdGFibGUABAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIJAQdfY3JlYXRlAgUBaQUIU1RCTFBPT0wJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYWN0aXZhdGUGC3Bvb2xBZGRyZXNzDWFtb3VudEFzc2V0SWQRYW1vdW50QXNzZXRUaWNrZXIMcHJpY2VBc3NldElkEHByaWNlQXNzZXRUaWNrZXIEbG9nbwQGY2hlY2tzCQDMCAIJAQltdXN0QWRtaW4BBQFpCQDMCAIDCQEOaXNDcmVhdGVDYWxsZWQCBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQGCQEUdGhyb3dDcmVhdGVOb3RDYWxsZWQACQDMCAIDCQAAAgkBBXZhbHVlAQkAoggBCQEJa2V5U3RhdHVzAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBQ1zdGF0dXNQZW5kaW5nBgkBH3Rocm93Q2FuQWN0aXZhdGVPbmx5UGVuZGluZ1Bvb2wABQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDnBvb2xUeXBlT3B0aW9uCQCdCAIFBHRoaXMJAQtrZXlQb29sVHlwZQIFDWFtb3VudEFzc2V0SWQFDHByaWNlQXNzZXRJZAQSYWN0aXZhdGVOZXdQb29sSW52CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIPYWN0aXZhdGVOZXdQb29sCQDMCAIFC3Bvb2xBZGRyZXNzCQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkCQDMCAIJAKwCAgkArAICBRFhbW91bnRBc3NldFRpY2tlcgUQcHJpY2VBc3NldFRpY2tlcgICTFAJAMwIAgkArAICCQCsAgIJAKwCAgURYW1vdW50QXNzZXRUaWNrZXICAS8FEHByaWNlQXNzZXRUaWNrZXICHiBwb29sIGxpcXVpZGl0eSBwcm92aWRlciB0b2tlbgkAzAgCAAAJAMwIAgMJAAACBQ5wb29sVHlwZU9wdGlvbgUEdW5pdAIHVkxUUE9PTAkBBXZhbHVlAQUOcG9vbFR5cGVPcHRpb24JAMwIAgUEbG9nbwUDbmlsBQNuaWwDCQAAAgUSYWN0aXZhdGVOZXdQb29sSW52BRJhY3RpdmF0ZU5ld1Bvb2xJbnYECWxwQXNzZXRJZAQHJG1hdGNoMAUSYWN0aXZhdGVOZXdQb29sSW52AwkAAQIFByRtYXRjaDACBlN0cmluZwQCaWQFByRtYXRjaDAFAmlkCQEddGhyb3dGYWN0b3J5UmV0dXJuZWROb3RTdHJpbmcAAwkAAAIFCWxwQXNzZXRJZAUJbHBBc3NldElkBAliZWZvcmVQdXQJAPAHAgUEdGhpcwkA2QQBBQlscEFzc2V0SWQDCQAAAgUJYmVmb3JlUHV0BQliZWZvcmVQdXQEA3B1dAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQtwb29sQWRkcmVzcwIDcHV0CQDMCAIAAAkAzAgCBwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCAwkAAAIFDWFtb3VudEFzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFDWFtb3VudEFzc2V0SWQJAQV2YWx1ZQEJAJ8IAQkBFGtleUFtb3VudEFzc2V0QW1vdW50AgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCAwkAAAIFDHByaWNlQXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUMcHJpY2VBc3NldElkCQEFdmFsdWUBCQCfCAEJARNrZXlQcmljZUFzc2V0QW1vdW50AgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBQNuaWwDCQAAAgUDcHV0BQNwdXQECGFmdGVyUHV0CQDwBwIFBHRoaXMJANkEAQUJbHBBc3NldElkAwkAAAIFCGFmdGVyUHV0BQhhZnRlclB1dAQEdXNlcgkBBXZhbHVlAQkApggBCQEFdmFsdWUBCQCiCAEJAQ9rZXlDcmVhdGVDYWxsZXICBQ1hbW91bnRBc3NldElkBQxwcmljZUFzc2V0SWQEA3JlcwkA/AcEBR92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0AgdhcHByb3ZlCQDMCAIFDWFtb3VudEFzc2V0SWQJAMwIAgUMcHJpY2VBc3NldElkBQNuaWwFA25pbAMJAAACBQNyZXMFA3JlcwkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5U3RhdHVzAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkBQxzdGF0dXNBY3RpdmUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUEdXNlcgkAZQIFCGFmdGVyUHV0BQliZWZvcmVQdXQJANkEAQUJbHBBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJc2V0QWRtaW5zAQxhZG1pblB1YktleXMEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5QWRtaW5QdWJLZXlzAAkAuQkCBQxhZG1pblB1YktleXMFA1NFUAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnNldE1hbmFnZXIBF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEFWNoZWNrTWFuYWdlclB1YmxpY0tleQkA2QQBBRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAACBRVjaGVja01hbmFnZXJQdWJsaWNLZXkFFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAzAgCCQELU3RyaW5nRW50cnkCCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbmZpcm1NYW5hZ2VyAAQCcG0JAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEBWhhc1BNAwkBCWlzRGVmaW5lZAEFAnBtBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQVoYXNQTQUFaGFzUE0EB2NoZWNrUE0DCQAAAggFAWkPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJwbQYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUHY2hlY2tQTQUHY2hlY2tQTQkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5TWFuYWdlclB1YmxpY0tleQAJANgEAQkBBXZhbHVlAQUCcG0JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3ByaWNlQXNzZXRzUkVBRE9OTFkACQCUCgIFA25pbAkBEnN0cmluZ09wdGlvblRvTGlzdAEJAKIIAQkBDmtleVByaWNlQXNzZXRzAAFpAQ5zdGF0dXNSRUFET05MWQINYW1vdW50QXNzZXRJZAxwcmljZUFzc2V0SWQEBnN0YXR1cwQHJG1hdGNoMAkAoggBCQEJa2V5U3RhdHVzAgUNYW1vdW50QXNzZXRJZAUMcHJpY2VBc3NldElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwUEdW5pdAkAlAoCBQNuaWwFBnN0YXR1cwECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleU1GxAA=", "height": 2562879, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4WMXUsYTEagPYSDrdXBZ7ijRPYVY9aHycgjmmYR4z7W4 Next: CqMsJXXECJhc8Hry3u8SDb2QiHJsxJVdfDtZdfQqZk6T Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let contractFilename = "user_pools.ride"
5+
46 let SEP = "__"
57
68 let wavesAssetId = "WAVES"
79
10+let VLTPOOL = "VLTPOOL"
11+
12+let STBLPOOL = "STBLPOOL"
13+
814 let invalidPriceAsset = "Invalid price asset"
915
10-func throwErr (msg) = throw(makeString(["user_pools.ride:", msg], " "))
16+func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
17+
18+
19+func throwErr (msg) = throw(wrapErr(msg))
1120
1221
1322 func throwPD () = throwErr("Permission denied")
4756
4857
4958 func throwInvalidFee () = throwErr("invalid fee")
59+
60+
61+func throwInvalidAssetPair () = throwErr("invalid asset pair")
5062
5163
5264 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
101113 func keyHeight (amountAssetId,priceAssetId) = makeString(["%s%s%s", "height", amountAssetId, priceAssetId], SEP)
102114
103115
116+func keyPoolType (amountAssetId,priceAssetId) = makeString(["%s%s%s", "poolType", amountAssetId, priceAssetId], SEP)
117+
118+
104119 func keyFeeAssetId () = makeString(["%s", "feeAssetId"], SEP)
105120
106121
132147
133148
134149 let factoryContract = addressFromStringValue(getStringOrFail(keyFactoryContract()))
150+
151+let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], SEP)
152+
153+let votingEmissionContract = addressFromStringValue(valueOrErrorMessage(getString(factoryContract, keyVotingEmissionContract), wrapErr("voting emission contract address is required")))
154+
155+let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], SEP)
156+
157+let votingEmissionCandidateContract = addressFromStringValue(valueOrErrorMessage(getString(votingEmissionContract, keyVotingEmissionCandidateContract), wrapErr("voting emission candidate contract address is required")))
135158
136159 func isCreateCalled (amountAssetId,priceAssetId) = valueOrElse(getBoolean(keyCreateCalled(amountAssetId, priceAssetId)), false)
137160
201224 func validStatus (status) = containsElement(statuses, status)
202225
203226
227+func _create (i,poolType) = {
228+ let asset1Payment = value(i.payments[0])
229+ let asset2Payment = value(i.payments[1])
230+ let feeAssetPayment = value(i.payments[2])
231+ let $t064076464 = getIdAndInfo(asset1Payment)
232+ let asset1Id = $t064076464._1
233+ let asset1Info = $t064076464._2
234+ let $t064676524 = getIdAndInfo(asset2Payment)
235+ let asset2Id = $t064676524._1
236+ let asset2Info = $t064676524._2
237+ let $t065276590 = getIdAndInfo(feeAssetPayment)
238+ let feeAssetId = $t065276590._1
239+ let feeAssetInfo = $t065276590._2
240+ let priceAssetsList = stringOptionToList(getString(factoryContract, keyPriceAssets()))
241+ let checkAssetsNotEqual = if ((asset1Id != asset2Id))
242+ then true
243+ else throwInvalidAssetPair()
244+ if ((checkAssetsNotEqual == checkAssetsNotEqual))
245+ then {
246+ let $t067647225 = if (if (isManager(i))
247+ then true
248+ else if (containsElement(priceAssetsList, asset2Id))
249+ then isVerified(asset1Id)
250+ else false)
251+ then $Tuple4(asset1Id, asset1Payment.amount, asset2Id, asset2Payment.amount)
252+ else if (if (containsElement(priceAssetsList, asset1Id))
253+ then isVerified(asset2Id)
254+ else false)
255+ then $Tuple4(asset2Id, asset2Payment.amount, asset1Id, asset1Payment.amount)
256+ else throwInvalidAssetPair()
257+ let amountAssetId = $t067647225._1
258+ let amountAssetAmount = $t067647225._2
259+ let priceAssetId = $t067647225._3
260+ let priceAssetAmount = $t067647225._4
261+ let managerPriceAssetMinAmount = 1
262+ let priceAssetMinAmount = if (isManager(i))
263+ then managerPriceAssetMinAmount
264+ else {
265+ let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
266+ value(parseInt(stringOptionToList(getString(keyPriceAssetsMinAmount()))[priceAssetsIndex]))
267+ }
268+ let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
269+ let curIndex = (lastIndex + 1)
270+ let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
271+ let poolExists = {
272+ let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
273+ if ($isInstanceOf(@, "Boolean"))
274+ then @
275+ else throw(($getType(@) + " couldn't be cast to Boolean"))
276+ }
277+ let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
278+ then true
279+ else throwPoolExists(), if (!(poolExists))
280+ then true
281+ else throwPoolExists(), if (if (isManager(i))
282+ then true
283+ else (getString(keyFeeAssetId()) == feeAssetId))
284+ then true
285+ else throwInvalidFeeAsset(), if (if (isManager(i))
286+ then true
287+ else (amountAssetAmount >= getIntegerValue(keyAmountAssetMinAmount())))
288+ then true
289+ else throwInvalidAmountAsset(), if (if (isManager(i))
290+ then true
291+ else (priceAssetAmount >= priceAssetMinAmount))
292+ then true
293+ else throwInvalidPriceAssetAmount(), if (if (isManager(i))
294+ then true
295+ else (feeAssetPayment.amount == getInteger(keyFeeAmount())))
296+ then true
297+ else throwInvalidFee()]
298+ if ((checks == checks))
299+ then {
300+ let paymentsWithFeeSize = 3
301+ let burnEmissionInv = if ((size(i.payments) >= paymentsWithFeeSize))
302+ then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetPayment.amount)])
303+ else unit
304+ if ((burnEmissionInv == burnEmissionInv))
305+ then [BooleanEntry(keyCreateCalled(amountAssetId, priceAssetId), true), StringEntry(keyCreateCaller(amountAssetId, priceAssetId), toString(i.caller)), IntegerEntry(keyLastIndex(), curIndex), StringEntry(keySuffix(amountAssetId, priceAssetId), (toString(curIndex) + indexSuffix)), IntegerEntry(keyHeight(amountAssetId, priceAssetId), height), StringEntry(keyStatus(amountAssetId, priceAssetId), statusPending), IntegerEntry(keyAmountAssetAmount(amountAssetId, priceAssetId), amountAssetAmount), IntegerEntry(keyPriceAssetAmount(amountAssetId, priceAssetId), priceAssetAmount), StringEntry(keyPoolType(amountAssetId, priceAssetId), poolType)]
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ else throw("Strict value is not equal to itself.")
309+ }
310+ else throw("Strict value is not equal to itself.")
311+ }
312+
313+
204314 @Callable(i)
205315 func constructor (factoryV2Address,assetsStoreAddress,emissionAddress,priceAssetsMinAmount,amountAssetMinAmount,feeAssetId,feeAmount) = {
206316 let checkCaller = mustManager(i)
212322
213323
214324 @Callable(i)
215-func create () = {
216- let amountAssetPayment = value(i.payments[0])
217- let priceAssetPayment = value(i.payments[1])
218- let feeAssetPayment = value(i.payments[2])
219- let $t066466718 = getIdAndInfo(amountAssetPayment)
220- let amountAssetId = $t066466718._1
221- let amountAssetInfo = $t066466718._2
222- let $t067216790 = getIdAndInfo(priceAssetPayment)
223- let priceAssetId = $t067216790._1
224- let priceAssetInfo = $t067216790._2
225- let $t067936856 = getIdAndInfo(feeAssetPayment)
226- let feeAssetId = $t067936856._1
227- let feeAssetInfo = $t067936856._2
228- let priceAssetsList = stringOptionToList(getString(factoryContract, keyPriceAssets()))
229- let managerPriceAssetMinAmount = 1
230- let priceAssetMinAmount = if (isManager(i))
231- then managerPriceAssetMinAmount
232- else {
233- let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
234- value(parseInt(stringOptionToList(getString(keyPriceAssetsMinAmount()))[priceAssetsIndex]))
235- }
236- let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
237- let curIndex = (lastIndex + 1)
238- let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
239- let poolExists = {
240- let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
241- if ($isInstanceOf(@, "Boolean"))
242- then @
243- else throw("Couldn't cast Any to Boolean")
244- }
245- let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
246- then true
247- else throwPoolExists(), if (!(poolExists))
248- then true
249- else throwPoolExists(), if (if (isManager(i))
250- then true
251- else isVerified(amountAssetId))
252- then true
253- else throwAssetNotVerified(), if ((getString(keyFeeAssetId()) == feeAssetId))
254- then true
255- else throwInvalidFeeAsset(), if (if (isManager(i))
256- then true
257- else (amountAssetPayment.amount >= getIntegerValue(keyAmountAssetMinAmount())))
258- then true
259- else throwInvalidAmountAsset(), if (if (isManager(i))
260- then true
261- else (priceAssetPayment.amount >= priceAssetMinAmount))
262- then true
263- else throwInvalidPriceAssetAmount(), if ((feeAssetPayment.amount == getInteger(keyFeeAmount())))
264- then true
265- else throwInvalidFee()]
266- if ((checks == checks))
267- then {
268- let burnEmissionInv = invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetPayment.amount)])
269- if ((burnEmissionInv == burnEmissionInv))
270- then [BooleanEntry(keyCreateCalled(amountAssetId, priceAssetId), true), StringEntry(keyCreateCaller(amountAssetId, priceAssetId), toString(i.caller)), IntegerEntry(keyLastIndex(), curIndex), StringEntry(keySuffix(amountAssetId, priceAssetId), (toString(curIndex) + indexSuffix)), IntegerEntry(keyHeight(amountAssetId, priceAssetId), height), StringEntry(keyStatus(amountAssetId, priceAssetId), statusPending), IntegerEntry(keyAmountAssetAmount(amountAssetId, priceAssetId), amountAssetPayment.amount), IntegerEntry(keyPriceAssetAmount(amountAssetId, priceAssetId), priceAssetPayment.amount)]
271- else throw("Strict value is not equal to itself.")
272- }
325+func create () = _create(i, VLTPOOL)
326+
327+
328+
329+@Callable(i)
330+func createStable () = {
331+ let checkCaller = mustManager(i)
332+ if ((checkCaller == checkCaller))
333+ then _create(i, STBLPOOL)
273334 else throw("Strict value is not equal to itself.")
274335 }
275336
284345 else throwCanActivateOnlyPendingPool()]
285346 if ((checks == checks))
286347 then {
287- let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, "VLTPOOL", logo], nil)
348+ let poolTypeOption = getString(this, keyPoolType(amountAssetId, priceAssetId))
349+ let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, if ((poolTypeOption == unit))
350+ then "VLTPOOL"
351+ else value(poolTypeOption), logo], nil)
288352 if ((activateNewPoolInv == activateNewPoolInv))
289353 then {
290354 let lpAssetId = match activateNewPoolInv {
309373 if ((afterPut == afterPut))
310374 then {
311375 let user = value(addressFromString(value(getString(keyCreateCaller(amountAssetId, priceAssetId)))))
312-[StringEntry(keyStatus(amountAssetId, priceAssetId), statusActive), ScriptTransfer(user, (afterPut - beforePut), fromBase58String(lpAssetId))]
376+ let res = invoke(votingEmissionCandidateContract, "approve", [amountAssetId, priceAssetId], nil)
377+ if ((res == res))
378+ then [StringEntry(keyStatus(amountAssetId, priceAssetId), statusActive), ScriptTransfer(user, (afterPut - beforePut), fromBase58String(lpAssetId))]
379+ else throw("Strict value is not equal to itself.")
313380 }
314381 else throw("Strict value is not equal to itself.")
315382 }
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let contractFilename = "user_pools.ride"
5+
46 let SEP = "__"
57
68 let wavesAssetId = "WAVES"
79
10+let VLTPOOL = "VLTPOOL"
11+
12+let STBLPOOL = "STBLPOOL"
13+
814 let invalidPriceAsset = "Invalid price asset"
915
10-func throwErr (msg) = throw(makeString(["user_pools.ride:", msg], " "))
16+func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
17+
18+
19+func throwErr (msg) = throw(wrapErr(msg))
1120
1221
1322 func throwPD () = throwErr("Permission denied")
1423
1524
1625 func throwCreateNotCalled () = throwErr("Create is not called for assets pair")
1726
1827
1928 func throwYouNotIssuer () = throwErr("You are not amountAsset issuer")
2029
2130
2231 func throwPoolExists () = throwErr("Pool with such assets already exists")
2332
2433
2534 func throwAssetNotVerified () = throwErr("Asset is not verified")
2635
2736
2837 func throwInvalidPriceAsset () = throwErr(invalidPriceAsset)
2938
3039
3140 func throwInvalidFeeAsset () = throwErr("Invalid fee asset")
3241
3342
3443 func throwInvalidAmountAsset () = throwErr("Invalid amount asset attached")
3544
3645
3746 func throwInvalidStatus () = throwErr("Invalid status")
3847
3948
4049 func throwCanActivateOnlyPendingPool () = throwErr("Can activate pool only in 'pending' status")
4150
4251
4352 func throwFactoryReturnedNotString () = throwErr("FactoryV2 returned not string")
4453
4554
4655 func throwInvalidPriceAssetAmount () = throwErr("invalid price asset amount")
4756
4857
4958 func throwInvalidFee () = throwErr("invalid fee")
59+
60+
61+func throwInvalidAssetPair () = throwErr("invalid asset pair")
5062
5163
5264 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
5365
5466
5567 func keyPendingManagerPublicKey () = makeString(["%s", "pendingManagerPublicKey"], SEP)
5668
5769
5870 func keyAdminPubKeys () = makeString(["%s", "adminPubKeys"], SEP)
5971
6072
6173 func keyStatus (amountAssetId,priceAssetId) = makeString(["%s%s%s", "status", amountAssetId, priceAssetId], SEP)
6274
6375
6476 func keyFactoryContract () = makeString(["%s", "factoryContract"], SEP)
6577
6678
6779 func keyAssetsStoreContract () = makeString(["%s", "assetsStoreContract"], SEP)
6880
6981
7082 func keyEmissionContract () = makeString(["%s", "emissionContract"], SEP)
7183
7284
7385 func keySuffix (amountAssetId,priceAssetId) = makeString(["%s%s%s", "suffix", amountAssetId, priceAssetId], SEP)
7486
7587
7688 func keyLastIndex () = makeString(["%s", "lastIndex"], SEP)
7789
7890
7991 let indexSuffix = "u"
8092
8193 let statusPending = "pending"
8294
8395 let statusDeclined = "declined"
8496
8597 let statusActive = "active"
8698
8799 let statuses = [statusPending, statusDeclined, statusActive]
88100
89101 func keyCreateCalled (amountAssetId,priceAssetId) = makeString(["%s%s%s", "createCalled", amountAssetId, priceAssetId], SEP)
90102
91103
92104 func keyCreateCaller (amountAssetId,priceAssetId) = makeString(["%s%s%s", "createCaller", amountAssetId, priceAssetId], SEP)
93105
94106
95107 func keyAmountAssetAmount (amountAssetId,priceAssetId) = makeString(["%s%s%s", "amountAssetAmount", amountAssetId, priceAssetId], SEP)
96108
97109
98110 func keyPriceAssetAmount (amountAssetId,priceAssetId) = makeString(["%s%s%s", "priceAssetAmount", amountAssetId, priceAssetId], SEP)
99111
100112
101113 func keyHeight (amountAssetId,priceAssetId) = makeString(["%s%s%s", "height", amountAssetId, priceAssetId], SEP)
102114
103115
116+func keyPoolType (amountAssetId,priceAssetId) = makeString(["%s%s%s", "poolType", amountAssetId, priceAssetId], SEP)
117+
118+
104119 func keyFeeAssetId () = makeString(["%s", "feeAssetId"], SEP)
105120
106121
107122 func keyFeeAmount () = makeString(["%s", "feeAmount"], SEP)
108123
109124
110125 func keyAmountAssetMinAmount () = makeString(["%s", "amountAssetMinAmount"], SEP)
111126
112127
113128 func keyPriceAssetsMinAmount () = makeString(["%s", "priceAssetsMinAmount"], SEP)
114129
115130
116131 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
117132
118133
119134 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
120135
121136
122137 func stringOptionToList (stringOrUnit) = match stringOrUnit {
123138 case s: String =>
124139 if ((size(s) == 0))
125140 then nil
126141 else split(s, SEP)
127142 case _: Unit =>
128143 nil
129144 case _ =>
130145 throw("Match error")
131146 }
132147
133148
134149 let factoryContract = addressFromStringValue(getStringOrFail(keyFactoryContract()))
150+
151+let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], SEP)
152+
153+let votingEmissionContract = addressFromStringValue(valueOrErrorMessage(getString(factoryContract, keyVotingEmissionContract), wrapErr("voting emission contract address is required")))
154+
155+let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], SEP)
156+
157+let votingEmissionCandidateContract = addressFromStringValue(valueOrErrorMessage(getString(votingEmissionContract, keyVotingEmissionCandidateContract), wrapErr("voting emission candidate contract address is required")))
135158
136159 func isCreateCalled (amountAssetId,priceAssetId) = valueOrElse(getBoolean(keyCreateCalled(amountAssetId, priceAssetId)), false)
137160
138161
139162 func mustCreateCalled (amountAssetId,priceAssetId) = if (isCreateCalled(amountAssetId, priceAssetId))
140163 then true
141164 else throwCreateNotCalled()
142165
143166
144167 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
145168 case s: String =>
146169 fromBase58String(s)
147170 case _: Unit =>
148171 unit
149172 case _ =>
150173 throw("Match error")
151174 }
152175
153176
154177 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
155178 case s: String =>
156179 fromBase58String(s)
157180 case _: Unit =>
158181 unit
159182 case _ =>
160183 throw("Match error")
161184 }
162185
163186
164187 func isManager (i) = match managerPublicKeyOrUnit() {
165188 case pk: ByteVector =>
166189 (i.callerPublicKey == pk)
167190 case _: Unit =>
168191 (i.caller == this)
169192 case _ =>
170193 throw("Match error")
171194 }
172195
173196
174197 func mustManager (i) = if (isManager(i))
175198 then true
176199 else throwPD()
177200
178201
179202 func mustAdmin (i) = {
180203 let adminPKs = stringOptionToList(getString(keyAdminPubKeys()))
181204 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
182205 then true
183206 else mustManager(i)
184207 }
185208
186209
187210 func isVerified (assetId) = (valueOrElse(getInteger(addressFromStringValue(getStringOrFail(keyAssetsStoreContract())), (("status_<" + assetId) + ">")), 0) == 2)
188211
189212
190213 func getIdAndInfo (payment) = match payment.assetId {
191214 case id: ByteVector =>
192215 let info = value(assetInfo(id))
193216 $Tuple2(toBase58String(id), info)
194217 case _: Unit =>
195218 $Tuple2(wavesAssetId, unit)
196219 case _ =>
197220 throw("Match error")
198221 }
199222
200223
201224 func validStatus (status) = containsElement(statuses, status)
202225
203226
227+func _create (i,poolType) = {
228+ let asset1Payment = value(i.payments[0])
229+ let asset2Payment = value(i.payments[1])
230+ let feeAssetPayment = value(i.payments[2])
231+ let $t064076464 = getIdAndInfo(asset1Payment)
232+ let asset1Id = $t064076464._1
233+ let asset1Info = $t064076464._2
234+ let $t064676524 = getIdAndInfo(asset2Payment)
235+ let asset2Id = $t064676524._1
236+ let asset2Info = $t064676524._2
237+ let $t065276590 = getIdAndInfo(feeAssetPayment)
238+ let feeAssetId = $t065276590._1
239+ let feeAssetInfo = $t065276590._2
240+ let priceAssetsList = stringOptionToList(getString(factoryContract, keyPriceAssets()))
241+ let checkAssetsNotEqual = if ((asset1Id != asset2Id))
242+ then true
243+ else throwInvalidAssetPair()
244+ if ((checkAssetsNotEqual == checkAssetsNotEqual))
245+ then {
246+ let $t067647225 = if (if (isManager(i))
247+ then true
248+ else if (containsElement(priceAssetsList, asset2Id))
249+ then isVerified(asset1Id)
250+ else false)
251+ then $Tuple4(asset1Id, asset1Payment.amount, asset2Id, asset2Payment.amount)
252+ else if (if (containsElement(priceAssetsList, asset1Id))
253+ then isVerified(asset2Id)
254+ else false)
255+ then $Tuple4(asset2Id, asset2Payment.amount, asset1Id, asset1Payment.amount)
256+ else throwInvalidAssetPair()
257+ let amountAssetId = $t067647225._1
258+ let amountAssetAmount = $t067647225._2
259+ let priceAssetId = $t067647225._3
260+ let priceAssetAmount = $t067647225._4
261+ let managerPriceAssetMinAmount = 1
262+ let priceAssetMinAmount = if (isManager(i))
263+ then managerPriceAssetMinAmount
264+ else {
265+ let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
266+ value(parseInt(stringOptionToList(getString(keyPriceAssetsMinAmount()))[priceAssetsIndex]))
267+ }
268+ let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
269+ let curIndex = (lastIndex + 1)
270+ let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
271+ let poolExists = {
272+ let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
273+ if ($isInstanceOf(@, "Boolean"))
274+ then @
275+ else throw(($getType(@) + " couldn't be cast to Boolean"))
276+ }
277+ let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
278+ then true
279+ else throwPoolExists(), if (!(poolExists))
280+ then true
281+ else throwPoolExists(), if (if (isManager(i))
282+ then true
283+ else (getString(keyFeeAssetId()) == feeAssetId))
284+ then true
285+ else throwInvalidFeeAsset(), if (if (isManager(i))
286+ then true
287+ else (amountAssetAmount >= getIntegerValue(keyAmountAssetMinAmount())))
288+ then true
289+ else throwInvalidAmountAsset(), if (if (isManager(i))
290+ then true
291+ else (priceAssetAmount >= priceAssetMinAmount))
292+ then true
293+ else throwInvalidPriceAssetAmount(), if (if (isManager(i))
294+ then true
295+ else (feeAssetPayment.amount == getInteger(keyFeeAmount())))
296+ then true
297+ else throwInvalidFee()]
298+ if ((checks == checks))
299+ then {
300+ let paymentsWithFeeSize = 3
301+ let burnEmissionInv = if ((size(i.payments) >= paymentsWithFeeSize))
302+ then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetPayment.amount)])
303+ else unit
304+ if ((burnEmissionInv == burnEmissionInv))
305+ then [BooleanEntry(keyCreateCalled(amountAssetId, priceAssetId), true), StringEntry(keyCreateCaller(amountAssetId, priceAssetId), toString(i.caller)), IntegerEntry(keyLastIndex(), curIndex), StringEntry(keySuffix(amountAssetId, priceAssetId), (toString(curIndex) + indexSuffix)), IntegerEntry(keyHeight(amountAssetId, priceAssetId), height), StringEntry(keyStatus(amountAssetId, priceAssetId), statusPending), IntegerEntry(keyAmountAssetAmount(amountAssetId, priceAssetId), amountAssetAmount), IntegerEntry(keyPriceAssetAmount(amountAssetId, priceAssetId), priceAssetAmount), StringEntry(keyPoolType(amountAssetId, priceAssetId), poolType)]
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ else throw("Strict value is not equal to itself.")
309+ }
310+ else throw("Strict value is not equal to itself.")
311+ }
312+
313+
204314 @Callable(i)
205315 func constructor (factoryV2Address,assetsStoreAddress,emissionAddress,priceAssetsMinAmount,amountAssetMinAmount,feeAssetId,feeAmount) = {
206316 let checkCaller = mustManager(i)
207317 if ((checkCaller == checkCaller))
208318 then [StringEntry(keyFactoryContract(), factoryV2Address), StringEntry(keyAssetsStoreContract(), assetsStoreAddress), StringEntry(keyEmissionContract(), emissionAddress), StringEntry(keyPriceAssetsMinAmount(), makeString(priceAssetsMinAmount, SEP)), IntegerEntry(keyAmountAssetMinAmount(), amountAssetMinAmount), StringEntry(keyFeeAssetId(), feeAssetId), IntegerEntry(keyFeeAmount(), feeAmount)]
209319 else throw("Strict value is not equal to itself.")
210320 }
211321
212322
213323
214324 @Callable(i)
215-func create () = {
216- let amountAssetPayment = value(i.payments[0])
217- let priceAssetPayment = value(i.payments[1])
218- let feeAssetPayment = value(i.payments[2])
219- let $t066466718 = getIdAndInfo(amountAssetPayment)
220- let amountAssetId = $t066466718._1
221- let amountAssetInfo = $t066466718._2
222- let $t067216790 = getIdAndInfo(priceAssetPayment)
223- let priceAssetId = $t067216790._1
224- let priceAssetInfo = $t067216790._2
225- let $t067936856 = getIdAndInfo(feeAssetPayment)
226- let feeAssetId = $t067936856._1
227- let feeAssetInfo = $t067936856._2
228- let priceAssetsList = stringOptionToList(getString(factoryContract, keyPriceAssets()))
229- let managerPriceAssetMinAmount = 1
230- let priceAssetMinAmount = if (isManager(i))
231- then managerPriceAssetMinAmount
232- else {
233- let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
234- value(parseInt(stringOptionToList(getString(keyPriceAssetsMinAmount()))[priceAssetsIndex]))
235- }
236- let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
237- let curIndex = (lastIndex + 1)
238- let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
239- let poolExists = {
240- let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
241- if ($isInstanceOf(@, "Boolean"))
242- then @
243- else throw("Couldn't cast Any to Boolean")
244- }
245- let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
246- then true
247- else throwPoolExists(), if (!(poolExists))
248- then true
249- else throwPoolExists(), if (if (isManager(i))
250- then true
251- else isVerified(amountAssetId))
252- then true
253- else throwAssetNotVerified(), if ((getString(keyFeeAssetId()) == feeAssetId))
254- then true
255- else throwInvalidFeeAsset(), if (if (isManager(i))
256- then true
257- else (amountAssetPayment.amount >= getIntegerValue(keyAmountAssetMinAmount())))
258- then true
259- else throwInvalidAmountAsset(), if (if (isManager(i))
260- then true
261- else (priceAssetPayment.amount >= priceAssetMinAmount))
262- then true
263- else throwInvalidPriceAssetAmount(), if ((feeAssetPayment.amount == getInteger(keyFeeAmount())))
264- then true
265- else throwInvalidFee()]
266- if ((checks == checks))
267- then {
268- let burnEmissionInv = invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetPayment.amount)])
269- if ((burnEmissionInv == burnEmissionInv))
270- then [BooleanEntry(keyCreateCalled(amountAssetId, priceAssetId), true), StringEntry(keyCreateCaller(amountAssetId, priceAssetId), toString(i.caller)), IntegerEntry(keyLastIndex(), curIndex), StringEntry(keySuffix(amountAssetId, priceAssetId), (toString(curIndex) + indexSuffix)), IntegerEntry(keyHeight(amountAssetId, priceAssetId), height), StringEntry(keyStatus(amountAssetId, priceAssetId), statusPending), IntegerEntry(keyAmountAssetAmount(amountAssetId, priceAssetId), amountAssetPayment.amount), IntegerEntry(keyPriceAssetAmount(amountAssetId, priceAssetId), priceAssetPayment.amount)]
271- else throw("Strict value is not equal to itself.")
272- }
325+func create () = _create(i, VLTPOOL)
326+
327+
328+
329+@Callable(i)
330+func createStable () = {
331+ let checkCaller = mustManager(i)
332+ if ((checkCaller == checkCaller))
333+ then _create(i, STBLPOOL)
273334 else throw("Strict value is not equal to itself.")
274335 }
275336
276337
277338
278339 @Callable(i)
279340 func activate (poolAddress,amountAssetId,amountAssetTicker,priceAssetId,priceAssetTicker,logo) = {
280341 let checks = [mustAdmin(i), if (isCreateCalled(amountAssetId, priceAssetId))
281342 then true
282343 else throwCreateNotCalled(), if ((value(getString(keyStatus(amountAssetId, priceAssetId))) == statusPending))
283344 then true
284345 else throwCanActivateOnlyPendingPool()]
285346 if ((checks == checks))
286347 then {
287- let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, "VLTPOOL", logo], nil)
348+ let poolTypeOption = getString(this, keyPoolType(amountAssetId, priceAssetId))
349+ let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, if ((poolTypeOption == unit))
350+ then "VLTPOOL"
351+ else value(poolTypeOption), logo], nil)
288352 if ((activateNewPoolInv == activateNewPoolInv))
289353 then {
290354 let lpAssetId = match activateNewPoolInv {
291355 case id: String =>
292356 id
293357 case _ =>
294358 throwFactoryReturnedNotString()
295359 }
296360 if ((lpAssetId == lpAssetId))
297361 then {
298362 let beforePut = assetBalance(this, fromBase58String(lpAssetId))
299363 if ((beforePut == beforePut))
300364 then {
301365 let put = invoke(addressFromStringValue(poolAddress), "put", [0, false], [AttachedPayment(if ((amountAssetId == "WAVES"))
302366 then unit
303367 else fromBase58String(amountAssetId), value(getInteger(keyAmountAssetAmount(amountAssetId, priceAssetId)))), AttachedPayment(if ((priceAssetId == "WAVES"))
304368 then unit
305369 else fromBase58String(priceAssetId), value(getInteger(keyPriceAssetAmount(amountAssetId, priceAssetId))))])
306370 if ((put == put))
307371 then {
308372 let afterPut = assetBalance(this, fromBase58String(lpAssetId))
309373 if ((afterPut == afterPut))
310374 then {
311375 let user = value(addressFromString(value(getString(keyCreateCaller(amountAssetId, priceAssetId)))))
312-[StringEntry(keyStatus(amountAssetId, priceAssetId), statusActive), ScriptTransfer(user, (afterPut - beforePut), fromBase58String(lpAssetId))]
376+ let res = invoke(votingEmissionCandidateContract, "approve", [amountAssetId, priceAssetId], nil)
377+ if ((res == res))
378+ then [StringEntry(keyStatus(amountAssetId, priceAssetId), statusActive), ScriptTransfer(user, (afterPut - beforePut), fromBase58String(lpAssetId))]
379+ else throw("Strict value is not equal to itself.")
313380 }
314381 else throw("Strict value is not equal to itself.")
315382 }
316383 else throw("Strict value is not equal to itself.")
317384 }
318385 else throw("Strict value is not equal to itself.")
319386 }
320387 else throw("Strict value is not equal to itself.")
321388 }
322389 else throw("Strict value is not equal to itself.")
323390 }
324391 else throw("Strict value is not equal to itself.")
325392 }
326393
327394
328395
329396 @Callable(i)
330397 func setAdmins (adminPubKeys) = {
331398 let checkCaller = mustManager(i)
332399 if ((checkCaller == checkCaller))
333400 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
334401 else throw("Strict value is not equal to itself.")
335402 }
336403
337404
338405
339406 @Callable(i)
340407 func setManager (pendingManagerPublicKey) = {
341408 let checkCaller = mustManager(i)
342409 if ((checkCaller == checkCaller))
343410 then {
344411 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
345412 if ((checkManagerPublicKey == checkManagerPublicKey))
346413 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
347414 else throw("Strict value is not equal to itself.")
348415 }
349416 else throw("Strict value is not equal to itself.")
350417 }
351418
352419
353420
354421 @Callable(i)
355422 func confirmManager () = {
356423 let pm = pendingManagerPublicKeyOrUnit()
357424 let hasPM = if (isDefined(pm))
358425 then true
359426 else throw("No pending manager")
360427 if ((hasPM == hasPM))
361428 then {
362429 let checkPM = if ((i.callerPublicKey == value(pm)))
363430 then true
364431 else throw("You are not pending manager")
365432 if ((checkPM == checkPM))
366433 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
367434 else throw("Strict value is not equal to itself.")
368435 }
369436 else throw("Strict value is not equal to itself.")
370437 }
371438
372439
373440
374441 @Callable(i)
375442 func priceAssetsREADONLY () = $Tuple2(nil, stringOptionToList(getString(keyPriceAssets())))
376443
377444
378445
379446 @Callable(i)
380447 func statusREADONLY (amountAssetId,priceAssetId) = {
381448 let status = match getString(keyStatus(amountAssetId, priceAssetId)) {
382449 case s: String =>
383450 s
384451 case _ =>
385452 unit
386453 }
387454 $Tuple2(nil, status)
388455 }
389456
390457
391458 @Verifier(tx)
392459 func verify () = {
393460 let targetPublicKey = match managerPublicKeyOrUnit() {
394461 case pk: ByteVector =>
395462 pk
396463 case _: Unit =>
397464 tx.senderPublicKey
398465 case _ =>
399466 throw("Match error")
400467 }
401468 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
402469 }
403470

github/deemru/w8io/873ac7e 
116.12 ms