tx · 1QNeTeHCe1pdRCVb56tJpoiDN3MKCAakP3JSWn1zBvU

3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5:  -0.01600000 Waves

2023.09.19 15:05 [2762247] smart account 3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5 > SELF 0.00000000 Waves

{ "type": 13, "id": "1QNeTeHCe1pdRCVb56tJpoiDN3MKCAakP3JSWn1zBvU", "fee": 1600000, "feeAssetId": null, "timestamp": 1695125144081, "version": 2, "chainId": 84, "sender": "3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5", "senderPublicKey": "2LmNyaN5YAXdg9C5vsXcTLU66hsW2KUNPsN7KcHBYhUo", "proofs": [ "3pe4uqh753opb3Pw5H7iCxB15jQJrXuekd85NkWu73hub7iGCtxEG4LHQCFKuJ2dpxhFQnYwgfDchm1P4AsRbVrt" ], "script": "base64:BgIhCAISBAoCCAESAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIAgALVVNEQ0Fzc2V0SUQBIERHMcoh3/bynCbIVv74Z6l9nvez8AyJBUgJkDUU6U3/ABFDb2xsZWN0RmVlQWRkcmVzcwkApwgBASBSg9mgi9eQkjsz5eBARHIbc7Hg/F4fmB0sxZ6ySMfiIAYBaQEMUmVnaXN0ZXJQYWlyAgxFbnRlckFzc2V0SUQEZGF5cwQEcG10MQkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABARwbXQyCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEECmN1cnJlbnRLZXkJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQFV0FWRVMJAQEhAQkBCWlzRGVmaW5lZAEIBQRwbXQyB2Fzc2V0SWQECWZldGNocGFpcgkAnQgCBQR0aGlzCQCsAgICCFBhaXJfVVZfBQxFbnRlckFzc2V0SUQEDWFzc2V0aW5mb3BtdDIJANkEAQUMRW50ZXJBc3NldElEBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQxFbnRlckFzc2V0SUQJAKwCAgkArAICAgZBc3NldCAFDEVudGVyQXNzZXRJRAIOIGRvZXNuJ3QgZXhpc3QDCQAAAgUJZmV0Y2hwYWlyBQxFbnRlckFzc2V0SUQJAAIBAhtQYWlyIEFscmVhZHkgRXhpc3QgaW4gTGlzdC4DCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAIJAAIBAnJUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkIGFzIHBheW1lbnQuIEtpbmRseSBBdHRhY2ggcGF5bWVudDEgPSBXQVZFUyBUb2tlbiAmIHBheW1lbnQyID0gVG9rZW4geW91IHdhbnQgdG8gTGlzdC4DCQEJaXNEZWZpbmVkAQgFBHBtdDEHYXNzZXRJZAkAAgECQkluY29ycmVjdCBhc3NldCBhdHRhY2hlZCBmb3IgQ29sbGF0ZXJhbCwgcGxlYXNlIGF0dGFjaCBXQVZFUyBvbmx5LgMJAQIhPQIIBQRwbXQxBmFtb3VudACAlOvcAwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgISWW91IGF0dGFjaGVkIG9ubHkgCQCkAwEJAGsDCAUEcG10MQZhbW91bnQAAQCAwtcvAgEuCQCkAwEJAGsDCAUEcG10MQZhbW91bnQAAQCAreIEAjkgV0FWRVMgZm9yIExpc3RpbmcgaW4gcGF5bWVudFsxXSwgcGxlYXNlIGF0dGFjaCAxMCBXQVZFUy4DCQECIT0CCAUEcG10Mgdhc3NldElkBQ1hc3NldGluZm9wbXQyCQACAQI8SW5wdXQgU3RyaW5nICYgQXR0YWNoZWQgQXNzZXRJRCBpbiBwYXltZW50MiBpcyBub3QgbWF0Y2hpbmcuAwkAAAIFBVdBVkVTBgkAAgECXVlvdSBBdHRhY2hlZCBXQVZFUyBBc3NldCBJRCBmb3IgTGlzdGluZywgcGxlYXNlIGF0dGFjaCBUb2tlbnMgWW91IHdhbnQgdG8gbGlzdCBpbiBwYXltZW50WzJdLgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICCFBhaXJfVVZfBQxFbnRlckFzc2V0SUQFDEVudGVyQXNzZXRJRAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAgxMaXN0aW5nX0ZlZV8FDEVudGVyQXNzZXRJRAgFBHBtdDEGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEUNvbGxlY3RGZWVBZGRyZXNzCAUEcG10MQZhbW91bnQFBHVuaXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQULVVNEQ0Fzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICE1RvdGFsX29mX1BhaXJfVHhuc18FDEVudGVyQXNzZXRJRAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAhlUb3RhbF9Td2FwX0ZlZV9Db2xsZWN0ZWRfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhlUb3RhbF9Td2FwX0ZlZV9Db2xsZWN0ZWRfBQxFbnRlckFzc2V0SUQAAAUDbmlsAWkBDElzc3VlTFBUb2tlbgEMRW50ZXJBc3NldElEBAthZG1pbnJpZ2h0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCD0xQX0FkbWluX1JpZ2h0cwJQTFAgQWRtaW4gUmlnaHRzIGFyZSBOb3QgSW5jbHVkZWQgaW50byBTbWFydCBDb250cmFjdC4gRGVwbG95IEFkbWluIFJpZ2h0cyBGaXJzdC4EDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAIkQXNzZXQgbm90IEZvdW5kIGluIFdoaXRlbGlzdGVkIFRva2VuBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQxFbnRlckFzc2V0SUQJAKwCAgkArAICAgZBc3NldCAFDEVudGVyQXNzZXRJRAIOIGRvZXNuJ3QgZXhpc3QEBG5hbWUIBQRpbmZvBG5hbWUECGRlY2ltYWxzCAUEaW5mbwhkZWNpbWFscwQKRmlyc3RMUFF0eQkAaAIAAQkAbAYACgAACQBrAwkAZAIFCGRlY2ltYWxzAAYAAQACAAAAAAUHQ0VJTElORwQHTFBpc3N1ZQkAwggFCQCsAgIJAKwCAgIDTFAtCQCvAgIFBG5hbWUACAIFLVVTREMJAKwCAgkArAICCQCsAgIJAKwCAgIDTFAtBQRuYW1lAgUtVVNEQwIuIGlzIGEgTGlxdWlkaXR5IFByb3ZpZGVyIFRva2VuIElzc3VlZCBBZ2FpbnN0IAUMRW50ZXJBc3NldElEBQpGaXJzdExQUXR5CQBrAwkAZAIFCGRlY2ltYWxzAAYAAQACBgQETFBpZAkAuAgBBQdMUGlzc3VlAwkBAiE9AgULYWRtaW5yaWdodHMFDWNhbGxlcmFkZHJlc3MJAAIBCQCsAgIJAKwCAgIuWW91ciBhcmUgbm90IGFsbG93ZGVkIHRvIElzc3VlIExQIFRva2VuLiBPbmx5IAULYWRtaW5yaWdodHMCGCBjYW4gaXNzdWUgdGhlIExQIFRva2VuLgMJAQIhPQIFGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFDEVudGVyQXNzZXRJRAkAAgECHlBhaXIgaXMgbm90IGF2YWlsYWJsZSBpbiBMaXN0LgkAzAgCBQdMUGlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIDTFBfBQxFbnRlckFzc2V0SUQJANgEAQUETFBpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAUKRmlyc3RMUFF0eQUDbmlsAWkBGFN3YXBBc3NldFRvVVNEQ1BhaXJFbnRyeQEMRW50ZXJBc3NldElEBA1jYWxsZXJhZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECNVdoaXRlbGlzdGVkIFRva2VuIGlzIHJlcXVpcmVkIGFzIEF0dGFjaGVkIHBheW1lbnRbMV0uBBljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90CQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAQQQ2hlY2tVU0RDQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAQRQ2hlY2tBc3NldEJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQEEG5ld2JhbGFuY2VvZlVTREMJAGsDBRBDaGVja1VTRENCYWxhbmNlBRFDaGVja0Fzc2V0QmFsYW5jZQkAZAIFEUNoZWNrQXNzZXRCYWxhbmNlCAUDcG10BmFtb3VudAQUcXVhbnRpdHlvZnByaWNlYXNzZXQJAGUCBRBDaGVja1VTRENCYWxhbmNlBRBuZXdiYWxhbmNlb2ZVU0RDBAdTd2FwRmVlAAMEEFN3YXBGZWV0b3JlY2VpdmUJAGkCCQBoAgUUcXVhbnRpdHlvZnByaWNlYXNzZXQFB1N3YXBGZWUA6AcEFHVzZXJiYWxhbmNldG9yZWNlaXZlCQBlAgkAZQIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BRBTd2FwRmVldG9yZWNlaXZlBRBTd2FwRmVldG9yZWNlaXZlBBlTdW11cG9mQXNzZXRUb1VTRENTd2FwRmVlBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQcTmV3U3VtdXBvZkFzc2V0VG9VU0RDU3dhcEZlZQkAZAIJAGQCBRlTdW11cG9mQXNzZXRUb1VTRENTd2FwRmVlBRBTd2FwRmVldG9yZWNlaXZlBRBTd2FwRmVldG9yZWNlaXZlBBFTdW11cEFzc2V0QmFsYW5jZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQBkAgURQ2hlY2tBc3NldEJhbGFuY2UIBQNwbXQGYW1vdW50BBBTdW11cFVTRENCYWxhbmNlBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEFU5ld1N1bXVwb2ZVU0RDQmFsYW5jZQkAZAIJAGUCBRBDaGVja1VTRENCYWxhbmNlBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUQU3dhcEZlZXRvcmVjZWl2ZQQEVE9QVAQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAhNUb3RhbF9vZl9QYWlyX1R4bnNfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEBk5ld1RQVAkAZAIFBFRPUFQAAQMJAAACBQxFbnRlckFzc2V0SUQJANgEAQULVVNEQ0Fzc2V0SUQJAAIBAoYBSW5wdXQgY2FuIE5ldmVyIGJlIGEgVVNEQyBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0ICYgQXR0YWNoIFdoaXRlbGlzdGVkIEFzc2V0IGFzIGFuIGF0dGFjaG1lbnQgVG9rZW4gaW4gcGF5bWVudFsxXS4DCQECIT0CBRljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90BQxFbnRlckFzc2V0SUQJAAIBAitQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAIIBQNwbXQHYXNzZXRJZAULVVNEQ0Fzc2V0SUQJAAIBAlNZb3UgY2FuJ3QgQXR0YWNoIFVTREMgYXMgYW4gQXR0YWNoZWQgUGF5bWVudC4gT25seSBXaGl0ZWxpc3RlZCBUb2tlbnMgYXJlIGFjY2VwdGVkLgMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQxFbnRlckFzc2V0SUQJAAIBCQCsAgICMEluY29ycmVjdCBhc3NldCBhdHRhY2hlZCwgcGxlYXNlIGF0dGFjaCBvciBzZW5kIAUMRW50ZXJBc3NldElEAwkAAAIFEENoZWNrVVNEQ0JhbGFuY2UAAAkAAgECZVN3YXAgUGFpciBOZWVkIHRvIEFkZCBMaXF1aWRpdHkgZmlyc3QgaW50byBQb29sLiBPbmx5IEFmdGVyIHRoYXQgUGFpciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgU3dhcHBpbmcuAwkAAAIFEUNoZWNrQXNzZXRCYWxhbmNlAAAJAAIBAmVTd2FwIFBhaXIgTmVlZCB0byBBZGQgTGlxdWlkaXR5IGZpcnN0IGludG8gUG9vbC4gT25seSBBZnRlciB0aGF0IFBhaXIgd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIFN3YXBwaW5nLgMJAGYCAKCNBgUUcXVhbnRpdHlvZnByaWNlYXNzZXQJAAIBCQCsAgIJAKwCAgI0WW91ciBBdHRhY2hlZCBBc3NldCBBbW91bnQgaXMgdmVyeSBsb3cuIEF0dGFjaCBNb3JlIAUMRW50ZXJBc3NldElEAjogVG9rZW5zIHRvIENsYWltIHRoZSBtaW5pbXVtIEFtb3VudCBvZiAwLjEgZG9sbGFyIGF0bGVhc3QuAwkAZgIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BRBDaGVja1VTRENCYWxhbmNlCQACAQkArAICCQCsAgICHVBvb2wgT25seSBoYXMgYSBMaXF1aWRpdHkgb2YgCQCkAwEJAGkCBRBDaGVja1VTRENCYWxhbmNlCQBsBgAKAAAABgAAAAAFB0NFSUxJTkcCHyBVU0RDLiBBZGQgTGlxdWlkaXR5IGludG8gUG9vbC4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAUcTmV3U3VtdXBvZkFzc2V0VG9VU0RDU3dhcEZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhNUb3RhbF9vZl9QYWlyX1R4bnNfBQxFbnRlckFzc2V0SUQFBk5ld1RQVAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQULVVNEQ0Fzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAUWTmV3U3VtdXBvZkFzc2V0QmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAUVTmV3U3VtdXBvZlVTRENCYWxhbmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUUdXNlcmJhbGFuY2V0b3JlY2VpdmUFC1VTRENBc3NldElECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEUNvbGxlY3RGZWVBZGRyZXNzBRBTd2FwRmVldG9yZWNlaXZlBQtVU0RDQXNzZXRJRAUDbmlsAWkBGFN3YXBVU0RDVG9Bc3NldFBhaXJFbnRyeQEMRW50ZXJBc3NldElEBA1jYWxsZXJhZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgEJAKwCAgkArAICAgVPbmx5IAkA2AQBBQtVU0RDQXNzZXRJRAIyIFVTREMgVG9rZW4gaXMgcmVxdWlyZWQgYXMgYW4gQXR0YWNoZWQgcGF5bWVudFsxXS4EEENoZWNrVVNEQ0JhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQEEUNoZWNrQXNzZXRCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBBFuZXdiYWxhbmNlb2ZBc3NldAkAawMFEENoZWNrVVNEQ0JhbGFuY2UFEUNoZWNrQXNzZXRCYWxhbmNlCQBkAgUQQ2hlY2tVU0RDQmFsYW5jZQgFA3BtdAZhbW91bnQEFHF1YW50aXR5b2ZwcmljZWFzc2V0CQBlAgURQ2hlY2tBc3NldEJhbGFuY2UFEW5ld2JhbGFuY2VvZkFzc2V0BBljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90CQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAQHU3dhcEZlZQADBBBTd2FwRmVldG9yZWNlaXZlCQBpAgkAaAIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BQdTd2FwRmVlAOgHBBR1c2VyYmFsYW5jZXRvcmVjZWl2ZQkAZQIJAGUCBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUQU3dhcEZlZXRvcmVjZWl2ZQUQU3dhcEZlZXRvcmVjZWl2ZQQZU3VtdXBvZlVTRENUb0Fzc2V0U3dhcEZlZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQcTmV3U3VtdXBvZlVTRENUb0Fzc2V0U3dhcEZlZQkAZAIJAGQCBRlTdW11cG9mVVNEQ1RvQXNzZXRTd2FwRmVlBRBTd2FwRmVldG9yZWNlaXZlBRBTd2FwRmVldG9yZWNlaXZlBBFTdW11cEFzc2V0QmFsYW5jZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQBkAgkAZQIFEUNoZWNrQXNzZXRCYWxhbmNlBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUQU3dhcEZlZXRvcmVjZWl2ZQQQU3VtdXBVU0RDQmFsYW5jZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBVOZXdTdW11cG9mVVNEQ0JhbGFuY2UJAGQCBRBDaGVja1VTRENCYWxhbmNlCAUDcG10BmFtb3VudAQEVE9QVAQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAhNUb3RhbF9vZl9QYWlyX1R4bnNfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEBk5ld1RQVAkAZAIFBFRPUFQAAQMJAQIhPQIFGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFDEVudGVyQXNzZXRJRAkAAgECK1BhaXIgaXMgbm90IGF2YWlsYWJsZSBpbiBXaGl0ZWxpc3RlZCBBc3NldC4DCQAAAgUMRW50ZXJBc3NldElECQDYBAEFC1VTRENBc3NldElECQACAQJ5SW5wdXQgY2FuIE5ldmVyIGJlIGEgVVNEQyBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0ICYgQXR0YWNoIFVTREMgYXMgYW4gYXR0YWNobWVudCBUb2tlbiBpbiBwYXltZW50WzFdLgMJAQIhPQIIBQNwbXQHYXNzZXRJZAULVVNEQ0Fzc2V0SUQJAAIBAn5Zb3UgY2FuIEF0dGFjaCBVU0RDIGFzIGFuIEF0dGFjaGVkIFBheW1lbnRbMV0gdG8gU3dhcCBVU0RDIFRvIFJlcXVpcmVkIFRva2VuLiBBbnkgb3RoZXIgYXNzZXQgZWxzZSB0aGFuIFVTREMgd2lsbCBiZSByZWplY3RlZC4DCQBmAgCgjQYIBQNwbXQGYW1vdW50CQACAQJbWW91ciBBdHRhY2hlZCBVU0RDIEFtb3VudCBpcyB2ZXJ5IGxvdy4gQXR0YWNoIEF0bGVhc3QgMC4xIFVTREMgdG8gQ2xhaW0gdGhlIG1pbmltdW0gVG9rZW5zLgMJAAACBRBDaGVja1VTRENCYWxhbmNlAAAJAAIBAmVTd2FwIFBhaXIgTmVlZCB0byBBZGQgTGlxdWlkaXR5IGZpcnN0IGludG8gUG9vbC4gT25seSBBZnRlciB0aGF0IFBhaXIgd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIFN3YXBwaW5nLgMJAAACBRFDaGVja0Fzc2V0QmFsYW5jZQAACQACAQJlU3dhcCBQYWlyIE5lZWQgdG8gQWRkIExpcXVpZGl0eSBmaXJzdCBpbnRvIFBvb2wuIE9ubHkgQWZ0ZXIgdGhhdCBQYWlyIHdpbGwgYmUgYWN0aXZhdGVkIGZvciBTd2FwcGluZy4DCQBmAgUUcXVhbnRpdHlvZnByaWNlYXNzZXQFEUNoZWNrQXNzZXRCYWxhbmNlCQACAQkArAICCQCsAgICHVBvb2wgT25seSBoYXMgYSBMaXF1aWRpdHkgb2YgCQCkAwEFEUNoZWNrQXNzZXRCYWxhbmNlAiEgVG9rZW5zLiBBZGQgTGlxdWlkaXR5IGludG8gUG9vbC4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIZVG90YWxfU3dhcF9GZWVfQ29sbGVjdGVkXwUMRW50ZXJBc3NldElEBRxOZXdTdW11cG9mVVNEQ1RvQXNzZXRTd2FwRmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICE1RvdGFsX29mX1BhaXJfVHhuc18FDEVudGVyQXNzZXRJRAUGTmV3VFBUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBRZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEBRVOZXdTdW11cG9mVVNEQ0JhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR1c2VyYmFsYW5jZXRvcmVjZWl2ZQkA2QQBBQxFbnRlckFzc2V0SUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwURQ29sbGVjdEZlZUFkZHJlc3MFEFN3YXBGZWV0b3JlY2VpdmUJANkEAQUMRW50ZXJBc3NldElEBQNuaWwBaQEMQWRkTGlxdWlkaXR5AQxFbnRlckFzc2V0SUQEDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQEcG10MQkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABARwbXQyCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QJAJ0IAgUEdGhpcwkArAICAghQYWlyX1VWXwUMRW50ZXJBc3NldElEBA5SZWlzc3VlYXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICAgNMUF8FDEVudGVyQXNzZXRJRAIsTFAgVG9rZW4gaXMgTWlzc2luZyBvciBNYXkgYmUgbm90IEdlbmVyYXRlZC4EEENoZWNrVVNEQ0JhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQEEUNoZWNrQXNzZXRCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBAxkZWNpbWFsc2luZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFDEVudGVyQXNzZXRJRAkArAICCQCsAgICBkFzc2V0IAUMRW50ZXJBc3NldElEAg4gZG9lc24ndCBleGlzdAQIZGVjaW1hbHMIBQxkZWNpbWFsc2luZm8IZGVjaW1hbHMEBGFyZzEFEENoZWNrVVNEQ0JhbGFuY2UEBGFyZzIFEUNoZWNrQXNzZXRCYWxhbmNlBAVhcmdzMwkAbAYJAGgCCQBpAgkAaAIFBGFyZzEAwIQ9BQRhcmcyCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUHQ0VJTElORwAAAAEAAAAABQdDRUlMSU5HBBJib3RoYXNzZXRzZGVjaW1hbHMJAGQCAAYFCGRlY2ltYWxzBA1zaGFyZWRlY2ltYWxzCQBpAgUSYm90aGFzc2V0c2RlY2ltYWxzAAIEFnF1YW50aXR5b2ZFbnRlckFzc2V0SUQJAGsDBQVhcmdzMwgFBHBtdDEGYW1vdW50CQBsBgAKAAAFEmJvdGhhc3NldHNkZWNpbWFscwAAAAAFB0NFSUxJTkcEEnF1YW50aXR5b2ZMUFRva2VuMQkAbAYJAGgCCQBrAwgFBHBtdDEGYW1vdW50AAEJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQdDRUlMSU5HCQBrAwgFBHBtdDIGYW1vdW50AAEJAGwGAAoAAAAGAAAAAAUHQ0VJTElORwAAAAUAAQUNc2hhcmVkZWNpbWFscwUERE9XTgQRVVNEQ0hvbGRpbmdJblBhaXIEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQUTmV3VVNEQ0hvbGRpbmdJblBhaXIJAGQCBRFVU0RDSG9sZGluZ0luUGFpcggFBHBtdDIGYW1vdW50BBJBc3NldEhvbGRpbmdJblBhaXIEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQULVVNEQ0Fzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQVTmV3QXNzZXRIb2xkaW5nSW5QYWlyCQBkAgUSQXNzZXRIb2xkaW5nSW5QYWlyCAUEcG10MQZhbW91bnQEDUxQVG9rZW5Jc3N1ZWQEByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgIJVG90YWxfTFBfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEEE5ld0xQVG9rZW5Jc3N1ZWQJAGQCBQ1MUFRva2VuSXNzdWVkBRJxdWFudGl0eW9mTFBUb2tlbjEDCQECIT0CBRljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90BQxFbnRlckFzc2V0SUQJAAIBAitQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAIFDEVudGVyQXNzZXRJRAkA2AQBBQtVU0RDQXNzZXRJRAkAAgECkgFJbnB1dCBjYW4gTmV2ZXIgYmUgYSBVU0RDIEFzc2V0SUQuIEVudGVyIFdoaXRlbGlzdGVkIEFzc2V0SUQgaW4gaW5wdXQgYXMgd2VsbCBhcyBpbiBwYXltZW50WzFdICYgQXR0YWNoIFVTREMgYXMgYW4gYXR0YWNobWVudCBUb2tlbiBpbiBwYXltZW50WzJdLgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECngFUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkIGFzIHBheW1lbnQgaW4gNTAlLTUwJS4gS2luZGx5IEF0dGFjaCBwYXltZW50MSA9IFRva2VuIHlvdSB3YW50IHRvIGFkZCBmb3IgTGlxdWlkaXR5ICYgcGF5bWVudDIgPSBFcXVpdmFsZW50IEFtb3VudCBvZiBVU0RDIFRva2VuLgMJAAACCAUEcG10MQdhc3NldElkBQtVU0RDQXNzZXRJRAkAAgECeFlvdSBBdHRhY2hlZCBVU0RDIGFzc2V0IGluIHBheW1lbnRbMV0sIHBsZWFzZSBhdHRhY2ggb25seSB3aGl0ZWxpc3RlZCBUb2tlbiBpbiBwYXltZW50WzFdIGFsb25nIHdpdGggVVNEQyBpbiBwYXltZW50WzJdLgMJAQIhPQIIBQRwbXQxB2Fzc2V0SWQJANkEAQUMRW50ZXJBc3NldElECQACAQJrSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkIGZvciBMaXF1aWRpdHkgaW4gcGF5bWVudFsxXSwgcGxlYXNlIGF0dGFjaCBTdHJpbmcgQXNzZXQgb3IgV2hpdGVsaXN0ZWQgVG9rZW4gb25seS4DCQECIT0CCAUEcG10MQdhc3NldElkCQDZBAEFDEVudGVyQXNzZXRJRAkAAgECa0luY29ycmVjdCBhc3NldCBhdHRhY2hlZCBmb3IgTGlxdWlkaXR5IGluIHBheW1lbnRbMV0sIHBsZWFzZSBhdHRhY2ggU3RyaW5nIEFzc2V0IG9yIFdoaXRlbGlzdGVkIFRva2VuIG9ubHkuAwkBAiE9AggFBHBtdDIHYXNzZXRJZAULVVNEQ0Fzc2V0SUQJAAIBAmpXcm9uZyBBc3NldCBBdHRhY2hlZCBpbiBwYXltZW50c1syXSwgUGxlYXNlIGF0dGFjaCBwYXltZW50WzFdID0gTGlxdWlkaXR5IFRva2VuICYgcGF5bWVudFsyXSA9IFVTREMgVG9rZW4uAwkAZgIAwJaxAggFBHBtdDIGYW1vdW50CQACAQJUcGxlYXNlIGF0dGFjaCBhdGxlYXN0IDUgVVNEQyBpbiBwYXltZW50WzJdICYgRXF1aXZhbGVudCB3b3J0aCBvZiBUb2tlbiBpbiBwYXltZW50WzFdAwkBAiE9AggFBHBtdDIGYW1vdW50BRZxdWFudGl0eW9mRW50ZXJBc3NldElECQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgJeQXR0YWNoZWQgcGF5bWVudFsyXSBxdHkgaXMgbm90IG1hdGNoaW5nIGFzIHBlciBhdHRhY2hlZCBwYXltZW50WzFdLnBheW1lbnRbMl0gbXVzdCBiZSBhcyBpbnQgWwkApAMBBRZxdWFudGl0eW9mRW50ZXJBc3NldElEAgVdIG9yIAkApAMBCQBrAwUWcXVhbnRpdHlvZkVudGVyQXNzZXRJRAABAMCEPQIBLgkAsgICCQCkAwEFFnF1YW50aXR5b2ZFbnRlckFzc2V0SUQABgIGIFVTREMuAwkAZgIAAQUScXVhbnRpdHlvZkxQVG9rZW4xCQACAQkArAICCQCsAgICIExQIFRva2VuIE91dGNvbWUgaXMgZ29pbmcgYmVsb3cgCQCkAwEFDXNoYXJlZGVjaW1hbHMCOyBEZWNpbWFscy4gUGxlYXNlIEF0dGFjaCBtaW4uIDEgTFAgdG9rZW4gb3IgNSBVU0RDIEF0bGVhc3QuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEBRROZXdVU0RDSG9sZGluZ0luUGFpcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQULVVNEQ0Fzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAUVTmV3QXNzZXRIb2xkaW5nSW5QYWlyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICCVRvdGFsX0xQXwUMRW50ZXJBc3NldElEBRBOZXdMUFRva2VuSXNzdWVkCQDMCAIJAQdSZWlzc3VlAwUOUmVpc3N1ZWFzc2V0SWQFEnF1YW50aXR5b2ZMUFRva2VuMQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRJxdWFudGl0eW9mTFBUb2tlbjEFDlJlaXNzdWVhc3NldElkBQNuaWwBaQEPUmVtb3ZlTGlxdWlkaXR5AQxFbnRlckFzc2V0SUQEDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQI6Tm8gcGF5bWVudCBhdHRhY2hlZCwgUGxlYXNlIEF0dGFjaCBMUCBUb2tlbiBhcyBwYXltZW50WzFdLgQZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkAnQgCBQR0aGlzCQCsAgICCFBhaXJfVVZfBQxFbnRlckFzc2V0SUQEElJlaXNzdWVhYmxlYXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICAgNMUF8FDEVudGVyQXNzZXRJRAIlTFAgVG9rZW4gaXMgTWlzc2luZyBvciBub3QgR2VuZXJhdGVkLgQMZGVjaW1hbHNpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQxFbnRlckFzc2V0SUQJAKwCAgkArAICAgZBc3NldCAFDEVudGVyQXNzZXRJRAIOIGRvZXNuJ3QgZXhpc3QECGRlY2ltYWxzCAUMZGVjaW1hbHNpbmZvCGRlY2ltYWxzBBJib3RoYXNzZXRzZGVjaW1hbHMJAGQCAAYFCGRlY2ltYWxzBA1zaGFyZWRlY2ltYWxzCQBpAgUSYm90aGFzc2V0c2RlY2ltYWxzAAIEEkNoZWNrVG90YWxMUEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAQQVXNlckxQUGVyY2VudGFnZQkAbAYJAGsDCAUDcG10BmFtb3VudAkAbAYACgAAAAgAAAAABQdDRUlMSU5HBRJDaGVja1RvdGFsTFBBbW91bnQABgABAAAABgUHQ0VJTElORwQQQ2hlY2tVU0RDQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAQRQ2hlY2tBc3NldEJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQED1VzZXJMUFdvcnRoVVNEQwkAawMFEENoZWNrVVNEQ0JhbGFuY2UFEFVzZXJMUFBlcmNlbnRhZ2UJAGwGAAoAAAAIAAAAAAUHQ0VJTElORwQQVXNlckxQV29ydGhBc3NldAkAawMFEUNoZWNrQXNzZXRCYWxhbmNlBRBVc2VyTFBQZXJjZW50YWdlCQBsBgAKAAAACAAAAAAFB0NFSUxJTkcEEVVTRENIb2xkaW5nSW5QYWlyBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEFE5ld1VTRENIb2xkaW5nSW5QYWlyCQBlAgURVVNEQ0hvbGRpbmdJblBhaXIFD1VzZXJMUFdvcnRoVVNEQwQSQXNzZXRIb2xkaW5nSW5QYWlyBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEFU5ld0Fzc2V0SG9sZGluZ0luUGFpcgkAZQIFEkFzc2V0SG9sZGluZ0luUGFpcgUQVXNlckxQV29ydGhBc3NldAQNTFBUb2tlbklzc3VlZAQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQQTmV3TFBUb2tlbklzc3VlZAkAZQIFDUxQVG9rZW5Jc3N1ZWQIBQNwbXQGYW1vdW50AwkBAiE9AgUZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAUMRW50ZXJBc3NldElECQACAQIjUGFpciBpcyBub3QgYXZhaWxhYmxlIGluIFdoaXRlbGlzdC4DCQAAAgkA2QQBBQxFbnRlckFzc2V0SUQFC1VTRENBc3NldElECQACAQJrRG9uJ3QgY2hvb3NlIFVTREMgQXNzZXRJRCBhcyBJbnB1dCwgT25seSBXaGl0ZWxpc3RlZCBBc3NldCBhcyBJbnB1dCBTdHJpbmcgJiBBdHRhY2ggTFAgVG9rZW5zIGFzIHBheW1lbnRbMV0DCQECIT0CCAUDcG10B2Fzc2V0SWQFElJlaXNzdWVhYmxlYXNzZXRJZAkAAgECR1dyb25nIEFzc2V0IGlzIGF0dGFjaGVkIGluIHBheW1lbnRbMV0gb3IgTFAgVG9rZW4gTm90IEZvdW5kIG9yIE1pc3NpbmcuAwkAZgIAAQUQVXNlckxQUGVyY2VudGFnZQkAAgECLllvdXIgTFAgVG9rZW4gYW1vdW50ICUgaXMgdmVyeSBsb3cgdG8gY29udmVydC4DCQBmAgABBQ9Vc2VyTFBXb3J0aFVTREMJAAIBAlJZb3VyIExQIFRva2VuIGNvbnZlcnNpb24gYW1vdW50IGlzIHZlcnkgbG93IHRvIGNvbnZlcnQgb3IgbGVzcyB0aGFuIDAuMDAwMDAxIFVTREMuAwkAZgIAAQUQVXNlckxQV29ydGhBc3NldAkAAgECXFlvdXIgTFAgVG9rZW4gY29udmVyc2lvbiBhbW91bnQgaXMgdmVyeSBsb3cgdG8gY29udmVydCBvciBsZXNzIHRoYW4gZnJhY3Rpb24gdmFsdWUgb2YgVG9rZW4uCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhZXaXRoZHJhd19MUF9QZXJjZW50YWdlBRBVc2VyTFBQZXJjZW50YWdlCQDMCAIJAQRCdXJuAgUSUmVpc3N1ZWFibGVhc3NldElkCAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAUQTmV3TFBUb2tlbklzc3VlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAUUTmV3VVNEQ0hvbGRpbmdJblBhaXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQFFU5ld0Fzc2V0SG9sZGluZ0luUGFpcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFD1VzZXJMUFdvcnRoVVNEQwULVVNEQ0Fzc2V0SUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRBVc2VyTFBXb3J0aEFzc2V0CQDZBAEFDEVudGVyQXNzZXRJRAUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlefpJIqw=", "height": 2762247, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EXpwAcD8Lpzd36xHAmgjbiYmu7xX8S49WyYcpuwH46YS Next: HMuYqsQfg7QGBaBZshNxPRzoR6v4vfmPqKRh3dqWArxB Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let USDCAssetID = base58'5bXgvADuVoFdhtF5uKZAEiVdAo7ZCWw151L4yyf1PiES'
5+
6+let CollectFeeAddress = addressFromPublicKey(base58'6Z73KxcX3sugpiStpSRXxKxTmWqCaLVwFeM6kwyiKVDR')
7+
8+@Callable(i)
9+func RegisterPair (EnterAssetID,days) = {
10+ let pmt1 = value(i.payments[0])
11+ let pmt2 = value(i.payments[1])
12+ let currentKey = toBase58String(i.caller.bytes)
13+ let WAVES = !(isDefined(pmt2.assetId))
14+ let fetchpair = getString(this, ("Pair_UV_" + EnterAssetID))
15+ let assetinfopmt2 = fromBase58String(EnterAssetID)
16+ let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
17+ if ((fetchpair == EnterAssetID))
18+ then throw("Pair Already Exist in List.")
19+ else if ((size(i.payments) != 2))
20+ then throw("Two attached assets expected as payment. Kindly Attach payment1 = WAVES Token & payment2 = Token you want to List.")
21+ else if (isDefined(pmt1.assetId))
22+ then throw("Incorrect asset attached for Collateral, please attach WAVES only.")
23+ else if ((pmt1.amount != 1000000000))
24+ 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."))
25+ else if ((pmt2.assetId != assetinfopmt2))
26+ then throw("Input String & Attached AssetID in payment2 is not matching.")
27+ else if ((WAVES == true))
28+ then throw("You Attached WAVES Asset ID for Listing, please attach Tokens You want to list in payment[2].")
29+ else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), ScriptTransfer(CollectFeeAddress, pmt1.amount, unit), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0)]
30+ }
31+
432
533
634 @Callable(i)
7-func RegisterPairForVoting (assetId) = {
8- let readassetinfo = assetInfo(fromBase58String(assetId))
35+func IssueLPToken (EnterAssetID) = {
36+ let adminrights = valueOrErrorMessage(getString(this, "LP_Admin_Rights"), "LP Admin Rights are Not Included into Smart Contract. Deploy Admin Rights First.")
37+ let calleraddress = toBase58String(i.caller.bytes)
38+ let checkpairisavailableornot = valueOrErrorMessage(getString(this, ("Pair_UV_" + EnterAssetID)), "Asset not Found in Whitelisted Token")
39+ let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
40+ let name = info.name
41+ let decimals = info.decimals
42+ let FirstLPQty = (1 * pow(10, 0, fraction((decimals + 6), 1, 2), 0, 0, CEILING))
43+ let LPissue = Issue((("LP-" + take(name, 8)) + "-USDC"), (((("LP-" + name) + "-USDC") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), FirstLPQty, fraction((decimals + 6), 1, 2), true)
44+ let LPid = calculateAssetId(LPissue)
45+ if ((adminrights != calleraddress))
46+ then throw((("Your are not allowded to Issue LP Token. Only " + adminrights) + " can issue the LP Token."))
47+ else if ((checkpairisavailableornot != EnterAssetID))
48+ then throw("Pair is not available in List.")
49+ else [LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), FirstLPQty)]
50+ }
51+
52+
53+
54+@Callable(i)
55+func SwapAssetToUSDCPairEntry (EnterAssetID) = {
56+ let calleraddress = toBase58String(i.caller.bytes)
57+ let pmt = if ((size(i.payments) == 1))
58+ then i.payments[0]
59+ else throw("Whitelisted Token is required as Attached payment[1].")
60+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
61+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
62+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
63+ let newbalanceofUSDC = fraction(CheckUSDCBalance, CheckAssetBalance, (CheckAssetBalance + pmt.amount))
64+ let quantityofpriceasset = (CheckUSDCBalance - newbalanceofUSDC)
65+ let SwapFee = 3
66+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
67+ let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
68+ let SumupofAssetToUSDCSwapFee = match getInteger(this, ((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
69+ case a: Int =>
70+ a
71+ case _ =>
72+ 0
73+ }
74+ let NewSumupofAssetToUSDCSwapFee = ((SumupofAssetToUSDCSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
75+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
76+ case a: Int =>
77+ a
78+ case _ =>
79+ 0
80+ }
81+ let NewSumupofAssetBalance = (CheckAssetBalance + pmt.amount)
82+ let SumupUSDCBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
83+ case a: Int =>
84+ a
85+ case _ =>
86+ 0
87+ }
88+ let NewSumupofUSDCBalance = ((CheckUSDCBalance - quantityofpriceasset) + SwapFeetoreceive)
89+ let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
90+ case a: Int =>
91+ a
92+ case _ =>
93+ 0
94+ }
95+ let NewTPT = (TOPT + 1)
96+ if ((EnterAssetID == toBase58String(USDCAssetID)))
97+ then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input & Attach Whitelisted Asset as an attachment Token in payment[1].")
98+ else if ((checkpairisavailableornot != EnterAssetID))
99+ then throw("Pair is not available in Whitelisted Asset.")
100+ else if ((pmt.assetId == USDCAssetID))
101+ then throw("You can't Attach USDC as an Attached Payment. Only Whitelisted Tokens are accepted.")
102+ else if ((pmt.assetId != fromBase58String(EnterAssetID)))
103+ then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
104+ else if ((CheckUSDCBalance == 0))
105+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
106+ else if ((CheckAssetBalance == 0))
107+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
108+ else if ((100000 > quantityofpriceasset))
109+ then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 0.1 dollar atleast."))
110+ else if ((quantityofpriceasset > CheckUSDCBalance))
111+ then throw((("Pool Only has a Liquidity of " + toString((CheckUSDCBalance / pow(10, 0, 6, 0, 0, CEILING)))) + " USDC. Add Liquidity into Pool."))
112+ else [IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewSumupofAssetToUSDCSwapFee), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), NewTPT), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewSumupofUSDCBalance), ScriptTransfer(i.caller, userbalancetoreceive, USDCAssetID), ScriptTransfer(CollectFeeAddress, SwapFeetoreceive, USDCAssetID)]
113+ }
114+
115+
116+
117+@Callable(i)
118+func SwapUSDCToAssetPairEntry (EnterAssetID) = {
119+ let calleraddress = toBase58String(i.caller.bytes)
120+ let pmt = if ((size(i.payments) == 1))
121+ then i.payments[0]
122+ else throw((("Only " + toBase58String(USDCAssetID)) + " USDC Token is required as an Attached payment[1]."))
123+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
124+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
125+ let newbalanceofAsset = fraction(CheckUSDCBalance, CheckAssetBalance, (CheckUSDCBalance + pmt.amount))
126+ let quantityofpriceasset = (CheckAssetBalance - newbalanceofAsset)
127+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
128+ let SwapFee = 3
129+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
130+ let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
131+ let SumupofUSDCToAssetSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + EnterAssetID)) {
132+ case a: Int =>
133+ a
134+ case _ =>
135+ 0
136+ }
137+ let NewSumupofUSDCToAssetSwapFee = ((SumupofUSDCToAssetSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
138+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
139+ case a: Int =>
140+ a
141+ case _ =>
142+ 0
143+ }
144+ let NewSumupofAssetBalance = ((CheckAssetBalance - quantityofpriceasset) + SwapFeetoreceive)
145+ let SumupUSDCBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
146+ case a: Int =>
147+ a
148+ case _ =>
149+ 0
150+ }
151+ let NewSumupofUSDCBalance = (CheckUSDCBalance + pmt.amount)
152+ let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
153+ case a: Int =>
154+ a
155+ case _ =>
156+ 0
157+ }
158+ let NewTPT = (TOPT + 1)
159+ if ((checkpairisavailableornot != EnterAssetID))
160+ then throw("Pair is not available in Whitelisted Asset.")
161+ else if ((EnterAssetID == toBase58String(USDCAssetID)))
162+ then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input & Attach USDC as an attachment Token in payment[1].")
163+ else if ((pmt.assetId != USDCAssetID))
164+ then throw("You can Attach USDC as an Attached Payment[1] to Swap USDC To Required Token. Any other asset else than USDC will be rejected.")
165+ else if ((100000 > pmt.amount))
166+ then throw("Your Attached USDC Amount is very low. Attach Atleast 0.1 USDC to Claim the minimum Tokens.")
167+ else if ((CheckUSDCBalance == 0))
168+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
169+ else if ((CheckAssetBalance == 0))
170+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
171+ else if ((quantityofpriceasset > CheckAssetBalance))
172+ then throw((("Pool Only has a Liquidity of " + toString(CheckAssetBalance)) + " Tokens. Add Liquidity into Pool."))
173+ else [IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), NewSumupofUSDCToAssetSwapFee), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), NewTPT), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewSumupofUSDCBalance), ScriptTransfer(i.caller, userbalancetoreceive, fromBase58String(EnterAssetID)), ScriptTransfer(CollectFeeAddress, SwapFeetoreceive, fromBase58String(EnterAssetID))]
174+ }
175+
176+
177+
178+@Callable(i)
179+func AddLiquidity (EnterAssetID) = {
180+ let calleraddress = toBase58String(i.caller.bytes)
9181 let pmt1 = value(i.payments[0])
10- let currentKey = toBase58String(i.caller.bytes)
11- let fetchpair = getString(this, ("Pair_UV_" + assetId))
12- let assetinfopmt2 = fromBase58String(assetId)
13- if ((fetchpair == assetId))
14- then throw("Pair Already Exist in Voting List.")
15- else [StringEntry(("Pair_UV_" + assetId), assetId)]
182+ let pmt2 = value(i.payments[1])
183+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
184+ let ReissueassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or May be not Generated."))
185+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
186+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
187+ let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
188+ let decimals = decimalsinfo.decimals
189+ let arg1 = CheckUSDCBalance
190+ let arg2 = CheckAssetBalance
191+ let args3 = pow((((arg1 * 1000000) / arg2) * pow(10, 0, decimals, 0, 0, CEILING)), 0, 1, 0, 0, CEILING)
192+ let bothassetsdecimals = (6 + decimals)
193+ let sharedecimals = (bothassetsdecimals / 2)
194+ let quantityofEnterAssetID = fraction(args3, pmt1.amount, pow(10, 0, bothassetsdecimals, 0, 0, CEILING))
195+ 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)
196+ let USDCHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
197+ case a: Int =>
198+ a
199+ case _ =>
200+ 0
201+ }
202+ let NewUSDCHoldingInPair = (USDCHoldingInPair + pmt2.amount)
203+ let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
204+ case a: Int =>
205+ a
206+ case _ =>
207+ 0
208+ }
209+ let NewAssetHoldingInPair = (AssetHoldingInPair + pmt1.amount)
210+ let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
211+ case a: Int =>
212+ a
213+ case _ =>
214+ 0
215+ }
216+ let NewLPTokenIssued = (LPTokenIssued + quantityofLPToken1)
217+ if ((checkpairisavailableornot != EnterAssetID))
218+ then throw("Pair is not available in Whitelisted Asset.")
219+ else if ((EnterAssetID == toBase58String(USDCAssetID)))
220+ then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input as well as in payment[1] & Attach USDC as an attachment Token in payment[2].")
221+ else if ((size(i.payments) != 2))
222+ 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 USDC Token.")
223+ else if ((pmt1.assetId == USDCAssetID))
224+ then throw("You Attached USDC asset in payment[1], please attach only whitelisted Token in payment[1] along with USDC in payment[2].")
225+ else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
226+ then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
227+ else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
228+ then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
229+ else if ((pmt2.assetId != USDCAssetID))
230+ then throw("Wrong Asset Attached in payments[2], Please attach payment[1] = Liquidity Token & payment[2] = USDC Token.")
231+ else if ((5000000 > pmt2.amount))
232+ then throw("please attach atleast 5 USDC in payment[2] & Equivalent worth of Token in payment[1]")
233+ else if ((pmt2.amount != quantityofEnterAssetID))
234+ 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)) + " USDC."))
235+ else if ((1 > quantityofLPToken1))
236+ then throw((("LP Token Outcome is going below " + toString(sharedecimals)) + " Decimals. Please Attach min. 1 LP token or 5 USDC Atleast."))
237+ else [IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewUSDCHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), Reissue(ReissueassetId, quantityofLPToken1, true), ScriptTransfer(i.caller, quantityofLPToken1, ReissueassetId)]
238+ }
239+
240+
241+
242+@Callable(i)
243+func RemoveLiquidity (EnterAssetID) = {
244+ let calleraddress = toBase58String(i.caller.bytes)
245+ let pmt = if ((size(i.payments) == 1))
246+ then i.payments[0]
247+ else throw("No payment attached, Please Attach LP Token as payment[1].")
248+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
249+ let ReissueableassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or not Generated."))
250+ let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
251+ let decimals = decimalsinfo.decimals
252+ let bothassetsdecimals = (6 + decimals)
253+ let sharedecimals = (bothassetsdecimals / 2)
254+ let CheckTotalLPAmount = getIntegerValue(this, ("Total_LP_" + EnterAssetID))
255+ let UserLPPercentage = pow(fraction(pmt.amount, pow(10, 0, 8, 0, 0, CEILING), CheckTotalLPAmount), 6, 1, 0, 6, CEILING)
256+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
257+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
258+ let UserLPWorthUSDC = fraction(CheckUSDCBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
259+ let UserLPWorthAsset = fraction(CheckAssetBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
260+ let USDCHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
261+ case a: Int =>
262+ a
263+ case _ =>
264+ 0
265+ }
266+ let NewUSDCHoldingInPair = (USDCHoldingInPair - UserLPWorthUSDC)
267+ let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
268+ case a: Int =>
269+ a
270+ case _ =>
271+ 0
272+ }
273+ let NewAssetHoldingInPair = (AssetHoldingInPair - UserLPWorthAsset)
274+ let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
275+ case a: Int =>
276+ a
277+ case _ =>
278+ 0
279+ }
280+ let NewLPTokenIssued = (LPTokenIssued - pmt.amount)
281+ if ((checkpairisavailableornot != EnterAssetID))
282+ then throw("Pair is not available in Whitelist.")
283+ else if ((fromBase58String(EnterAssetID) == USDCAssetID))
284+ then throw("Don't choose USDC AssetID as Input, Only Whitelisted Asset as Input String & Attach LP Tokens as payment[1]")
285+ else if ((pmt.assetId != ReissueableassetId))
286+ then throw("Wrong Asset is attached in payment[1] or LP Token Not Found or Missing.")
287+ else if ((1 > UserLPPercentage))
288+ then throw("Your LP Token amount % is very low to convert.")
289+ else if ((1 > UserLPWorthUSDC))
290+ then throw("Your LP Token conversion amount is very low to convert or less than 0.000001 USDC.")
291+ else if ((1 > UserLPWorthAsset))
292+ then throw("Your LP Token conversion amount is very low to convert or less than fraction value of Token.")
293+ else [IntegerEntry("Withdraw_LP_Percentage", UserLPPercentage), Burn(ReissueableassetId, pmt.amount), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewUSDCHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), ScriptTransfer(i.caller, UserLPWorthUSDC, USDCAssetID), ScriptTransfer(i.caller, UserLPWorthAsset, fromBase58String(EnterAssetID))]
16294 }
17295
18296
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let USDCAssetID = base58'5bXgvADuVoFdhtF5uKZAEiVdAo7ZCWw151L4yyf1PiES'
5+
6+let CollectFeeAddress = addressFromPublicKey(base58'6Z73KxcX3sugpiStpSRXxKxTmWqCaLVwFeM6kwyiKVDR')
7+
8+@Callable(i)
9+func RegisterPair (EnterAssetID,days) = {
10+ let pmt1 = value(i.payments[0])
11+ let pmt2 = value(i.payments[1])
12+ let currentKey = toBase58String(i.caller.bytes)
13+ let WAVES = !(isDefined(pmt2.assetId))
14+ let fetchpair = getString(this, ("Pair_UV_" + EnterAssetID))
15+ let assetinfopmt2 = fromBase58String(EnterAssetID)
16+ let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
17+ if ((fetchpair == EnterAssetID))
18+ then throw("Pair Already Exist in List.")
19+ else if ((size(i.payments) != 2))
20+ then throw("Two attached assets expected as payment. Kindly Attach payment1 = WAVES Token & payment2 = Token you want to List.")
21+ else if (isDefined(pmt1.assetId))
22+ then throw("Incorrect asset attached for Collateral, please attach WAVES only.")
23+ else if ((pmt1.amount != 1000000000))
24+ 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."))
25+ else if ((pmt2.assetId != assetinfopmt2))
26+ then throw("Input String & Attached AssetID in payment2 is not matching.")
27+ else if ((WAVES == true))
28+ then throw("You Attached WAVES Asset ID for Listing, please attach Tokens You want to list in payment[2].")
29+ else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), ScriptTransfer(CollectFeeAddress, pmt1.amount, unit), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0)]
30+ }
31+
432
533
634 @Callable(i)
7-func RegisterPairForVoting (assetId) = {
8- let readassetinfo = assetInfo(fromBase58String(assetId))
35+func IssueLPToken (EnterAssetID) = {
36+ let adminrights = valueOrErrorMessage(getString(this, "LP_Admin_Rights"), "LP Admin Rights are Not Included into Smart Contract. Deploy Admin Rights First.")
37+ let calleraddress = toBase58String(i.caller.bytes)
38+ let checkpairisavailableornot = valueOrErrorMessage(getString(this, ("Pair_UV_" + EnterAssetID)), "Asset not Found in Whitelisted Token")
39+ let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
40+ let name = info.name
41+ let decimals = info.decimals
42+ let FirstLPQty = (1 * pow(10, 0, fraction((decimals + 6), 1, 2), 0, 0, CEILING))
43+ let LPissue = Issue((("LP-" + take(name, 8)) + "-USDC"), (((("LP-" + name) + "-USDC") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), FirstLPQty, fraction((decimals + 6), 1, 2), true)
44+ let LPid = calculateAssetId(LPissue)
45+ if ((adminrights != calleraddress))
46+ then throw((("Your are not allowded to Issue LP Token. Only " + adminrights) + " can issue the LP Token."))
47+ else if ((checkpairisavailableornot != EnterAssetID))
48+ then throw("Pair is not available in List.")
49+ else [LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), FirstLPQty)]
50+ }
51+
52+
53+
54+@Callable(i)
55+func SwapAssetToUSDCPairEntry (EnterAssetID) = {
56+ let calleraddress = toBase58String(i.caller.bytes)
57+ let pmt = if ((size(i.payments) == 1))
58+ then i.payments[0]
59+ else throw("Whitelisted Token is required as Attached payment[1].")
60+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
61+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
62+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
63+ let newbalanceofUSDC = fraction(CheckUSDCBalance, CheckAssetBalance, (CheckAssetBalance + pmt.amount))
64+ let quantityofpriceasset = (CheckUSDCBalance - newbalanceofUSDC)
65+ let SwapFee = 3
66+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
67+ let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
68+ let SumupofAssetToUSDCSwapFee = match getInteger(this, ((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
69+ case a: Int =>
70+ a
71+ case _ =>
72+ 0
73+ }
74+ let NewSumupofAssetToUSDCSwapFee = ((SumupofAssetToUSDCSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
75+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
76+ case a: Int =>
77+ a
78+ case _ =>
79+ 0
80+ }
81+ let NewSumupofAssetBalance = (CheckAssetBalance + pmt.amount)
82+ let SumupUSDCBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
83+ case a: Int =>
84+ a
85+ case _ =>
86+ 0
87+ }
88+ let NewSumupofUSDCBalance = ((CheckUSDCBalance - quantityofpriceasset) + SwapFeetoreceive)
89+ let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
90+ case a: Int =>
91+ a
92+ case _ =>
93+ 0
94+ }
95+ let NewTPT = (TOPT + 1)
96+ if ((EnterAssetID == toBase58String(USDCAssetID)))
97+ then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input & Attach Whitelisted Asset as an attachment Token in payment[1].")
98+ else if ((checkpairisavailableornot != EnterAssetID))
99+ then throw("Pair is not available in Whitelisted Asset.")
100+ else if ((pmt.assetId == USDCAssetID))
101+ then throw("You can't Attach USDC as an Attached Payment. Only Whitelisted Tokens are accepted.")
102+ else if ((pmt.assetId != fromBase58String(EnterAssetID)))
103+ then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
104+ else if ((CheckUSDCBalance == 0))
105+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
106+ else if ((CheckAssetBalance == 0))
107+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
108+ else if ((100000 > quantityofpriceasset))
109+ then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 0.1 dollar atleast."))
110+ else if ((quantityofpriceasset > CheckUSDCBalance))
111+ then throw((("Pool Only has a Liquidity of " + toString((CheckUSDCBalance / pow(10, 0, 6, 0, 0, CEILING)))) + " USDC. Add Liquidity into Pool."))
112+ else [IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewSumupofAssetToUSDCSwapFee), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), NewTPT), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewSumupofUSDCBalance), ScriptTransfer(i.caller, userbalancetoreceive, USDCAssetID), ScriptTransfer(CollectFeeAddress, SwapFeetoreceive, USDCAssetID)]
113+ }
114+
115+
116+
117+@Callable(i)
118+func SwapUSDCToAssetPairEntry (EnterAssetID) = {
119+ let calleraddress = toBase58String(i.caller.bytes)
120+ let pmt = if ((size(i.payments) == 1))
121+ then i.payments[0]
122+ else throw((("Only " + toBase58String(USDCAssetID)) + " USDC Token is required as an Attached payment[1]."))
123+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
124+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
125+ let newbalanceofAsset = fraction(CheckUSDCBalance, CheckAssetBalance, (CheckUSDCBalance + pmt.amount))
126+ let quantityofpriceasset = (CheckAssetBalance - newbalanceofAsset)
127+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
128+ let SwapFee = 3
129+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
130+ let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
131+ let SumupofUSDCToAssetSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + EnterAssetID)) {
132+ case a: Int =>
133+ a
134+ case _ =>
135+ 0
136+ }
137+ let NewSumupofUSDCToAssetSwapFee = ((SumupofUSDCToAssetSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
138+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
139+ case a: Int =>
140+ a
141+ case _ =>
142+ 0
143+ }
144+ let NewSumupofAssetBalance = ((CheckAssetBalance - quantityofpriceasset) + SwapFeetoreceive)
145+ let SumupUSDCBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
146+ case a: Int =>
147+ a
148+ case _ =>
149+ 0
150+ }
151+ let NewSumupofUSDCBalance = (CheckUSDCBalance + pmt.amount)
152+ let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
153+ case a: Int =>
154+ a
155+ case _ =>
156+ 0
157+ }
158+ let NewTPT = (TOPT + 1)
159+ if ((checkpairisavailableornot != EnterAssetID))
160+ then throw("Pair is not available in Whitelisted Asset.")
161+ else if ((EnterAssetID == toBase58String(USDCAssetID)))
162+ then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input & Attach USDC as an attachment Token in payment[1].")
163+ else if ((pmt.assetId != USDCAssetID))
164+ then throw("You can Attach USDC as an Attached Payment[1] to Swap USDC To Required Token. Any other asset else than USDC will be rejected.")
165+ else if ((100000 > pmt.amount))
166+ then throw("Your Attached USDC Amount is very low. Attach Atleast 0.1 USDC to Claim the minimum Tokens.")
167+ else if ((CheckUSDCBalance == 0))
168+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
169+ else if ((CheckAssetBalance == 0))
170+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
171+ else if ((quantityofpriceasset > CheckAssetBalance))
172+ then throw((("Pool Only has a Liquidity of " + toString(CheckAssetBalance)) + " Tokens. Add Liquidity into Pool."))
173+ else [IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), NewSumupofUSDCToAssetSwapFee), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), NewTPT), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewSumupofUSDCBalance), ScriptTransfer(i.caller, userbalancetoreceive, fromBase58String(EnterAssetID)), ScriptTransfer(CollectFeeAddress, SwapFeetoreceive, fromBase58String(EnterAssetID))]
174+ }
175+
176+
177+
178+@Callable(i)
179+func AddLiquidity (EnterAssetID) = {
180+ let calleraddress = toBase58String(i.caller.bytes)
9181 let pmt1 = value(i.payments[0])
10- let currentKey = toBase58String(i.caller.bytes)
11- let fetchpair = getString(this, ("Pair_UV_" + assetId))
12- let assetinfopmt2 = fromBase58String(assetId)
13- if ((fetchpair == assetId))
14- then throw("Pair Already Exist in Voting List.")
15- else [StringEntry(("Pair_UV_" + assetId), assetId)]
182+ let pmt2 = value(i.payments[1])
183+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
184+ let ReissueassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or May be not Generated."))
185+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
186+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
187+ let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
188+ let decimals = decimalsinfo.decimals
189+ let arg1 = CheckUSDCBalance
190+ let arg2 = CheckAssetBalance
191+ let args3 = pow((((arg1 * 1000000) / arg2) * pow(10, 0, decimals, 0, 0, CEILING)), 0, 1, 0, 0, CEILING)
192+ let bothassetsdecimals = (6 + decimals)
193+ let sharedecimals = (bothassetsdecimals / 2)
194+ let quantityofEnterAssetID = fraction(args3, pmt1.amount, pow(10, 0, bothassetsdecimals, 0, 0, CEILING))
195+ 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)
196+ let USDCHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
197+ case a: Int =>
198+ a
199+ case _ =>
200+ 0
201+ }
202+ let NewUSDCHoldingInPair = (USDCHoldingInPair + pmt2.amount)
203+ let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
204+ case a: Int =>
205+ a
206+ case _ =>
207+ 0
208+ }
209+ let NewAssetHoldingInPair = (AssetHoldingInPair + pmt1.amount)
210+ let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
211+ case a: Int =>
212+ a
213+ case _ =>
214+ 0
215+ }
216+ let NewLPTokenIssued = (LPTokenIssued + quantityofLPToken1)
217+ if ((checkpairisavailableornot != EnterAssetID))
218+ then throw("Pair is not available in Whitelisted Asset.")
219+ else if ((EnterAssetID == toBase58String(USDCAssetID)))
220+ then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input as well as in payment[1] & Attach USDC as an attachment Token in payment[2].")
221+ else if ((size(i.payments) != 2))
222+ 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 USDC Token.")
223+ else if ((pmt1.assetId == USDCAssetID))
224+ then throw("You Attached USDC asset in payment[1], please attach only whitelisted Token in payment[1] along with USDC in payment[2].")
225+ else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
226+ then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
227+ else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
228+ then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
229+ else if ((pmt2.assetId != USDCAssetID))
230+ then throw("Wrong Asset Attached in payments[2], Please attach payment[1] = Liquidity Token & payment[2] = USDC Token.")
231+ else if ((5000000 > pmt2.amount))
232+ then throw("please attach atleast 5 USDC in payment[2] & Equivalent worth of Token in payment[1]")
233+ else if ((pmt2.amount != quantityofEnterAssetID))
234+ 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)) + " USDC."))
235+ else if ((1 > quantityofLPToken1))
236+ then throw((("LP Token Outcome is going below " + toString(sharedecimals)) + " Decimals. Please Attach min. 1 LP token or 5 USDC Atleast."))
237+ else [IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewUSDCHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), Reissue(ReissueassetId, quantityofLPToken1, true), ScriptTransfer(i.caller, quantityofLPToken1, ReissueassetId)]
238+ }
239+
240+
241+
242+@Callable(i)
243+func RemoveLiquidity (EnterAssetID) = {
244+ let calleraddress = toBase58String(i.caller.bytes)
245+ let pmt = if ((size(i.payments) == 1))
246+ then i.payments[0]
247+ else throw("No payment attached, Please Attach LP Token as payment[1].")
248+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
249+ let ReissueableassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or not Generated."))
250+ let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
251+ let decimals = decimalsinfo.decimals
252+ let bothassetsdecimals = (6 + decimals)
253+ let sharedecimals = (bothassetsdecimals / 2)
254+ let CheckTotalLPAmount = getIntegerValue(this, ("Total_LP_" + EnterAssetID))
255+ let UserLPPercentage = pow(fraction(pmt.amount, pow(10, 0, 8, 0, 0, CEILING), CheckTotalLPAmount), 6, 1, 0, 6, CEILING)
256+ let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
257+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
258+ let UserLPWorthUSDC = fraction(CheckUSDCBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
259+ let UserLPWorthAsset = fraction(CheckAssetBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
260+ let USDCHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
261+ case a: Int =>
262+ a
263+ case _ =>
264+ 0
265+ }
266+ let NewUSDCHoldingInPair = (USDCHoldingInPair - UserLPWorthUSDC)
267+ let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
268+ case a: Int =>
269+ a
270+ case _ =>
271+ 0
272+ }
273+ let NewAssetHoldingInPair = (AssetHoldingInPair - UserLPWorthAsset)
274+ let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
275+ case a: Int =>
276+ a
277+ case _ =>
278+ 0
279+ }
280+ let NewLPTokenIssued = (LPTokenIssued - pmt.amount)
281+ if ((checkpairisavailableornot != EnterAssetID))
282+ then throw("Pair is not available in Whitelist.")
283+ else if ((fromBase58String(EnterAssetID) == USDCAssetID))
284+ then throw("Don't choose USDC AssetID as Input, Only Whitelisted Asset as Input String & Attach LP Tokens as payment[1]")
285+ else if ((pmt.assetId != ReissueableassetId))
286+ then throw("Wrong Asset is attached in payment[1] or LP Token Not Found or Missing.")
287+ else if ((1 > UserLPPercentage))
288+ then throw("Your LP Token amount % is very low to convert.")
289+ else if ((1 > UserLPWorthUSDC))
290+ then throw("Your LP Token conversion amount is very low to convert or less than 0.000001 USDC.")
291+ else if ((1 > UserLPWorthAsset))
292+ then throw("Your LP Token conversion amount is very low to convert or less than fraction value of Token.")
293+ else [IntegerEntry("Withdraw_LP_Percentage", UserLPPercentage), Burn(ReissueableassetId, pmt.amount), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), NewUSDCHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), ScriptTransfer(i.caller, UserLPWorthUSDC, USDCAssetID), ScriptTransfer(i.caller, UserLPWorthAsset, fromBase58String(EnterAssetID))]
16294 }
17295
18296
19297 @Verifier(tx)
20298 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
21299

github/deemru/w8io/169f3d6 
55.54 ms