tx · Bcqq9bGEuN49RvHfog8bCyPom58HDDuTAGPCW6xYYaGT

3N3g7W8FPoQ7g5EadbAD2GVjrZT5RWpHZZh:  -0.01300000 Waves

2023.05.10 16:47 [2571872] smart account 3N3g7W8FPoQ7g5EadbAD2GVjrZT5RWpHZZh > SELF 0.00000000 Waves

{ "type": 13, "id": "Bcqq9bGEuN49RvHfog8bCyPom58HDDuTAGPCW6xYYaGT", "fee": 1300000, "feeAssetId": null, "timestamp": 1683726442708, "version": 2, "chainId": 84, "sender": "3N3g7W8FPoQ7g5EadbAD2GVjrZT5RWpHZZh", "senderPublicKey": "Ap7CkWd6fzBU34kGo4GJJzC5q4qWXuLVunzE25PchdGS", "proofs": [ "2qetHo937ogyE15UboabAAEyS4ZhpwnDvBa1kj6eYyAE8ZsV957hJDfaWkwAmfCTQQ9rnmdxosBTGZeDch8cYkzk" ], "script": "base64:BgLiDwgCEgkKBwgICBgBCAESABIICgYICAgICAgSAwoBGBIAEgQKAggIIhBjb250cmFjdEZpbGVuYW1lIgNTRVAiDHdhdmVzQXNzZXRJZCIRaW52YWxpZFByaWNlQXNzZXQiB3dyYXBFcnIiA21zZyIIdGhyb3dFcnIiB3Rocm93UEQiFHRocm93Q3JlYXRlTm90Q2FsbGVkIhF0aHJvd1lvdU5vdElzc3VlciIPdGhyb3dQb29sRXhpc3RzIhV0aHJvd0Fzc2V0Tm90VmVyaWZpZWQiFnRocm93SW52YWxpZFByaWNlQXNzZXQiFHRocm93SW52YWxpZEZlZUFzc2V0Ihd0aHJvd0ludmFsaWRBbW91bnRBc3NldCISdGhyb3dJbnZhbGlkU3RhdHVzIh90aHJvd0NhbkFjdGl2YXRlT25seVBlbmRpbmdQb29sIh10aHJvd0ZhY3RvcnlSZXR1cm5lZE5vdFN0cmluZyIcdGhyb3dJbnZhbGlkUHJpY2VBc3NldEFtb3VudCIPdGhyb3dJbnZhbGlkRmVlIhV0aHJvd0ludmFsaWRBc3NldFBhaXIiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiD2tleUFkbWluUHViS2V5cyIJa2V5U3RhdHVzIg1hbW91bnRBc3NldElkIgxwcmljZUFzc2V0SWQiEmtleUZhY3RvcnlDb250cmFjdCIWa2V5QXNzZXRzU3RvcmVDb250cmFjdCITa2V5RW1pc3Npb25Db250cmFjdCIJa2V5U3VmZml4IgxrZXlMYXN0SW5kZXgiC2luZGV4U3VmZml4Ig1zdGF0dXNQZW5kaW5nIg5zdGF0dXNEZWNsaW5lZCIMc3RhdHVzQWN0aXZlIghzdGF0dXNlcyIPa2V5Q3JlYXRlQ2FsbGVkIg9rZXlDcmVhdGVDYWxsZXIiFGtleUFtb3VudEFzc2V0QW1vdW50IhNrZXlQcmljZUFzc2V0QW1vdW50IglrZXlIZWlnaHQiDWtleUZlZUFzc2V0SWQiDGtleUZlZUFtb3VudCIXa2V5QW1vdW50QXNzZXRNaW5BbW91bnQiF2tleVByaWNlQXNzZXRzTWluQW1vdW50Ig5rZXlQcmljZUFzc2V0cyIcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcyIHJG1hdGNoMCIBcyIPZ2V0U3RyaW5nT3JGYWlsIgNrZXkiEnN0cmluZ09wdGlvblRvTGlzdCIMc3RyaW5nT3JVbml0Ig9mYWN0b3J5Q29udHJhY3QiGWtleVZvdGluZ0VtaXNzaW9uQ29udHJhY3QiFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QiImtleVZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiH3ZvdGluZ0VtaXNzaW9uQ2FuZGlkYXRlQ29udHJhY3QiDmlzQ3JlYXRlQ2FsbGVkIhBtdXN0Q3JlYXRlQ2FsbGVkIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIglpc01hbmFnZXIiAWkiAnBrIgttdXN0TWFuYWdlciIJbXVzdEFkbWluIghhZG1pblBLcyIKaXNWZXJpZmllZCIHYXNzZXRJZCIMZ2V0SWRBbmRJbmZvIgdwYXltZW50IgJpZCIEaW5mbyILdmFsaWRTdGF0dXMiBnN0YXR1cyIQZmFjdG9yeVYyQWRkcmVzcyISYXNzZXRzU3RvcmVBZGRyZXNzIg9lbWlzc2lvbkFkZHJlc3MiFHByaWNlQXNzZXRzTWluQW1vdW50IhRhbW91bnRBc3NldE1pbkFtb3VudCIKZmVlQXNzZXRJZCIJZmVlQW1vdW50IgtjaGVja0NhbGxlciISYW1vdW50QXNzZXRQYXltZW50IhFwcmljZUFzc2V0UGF5bWVudCIPZmVlQXNzZXRQYXltZW50IgskdDA3NTQwNzYxMiIPYW1vdW50QXNzZXRJbmZvIgskdDA3NjE1NzY4NCIOcHJpY2VBc3NldEluZm8iCyR0MDc2ODc3NzUwIgxmZWVBc3NldEluZm8iEWFtb3VudEFzc2V0QW1vdW50IhBwcmljZUFzc2V0QW1vdW50Ig5mZWVBc3NldEFtb3VudCIPcHJpY2VBc3NldHNMaXN0IhVhc3NldE1pbkFtb3VudERlZmF1bHQiF2FsbG93ZWRBc3NldHNNaW5BbW91bnRzIhBwcmljZUFzc2V0c0luZGV4IhNwcmljZUFzc2V0TWluQW1vdW50IglsYXN0SW5kZXgiCGN1ckluZGV4IhBlbWlzc2lvbkNvbnRyYWN0Igpwb29sRXhpc3RzIgFAIgZjaGVja3MiE3BheW1lbnRzV2l0aEZlZVNpemUiD2J1cm5FbWlzc2lvbkludiILcG9vbEFkZHJlc3MiEWFtb3VudEFzc2V0VGlja2VyIhBwcmljZUFzc2V0VGlja2VyIgRsb2dvIhJhY3RpdmF0ZU5ld1Bvb2xJbnYiCWxwQXNzZXRJZCIJYmVmb3JlUHV0IgNwdXQiCGFmdGVyUHV0IgR1c2VyIgNyZXMiDGFkbWluUHViS2V5cyICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5PQABYQIPdXNlcl9wb29scy5yaWRlAAFiAgJfXwABYwIFV0FWRVMAAWQCE0ludmFsaWQgcHJpY2UgYXNzZXQBAWUBAWYJALkJAgkAzAgCBQFhCQDMCAICAjogCQDMCAIFAWYFA25pbAIAAQFnAQFmCQACAQkBAWUBBQFmAQFoAAkBAWcBAhFQZXJtaXNzaW9uIGRlbmllZAEBaQAJAQFnAQIkQ3JlYXRlIGlzIG5vdCBjYWxsZWQgZm9yIGFzc2V0cyBwYWlyAQFqAAkBAWcBAh5Zb3UgYXJlIG5vdCBhbW91bnRBc3NldCBpc3N1ZXIBAWsACQEBZwECJFBvb2wgd2l0aCBzdWNoIGFzc2V0cyBhbHJlYWR5IGV4aXN0cwEBbAAJAQFnAQIVQXNzZXQgaXMgbm90IHZlcmlmaWVkAQFtAAkBAWcBBQFkAQFuAAkBAWcBAhFJbnZhbGlkIGZlZSBhc3NldAEBbwAJAQFnAQIdSW52YWxpZCBhbW91bnQgYXNzZXQgYXR0YWNoZWQBAXAACQEBZwECDkludmFsaWQgc3RhdHVzAQFxAAkBAWcBAipDYW4gYWN0aXZhdGUgcG9vbCBvbmx5IGluICdwZW5kaW5nJyBzdGF0dXMBAXIACQEBZwECHUZhY3RvcnlWMiByZXR1cm5lZCBub3Qgc3RyaW5nAQFzAAkBAWcBAhppbnZhbGlkIHByaWNlIGFzc2V0IGFtb3VudAEBdAAJAQFnAQILaW52YWxpZCBmZWUBAXUACQEBZwECEmludmFsaWQgYXNzZXQgcGFpcgEBdgAJALkJAgkAzAgCAgIlcwkAzAgCAhBtYW5hZ2VyUHVibGljS2V5BQNuaWwFAWIBAXcAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwEBeAAJALkJAgkAzAgCAgIlcwkAzAgCAgxhZG1pblB1YktleXMFA25pbAUBYgEBeQIBegFBCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICBnN0YXR1cwkAzAgCBQF6CQDMCAIFAUEFA25pbAUBYgEBQgAJALkJAgkAzAgCAgIlcwkAzAgCAg9mYWN0b3J5Q29udHJhY3QFA25pbAUBYgEBQwAJALkJAgkAzAgCAgIlcwkAzAgCAhNhc3NldHNTdG9yZUNvbnRyYWN0BQNuaWwFAWIBAUQACQC5CQIJAMwIAgICJXMJAMwIAgIQZW1pc3Npb25Db250cmFjdAUDbmlsBQFiAQFFAgF6AUEJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIGc3VmZml4CQDMCAIFAXoJAMwIAgUBQQUDbmlsBQFiAQFGAAkAuQkCCQDMCAICAiVzCQDMCAICCWxhc3RJbmRleAUDbmlsBQFiAAFHAgF1AAFIAgdwZW5kaW5nAAFJAghkZWNsaW5lZAABSgIGYWN0aXZlAAFLCQDMCAIFAUgJAMwIAgUBSQkAzAgCBQFKBQNuaWwBAUwCAXoBQQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgxjcmVhdGVDYWxsZWQJAMwIAgUBegkAzAgCBQFBBQNuaWwFAWIBAU0CAXoBQQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgxjcmVhdGVDYWxsZXIJAMwIAgUBegkAzAgCBQFBBQNuaWwFAWIBAU4CAXoBQQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhFhbW91bnRBc3NldEFtb3VudAkAzAgCBQF6CQDMCAIFAUEFA25pbAUBYgEBTwIBegFBCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEHByaWNlQXNzZXRBbW91bnQJAMwIAgUBegkAzAgCBQFBBQNuaWwFAWIBAVACAXoBQQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgZoZWlnaHQJAMwIAgUBegkAzAgCBQFBBQNuaWwFAWIBAVEACQC5CQIJAMwIAgICJXMJAMwIAgIKZmVlQXNzZXRJZAUDbmlsBQFiAQFSAAkAuQkCCQDMCAICAiVzCQDMCAICCWZlZUFtb3VudAUDbmlsBQFiAQFTAAkAuQkCCQDMCAICAiVzCQDMCAICFGFtb3VudEFzc2V0TWluQW1vdW50BQNuaWwFAWIBAVQACQC5CQIJAMwIAgICJXMJAMwIAgIUcHJpY2VBc3NldHNNaW5BbW91bnQFA25pbAUBYgEBVQAJALkJAgkAzAgCAgIlcwkAzAgCAgtwcmljZUFzc2V0cwUDbmlsBQFiAQFWAAQBVwkAoggBCQEBdwADCQABAgUBVwIGU3RyaW5nBAFYBQFXCQERQGV4dHJOYXRpdmUoMTA2MikBBQFYBQR0aGlzAQFZAQFaCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUBWgkArAICBQFaAg8gaXMgbm90IGRlZmluZWQBAmFhAQJhYgQBVwUCYWIDCQABAgUBVwIGU3RyaW5nBAFYBQFXAwkAAAIJALECAQUBWAAABQNuaWwJALUJAgUBWAUBYgMJAAECBQFXAgRVbml0BQNuaWwJAAIBAgtNYXRjaCBlcnJvcgACYWMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFZAQkBAUIAAAJhZAkAuQkCCQDMCAICAiVzCQDMCAICFnZvdGluZ0VtaXNzaW9uQ29udHJhY3QFA25pbAUBYgACYWUJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhYwUCYWQJAQFlAQIsdm90aW5nIGVtaXNzaW9uIGNvbnRyYWN0IGFkZHJlc3MgaXMgcmVxdWlyZWQAAmFmCQC5CQIJAMwIAgICJXMJAMwIAgIfdm90aW5nRW1pc3Npb25DYW5kaWRhdGVDb250cmFjdAUDbmlsBQFiAAJhZwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmFlBQJhZgkBAWUBAjZ2b3RpbmcgZW1pc3Npb24gY2FuZGlkYXRlIGNvbnRyYWN0IGFkZHJlc3MgaXMgcmVxdWlyZWQBAmFoAgF6AUEJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBAUwCBQF6BQFBBwECYWkCAXoBQQMJAQJhaAIFAXoFAUEGCQEBaQABAmFqAAQCYWsJAQFWAAQBVwkAnQgCBQJhawkBAXYAAwkAAQIFAVcCBlN0cmluZwQBWAUBVwkA2QQBBQFYAwkAAQIFAVcCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECYWwBAmFtBAFXCQECYWoAAwkAAQIFAVcCCkJ5dGVWZWN0b3IEAmFuBQFXCQAAAggFAmFtD2NhbGxlclB1YmxpY0tleQUCYW4DCQABAgUBVwIEVW5pdAkAAAIIBQJhbQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECYW8BAmFtAwkBAmFsAQUCYW0GCQEBaAABAmFwAQJhbQQCYXEJAQJhYQEJAKIIAQkBAXgAAwkBD2NvbnRhaW5zRWxlbWVudAIFAmFxCQDYBAEIBQJhbQ9jYWxsZXJQdWJsaWNLZXkGCQECYW8BBQJhbQECYXIBAmFzCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmggCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEBWQEJAQFDAAkArAICCQCsAgICCHN0YXR1c188BQJhcwIBPgAAAAIBAmF0AQJhdQQBVwgFAmF1B2Fzc2V0SWQDCQABAgUBVwIKQnl0ZVZlY3RvcgQCYXYFAVcEAmF3CQEFdmFsdWUBCQDsBwEFAmF2CQCUCgIJANgEAQUCYXYFAmF3AwkAAQIFAVcCBFVuaXQJAJQKAgUBYwUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJheAECYXkJAQ9jb250YWluc0VsZW1lbnQCBQFLBQJheQYCYW0BC2NvbnN0cnVjdG9yBwJhegJhQQJhQgJhQwJhRAJhRQJhRgQCYUcJAQJhbwEFAmFtAwkAAAIFAmFHBQJhRwkAzAgCCQELU3RyaW5nRW50cnkCCQEBQgAFAmF6CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFDAAUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUQABQJhQgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAAJALkJAgUCYUMFAWIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFTAAUCYUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVEABQJhRQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVIABQJhRgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFtAQZjcmVhdGUABAJhSAkBBXZhbHVlAQkAkQMCCAUCYW0IcGF5bWVudHMAAAQCYUkJAQV2YWx1ZQEJAJEDAggFAmFtCHBheW1lbnRzAAEEAmFKCQEFdmFsdWUBCQCRAwIIBQJhbQhwYXltZW50cwACBAJhSwkBAmF0AQUCYUgEAXoIBQJhSwJfMQQCYUwIBQJhSwJfMgQCYU0JAQJhdAEFAmFJBAFBCAUCYU0CXzEEAmFOCAUCYU0CXzIEAmFPCQECYXQBBQJhSgQCYUUIBQJhTwJfMQQCYVAIBQJhTwJfMgQCYVEIBQJhSAZhbW91bnQEAmFSCAUCYUkGYW1vdW50BAJhUwgFAmFKBmFtb3VudAQCYVQJAQJhYQEJAJ0IAgUCYWMJAQFVAAQCYVUJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQFTAAQCYVYJAQJhYQEJAKIIAQkBAVQABAJhRAMJAQ9jb250YWluc0VsZW1lbnQCBQJhVAUBegQCYVcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQJhVAUBegUBZAkBBXZhbHVlAQkAtgkBCQCRAwIFAmFWBQJhVwUCYVUEAmFYAwkBD2NvbnRhaW5zRWxlbWVudAIFAmFUBQFBBAJhVwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFAmFUBQFBBQFkCQEFdmFsdWUBCQC2CQEJAJEDAgUCYVYFAmFXBQJhVQQCYVkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAUYAAAAEAmFaCQBkAgUCYVkAAQQCYmEJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQFZAQkBAUQABAJiYgoAAmJjCQD8BwQFAmFjAhJwb29sRXhpc3RzUkVBRE9OTFkJAMwIAgUBegkAzAgCBQFBBQNuaWwFA25pbAMJAAECBQJiYwIHQm9vbGVhbgUCYmMJAAIBCQCsAgIJAAMBBQJiYwIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCYmQJAMwIAgMJAQEhAQkBAmFoAgUBegUBQQYJAQFrAAkAzAgCAwkBASEBBQJiYgYJAQFrAAkAzAgCAwkBAiE9AgUBegUBQQYJAQF1AAkAzAgCAwMJAQJhcgEFAXoJAQJhcgEFAUEHBgkBAXUACQDMCAIDAwkBD2NvbnRhaW5zRWxlbWVudAIFAmFUBQF6BgkBD2NvbnRhaW5zRWxlbWVudAIFAmFUBQFBBgkBAXUACQDMCAIDAwkBAmFsAQUCYW0GCQAAAgkAoggBCQEBUQAFAmFFBgkBAW4ACQDMCAIDAwkBAmFsAQUCYW0GCQBnAgUCYVEJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQFTAAYJAQFvAAkAzAgCAwMJAQJhbAEFAmFtBgkAZwIFAmFSBQJhWAYJAQFzAAkAzAgCAwMJAQJhbAEFAmFtBgkAAAIFAmFTCQCfCAEJAQFSAAYJAQF0AAUDbmlsAwkAAAIFAmJkBQJiZAQCYmUAAwQCYmYDCQBnAgkAkAMBCAUCYW0IcGF5bWVudHMFAmJlCQD8BwQFAmJhAgRidXJuBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYUUFAmFTBQNuaWwFBHVuaXQDCQAAAgUCYmYFAmJmCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBTAIFAXoFAUEGCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFNAgUBegUBQQkApQgBCAUCYW0GY2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBRgAFAmFaCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFFAgUBegUBQQkArAICCQCkAwEFAmFaBQFHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUAIFAXoFAUEFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCCQEBeQIFAXoFAUEFAUgJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFOAgUBegUBQQUCYVEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFPAgUBegUBQQUCYVIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhbQEIYWN0aXZhdGUGAmJnAXoCYmgBQQJiaQJiagQCYmQJAMwIAgkBAmFwAQUCYW0JAMwIAgMJAQJhaAIFAXoFAUEGCQEBaQAJAMwIAgMJAAACCQEFdmFsdWUBCQCiCAEJAQF5AgUBegUBQQUBSAYJAQFxAAUDbmlsAwkAAAIFAmJkBQJiZAQCYmsJAPwHBAUCYWMCD2FjdGl2YXRlTmV3UG9vbAkAzAgCBQJiZwkAzAgCBQF6CQDMCAIFAUEJAMwIAgkArAICCQCsAgIFAmJoBQJiaQICTFAJAMwIAgkArAICCQCsAgIJAKwCAgUCYmgCAS8FAmJpAh4gcG9vbCBsaXF1aWRpdHkgcHJvdmlkZXIgdG9rZW4JAMwIAgAACQDMCAICB1ZMVFBPT0wJAMwIAgUCYmoFA25pbAUDbmlsAwkAAAIFAmJrBQJiawQCYmwEAVcFAmJrAwkAAQIFAVcCBlN0cmluZwQCYXYFAVcFAmF2CQEBcgADCQAAAgUCYmwFAmJsBAJibQkA8AcCBQR0aGlzCQDZBAEFAmJsAwkAAAIFAmJtBQJibQQCYm4JAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYmcCA3B1dAkAzAgCAAAJAMwIAgcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgMJAAACBQF6AgVXQVZFUwUEdW5pdAkA2QQBBQF6CQEFdmFsdWUBCQCfCAEJAQFOAgUBegUBQQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgMJAAACBQFBAgVXQVZFUwUEdW5pdAkA2QQBBQFBCQEFdmFsdWUBCQCfCAEJAQFPAgUBegUBQQUDbmlsAwkAAAIFAmJuBQJibgQCYm8JAPAHAgUEdGhpcwkA2QQBBQJibAMJAAACBQJibwUCYm8EAmJwCQEFdmFsdWUBCQCmCAEJAQV2YWx1ZQEJAKIIAQkBAU0CBQF6BQFBBAJicQkA/AcEBQJhZwIHYXBwcm92ZQkAzAgCBQF6CQDMCAIFAUEFA25pbAUDbmlsAwkAAAIFAmJxBQJicQkAzAgCCQELU3RyaW5nRW50cnkCCQEBeQIFAXoFAUEFAUoJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYnAJAGUCBQJibwUCYm0JANkEAQUCYmwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhbQEJc2V0QWRtaW5zAQJicgQCYUcJAQJhbwEFAmFtAwkAAAIFAmFHBQJhRwkAzAgCCQELU3RyaW5nRW50cnkCCQEBeAAJALkJAgUCYnIFAWIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhbQETcHJpY2VBc3NldHNSRUFET05MWQAJAJQKAgUDbmlsCQECYWEBCQCiCAEJAQFVAAJhbQEOc3RhdHVzUkVBRE9OTFkCAXoBQQQCYXkEAVcJAKIIAQkBAXkCBQF6BQFBAwkAAQIFAVcCBlN0cmluZwQBWAUBVwUBWAUEdW5pdAkAlAoCBQNuaWwFAmF5AQJicwECYnQABAJidQQBVwkBAmFqAAMJAAECBQFXAgpCeXRlVmVjdG9yBAJhbgUBVwUCYW4DCQABAgUBVwIEVW5pdAgFAmJzD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJicwlib2R5Qnl0ZXMJAJEDAggFAmJzBnByb29mcwAABQJidXjfgew=", "height": 2571872, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4Ec9jXGPbgeFMgLFotmguau9CGrYp8mnT4SdNdVk1jnF Next: Duo9txVVnFQJBVSx9QubDAYiQF579MJuFCuonS7KnFDB Diff:
OldNewDifferences
230230
231231 @Callable(i)
232232 func create () = {
233- let asset1Payment = value(i.payments[0])
234- let asset2Payment = value(i.payments[1])
233+ let amountAssetPayment = value(i.payments[0])
234+ let priceAssetPayment = value(i.payments[1])
235235 let feeAssetPayment = value(i.payments[2])
236- let $t075317588 = getIdAndInfo(asset1Payment)
237- let asset1Id = $t075317588._1
238- let asset1Info = $t075317588._2
239- let $t075917648 = getIdAndInfo(asset2Payment)
240- let asset2Id = $t075917648._1
241- let asset2Info = $t075917648._2
242- let $t076517714 = getIdAndInfo(feeAssetPayment)
243- let feeAssetId = $t076517714._1
244- let feeAssetInfo = $t076517714._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
245+ let amountAssetAmount = amountAssetPayment.amount
246+ let priceAssetAmount = priceAssetPayment.amount
247+ let feeAssetAmount = feeAssetPayment.amount
245248 let priceAssetsList = stringOptionToList(getString(factoryContract, keyPriceAssets()))
246- let checkAssetsNotEqual = if ((asset1Id != asset2Id))
249+ let assetMinAmountDefault = getIntegerValue(keyAmountAssetMinAmount())
250+ let allowedAssetsMinAmounts = stringOptionToList(getString(keyPriceAssetsMinAmount()))
251+ let amountAssetMinAmount = if (containsElement(priceAssetsList, amountAssetId))
252+ then {
253+ let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, amountAssetId), invalidPriceAsset)
254+ value(parseInt(allowedAssetsMinAmounts[priceAssetsIndex]))
255+ }
256+ else assetMinAmountDefault
257+ let priceAssetMinAmount = if (containsElement(priceAssetsList, priceAssetId))
258+ then {
259+ let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
260+ value(parseInt(allowedAssetsMinAmounts[priceAssetsIndex]))
261+ }
262+ else assetMinAmountDefault
263+ let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
264+ let curIndex = (lastIndex + 1)
265+ let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
266+ let poolExists = {
267+ let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
268+ if ($isInstanceOf(@, "Boolean"))
269+ then @
270+ else throw(($getType(@) + " couldn't be cast to Boolean"))
271+ }
272+ let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
247273 then true
248- else throwInvalidAssetPair()
249- if ((checkAssetsNotEqual == checkAssetsNotEqual))
274+ else throwPoolExists(), if (!(poolExists))
275+ then true
276+ else throwPoolExists(), if ((amountAssetId != priceAssetId))
277+ then true
278+ else throwInvalidAssetPair(), if (if (isVerified(amountAssetId))
279+ then isVerified(priceAssetId)
280+ else false)
281+ then true
282+ else throwInvalidAssetPair(), if (if (containsElement(priceAssetsList, amountAssetId))
283+ then true
284+ else containsElement(priceAssetsList, priceAssetId))
285+ then true
286+ else throwInvalidAssetPair(), if (if (isManager(i))
287+ then true
288+ else (getString(keyFeeAssetId()) == feeAssetId))
289+ then true
290+ else throwInvalidFeeAsset(), if (if (isManager(i))
291+ then true
292+ else (amountAssetAmount >= getIntegerValue(keyAmountAssetMinAmount())))
293+ then true
294+ else throwInvalidAmountAsset(), if (if (isManager(i))
295+ then true
296+ else (priceAssetAmount >= priceAssetMinAmount))
297+ then true
298+ else throwInvalidPriceAssetAmount(), if (if (isManager(i))
299+ then true
300+ else (feeAssetAmount == getInteger(keyFeeAmount())))
301+ then true
302+ else throwInvalidFee()]
303+ if ((checks == checks))
250304 then {
251- let $t078888349 = if (if (isManager(i))
252- then true
253- else if (containsElement(priceAssetsList, asset2Id))
254- then isVerified(asset1Id)
255- else false)
256- then $Tuple4(asset1Id, asset1Payment.amount, asset2Id, asset2Payment.amount)
257- else if (if (containsElement(priceAssetsList, asset1Id))
258- then isVerified(asset2Id)
259- else false)
260- then $Tuple4(asset2Id, asset2Payment.amount, asset1Id, asset1Payment.amount)
261- else throwInvalidAssetPair()
262- let amountAssetId = $t078888349._1
263- let amountAssetAmount = $t078888349._2
264- let priceAssetId = $t078888349._3
265- let priceAssetAmount = $t078888349._4
266- let managerPriceAssetMinAmount = 1
267- let priceAssetMinAmount = if (isManager(i))
268- then managerPriceAssetMinAmount
269- else {
270- let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
271- value(parseInt(stringOptionToList(getString(keyPriceAssetsMinAmount()))[priceAssetsIndex]))
272- }
273- let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
274- let curIndex = (lastIndex + 1)
275- let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
276- let poolExists = {
277- let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
278- if ($isInstanceOf(@, "Boolean"))
279- then @
280- else throw(($getType(@) + " couldn't be cast to Boolean"))
281- }
282- let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
283- then true
284- else throwPoolExists(), if (!(poolExists))
285- then true
286- else throwPoolExists(), if (if (isManager(i))
287- then true
288- else (getString(keyFeeAssetId()) == feeAssetId))
289- then true
290- else throwInvalidFeeAsset(), if (if (isManager(i))
291- then true
292- else (amountAssetAmount >= getIntegerValue(keyAmountAssetMinAmount())))
293- then true
294- else throwInvalidAmountAsset(), if (if (isManager(i))
295- then true
296- else (priceAssetAmount >= priceAssetMinAmount))
297- then true
298- else throwInvalidPriceAssetAmount(), if (if (isManager(i))
299- then true
300- else (feeAssetPayment.amount == getInteger(keyFeeAmount())))
301- then true
302- else throwInvalidFee()]
303- if ((checks == checks))
304- then {
305- let paymentsWithFeeSize = 3
306- let burnEmissionInv = if ((size(i.payments) >= paymentsWithFeeSize))
307- then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetPayment.amount)])
308- else unit
309- 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)]
311- else throw("Strict value is not equal to itself.")
312- }
305+ let paymentsWithFeeSize = 3
306+ let burnEmissionInv = if ((size(i.payments) >= paymentsWithFeeSize))
307+ then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetAmount)])
308+ else unit
309+ 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)]
313311 else throw("Strict value is not equal to itself.")
314312 }
315313 else throw("Strict value is not equal to itself.")
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"
99
1010 let invalidPriceAsset = "Invalid price asset"
1111
1212 func wrapErr (msg) = makeString([contractFilename, ": ", msg], "")
1313
1414
1515 func throwErr (msg) = throw(wrapErr(msg))
1616
1717
1818 func throwPD () = throwErr("Permission denied")
1919
2020
2121 func throwCreateNotCalled () = throwErr("Create is not called for assets pair")
2222
2323
2424 func throwYouNotIssuer () = throwErr("You are not amountAsset issuer")
2525
2626
2727 func throwPoolExists () = throwErr("Pool with such assets already exists")
2828
2929
3030 func throwAssetNotVerified () = throwErr("Asset is not verified")
3131
3232
3333 func throwInvalidPriceAsset () = throwErr(invalidPriceAsset)
3434
3535
3636 func throwInvalidFeeAsset () = throwErr("Invalid fee asset")
3737
3838
3939 func throwInvalidAmountAsset () = throwErr("Invalid amount asset attached")
4040
4141
4242 func throwInvalidStatus () = throwErr("Invalid status")
4343
4444
4545 func throwCanActivateOnlyPendingPool () = throwErr("Can activate pool only in 'pending' status")
4646
4747
4848 func throwFactoryReturnedNotString () = throwErr("FactoryV2 returned not string")
4949
5050
5151 func throwInvalidPriceAssetAmount () = throwErr("invalid price asset amount")
5252
5353
5454 func throwInvalidFee () = throwErr("invalid fee")
5555
5656
5757 func throwInvalidAssetPair () = throwErr("invalid asset pair")
5858
5959
6060 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
6161
6262
6363 func keyManagerVaultAddress () = "%s__managerVaultAddress"
6464
6565
6666 func keyAdminPubKeys () = makeString(["%s", "adminPubKeys"], SEP)
6767
6868
6969 func keyStatus (amountAssetId,priceAssetId) = makeString(["%s%s%s", "status", amountAssetId, priceAssetId], SEP)
7070
7171
7272 func keyFactoryContract () = makeString(["%s", "factoryContract"], SEP)
7373
7474
7575 func keyAssetsStoreContract () = makeString(["%s", "assetsStoreContract"], SEP)
7676
7777
7878 func keyEmissionContract () = makeString(["%s", "emissionContract"], SEP)
7979
8080
8181 func keySuffix (amountAssetId,priceAssetId) = makeString(["%s%s%s", "suffix", amountAssetId, priceAssetId], SEP)
8282
8383
8484 func keyLastIndex () = makeString(["%s", "lastIndex"], SEP)
8585
8686
8787 let indexSuffix = "u"
8888
8989 let statusPending = "pending"
9090
9191 let statusDeclined = "declined"
9292
9393 let statusActive = "active"
9494
9595 let statuses = [statusPending, statusDeclined, statusActive]
9696
9797 func keyCreateCalled (amountAssetId,priceAssetId) = makeString(["%s%s%s", "createCalled", amountAssetId, priceAssetId], SEP)
9898
9999
100100 func keyCreateCaller (amountAssetId,priceAssetId) = makeString(["%s%s%s", "createCaller", amountAssetId, priceAssetId], SEP)
101101
102102
103103 func keyAmountAssetAmount (amountAssetId,priceAssetId) = makeString(["%s%s%s", "amountAssetAmount", amountAssetId, priceAssetId], SEP)
104104
105105
106106 func keyPriceAssetAmount (amountAssetId,priceAssetId) = makeString(["%s%s%s", "priceAssetAmount", amountAssetId, priceAssetId], SEP)
107107
108108
109109 func keyHeight (amountAssetId,priceAssetId) = makeString(["%s%s%s", "height", amountAssetId, priceAssetId], SEP)
110110
111111
112112 func keyFeeAssetId () = makeString(["%s", "feeAssetId"], SEP)
113113
114114
115115 func keyFeeAmount () = makeString(["%s", "feeAmount"], SEP)
116116
117117
118118 func keyAmountAssetMinAmount () = makeString(["%s", "amountAssetMinAmount"], SEP)
119119
120120
121121 func keyPriceAssetsMinAmount () = makeString(["%s", "priceAssetsMinAmount"], SEP)
122122
123123
124124 func keyPriceAssets () = makeString(["%s", "priceAssets"], SEP)
125125
126126
127127 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
128128 case s: String =>
129129 addressFromStringValue(s)
130130 case _ =>
131131 this
132132 }
133133
134134
135135 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " is not defined"))
136136
137137
138138 func stringOptionToList (stringOrUnit) = match stringOrUnit {
139139 case s: String =>
140140 if ((size(s) == 0))
141141 then nil
142142 else split(s, SEP)
143143 case _: Unit =>
144144 nil
145145 case _ =>
146146 throw("Match error")
147147 }
148148
149149
150150 let factoryContract = addressFromStringValue(getStringOrFail(keyFactoryContract()))
151151
152152 let keyVotingEmissionContract = makeString(["%s", "votingEmissionContract"], SEP)
153153
154154 let votingEmissionContract = addressFromStringValue(valueOrErrorMessage(getString(factoryContract, keyVotingEmissionContract), wrapErr("voting emission contract address is required")))
155155
156156 let keyVotingEmissionCandidateContract = makeString(["%s", "votingEmissionCandidateContract"], SEP)
157157
158158 let votingEmissionCandidateContract = addressFromStringValue(valueOrErrorMessage(getString(votingEmissionContract, keyVotingEmissionCandidateContract), wrapErr("voting emission candidate contract address is required")))
159159
160160 func isCreateCalled (amountAssetId,priceAssetId) = valueOrElse(getBoolean(keyCreateCalled(amountAssetId, priceAssetId)), false)
161161
162162
163163 func mustCreateCalled (amountAssetId,priceAssetId) = if (isCreateCalled(amountAssetId, priceAssetId))
164164 then true
165165 else throwCreateNotCalled()
166166
167167
168168 func managerPublicKeyOrUnit () = {
169169 let managerVaultAddress = getManagerVaultAddressOrThis()
170170 match getString(managerVaultAddress, keyManagerPublicKey()) {
171171 case s: String =>
172172 fromBase58String(s)
173173 case _: Unit =>
174174 unit
175175 case _ =>
176176 throw("Match error")
177177 }
178178 }
179179
180180
181181 func isManager (i) = match managerPublicKeyOrUnit() {
182182 case pk: ByteVector =>
183183 (i.callerPublicKey == pk)
184184 case _: Unit =>
185185 (i.caller == this)
186186 case _ =>
187187 throw("Match error")
188188 }
189189
190190
191191 func mustManager (i) = if (isManager(i))
192192 then true
193193 else throwPD()
194194
195195
196196 func mustAdmin (i) = {
197197 let adminPKs = stringOptionToList(getString(keyAdminPubKeys()))
198198 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
199199 then true
200200 else mustManager(i)
201201 }
202202
203203
204204 func isVerified (assetId) = (valueOrElse(getInteger(addressFromStringValue(getStringOrFail(keyAssetsStoreContract())), (("status_<" + assetId) + ">")), 0) == 2)
205205
206206
207207 func getIdAndInfo (payment) = match payment.assetId {
208208 case id: ByteVector =>
209209 let info = value(assetInfo(id))
210210 $Tuple2(toBase58String(id), info)
211211 case _: Unit =>
212212 $Tuple2(wavesAssetId, unit)
213213 case _ =>
214214 throw("Match error")
215215 }
216216
217217
218218 func validStatus (status) = containsElement(statuses, status)
219219
220220
221221 @Callable(i)
222222 func constructor (factoryV2Address,assetsStoreAddress,emissionAddress,priceAssetsMinAmount,amountAssetMinAmount,feeAssetId,feeAmount) = {
223223 let checkCaller = mustManager(i)
224224 if ((checkCaller == checkCaller))
225225 then [StringEntry(keyFactoryContract(), factoryV2Address), StringEntry(keyAssetsStoreContract(), assetsStoreAddress), StringEntry(keyEmissionContract(), emissionAddress), StringEntry(keyPriceAssetsMinAmount(), makeString(priceAssetsMinAmount, SEP)), IntegerEntry(keyAmountAssetMinAmount(), amountAssetMinAmount), StringEntry(keyFeeAssetId(), feeAssetId), IntegerEntry(keyFeeAmount(), feeAmount)]
226226 else throw("Strict value is not equal to itself.")
227227 }
228228
229229
230230
231231 @Callable(i)
232232 func create () = {
233- let asset1Payment = value(i.payments[0])
234- let asset2Payment = value(i.payments[1])
233+ let amountAssetPayment = value(i.payments[0])
234+ let priceAssetPayment = value(i.payments[1])
235235 let feeAssetPayment = value(i.payments[2])
236- let $t075317588 = getIdAndInfo(asset1Payment)
237- let asset1Id = $t075317588._1
238- let asset1Info = $t075317588._2
239- let $t075917648 = getIdAndInfo(asset2Payment)
240- let asset2Id = $t075917648._1
241- let asset2Info = $t075917648._2
242- let $t076517714 = getIdAndInfo(feeAssetPayment)
243- let feeAssetId = $t076517714._1
244- let feeAssetInfo = $t076517714._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
245+ let amountAssetAmount = amountAssetPayment.amount
246+ let priceAssetAmount = priceAssetPayment.amount
247+ let feeAssetAmount = feeAssetPayment.amount
245248 let priceAssetsList = stringOptionToList(getString(factoryContract, keyPriceAssets()))
246- let checkAssetsNotEqual = if ((asset1Id != asset2Id))
249+ let assetMinAmountDefault = getIntegerValue(keyAmountAssetMinAmount())
250+ let allowedAssetsMinAmounts = stringOptionToList(getString(keyPriceAssetsMinAmount()))
251+ let amountAssetMinAmount = if (containsElement(priceAssetsList, amountAssetId))
252+ then {
253+ let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, amountAssetId), invalidPriceAsset)
254+ value(parseInt(allowedAssetsMinAmounts[priceAssetsIndex]))
255+ }
256+ else assetMinAmountDefault
257+ let priceAssetMinAmount = if (containsElement(priceAssetsList, priceAssetId))
258+ then {
259+ let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
260+ value(parseInt(allowedAssetsMinAmounts[priceAssetsIndex]))
261+ }
262+ else assetMinAmountDefault
263+ let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
264+ let curIndex = (lastIndex + 1)
265+ let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
266+ let poolExists = {
267+ let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
268+ if ($isInstanceOf(@, "Boolean"))
269+ then @
270+ else throw(($getType(@) + " couldn't be cast to Boolean"))
271+ }
272+ let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
247273 then true
248- else throwInvalidAssetPair()
249- if ((checkAssetsNotEqual == checkAssetsNotEqual))
274+ else throwPoolExists(), if (!(poolExists))
275+ then true
276+ else throwPoolExists(), if ((amountAssetId != priceAssetId))
277+ then true
278+ else throwInvalidAssetPair(), if (if (isVerified(amountAssetId))
279+ then isVerified(priceAssetId)
280+ else false)
281+ then true
282+ else throwInvalidAssetPair(), if (if (containsElement(priceAssetsList, amountAssetId))
283+ then true
284+ else containsElement(priceAssetsList, priceAssetId))
285+ then true
286+ else throwInvalidAssetPair(), if (if (isManager(i))
287+ then true
288+ else (getString(keyFeeAssetId()) == feeAssetId))
289+ then true
290+ else throwInvalidFeeAsset(), if (if (isManager(i))
291+ then true
292+ else (amountAssetAmount >= getIntegerValue(keyAmountAssetMinAmount())))
293+ then true
294+ else throwInvalidAmountAsset(), if (if (isManager(i))
295+ then true
296+ else (priceAssetAmount >= priceAssetMinAmount))
297+ then true
298+ else throwInvalidPriceAssetAmount(), if (if (isManager(i))
299+ then true
300+ else (feeAssetAmount == getInteger(keyFeeAmount())))
301+ then true
302+ else throwInvalidFee()]
303+ if ((checks == checks))
250304 then {
251- let $t078888349 = if (if (isManager(i))
252- then true
253- else if (containsElement(priceAssetsList, asset2Id))
254- then isVerified(asset1Id)
255- else false)
256- then $Tuple4(asset1Id, asset1Payment.amount, asset2Id, asset2Payment.amount)
257- else if (if (containsElement(priceAssetsList, asset1Id))
258- then isVerified(asset2Id)
259- else false)
260- then $Tuple4(asset2Id, asset2Payment.amount, asset1Id, asset1Payment.amount)
261- else throwInvalidAssetPair()
262- let amountAssetId = $t078888349._1
263- let amountAssetAmount = $t078888349._2
264- let priceAssetId = $t078888349._3
265- let priceAssetAmount = $t078888349._4
266- let managerPriceAssetMinAmount = 1
267- let priceAssetMinAmount = if (isManager(i))
268- then managerPriceAssetMinAmount
269- else {
270- let priceAssetsIndex = valueOrErrorMessage(indexOf(priceAssetsList, priceAssetId), invalidPriceAsset)
271- value(parseInt(stringOptionToList(getString(keyPriceAssetsMinAmount()))[priceAssetsIndex]))
272- }
273- let lastIndex = valueOrElse(getInteger(keyLastIndex()), 0)
274- let curIndex = (lastIndex + 1)
275- let emissionContract = addressFromStringValue(getStringOrFail(keyEmissionContract()))
276- let poolExists = {
277- let @ = invoke(factoryContract, "poolExistsREADONLY", [amountAssetId, priceAssetId], nil)
278- if ($isInstanceOf(@, "Boolean"))
279- then @
280- else throw(($getType(@) + " couldn't be cast to Boolean"))
281- }
282- let checks = [if (!(isCreateCalled(amountAssetId, priceAssetId)))
283- then true
284- else throwPoolExists(), if (!(poolExists))
285- then true
286- else throwPoolExists(), if (if (isManager(i))
287- then true
288- else (getString(keyFeeAssetId()) == feeAssetId))
289- then true
290- else throwInvalidFeeAsset(), if (if (isManager(i))
291- then true
292- else (amountAssetAmount >= getIntegerValue(keyAmountAssetMinAmount())))
293- then true
294- else throwInvalidAmountAsset(), if (if (isManager(i))
295- then true
296- else (priceAssetAmount >= priceAssetMinAmount))
297- then true
298- else throwInvalidPriceAssetAmount(), if (if (isManager(i))
299- then true
300- else (feeAssetPayment.amount == getInteger(keyFeeAmount())))
301- then true
302- else throwInvalidFee()]
303- if ((checks == checks))
304- then {
305- let paymentsWithFeeSize = 3
306- let burnEmissionInv = if ((size(i.payments) >= paymentsWithFeeSize))
307- then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetPayment.amount)])
308- else unit
309- 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)]
311- else throw("Strict value is not equal to itself.")
312- }
305+ let paymentsWithFeeSize = 3
306+ let burnEmissionInv = if ((size(i.payments) >= paymentsWithFeeSize))
307+ then invoke(emissionContract, "burn", nil, [AttachedPayment(fromBase58String(feeAssetId), feeAssetAmount)])
308+ else unit
309+ 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)]
313311 else throw("Strict value is not equal to itself.")
314312 }
315313 else throw("Strict value is not equal to itself.")
316314 }
317315
318316
319317
320318 @Callable(i)
321319 func activate (poolAddress,amountAssetId,amountAssetTicker,priceAssetId,priceAssetTicker,logo) = {
322320 let checks = [mustAdmin(i), if (isCreateCalled(amountAssetId, priceAssetId))
323321 then true
324322 else throwCreateNotCalled(), if ((value(getString(keyStatus(amountAssetId, priceAssetId))) == statusPending))
325323 then true
326324 else throwCanActivateOnlyPendingPool()]
327325 if ((checks == checks))
328326 then {
329327 let activateNewPoolInv = invoke(factoryContract, "activateNewPool", [poolAddress, amountAssetId, priceAssetId, ((amountAssetTicker + priceAssetTicker) + "LP"), (((amountAssetTicker + "/") + priceAssetTicker) + " pool liquidity provider token"), 0, "VLTPOOL", logo], nil)
330328 if ((activateNewPoolInv == activateNewPoolInv))
331329 then {
332330 let lpAssetId = match activateNewPoolInv {
333331 case id: String =>
334332 id
335333 case _ =>
336334 throwFactoryReturnedNotString()
337335 }
338336 if ((lpAssetId == lpAssetId))
339337 then {
340338 let beforePut = assetBalance(this, fromBase58String(lpAssetId))
341339 if ((beforePut == beforePut))
342340 then {
343341 let put = invoke(addressFromStringValue(poolAddress), "put", [0, false], [AttachedPayment(if ((amountAssetId == "WAVES"))
344342 then unit
345343 else fromBase58String(amountAssetId), value(getInteger(keyAmountAssetAmount(amountAssetId, priceAssetId)))), AttachedPayment(if ((priceAssetId == "WAVES"))
346344 then unit
347345 else fromBase58String(priceAssetId), value(getInteger(keyPriceAssetAmount(amountAssetId, priceAssetId))))])
348346 if ((put == put))
349347 then {
350348 let afterPut = assetBalance(this, fromBase58String(lpAssetId))
351349 if ((afterPut == afterPut))
352350 then {
353351 let user = value(addressFromString(value(getString(keyCreateCaller(amountAssetId, priceAssetId)))))
354352 let res = invoke(votingEmissionCandidateContract, "approve", [amountAssetId, priceAssetId], nil)
355353 if ((res == res))
356354 then [StringEntry(keyStatus(amountAssetId, priceAssetId), statusActive), ScriptTransfer(user, (afterPut - beforePut), fromBase58String(lpAssetId))]
357355 else throw("Strict value is not equal to itself.")
358356 }
359357 else throw("Strict value is not equal to itself.")
360358 }
361359 else throw("Strict value is not equal to itself.")
362360 }
363361 else throw("Strict value is not equal to itself.")
364362 }
365363 else throw("Strict value is not equal to itself.")
366364 }
367365 else throw("Strict value is not equal to itself.")
368366 }
369367 else throw("Strict value is not equal to itself.")
370368 }
371369
372370
373371
374372 @Callable(i)
375373 func setAdmins (adminPubKeys) = {
376374 let checkCaller = mustManager(i)
377375 if ((checkCaller == checkCaller))
378376 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
379377 else throw("Strict value is not equal to itself.")
380378 }
381379
382380
383381
384382 @Callable(i)
385383 func priceAssetsREADONLY () = $Tuple2(nil, stringOptionToList(getString(keyPriceAssets())))
386384
387385
388386
389387 @Callable(i)
390388 func statusREADONLY (amountAssetId,priceAssetId) = {
391389 let status = match getString(keyStatus(amountAssetId, priceAssetId)) {
392390 case s: String =>
393391 s
394392 case _ =>
395393 unit
396394 }
397395 $Tuple2(nil, status)
398396 }
399397
400398
401399 @Verifier(tx)
402400 func verify () = {
403401 let targetPublicKey = match managerPublicKeyOrUnit() {
404402 case pk: ByteVector =>
405403 pk
406404 case _: Unit =>
407405 tx.senderPublicKey
408406 case _ =>
409407 throw("Match error")
410408 }
411409 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
412410 }
413411

github/deemru/w8io/873ac7e 
65.82 ms