tx · 3zZBoKB3ZPLeymHNKRHJ6i6TdMVk3Smeze4s29zRZ2fh

3N3g7W8FPoQ7g5EadbAD2GVjrZT5RWpHZZh:  -0.01400000 Waves

2023.06.01 15:35 [2603601] smart account 3N3g7W8FPoQ7g5EadbAD2GVjrZT5RWpHZZh > SELF 0.00000000 Waves

{ "type": 13, "id": "3zZBoKB3ZPLeymHNKRHJ6i6TdMVk3Smeze4s29zRZ2fh", "fee": 1400000, "feeAssetId": null, "timestamp": 1685622979526, "version": 2, "chainId": 84, "sender": "3N3g7W8FPoQ7g5EadbAD2GVjrZT5RWpHZZh", "senderPublicKey": "Ap7CkWd6fzBU34kGo4GJJzC5q4qWXuLVunzE25PchdGS", "proofs": [ "5ainV8oAWMp46GSAUU14Jk9xgCgjMuqqGFHA4k3aduXcYurjviC8gVunDXFrrtuTYcwXnTp8kvomgUrvVRdCd72g" ], "script": "base64:BgKnEAgCEgkKBwgICBgBCAESABIAEggKBggICAgICBIDCgEYEgASBAoCCAgiEGNvbnRyYWN0RmlsZW5hbWUiA1NFUCIMd2F2ZXNBc3NldElkIgdWTFRQT09MIghTVEJMUE9PTCIRaW52YWxpZFByaWNlQXNzZXQiB3dyYXBFcnIiA21zZyIIdGhyb3dFcnIiB3Rocm93UEQiFHRocm93Q3JlYXRlTm90Q2FsbGVkIhF0aHJvd1lvdU5vdElzc3VlciIPdGhyb3dQb29sRXhpc3RzIhV0aHJvd0Fzc2V0Tm90VmVyaWZpZWQiFnRocm93SW52YWxpZFByaWNlQXNzZXQiFHRocm93SW52YWxpZEZlZUFzc2V0Ihd0aHJvd0ludmFsaWRBbW91bnRBc3NldCISdGhyb3dJbnZhbGlkU3RhdHVzIh90aHJvd0NhbkFjdGl2YXRlT25seVBlbmRpbmdQb29sIh10aHJvd0ZhY3RvcnlSZXR1cm5lZE5vdFN0cmluZyIcdGhyb3dJbnZhbGlkUHJpY2VBc3NldEFtb3VudCIPdGhyb3dJbnZhbGlkRmVlIhV0aHJvd0ludmFsaWRBc3NldFBhaXIiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiD2tleUFkbWluUHViS2V5cyIJa2V5U3RhdHVzIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiEmtleUZhY3RvcnlDb250cmFjdCIWa2V5QXNzZXRzU3RvcmVDb250cmFjdCITa2V5RW1pc3Npb25Db250cmFjdCIJa2V5U3VmZml4IgxrZXlMYXN0SW5kZXgiC2luZGV4U3VmZml4Ig1zdGF0dXNQZW5kaW5nIg5zdGF0dXNEZWNsaW5lZCIMc3RhdHVzQWN0aXZlIghzdGF0dXNlcyIPa2V5Q3JlYXRlQ2FsbGVkIg9rZXlDcmVhdGVDYWxsZXIiFGtleUFtb3VudEFzc2V0QW1vdW50IhNrZXlQcmljZUFzc2V0QW1vdW50IglrZXlIZWlnaHQiC2tleVBvb2xUeXBlIg1rZXlGZWVBc3NldElkIgxrZXlGZWVBbW91bnQiF2tleUFtb3VudEFzc2V0TWluQW1vdW50IhdrZXlQcmljZUFzc2V0c01pbkFtb3VudCIOa2V5UHJpY2VBc3NldHMiHGdldE1hbmFnZXJWYXVsdEFkZHJlc3NPclRoaXMiByRtYXRjaDAiAXMiD2dldFN0cmluZ09yRmFpbCIDa2V5IhJzdHJpbmdPcHRpb25Ub0xpc3QiDHN0cmluZ09yVW5pdCIPZmFjdG9yeUNvbnRyYWN0IhlrZXlWb3RpbmdFbWlzc2lvbkNvbnRyYWN0IhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0IiJrZXlWb3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0Ih92b3RpbmdFbWlzc2lvbkNhbmRpZGF0ZUNvbnRyYWN0Ig5pc0NyZWF0ZUNhbGxlZCIQbXVzdENyZWF0ZUNhbGxlZCIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCITbWFuYWdlclZhdWx0QWRkcmVzcyIJaXNNYW5hZ2VyIgFpIgJwayILbXVzdE1hbmFnZXIiCW11c3RBZG1pbiIIYWRtaW5QS3MiCmlzVmVyaWZpZWQiB2Fzc2V0SWQiDGdldElkQW5kSW5mbyIHcGF5bWVudCICaWQiBGluZm8iC3ZhbGlkU3RhdHVzIgZzdGF0dXMiB19jcmVhdGUiCHBvb2xUeXBlIhJhbW91bnRBc3NldFBheW1lbnQiEXByaWNlQXNzZXRQYXltZW50Ig9mZWVBc3NldFBheW1lbnQiCyR0MDY0ODM2NTU1Ig9hbW91bnRBc3NldEluZm8iCyR0MDY1NTg2NjI3Ig5wcmljZUFzc2V0SW5mbyILJHQwNjYzMDY2OTMiCmZlZUFzc2V0SWQiDGZlZUFzc2V0SW5mbyIRYW1vdW50QXNzZXRBbW91bnQiEHByaWNlQXNzZXRBbW91bnQiDmZlZUFzc2V0QW1vdW50Ig9wcmljZUFzc2V0c0xpc3QiFWFzc2V0TWluQW1vdW50RGVmYXVsdCIXYWxsb3dlZEFzc2V0c01pbkFtb3VudHMiFGFtb3VudEFzc2V0TWluQW1vdW50IhBwcmljZUFzc2V0c0luZGV4IhNwcmljZUFzc2V0TWluQW1vdW50IglsYXN0SW5kZXgiCGN1ckluZGV4IhBlbWlzc2lvbkNvbnRyYWN0Igpwb29sRXhpc3RzIgFAIgZjaGVja3MiE3BheW1lbnRzV2l0aEZlZVNpemUiD2J1cm5FbWlzc2lvbkludiIQZmFjdG9yeVYyQWRkcmVzcyISYXNzZXRzU3RvcmVBZGRyZXNzIg9lbWlzc2lvbkFkZHJlc3MiFHByaWNlQXNzZXRzTWluQW1vdW50IglmZWVBbW91bnQiC2NoZWNrQ2FsbGVyIgtwb29sQWRkcmVzcyIRYW1vdW50QXNzZXRUaWNrZXIiEHByaWNlQXNzZXRUaWNrZXIiBGxvZ28iDnBvb2xUeXBlT3B0aW9uIhJhY3RpdmF0ZU5ld1Bvb2xJbnYiCWxwQXNzZXRJZCIJYmVmb3JlUHV0IgNwdXQiCGFmdGVyUHV0IgR1c2VyIgNyZXMiDGFkbWluUHViS2V5cyICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5QQABYQIPdXNlcl9wb29scy5yaWRlAAFiAgJfXwABYwIFV0FWRVMAAWQCB1ZMVFBPT0wAAWUCCFNUQkxQT09MAAFmAhNJbnZhbGlkIHByaWNlIGFzc2V0AQFnAQFoCQC5CQIJAMwIAgUBYQkAzAgCAgI6IAkAzAgCBQFoBQNuaWwCAAEBaQEBaAkAAgEJAQFnAQUBaAEBagAJAQFpAQIRUGVybWlzc2lvbiBkZW5pZWQBAWsACQEBaQECJENyZWF0ZSBpcyBub3QgY2FsbGVkIGZvciBhc3NldHMgcGFpcgEBbAAJAQFpAQIeWW91IGFyZSBub3QgYW1vdW50QXNzZXQgaXNzdWVyAQFtAAkBAWkBAiRQb29sIHdpdGggc3VjaCBhc3NldHMgYWxyZWFkeSBleGlzdHMBAW4ACQEBaQECFUFzc2V0IGlzIG5vdCB2ZXJpZmllZAEBbwAJAQFpAQUBZgEBcAAJAQFpAQIRSW52YWxpZCBmZWUgYXNzZXQBAXEACQEBaQECHUludmFsaWQgYW1vdW50IGFzc2V0IGF0dGFjaGVkAQFyAAkBAWkBAg5JbnZhbGlkIHN0YXR1cwEBcwAJAQFpAQIqQ2FuIGFjdGl2YXRlIHBvb2wgb25seSBpbiAncGVuZGluZycgc3RhdHVzAQF0AAkBAWkBAh1GYWN0b3J5VjIgcmV0dXJuZWQgbm90IHN0cmluZwEBdQAJAQFpAQIaaW52YWxpZCBwcmljZSBhc3NldCBhbW91bnQBAXYACQEBaQECC2ludmFsaWQgZmVlAQF3AAkBAWkBAhJpbnZhbGlkIGFzc2V0IHBhaXIBAXgACQC5CQIJAMwIAgICJXMJAMwIAgIQbWFuYWdlclB1YmxpY0tleQUDbmlsBQFiAQF5AAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBAXoACQC5CQIJAMwIAgICJXMJAMwIAgIMYWRtaW5QdWJLZXlzBQNuaWwFAWIBAUECAUIBQwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZzdGF0dXMJAMwIAgUBQgkAzAgCBQFDBQNuaWwFAWIBAUQACQC5CQIJAMwIAgICJXMJAMwIAgIPZmFjdG9yeUNvbnRyYWN0BQNuaWwFAWIBAUUACQC5CQIJAMwIAgICJXMJAMwIAgITYXNzZXRzU3RvcmVDb250cmFjdAUDbmlsBQFiAQFGAAkAuQkCCQDMCAICAiVzCQDMCAICEGVtaXNzaW9uQ29udHJhY3QFA25pbAUBYgEBRwIBQgFDCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBnN1ZmZpeAkAzAgCBQFCCQDMCAIFAUMFA25pbAUBYgEBSAAJALkJAgkAzAgCAgIlcwkAzAgCAglsYXN0SW5kZXgFA25pbAUBYgABSQIBdQABSgIHcGVuZGluZwABSwIIZGVjbGluZWQAAUwCBmFjdGl2ZQABTQkAzAgCBQFKCQDMCAIFAUsJAMwIAgUBTAUDbmlsAQFOAgFCAUMJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIMY3JlYXRlQ2FsbGVkCQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFiAQFPAgFCAUMJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIMY3JlYXRlQ2FsbGVyCQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFiAQFQAgFCAUMJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRYW1vdW50QXNzZXRBbW91bnQJAMwIAgUBQgkAzAgCBQFDBQNuaWwFAWIBAVECAUIBQwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhBwcmljZUFzc2V0QW1vdW50CQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFiAQFSAgFCAUMJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGaGVpZ2h0CQDMCAIFAUIJAMwIAgUBQwUDbmlsBQFiAQFTAgFCAUMJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcG9vbFR5cGUJAMwIAgUBQgkAzAgCBQFDBQNuaWwFAWIBAVQACQC5CQIJAMwIAgICJXMJAMwIAgIKZmVlQXNzZXRJZAUDbmlsBQFiAQFVAAkAuQkCCQDMCAICAiVzCQDMCAICCWZlZUFtb3VudAUDbmlsBQFiAQFWAAkAuQkCCQDMCAICAiVzCQDMCAICFGFtb3VudEFzc2V0TWluQW1vdW50BQNuaWwFAWIBAVcACQC5CQIJAMwIAgICJXMJAMwIAgIUcHJpY2VBc3NldHNNaW5BbW91bnQFA25pbAUBYgEBWAAJALkJAgkAzAgCAgIlcwkAzAgCAgtwcmljZUFzc2V0cwUDbmlsBQFiAQFZAAQBWgkAoggBCQEBeQADCQABAgUBWgIGU3RyaW5nBAJhYQUBWgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYWEFBHRoaXMBAmFiAQJhYwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFAmFjCQCsAgIFAmFjAg8gaXMgbm90IGRlZmluZWQBAmFkAQJhZQQBWgUCYWUDCQABAgUBWgIGU3RyaW5nBAJhYQUBWgMJAAACCQCxAgEFAmFhAAAFA25pbAkAtQkCBQJhYQUBYgMJAAECBQFaAgRVbml0BQNuaWwJAAIBAgtNYXRjaCBlcnJvcgACYWYJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhYgEJAQFEAAACYWcJALkJAgkAzAgCAgIlcwkAzAgCAhZ2b3RpbmdFbWlzc2lvbkNvbnRyYWN0BQNuaWwFAWIAAmFoCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYWYFAmFnCQEBZwECLHZvdGluZyBlbWlzc2lvbiBjb250cmFjdCBhZGRyZXNzIGlzIHJlcXVpcmVkAAJhaQkAuQkCCQDMCAICAiVzCQDMCAICH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QFA25pbAUBYgACYWoJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhaAUCYWkJAQFnAQI2dm90aW5nIGVtaXNzaW9uIGNhbmRpZGF0ZSBjb250cmFjdCBhZGRyZXNzIGlzIHJlcXVpcmVkAQJhawIBQgFDCQELdmFsdWVPckVsc2UCCQCgCAEJAQFOAgUBQgUBQwcBAmFsAgFCAUMDCQECYWsCBQFCBQFDBgkBAWsAAQJhbQAEAmFuCQEBWQAEAVoJAJ0IAgUCYW4JAQF4AAMJAAECBQFaAgZTdHJpbmcEAmFhBQFaCQDZBAEFAmFhAwkAAQIFAVoCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYW8BAmFwBAFaCQECYW0AAwkAAQIFAVoCCkJ5dGVWZWN0b3IEAmFxBQFaCQAAAggFAmFwD2NhbGxlclB1YmxpY0tleQUCYXEDCQABAgUBWgIEVW5pdAkAAAIIBQJhcAZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECYXIBAmFwAwkBAmFvAQUCYXAGCQEBagABAmFzAQJhcAQCYXQJAQJhZAEJAKIIAQkBAXoAAwkBD2NvbnRhaW5zRWxlbWVudAIFAmF0CQDYBAEIBQJhcA9jYWxsZXJQdWJsaWNLZXkGCQECYXIBBQJhcAECYXUBAmF2CQAAAgkBC3ZhbHVlT3JFbHNlAgkAmggCCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYWIBCQEBRQAJAKwCAgkArAICAghzdGF0dXNfPAUCYXYCAT4AAAACAQJhdwECYXgEAVoIBQJheAdhc3NldElkAwkAAQIFAVoCCkJ5dGVWZWN0b3IEAmF5BQFaBAJhegkBBXZhbHVlAQkA7AcBBQJheQkAlAoCCQDYBAEFAmF5BQJhegMJAAECBQFaAgRVbml0CQCUCgIFAWMFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYUEBAmFCCQEPY29udGFpbnNFbGVtZW50AgUBTQUCYUIBAmFDAgJhcAJhRAQCYUUJAQV2YWx1ZQEJAJEDAggFAmFwCHBheW1lbnRzAAAEAmFGCQEFdmFsdWUBCQCRAwIIBQJhcAhwYXltZW50cwABBAJhRwkBBXZhbHVlAQkAkQMCCAUCYXAIcGF5bWVudHMAAgQCYUgJAQJhdwEFAmFFBAFCCAUCYUgCXzEEAmFJCAUCYUgCXzIEAmFKCQECYXcBBQJhRgQBQwgFAmFKAl8xBAJhSwgFAmFKAl8yBAJhTAkBAmF3AQUCYUcEAmFNCAUCYUwCXzEEAmFOCAUCYUwCXzIEAmFPCAUCYUUGYW1vdW50BAJhUAgFAmFGBmFtb3VudAQCYVEIBQJhRwZhbW91bnQEAmFSCQECYWQBCQCdCAIFAmFmCQEBWAAEAmFTCQERQGV4dHJOYXRpdmUoMTA1NSkBCQEBVgAEAmFUCQECYWQBCQCiCAEJAQFXAAQCYVUDCQEPY29udGFpbnNFbGVtZW50AgUCYVIFAUIEAmFWCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUCYVIFAUIFAWYJAQV2YWx1ZQEJALYJAQkAkQMCBQJhVAUCYVYFAmFTBAJhVwMJAQ9jb250YWluc0VsZW1lbnQCBQJhUgUBQwQCYVYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQJhUgUBQwUBZgkBBXZhbHVlAQkAtgkBCQCRAwIFAmFUBQJhVgUCYVMEAmFYCQELdmFsdWVPckVsc2UCCQCfCAEJAQFIAAAABAJhWQkAZAIFAmFYAAEEAmFaCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYWIBCQEBRgAEAmJhCgACYmIJAPwHBAUCYWYCEnBvb2xFeGlzdHNSRUFET05MWQkAzAgCBQFCCQDMCAIFAUMFA25pbAUDbmlsAwkAAQIFAmJiAgdCb29sZWFuBQJiYgkAAgEJAKwCAgkAAwEFAmJiAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJiYwkAzAgCAwkBASEBCQECYWsCBQFCBQFDBgkBAW0ACQDMCAIDCQEBIQEFAmJhBgkBAW0ACQDMCAIDCQECIT0CBQFCBQFDBgkBAXcACQDMCAIDAwkBAmFvAQUCYXAGAwkBAmF1AQUBQgkBAmF1AQUBQwcGCQEBdwAJAMwIAgMDCQEPY29udGFpbnNFbGVtZW50AgUCYVIFAUIGCQEPY29udGFpbnNFbGVtZW50AgUCYVIFAUMGCQEBdwAJAMwIAgMDCQECYW8BBQJhcAYJAAACCQCiCAEJAQFUAAUCYU0GCQEBcAAJAMwIAgMDCQECYW8BBQJhcAYJAGcCBQJhTwkBEUBleHRyTmF0aXZlKDEwNTUpAQkBAVYABgkBAXEACQDMCAIDAwkBAmFvAQUCYXAGCQBnAgUCYVAFAmFXBgkBAXUACQDMCAIDAwkBAmFvAQUCYXAGCQAAAgUCYVEJAJ8IAQkBAVUABgkBAXYABQNuaWwDCQAAAgUCYmMFAmJjBAJiZAADBAJiZQMJAGcCCQCQAwEIBQJhcAhwYXltZW50cwUCYmQJAPwHBAUCYVoCBGJ1cm4FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJhTQUCYVEFA25pbAUEdW5pdAMJAAACBQJiZQUCYmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFOAgUBQgUBQwYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU8CBQFCBQFDCQClCAEIBQJhcAZjYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFIAAUCYVkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUcCBQFCBQFDCQCsAgIJAKQDAQUCYVkFAUkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUBQgUBQwUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFBAgUBQgUBQwUBSgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVACBQFCBQFDBQJhTwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVECBQFCBQFDBQJhUAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAUIFAUMFAmFEBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4HAmFwAQtjb25zdHJ1Y3RvcgcCYmYCYmcCYmgCYmkCYVUCYU0CYmoEAmJrCQECYXIBBQJhcAMJAAACBQJiawUCYmsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUQABQJiZgkAzAgCCQELU3RyaW5nRW50cnkCCQEBRQAFAmJnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFGAAUCYmgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVcACQC5CQIFAmJpBQFiCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgAFAmFVCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAAUCYU0JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAAUCYmoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhcAEGY3JlYXRlAAkBAmFDAgUCYXAFAWQCYXABDGNyZWF0ZVN0YWJsZQAEAmJrCQECYXIBBQJhcAMJAAACBQJiawUCYmsJAQJhQwIFAmFwBQFlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFwAQhhY3RpdmF0ZQYCYmwBQgJibQFDAmJuAmJvBAJiYwkAzAgCCQECYXMBBQJhcAkAzAgCAwkBAmFrAgUBQgUBQwYJAQFrAAkAzAgCAwkAAAIJAQV2YWx1ZQEJAKIIAQkBAUECBQFCBQFDBQFKBgkBAXMABQNuaWwDCQAAAgUCYmMFAmJjBAJicAkAnQgCBQR0aGlzCQEBUwIFAUIFAUMEAmJxCQD8BwQFAmFmAg9hY3RpdmF0ZU5ld1Bvb2wJAMwIAgUCYmwJAMwIAgUBQgkAzAgCBQFDCQDMCAIJAKwCAgkArAICBQJibQUCYm4CAkxQCQDMCAIJAKwCAgkArAICCQCsAgIFAmJtAgEvBQJibgIeIHBvb2wgbGlxdWlkaXR5IHByb3ZpZGVyIHRva2VuCQDMCAIAAAkAzAgCAwkAAAIFAmJwBQR1bml0AgdWTFRQT09MCQEFdmFsdWUBBQJicAkAzAgCBQJibwUDbmlsBQNuaWwDCQAAAgUCYnEFAmJxBAJicgQBWgUCYnEDCQABAgUBWgIGU3RyaW5nBAJheQUBWgUCYXkJAQF0AAMJAAACBQJicgUCYnIEAmJzCQDwBwIFBHRoaXMJANkEAQUCYnIDCQAAAgUCYnMFAmJzBAJidAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQJibAIDcHV0CQDMCAIAAAkAzAgCBwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCAwkAAAIFAUICBVdBVkVTBQR1bml0CQDZBAEFAUIJAQV2YWx1ZQEJAJ8IAQkBAVACBQFCBQFDCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCAwkAAAIFAUMCBVdBVkVTBQR1bml0CQDZBAEFAUMJAQV2YWx1ZQEJAJ8IAQkBAVECBQFCBQFDBQNuaWwDCQAAAgUCYnQFAmJ0BAJidQkA8AcCBQR0aGlzCQDZBAEFAmJyAwkAAAIFAmJ1BQJidQQCYnYJAQV2YWx1ZQEJAKYIAQkBBXZhbHVlAQkAoggBCQEBTwIFAUIFAUMEAmJ3CQD8BwQFAmFqAgdhcHByb3ZlCQDMCAIFAUIJAMwIAgUBQwUDbmlsBQNuaWwDCQAAAgUCYncFAmJ3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFBAgUBQgUBQwUBTAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJidgkAZQIFAmJ1BQJicwkA2QQBBQJicgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFwAQlzZXRBZG1pbnMBAmJ4BAJiawkBAmFyAQUCYXADCQAAAgUCYmsFAmJrCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQF6AAkAuQkCBQJieAUBYgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFwARNwcmljZUFzc2V0c1JFQURPTkxZAAkAlAoCBQNuaWwJAQJhZAEJAKIIAQkBAVgAAmFwAQ5zdGF0dXNSRUFET05MWQIBQgFDBAJhQgQBWgkAoggBCQEBQQIFAUIFAUMDCQABAgUBWgIGU3RyaW5nBAJhYQUBWgUCYWEFBHVuaXQJAJQKAgUDbmlsBQJhQgECYnkBAmJ6AAQCYkEEAVoJAQJhbQADCQABAgUBWgIKQnl0ZVZlY3RvcgQCYXEFAVoFAmFxAwkAAQIFAVoCBFVuaXQIBQJieQ9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCYnkJYm9keUJ5dGVzCQCRAwIIBQJieQZwcm9vZnMAAAUCYkE24JZm", "height": 2603601, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: tXhDBS2mq3Yrg39TJBvb3aJ12cS8HL8zrvyGe6f5j9v Next: 8Kz9UHRiKgtpSS21BbMknJFzg9ux5ZjB7hSKdnKxnRGr Diff:
OldNewDifferences
66 let SEP = "__"
77
88 let wavesAssetId = "WAVES"
9+
10+let VLTPOOL = "VLTPOOL"
11+
12+let STBLPOOL = "STBLPOOL"
913
1014 let invalidPriceAsset = "Invalid price asset"
1115
107111
108112
109113 func keyHeight (amountAssetId,priceAssetId) = makeString(["%s%s%s", "height", amountAssetId, priceAssetId], SEP)
114+
115+
116+func keyPoolType (amountAssetId,priceAssetId) = makeString(["%s%s%s", "poolType", amountAssetId, priceAssetId], SEP)
110117
111118
112119 func keyFeeAssetId () = makeString(["%s", "feeAssetId"], SEP)
218225 func validStatus (status) = containsElement(statuses, status)
219226
220227
221-@Callable(i)
222-func constructor (factoryV2Address,assetsStoreAddress,emissionAddress,priceAssetsMinAmount,amountAssetMinAmount,feeAssetId,feeAmount) = {
223- let checkCaller = mustManager(i)
224- if ((checkCaller == checkCaller))
225- then [StringEntry(keyFactoryContract(), factoryV2Address), StringEntry(keyAssetsStoreContract(), assetsStoreAddress), StringEntry(keyEmissionContract(), emissionAddress), StringEntry(keyPriceAssetsMinAmount(), makeString(priceAssetsMinAmount, SEP)), IntegerEntry(keyAmountAssetMinAmount(), amountAssetMinAmount), StringEntry(keyFeeAssetId(), feeAssetId), IntegerEntry(keyFeeAmount(), feeAmount)]
226- else throw("Strict value is not equal to itself.")
227- }
228-
229-
230-
231-@Callable(i)
232-func create () = {
228+func _create (i,poolType) = {
233229 let amountAssetPayment = value(i.payments[0])
234230 let priceAssetPayment = value(i.payments[1])
235231 let feeAssetPayment = value(i.payments[2])
236- let $t075407612 = getIdAndInfo(amountAssetPayment)
237- let amountAssetId = $t075407612._1
238- let amountAssetInfo = $t075407612._2
239- let $t076157684 = getIdAndInfo(priceAssetPayment)
240- let priceAssetId = $t076157684._1
241- let priceAssetInfo = $t076157684._2
242- let $t076877750 = getIdAndInfo(feeAssetPayment)
243- let feeAssetId = $t076877750._1
244- let feeAssetInfo = $t076877750._2
232+ let $t064836555 = getIdAndInfo(amountAssetPayment)
233+ let amountAssetId = $t064836555._1
234+ let amountAssetInfo = $t064836555._2
235+ let $t065586627 = getIdAndInfo(priceAssetPayment)
236+ let priceAssetId = $t065586627._1
237+ let priceAssetInfo = $t065586627._2
238+ let $t066306693 = getIdAndInfo(feeAssetPayment)
239+ let feeAssetId = $t066306693._1
240+ let feeAssetInfo = $t066306693._2
245241 let amountAssetAmount = amountAssetPayment.amount
246242 let priceAssetAmount = priceAssetPayment.amount
247243 let feeAssetAmount = feeAssetPayment.amount
275271 then true
276272 else throwPoolExists(), if ((amountAssetId != priceAssetId))
277273 then true
278- else throwInvalidAssetPair(), if (if (isVerified(amountAssetId))
279- then isVerified(priceAssetId)
280- else false)
274+ else throwInvalidAssetPair(), if (if (isManager(i))
275+ then true
276+ else if (isVerified(amountAssetId))
277+ then isVerified(priceAssetId)
278+ else false)
281279 then true
282280 else throwInvalidAssetPair(), if (if (containsElement(priceAssetsList, amountAssetId))
283281 then true
307305 then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetAmount)])
308306 else unit
309307 if ((burnEmissionInv == burnEmissionInv))
310- 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)]
308+ 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)]
311309 else throw("Strict value is not equal to itself.")
312310 }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+
314+
315+@Callable(i)
316+func constructor (factoryV2Address,assetsStoreAddress,emissionAddress,priceAssetsMinAmount,amountAssetMinAmount,feeAssetId,feeAmount) = {
317+ let checkCaller = mustManager(i)
318+ if ((checkCaller == checkCaller))
319+ then [StringEntry(keyFactoryContract(), factoryV2Address), StringEntry(keyAssetsStoreContract(), assetsStoreAddress), StringEntry(keyEmissionContract(), emissionAddress), StringEntry(keyPriceAssetsMinAmount(), makeString(priceAssetsMinAmount, SEP)), IntegerEntry(keyAmountAssetMinAmount(), amountAssetMinAmount), StringEntry(keyFeeAssetId(), feeAssetId), IntegerEntry(keyFeeAmount(), feeAmount)]
320+ else throw("Strict value is not equal to itself.")
321+ }
322+
323+
324+
325+@Callable(i)
326+func create () = _create(i, VLTPOOL)
327+
328+
329+
330+@Callable(i)
331+func createStable () = {
332+ let checkCaller = mustManager(i)
333+ if ((checkCaller == checkCaller))
334+ then _create(i, STBLPOOL)
313335 else throw("Strict value is not equal to itself.")
314336 }
315337
324346 else throwCanActivateOnlyPendingPool()]
325347 if ((checks == checks))
326348 then {
327- let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, "VLTPOOL", logo], nil)
349+ let poolTypeOption = getString(this, keyPoolType(amountAssetId, priceAssetId))
350+ let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, if ((poolTypeOption == unit))
351+ then "VLTPOOL"
352+ else value(poolTypeOption), logo], nil)
328353 if ((activateNewPoolInv == activateNewPoolInv))
329354 then {
330355 let lpAssetId = match activateNewPoolInv {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let contractFilename = "user_pools.ride"
55
66 let SEP = "__"
77
88 let wavesAssetId = "WAVES"
9+
10+let VLTPOOL = "VLTPOOL"
11+
12+let STBLPOOL = "STBLPOOL"
913
1014 let invalidPriceAsset = "Invalid price asset"
1115
1216 func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
1317
1418
1519 func throwErr (msg) = throw(wrapErr(msg))
1620
1721
1822 func throwPD () = throwErr("Permission denied")
1923
2024
2125 func throwCreateNotCalled () = throwErr("Create is not called for assets pair")
2226
2327
2428 func throwYouNotIssuer () = throwErr("You are not amountAsset issuer")
2529
2630
2731 func throwPoolExists () = throwErr("Pool with such assets already exists")
2832
2933
3034 func throwAssetNotVerified () = throwErr("Asset is not verified")
3135
3236
3337 func throwInvalidPriceAsset () = throwErr(invalidPriceAsset)
3438
3539
3640 func throwInvalidFeeAsset () = throwErr("Invalid fee asset")
3741
3842
3943 func throwInvalidAmountAsset () = throwErr("Invalid amount asset attached")
4044
4145
4246 func throwInvalidStatus () = throwErr("Invalid status")
4347
4448
4549 func throwCanActivateOnlyPendingPool () = throwErr("Can activate pool only in 'pending' status")
4650
4751
4852 func throwFactoryReturnedNotString () = throwErr("FactoryV2 returned not string")
4953
5054
5155 func throwInvalidPriceAssetAmount () = throwErr("invalid price asset amount")
5256
5357
5458 func throwInvalidFee () = throwErr("invalid fee")
5559
5660
5761 func throwInvalidAssetPair () = throwErr("invalid asset pair")
5862
5963
6064 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
6165
6266
6367 func keyManagerVaultAddress () = "%s__managerVaultAddress"
6468
6569
6670 func keyAdminPubKeys () = makeString(["%s", "adminPubKeys"], SEP)
6771
6872
6973 func keyStatus (amountAssetId,priceAssetId) = makeString(["%s%s%s", "status", amountAssetId, priceAssetId], SEP)
7074
7175
7276 func keyFactoryContract () = makeString(["%s", "factoryContract"], SEP)
7377
7478
7579 func keyAssetsStoreContract () = makeString(["%s", "assetsStoreContract"], SEP)
7680
7781
7882 func keyEmissionContract () = makeString(["%s", "emissionContract"], SEP)
7983
8084
8185 func keySuffix (amountAssetId,priceAssetId) = makeString(["%s%s%s", "suffix", amountAssetId, priceAssetId], SEP)
8286
8387
8488 func keyLastIndex () = makeString(["%s", "lastIndex"], SEP)
8589
8690
8791 let indexSuffix = "u"
8892
8993 let statusPending = "pending"
9094
9195 let statusDeclined = "declined"
9296
9397 let statusActive = "active"
9498
9599 let statuses = [statusPending, statusDeclined, statusActive]
96100
97101 func keyCreateCalled (amountAssetId,priceAssetId) = makeString(["%s%s%s", "createCalled", amountAssetId, priceAssetId], SEP)
98102
99103
100104 func keyCreateCaller (amountAssetId,priceAssetId) = makeString(["%s%s%s", "createCaller", amountAssetId, priceAssetId], SEP)
101105
102106
103107 func keyAmountAssetAmount (amountAssetId,priceAssetId) = makeString(["%s%s%s", "amountAssetAmount", amountAssetId, priceAssetId], SEP)
104108
105109
106110 func keyPriceAssetAmount (amountAssetId,priceAssetId) = makeString(["%s%s%s", "priceAssetAmount", amountAssetId, priceAssetId], SEP)
107111
108112
109113 func keyHeight (amountAssetId,priceAssetId) = makeString(["%s%s%s", "height", amountAssetId, priceAssetId], SEP)
114+
115+
116+func keyPoolType (amountAssetId,priceAssetId) = makeString(["%s%s%s", "poolType", amountAssetId, priceAssetId], SEP)
110117
111118
112119 func keyFeeAssetId () = makeString(["%s", "feeAssetId"], SEP)
113120
114121
115122 func keyFeeAmount () = makeString(["%s", "feeAmount"], SEP)
116123
117124
118125 func keyAmountAssetMinAmount () = makeString(["%s", "amountAssetMinAmount"], SEP)
119126
120127
121128 func keyPriceAssetsMinAmount () = makeString(["%s", "priceAssetsMinAmount"], SEP)
122129
123130
124131 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
125132
126133
127134 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
128135 case s: String =>
129136 addressFromStringValue(s)
130137 case _ =>
131138 this
132139 }
133140
134141
135142 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
136143
137144
138145 func stringOptionToList (stringOrUnit) = match stringOrUnit {
139146 case s: String =>
140147 if ((size(s) == 0))
141148 then nil
142149 else split(s, SEP)
143150 case _: Unit =>
144151 nil
145152 case _ =>
146153 throw("Match error")
147154 }
148155
149156
150157 let factoryContract = addressFromStringValue(getStringOrFail(keyFactoryContract()))
151158
152159 let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], SEP)
153160
154161 let votingEmissionContract = addressFromStringValue(valueOrErrorMessage(getString(factoryContract, keyVotingEmissionContract), wrapErr("voting emission contract address is required")))
155162
156163 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], SEP)
157164
158165 let votingEmissionCandidateContract = addressFromStringValue(valueOrErrorMessage(getString(votingEmissionContract, keyVotingEmissionCandidateContract), wrapErr("voting emission candidate contract address is required")))
159166
160167 func isCreateCalled (amountAssetId,priceAssetId) = valueOrElse(getBoolean(keyCreateCalled(amountAssetId, priceAssetId)), false)
161168
162169
163170 func mustCreateCalled (amountAssetId,priceAssetId) = if (isCreateCalled(amountAssetId, priceAssetId))
164171 then true
165172 else throwCreateNotCalled()
166173
167174
168175 func managerPublicKeyOrUnit () = {
169176 let managerVaultAddress = getManagerVaultAddressOrThis()
170177 match getString(managerVaultAddress, keyManagerPublicKey()) {
171178 case s: String =>
172179 fromBase58String(s)
173180 case _: Unit =>
174181 unit
175182 case _ =>
176183 throw("Match error")
177184 }
178185 }
179186
180187
181188 func isManager (i) = match managerPublicKeyOrUnit() {
182189 case pk: ByteVector =>
183190 (i.callerPublicKey == pk)
184191 case _: Unit =>
185192 (i.caller == this)
186193 case _ =>
187194 throw("Match error")
188195 }
189196
190197
191198 func mustManager (i) = if (isManager(i))
192199 then true
193200 else throwPD()
194201
195202
196203 func mustAdmin (i) = {
197204 let adminPKs = stringOptionToList(getString(keyAdminPubKeys()))
198205 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
199206 then true
200207 else mustManager(i)
201208 }
202209
203210
204211 func isVerified (assetId) = (valueOrElse(getInteger(addressFromStringValue(getStringOrFail(keyAssetsStoreContract())), (("status_<" + assetId) + ">")), 0) == 2)
205212
206213
207214 func getIdAndInfo (payment) = match payment.assetId {
208215 case id: ByteVector =>
209216 let info = value(assetInfo(id))
210217 $Tuple2(toBase58String(id), info)
211218 case _: Unit =>
212219 $Tuple2(wavesAssetId, unit)
213220 case _ =>
214221 throw("Match error")
215222 }
216223
217224
218225 func validStatus (status) = containsElement(statuses, status)
219226
220227
221-@Callable(i)
222-func constructor (factoryV2Address,assetsStoreAddress,emissionAddress,priceAssetsMinAmount,amountAssetMinAmount,feeAssetId,feeAmount) = {
223- let checkCaller = mustManager(i)
224- if ((checkCaller == checkCaller))
225- then [StringEntry(keyFactoryContract(), factoryV2Address), StringEntry(keyAssetsStoreContract(), assetsStoreAddress), StringEntry(keyEmissionContract(), emissionAddress), StringEntry(keyPriceAssetsMinAmount(), makeString(priceAssetsMinAmount, SEP)), IntegerEntry(keyAmountAssetMinAmount(), amountAssetMinAmount), StringEntry(keyFeeAssetId(), feeAssetId), IntegerEntry(keyFeeAmount(), feeAmount)]
226- else throw("Strict value is not equal to itself.")
227- }
228-
229-
230-
231-@Callable(i)
232-func create () = {
228+func _create (i,poolType) = {
233229 let amountAssetPayment = value(i.payments[0])
234230 let priceAssetPayment = value(i.payments[1])
235231 let feeAssetPayment = value(i.payments[2])
236- let $t075407612 = getIdAndInfo(amountAssetPayment)
237- let amountAssetId = $t075407612._1
238- let amountAssetInfo = $t075407612._2
239- let $t076157684 = getIdAndInfo(priceAssetPayment)
240- let priceAssetId = $t076157684._1
241- let priceAssetInfo = $t076157684._2
242- let $t076877750 = getIdAndInfo(feeAssetPayment)
243- let feeAssetId = $t076877750._1
244- let feeAssetInfo = $t076877750._2
232+ let $t064836555 = getIdAndInfo(amountAssetPayment)
233+ let amountAssetId = $t064836555._1
234+ let amountAssetInfo = $t064836555._2
235+ let $t065586627 = getIdAndInfo(priceAssetPayment)
236+ let priceAssetId = $t065586627._1
237+ let priceAssetInfo = $t065586627._2
238+ let $t066306693 = getIdAndInfo(feeAssetPayment)
239+ let feeAssetId = $t066306693._1
240+ let feeAssetInfo = $t066306693._2
245241 let amountAssetAmount = amountAssetPayment.amount
246242 let priceAssetAmount = priceAssetPayment.amount
247243 let feeAssetAmount = feeAssetPayment.amount
248244 let priceAssetsList = stringOptionToList(getString(factoryContract, keyPriceAssets()))
249245 let assetMinAmountDefault = getIntegerValue(keyAmountAssetMinAmount())
250246 let allowedAssetsMinAmounts = stringOptionToList(getString(keyPriceAssetsMinAmount()))
251247 let amountAssetMinAmount = if (containsElement(priceAssetsList, amountAssetId))
252248 then {
253249 let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, amountAssetId), invalidPriceAsset)
254250 value(parseInt(allowedAssetsMinAmounts[priceAssetsIndex]))
255251 }
256252 else assetMinAmountDefault
257253 let priceAssetMinAmount = if (containsElement(priceAssetsList, priceAssetId))
258254 then {
259255 let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
260256 value(parseInt(allowedAssetsMinAmounts[priceAssetsIndex]))
261257 }
262258 else assetMinAmountDefault
263259 let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
264260 let curIndex = (lastIndex + 1)
265261 let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
266262 let poolExists = {
267263 let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
268264 if ($isInstanceOf(@, "Boolean"))
269265 then @
270266 else throw(($getType(@) + " couldn't be cast to Boolean"))
271267 }
272268 let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
273269 then true
274270 else throwPoolExists(), if (!(poolExists))
275271 then true
276272 else throwPoolExists(), if ((amountAssetId != priceAssetId))
277273 then true
278- else throwInvalidAssetPair(), if (if (isVerified(amountAssetId))
279- then isVerified(priceAssetId)
280- else false)
274+ else throwInvalidAssetPair(), if (if (isManager(i))
275+ then true
276+ else if (isVerified(amountAssetId))
277+ then isVerified(priceAssetId)
278+ else false)
281279 then true
282280 else throwInvalidAssetPair(), if (if (containsElement(priceAssetsList, amountAssetId))
283281 then true
284282 else containsElement(priceAssetsList, priceAssetId))
285283 then true
286284 else throwInvalidAssetPair(), if (if (isManager(i))
287285 then true
288286 else (getString(keyFeeAssetId()) == feeAssetId))
289287 then true
290288 else throwInvalidFeeAsset(), if (if (isManager(i))
291289 then true
292290 else (amountAssetAmount >= getIntegerValue(keyAmountAssetMinAmount())))
293291 then true
294292 else throwInvalidAmountAsset(), if (if (isManager(i))
295293 then true
296294 else (priceAssetAmount >= priceAssetMinAmount))
297295 then true
298296 else throwInvalidPriceAssetAmount(), if (if (isManager(i))
299297 then true
300298 else (feeAssetAmount == getInteger(keyFeeAmount())))
301299 then true
302300 else throwInvalidFee()]
303301 if ((checks == checks))
304302 then {
305303 let paymentsWithFeeSize = 3
306304 let burnEmissionInv = if ((size(i.payments) >= paymentsWithFeeSize))
307305 then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetAmount)])
308306 else unit
309307 if ((burnEmissionInv == burnEmissionInv))
310- 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)]
308+ 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)]
311309 else throw("Strict value is not equal to itself.")
312310 }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+
314+
315+@Callable(i)
316+func constructor (factoryV2Address,assetsStoreAddress,emissionAddress,priceAssetsMinAmount,amountAssetMinAmount,feeAssetId,feeAmount) = {
317+ let checkCaller = mustManager(i)
318+ if ((checkCaller == checkCaller))
319+ then [StringEntry(keyFactoryContract(), factoryV2Address), StringEntry(keyAssetsStoreContract(), assetsStoreAddress), StringEntry(keyEmissionContract(), emissionAddress), StringEntry(keyPriceAssetsMinAmount(), makeString(priceAssetsMinAmount, SEP)), IntegerEntry(keyAmountAssetMinAmount(), amountAssetMinAmount), StringEntry(keyFeeAssetId(), feeAssetId), IntegerEntry(keyFeeAmount(), feeAmount)]
320+ else throw("Strict value is not equal to itself.")
321+ }
322+
323+
324+
325+@Callable(i)
326+func create () = _create(i, VLTPOOL)
327+
328+
329+
330+@Callable(i)
331+func createStable () = {
332+ let checkCaller = mustManager(i)
333+ if ((checkCaller == checkCaller))
334+ then _create(i, STBLPOOL)
313335 else throw("Strict value is not equal to itself.")
314336 }
315337
316338
317339
318340 @Callable(i)
319341 func activate (poolAddress,amountAssetId,amountAssetTicker,priceAssetId,priceAssetTicker,logo) = {
320342 let checks = [mustAdmin(i), if (isCreateCalled(amountAssetId, priceAssetId))
321343 then true
322344 else throwCreateNotCalled(), if ((value(getString(keyStatus(amountAssetId, priceAssetId))) == statusPending))
323345 then true
324346 else throwCanActivateOnlyPendingPool()]
325347 if ((checks == checks))
326348 then {
327- let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, "VLTPOOL", logo], nil)
349+ let poolTypeOption = getString(this, keyPoolType(amountAssetId, priceAssetId))
350+ let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, if ((poolTypeOption == unit))
351+ then "VLTPOOL"
352+ else value(poolTypeOption), logo], nil)
328353 if ((activateNewPoolInv == activateNewPoolInv))
329354 then {
330355 let lpAssetId = match activateNewPoolInv {
331356 case id: String =>
332357 id
333358 case _ =>
334359 throwFactoryReturnedNotString()
335360 }
336361 if ((lpAssetId == lpAssetId))
337362 then {
338363 let beforePut = assetBalance(this, fromBase58String(lpAssetId))
339364 if ((beforePut == beforePut))
340365 then {
341366 let put = invoke(addressFromStringValue(poolAddress), "put", [0, false], [AttachedPayment(if ((amountAssetId == "WAVES"))
342367 then unit
343368 else fromBase58String(amountAssetId), value(getInteger(keyAmountAssetAmount(amountAssetId, priceAssetId)))), AttachedPayment(if ((priceAssetId == "WAVES"))
344369 then unit
345370 else fromBase58String(priceAssetId), value(getInteger(keyPriceAssetAmount(amountAssetId, priceAssetId))))])
346371 if ((put == put))
347372 then {
348373 let afterPut = assetBalance(this, fromBase58String(lpAssetId))
349374 if ((afterPut == afterPut))
350375 then {
351376 let user = value(addressFromString(value(getString(keyCreateCaller(amountAssetId, priceAssetId)))))
352377 let res = invoke(votingEmissionCandidateContract, "approve", [amountAssetId, priceAssetId], nil)
353378 if ((res == res))
354379 then [StringEntry(keyStatus(amountAssetId, priceAssetId), statusActive), ScriptTransfer(user, (afterPut - beforePut), fromBase58String(lpAssetId))]
355380 else throw("Strict value is not equal to itself.")
356381 }
357382 else throw("Strict value is not equal to itself.")
358383 }
359384 else throw("Strict value is not equal to itself.")
360385 }
361386 else throw("Strict value is not equal to itself.")
362387 }
363388 else throw("Strict value is not equal to itself.")
364389 }
365390 else throw("Strict value is not equal to itself.")
366391 }
367392 else throw("Strict value is not equal to itself.")
368393 }
369394
370395
371396
372397 @Callable(i)
373398 func setAdmins (adminPubKeys) = {
374399 let checkCaller = mustManager(i)
375400 if ((checkCaller == checkCaller))
376401 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
377402 else throw("Strict value is not equal to itself.")
378403 }
379404
380405
381406
382407 @Callable(i)
383408 func priceAssetsREADONLY () = $Tuple2(nil, stringOptionToList(getString(keyPriceAssets())))
384409
385410
386411
387412 @Callable(i)
388413 func statusREADONLY (amountAssetId,priceAssetId) = {
389414 let status = match getString(keyStatus(amountAssetId, priceAssetId)) {
390415 case s: String =>
391416 s
392417 case _ =>
393418 unit
394419 }
395420 $Tuple2(nil, status)
396421 }
397422
398423
399424 @Verifier(tx)
400425 func verify () = {
401426 let targetPublicKey = match managerPublicKeyOrUnit() {
402427 case pk: ByteVector =>
403428 pk
404429 case _: Unit =>
405430 tx.senderPublicKey
406431 case _ =>
407432 throw("Match error")
408433 }
409434 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
410435 }
411436

github/deemru/w8io/873ac7e 
98.84 ms