tx · 2twHswFtBcK6LjUuVtXgg2ohhHR5Jr2GWji7zFzsV9z3

3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5:  -0.01700000 Waves

2023.09.20 09:32 [2763344] smart account 3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5 > SELF 0.00000000 Waves

{ "type": 13, "id": "2twHswFtBcK6LjUuVtXgg2ohhHR5Jr2GWji7zFzsV9z3", "fee": 1700000, "feeAssetId": null, "timestamp": 1695191559322, "version": 2, "chainId": 84, "sender": "3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5", "senderPublicKey": "2LmNyaN5YAXdg9C5vsXcTLU66hsW2KUNPsN7KcHBYhUo", "proofs": [ "28Mec5k45mGK8SAUFYf65zACRqJ227GFz2HMUyLQF7ATXdqKLYk9cLU7LJop4SJss8cdmTcxnYAua59uuQeCrKUh" ], "script": "base64:BgIgCAISAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgEAA5kQXBwU2luY2VTdGFydACAkYzCqjEAClhUTkFzc2V0SUQBIAhlhLcP8IpqGvPiaOguCJAkw9MnWAPNLPYuXgvf2hWkABFDb2xsZWN0RmVlQWRkcmVzcwkApwgBASBSg9mgi9eQkjsz5eBARHIbc7Hg/F4fmB0sxZ6ySMfiIAEJY291bnRkYXlzAAQHVFNfRGlmZgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ5kQXBwU2luY2VTdGFydAQJZGF5bnVtYmVyCQBrAwABBQdUU19EaWZmAIC4mSkFCWRheW51bWJlcgYBaQEMUmVnaXN0ZXJQYWlyAQxFbnRlckFzc2V0SUQEBHBtdDEJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQEcG10MgkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBApjdXJyZW50S2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEBVdBVkVTCQEBIQEJAQlpc0RlZmluZWQBCAUEcG10Mgdhc3NldElkBAlmZXRjaHBhaXIJAJ0IAgUEdGhpcwkArAICAghQYWlyX1VWXwUMRW50ZXJBc3NldElEBA1hc3NldGluZm9wbXQyCQDZBAEFDEVudGVyQXNzZXRJRAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUMRW50ZXJBc3NldElECQCsAgIJAKwCAgIGQXNzZXQgBQxFbnRlckFzc2V0SUQCDiBkb2Vzbid0IGV4aXN0BARuYW1lCAUEaW5mbwRuYW1lBAhkZWNpbWFscwgFBGluZm8IZGVjaW1hbHMECkxQZGVjaW1hbHMJAGsDCQBkAgUIZGVjaW1hbHMABgABAAIECkZpcnN0TFBRdHkJAGgCAAEJAGwGAAoAAAUKTFBkZWNpbWFscwAAAAAFB0NFSUxJTkcEEG11bHRpcGx5X2Ftb3VudHMJAGsDCAUEcG10MQZhbW91bnQIBQRwbXQyBmFtb3VudAUKRmlyc3RMUFF0eQQHZ2V0U3FydAkBBHNxcnQEBRBtdWx0aXBseV9hbW91bnRzBQpMUGRlY2ltYWxzBQpMUGRlY2ltYWxzBQdDRUlMSU5HBAdMUGlzc3VlCQDCCAUJAKwCAgkArAICAgNMUC0JAK8CAgUEbmFtZQAIAgQtWFROCQCsAgIJAKwCAgkArAICCQCsAgICA0xQLQUEbmFtZQIELVhUTgIuIGlzIGEgTGlxdWlkaXR5IFByb3ZpZGVyIFRva2VuIElzc3VlZCBBZ2FpbnN0IAUMRW50ZXJBc3NldElEBQdnZXRTcXJ0BQpMUGRlY2ltYWxzBgQETFBpZAkAuAgBBQdMUGlzc3VlAwkAAAIFCWZldGNocGFpcgUMRW50ZXJBc3NldElECQACAQIbUGFpciBBbHJlYWR5IEV4aXN0IGluIExpc3QuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACCQACAQJyVHdvIGF0dGFjaGVkIGFzc2V0cyBleHBlY3RlZCBhcyBwYXltZW50LiBLaW5kbHkgQXR0YWNoIHBheW1lbnQxID0gV0FWRVMgVG9rZW4gJiBwYXltZW50MiA9IFRva2VuIHlvdSB3YW50IHRvIExpc3QuAwkBAiE9AggFBHBtdDEHYXNzZXRJZAUKWFROQXNzZXRJRAkAAgECP0luY29ycmVjdCBhc3NldCBhdHRhY2hlZCBhcyBwYXltZW50WzFdLCBwbGVhc2UgYXR0YWNoIFhUTiBvbmx5LgMJAGYCAKCNBggFBHBtdDEGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgkArAICAhJZb3UgYXR0YWNoZWQgb25seSAJAKQDAQkAawMIBQRwbXQxBmFtb3VudAABAIDC1y8CAS4JAKQDAQkAawMIBQRwbXQxBmFtb3VudAABAICt4gQCOSBXQVZFUyBmb3IgTGlzdGluZyBpbiBwYXltZW50WzFdLCBwbGVhc2UgYXR0YWNoIDEwIFdBVkVTLgMJAQIhPQIIBQRwbXQyB2Fzc2V0SWQFDWFzc2V0aW5mb3BtdDIJAAIBAjxJbnB1dCBTdHJpbmcgJiBBdHRhY2hlZCBBc3NldElEIGluIHBheW1lbnQyIGlzIG5vdCBtYXRjaGluZy4DCQAAAgUFV0FWRVMGCQACAQJdWW91IEF0dGFjaGVkIFdBVkVTIEFzc2V0IElEIGZvciBMaXN0aW5nLCBwbGVhc2UgYXR0YWNoIFRva2VucyBZb3Ugd2FudCB0byBsaXN0IGluIHBheW1lbnRbMl0uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAUMRW50ZXJBc3NldElECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICDExpc3RpbmdfRmVlXwUMRW50ZXJBc3NldElECAUEcG10MQZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdnZXRTcXJ0BQpYVE5Bc3NldElECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFClhUTkFzc2V0SUQIBQRwbXQxBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQUKWFROQXNzZXRJRAIBXwUMRW50ZXJBc3NldElECAUEcG10MgZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgITVG90YWxfb2ZfUGFpcl9UeG5zXwUMRW50ZXJBc3NldElEAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQpYVE5Bc3NldElEAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIZVG90YWxfU3dhcF9GZWVfQ29sbGVjdGVkXwUMRW50ZXJBc3NldElEAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkApAMBCQEJY291bnRkYXlzAAIMX0RheV9Wb2x1bWVfBQxFbnRlckFzc2V0SUQCAV8JANgEAQUKWFROQXNzZXRJRAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQkBCWNvdW50ZGF5cwACDF9EYXlfVm9sdW1lXwkA2AQBBQpYVE5Bc3NldElEAgFfBQxFbnRlckFzc2V0SUQAAAkAzAgCBQdMUGlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIDTFBfBQxFbnRlckFzc2V0SUQJANgEAQUETFBpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAUHZ2V0U3FydAUDbmlsAWkBDElzc3VlTFBUb2tlbgEMRW50ZXJBc3NldElEBAthZG1pbnJpZ2h0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCD0xQX0FkbWluX1JpZ2h0cwJQTFAgQWRtaW4gUmlnaHRzIGFyZSBOb3QgSW5jbHVkZWQgaW50byBTbWFydCBDb250cmFjdC4gRGVwbG95IEFkbWluIFJpZ2h0cyBGaXJzdC4EDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAIkQXNzZXQgbm90IEZvdW5kIGluIFdoaXRlbGlzdGVkIFRva2VuBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQxFbnRlckFzc2V0SUQJAKwCAgkArAICAgZBc3NldCAFDEVudGVyQXNzZXRJRAIOIGRvZXNuJ3QgZXhpc3QEBG5hbWUIBQRpbmZvBG5hbWUECGRlY2ltYWxzCAUEaW5mbwhkZWNpbWFscwQKRmlyc3RMUFF0eQkAaAIAAQkAbAYACgAACQBrAwkAZAIFCGRlY2ltYWxzAAYAAQACAAAAAAUHQ0VJTElORwQHTFBpc3N1ZQkAwggFCQCsAgIJAKwCAgIDTFAtCQCvAgIFBG5hbWUACAIELVhUTgkArAICCQCsAgIJAKwCAgkArAICAgNMUC0FBG5hbWUCBC1YVE4CLiBpcyBhIExpcXVpZGl0eSBQcm92aWRlciBUb2tlbiBJc3N1ZWQgQWdhaW5zdCAFDEVudGVyQXNzZXRJRAUKRmlyc3RMUFF0eQkAawMJAGQCBQhkZWNpbWFscwAGAAEAAgYEBExQaWQJALgIAQUHTFBpc3N1ZQMJAQIhPQIFC2FkbWlucmlnaHRzBQ1jYWxsZXJhZGRyZXNzCQACAQkArAICCQCsAgICLllvdXIgYXJlIG5vdCBhbGxvd2RlZCB0byBJc3N1ZSBMUCBUb2tlbi4gT25seSAFC2FkbWlucmlnaHRzAhggY2FuIGlzc3VlIHRoZSBMUCBUb2tlbi4DCQECIT0CBRljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90BQxFbnRlckFzc2V0SUQJAAIBAh5QYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gTGlzdC4JAMwIAgUHTFBpc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICA0xQXwUMRW50ZXJBc3NldElECQDYBAEFBExQaWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIJVG90YWxfTFBfBQxFbnRlckFzc2V0SUQFCkZpcnN0TFBRdHkFA25pbAFpARdTd2FwQXNzZXRUb1hUTlBhaXJFbnRyeQEMRW50ZXJBc3NldElEBA1jYWxsZXJhZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECNVdoaXRlbGlzdGVkIFRva2VuIGlzIHJlcXVpcmVkIGFzIEF0dGFjaGVkIHBheW1lbnRbMV0uBBljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90CQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAQPQ2hlY2tYVE5CYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFClhUTkFzc2V0SUQEEUNoZWNrQXNzZXRCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQpYVE5Bc3NldElEAgFfBQxFbnRlckFzc2V0SUQED25ld2JhbGFuY2VvZlhUTgkAawMFD0NoZWNrWFROQmFsYW5jZQURQ2hlY2tBc3NldEJhbGFuY2UJAGQCBRFDaGVja0Fzc2V0QmFsYW5jZQgFA3BtdAZhbW91bnQEFHF1YW50aXR5b2ZwcmljZWFzc2V0CQBlAgUPQ2hlY2tYVE5CYWxhbmNlBQ9uZXdiYWxhbmNlb2ZYVE4EB1N3YXBGZWUAAwQQU3dhcEZlZXRvcmVjZWl2ZQkAaQIJAGgCBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUHU3dhcEZlZQDoBwQUdXNlcmJhbGFuY2V0b3JlY2VpdmUJAGUCCQBlAgUUcXVhbnRpdHlvZnByaWNlYXNzZXQFEFN3YXBGZWV0b3JlY2VpdmUFEFN3YXBGZWV0b3JlY2VpdmUEGFN1bXVwb2ZBc3NldFRvWFROU3dhcEZlZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAhlUb3RhbF9Td2FwX0ZlZV9Db2xsZWN0ZWRfBQxFbnRlckFzc2V0SUQCAV8JANgEAQUKWFROQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQbTmV3U3VtdXBvZkFzc2V0VG9YVE5Td2FwRmVlCQBkAgkAZAIFGFN1bXVwb2ZBc3NldFRvWFROU3dhcEZlZQUQU3dhcEZlZXRvcmVjZWl2ZQUQU3dhcEZlZXRvcmVjZWl2ZQQRU3VtdXBBc3NldEJhbGFuY2UEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQUKWFROQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQBkAgURQ2hlY2tBc3NldEJhbGFuY2UIBQNwbXQGYW1vdW50BA9TdW11cFhUTkJhbGFuY2UEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQpYVE5Bc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBROZXdTdW11cG9mWFROQmFsYW5jZQkAZAIJAGUCBQ9DaGVja1hUTkJhbGFuY2UFFHF1YW50aXR5b2ZwcmljZWFzc2V0BRBTd2FwRmVldG9yZWNlaXZlBARUT1BUBAckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgICE1RvdGFsX29mX1BhaXJfVHhuc18FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQGTmV3VFBUCQBkAgUEVE9QVAABBARUT1BWBAckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQkBCWNvdW50ZGF5cwACDF9EYXlfVm9sdW1lXwkA2AQBBQpYVE5Bc3NldElEAgFfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEBk5ld1RQVgkAZAIFBFRPUFYIBQNwbXQGYW1vdW50AwkAAAIFDEVudGVyQXNzZXRJRAkA2AQBBQpYVE5Bc3NldElECQACAQKFAUlucHV0IGNhbiBOZXZlciBiZSBhIFhUTiBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0ICYgQXR0YWNoIFdoaXRlbGlzdGVkIEFzc2V0IGFzIGFuIGF0dGFjaG1lbnQgVG9rZW4gaW4gcGF5bWVudFsxXS4DCQECIT0CBRljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90BQxFbnRlckFzc2V0SUQJAAIBAitQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAIIBQNwbXQHYXNzZXRJZAUKWFROQXNzZXRJRAkAAgECUllvdSBjYW4ndCBBdHRhY2ggWFROIGFzIGFuIEF0dGFjaGVkIFBheW1lbnQuIE9ubHkgV2hpdGVsaXN0ZWQgVG9rZW5zIGFyZSBhY2NlcHRlZC4DCQECIT0CCAUDcG10B2Fzc2V0SWQJANkEAQUMRW50ZXJBc3NldElECQACAQkArAICAjBJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQsIHBsZWFzZSBhdHRhY2ggb3Igc2VuZCAFDEVudGVyQXNzZXRJRAMJAAACBQ9DaGVja1hUTkJhbGFuY2UAAAkAAgECZVN3YXAgUGFpciBOZWVkIHRvIEFkZCBMaXF1aWRpdHkgZmlyc3QgaW50byBQb29sLiBPbmx5IEFmdGVyIHRoYXQgUGFpciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgU3dhcHBpbmcuAwkAAAIFEUNoZWNrQXNzZXRCYWxhbmNlAAAJAAIBAmVTd2FwIFBhaXIgTmVlZCB0byBBZGQgTGlxdWlkaXR5IGZpcnN0IGludG8gUG9vbC4gT25seSBBZnRlciB0aGF0IFBhaXIgd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIFN3YXBwaW5nLgMJAGYCAKCNBgUUcXVhbnRpdHlvZnByaWNlYXNzZXQJAAIBCQCsAgIJAKwCAgI0WW91ciBBdHRhY2hlZCBBc3NldCBBbW91bnQgaXMgdmVyeSBsb3cuIEF0dGFjaCBNb3JlIAUMRW50ZXJBc3NldElEAjogVG9rZW5zIHRvIENsYWltIHRoZSBtaW5pbXVtIEFtb3VudCBvZiAwLjEgZG9sbGFyIGF0bGVhc3QuAwkAZgIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BQ9DaGVja1hUTkJhbGFuY2UJAAIBCQCsAgIJAKwCAgIdUG9vbCBPbmx5IGhhcyBhIExpcXVpZGl0eSBvZiAJAKQDAQkAaQIFD0NoZWNrWFROQmFsYW5jZQkAbAYACgAAAAYAAAAABQdDRUlMSU5HAh4gWFROLiBBZGQgTGlxdWlkaXR5IGludG8gUG9vbC4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQpYVE5Bc3NldElEBRtOZXdTdW11cG9mQXNzZXRUb1hUTlN3YXBGZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkApAMBCQEJY291bnRkYXlzAAIMX0RheV9Wb2x1bWVfCQDYBAEFClhUTkFzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAUGTmV3VFBWCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICE1RvdGFsX29mX1BhaXJfVHhuc18FDEVudGVyQXNzZXRJRAUGTmV3VFBUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQpYVE5Bc3NldElEAgFfBQxFbnRlckFzc2V0SUQFFk5ld1N1bXVwb2ZBc3NldEJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQUKWFROQXNzZXRJRAUUTmV3U3VtdXBvZlhUTkJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR1c2VyYmFsYW5jZXRvcmVjZWl2ZQUKWFROQXNzZXRJRAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRFDb2xsZWN0RmVlQWRkcmVzcwUQU3dhcEZlZXRvcmVjZWl2ZQUKWFROQXNzZXRJRAUDbmlsAWkBF1N3YXBYVE5Ub0Fzc2V0UGFpckVudHJ5AQxFbnRlckFzc2V0SUQEDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQkArAICCQCsAgICBU9ubHkgCQDYBAEFClhUTkFzc2V0SUQCMSBYVE4gVG9rZW4gaXMgcmVxdWlyZWQgYXMgYW4gQXR0YWNoZWQgcGF5bWVudFsxXS4ED0NoZWNrWFROQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQpYVE5Bc3NldElEBBFDaGVja0Fzc2V0QmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQUKWFROQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBBFuZXdiYWxhbmNlb2ZBc3NldAkAawMFD0NoZWNrWFROQmFsYW5jZQURQ2hlY2tBc3NldEJhbGFuY2UJAGQCBQ9DaGVja1hUTkJhbGFuY2UIBQNwbXQGYW1vdW50BBRxdWFudGl0eW9mcHJpY2Vhc3NldAkAZQIFEUNoZWNrQXNzZXRCYWxhbmNlBRFuZXdiYWxhbmNlb2ZBc3NldAQZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkAnQgCBQR0aGlzCQCsAgICCFBhaXJfVVZfBQxFbnRlckFzc2V0SUQEB1N3YXBGZWUAAwQQU3dhcEZlZXRvcmVjZWl2ZQkAaQIJAGgCBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUHU3dhcEZlZQDoBwQUdXNlcmJhbGFuY2V0b3JlY2VpdmUJAGUCCQBlAgUUcXVhbnRpdHlvZnByaWNlYXNzZXQFEFN3YXBGZWV0b3JlY2VpdmUFEFN3YXBGZWV0b3JlY2VpdmUEGFN1bXVwb2ZYVE5Ub0Fzc2V0U3dhcEZlZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQbTmV3U3VtdXBvZlhUTlRvQXNzZXRTd2FwRmVlCQBkAgkAZAIFGFN1bXVwb2ZYVE5Ub0Fzc2V0U3dhcEZlZQUQU3dhcEZlZXRvcmVjZWl2ZQUQU3dhcEZlZXRvcmVjZWl2ZQQRU3VtdXBBc3NldEJhbGFuY2UEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQUKWFROQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQBkAgkAZQIFEUNoZWNrQXNzZXRCYWxhbmNlBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUQU3dhcEZlZXRvcmVjZWl2ZQQPU3VtdXBYVE5CYWxhbmNlBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQUKWFROQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQUTmV3U3VtdXBvZlhUTkJhbGFuY2UJAGQCBQ9DaGVja1hUTkJhbGFuY2UIBQNwbXQGYW1vdW50BARUT1BUBAckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgICE1RvdGFsX29mX1BhaXJfVHhuc18FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQGTmV3VFBUCQBkAgUEVE9QVAABAwkBAiE9AgUZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAUMRW50ZXJBc3NldElECQACAQIrUGFpciBpcyBub3QgYXZhaWxhYmxlIGluIFdoaXRlbGlzdGVkIEFzc2V0LgMJAAACBQxFbnRlckFzc2V0SUQJANgEAQUKWFROQXNzZXRJRAkAAgECd0lucHV0IGNhbiBOZXZlciBiZSBhIFhUTiBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0ICYgQXR0YWNoIFhUTiBhcyBhbiBhdHRhY2htZW50IFRva2VuIGluIHBheW1lbnRbMV0uAwkBAiE9AggFA3BtdAdhc3NldElkBQpYVE5Bc3NldElECQACAQJ7WW91IGNhbiBBdHRhY2ggWFROIGFzIGFuIEF0dGFjaGVkIFBheW1lbnRbMV0gdG8gU3dhcCBYVE4gVG8gUmVxdWlyZWQgVG9rZW4uIEFueSBvdGhlciBhc3NldCBlbHNlIHRoYW4gWFROIHdpbGwgYmUgcmVqZWN0ZWQuAwkAZgIAoI0GCAUDcG10BmFtb3VudAkAAgECWVlvdXIgQXR0YWNoZWQgWFROIEFtb3VudCBpcyB2ZXJ5IGxvdy4gQXR0YWNoIEF0bGVhc3QgMC4xIFhUTiB0byBDbGFpbSB0aGUgbWluaW11bSBUb2tlbnMuAwkAAAIFD0NoZWNrWFROQmFsYW5jZQAACQACAQJlU3dhcCBQYWlyIE5lZWQgdG8gQWRkIExpcXVpZGl0eSBmaXJzdCBpbnRvIFBvb2wuIE9ubHkgQWZ0ZXIgdGhhdCBQYWlyIHdpbGwgYmUgYWN0aXZhdGVkIGZvciBTd2FwcGluZy4DCQAAAgURQ2hlY2tBc3NldEJhbGFuY2UAAAkAAgECZVN3YXAgUGFpciBOZWVkIHRvIEFkZCBMaXF1aWRpdHkgZmlyc3QgaW50byBQb29sLiBPbmx5IEFmdGVyIHRoYXQgUGFpciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgU3dhcHBpbmcuAwkAZgIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BRFDaGVja0Fzc2V0QmFsYW5jZQkAAgEJAKwCAgkArAICAh1Qb29sIE9ubHkgaGFzIGEgTGlxdWlkaXR5IG9mIAkApAMBBRFDaGVja0Fzc2V0QmFsYW5jZQIhIFRva2Vucy4gQWRkIExpcXVpZGl0eSBpbnRvIFBvb2wuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAUbTmV3U3VtdXBvZlhUTlRvQXNzZXRTd2FwRmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICE1RvdGFsX29mX1BhaXJfVHhuc18FDEVudGVyQXNzZXRJRAUGTmV3VFBUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQpYVE5Bc3NldElEAgFfBQxFbnRlckFzc2V0SUQFFk5ld1N1bXVwb2ZBc3NldEJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQUKWFROQXNzZXRJRAUUTmV3U3VtdXBvZlhUTkJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR1c2VyYmFsYW5jZXRvcmVjZWl2ZQkA2QQBBQxFbnRlckFzc2V0SUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwURQ29sbGVjdEZlZUFkZHJlc3MFEFN3YXBGZWV0b3JlY2VpdmUJANkEAQUMRW50ZXJBc3NldElEBQNuaWwBaQEMQWRkTGlxdWlkaXR5AQxFbnRlckFzc2V0SUQEDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQEcG10MQkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABARwbXQyCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QJAJ0IAgUEdGhpcwkArAICAghQYWlyX1VWXwUMRW50ZXJBc3NldElEBA5SZWlzc3VlYXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICAgNMUF8FDEVudGVyQXNzZXRJRAIsTFAgVG9rZW4gaXMgTWlzc2luZyBvciBNYXkgYmUgbm90IEdlbmVyYXRlZC4ED0NoZWNrWFROQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQpYVE5Bc3NldElEBBFDaGVja0Fzc2V0QmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQUKWFROQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBAxkZWNpbWFsc2luZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFDEVudGVyQXNzZXRJRAkArAICCQCsAgICBkFzc2V0IAUMRW50ZXJBc3NldElEAg4gZG9lc24ndCBleGlzdAQIZGVjaW1hbHMIBQxkZWNpbWFsc2luZm8IZGVjaW1hbHMEBGFyZzEFD0NoZWNrWFROQmFsYW5jZQQEYXJnMgURQ2hlY2tBc3NldEJhbGFuY2UEBWFyZ3MzCQBsBgkAaAIJAGkCCQBoAgUEYXJnMQDAhD0FBGFyZzIJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQdDRUlMSU5HAAAAAQAAAAAFB0NFSUxJTkcEEmJvdGhhc3NldHNkZWNpbWFscwkAZAIABgUIZGVjaW1hbHMEDXNoYXJlZGVjaW1hbHMJAGkCBRJib3RoYXNzZXRzZGVjaW1hbHMAAgQWcXVhbnRpdHlvZkVudGVyQXNzZXRJRAkAawMFBWFyZ3MzCAUEcG10MQZhbW91bnQJAGwGAAoAAAUSYm90aGFzc2V0c2RlY2ltYWxzAAAAAAUHQ0VJTElORwQScXVhbnRpdHlvZkxQVG9rZW4xCQBsBgkAaAIJAGsDCAUEcG10MQZhbW91bnQAAQkAbAYACgAABQhkZWNpbWFscwAAAAAFB0NFSUxJTkcJAGsDCAUEcG10MgZhbW91bnQAAQkAbAYACgAAAAYAAAAABQdDRUlMSU5HAAAABQABBQ1zaGFyZWRlY2ltYWxzBQRET1dOBBBYVE5Ib2xkaW5nSW5QYWlyBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQUKWFROQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQTTmV3WFROSG9sZGluZ0luUGFpcgkAZAIFEFhUTkhvbGRpbmdJblBhaXIIBQRwbXQyBmFtb3VudAQSQXNzZXRIb2xkaW5nSW5QYWlyBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFClhUTkFzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQVTmV3QXNzZXRIb2xkaW5nSW5QYWlyCQBkAgUSQXNzZXRIb2xkaW5nSW5QYWlyCAUEcG10MQZhbW91bnQEDUxQVG9rZW5Jc3N1ZWQEByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgIJVG90YWxfTFBfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEEE5ld0xQVG9rZW5Jc3N1ZWQJAGQCBQ1MUFRva2VuSXNzdWVkBRJxdWFudGl0eW9mTFBUb2tlbjEDCQECIT0CBRljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90BQxFbnRlckFzc2V0SUQJAAIBAitQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAIFDEVudGVyQXNzZXRJRAkA2AQBBQpYVE5Bc3NldElECQACAQKQAUlucHV0IGNhbiBOZXZlciBiZSBhIFhUTiBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0IGFzIHdlbGwgYXMgaW4gcGF5bWVudFsxXSAmIEF0dGFjaCBYVE4gYXMgYW4gYXR0YWNobWVudCBUb2tlbiBpbiBwYXltZW50WzJdLgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECnQFUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkIGFzIHBheW1lbnQgaW4gNTAlLTUwJS4gS2luZGx5IEF0dGFjaCBwYXltZW50MSA9IFRva2VuIHlvdSB3YW50IHRvIGFkZCBmb3IgTGlxdWlkaXR5ICYgcGF5bWVudDIgPSBFcXVpdmFsZW50IEFtb3VudCBvZiBYVE4gVG9rZW4uAwkAAAIIBQRwbXQxB2Fzc2V0SWQFClhUTkFzc2V0SUQJAAIBAnZZb3UgQXR0YWNoZWQgWFROIGFzc2V0IGluIHBheW1lbnRbMV0sIHBsZWFzZSBhdHRhY2ggb25seSB3aGl0ZWxpc3RlZCBUb2tlbiBpbiBwYXltZW50WzFdIGFsb25nIHdpdGggWFROIGluIHBheW1lbnRbMl0uAwkBAiE9AggFBHBtdDEHYXNzZXRJZAkA2QQBBQxFbnRlckFzc2V0SUQJAAIBAmtJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQgZm9yIExpcXVpZGl0eSBpbiBwYXltZW50WzFdLCBwbGVhc2UgYXR0YWNoIFN0cmluZyBBc3NldCBvciBXaGl0ZWxpc3RlZCBUb2tlbiBvbmx5LgMJAQIhPQIIBQRwbXQxB2Fzc2V0SWQJANkEAQUMRW50ZXJBc3NldElECQACAQJrSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkIGZvciBMaXF1aWRpdHkgaW4gcGF5bWVudFsxXSwgcGxlYXNlIGF0dGFjaCBTdHJpbmcgQXNzZXQgb3IgV2hpdGVsaXN0ZWQgVG9rZW4gb25seS4DCQECIT0CCAUEcG10Mgdhc3NldElkBQpYVE5Bc3NldElECQACAQJpV3JvbmcgQXNzZXQgQXR0YWNoZWQgaW4gcGF5bWVudHNbMl0sIFBsZWFzZSBhdHRhY2ggcGF5bWVudFsxXSA9IExpcXVpZGl0eSBUb2tlbiAmIHBheW1lbnRbMl0gPSBYVE4gVG9rZW4uAwkAZgIAwJaxAggFBHBtdDIGYW1vdW50CQACAQJTcGxlYXNlIGF0dGFjaCBhdGxlYXN0IDUgWFROIGluIHBheW1lbnRbMl0gJiBFcXVpdmFsZW50IHdvcnRoIG9mIFRva2VuIGluIHBheW1lbnRbMV0DCQECIT0CCAUEcG10MgZhbW91bnQFFnF1YW50aXR5b2ZFbnRlckFzc2V0SUQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAl5BdHRhY2hlZCBwYXltZW50WzJdIHF0eSBpcyBub3QgbWF0Y2hpbmcgYXMgcGVyIGF0dGFjaGVkIHBheW1lbnRbMV0ucGF5bWVudFsyXSBtdXN0IGJlIGFzIGludCBbCQCkAwEFFnF1YW50aXR5b2ZFbnRlckFzc2V0SUQCBV0gb3IgCQCkAwEJAGsDBRZxdWFudGl0eW9mRW50ZXJBc3NldElEAAEAwIQ9AgEuCQCyAgIJAKQDAQUWcXVhbnRpdHlvZkVudGVyQXNzZXRJRAAGAgUgWFROLgMJAGYCAAEFEnF1YW50aXR5b2ZMUFRva2VuMQkAAgEJAKwCAgkArAICAiBMUCBUb2tlbiBPdXRjb21lIGlzIGdvaW5nIGJlbG93IAkApAMBBQ1zaGFyZWRlY2ltYWxzAjogRGVjaW1hbHMuIFBsZWFzZSBBdHRhY2ggbWluLiAxIExQIHRva2VuIG9yIDUgWFROIEF0bGVhc3QuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFClhUTkFzc2V0SUQFE05ld1hUTkhvbGRpbmdJblBhaXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFClhUTkFzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAUVTmV3QXNzZXRIb2xkaW5nSW5QYWlyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICCVRvdGFsX0xQXwUMRW50ZXJBc3NldElEBRBOZXdMUFRva2VuSXNzdWVkCQDMCAIJAQdSZWlzc3VlAwUOUmVpc3N1ZWFzc2V0SWQFEnF1YW50aXR5b2ZMUFRva2VuMQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRJxdWFudGl0eW9mTFBUb2tlbjEFDlJlaXNzdWVhc3NldElkBQNuaWwBaQEPUmVtb3ZlTGlxdWlkaXR5AQxFbnRlckFzc2V0SUQEDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQI6Tm8gcGF5bWVudCBhdHRhY2hlZCwgUGxlYXNlIEF0dGFjaCBMUCBUb2tlbiBhcyBwYXltZW50WzFdLgQZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkAnQgCBQR0aGlzCQCsAgICCFBhaXJfVVZfBQxFbnRlckFzc2V0SUQEElJlaXNzdWVhYmxlYXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICAgNMUF8FDEVudGVyQXNzZXRJRAIlTFAgVG9rZW4gaXMgTWlzc2luZyBvciBub3QgR2VuZXJhdGVkLgQMZGVjaW1hbHNpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQxFbnRlckFzc2V0SUQJAKwCAgkArAICAgZBc3NldCAFDEVudGVyQXNzZXRJRAIOIGRvZXNuJ3QgZXhpc3QECGRlY2ltYWxzCAUMZGVjaW1hbHNpbmZvCGRlY2ltYWxzBBJib3RoYXNzZXRzZGVjaW1hbHMJAGQCAAYFCGRlY2ltYWxzBA1zaGFyZWRlY2ltYWxzCQBpAgUSYm90aGFzc2V0c2RlY2ltYWxzAAIEEkNoZWNrVG90YWxMUEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAQQVXNlckxQUGVyY2VudGFnZQkAbAYJAGsDCAUDcG10BmFtb3VudAkAbAYACgAAAAgAAAAABQdDRUlMSU5HBRJDaGVja1RvdGFsTFBBbW91bnQABgABAAAABgUHQ0VJTElORwQPQ2hlY2tYVE5CYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFClhUTkFzc2V0SUQEEUNoZWNrQXNzZXRCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQpYVE5Bc3NldElEAgFfBQxFbnRlckFzc2V0SUQEDlVzZXJMUFdvcnRoWFROCQBrAwUPQ2hlY2tYVE5CYWxhbmNlBRBVc2VyTFBQZXJjZW50YWdlCQBsBgAKAAAACAAAAAAFB0NFSUxJTkcEEFVzZXJMUFdvcnRoQXNzZXQJAGsDBRFDaGVja0Fzc2V0QmFsYW5jZQUQVXNlckxQUGVyY2VudGFnZQkAbAYACgAAAAgAAAAABQdDRUlMSU5HBBBYVE5Ib2xkaW5nSW5QYWlyBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQUKWFROQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQTTmV3WFROSG9sZGluZ0luUGFpcgkAZQIFEFhUTkhvbGRpbmdJblBhaXIFDlVzZXJMUFdvcnRoWFROBBJBc3NldEhvbGRpbmdJblBhaXIEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQUKWFROQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBVOZXdBc3NldEhvbGRpbmdJblBhaXIJAGUCBRJBc3NldEhvbGRpbmdJblBhaXIFEFVzZXJMUFdvcnRoQXNzZXQEDUxQVG9rZW5Jc3N1ZWQEByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgIJVG90YWxfTFBfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEEE5ld0xQVG9rZW5Jc3N1ZWQJAGUCBQ1MUFRva2VuSXNzdWVkCAUDcG10BmFtb3VudAMJAQIhPQIFGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFDEVudGVyQXNzZXRJRAkAAgECI1BhaXIgaXMgbm90IGF2YWlsYWJsZSBpbiBXaGl0ZWxpc3QuAwkAAAIJANkEAQUMRW50ZXJBc3NldElEBQpYVE5Bc3NldElECQACAQJqRG9uJ3QgY2hvb3NlIFhUTiBBc3NldElEIGFzIElucHV0LCBPbmx5IFdoaXRlbGlzdGVkIEFzc2V0IGFzIElucHV0IFN0cmluZyAmIEF0dGFjaCBMUCBUb2tlbnMgYXMgcGF5bWVudFsxXQMJAQIhPQIIBQNwbXQHYXNzZXRJZAUSUmVpc3N1ZWFibGVhc3NldElkCQACAQJHV3JvbmcgQXNzZXQgaXMgYXR0YWNoZWQgaW4gcGF5bWVudFsxXSBvciBMUCBUb2tlbiBOb3QgRm91bmQgb3IgTWlzc2luZy4DCQBmAgABBRBVc2VyTFBQZXJjZW50YWdlCQACAQIuWW91ciBMUCBUb2tlbiBhbW91bnQgJSBpcyB2ZXJ5IGxvdyB0byBjb252ZXJ0LgMJAGYCAAEFDlVzZXJMUFdvcnRoWFROCQACAQJRWW91ciBMUCBUb2tlbiBjb252ZXJzaW9uIGFtb3VudCBpcyB2ZXJ5IGxvdyB0byBjb252ZXJ0IG9yIGxlc3MgdGhhbiAwLjAwMDAwMSBYVE4uAwkAZgIAAQUQVXNlckxQV29ydGhBc3NldAkAAgECXFlvdXIgTFAgVG9rZW4gY29udmVyc2lvbiBhbW91bnQgaXMgdmVyeSBsb3cgdG8gY29udmVydCBvciBsZXNzIHRoYW4gZnJhY3Rpb24gdmFsdWUgb2YgVG9rZW4uCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhZXaXRoZHJhd19MUF9QZXJjZW50YWdlBRBVc2VyTFBQZXJjZW50YWdlCQDMCAIJAQRCdXJuAgUSUmVpc3N1ZWFibGVhc3NldElkCAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAUQTmV3TFBUb2tlbklzc3VlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQpYVE5Bc3NldElEBRNOZXdYVE5Ib2xkaW5nSW5QYWlyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQpYVE5Bc3NldElEAgFfBQxFbnRlckFzc2V0SUQFFU5ld0Fzc2V0SG9sZGluZ0luUGFpcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDlVzZXJMUFdvcnRoWFROBQpYVE5Bc3NldElECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUQVXNlckxQV29ydGhBc3NldAkA2QQBBQxFbnRlckFzc2V0SUQFA25pbAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmqT+jH", "height": 2763344, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BgfUrd9zWcwbvfivHGK3Z8xKTL9WVfrZv3y8Du491S1j Next: HFvZgV4BDASz3QqUAJyaujUrRoXF3zxU4xWQtwuS2s5v Diff:
OldNewDifferences
4343 then throw("Input String & Attached AssetID in payment2 is not matching.")
4444 else if ((WAVES == true))
4545 then throw("You Attached WAVES Asset ID for Listing, please attach Tokens You want to list in payment[2].")
46- else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), ScriptTransfer(i.caller, pmt1.amount, XTNAssetID), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), pmt1.amount), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + toBase58String(XTNAssetID)) + "_") + EnterAssetID), 0), LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), getSqrt)]
46+ else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), ScriptTransfer(i.caller, getSqrt, XTNAssetID), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), pmt1.amount), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + toBase58String(XTNAssetID)) + "_") + EnterAssetID), 0), LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), getSqrt)]
4747 }
4848
4949
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let dAppSinceStart = 1695040080000
55
66 let XTNAssetID = base58'Zn3cLHW7aAVPm5aACcTjvg7e7iEy2cKDtbowok5qa9H'
77
88 let CollectFeeAddress = addressFromPublicKey(base58'6Z73KxcX3sugpiStpSRXxKxTmWqCaLVwFeM6kwyiKVDR')
99
1010 func countdays () = {
1111 let TS_Diff = (lastBlock.timestamp - dAppSinceStart)
1212 let daynumber = fraction(1, TS_Diff, 86400000)
1313 daynumber
1414 }
1515
1616
1717 @Callable(i)
1818 func RegisterPair (EnterAssetID) = {
1919 let pmt1 = value(i.payments[0])
2020 let pmt2 = value(i.payments[1])
2121 let currentKey = toBase58String(i.caller.bytes)
2222 let WAVES = !(isDefined(pmt2.assetId))
2323 let fetchpair = getString(this, ("Pair_UV_" + EnterAssetID))
2424 let assetinfopmt2 = fromBase58String(EnterAssetID)
2525 let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
2626 let name = info.name
2727 let decimals = info.decimals
2828 let LPdecimals = fraction((decimals + 6), 1, 2)
2929 let FirstLPQty = (1 * pow(10, 0, LPdecimals, 0, 0, CEILING))
3030 let multiply_amounts = fraction(pmt1.amount, pmt2.amount, FirstLPQty)
3131 let getSqrt = sqrt(multiply_amounts, LPdecimals, LPdecimals, CEILING)
3232 let LPissue = Issue((("LP-" + take(name, 8)) + "-XTN"), (((("LP-" + name) + "-XTN") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), getSqrt, LPdecimals, true)
3333 let LPid = calculateAssetId(LPissue)
3434 if ((fetchpair == EnterAssetID))
3535 then throw("Pair Already Exist in List.")
3636 else if ((size(i.payments) != 2))
3737 then throw("Two attached assets expected as payment. Kindly Attach payment1 = WAVES Token & payment2 = Token you want to List.")
3838 else if ((pmt1.assetId != XTNAssetID))
3939 then throw("Incorrect asset attached as payment[1], please attach XTN only.")
4040 else if ((100000 > pmt1.amount))
4141 then throw((((("You attached only " + toString(fraction(pmt1.amount, 1, 100000000))) + ".") + toString(fraction(pmt1.amount, 1, 10000000))) + " WAVES for Listing in payment[1], please attach 10 WAVES."))
4242 else if ((pmt2.assetId != assetinfopmt2))
4343 then throw("Input String & Attached AssetID in payment2 is not matching.")
4444 else if ((WAVES == true))
4545 then throw("You Attached WAVES Asset ID for Listing, please attach Tokens You want to list in payment[2].")
46- else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), ScriptTransfer(i.caller, pmt1.amount, XTNAssetID), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), pmt1.amount), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + toBase58String(XTNAssetID)) + "_") + EnterAssetID), 0), LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), getSqrt)]
46+ else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), ScriptTransfer(i.caller, getSqrt, XTNAssetID), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), pmt1.amount), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + EnterAssetID) + "_") + toBase58String(XTNAssetID)), 0), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + toBase58String(XTNAssetID)) + "_") + EnterAssetID), 0), LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), getSqrt)]
4747 }
4848
4949
5050
5151 @Callable(i)
5252 func IssueLPToken (EnterAssetID) = {
5353 let adminrights = valueOrErrorMessage(getString(this, "LP_Admin_Rights"), "LP Admin Rights are Not Included into Smart Contract. Deploy Admin Rights First.")
5454 let calleraddress = toBase58String(i.caller.bytes)
5555 let checkpairisavailableornot = valueOrErrorMessage(getString(this, ("Pair_UV_" + EnterAssetID)), "Asset not Found in Whitelisted Token")
5656 let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
5757 let name = info.name
5858 let decimals = info.decimals
5959 let FirstLPQty = (1 * pow(10, 0, fraction((decimals + 6), 1, 2), 0, 0, CEILING))
6060 let LPissue = Issue((("LP-" + take(name, 8)) + "-XTN"), (((("LP-" + name) + "-XTN") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), FirstLPQty, fraction((decimals + 6), 1, 2), true)
6161 let LPid = calculateAssetId(LPissue)
6262 if ((adminrights != calleraddress))
6363 then throw((("Your are not allowded to Issue LP Token. Only " + adminrights) + " can issue the LP Token."))
6464 else if ((checkpairisavailableornot != EnterAssetID))
6565 then throw("Pair is not available in List.")
6666 else [LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), FirstLPQty)]
6767 }
6868
6969
7070
7171 @Callable(i)
7272 func SwapAssetToXTNPairEntry (EnterAssetID) = {
7373 let calleraddress = toBase58String(i.caller.bytes)
7474 let pmt = if ((size(i.payments) == 1))
7575 then i.payments[0]
7676 else throw("Whitelisted Token is required as Attached payment[1].")
7777 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
7878 let CheckXTNBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)))
7979 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID))
8080 let newbalanceofXTN = fraction(CheckXTNBalance, CheckAssetBalance, (CheckAssetBalance + pmt.amount))
8181 let quantityofpriceasset = (CheckXTNBalance - newbalanceofXTN)
8282 let SwapFee = 3
8383 let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
8484 let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
8585 let SumupofAssetToXTNSwapFee = match getInteger(this, ((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(XTNAssetID))) {
8686 case a: Int =>
8787 a
8888 case _ =>
8989 0
9090 }
9191 let NewSumupofAssetToXTNSwapFee = ((SumupofAssetToXTNSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
9292 let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID)) {
9393 case a: Int =>
9494 a
9595 case _ =>
9696 0
9797 }
9898 let NewSumupofAssetBalance = (CheckAssetBalance + pmt.amount)
9999 let SumupXTNBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID))) {
100100 case a: Int =>
101101 a
102102 case _ =>
103103 0
104104 }
105105 let NewSumupofXTNBalance = ((CheckXTNBalance - quantityofpriceasset) + SwapFeetoreceive)
106106 let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
107107 case a: Int =>
108108 a
109109 case _ =>
110110 0
111111 }
112112 let NewTPT = (TOPT + 1)
113113 let TOPV = match getIntegerValue(this, ((((toString(countdays()) + "_Day_Volume_") + toBase58String(XTNAssetID)) + "_") + EnterAssetID)) {
114114 case a: Int =>
115115 a
116116 case _ =>
117117 0
118118 }
119119 let NewTPV = (TOPV + pmt.amount)
120120 if ((EnterAssetID == toBase58String(XTNAssetID)))
121121 then throw("Input can Never be a XTN AssetID. Enter Whitelisted AssetID in input & Attach Whitelisted Asset as an attachment Token in payment[1].")
122122 else if ((checkpairisavailableornot != EnterAssetID))
123123 then throw("Pair is not available in Whitelisted Asset.")
124124 else if ((pmt.assetId == XTNAssetID))
125125 then throw("You can't Attach XTN as an Attached Payment. Only Whitelisted Tokens are accepted.")
126126 else if ((pmt.assetId != fromBase58String(EnterAssetID)))
127127 then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
128128 else if ((CheckXTNBalance == 0))
129129 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
130130 else if ((CheckAssetBalance == 0))
131131 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
132132 else if ((100000 > quantityofpriceasset))
133133 then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 0.1 dollar atleast."))
134134 else if ((quantityofpriceasset > CheckXTNBalance))
135135 then throw((("Pool Only has a Liquidity of " + toString((CheckXTNBalance / pow(10, 0, 6, 0, 0, CEILING)))) + " XTN. Add Liquidity into Pool."))
136136 else [IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), NewSumupofAssetToXTNSwapFee), IntegerEntry(((((toString(countdays()) + "_Day_Volume_") + toBase58String(XTNAssetID)) + "_") + EnterAssetID), NewTPV), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), NewTPT), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), NewSumupofXTNBalance), ScriptTransfer(i.caller, userbalancetoreceive, XTNAssetID), ScriptTransfer(CollectFeeAddress, SwapFeetoreceive, XTNAssetID)]
137137 }
138138
139139
140140
141141 @Callable(i)
142142 func SwapXTNToAssetPairEntry (EnterAssetID) = {
143143 let calleraddress = toBase58String(i.caller.bytes)
144144 let pmt = if ((size(i.payments) == 1))
145145 then i.payments[0]
146146 else throw((("Only " + toBase58String(XTNAssetID)) + " XTN Token is required as an Attached payment[1]."))
147147 let CheckXTNBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)))
148148 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID))
149149 let newbalanceofAsset = fraction(CheckXTNBalance, CheckAssetBalance, (CheckXTNBalance + pmt.amount))
150150 let quantityofpriceasset = (CheckAssetBalance - newbalanceofAsset)
151151 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
152152 let SwapFee = 3
153153 let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
154154 let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
155155 let SumupofXTNToAssetSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + EnterAssetID)) {
156156 case a: Int =>
157157 a
158158 case _ =>
159159 0
160160 }
161161 let NewSumupofXTNToAssetSwapFee = ((SumupofXTNToAssetSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
162162 let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID)) {
163163 case a: Int =>
164164 a
165165 case _ =>
166166 0
167167 }
168168 let NewSumupofAssetBalance = ((CheckAssetBalance - quantityofpriceasset) + SwapFeetoreceive)
169169 let SumupXTNBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID))) {
170170 case a: Int =>
171171 a
172172 case _ =>
173173 0
174174 }
175175 let NewSumupofXTNBalance = (CheckXTNBalance + pmt.amount)
176176 let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
177177 case a: Int =>
178178 a
179179 case _ =>
180180 0
181181 }
182182 let NewTPT = (TOPT + 1)
183183 if ((checkpairisavailableornot != EnterAssetID))
184184 then throw("Pair is not available in Whitelisted Asset.")
185185 else if ((EnterAssetID == toBase58String(XTNAssetID)))
186186 then throw("Input can Never be a XTN AssetID. Enter Whitelisted AssetID in input & Attach XTN as an attachment Token in payment[1].")
187187 else if ((pmt.assetId != XTNAssetID))
188188 then throw("You can Attach XTN as an Attached Payment[1] to Swap XTN To Required Token. Any other asset else than XTN will be rejected.")
189189 else if ((100000 > pmt.amount))
190190 then throw("Your Attached XTN Amount is very low. Attach Atleast 0.1 XTN to Claim the minimum Tokens.")
191191 else if ((CheckXTNBalance == 0))
192192 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
193193 else if ((CheckAssetBalance == 0))
194194 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
195195 else if ((quantityofpriceasset > CheckAssetBalance))
196196 then throw((("Pool Only has a Liquidity of " + toString(CheckAssetBalance)) + " Tokens. Add Liquidity into Pool."))
197197 else [IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), NewSumupofXTNToAssetSwapFee), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), NewTPT), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), NewSumupofXTNBalance), ScriptTransfer(i.caller, userbalancetoreceive, fromBase58String(EnterAssetID)), ScriptTransfer(CollectFeeAddress, SwapFeetoreceive, fromBase58String(EnterAssetID))]
198198 }
199199
200200
201201
202202 @Callable(i)
203203 func AddLiquidity (EnterAssetID) = {
204204 let calleraddress = toBase58String(i.caller.bytes)
205205 let pmt1 = value(i.payments[0])
206206 let pmt2 = value(i.payments[1])
207207 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
208208 let ReissueassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or May be not Generated."))
209209 let CheckXTNBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)))
210210 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID))
211211 let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
212212 let decimals = decimalsinfo.decimals
213213 let arg1 = CheckXTNBalance
214214 let arg2 = CheckAssetBalance
215215 let args3 = pow((((arg1 * 1000000) / arg2) * pow(10, 0, decimals, 0, 0, CEILING)), 0, 1, 0, 0, CEILING)
216216 let bothassetsdecimals = (6 + decimals)
217217 let sharedecimals = (bothassetsdecimals / 2)
218218 let quantityofEnterAssetID = fraction(args3, pmt1.amount, pow(10, 0, bothassetsdecimals, 0, 0, CEILING))
219219 let quantityofLPToken1 = pow((fraction(pmt1.amount, 1, pow(10, 0, decimals, 0, 0, CEILING)) * fraction(pmt2.amount, 1, pow(10, 0, 6, 0, 0, CEILING))), 0, 5, 1, sharedecimals, DOWN)
220220 let XTNHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID))) {
221221 case a: Int =>
222222 a
223223 case _ =>
224224 0
225225 }
226226 let NewXTNHoldingInPair = (XTNHoldingInPair + pmt2.amount)
227227 let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID)) {
228228 case a: Int =>
229229 a
230230 case _ =>
231231 0
232232 }
233233 let NewAssetHoldingInPair = (AssetHoldingInPair + pmt1.amount)
234234 let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
235235 case a: Int =>
236236 a
237237 case _ =>
238238 0
239239 }
240240 let NewLPTokenIssued = (LPTokenIssued + quantityofLPToken1)
241241 if ((checkpairisavailableornot != EnterAssetID))
242242 then throw("Pair is not available in Whitelisted Asset.")
243243 else if ((EnterAssetID == toBase58String(XTNAssetID)))
244244 then throw("Input can Never be a XTN AssetID. Enter Whitelisted AssetID in input as well as in payment[1] & Attach XTN as an attachment Token in payment[2].")
245245 else if ((size(i.payments) != 2))
246246 then throw("Two attached assets expected as payment in 50%-50%. Kindly Attach payment1 = Token you want to add for Liquidity & payment2 = Equivalent Amount of XTN Token.")
247247 else if ((pmt1.assetId == XTNAssetID))
248248 then throw("You Attached XTN asset in payment[1], please attach only whitelisted Token in payment[1] along with XTN in payment[2].")
249249 else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
250250 then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
251251 else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
252252 then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
253253 else if ((pmt2.assetId != XTNAssetID))
254254 then throw("Wrong Asset Attached in payments[2], Please attach payment[1] = Liquidity Token & payment[2] = XTN Token.")
255255 else if ((5000000 > pmt2.amount))
256256 then throw("please attach atleast 5 XTN in payment[2] & Equivalent worth of Token in payment[1]")
257257 else if ((pmt2.amount != quantityofEnterAssetID))
258258 then throw((((((("Attached payment[2] qty is not matching as per attached payment[1].payment[2] must be as int [" + toString(quantityofEnterAssetID)) + "] or ") + toString(fraction(quantityofEnterAssetID, 1, 1000000))) + ".") + takeRight(toString(quantityofEnterAssetID), 6)) + " XTN."))
259259 else if ((1 > quantityofLPToken1))
260260 then throw((("LP Token Outcome is going below " + toString(sharedecimals)) + " Decimals. Please Attach min. 1 LP token or 5 XTN Atleast."))
261261 else [IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), NewXTNHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), Reissue(ReissueassetId, quantityofLPToken1, true), ScriptTransfer(i.caller, quantityofLPToken1, ReissueassetId)]
262262 }
263263
264264
265265
266266 @Callable(i)
267267 func RemoveLiquidity (EnterAssetID) = {
268268 let calleraddress = toBase58String(i.caller.bytes)
269269 let pmt = if ((size(i.payments) == 1))
270270 then i.payments[0]
271271 else throw("No payment attached, Please Attach LP Token as payment[1].")
272272 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
273273 let ReissueableassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or not Generated."))
274274 let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
275275 let decimals = decimalsinfo.decimals
276276 let bothassetsdecimals = (6 + decimals)
277277 let sharedecimals = (bothassetsdecimals / 2)
278278 let CheckTotalLPAmount = getIntegerValue(this, ("Total_LP_" + EnterAssetID))
279279 let UserLPPercentage = pow(fraction(pmt.amount, pow(10, 0, 8, 0, 0, CEILING), CheckTotalLPAmount), 6, 1, 0, 6, CEILING)
280280 let CheckXTNBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)))
281281 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID))
282282 let UserLPWorthXTN = fraction(CheckXTNBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
283283 let UserLPWorthAsset = fraction(CheckAssetBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
284284 let XTNHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID))) {
285285 case a: Int =>
286286 a
287287 case _ =>
288288 0
289289 }
290290 let NewXTNHoldingInPair = (XTNHoldingInPair - UserLPWorthXTN)
291291 let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID)) {
292292 case a: Int =>
293293 a
294294 case _ =>
295295 0
296296 }
297297 let NewAssetHoldingInPair = (AssetHoldingInPair - UserLPWorthAsset)
298298 let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
299299 case a: Int =>
300300 a
301301 case _ =>
302302 0
303303 }
304304 let NewLPTokenIssued = (LPTokenIssued - pmt.amount)
305305 if ((checkpairisavailableornot != EnterAssetID))
306306 then throw("Pair is not available in Whitelist.")
307307 else if ((fromBase58String(EnterAssetID) == XTNAssetID))
308308 then throw("Don't choose XTN AssetID as Input, Only Whitelisted Asset as Input String & Attach LP Tokens as payment[1]")
309309 else if ((pmt.assetId != ReissueableassetId))
310310 then throw("Wrong Asset is attached in payment[1] or LP Token Not Found or Missing.")
311311 else if ((1 > UserLPPercentage))
312312 then throw("Your LP Token amount % is very low to convert.")
313313 else if ((1 > UserLPWorthXTN))
314314 then throw("Your LP Token conversion amount is very low to convert or less than 0.000001 XTN.")
315315 else if ((1 > UserLPWorthAsset))
316316 then throw("Your LP Token conversion amount is very low to convert or less than fraction value of Token.")
317317 else [IntegerEntry("Withdraw_LP_Percentage", UserLPPercentage), Burn(ReissueableassetId, pmt.amount), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(XTNAssetID)), NewXTNHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(XTNAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), ScriptTransfer(i.caller, UserLPWorthXTN, XTNAssetID), ScriptTransfer(i.caller, UserLPWorthAsset, fromBase58String(EnterAssetID))]
318318 }
319319
320320
321321 @Verifier(tx)
322322 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
323323

github/deemru/w8io/169f3d6 
51.58 ms