tx · H4cjs3n8JTZLZRkYi6Fen5WkDn8g1cQvqXCCtmSZc2PD

3N1ytAUyhtig9X6F2hHHs1jbzYxr47Yp8Fr:  -0.01700000 Waves

2024.12.19 16:02 [3421446] smart account 3N1ytAUyhtig9X6F2hHHs1jbzYxr47Yp8Fr > SELF 0.00000000 Waves

{ "type": 13, "id": "H4cjs3n8JTZLZRkYi6Fen5WkDn8g1cQvqXCCtmSZc2PD", "fee": 1700000, "feeAssetId": null, "timestamp": 1734613398459, "version": 2, "chainId": 84, "sender": "3N1ytAUyhtig9X6F2hHHs1jbzYxr47Yp8Fr", "senderPublicKey": "jXCTQV8PjX2uC9UHBFveupYy9cjhY7stHbzE9cptymw", "proofs": [ "55BCpepB7qy9N1HhU6b3cSWQN6WnRWxqd3TVNLHSQ75RJzHZ1K2yB6D2nyBNBdBgPRqU133LmGc7UUfBVst2Bi6g" ], "script": "base64:BwIrCAISAwoBCBIECgICGBIECgICGBIECgICGBIECgICGBIECgICGBIECgICGDkACXNlcGFyYXRvcgICX18AC3dhdmVzU3RyaW5nAgVXQVZFUwAQY29udHJhY3RGaWxlbmFtZQIXbWVtZV9pbV9jYWxjdWxhdG9yLnJpZGUABW11bHQ4AIDC1y8BB3dyYXBFcnIBAXMJAKwCAgkArAICBRBjb250cmFjdEZpbGVuYW1lAgI6IAUBcwEIdGhyb3dFcnIBAXMJAAIBCQEHd3JhcEVycgEFAXMBD3ZhbGlkYXRlQWRkcmVzcwEHYWRkcmVzcwkBCWlzRGVmaW5lZAEJAKYIAQUHYWRkcmVzcwAMU1RBVFVTX0VNUFRZAAAADFNUQVRVU19SRUFEWQABABVTVEFUVVNfVEFSR0VUX1JFQUNIRUQAAgASU1RBVFVTX1RSQU5TRkVSUkVEAAMAC2RlZmF1bHRMb2dvAqABPHN2ZyB3aWR0aD0nMzAnIGhlaWdodD0nMzAnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGc+PGNpcmNsZSBjeD0nMTUnIGN5PScxNScgZmlsbD0nI2NjYycgcj0nMTUnLz48dGV4dCBzdHJva2U9JyMwJyB4PSc2JyB5PScyMCc+aU08L3RleHQ+PC9nPjwvc3ZnPgAJa1NodXRkb3duAg5zaHV0ZG93bl9fZmxhZwALa1ByaWNlQXNzZXQCDHByaWNlX19hc3NldAAOa0xpc3RpbmdWb2x1bWUCD2xpc3RpbmdfX3ZvbHVtZQAMa0NyZWF0aW9uRmVlAhJzZXR1cF9fY3JlYXRpb25GZWUADGtDdXJ2ZVRhcmdldAISc2V0dXBfX2N1cnZlVGFyZ2V0ABFrVmlydHVhbExpcXVpZGl0eQIXc2V0dXBfX3ZpcnR1YWxMaXF1aWRpdHkAD2tQb29sVG9rZW5zTGlzdAIPc3RhdGljX3Rva2VuSWRzABFrUG9vbENvbnRyYWN0SGFzaAIUcG9vbF9fY29udHJhY3RfX2hhc2gAE2tMYXN0RW1wdHlQb29sSW5kZXgCF2xhc3RfX2VtcHR5X3Bvb2xfX2luZGV4ABRrRmlyc3RFbXB0eVBvb2xJbmRleAIZZmlyc3RfX2VtcHR5X19wb29sX19pbmRleAEVa1Bvb2xBZGRyZXNzRnJvbUluZGV4AQVpbmRleAkAuQkCCQDMCAICBHBvb2wJAMwIAgkApAMBBQVpbmRleAUDbmlsBQlzZXBhcmF0b3IBFWtQb29sSW5kZXhGcm9tQWRkcmVzcwEHYWRkcmVzcwkAuQkCCQDMCAICBHBvb2wJAMwIAgkApQgBBQdhZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEKa1Bvb2xBc3NldAEHYWRkcmVzcwkAuQkCCQDMCAICBWFzc2V0CQDMCAIJAKUIAQUHYWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBC2tQb29sU3RhdHVzAQVpbmRleAkAuQkCCQDMCAICBHBvb2wJAMwIAgIGc3RhdHVzCQDMCAIJAKQDAQUFaW5kZXgFA25pbAUJc2VwYXJhdG9yAA9rRmFjdG9yeUFkZHJlc3MCEGZhY3RvcnlfX2FkZHJlc3MAFGZhY3RvcnlBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMFD2tGYWN0b3J5QWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IADmZhY3RvcnlBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFGZhY3RvcnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECF2ludmFsaWQgZmFjdG9yeSBhZGRyZXNzAA5rV3hTd2FwQWRkcmVzcwIPd3hzd2FwX19hZGRyZXNzABN3eFN3YXBBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFDmZhY3RvcnlBZGRyZXNzBQ5rV3hTd2FwQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwUEdW5pdAANd3hTd2FwQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRN3eFN3YXBBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECF2ludmFsaWQgd3ggc3dhcCBhZGRyZXNzABRrRmVlQ29sbGVjdG9yQWRkcmVzcwINd3hmZWVfYWRkcmVzcwAZZmVlQ29sbGVjdG9yQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwUUa0ZlZUNvbGxlY3RvckFkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQAE2ZlZUNvbGxlY3RvckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUZZmVlQ29sbGVjdG9yQWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAh1pbnZhbGlkIGZlZSBjb2xsZWN0b3IgYWRkcmVzcwARa1VzZXJQb29sc0FkZHJlc3MCEXVzZXJwb29sc19hZGRyZXNzABZ1c2VyUG9vbHNBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFDmZhY3RvcnlBZGRyZXNzBRFrVXNlclBvb2xzQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwUEdW5pdAAQdXNlclBvb2xzQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRZ1c2VyUG9vbHNBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECH2ludmFsaWQgdXNlcl9wb29scyBkYXBwIGFkZHJlc3MAEmtBc3NldFN0b3JlQWRkcmVzcwISYXNzZXRzdG9yZV9hZGRyZXNzABdhc3NldFN0b3JlQWRkcmVzc09wdGlvbgQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwUSa0Fzc2V0U3RvcmVBZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzBQR1bml0ABFhc3NldFN0b3JlQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRdhc3NldFN0b3JlQWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAiBpbnZhbGlkIGFzc2V0X3N0b3JlIGRhcHAgYWRkcmVzcwAIc2h1dGRvd24JAQt2YWx1ZU9yRWxzZQIJAJsIAgUOZmFjdG9yeUFkZHJlc3MFCWtTaHV0ZG93bgcADmxhc3RFbXB0eUluZGV4CQELdmFsdWVPckVsc2UCCQCaCAIFDmZhY3RvcnlBZGRyZXNzBRNrTGFzdEVtcHR5UG9vbEluZGV4AAAAD2ZpcnN0RW1wdHlJbmRleAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5mYWN0b3J5QWRkcmVzcwUUa0ZpcnN0RW1wdHlQb29sSW5kZXgAAAANbGlzdGluZ1ZvbHVtZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5mYWN0b3J5QWRkcmVzcwUOa0xpc3RpbmdWb2x1bWUAAAALY3JlYXRpb25GZWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOZmFjdG9yeUFkZHJlc3MFDGtDcmVhdGlvbkZlZQAAABBwb29sQ29udHJhY3RIYXNoCQCcCAIFDmZhY3RvcnlBZGRyZXNzBRFrUG9vbENvbnRyYWN0SGFzaAEMcGFyc2VBc3NldElkAQVpbnB1dAMJAAACBQVpbnB1dAULd2F2ZXNTdHJpbmcFBHVuaXQJANkEAQUFaW5wdXQBD2Fzc2V0SWRUb1N0cmluZwEFaW5wdXQDCQAAAgUFaW5wdXQFBHVuaXQFC3dhdmVzU3RyaW5nCQDYBAEJAQV2YWx1ZQEFBWlucHV0AQttdXN0QWRkcmVzcwIGY2FsbGVyB2FkZHJlc3MDCQAAAgUGY2FsbGVyBQdhZGRyZXNzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQBCG11c3RUaGlzAQZjYWxsZXIJAQttdXN0QWRkcmVzcwIFBmNhbGxlcgUEdGhpcwELbXVzdEZhY3RvcnkBBmNhbGxlcgkBC211c3RBZGRyZXNzAgUGY2FsbGVyBQ5mYWN0b3J5QWRkcmVzcwETY2hlY2tDb250cmFjdFNjcmlwdAEHYWRkcmVzcwQHJG1hdGNoMAUQcG9vbENvbnRyYWN0SGFzaAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBARoYXNoBQckbWF0Y2gwCQAAAgkA8QcBBQdhZGRyZXNzBQRoYXNoBgEMaXNQb29sRXhpc3RzAQtwb29sQWRkcmVzcwkBCWlzRGVmaW5lZAEJAJoIAgUOZmFjdG9yeUFkZHJlc3MJARVrUG9vbEluZGV4RnJvbUFkZHJlc3MBBQtwb29sQWRkcmVzcwEJZ2V0UG9vbElkAQtwb29sQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDmZhY3RvcnlBZGRyZXNzCQEVa1Bvb2xJbmRleEZyb21BZGRyZXNzAQULcG9vbEFkZHJlc3MCE3Bvb2wgZG9lc24ndCBleGlzdHMBE2lzUG9vbFRhcmdldFJlYWNoZWQBC3Bvb2xBZGRyZXNzCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5mYWN0b3J5QWRkcmVzcwkBC2tQb29sU3RhdHVzAQkBCWdldFBvb2xJZAEFC3Bvb2xBZGRyZXNzAP///////////wEFFVNUQVRVU19UQVJHRVRfUkVBQ0hFRAEKZ2V0QmFsYW5jZQIHYWRkcmVzcwdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFB2FkZHJlc3MFAmlkCAkA7wcBBQdhZGRyZXNzCWF2YWlsYWJsZQcBaQEEaW5pdAERZmFjdG9yeUFkZHJlc3NTdHIEC2NoZWNrQ2FsbGVyCQEIbXVzdFRoaXMBCAUBaQZjYWxsZXIDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tGYWN0b3J5QWRkcmVzcwURZmFjdG9yeUFkZHJlc3NTdHIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxhZGRFbXB0eVBvb2wCD2NhbGxlclB1YmxpY0tleQRhcmdzBA5uZXdQb29sQWRkcmVzcwkApwgBBQ9jYWxsZXJQdWJsaWNLZXkEDG5ld1Bvb2xJbmRleAkAZAIFDmxhc3RFbXB0eUluZGV4AAEEBmNoZWNrcwkAzAgCAwkBASEBBQhzaHV0ZG93bgYJAQh0aHJvd0VycgECFm5vdCBhbGxvd2VkIChzaHV0ZG93bikJAMwIAgMJARNjaGVja0NvbnRyYWN0U2NyaXB0AQUObmV3UG9vbEFkZHJlc3MGCQEIdGhyb3dFcnIBAhpwb29sIHNjcmlwdCBpcyBub3QgYWxsb3dlZAkAzAgCAwkBASEBCQEMaXNQb29sRXhpc3RzAQUObmV3UG9vbEFkZHJlc3MGCQEIdGhyb3dFcnIBAiJwb29sIGFkZHJlc3MgaXMgYWxyZWFkeSByZWdpc3RlcmVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUOZmFjdG9yeUFkZHJlc3MCDGludGVnZXJFbnRyeQkAzAgCBRNrTGFzdEVtcHR5UG9vbEluZGV4CQDMCAIFDG5ld1Bvb2xJbmRleAUDbmlsBQNuaWwJAMwIAgkA/AcEBQ5mYWN0b3J5QWRkcmVzcwILc3RyaW5nRW50cnkJAMwIAgkBFWtQb29sQWRkcmVzc0Zyb21JbmRleAEFDG5ld1Bvb2xJbmRleAkAzAgCCQClCAEFDm5ld1Bvb2xBZGRyZXNzBQNuaWwFA25pbAkAzAgCCQD8BwQFDmZhY3RvcnlBZGRyZXNzAgxpbnRlZ2VyRW50cnkJAMwIAgkBFWtQb29sSW5kZXhGcm9tQWRkcmVzcwEFDm5ld1Bvb2xBZGRyZXNzCQDMCAIFDG5ld1Bvb2xJbmRleAUDbmlsBQNuaWwJAMwIAgkA/AcEBQ5mYWN0b3J5QWRkcmVzcwIMaW50ZWdlckVudHJ5CQDMCAIJAQtrUG9vbFN0YXR1cwEFDG5ld1Bvb2xJbmRleAkAzAgCBQxTVEFUVVNfRU1QVFkFA25pbAUDbmlsBQNuaWwJAJQKAgUDbmlsBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjcmVhdGVQb29sAg9jYWxsZXJQdWJsaWNLZXkEYXJncwQKbWluUGF5bWVudAkAZAIFDWxpc3RpbmdWb2x1bWUFC2NyZWF0aW9uRmVlBAZjaGVja3MJAMwIAgMJAQEhAQUIc2h1dGRvd24GCQEIdGhyb3dFcnIBAhJUZW1wb3Jhcnkgc2h1dGRvd24JAMwIAgkBC211c3RGYWN0b3J5AQgFAWkGY2FsbGVyCQDMCAIDCQBmAgkAZQIFDmxhc3RFbXB0eUluZGV4BQ9maXJzdEVtcHR5SW5kZXgAAAYJAQh0aHJvd0VycgECF05vIGVtcHR5IHBvb2wgYXZhaWxhYmxlCQDMCAIDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQR1bml0BgkBCHRocm93RXJyAQIaUGF5bWVudCBzaG91bGQgYmUgaW4gV0FWRVMJAMwIAgMJAGcCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUKbWluUGF5bWVudAYJAQh0aHJvd0VycgEJAKwCAgkArAICAiNQYXltZW50IHNob3VsZCBiZSBncmVhdGVyIG9yIGVxdWFsIAkApAMBBQptaW5QYXltZW50AgggV0FWRUxFVAkAzAgCAwkBCWlzRGVmaW5lZAEJAJEDAgUEYXJncwAABgkBCHRocm93RXJyAQIaVG9rZW4gbmFtZSBpcyBub3QgcHJvdmlkZWQJAMwIAgMJAQlpc0RlZmluZWQBCQCRAwIFBGFyZ3MAAQYJAQh0aHJvd0VycgECIVRva2VuIGRlc2NyaXB0aW9uIGlzIG5vdCBwcm92aWRlZAkAzAgCAwkBCWlzRGVmaW5lZAEJAJEDAgUEYXJncwACBgkBCHRocm93RXJyAQIeVG9rZW4gcXVhbnRpdHkgaXMgbm90IHByb3ZpZGVkCQDMCAIDCQECIT0CCQC2CQEJAJEDAgUEYXJncwACBQR1bml0BgkBCHRocm93RXJyAQIhVG9rZW4gcXVhbnRpdHkgc2hvdWxkIGJlIGEgbnVtYmVyBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECXBvb2xJbmRleAkAZAIFD2ZpcnN0RW1wdHlJbmRleAABBBFwb29sQWRkcmVzc1N0cmluZwkBEUBleHRyTmF0aXZlKDEwNTMpAgUOZmFjdG9yeUFkZHJlc3MJARVrUG9vbEFkZHJlc3NGcm9tSW5kZXgBBQlwb29sSW5kZXgEC3Bvb2xBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBRFwb29sQWRkcmVzc1N0cmluZwQNY2FsbGVyQWRkcmVzcwkApwgBBQ9jYWxsZXJQdWJsaWNLZXkECnBvb2xEb21haW4JAK8CAgURcG9vbEFkZHJlc3NTdHJpbmcACAQJcG9vbE93bmVyCQClCAEFDWNhbGxlckFkZHJlc3MECXRva2VuTmFtZQkAkQMCBQRhcmdzAAAECXRva2VuRGVzYwkAkQMCBQRhcmdzAAEEDXRva2VuUXVhbnRpdHkJAJEDAgUEYXJncwACBA5pbml0UG9vbEludm9rZQkA/AcEBQ5mYWN0b3J5QWRkcmVzcwIOaW5pdFBvb2xJbnZva2UJAMwIAgURcG9vbEFkZHJlc3NTdHJpbmcJAMwIAgkAzAgCBQpwb29sRG9tYWluCQDMCAIFCXBvb2xPd25lcgkAzAgCBQl0b2tlbk5hbWUJAMwIAgUJdG9rZW5EZXNjCQDMCAIFDXRva2VuUXVhbnRpdHkFA25pbAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNuaWwDCQAAAgUOaW5pdFBvb2xJbnZva2UFDmluaXRQb29sSW52b2tlBA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFDmZhY3RvcnlBZGRyZXNzAgxpbnRlZ2VyRW50cnkJAMwIAgUUa0ZpcnN0RW1wdHlQb29sSW5kZXgJAMwIAgUJcG9vbEluZGV4BQNuaWwFA25pbAkAzAgCCQD8BwQFDmZhY3RvcnlBZGRyZXNzAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tQb29sU3RhdHVzAQUJcG9vbEluZGV4CQDMCAIFDFNUQVRVU19SRUFEWQUDbmlsBQNuaWwFA25pbAkAlAoCBQNuaWwFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEm5vdGlmeVN0YXR1c1VwZGF0ZQIPY2FsbGVyUHVibGljS2V5BGFyZ3MEC3Bvb2xBZGRyZXNzCQCnCAEFD2NhbGxlclB1YmxpY0tleQQGY2hlY2tzCQDMCAIDCQEMaXNQb29sRXhpc3RzAQULcG9vbEFkZHJlc3MGCQEIdGhyb3dFcnIBAg5wb29sIG5vdCBmb3VuZAkAzAgCCQELbXVzdEZhY3RvcnkBCAUBaQZjYWxsZXIFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQJcG9vbEluZGV4CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ5mYWN0b3J5QWRkcmVzcwkBFWtQb29sSW5kZXhGcm9tQWRkcmVzcwEFC3Bvb2xBZGRyZXNzBAluZXdTdGF0dXMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAAEDmZhY3RvcnlBY3Rpb25zCQDMCAIJAPwHBAUOZmFjdG9yeUFkZHJlc3MCDGludGVnZXJFbnRyeQkAzAgCCQELa1Bvb2xTdGF0dXMBBQlwb29sSW5kZXgJAMwIAgUJbmV3U3RhdHVzBQNuaWwFA25pbAUDbmlsCQCUCgIFA25pbAUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMc3dhcFJFQURPTkxZAg9jYWxsZXJQdWJsaWNLZXkEYXJncwQLcG9vbEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUEYXJncwAABBNhbW91bnRBc3NldElkU3RyaW5nCQCRAwIFBGFyZ3MAAQQScHJpY2VBc3NldElkU3RyaW5nCQCRAwIFBGFyZ3MAAgQGYW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwADBAZjaGVja3MJAMwIAgMJAQEhAQUIc2h1dGRvd24GCQEIdGhyb3dFcnIBAhJUZW1wb3Jhcnkgc2h1dGRvd24JAMwIAgkBC211c3RGYWN0b3J5AQgFAWkGY2FsbGVyBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MDCQETaXNQb29sVGFyZ2V0UmVhY2hlZAEFC3Bvb2xBZGRyZXNzBAx3eFN3YXBSZXN1bHQKAAFACQD8BwQFDXd4U3dhcEFkZHJlc3MCFXN3YXBDYWxjdWxhdGVSRUFET05MWQkAzAgCBQZhbW91bnQJAMwIAgUTYW1vdW50QXNzZXRJZFN0cmluZwkAzAgCBRJwcmljZUFzc2V0SWRTdHJpbmcFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAlAoCBQNuaWwJAJQKAgUMd3hTd2FwUmVzdWx0AgZXeFN3YXAEDnBvb2xTd2FwUmVzdWx0CgABQAkA/AcEBQtwb29sQWRkcmVzcwIMc3dhcFJlYWRPbmx5CQDMCAIFE2Ftb3VudEFzc2V0SWRTdHJpbmcJAMwIAgUScHJpY2VBc3NldElkU3RyaW5nCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQCUCgIFA25pbAkAlAoCBQ5wb29sU3dhcFJlc3VsdAIJaU1lbWVQb29sCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHN3YXACD2NhbGxlclB1YmxpY0tleQRhcmdzBA1jYWxsZXJBZGRyZXNzCQCnCAEFD2NhbGxlclB1YmxpY0tleQQLcG9vbEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUEYXJncwAABBJwcmljZUFzc2V0SWRTdHJpbmcJAJEDAgUEYXJncwABBAxwcmljZUFzc2V0SWQJAQxwYXJzZUFzc2V0SWQBBRJwcmljZUFzc2V0SWRTdHJpbmcEDW1pbmltdW1BbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAIEDWFzc2V0SW5BbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA5hc3NldEluQXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAZjaGVja3MJAMwIAgMJAQEhAQUIc2h1dGRvd24GCQEIdGhyb3dFcnIBAhJUZW1wb3Jhcnkgc2h1dGRvd24JAMwIAgkBC211c3RGYWN0b3J5AQgFAWkGY2FsbGVyCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIfZXhhY3RseSBvbmUgcGF5bWVudCBpcyBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBVvdXRBc3NldEJhbGFuY2VCZWZvcmUJAQpnZXRCYWxhbmNlAgUEdGhpcwUMcHJpY2VBc3NldElkAwkAAAIFFW91dEFzc2V0QmFsYW5jZUJlZm9yZQUVb3V0QXNzZXRCYWxhbmNlQmVmb3JlBApzd2FwQWN0aW9uAwkBE2lzUG9vbFRhcmdldFJlYWNoZWQBBQtwb29sQWRkcmVzcwkA/AcEBQ13eFN3YXBBZGRyZXNzAgRzd2FwCQDMCAIFDW1pbmltdW1BbW91bnQJAMwIAgUScHJpY2VBc3NldElkU3RyaW5nCQDMCAIJAKUIAQUEdGhpcwUDbmlsCAUBaQhwYXltZW50cwkA/AcEBQtwb29sQWRkcmVzcwIEc3dhcAkAzAgCBRJwcmljZUFzc2V0SWRTdHJpbmcJAMwIAgUNbWluaW11bUFtb3VudAUDbmlsCAUBaQhwYXltZW50cwMJAAACBQpzd2FwQWN0aW9uBQpzd2FwQWN0aW9uBBRvdXRBc3NldEJhbGFuY2VBZnRlcgkBCmdldEJhbGFuY2UCBQR0aGlzBQxwcmljZUFzc2V0SWQDCQAAAgUUb3V0QXNzZXRCYWxhbmNlQWZ0ZXIFFG91dEFzc2V0QmFsYW5jZUFmdGVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDWNhbGxlckFkZHJlc3MJAGUCBRRvdXRBc3NldEJhbGFuY2VBZnRlcgUVb3V0QXNzZXRCYWxhbmNlQmVmb3JlBQxwcmljZUFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx0cmFuc2ZlclBvb2wCD2NhbGxlclB1YmxpY0tleQRhcmdzBA1jYWxsZXJBZGRyZXNzCQCnCAEFD2NhbGxlclB1YmxpY0tleQQLcG9vbEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUEYXJncwAABBRwb29sVG9rZW5zU3RyaW5nTGlzdAkAtQkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQtwb29sQWRkcmVzcwUPa1Bvb2xUb2tlbnNMaXN0AgEsBAZhc3NldDEJAQxwYXJzZUFzc2V0SWQBCQCRAwIFFHBvb2xUb2tlbnNTdHJpbmdMaXN0AAAEBmFzc2V0MgkBDHBhcnNlQXNzZXRJZAEJAJEDAgUUcG9vbFRva2Vuc1N0cmluZ0xpc3QAAQQNJHQwMTEwODgxMTE4MAMJAAACBQZhc3NldDEFBHVuaXQJAJQKAgUGYXNzZXQyBQZhc3NldDEJAJQKAgUGYXNzZXQxBQZhc3NldDIECXBvb2xBc3NldAgFDSR0MDExMDg4MTExODACXzEECndhdmVzQXNzZXQIBQ0kdDAxMTA4ODExMTgwAl8yBBZwb29sQXNzZXRCYWxhbmNlQmVmb3JlCQEKZ2V0QmFsYW5jZQIFDmZhY3RvcnlBZGRyZXNzBQlwb29sQXNzZXQDCQAAAgUWcG9vbEFzc2V0QmFsYW5jZUJlZm9yZQUWcG9vbEFzc2V0QmFsYW5jZUJlZm9yZQQXd2F2ZXNBc3NldEJhbGFuY2VCZWZvcmUJAQpnZXRCYWxhbmNlAgUOZmFjdG9yeUFkZHJlc3MFCndhdmVzQXNzZXQDCQAAAgUXd2F2ZXNBc3NldEJhbGFuY2VCZWZvcmUFF3dhdmVzQXNzZXRCYWxhbmNlQmVmb3JlBA53aXRoZHJhd0ludm9rZQkA/AcEBQ5mYWN0b3J5QWRkcmVzcwIZd2l0aGRyYXdMaXF1aWRpdHlGcm9tUG9vbAkAzAgCCAULcG9vbEFkZHJlc3MFYnl0ZXMFA25pbAUDbmlsAwkAAAIFDndpdGhkcmF3SW52b2tlBQ53aXRoZHJhd0ludm9rZQQVcG9vbEFzc2V0QmFsYW5jZUFmdGVyCQEKZ2V0QmFsYW5jZQIFDmZhY3RvcnlBZGRyZXNzBQlwb29sQXNzZXQDCQAAAgUVcG9vbEFzc2V0QmFsYW5jZUFmdGVyBRVwb29sQXNzZXRCYWxhbmNlQWZ0ZXIEFndhdmVzQXNzZXRCYWxhbmNlQWZ0ZXIJAQpnZXRCYWxhbmNlAgUOZmFjdG9yeUFkZHJlc3MFCndhdmVzQXNzZXQDCQAAAgUWd2F2ZXNBc3NldEJhbGFuY2VBZnRlcgUWd2F2ZXNBc3NldEJhbGFuY2VBZnRlcgQPcG9vbEFzc2V0QW1vdW50CQBlAgUVcG9vbEFzc2V0QmFsYW5jZUFmdGVyBRZwb29sQXNzZXRCYWxhbmNlQmVmb3JlBAt3YXZlc0Ftb3VudAkAZQIFFndhdmVzQXNzZXRCYWxhbmNlQWZ0ZXIFF3dhdmVzQXNzZXRCYWxhbmNlQmVmb3JlAwMJAGYCBQ9wb29sQXNzZXRBbW91bnQAAAkAZgIFC3dhdmVzQW1vdW50AAAHBApidXJuQW1vdW50CQBrAwUPcG9vbEFzc2V0QW1vdW50ABQAZAQKYnVybkFjdGlvbgkA/AcEBQ5mYWN0b3J5QWRkcmVzcwIEYnVybgkAzAgCBQlwb29sQXNzZXQJAMwIAgUKYnVybkFtb3VudAUDbmlsBQNuaWwDCQAAAgUKYnVybkFjdGlvbgUKYnVybkFjdGlvbgQOZmVlV2F2ZXNBbW91bnQJAGsDBQt3YXZlc0Ftb3VudAAUAGQECWZlZUFjdGlvbgkA/AcEBQ5mYWN0b3J5QWRkcmVzcwINdHJhbnNmZXJXYXZlcwkAzAgCCAUTZmVlQ29sbGVjdG9yQWRkcmVzcwVieXRlcwkAzAgCBQ5mZWVXYXZlc0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUJZmVlQWN0aW9uBQlmZWVBY3Rpb24EE3JlZ2lzdGVyQXNzZXRBY3Rpb24JAPwHBAUOZmFjdG9yeUFkZHJlc3MCDXJlZ2lzdGVyQXNzZXQJAMwIAggFEWFzc2V0U3RvcmVBZGRyZXNzBWJ5dGVzCQDMCAIJAQ9hc3NldElkVG9TdHJpbmcBBQlwb29sQXNzZXQJAMwIAgULZGVmYXVsdExvZ28JAMwIAgYFA25pbAUDbmlsAwkAAAIFE3JlZ2lzdGVyQXNzZXRBY3Rpb24FE3JlZ2lzdGVyQXNzZXRBY3Rpb24EEmNyZWF0ZVd4UG9vbEFjdGlvbgkA/AcEBQ5mYWN0b3J5QWRkcmVzcwIMY3JlYXRlV3hQb29sCQDMCAIIBRB1c2VyUG9vbHNBZGRyZXNzBWJ5dGVzCQDMCAIJAQ9hc3NldElkVG9TdHJpbmcBBQlwb29sQXNzZXQJAMwIAgkAZQIFD3Bvb2xBc3NldEFtb3VudAUKYnVybkFtb3VudAkAzAgCCQEPYXNzZXRJZFRvU3RyaW5nAQUKd2F2ZXNBc3NldAkAzAgCCQBlAgULd2F2ZXNBbW91bnQFDmZlZVdhdmVzQW1vdW50BQNuaWwFA25pbAMJAAACBRJjcmVhdGVXeFBvb2xBY3Rpb24FEmNyZWF0ZVd4UG9vbEFjdGlvbgQMY2hhbmdlU3RhdHVzCQD8BwQFDmZhY3RvcnlBZGRyZXNzAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tQb29sU3RhdHVzAQkBCWdldFBvb2xJZAEFC3Bvb2xBZGRyZXNzCQDMCAIFElNUQVRVU19UUkFOU0ZFUlJFRAUDbmlsBQNuaWwDCQAAAgUMY2hhbmdlU3RhdHVzBQxjaGFuZ2VTdGF0dXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkBCHRocm93RXJyAQIld2l0aGRyYXduIGFtb3VudCBmcm9tIHBvb2wgaXMgdG9vIGxvdwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEE2tleUFkbWluQWRkcmVzc0xpc3QCFCVzX19hZG1pbkFkZHJlc3NMaXN0BA5rZXlBbGxvd2VkVHhJZAIIJXNfX3R4SWQECWFkbWluTGlzdAkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFDmZhY3RvcnlBZGRyZXNzBRNrZXlBZG1pbkFkZHJlc3NMaXN0AgACAl9fBAdieU93bmVyAwkAZwIJAJADAQUJYWRtaW5MaXN0AAMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAhieUFkbWlucwkAAAIIBQJ0eAJpZAkA2QQBCQELdmFsdWVPckVsc2UCCQCdCAIFDmZhY3RvcnlBZGRyZXNzBQ5rZXlBbGxvd2VkVHhJZAIAAwUIYnlBZG1pbnMGBQdieU93bmVypmoN+g==", "height": 3421446, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8iJxrm1J7TrHqGtMqTx6KVxQei3cz27NSjEGmNQ7dk86 Next: Fu53ceFQTcghzj7mn1L1bYMtpi5GSRrBBRLsCFYzQptE Diff:
OldNewDifferences
2525 let STATUS_TARGET_REACHED = 2
2626
2727 let STATUS_TRANSFERRED = 3
28+
29+let defaultLogo = "<svg width='30' height='30' xmlns='http://www.w3.org/2000/svg'><g><circle cx='15' cy='15' fill='#ccc' r='15'/><text stroke='#0' x='6' y='20'>iM</text></g></svg>"
2830
2931 let kShutdown = "shutdown__flag"
3032
103105 }
104106
105107 let userPoolsAddress = valueOrErrorMessage(userPoolsAddressOption, wrapErr("invalid user_pools dapp address"))
108+
109+let kAssetStoreAddress = "assetstore_address"
110+
111+let assetStoreAddressOption = match getString(factoryAddress, kAssetStoreAddress) {
112+ case s: String =>
113+ addressFromString(s)
114+ case _ =>
115+ unit
116+}
117+
118+let assetStoreAddress = valueOrErrorMessage(assetStoreAddressOption, wrapErr("invalid asset_store dapp address"))
106119
107120 let shutdown = valueOrElse(getBoolean(factoryAddress, kShutdown), false)
108121
334347 let poolTokensStringList = split(getStringValue(poolAddress, kPoolTokensList), ",")
335348 let asset1 = parseAssetId(poolTokensStringList[0])
336349 let asset2 = parseAssetId(poolTokensStringList[1])
337- let $t01059110683 = if ((asset1 == unit))
350+ let $t01108811180 = if ((asset1 == unit))
338351 then $Tuple2(asset2, asset1)
339352 else $Tuple2(asset1, asset2)
340- let poolAsset = $t01059110683._1
341- let wavesAsset = $t01059110683._2
353+ let poolAsset = $t01108811180._1
354+ let wavesAsset = $t01108811180._2
342355 let poolAssetBalanceBefore = getBalance(factoryAddress, poolAsset)
343356 if ((poolAssetBalanceBefore == poolAssetBalanceBefore))
344357 then {
368381 let feeAction = invoke(factoryAddress, "transferWaves", [feeCollectorAddress.bytes, feeWavesAmount], nil)
369382 if ((feeAction == feeAction))
370383 then {
371- let createWxPoolAction = invoke(factoryAddress, "createWxPool", [userPoolsAddress.bytes, assetIdToString(poolAsset), (poolAssetAmount - burnAmount), assetIdToString(wavesAsset), (wavesAmount - feeWavesAmount)], nil)
372- if ((createWxPoolAction == createWxPoolAction))
373- then nil
384+ let registerAssetAction = invoke(factoryAddress, "registerAsset", [assetStoreAddress.bytes, assetIdToString(poolAsset), defaultLogo, true], nil)
385+ if ((registerAssetAction == registerAssetAction))
386+ then {
387+ let createWxPoolAction = invoke(factoryAddress, "createWxPool", [userPoolsAddress.bytes, assetIdToString(poolAsset), (poolAssetAmount - burnAmount), assetIdToString(wavesAsset), (wavesAmount - feeWavesAmount)], nil)
388+ if ((createWxPoolAction == createWxPoolAction))
389+ then {
390+ let changeStatus = invoke(factoryAddress, "integerEntry", [kPoolStatus(getPoolId(poolAddress)), STATUS_TRANSFERRED], nil)
391+ if ((changeStatus == changeStatus))
392+ then nil
393+ else throw("Strict value is not equal to itself.")
394+ }
395+ else throw("Strict value is not equal to itself.")
396+ }
374397 else throw("Strict value is not equal to itself.")
375398 }
376399 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let wavesString = "WAVES"
77
88 let contractFilename = "meme_im_calculator.ride"
99
1010 let mult8 = 100000000
1111
1212 func wrapErr (s) = ((contractFilename + ": ") + s)
1313
1414
1515 func throwErr (s) = throw(wrapErr(s))
1616
1717
1818 func validateAddress (address) = isDefined(addressFromString(address))
1919
2020
2121 let STATUS_EMPTY = 0
2222
2323 let STATUS_READY = 1
2424
2525 let STATUS_TARGET_REACHED = 2
2626
2727 let STATUS_TRANSFERRED = 3
28+
29+let defaultLogo = "<svg width='30' height='30' xmlns='http://www.w3.org/2000/svg'><g><circle cx='15' cy='15' fill='#ccc' r='15'/><text stroke='#0' x='6' y='20'>iM</text></g></svg>"
2830
2931 let kShutdown = "shutdown__flag"
3032
3133 let kPriceAsset = "price__asset"
3234
3335 let kListingVolume = "listing__volume"
3436
3537 let kCreationFee = "setup__creationFee"
3638
3739 let kCurveTarget = "setup__curveTarget"
3840
3941 let kVirtualLiquidity = "setup__virtualLiquidity"
4042
4143 let kPoolTokensList = "static_tokenIds"
4244
4345 let kPoolContractHash = "pool__contract__hash"
4446
4547 let kLastEmptyPoolIndex = "last__empty_pool__index"
4648
4749 let kFirstEmptyPoolIndex = "first__empty__pool__index"
4850
4951 func kPoolAddressFromIndex (index) = makeString(["pool", toString(index)], separator)
5052
5153
5254 func kPoolIndexFromAddress (address) = makeString(["pool", toString(address)], separator)
5355
5456
5557 func kPoolAsset (address) = makeString(["asset", toString(address)], separator)
5658
5759
5860 func kPoolStatus (index) = makeString(["pool", "status", toString(index)], separator)
5961
6062
6163 let kFactoryAddress = "factory__address"
6264
6365 let factoryAddressOption = match getString(this, kFactoryAddress) {
6466 case s: String =>
6567 addressFromString(s)
6668 case _: Unit =>
6769 unit
6870 case _ =>
6971 throw("Match error")
7072 }
7173
7274 let factoryAddress = valueOrErrorMessage(factoryAddressOption, wrapErr("invalid factory address"))
7375
7476 let kWxSwapAddress = "wxswap__address"
7577
7678 let wxSwapAddressOption = match getString(factoryAddress, kWxSwapAddress) {
7779 case s: String =>
7880 addressFromString(s)
7981 case _ =>
8082 unit
8183 }
8284
8385 let wxSwapAddress = valueOrErrorMessage(wxSwapAddressOption, wrapErr("invalid wx swap address"))
8486
8587 let kFeeCollectorAddress = "wxfee_address"
8688
8789 let feeCollectorAddressOption = match getString(factoryAddress, kFeeCollectorAddress) {
8890 case s: String =>
8991 addressFromString(s)
9092 case _ =>
9193 unit
9294 }
9395
9496 let feeCollectorAddress = valueOrErrorMessage(feeCollectorAddressOption, wrapErr("invalid fee collector address"))
9597
9698 let kUserPoolsAddress = "userpools_address"
9799
98100 let userPoolsAddressOption = match getString(factoryAddress, kUserPoolsAddress) {
99101 case s: String =>
100102 addressFromString(s)
101103 case _ =>
102104 unit
103105 }
104106
105107 let userPoolsAddress = valueOrErrorMessage(userPoolsAddressOption, wrapErr("invalid user_pools dapp address"))
108+
109+let kAssetStoreAddress = "assetstore_address"
110+
111+let assetStoreAddressOption = match getString(factoryAddress, kAssetStoreAddress) {
112+ case s: String =>
113+ addressFromString(s)
114+ case _ =>
115+ unit
116+}
117+
118+let assetStoreAddress = valueOrErrorMessage(assetStoreAddressOption, wrapErr("invalid asset_store dapp address"))
106119
107120 let shutdown = valueOrElse(getBoolean(factoryAddress, kShutdown), false)
108121
109122 let lastEmptyIndex = valueOrElse(getInteger(factoryAddress, kLastEmptyPoolIndex), 0)
110123
111124 let firstEmptyIndex = valueOrElse(getInteger(factoryAddress, kFirstEmptyPoolIndex), 0)
112125
113126 let listingVolume = valueOrElse(getInteger(factoryAddress, kListingVolume), 0)
114127
115128 let creationFee = valueOrElse(getInteger(factoryAddress, kCreationFee), 0)
116129
117130 let poolContractHash = getBinary(factoryAddress, kPoolContractHash)
118131
119132 func parseAssetId (input) = if ((input == wavesString))
120133 then unit
121134 else fromBase58String(input)
122135
123136
124137 func assetIdToString (input) = if ((input == unit))
125138 then wavesString
126139 else toBase58String(value(input))
127140
128141
129142 func mustAddress (caller,address) = if ((caller == address))
130143 then true
131144 else throwErr("permission denied")
132145
133146
134147 func mustThis (caller) = mustAddress(caller, this)
135148
136149
137150 func mustFactory (caller) = mustAddress(caller, factoryAddress)
138151
139152
140153 func checkContractScript (address) = match poolContractHash {
141154 case hash: ByteVector =>
142155 (scriptHash(address) == hash)
143156 case _ =>
144157 true
145158 }
146159
147160
148161 func isPoolExists (poolAddress) = isDefined(getInteger(factoryAddress, kPoolIndexFromAddress(poolAddress)))
149162
150163
151164 func getPoolId (poolAddress) = valueOrErrorMessage(getInteger(factoryAddress, kPoolIndexFromAddress(poolAddress)), "pool doesn't exists")
152165
153166
154167 func isPoolTargetReached (poolAddress) = (valueOrElse(getInteger(factoryAddress, kPoolStatus(getPoolId(poolAddress))), -1) == STATUS_TARGET_REACHED)
155168
156169
157170 func getBalance (address,assetId) = match assetId {
158171 case id: ByteVector =>
159172 assetBalance(address, id)
160173 case _ =>
161174 wavesBalance(address).available
162175 }
163176
164177
165178 @Callable(i)
166179 func init (factoryAddressStr) = {
167180 let checkCaller = mustThis(i.caller)
168181 if ((checkCaller == checkCaller))
169182 then [StringEntry(kFactoryAddress, factoryAddressStr)]
170183 else throw("Strict value is not equal to itself.")
171184 }
172185
173186
174187
175188 @Callable(i)
176189 func addEmptyPool (callerPublicKey,args) = {
177190 let newPoolAddress = addressFromPublicKey(callerPublicKey)
178191 let newPoolIndex = (lastEmptyIndex + 1)
179192 let checks = [if (!(shutdown))
180193 then true
181194 else throwErr("not allowed (shutdown)"), if (checkContractScript(newPoolAddress))
182195 then true
183196 else throwErr("pool script is not allowed"), if (!(isPoolExists(newPoolAddress)))
184197 then true
185198 else throwErr("pool address is already registered")]
186199 if ((checks == checks))
187200 then {
188201 let factoryActions = [invoke(factoryAddress, "integerEntry", [kLastEmptyPoolIndex, newPoolIndex], nil), invoke(factoryAddress, "stringEntry", [kPoolAddressFromIndex(newPoolIndex), toString(newPoolAddress)], nil), invoke(factoryAddress, "integerEntry", [kPoolIndexFromAddress(newPoolAddress), newPoolIndex], nil), invoke(factoryAddress, "integerEntry", [kPoolStatus(newPoolIndex), STATUS_EMPTY], nil)]
189202 $Tuple2(nil, factoryActions)
190203 }
191204 else throw("Strict value is not equal to itself.")
192205 }
193206
194207
195208
196209 @Callable(i)
197210 func createPool (callerPublicKey,args) = {
198211 let minPayment = (listingVolume + creationFee)
199212 let checks = [if (!(shutdown))
200213 then true
201214 else throwErr("Temporary shutdown"), mustFactory(i.caller), if (((lastEmptyIndex - firstEmptyIndex) > 0))
202215 then true
203216 else throwErr("No empty pool available"), if ((i.payments[0].assetId == unit))
204217 then true
205218 else throwErr("Payment should be in WAVES"), if ((i.payments[0].amount >= minPayment))
206219 then true
207220 else throwErr((("Payment should be greater or equal " + toString(minPayment)) + " WAVELET")), if (isDefined(args[0]))
208221 then true
209222 else throwErr("Token name is not provided"), if (isDefined(args[1]))
210223 then true
211224 else throwErr("Token description is not provided"), if (isDefined(args[2]))
212225 then true
213226 else throwErr("Token quantity is not provided"), if ((parseInt(args[2]) != unit))
214227 then true
215228 else throwErr("Token quantity should be a number")]
216229 if ((checks == checks))
217230 then {
218231 let poolIndex = (firstEmptyIndex + 1)
219232 let poolAddressString = getStringValue(factoryAddress, kPoolAddressFromIndex(poolIndex))
220233 let poolAddress = addressFromStringValue(poolAddressString)
221234 let callerAddress = addressFromPublicKey(callerPublicKey)
222235 let poolDomain = take(poolAddressString, 8)
223236 let poolOwner = toString(callerAddress)
224237 let tokenName = args[0]
225238 let tokenDesc = args[1]
226239 let tokenQuantity = args[2]
227240 let initPoolInvoke = invoke(factoryAddress, "initPoolInvoke", [poolAddressString, [poolDomain, poolOwner, tokenName, tokenDesc, tokenQuantity]], [AttachedPayment(i.payments[0].assetId, i.payments[0].amount)])
228241 if ((initPoolInvoke == initPoolInvoke))
229242 then {
230243 let factoryActions = [invoke(factoryAddress, "integerEntry", [kFirstEmptyPoolIndex, poolIndex], nil), invoke(factoryAddress, "integerEntry", [kPoolStatus(poolIndex), STATUS_READY], nil)]
231244 $Tuple2(nil, factoryActions)
232245 }
233246 else throw("Strict value is not equal to itself.")
234247 }
235248 else throw("Strict value is not equal to itself.")
236249 }
237250
238251
239252
240253 @Callable(i)
241254 func notifyStatusUpdate (callerPublicKey,args) = {
242255 let poolAddress = addressFromPublicKey(callerPublicKey)
243256 let checks = [if (isPoolExists(poolAddress))
244257 then true
245258 else throwErr("pool not found"), mustFactory(i.caller)]
246259 if ((checks == checks))
247260 then {
248261 let poolIndex = getIntegerValue(factoryAddress, kPoolIndexFromAddress(poolAddress))
249262 let newStatus = parseIntValue(args[0])
250263 let factoryActions = [invoke(factoryAddress, "integerEntry", [kPoolStatus(poolIndex), newStatus], nil)]
251264 $Tuple2(nil, factoryActions)
252265 }
253266 else throw("Strict value is not equal to itself.")
254267 }
255268
256269
257270
258271 @Callable(i)
259272 func swapREADONLY (callerPublicKey,args) = {
260273 let poolAddress = addressFromStringValue(args[0])
261274 let amountAssetIdString = args[1]
262275 let priceAssetIdString = args[2]
263276 let amount = parseIntValue(args[3])
264277 let checks = [if (!(shutdown))
265278 then true
266279 else throwErr("Temporary shutdown"), mustFactory(i.caller)]
267280 if ((checks == checks))
268281 then if (isPoolTargetReached(poolAddress))
269282 then {
270283 let wxSwapResult = {
271284 let @ = invoke(wxSwapAddress, "swapCalculateREADONLY", [amount, amountAssetIdString, priceAssetIdString], nil)
272285 if ($isInstanceOf(@, "Int"))
273286 then @
274287 else throw(($getType(@) + " couldn't be cast to Int"))
275288 }
276289 $Tuple2(nil, $Tuple2(wxSwapResult, "WxSwap"))
277290 }
278291 else {
279292 let poolSwapResult = {
280293 let @ = invoke(poolAddress, "swapReadOnly", [amountAssetIdString, priceAssetIdString, amount], nil)
281294 if ($isInstanceOf(@, "Int"))
282295 then @
283296 else throw(($getType(@) + " couldn't be cast to Int"))
284297 }
285298 $Tuple2(nil, $Tuple2(poolSwapResult, "iMemePool"))
286299 }
287300 else throw("Strict value is not equal to itself.")
288301 }
289302
290303
291304
292305 @Callable(i)
293306 func swap (callerPublicKey,args) = {
294307 let callerAddress = addressFromPublicKey(callerPublicKey)
295308 let poolAddress = addressFromStringValue(args[0])
296309 let priceAssetIdString = args[1]
297310 let priceAssetId = parseAssetId(priceAssetIdString)
298311 let minimumAmount = parseIntValue(args[2])
299312 let assetInAmount = i.payments[0].amount
300313 let assetInAssetId = i.payments[0].assetId
301314 let checks = [if (!(shutdown))
302315 then true
303316 else throwErr("Temporary shutdown"), mustFactory(i.caller), if ((size(i.payments) == 1))
304317 then true
305318 else throwErr("exactly one payment is expected")]
306319 if ((checks == checks))
307320 then {
308321 let outAssetBalanceBefore = getBalance(this, priceAssetId)
309322 if ((outAssetBalanceBefore == outAssetBalanceBefore))
310323 then {
311324 let swapAction = if (isPoolTargetReached(poolAddress))
312325 then invoke(wxSwapAddress, "swap", [minimumAmount, priceAssetIdString, toString(this)], i.payments)
313326 else invoke(poolAddress, "swap", [priceAssetIdString, minimumAmount], i.payments)
314327 if ((swapAction == swapAction))
315328 then {
316329 let outAssetBalanceAfter = getBalance(this, priceAssetId)
317330 if ((outAssetBalanceAfter == outAssetBalanceAfter))
318331 then [ScriptTransfer(callerAddress, (outAssetBalanceAfter - outAssetBalanceBefore), priceAssetId)]
319332 else throw("Strict value is not equal to itself.")
320333 }
321334 else throw("Strict value is not equal to itself.")
322335 }
323336 else throw("Strict value is not equal to itself.")
324337 }
325338 else throw("Strict value is not equal to itself.")
326339 }
327340
328341
329342
330343 @Callable(i)
331344 func transferPool (callerPublicKey,args) = {
332345 let callerAddress = addressFromPublicKey(callerPublicKey)
333346 let poolAddress = addressFromStringValue(args[0])
334347 let poolTokensStringList = split(getStringValue(poolAddress, kPoolTokensList), ",")
335348 let asset1 = parseAssetId(poolTokensStringList[0])
336349 let asset2 = parseAssetId(poolTokensStringList[1])
337- let $t01059110683 = if ((asset1 == unit))
350+ let $t01108811180 = if ((asset1 == unit))
338351 then $Tuple2(asset2, asset1)
339352 else $Tuple2(asset1, asset2)
340- let poolAsset = $t01059110683._1
341- let wavesAsset = $t01059110683._2
353+ let poolAsset = $t01108811180._1
354+ let wavesAsset = $t01108811180._2
342355 let poolAssetBalanceBefore = getBalance(factoryAddress, poolAsset)
343356 if ((poolAssetBalanceBefore == poolAssetBalanceBefore))
344357 then {
345358 let wavesAssetBalanceBefore = getBalance(factoryAddress, wavesAsset)
346359 if ((wavesAssetBalanceBefore == wavesAssetBalanceBefore))
347360 then {
348361 let withdrawInvoke = invoke(factoryAddress, "withdrawLiquidityFromPool", [poolAddress.bytes], nil)
349362 if ((withdrawInvoke == withdrawInvoke))
350363 then {
351364 let poolAssetBalanceAfter = getBalance(factoryAddress, poolAsset)
352365 if ((poolAssetBalanceAfter == poolAssetBalanceAfter))
353366 then {
354367 let wavesAssetBalanceAfter = getBalance(factoryAddress, wavesAsset)
355368 if ((wavesAssetBalanceAfter == wavesAssetBalanceAfter))
356369 then {
357370 let poolAssetAmount = (poolAssetBalanceAfter - poolAssetBalanceBefore)
358371 let wavesAmount = (wavesAssetBalanceAfter - wavesAssetBalanceBefore)
359372 if (if ((poolAssetAmount > 0))
360373 then (wavesAmount > 0)
361374 else false)
362375 then {
363376 let burnAmount = fraction(poolAssetAmount, 20, 100)
364377 let burnAction = invoke(factoryAddress, "burn", [poolAsset, burnAmount], nil)
365378 if ((burnAction == burnAction))
366379 then {
367380 let feeWavesAmount = fraction(wavesAmount, 20, 100)
368381 let feeAction = invoke(factoryAddress, "transferWaves", [feeCollectorAddress.bytes, feeWavesAmount], nil)
369382 if ((feeAction == feeAction))
370383 then {
371- let createWxPoolAction = invoke(factoryAddress, "createWxPool", [userPoolsAddress.bytes, assetIdToString(poolAsset), (poolAssetAmount - burnAmount), assetIdToString(wavesAsset), (wavesAmount - feeWavesAmount)], nil)
372- if ((createWxPoolAction == createWxPoolAction))
373- then nil
384+ let registerAssetAction = invoke(factoryAddress, "registerAsset", [assetStoreAddress.bytes, assetIdToString(poolAsset), defaultLogo, true], nil)
385+ if ((registerAssetAction == registerAssetAction))
386+ then {
387+ let createWxPoolAction = invoke(factoryAddress, "createWxPool", [userPoolsAddress.bytes, assetIdToString(poolAsset), (poolAssetAmount - burnAmount), assetIdToString(wavesAsset), (wavesAmount - feeWavesAmount)], nil)
388+ if ((createWxPoolAction == createWxPoolAction))
389+ then {
390+ let changeStatus = invoke(factoryAddress, "integerEntry", [kPoolStatus(getPoolId(poolAddress)), STATUS_TRANSFERRED], nil)
391+ if ((changeStatus == changeStatus))
392+ then nil
393+ else throw("Strict value is not equal to itself.")
394+ }
395+ else throw("Strict value is not equal to itself.")
396+ }
374397 else throw("Strict value is not equal to itself.")
375398 }
376399 else throw("Strict value is not equal to itself.")
377400 }
378401 else throw("Strict value is not equal to itself.")
379402 }
380403 else throwErr("withdrawn amount from pool is too low")
381404 }
382405 else throw("Strict value is not equal to itself.")
383406 }
384407 else throw("Strict value is not equal to itself.")
385408 }
386409 else throw("Strict value is not equal to itself.")
387410 }
388411 else throw("Strict value is not equal to itself.")
389412 }
390413 else throw("Strict value is not equal to itself.")
391414 }
392415
393416
394417 @Verifier(tx)
395418 func verify () = {
396419 let keyAdminAddressList = "%s__adminAddressList"
397420 let keyAllowedTxId = "%s__txId"
398421 let adminList = split(valueOrElse(getString(factoryAddress, keyAdminAddressList), ""), "__")
399422 let byOwner = if ((size(adminList) >= 3))
400423 then false
401424 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
402425 let byAdmins = (tx.id == fromBase58String(valueOrElse(getString(factoryAddress, keyAllowedTxId), "")))
403426 if (byAdmins)
404427 then true
405428 else byOwner
406429 }
407430

github/deemru/w8io/169f3d6 
67.78 ms