tx · DaS5wKrZR5RsUG4m6DSG5qD28BV9iBqpVtwcX4aZK9BH

3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5:  -0.01700000 Waves

2023.09.19 16:33 [2762327] smart account 3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5 > SELF 0.00000000 Waves

{ "type": 13, "id": "DaS5wKrZR5RsUG4m6DSG5qD28BV9iBqpVtwcX4aZK9BH", "fee": 1700000, "feeAssetId": null, "timestamp": 1695130336617, "version": 2, "chainId": 84, "sender": "3MsVsEgTUxTm6ETYkHGaqMhMhiY2Nb3yDN5", "senderPublicKey": "2LmNyaN5YAXdg9C5vsXcTLU66hsW2KUNPsN7KcHBYhUo", "proofs": [ "NNCH4EFAceGjZFRuEiA7ZqiwLYsxK5X4SrTTjJ5kEYEcmYYePwWQgEYYqVHxdbk1cQpMFKGGN8Dwm8HeHG2Ddmt" ], "script": "base64:BgIlCAISAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCAQADmRBcHBTaW5jZVN0YXJ0AICRjMKqMQALVVNEQ0Fzc2V0SUQBIERHMcoh3/bynCbIVv74Z6l9nvez8AyJBUgJkDUU6U3/ABFDb2xsZWN0RmVlQWRkcmVzcwkApwgBASBSg9mgi9eQkjsz5eBARHIbc7Hg/F4fmB0sxZ6ySMfiIAEJY291bnRkYXlzAAQHVFNfRGlmZgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ5kQXBwU2luY2VTdGFydAQJZGF5bnVtYmVyCQBrAwABBQdUU19EaWZmAIC4mSkFCWRheW51bWJlcgcBaQEMUmVnaXN0ZXJQYWlyAQxFbnRlckFzc2V0SUQEBHBtdDEJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQEcG10MgkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBApjdXJyZW50S2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEBVdBVkVTCQEBIQEJAQlpc0RlZmluZWQBCAUEcG10Mgdhc3NldElkBAlmZXRjaHBhaXIJAJ0IAgUEdGhpcwkArAICAghQYWlyX1VWXwUMRW50ZXJBc3NldElEBA1hc3NldGluZm9wbXQyCQDZBAEFDEVudGVyQXNzZXRJRAQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUMRW50ZXJBc3NldElECQCsAgIJAKwCAgIGQXNzZXQgBQxFbnRlckFzc2V0SUQCDiBkb2Vzbid0IGV4aXN0BARuYW1lCAUEaW5mbwRuYW1lBAhkZWNpbWFscwgFBGluZm8IZGVjaW1hbHMECkxQZGVjaW1hbHMJAGsDCQBkAgUIZGVjaW1hbHMABgABAAIECkZpcnN0TFBRdHkJAGgCAAEJAGwGAAoAAAUKTFBkZWNpbWFscwAAAAAFB0NFSUxJTkcEB0xQaXNzdWUJAMIIBQkArAICCQCsAgICA0xQLQkArwICBQRuYW1lAAgCBS1VU0RDCQCsAgIJAKwCAgkArAICCQCsAgICA0xQLQUEbmFtZQIFLVVTREMCLiBpcyBhIExpcXVpZGl0eSBQcm92aWRlciBUb2tlbiBJc3N1ZWQgQWdhaW5zdCAFDEVudGVyQXNzZXRJRAUKRmlyc3RMUFF0eQUKTFBkZWNpbWFscwYEBExQaWQJALgIAQUHTFBpc3N1ZQMJAAACBQlmZXRjaHBhaXIFDEVudGVyQXNzZXRJRAkAAgECG1BhaXIgQWxyZWFkeSBFeGlzdCBpbiBMaXN0LgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECclR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQgYXMgcGF5bWVudC4gS2luZGx5IEF0dGFjaCBwYXltZW50MSA9IFdBVkVTIFRva2VuICYgcGF5bWVudDIgPSBUb2tlbiB5b3Ugd2FudCB0byBMaXN0LgMJAQlpc0RlZmluZWQBCAUEcG10MQdhc3NldElkCQACAQJCSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkIGZvciBDb2xsYXRlcmFsLCBwbGVhc2UgYXR0YWNoIFdBVkVTIG9ubHkuAwkBAiE9AggFBHBtdDEGYW1vdW50AICt4gQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEllvdSBhdHRhY2hlZCBvbmx5IAkApAMBCQBrAwgFBHBtdDEGYW1vdW50AAEAgMLXLwIBLgkApAMBCQBrAwgFBHBtdDEGYW1vdW50AAEAgK3iBAI5IFdBVkVTIGZvciBMaXN0aW5nIGluIHBheW1lbnRbMV0sIHBsZWFzZSBhdHRhY2ggMTAgV0FWRVMuAwkBAiE9AggFBHBtdDIHYXNzZXRJZAUNYXNzZXRpbmZvcG10MgkAAgECPElucHV0IFN0cmluZyAmIEF0dGFjaGVkIEFzc2V0SUQgaW4gcGF5bWVudDIgaXMgbm90IG1hdGNoaW5nLgMJAAACBQVXQVZFUwYJAAIBAl1Zb3UgQXR0YWNoZWQgV0FWRVMgQXNzZXQgSUQgZm9yIExpc3RpbmcsIHBsZWFzZSBhdHRhY2ggVG9rZW5zIFlvdSB3YW50IHRvIGxpc3QgaW4gcGF5bWVudFsyXS4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAghQYWlyX1VWXwUMRW50ZXJBc3NldElEBQxFbnRlckFzc2V0SUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIMTGlzdGluZ19GZWVfBQxFbnRlckFzc2V0SUQIBQRwbXQxBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRFDb2xsZWN0RmVlQWRkcmVzcwgFBHBtdDEGYW1vdW50BQR1bml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQIBQRwbXQyBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhNUb3RhbF9vZl9QYWlyX1R4bnNfBQxFbnRlckFzc2V0SUQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgIZVG90YWxfU3dhcF9GZWVfQ29sbGVjdGVkXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIZVG90YWxfU3dhcF9GZWVfQ29sbGVjdGVkXwUMRW50ZXJBc3NldElEAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBCQEJY291bnRkYXlzAAILX0RheV9Wb2x1bWUAAAkAzAgCBQdMUGlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIDTFBfBQxFbnRlckFzc2V0SUQJANgEAQUETFBpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAUKRmlyc3RMUFF0eQUDbmlsAWkBDElzc3VlTFBUb2tlbgEMRW50ZXJBc3NldElEBAthZG1pbnJpZ2h0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCD0xQX0FkbWluX1JpZ2h0cwJQTFAgQWRtaW4gUmlnaHRzIGFyZSBOb3QgSW5jbHVkZWQgaW50byBTbWFydCBDb250cmFjdC4gRGVwbG95IEFkbWluIFJpZ2h0cyBGaXJzdC4EDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAIkQXNzZXQgbm90IEZvdW5kIGluIFdoaXRlbGlzdGVkIFRva2VuBARpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQxFbnRlckFzc2V0SUQJAKwCAgkArAICAgZBc3NldCAFDEVudGVyQXNzZXRJRAIOIGRvZXNuJ3QgZXhpc3QEBG5hbWUIBQRpbmZvBG5hbWUECGRlY2ltYWxzCAUEaW5mbwhkZWNpbWFscwQKRmlyc3RMUFF0eQkAaAIAAQkAbAYACgAACQBrAwkAZAIFCGRlY2ltYWxzAAYAAQACAAAAAAUHQ0VJTElORwQHTFBpc3N1ZQkAwggFCQCsAgIJAKwCAgIDTFAtCQCvAgIFBG5hbWUACAIFLVVTREMJAKwCAgkArAICCQCsAgIJAKwCAgIDTFAtBQRuYW1lAgUtVVNEQwIuIGlzIGEgTGlxdWlkaXR5IFByb3ZpZGVyIFRva2VuIElzc3VlZCBBZ2FpbnN0IAUMRW50ZXJBc3NldElEBQpGaXJzdExQUXR5CQBrAwkAZAIFCGRlY2ltYWxzAAYAAQACBgQETFBpZAkAuAgBBQdMUGlzc3VlAwkBAiE9AgULYWRtaW5yaWdodHMFDWNhbGxlcmFkZHJlc3MJAAIBCQCsAgIJAKwCAgIuWW91ciBhcmUgbm90IGFsbG93ZGVkIHRvIElzc3VlIExQIFRva2VuLiBPbmx5IAULYWRtaW5yaWdodHMCGCBjYW4gaXNzdWUgdGhlIExQIFRva2VuLgMJAQIhPQIFGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFDEVudGVyQXNzZXRJRAkAAgECHlBhaXIgaXMgbm90IGF2YWlsYWJsZSBpbiBMaXN0LgkAzAgCBQdMUGlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIDTFBfBQxFbnRlckFzc2V0SUQJANgEAQUETFBpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAUKRmlyc3RMUFF0eQUDbmlsAWkBGFN3YXBBc3NldFRvVVNEQ1BhaXJFbnRyeQEMRW50ZXJBc3NldElEBA1jYWxsZXJhZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECNVdoaXRlbGlzdGVkIFRva2VuIGlzIHJlcXVpcmVkIGFzIEF0dGFjaGVkIHBheW1lbnRbMV0uBBljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90CQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAQQQ2hlY2tVU0RDQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAQRQ2hlY2tBc3NldEJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQEEG5ld2JhbGFuY2VvZlVTREMJAGsDBRBDaGVja1VTRENCYWxhbmNlBRFDaGVja0Fzc2V0QmFsYW5jZQkAZAIFEUNoZWNrQXNzZXRCYWxhbmNlCAUDcG10BmFtb3VudAQUcXVhbnRpdHlvZnByaWNlYXNzZXQJAGUCBRBDaGVja1VTRENCYWxhbmNlBRBuZXdiYWxhbmNlb2ZVU0RDBAdTd2FwRmVlAAMEEFN3YXBGZWV0b3JlY2VpdmUJAGkCCQBoAgUUcXVhbnRpdHlvZnByaWNlYXNzZXQFB1N3YXBGZWUA6AcEFHVzZXJiYWxhbmNldG9yZWNlaXZlCQBlAgkAZQIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BRBTd2FwRmVldG9yZWNlaXZlBRBTd2FwRmVldG9yZWNlaXZlBBlTdW11cG9mQXNzZXRUb1VTRENTd2FwRmVlBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQcTmV3U3VtdXBvZkFzc2V0VG9VU0RDU3dhcEZlZQkAZAIJAGQCBRlTdW11cG9mQXNzZXRUb1VTRENTd2FwRmVlBRBTd2FwRmVldG9yZWNlaXZlBRBTd2FwRmVldG9yZWNlaXZlBBFTdW11cEFzc2V0QmFsYW5jZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQBkAgURQ2hlY2tBc3NldEJhbGFuY2UIBQNwbXQGYW1vdW50BBBTdW11cFVTRENCYWxhbmNlBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEFU5ld1N1bXVwb2ZVU0RDQmFsYW5jZQkAZAIJAGUCBRBDaGVja1VTRENCYWxhbmNlBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUQU3dhcEZlZXRvcmVjZWl2ZQQEVE9QVAQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAhNUb3RhbF9vZl9QYWlyX1R4bnNfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEBk5ld1RQVAkAZAIFBFRPUFQAAQMJAAACBQxFbnRlckFzc2V0SUQJANgEAQULVVNEQ0Fzc2V0SUQJAAIBAoYBSW5wdXQgY2FuIE5ldmVyIGJlIGEgVVNEQyBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0ICYgQXR0YWNoIFdoaXRlbGlzdGVkIEFzc2V0IGFzIGFuIGF0dGFjaG1lbnQgVG9rZW4gaW4gcGF5bWVudFsxXS4DCQECIT0CBRljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90BQxFbnRlckFzc2V0SUQJAAIBAitQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAIIBQNwbXQHYXNzZXRJZAULVVNEQ0Fzc2V0SUQJAAIBAlNZb3UgY2FuJ3QgQXR0YWNoIFVTREMgYXMgYW4gQXR0YWNoZWQgUGF5bWVudC4gT25seSBXaGl0ZWxpc3RlZCBUb2tlbnMgYXJlIGFjY2VwdGVkLgMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQxFbnRlckFzc2V0SUQJAAIBCQCsAgICMEluY29ycmVjdCBhc3NldCBhdHRhY2hlZCwgcGxlYXNlIGF0dGFjaCBvciBzZW5kIAUMRW50ZXJBc3NldElEAwkAAAIFEENoZWNrVVNEQ0JhbGFuY2UAAAkAAgECZVN3YXAgUGFpciBOZWVkIHRvIEFkZCBMaXF1aWRpdHkgZmlyc3QgaW50byBQb29sLiBPbmx5IEFmdGVyIHRoYXQgUGFpciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgU3dhcHBpbmcuAwkAAAIFEUNoZWNrQXNzZXRCYWxhbmNlAAAJAAIBAmVTd2FwIFBhaXIgTmVlZCB0byBBZGQgTGlxdWlkaXR5IGZpcnN0IGludG8gUG9vbC4gT25seSBBZnRlciB0aGF0IFBhaXIgd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIFN3YXBwaW5nLgMJAGYCAKCNBgUUcXVhbnRpdHlvZnByaWNlYXNzZXQJAAIBCQCsAgIJAKwCAgI0WW91ciBBdHRhY2hlZCBBc3NldCBBbW91bnQgaXMgdmVyeSBsb3cuIEF0dGFjaCBNb3JlIAUMRW50ZXJBc3NldElEAjogVG9rZW5zIHRvIENsYWltIHRoZSBtaW5pbXVtIEFtb3VudCBvZiAwLjEgZG9sbGFyIGF0bGVhc3QuAwkAZgIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BRBDaGVja1VTRENCYWxhbmNlCQACAQkArAICCQCsAgICHVBvb2wgT25seSBoYXMgYSBMaXF1aWRpdHkgb2YgCQCkAwEJAGkCBRBDaGVja1VTRENCYWxhbmNlCQBsBgAKAAAABgAAAAAFB0NFSUxJTkcCHyBVU0RDLiBBZGQgTGlxdWlkaXR5IGludG8gUG9vbC4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAUcTmV3U3VtdXBvZkFzc2V0VG9VU0RDU3dhcEZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhNUb3RhbF9vZl9QYWlyX1R4bnNfBQxFbnRlckFzc2V0SUQFBk5ld1RQVAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQULVVNEQ0Fzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAUWTmV3U3VtdXBvZkFzc2V0QmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAUVTmV3U3VtdXBvZlVTRENCYWxhbmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUUdXNlcmJhbGFuY2V0b3JlY2VpdmUFC1VTRENBc3NldElECQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEUNvbGxlY3RGZWVBZGRyZXNzBRBTd2FwRmVldG9yZWNlaXZlBQtVU0RDQXNzZXRJRAUDbmlsAWkBGFN3YXBVU0RDVG9Bc3NldFBhaXJFbnRyeQEMRW50ZXJBc3NldElEBA1jYWxsZXJhZGRyZXNzCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgEJAKwCAgkArAICAgVPbmx5IAkA2AQBBQtVU0RDQXNzZXRJRAIyIFVTREMgVG9rZW4gaXMgcmVxdWlyZWQgYXMgYW4gQXR0YWNoZWQgcGF5bWVudFsxXS4EEENoZWNrVVNEQ0JhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQEEUNoZWNrQXNzZXRCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBBFuZXdiYWxhbmNlb2ZBc3NldAkAawMFEENoZWNrVVNEQ0JhbGFuY2UFEUNoZWNrQXNzZXRCYWxhbmNlCQBkAgUQQ2hlY2tVU0RDQmFsYW5jZQgFA3BtdAZhbW91bnQEFHF1YW50aXR5b2ZwcmljZWFzc2V0CQBlAgURQ2hlY2tBc3NldEJhbGFuY2UFEW5ld2JhbGFuY2VvZkFzc2V0BBljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90CQCdCAIFBHRoaXMJAKwCAgIIUGFpcl9VVl8FDEVudGVyQXNzZXRJRAQHU3dhcEZlZQADBBBTd2FwRmVldG9yZWNlaXZlCQBpAgkAaAIFFHF1YW50aXR5b2ZwcmljZWFzc2V0BQdTd2FwRmVlAOgHBBR1c2VyYmFsYW5jZXRvcmVjZWl2ZQkAZQIJAGUCBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUQU3dhcEZlZXRvcmVjZWl2ZQUQU3dhcEZlZXRvcmVjZWl2ZQQZU3VtdXBvZlVTRENUb0Fzc2V0U3dhcEZlZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgICGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQcTmV3U3VtdXBvZlVTRENUb0Fzc2V0U3dhcEZlZQkAZAIJAGQCBRlTdW11cG9mVVNEQ1RvQXNzZXRTd2FwRmVlBRBTd2FwRmVldG9yZWNlaXZlBRBTd2FwRmVldG9yZWNlaXZlBBFTdW11cEFzc2V0QmFsYW5jZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQBkAgkAZQIFEUNoZWNrQXNzZXRCYWxhbmNlBRRxdWFudGl0eW9mcHJpY2Vhc3NldAUQU3dhcEZlZXRvcmVjZWl2ZQQQU3VtdXBVU0RDQmFsYW5jZQQHJG1hdGNoMAkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABBVOZXdTdW11cG9mVVNEQ0JhbGFuY2UJAGQCBRBDaGVja1VTRENCYWxhbmNlCAUDcG10BmFtb3VudAQEVE9QVAQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAhNUb3RhbF9vZl9QYWlyX1R4bnNfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEBk5ld1RQVAkAZAIFBFRPUFQAAQMJAQIhPQIFGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFDEVudGVyQXNzZXRJRAkAAgECK1BhaXIgaXMgbm90IGF2YWlsYWJsZSBpbiBXaGl0ZWxpc3RlZCBBc3NldC4DCQAAAgUMRW50ZXJBc3NldElECQDYBAEFC1VTRENBc3NldElECQACAQJ5SW5wdXQgY2FuIE5ldmVyIGJlIGEgVVNEQyBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0ICYgQXR0YWNoIFVTREMgYXMgYW4gYXR0YWNobWVudCBUb2tlbiBpbiBwYXltZW50WzFdLgMJAQIhPQIIBQNwbXQHYXNzZXRJZAULVVNEQ0Fzc2V0SUQJAAIBAn5Zb3UgY2FuIEF0dGFjaCBVU0RDIGFzIGFuIEF0dGFjaGVkIFBheW1lbnRbMV0gdG8gU3dhcCBVU0RDIFRvIFJlcXVpcmVkIFRva2VuLiBBbnkgb3RoZXIgYXNzZXQgZWxzZSB0aGFuIFVTREMgd2lsbCBiZSByZWplY3RlZC4DCQBmAgCgjQYIBQNwbXQGYW1vdW50CQACAQJbWW91ciBBdHRhY2hlZCBVU0RDIEFtb3VudCBpcyB2ZXJ5IGxvdy4gQXR0YWNoIEF0bGVhc3QgMC4xIFVTREMgdG8gQ2xhaW0gdGhlIG1pbmltdW0gVG9rZW5zLgMJAAACBRBDaGVja1VTRENCYWxhbmNlAAAJAAIBAmVTd2FwIFBhaXIgTmVlZCB0byBBZGQgTGlxdWlkaXR5IGZpcnN0IGludG8gUG9vbC4gT25seSBBZnRlciB0aGF0IFBhaXIgd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIFN3YXBwaW5nLgMJAAACBRFDaGVja0Fzc2V0QmFsYW5jZQAACQACAQJlU3dhcCBQYWlyIE5lZWQgdG8gQWRkIExpcXVpZGl0eSBmaXJzdCBpbnRvIFBvb2wuIE9ubHkgQWZ0ZXIgdGhhdCBQYWlyIHdpbGwgYmUgYWN0aXZhdGVkIGZvciBTd2FwcGluZy4DCQBmAgUUcXVhbnRpdHlvZnByaWNlYXNzZXQFEUNoZWNrQXNzZXRCYWxhbmNlCQACAQkArAICCQCsAgICHVBvb2wgT25seSBoYXMgYSBMaXF1aWRpdHkgb2YgCQCkAwEFEUNoZWNrQXNzZXRCYWxhbmNlAiEgVG9rZW5zLiBBZGQgTGlxdWlkaXR5IGludG8gUG9vbC4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIZVG90YWxfU3dhcF9GZWVfQ29sbGVjdGVkXwUMRW50ZXJBc3NldElEBRxOZXdTdW11cG9mVVNEQ1RvQXNzZXRTd2FwRmVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICE1RvdGFsX29mX1BhaXJfVHhuc18FDEVudGVyQXNzZXRJRAUGTmV3VFBUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBRZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEBRVOZXdTdW11cG9mVVNEQ0JhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRR1c2VyYmFsYW5jZXRvcmVjZWl2ZQkA2QQBBQxFbnRlckFzc2V0SUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwURQ29sbGVjdEZlZUFkZHJlc3MFEFN3YXBGZWV0b3JlY2VpdmUJANkEAQUMRW50ZXJBc3NldElEBQNuaWwBaQEMQWRkTGlxdWlkaXR5AQxFbnRlckFzc2V0SUQEDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQEcG10MQkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABARwbXQyCQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QJAJ0IAgUEdGhpcwkArAICAghQYWlyX1VWXwUMRW50ZXJBc3NldElEBA5SZWlzc3VlYXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICAgNMUF8FDEVudGVyQXNzZXRJRAIsTFAgVG9rZW4gaXMgTWlzc2luZyBvciBNYXkgYmUgbm90IEdlbmVyYXRlZC4EEENoZWNrVVNEQ0JhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQEEUNoZWNrQXNzZXRCYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwkA2AQBBQtVU0RDQXNzZXRJRAIBXwUMRW50ZXJBc3NldElEBAxkZWNpbWFsc2luZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFDEVudGVyQXNzZXRJRAkArAICCQCsAgICBkFzc2V0IAUMRW50ZXJBc3NldElEAg4gZG9lc24ndCBleGlzdAQIZGVjaW1hbHMIBQxkZWNpbWFsc2luZm8IZGVjaW1hbHMEBGFyZzEFEENoZWNrVVNEQ0JhbGFuY2UEBGFyZzIFEUNoZWNrQXNzZXRCYWxhbmNlBAVhcmdzMwkAbAYJAGgCCQBpAgkAaAIFBGFyZzEAwIQ9BQRhcmcyCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUHQ0VJTElORwAAAAEAAAAABQdDRUlMSU5HBBJib3RoYXNzZXRzZGVjaW1hbHMJAGQCAAYFCGRlY2ltYWxzBA1zaGFyZWRlY2ltYWxzCQBpAgUSYm90aGFzc2V0c2RlY2ltYWxzAAIEFnF1YW50aXR5b2ZFbnRlckFzc2V0SUQJAGsDBQVhcmdzMwgFBHBtdDEGYW1vdW50CQBsBgAKAAAFEmJvdGhhc3NldHNkZWNpbWFscwAAAAAFB0NFSUxJTkcEEnF1YW50aXR5b2ZMUFRva2VuMQkAbAYJAGgCCQBrAwgFBHBtdDEGYW1vdW50AAEJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQdDRUlMSU5HCQBrAwgFBHBtdDIGYW1vdW50AAEJAGwGAAoAAAAGAAAAAAUHQ0VJTElORwAAAAUAAQUNc2hhcmVkZWNpbWFscwUERE9XTgQRVVNEQ0hvbGRpbmdJblBhaXIEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQUTmV3VVNEQ0hvbGRpbmdJblBhaXIJAGQCBRFVU0RDSG9sZGluZ0luUGFpcggFBHBtdDIGYW1vdW50BBJBc3NldEhvbGRpbmdJblBhaXIEByRtYXRjaDAJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQULVVNEQ0Fzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQVTmV3QXNzZXRIb2xkaW5nSW5QYWlyCQBkAgUSQXNzZXRIb2xkaW5nSW5QYWlyCAUEcG10MQZhbW91bnQEDUxQVG9rZW5Jc3N1ZWQEByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgIJVG90YWxfTFBfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEEE5ld0xQVG9rZW5Jc3N1ZWQJAGQCBQ1MUFRva2VuSXNzdWVkBRJxdWFudGl0eW9mTFBUb2tlbjEDCQECIT0CBRljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90BQxFbnRlckFzc2V0SUQJAAIBAitQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAIFDEVudGVyQXNzZXRJRAkA2AQBBQtVU0RDQXNzZXRJRAkAAgECkgFJbnB1dCBjYW4gTmV2ZXIgYmUgYSBVU0RDIEFzc2V0SUQuIEVudGVyIFdoaXRlbGlzdGVkIEFzc2V0SUQgaW4gaW5wdXQgYXMgd2VsbCBhcyBpbiBwYXltZW50WzFdICYgQXR0YWNoIFVTREMgYXMgYW4gYXR0YWNobWVudCBUb2tlbiBpbiBwYXltZW50WzJdLgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECngFUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkIGFzIHBheW1lbnQgaW4gNTAlLTUwJS4gS2luZGx5IEF0dGFjaCBwYXltZW50MSA9IFRva2VuIHlvdSB3YW50IHRvIGFkZCBmb3IgTGlxdWlkaXR5ICYgcGF5bWVudDIgPSBFcXVpdmFsZW50IEFtb3VudCBvZiBVU0RDIFRva2VuLgMJAAACCAUEcG10MQdhc3NldElkBQtVU0RDQXNzZXRJRAkAAgECeFlvdSBBdHRhY2hlZCBVU0RDIGFzc2V0IGluIHBheW1lbnRbMV0sIHBsZWFzZSBhdHRhY2ggb25seSB3aGl0ZWxpc3RlZCBUb2tlbiBpbiBwYXltZW50WzFdIGFsb25nIHdpdGggVVNEQyBpbiBwYXltZW50WzJdLgMJAQIhPQIIBQRwbXQxB2Fzc2V0SWQJANkEAQUMRW50ZXJBc3NldElECQACAQJrSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkIGZvciBMaXF1aWRpdHkgaW4gcGF5bWVudFsxXSwgcGxlYXNlIGF0dGFjaCBTdHJpbmcgQXNzZXQgb3IgV2hpdGVsaXN0ZWQgVG9rZW4gb25seS4DCQECIT0CCAUEcG10MQdhc3NldElkCQDZBAEFDEVudGVyQXNzZXRJRAkAAgECa0luY29ycmVjdCBhc3NldCBhdHRhY2hlZCBmb3IgTGlxdWlkaXR5IGluIHBheW1lbnRbMV0sIHBsZWFzZSBhdHRhY2ggU3RyaW5nIEFzc2V0IG9yIFdoaXRlbGlzdGVkIFRva2VuIG9ubHkuAwkBAiE9AggFBHBtdDIHYXNzZXRJZAULVVNEQ0Fzc2V0SUQJAAIBAmpXcm9uZyBBc3NldCBBdHRhY2hlZCBpbiBwYXltZW50c1syXSwgUGxlYXNlIGF0dGFjaCBwYXltZW50WzFdID0gTGlxdWlkaXR5IFRva2VuICYgcGF5bWVudFsyXSA9IFVTREMgVG9rZW4uAwkAZgIAwJaxAggFBHBtdDIGYW1vdW50CQACAQJUcGxlYXNlIGF0dGFjaCBhdGxlYXN0IDUgVVNEQyBpbiBwYXltZW50WzJdICYgRXF1aXZhbGVudCB3b3J0aCBvZiBUb2tlbiBpbiBwYXltZW50WzFdAwkBAiE9AggFBHBtdDIGYW1vdW50BRZxdWFudGl0eW9mRW50ZXJBc3NldElECQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgJeQXR0YWNoZWQgcGF5bWVudFsyXSBxdHkgaXMgbm90IG1hdGNoaW5nIGFzIHBlciBhdHRhY2hlZCBwYXltZW50WzFdLnBheW1lbnRbMl0gbXVzdCBiZSBhcyBpbnQgWwkApAMBBRZxdWFudGl0eW9mRW50ZXJBc3NldElEAgVdIG9yIAkApAMBCQBrAwUWcXVhbnRpdHlvZkVudGVyQXNzZXRJRAABAMCEPQIBLgkAsgICCQCkAwEFFnF1YW50aXR5b2ZFbnRlckFzc2V0SUQABgIGIFVTREMuAwkAZgIAAQUScXVhbnRpdHlvZkxQVG9rZW4xCQACAQkArAICCQCsAgICIExQIFRva2VuIE91dGNvbWUgaXMgZ29pbmcgYmVsb3cgCQCkAwEFDXNoYXJlZGVjaW1hbHMCOyBEZWNpbWFscy4gUGxlYXNlIEF0dGFjaCBtaW4uIDEgTFAgdG9rZW4gb3IgNSBVU0RDIEF0bGVhc3QuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgtCYWxhbmNlX29mXwUMRW50ZXJBc3NldElEAgFfCQDYBAEFC1VTRENBc3NldElEBRROZXdVU0RDSG9sZGluZ0luUGFpcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8JANgEAQULVVNEQ0Fzc2V0SUQCAV8FDEVudGVyQXNzZXRJRAUVTmV3QXNzZXRIb2xkaW5nSW5QYWlyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICCVRvdGFsX0xQXwUMRW50ZXJBc3NldElEBRBOZXdMUFRva2VuSXNzdWVkCQDMCAIJAQdSZWlzc3VlAwUOUmVpc3N1ZWFzc2V0SWQFEnF1YW50aXR5b2ZMUFRva2VuMQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRJxdWFudGl0eW9mTFBUb2tlbjEFDlJlaXNzdWVhc3NldElkBQNuaWwBaQEPUmVtb3ZlTGlxdWlkaXR5AQxFbnRlckFzc2V0SUQEDWNhbGxlcmFkZHJlc3MJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQI6Tm8gcGF5bWVudCBhdHRhY2hlZCwgUGxlYXNlIEF0dGFjaCBMUCBUb2tlbiBhcyBwYXltZW50WzFdLgQZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkAnQgCBQR0aGlzCQCsAgICCFBhaXJfVVZfBQxFbnRlckFzc2V0SUQEElJlaXNzdWVhYmxlYXNzZXRJZAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICAgNMUF8FDEVudGVyQXNzZXRJRAIlTFAgVG9rZW4gaXMgTWlzc2luZyBvciBub3QgR2VuZXJhdGVkLgQMZGVjaW1hbHNpbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQxFbnRlckFzc2V0SUQJAKwCAgkArAICAgZBc3NldCAFDEVudGVyQXNzZXRJRAIOIGRvZXNuJ3QgZXhpc3QECGRlY2ltYWxzCAUMZGVjaW1hbHNpbmZvCGRlY2ltYWxzBBJib3RoYXNzZXRzZGVjaW1hbHMJAGQCAAYFCGRlY2ltYWxzBA1zaGFyZWRlY2ltYWxzCQBpAgUSYm90aGFzc2V0c2RlY2ltYWxzAAIEEkNoZWNrVG90YWxMUEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAQQVXNlckxQUGVyY2VudGFnZQkAbAYJAGsDCAUDcG10BmFtb3VudAkAbAYACgAAAAgAAAAABQdDRUlMSU5HBRJDaGVja1RvdGFsTFBBbW91bnQABgABAAAABgUHQ0VJTElORwQQQ2hlY2tVU0RDQmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAQRQ2hlY2tBc3NldEJhbGFuY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQED1VzZXJMUFdvcnRoVVNEQwkAawMFEENoZWNrVVNEQ0JhbGFuY2UFEFVzZXJMUFBlcmNlbnRhZ2UJAGwGAAoAAAAIAAAAAAUHQ0VJTElORwQQVXNlckxQV29ydGhBc3NldAkAawMFEUNoZWNrQXNzZXRCYWxhbmNlBRBVc2VyTFBQZXJjZW50YWdlCQBsBgAKAAAACAAAAAAFB0NFSUxJTkcEEVVTRENIb2xkaW5nSW5QYWlyBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfBQxFbnRlckFzc2V0SUQCAV8JANgEAQULVVNEQ0Fzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEFE5ld1VTRENIb2xkaW5nSW5QYWlyCQBlAgURVVNEQ0hvbGRpbmdJblBhaXIFD1VzZXJMUFdvcnRoVVNEQwQSQXNzZXRIb2xkaW5nSW5QYWlyBAckbWF0Y2gwCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAEFU5ld0Fzc2V0SG9sZGluZ0luUGFpcgkAZQIFEkFzc2V0SG9sZGluZ0luUGFpcgUQVXNlckxQV29ydGhBc3NldAQNTFBUb2tlbklzc3VlZAQHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQQTmV3TFBUb2tlbklzc3VlZAkAZQIFDUxQVG9rZW5Jc3N1ZWQIBQNwbXQGYW1vdW50AwkBAiE9AgUZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAUMRW50ZXJBc3NldElECQACAQIjUGFpciBpcyBub3QgYXZhaWxhYmxlIGluIFdoaXRlbGlzdC4DCQAAAgkA2QQBBQxFbnRlckFzc2V0SUQFC1VTRENBc3NldElECQACAQJrRG9uJ3QgY2hvb3NlIFVTREMgQXNzZXRJRCBhcyBJbnB1dCwgT25seSBXaGl0ZWxpc3RlZCBBc3NldCBhcyBJbnB1dCBTdHJpbmcgJiBBdHRhY2ggTFAgVG9rZW5zIGFzIHBheW1lbnRbMV0DCQECIT0CCAUDcG10B2Fzc2V0SWQFElJlaXNzdWVhYmxlYXNzZXRJZAkAAgECR1dyb25nIEFzc2V0IGlzIGF0dGFjaGVkIGluIHBheW1lbnRbMV0gb3IgTFAgVG9rZW4gTm90IEZvdW5kIG9yIE1pc3NpbmcuAwkAZgIAAQUQVXNlckxQUGVyY2VudGFnZQkAAgECLllvdXIgTFAgVG9rZW4gYW1vdW50ICUgaXMgdmVyeSBsb3cgdG8gY29udmVydC4DCQBmAgABBQ9Vc2VyTFBXb3J0aFVTREMJAAIBAlJZb3VyIExQIFRva2VuIGNvbnZlcnNpb24gYW1vdW50IGlzIHZlcnkgbG93IHRvIGNvbnZlcnQgb3IgbGVzcyB0aGFuIDAuMDAwMDAxIFVTREMuAwkAZgIAAQUQVXNlckxQV29ydGhBc3NldAkAAgECXFlvdXIgTFAgVG9rZW4gY29udmVyc2lvbiBhbW91bnQgaXMgdmVyeSBsb3cgdG8gY29udmVydCBvciBsZXNzIHRoYW4gZnJhY3Rpb24gdmFsdWUgb2YgVG9rZW4uCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhZXaXRoZHJhd19MUF9QZXJjZW50YWdlBRBVc2VyTFBQZXJjZW50YWdlCQDMCAIJAQRCdXJuAgUSUmVpc3N1ZWFibGVhc3NldElkCAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAglUb3RhbF9MUF8FDEVudGVyQXNzZXRJRAUQTmV3TFBUb2tlbklzc3VlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILQmFsYW5jZV9vZl8FDEVudGVyQXNzZXRJRAIBXwkA2AQBBQtVU0RDQXNzZXRJRAUUTmV3VVNEQ0hvbGRpbmdJblBhaXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC0JhbGFuY2Vfb2ZfCQDYBAEFC1VTRENBc3NldElEAgFfBQxFbnRlckFzc2V0SUQFFU5ld0Fzc2V0SG9sZGluZ0luUGFpcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFD1VzZXJMUFdvcnRoVVNEQwULVVNEQ0Fzc2V0SUQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRBVc2VyTFBXb3J0aEFzc2V0CQDZBAEFDEVudGVyQXNzZXRJRAUDbmlsAWkBA0RlbAEDS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEFA0tleQUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tlefMy8NI=", "height": 2762327, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ETGmhZaVx9bNGNa5yqv5EpQTaNnr6m22YkMGJc8V9rC9 Next: 57ncCXwhqgcktkwvbhpwiSdjqbGovShFHd8rnwWYXzD Diff:
OldNewDifferences
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"))
26+ let name = info.name
27+ let decimals = info.decimals
28+ let LPdecimals = fraction((decimals + 6), 1, 2)
29+ let FirstLPQty = (1 * pow(10, 0, LPdecimals, 0, 0, CEILING))
30+ let LPissue = Issue((("LP-" + take(name, 8)) + "-USDC"), (((("LP-" + name) + "-USDC") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), FirstLPQty, LPdecimals, true)
31+ let LPid = calculateAssetId(LPissue)
2632 if ((fetchpair == EnterAssetID))
2733 then throw("Pair Already Exist in List.")
2834 else if ((size(i.payments) != 2))
3541 then throw("Input String & Attached AssetID in payment2 is not matching.")
3642 else if ((WAVES == true))
3743 then throw("You Attached WAVES Asset ID for Listing, please attach Tokens You want to list in payment[2].")
38- 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), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry((toString(countdays()) + "_Day_Volume"), 0)]
44+ 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), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry((toString(countdays()) + "_Day_Volume"), 0), LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), FirstLPQty)]
3945 }
4046
4147
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let dAppSinceStart = 1695040080000
55
66 let USDCAssetID = base58'5bXgvADuVoFdhtF5uKZAEiVdAo7ZCWw151L4yyf1PiES'
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"))
26+ let name = info.name
27+ let decimals = info.decimals
28+ let LPdecimals = fraction((decimals + 6), 1, 2)
29+ let FirstLPQty = (1 * pow(10, 0, LPdecimals, 0, 0, CEILING))
30+ let LPissue = Issue((("LP-" + take(name, 8)) + "-USDC"), (((("LP-" + name) + "-USDC") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), FirstLPQty, LPdecimals, true)
31+ let LPid = calculateAssetId(LPissue)
2632 if ((fetchpair == EnterAssetID))
2733 then throw("Pair Already Exist in List.")
2834 else if ((size(i.payments) != 2))
2935 then throw("Two attached assets expected as payment. Kindly Attach payment1 = WAVES Token & payment2 = Token you want to List.")
3036 else if (isDefined(pmt1.assetId))
3137 then throw("Incorrect asset attached for Collateral, please attach WAVES only.")
3238 else if ((pmt1.amount != 10000000))
3339 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."))
3440 else if ((pmt2.assetId != assetinfopmt2))
3541 then throw("Input String & Attached AssetID in payment2 is not matching.")
3642 else if ((WAVES == true))
3743 then throw("You Attached WAVES Asset ID for Listing, please attach Tokens You want to list in payment[2].")
38- 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), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry((toString(countdays()) + "_Day_Volume"), 0)]
44+ 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), pmt2.amount), IntegerEntry(("Total_of_Pair_Txns_" + EnterAssetID), 0), IntegerEntry(((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0), IntegerEntry((toString(countdays()) + "_Day_Volume"), 0), LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), FirstLPQty)]
3945 }
4046
4147
4248
4349 @Callable(i)
4450 func IssueLPToken (EnterAssetID) = {
4551 let adminrights = valueOrErrorMessage(getString(this, "LP_Admin_Rights"), "LP Admin Rights are Not Included into Smart Contract. Deploy Admin Rights First.")
4652 let calleraddress = toBase58String(i.caller.bytes)
4753 let checkpairisavailableornot = valueOrErrorMessage(getString(this, ("Pair_UV_" + EnterAssetID)), "Asset not Found in Whitelisted Token")
4854 let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
4955 let name = info.name
5056 let decimals = info.decimals
5157 let FirstLPQty = (1 * pow(10, 0, fraction((decimals + 6), 1, 2), 0, 0, CEILING))
5258 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)
5359 let LPid = calculateAssetId(LPissue)
5460 if ((adminrights != calleraddress))
5561 then throw((("Your are not allowded to Issue LP Token. Only " + adminrights) + " can issue the LP Token."))
5662 else if ((checkpairisavailableornot != EnterAssetID))
5763 then throw("Pair is not available in List.")
5864 else [LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid)), IntegerEntry(("Total_LP_" + EnterAssetID), FirstLPQty)]
5965 }
6066
6167
6268
6369 @Callable(i)
6470 func SwapAssetToUSDCPairEntry (EnterAssetID) = {
6571 let calleraddress = toBase58String(i.caller.bytes)
6672 let pmt = if ((size(i.payments) == 1))
6773 then i.payments[0]
6874 else throw("Whitelisted Token is required as Attached payment[1].")
6975 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
7076 let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
7177 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
7278 let newbalanceofUSDC = fraction(CheckUSDCBalance, CheckAssetBalance, (CheckAssetBalance + pmt.amount))
7379 let quantityofpriceasset = (CheckUSDCBalance - newbalanceofUSDC)
7480 let SwapFee = 3
7581 let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
7682 let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
7783 let SumupofAssetToUSDCSwapFee = match getInteger(this, ((("Total_Swap_Fee_Collected_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
7884 case a: Int =>
7985 a
8086 case _ =>
8187 0
8288 }
8389 let NewSumupofAssetToUSDCSwapFee = ((SumupofAssetToUSDCSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
8490 let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
8591 case a: Int =>
8692 a
8793 case _ =>
8894 0
8995 }
9096 let NewSumupofAssetBalance = (CheckAssetBalance + pmt.amount)
9197 let SumupUSDCBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
9298 case a: Int =>
9399 a
94100 case _ =>
95101 0
96102 }
97103 let NewSumupofUSDCBalance = ((CheckUSDCBalance - quantityofpriceasset) + SwapFeetoreceive)
98104 let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
99105 case a: Int =>
100106 a
101107 case _ =>
102108 0
103109 }
104110 let NewTPT = (TOPT + 1)
105111 if ((EnterAssetID == toBase58String(USDCAssetID)))
106112 then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input & Attach Whitelisted Asset as an attachment Token in payment[1].")
107113 else if ((checkpairisavailableornot != EnterAssetID))
108114 then throw("Pair is not available in Whitelisted Asset.")
109115 else if ((pmt.assetId == USDCAssetID))
110116 then throw("You can't Attach USDC as an Attached Payment. Only Whitelisted Tokens are accepted.")
111117 else if ((pmt.assetId != fromBase58String(EnterAssetID)))
112118 then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
113119 else if ((CheckUSDCBalance == 0))
114120 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
115121 else if ((CheckAssetBalance == 0))
116122 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
117123 else if ((100000 > quantityofpriceasset))
118124 then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 0.1 dollar atleast."))
119125 else if ((quantityofpriceasset > CheckUSDCBalance))
120126 then throw((("Pool Only has a Liquidity of " + toString((CheckUSDCBalance / pow(10, 0, 6, 0, 0, CEILING)))) + " USDC. Add Liquidity into Pool."))
121127 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)]
122128 }
123129
124130
125131
126132 @Callable(i)
127133 func SwapUSDCToAssetPairEntry (EnterAssetID) = {
128134 let calleraddress = toBase58String(i.caller.bytes)
129135 let pmt = if ((size(i.payments) == 1))
130136 then i.payments[0]
131137 else throw((("Only " + toBase58String(USDCAssetID)) + " USDC Token is required as an Attached payment[1]."))
132138 let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
133139 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
134140 let newbalanceofAsset = fraction(CheckUSDCBalance, CheckAssetBalance, (CheckUSDCBalance + pmt.amount))
135141 let quantityofpriceasset = (CheckAssetBalance - newbalanceofAsset)
136142 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
137143 let SwapFee = 3
138144 let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 1000)
139145 let userbalancetoreceive = ((quantityofpriceasset - SwapFeetoreceive) - SwapFeetoreceive)
140146 let SumupofUSDCToAssetSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + EnterAssetID)) {
141147 case a: Int =>
142148 a
143149 case _ =>
144150 0
145151 }
146152 let NewSumupofUSDCToAssetSwapFee = ((SumupofUSDCToAssetSwapFee + SwapFeetoreceive) + SwapFeetoreceive)
147153 let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
148154 case a: Int =>
149155 a
150156 case _ =>
151157 0
152158 }
153159 let NewSumupofAssetBalance = ((CheckAssetBalance - quantityofpriceasset) + SwapFeetoreceive)
154160 let SumupUSDCBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
155161 case a: Int =>
156162 a
157163 case _ =>
158164 0
159165 }
160166 let NewSumupofUSDCBalance = (CheckUSDCBalance + pmt.amount)
161167 let TOPT = match getIntegerValue(this, ("Total_of_Pair_Txns_" + EnterAssetID)) {
162168 case a: Int =>
163169 a
164170 case _ =>
165171 0
166172 }
167173 let NewTPT = (TOPT + 1)
168174 if ((checkpairisavailableornot != EnterAssetID))
169175 then throw("Pair is not available in Whitelisted Asset.")
170176 else if ((EnterAssetID == toBase58String(USDCAssetID)))
171177 then throw("Input can Never be a USDC AssetID. Enter Whitelisted AssetID in input & Attach USDC as an attachment Token in payment[1].")
172178 else if ((pmt.assetId != USDCAssetID))
173179 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.")
174180 else if ((100000 > pmt.amount))
175181 then throw("Your Attached USDC Amount is very low. Attach Atleast 0.1 USDC to Claim the minimum Tokens.")
176182 else if ((CheckUSDCBalance == 0))
177183 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
178184 else if ((CheckAssetBalance == 0))
179185 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
180186 else if ((quantityofpriceasset > CheckAssetBalance))
181187 then throw((("Pool Only has a Liquidity of " + toString(CheckAssetBalance)) + " Tokens. Add Liquidity into Pool."))
182188 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))]
183189 }
184190
185191
186192
187193 @Callable(i)
188194 func AddLiquidity (EnterAssetID) = {
189195 let calleraddress = toBase58String(i.caller.bytes)
190196 let pmt1 = value(i.payments[0])
191197 let pmt2 = value(i.payments[1])
192198 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
193199 let ReissueassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or May be not Generated."))
194200 let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
195201 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
196202 let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
197203 let decimals = decimalsinfo.decimals
198204 let arg1 = CheckUSDCBalance
199205 let arg2 = CheckAssetBalance
200206 let args3 = pow((((arg1 * 1000000) / arg2) * pow(10, 0, decimals, 0, 0, CEILING)), 0, 1, 0, 0, CEILING)
201207 let bothassetsdecimals = (6 + decimals)
202208 let sharedecimals = (bothassetsdecimals / 2)
203209 let quantityofEnterAssetID = fraction(args3, pmt1.amount, pow(10, 0, bothassetsdecimals, 0, 0, CEILING))
204210 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)
205211 let USDCHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
206212 case a: Int =>
207213 a
208214 case _ =>
209215 0
210216 }
211217 let NewUSDCHoldingInPair = (USDCHoldingInPair + pmt2.amount)
212218 let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
213219 case a: Int =>
214220 a
215221 case _ =>
216222 0
217223 }
218224 let NewAssetHoldingInPair = (AssetHoldingInPair + pmt1.amount)
219225 let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
220226 case a: Int =>
221227 a
222228 case _ =>
223229 0
224230 }
225231 let NewLPTokenIssued = (LPTokenIssued + quantityofLPToken1)
226232 if ((checkpairisavailableornot != EnterAssetID))
227233 then throw("Pair is not available in Whitelisted Asset.")
228234 else if ((EnterAssetID == toBase58String(USDCAssetID)))
229235 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].")
230236 else if ((size(i.payments) != 2))
231237 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.")
232238 else if ((pmt1.assetId == USDCAssetID))
233239 then throw("You Attached USDC asset in payment[1], please attach only whitelisted Token in payment[1] along with USDC in payment[2].")
234240 else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
235241 then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
236242 else if ((pmt1.assetId != fromBase58String(EnterAssetID)))
237243 then throw("Incorrect asset attached for Liquidity in payment[1], please attach String Asset or Whitelisted Token only.")
238244 else if ((pmt2.assetId != USDCAssetID))
239245 then throw("Wrong Asset Attached in payments[2], Please attach payment[1] = Liquidity Token & payment[2] = USDC Token.")
240246 else if ((5000000 > pmt2.amount))
241247 then throw("please attach atleast 5 USDC in payment[2] & Equivalent worth of Token in payment[1]")
242248 else if ((pmt2.amount != quantityofEnterAssetID))
243249 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."))
244250 else if ((1 > quantityofLPToken1))
245251 then throw((("LP Token Outcome is going below " + toString(sharedecimals)) + " Decimals. Please Attach min. 1 LP token or 5 USDC Atleast."))
246252 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)]
247253 }
248254
249255
250256
251257 @Callable(i)
252258 func RemoveLiquidity (EnterAssetID) = {
253259 let calleraddress = toBase58String(i.caller.bytes)
254260 let pmt = if ((size(i.payments) == 1))
255261 then i.payments[0]
256262 else throw("No payment attached, Please Attach LP Token as payment[1].")
257263 let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
258264 let ReissueableassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or not Generated."))
259265 let decimalsinfo = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
260266 let decimals = decimalsinfo.decimals
261267 let bothassetsdecimals = (6 + decimals)
262268 let sharedecimals = (bothassetsdecimals / 2)
263269 let CheckTotalLPAmount = getIntegerValue(this, ("Total_LP_" + EnterAssetID))
264270 let UserLPPercentage = pow(fraction(pmt.amount, pow(10, 0, 8, 0, 0, CEILING), CheckTotalLPAmount), 6, 1, 0, 6, CEILING)
265271 let CheckUSDCBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID)))
266272 let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID))
267273 let UserLPWorthUSDC = fraction(CheckUSDCBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
268274 let UserLPWorthAsset = fraction(CheckAssetBalance, UserLPPercentage, pow(10, 0, 8, 0, 0, CEILING))
269275 let USDCHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDCAssetID))) {
270276 case a: Int =>
271277 a
272278 case _ =>
273279 0
274280 }
275281 let NewUSDCHoldingInPair = (USDCHoldingInPair - UserLPWorthUSDC)
276282 let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDCAssetID)) + "_") + EnterAssetID)) {
277283 case a: Int =>
278284 a
279285 case _ =>
280286 0
281287 }
282288 let NewAssetHoldingInPair = (AssetHoldingInPair - UserLPWorthAsset)
283289 let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
284290 case a: Int =>
285291 a
286292 case _ =>
287293 0
288294 }
289295 let NewLPTokenIssued = (LPTokenIssued - pmt.amount)
290296 if ((checkpairisavailableornot != EnterAssetID))
291297 then throw("Pair is not available in Whitelist.")
292298 else if ((fromBase58String(EnterAssetID) == USDCAssetID))
293299 then throw("Don't choose USDC AssetID as Input, Only Whitelisted Asset as Input String & Attach LP Tokens as payment[1]")
294300 else if ((pmt.assetId != ReissueableassetId))
295301 then throw("Wrong Asset is attached in payment[1] or LP Token Not Found or Missing.")
296302 else if ((1 > UserLPPercentage))
297303 then throw("Your LP Token amount % is very low to convert.")
298304 else if ((1 > UserLPWorthUSDC))
299305 then throw("Your LP Token conversion amount is very low to convert or less than 0.000001 USDC.")
300306 else if ((1 > UserLPWorthAsset))
301307 then throw("Your LP Token conversion amount is very low to convert or less than fraction value of Token.")
302308 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))]
303309 }
304310
305311
306312
307313 @Callable(i)
308314 func Del (Key) = [DeleteEntry(Key)]
309315
310316
311317 @Verifier(tx)
312318 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
313319

github/deemru/w8io/169f3d6 
50.48 ms