tx · GQ3SjQYKCsCfzgGwEMfidcuUgZQDoq3tWi1EQ3tLSEgD

3MshBTYYGc24JWzE2aYEktiz5KzeNQGA4GV:  -0.01400000 Waves

2021.08.29 21:08 [1679976] smart account 3MshBTYYGc24JWzE2aYEktiz5KzeNQGA4GV > SELF 0.00000000 Waves

{ "type": 13, "id": "GQ3SjQYKCsCfzgGwEMfidcuUgZQDoq3tWi1EQ3tLSEgD", "fee": 1400000, "feeAssetId": null, "timestamp": 1630260519153, "version": 2, "chainId": 84, "sender": "3MshBTYYGc24JWzE2aYEktiz5KzeNQGA4GV", "senderPublicKey": "GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr", "proofs": [ "QKy5Ub25YqPsoEjH6T3HnNA5ZnhJocbSsBiP3brNxGC4NAZg5XPxtGkT2mkVKznKck5yU6YqVCwNeTx9b7Fy8Cu" ], "script": "base64:AAIEAAAAAAAAADcIAhIAEgASBAoCCAESAwoBCBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCBIGCgQICAgIAAAABgAAAAALVVNEVEFzc2V0SUQBAAAAIAhlhLcP8IpqGvPiaOguCJAkw9MnWAPNLPYuXgvf2hWkAAAAAA1CYWxsZXRBc3NldElEAQAAACAtb1sBuZ3lSm8ahGink+4TF5YYAu/xRHYwe1h195OooAAAAAAXQ29sbGVjdEJhbGxldEZlZUFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEBAAAAIOOt17LUijbWojwDE5tgFkw1Y8cwIr3jselcewpp7rwjAAAAABVJc3N1ZUJhbGxldEZlZUFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEBAAAAIOOt17LUijbWojwDE5tgFkw1Y8cwIr3jselcewpp7rwjAAAAABlDb2xsZWN0VVNEVFN3YXBGZWVBZGRyZXNzCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABAQAAACDjrdey1Io21qI8AxObYBZMNWPHMCK947HpXHsKae68IwAAAAAaQ29sbGVjdEFzc2V0U3dhcEZlZUFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEBAAAAIOOt17LUijbWojwDE5tgFkw1Y8cwIr3jselcewpp7rwjAAAACwAAAAFpAQAAAAtJc3N1ZUJhbGxldAAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAKY3VycmVudEtleQkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAA5QcmljZVBlckJhbGxldAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwIAAAAJQkFMTEVUL1ROBAAAAA9OZXdCYWxsZXRUb1VzZXIJAABrAAAAAwAAAAAAAAGGoAgFAAAAA3BtdAAAAAZhbW91bnQFAAAADlByaWNlUGVyQmFsbGV0BAAAABRQcmV2aW91c0lzc3VlZEJhbGxldAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwIAAAAUVG90YWxfSXNzdWVkX0JhbGxldDoEAAAAEVRvdGFsSXNzdWVkQmFsbGV0CQAAZAAAAAIFAAAAFFByZXZpb3VzSXNzdWVkQmFsbGV0BQAAAA9OZXdCYWxsZXRUb1VzZXIEAAAAGlByZXZpb3VzQmFsbGV0UmVzZXJ2ZVZhbHVlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAABtUb3RhbF9CYWxsZXRfUmVzZXJ2ZV9Jbl9UTjoEAAAAEkJhbGxldFJlc2VydmVWYWx1ZQkAAGQAAAACBQAAABpQcmV2aW91c0JhbGxldFJlc2VydmVWYWx1ZQgFAAAAA3BtdAAAAAZhbW91bnQEAAAAGVByZXZpb3VzQmFsbGV0QmFja3VwUHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAAGkJhbGxldF9CYWNrdXBfVmFsdWVfSW5fVE46BAAAABFCYWxsZXRCYWNrdXBQcmljZQkAAGsAAAADAAAAAAAAAYagBQAAABJCYWxsZXRSZXNlcnZlVmFsdWUFAAAAEVRvdGFsSXNzdWVkQmFsbGV0BAAAAA1GZWVQZXJjZW50YWdlAAAAAAAAAAABBAAAABtCYWxhbmNlVG9rZW5zUmV0dXJuZWRUb1VzZXIJAABlAAAAAgAAAAAAAAAAZAUAAAANRmVlUGVyY2VudGFnZQMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAArSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLCBwbGVhc2UgYXR0YWNoIFROLgMJAABmAAAAAgAAAAAAAExLQAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQIAAAA0UGxlYXNlIEF0dGFjaCBtaW5pbXVtIDAuMDUgVE4gVG8gSXNzdWUgQmFsbGV0IEFzc2V0LgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAUVG90YWxfSXNzdWVkX0JhbGxldDoFAAAAEVRvdGFsSXNzdWVkQmFsbGV0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABtUb3RhbF9CYWxsZXRfUmVzZXJ2ZV9Jbl9UTjoFAAAAEkJhbGxldFJlc2VydmVWYWx1ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAaQmFsbGV0X0JhY2t1cF9WYWx1ZV9Jbl9UTjoFAAAAEUJhbGxldEJhY2t1cFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAAB21lc3NhZ2UCAAAAKDxoMT5CYWxsZXQgSXNzdWVkIFN1Y2Nlc3NmdWxseSE8L2gxPjxicj4JAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAA1CYWxsZXRBc3NldElEBQAAAA9OZXdCYWxsZXRUb1VzZXIGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgkAAGkAAAACCQAAaAAAAAIFAAAAD05ld0JhbGxldFRvVXNlcgUAAAAbQmFsYW5jZVRva2Vuc1JldHVybmVkVG9Vc2VyAAAAAAAAAABkBQAAAA1CYWxsZXRBc3NldElECQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAFUlzc3VlQmFsbGV0RmVlQWRkcmVzcwkAAGkAAAACCQAAaAAAAAIFAAAAD05ld0JhbGxldFRvVXNlcgUAAAANRmVlUGVyY2VudGFnZQAAAAAAAAAAZAUAAAANQmFsbGV0QXNzZXRJRAUAAAADbmlsAAAAAWkBAAAACUxpcXVpZGF0ZQAAAAAEAAAACmN1cnJlbnRLZXkJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAFFByZXZpb3VzSXNzdWVkQmFsbGV0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAABRUb3RhbF9Jc3N1ZWRfQmFsbGV0OgQAAAARVG90YWxJc3N1ZWRCYWxsZXQJAABlAAAAAgUAAAAUUHJldmlvdXNJc3N1ZWRCYWxsZXQIBQAAAANwbXQAAAAGYW1vdW50BAAAABpQcmV2aW91c0JhbGxldFJlc2VydmVWYWx1ZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwIAAAAbVG90YWxfQmFsbGV0X1Jlc2VydmVfSW5fVE46BAAAABlQcmV2aW91c0JhbGxldEJhY2t1cFByaWNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAABpCYWxsZXRfQmFja3VwX1ZhbHVlX0luX1ROOgQAAAASY2FsY3VsYXRlYnVybnZhbHVlCQAAawAAAAMFAAAAGVByZXZpb3VzQmFsbGV0QmFja3VwUHJpY2UIBQAAAANwbXQAAAAGYW1vdW50AAAAAAAAAYagBAAAABJCYWxsZXRSZXNlcnZlVmFsdWUJAABlAAAAAgUAAAAaUHJldmlvdXNCYWxsZXRSZXNlcnZlVmFsdWUFAAAAEmNhbGN1bGF0ZWJ1cm52YWx1ZQQAAAARQmFsbGV0QmFja3VwUHJpY2UJAABrAAAAAwAAAAAAAAGGoAUAAAASQmFsbGV0UmVzZXJ2ZVZhbHVlBQAAABFUb3RhbElzc3VlZEJhbGxldAMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAANQmFsbGV0QXNzZXRJRAkAAAIAAAABAgAAAEpLaW5kbHkgRGVwb3NpdCBPbmx5IDQ0TXE4S3FVaE05NHQ5M01pQnEzUzIyaWl1R2N6TXhwS21zZTVkQnkydzV5IChCYWxsZXQpLgMJAABmAAAAAgAAAAAAAAGGoAgFAAAAA3BtdAAAAAZhbW91bnQJAAACAAAAAQIAAAAwQXR0YWNoIEFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLjAwMSBCYWxsZXQuCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAANQmFsbGV0QXNzZXRJRAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAFFRvdGFsX0lzc3VlZF9CYWxsZXQ6BQAAABFUb3RhbElzc3VlZEJhbGxldAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAbVG90YWxfQmFsbGV0X1Jlc2VydmVfSW5fVE46BQAAABJCYWxsZXRSZXNlcnZlVmFsdWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAGkJhbGxldF9CYWNrdXBfVmFsdWVf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MC4xIFROIFRva2VuIGlzIHJlcXVpcmVkIGFzIEF0dGFjaGVkIHBheW1lbnQuBAAAAA1jYWxsZXJhZGRyZXNzCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAADmNoZWNrZW5kaGVpZ2h0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAICAAAAClZvdGluZ19FSF8FAAAADEVudGVyQXNzZXRJRAQAAAAZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAICAAAACFBhaXJfVVZfBQAAAAxFbnRlckFzc2V0SUQEAAAAFmNoZWNrdXNlcnZvdGluZ2JhbGFuY2UJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtWb3Rlc19SY3ZkXwUAAAANY2FsbGVyYWRkcmVzcwIAAAABXwUAAAAMRW50ZXJBc3NldElECQABLAAAAAIFAAAADWNhbGxlcmFkZHJlc3MCAAAAJyBBZGRyZXNzIG5ldmVyIHZvdGVkIGFuZCBleGlzdCBpbiBsaXN0LgQAAAAdcGVuZGluZ2Jsb2Nrc2ZvcnByb2plY3RleHBpcmUJAABlAAAAAgUAAAAOY2hlY2tlbmRoZWlnaHQFAAAABmhlaWdodAMJAQAAAAIhPQAAAAIFAAAAGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFAAAADEVudGVyQXNzZXRJRAkAAAIAAAABAgAAACVQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gVm90aW5nIExpc3QuAwkAAGYAAAACBQAAAA5jaGVja2VuZGhlaWdodAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAEFWb3RpbmcgQWxyZWFkeSBSdW5uaW5nLiBZb3UgY2FuIHdpdGhkcmF3IHlvdXIgQmFsbGV0IFRva2VuIGFmdGVyIAkAAaQAAAABBQAAAB1wZW5kaW5nYmxvY2tzZm9ycHJvamVjdGV4cGlyZQIAAAAHIGJsb2NrcwMJAABnAAAAAgAAAAAAAAAAAAUAAAAWY2hlY2t1c2Vydm90aW5nYmFsYW5jZQkAAAIAAAABAgAAAD5Zb3UgZG9uJ3QgaGF2ZSBhbnkgZHVlcyBvZiBiYWxsZXQgYmFsYW5jZSBpbiB0aGlzIFZvdGluZyBQYWlyLgMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQJAAACAAAAAQIAAABRRG9uJ3QgYXR0YWNoIGFueSBvdGhlciBhc3NldC4gUGxlYXNlIGF0dGFjaCAwLjEgVE4gYXMgYSBmZWUgdG8gcmVsZWFzZSB5b3VyIHRva2VuAwkBAAAAAiE9AAAAAggFAAAAA3BtdAAAAAZhbW91bnQAAAAAAACYloAJAAACAAAAAQIAAAA0UGxlYXNlIGF0dGFjaCAwLjEgVE4gYXMgYSBmZWUgdG8gcmVsZWFzZSB5b3VyIHRva2VuLgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALVm90ZXNfUmN2ZF8FAAAADWNhbGxlcmFkZHJlc3MCAAAAAV8FAAAADEVudGVyQXNzZXRJRAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFmNoZWNrdXNlcnZvdGluZ2JhbGFuY2UFAAAADUJhbGxldEFzc2V0SUQFAAAAA25pbAAAAAFpAQAAAAxJc3N1ZUxQVG9rZW4AAAABAAAADEVudGVyQXNzZXRJRAQAAAALYWRtaW5yaWdodHMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzAgAAAA9MUF9BZG1pbl9SaWdodHMCAAAAUExQIEFkbWluIFJpZ2h0cyBhcmUgTm90IEluY2x1ZGVkIGludG8gU21hcnQgQ29udHJhY3QuIERlcGxveSBBZG1pbiBSaWdodHMgRmlyc3QuBAAAAA1jYWxsZXJhZGRyZXNzCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAAGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQABLAAAAAICAAAACFBhaXJfVVZfBQAAAAxFbnRlckFzc2V0SUQCAAAAJEFzc2V0IG5vdCBGb3VuZCBpbiBXaGl0ZWxpc3RlZCBUb2tlbgQAAAAEaW5mbwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEJAAJZAAAAAQUAAAAMRW50ZXJBc3NldElECQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAAxFbnRlckFzc2V0SUQCAAAADiBkb2Vzbid0IGV4aXN0BAAAAARuYW1lCAUAAAAEaW5mbwAAAARuYW1lBAAAAA9OZXdWb3RpbmdTdGF0dXMCAAAAAVAEAAAADFZvdGluZ1N0YXR1cwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgIAAAAOVm90aW5nX1N0YXR1c18FAAAADEVudGVyQXNzZXRJRAkAASwAAAACAgAAAB1Wb3RpbmcgU3RhdHVzIGlzIE1pc3NpbmcgZm9yIAUAAAAMRW50ZXJBc3NldElEBAAAAAdMUGlzc3VlCQAEQgAAAAUJAAEsAAAAAgkAASwAAAACAgAAAANMUC0FAAAABG5hbWUCAAAABS1VU0RUCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAA0xQLQUAAAAEbmFtZQIAAAAFLVVTRFQCAAAALiBpcyBhIExpcXVpZGl0eSBQcm92aWRlciBUb2tlbiBJc3N1ZWQgQWdhaW5zdCAFAAAADEVudGVyQXNzZXRJRAAAAAAAAAAAAQAAAAAAAAAAAAYEAAAABExQaWQJAAQ4AAAAAQUAAAAHTFBpc3N1ZQMJAQAAAAIhPQAAAAIFAAAAC2FkbWlucmlnaHRzBQAAAA1jYWxsZXJhZGRyZXNzCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAC5Zb3VyIGFyZSBub3QgYWxsb3dkZWQgdG8gSXNzdWUgTFAgVG9rZW4uIE9ubHkgBQAAAAthZG1pbnJpZ2h0cwIAAAAYIGNhbiBpc3N1ZSB0aGUgTFAgVG9rZW4uAwkBAAAAAiE9AAAAAgUAAAAZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAUAAAAMRW50ZXJBc3NldElECQAAAgAAAAECAAAAJVBhaXIgaXMgbm90IGF2YWlsYWJsZSBpbiBWb3RpbmcgTGlzdC4DCQEAAAACIT0AAAACBQAAAAxWb3RpbmdTdGF0dXMFAAAAD05ld1ZvdGluZ1N0YXR1cwkAAAIAAAABAgAAACVMUCBUb2tlbiBtdXN0IGJlIGEgV2hpdGVsaXN0ZWQgVG9rZW4uCQAETAAAAAIFAAAAB0xQaXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACAgAAAANMUF8FAAAADEVudGVyQXNzZXRJRAkAAlgAAAABBQAAAARMUGlkBQAAAANuaWwAAAABaQEAAAAYU3dhcEFzc2V0VG9VU0RUUGFpckVudHJ5AAAAAQAAAAxFbnRlckFzc2V0SUQEAAAADWNhbGxlcmFkZHJlc3MJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAADcG10AwkAAAAAAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAANVdoaXRlbGlzdGVkIFRva2VuIGlzIHJlcXVpcmVkIGFzIEF0dGFjaGVkIHBheW1lbnRbMV0uBAAAABljaGVja3BhaXJpc2F2YWlsYWJsZW9ybm90CQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgIAAAAIUGFpcl9VVl8FAAAADEVudGVyQXNzZXRJRAQAAAAMVm90aW5nU3RhdHVzCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzCQABLAAAAAICAAAADlZvdGluZ19TdGF0dXNfBQAAAAxFbnRlckFzc2V0SUQEAAAAEENoZWNrVVNEVEJhbGFuY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAC0JhbGFuY2Vfb2ZfBQAAAAxFbnRlckFzc2V0SUQCAAAAAV8JAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQEAAAAEUNoZWNrQXNzZXRCYWxhbmNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwkAAlgAAAABBQAAAAtVU0RUQXNzZXRJRAIAAAABXwUAAAAMRW50ZXJBc3NldElEBAAAABBuZXdiYWxhbmNlb2ZVU0RUCQAAawAAAAMFAAAAEENoZWNrVVNEVEJhbGFuY2UFAAAAEUNoZWNrQXNzZXRCYWxhbmNlCQAAZAAAAAIFAAAAEUNoZWNrQXNzZXRCYWxhbmNlCAUAAAADcG10AAAABmFtb3VudAQAAAAUcXVhbnRpdHlvZnByaWNlYXNzZXQJAABlAAAAAgUAAAAQQ2hlY2tVU0RUQmFsYW5jZQUAAAAQbmV3YmFsYW5jZW9mVVNEVAQAAAATQ3VycmVudFZvdGluZ1N0YXR1cwIAAAABRgQAAAAHU3dhcEZlZQAAAAAAAAAAAQQAAAAQU3dhcEZlZXRvcmVjZWl2ZQkAAGkAAAACCQAAaAAAAAIFAAAAFHF1YW50aXR5b2ZwcmljZWFzc2V0BQAAAAdTd2FwRmVlAAAAAAAAAABkBAAAABR1c2VyYmFsYW5jZXRvcmVjZWl2ZQkAAGUAAAACBQAAABRxdWFudGl0eW9mcHJpY2Vhc3NldAUAAAAQU3dhcEZlZXRvcmVjZWl2ZQQAAAAZU3VtdXBvZkFzc2V0VG9VU0RUU3dhcEZlZQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQABLAAAAAICAAAAGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8JAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAQAAAAcTmV3U3VtdXBvZkFzc2V0VG9VU0RUU3dhcEZlZQkAAGQAAAACBQAAABlTdW11cG9mQXNzZXRUb1VTRFRTd2FwRmVlBQAAABBTd2FwRmVldG9yZWNlaXZlBAAAABFTdW11cEFzc2V0QmFsYW5jZQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwkAAlgAAAABBQAAAAtVU0RUQXNzZXRJRAIAAAABXwUAAAAMRW50ZXJBc3NldElEAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAEAAAAFk5ld1N1bXVwb2ZBc3NldEJhbGFuY2UJAABkAAAAAgUAAAARQ2hlY2tBc3NldEJhbGFuY2UIBQAAAANwbXQAAAAGYW1vdW50BAAAABBTdW11cFVTRFRCYWxhbmNlBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAC0JhbGFuY2Vfb2ZfBQAAAAxFbnRlckFzc2V0SUQCAAAAAV8JAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAQAAAAVTmV3U3VtdXBvZlVTRFRCYWxhbmNlCQAAZQAAAAIFAAAAEENoZWNrVVNEVEJhbGFuY2UFAAAAFHF1YW50aXR5b2ZwcmljZWFzc2V0BAAAAA9TdW11cG9mU3dhcFR4bnMEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwIAAAATVG90YWxfb2ZfU3dhcHNfVHhucwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAABAAAABJOZXdTdW11cG9mU3dhcFR4bnMJAABkAAAAAgUAAAAPU3VtdXBvZlN3YXBUeG5zAAAAAAAAAAABAwkAAAAAAAACBQAAAAxFbnRlckFzc2V0SUQJAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQJAAACAAAAAQIAAACISW5wdXQgY2FuIE5ldmVyIGJlIGEgVVNEVCBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0IGFuZCBBdHRhY2ggV2hpdGVsaXN0ZWQgQXNzZXQgYXMgYW4gYXR0YWNobWVudCBUb2tlbiBpbiBwYXltZW50WzFdLgMJAQAAAAIhPQAAAAIFAAAAGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFAAAADEVudGVyQXNzZXRJRAkAAAIAAAABAgAAACtQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAAAAAACBQAAAAxWb3RpbmdTdGF0dXMFAAAAE0N1cnJlbnRWb3RpbmdTdGF0dXMJAAACAAAAAQkAASwAAAACBQAAAAxFbnRlckFzc2V0SUQCAAAAICBpcyBub3QgQSBXaGl0ZWxpc3RlZCBUb2tlbiBZZXQuAwkAAAAAAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAC1VTRFRBc3NldElECQAAAgAAAAECAAAAU1lvdSBjYW4ndCBBdHRhY2ggVVNEVCBhcyBhbiBBdHRhY2hlZCBQYXltZW50LiBPbmx5IFdoaXRlbGlzdGVkIFRva2VucyBhcmUgYWNjZXB0ZWQuAwkBAAAAAiE9AAAAAggFAAAAA3BtdAAAAAdhc3NldElkCQACWQAAAAEFAAAADEVudGVyQXNzZXRJRAkAAAIAAAABCQABLAAAAAICAAAAMEluY29ycmVjdCBhc3NldCBhdHRhY2hlZCwgcGxlYXNlIGF0dGFjaCBvciBzZW5kIAUAAAAMRW50ZXJBc3NldElEAwkAAAAAAAACBQAAABBDaGVja1VTRFRCYWxhbmNlAAAAAAAAAAAACQAAAgAAAAECAAAAZVN3YXAgUGFpciBOZWVkIHRvIEFkZCBMaXF1aWRpdHkgZmlyc3QgaW50byBQb29sLiBPbmx5IEFmdGVyIHRoYXQgUGFpciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgU3dhcHBpbmcuAwkAAAAAAAACBQAAABFDaGVja0Fzc2V0QmFsYW5jZQAAAAAAAAAAAAkAAAIAAAABAgAAAGVTd2FwIFBhaXIgTmVlZCB0byBBZGQgTGlxdWlkaXR5IGZpcnN0IGludG8gUG9vbC4gT25seSBBZnRlciB0aGF0IFBhaXIgd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIFN3YXBwaW5nLgMJAABmAAAAAgAAAAAAAA9CQAUAAAAUcXVhbnRpdHlvZnByaWNlYXNzZXQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAANFlvdXIgQXR0YWNoZWQgQXNzZXQgQW1vdW50IGlzIHZlcnkgbG93LiBBdHRhY2ggTW9yZSAFAAAADEVudGVyQXNzZXRJRAIAAAA4IFRva2VucyB0byBDbGFpbSB0aGUgbWluaW11bSBBbW91bnQgb2YgMSBkb2xsYXIgYXRsZWFzdC4DCQAAZgAAAAIFAAAAFHF1YW50aXR5b2ZwcmljZWFzc2V0BQAAABBDaGVja1VTRFRCYWxhbmNlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAB1Qb29sIE9ubHkgaGFzIGEgTGlxdWlkaXR5IG9mIAkAAaQAAAABCQAAaQAAAAIFAAAAEENoZWNrVVNEVEJhbGFuY2UJAABsAAAABgAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAUAAAACVVACAAAAHyBVU0RULiBBZGQgTGlxdWlkaXR5IGludG8gUG9vbC4JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAZVG90YWxfU3dhcF9GZWVfQ29sbGVjdGVkXwkAAlgAAAABBQAAAAtVU0RUQXNzZXRJRAUAAAAcTmV3U3VtdXBvZkFzc2V0VG9VU0RUU3dhcEZlZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAATVG90YWxfb2ZfU3dhcHNfVHhucwUAAAASTmV3U3VtdXBvZlN3YXBUeG5zCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwkAAlgAAAABBQAAAAtVU0RUQXNzZXRJRAIAAAABXwUAAAAMRW50ZXJBc3NldElEBQAAABZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwUAAAAMRW50ZXJBc3NldElEAgAAAAFfCQACWAAAAAEFAAAAC1VTRFRBc3NldElEBQAAABVOZXdTdW11cG9mVVNEVEJhbGFuY2UJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABR1c2VyYmFsYW5jZXRvcmVjZWl2ZQUAAAALVVNEVEFzc2V0SUQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAZQ29sbGVjdFVTRFRTd2FwRmVlQWRkcmVzcwUAAAAQU3dhcEZlZXRvcmVjZWl2ZQUAAAALVVNEVEFzc2V0SUQFAAAAA25pbAAAAAFpAQAAABhTd2FwVVNEVFRvQXNzZXRQYWlyRW50cnkAAAABAAAADEVudGVyQXNzZXRJRAQAAAANY2FsbGVyYWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAANwbXQDCQAAAAAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAA2T25seSBVU0RUIFRva2VuIGlzIHJlcXVpcmVkIGFzIGFuIEF0dGFjaGVkIHBheW1lbnRbMV0uBAAAABBDaGVja1VTRFRCYWxhbmNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwUAAAAMRW50ZXJBc3NldElEAgAAAAFfCQACWAAAAAEFAAAAC1VTRFRBc3NldElEBAAAABFDaGVja0Fzc2V0QmFsYW5jZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALQmFsYW5jZV9vZl8JAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQCAAAAAV8FAAAADEVudGVyQXNzZXRJRAQAAAARbmV3YmFsYW5jZW9mQXNzZXQJAABrAAAAAwUAAAAQQ2hlY2tVU0RUQmFsYW5jZQUAAAARQ2hlY2tBc3NldEJhbGFuY2UJAABkAAAAAgUAAAAQQ2hlY2tVU0RUQmFsYW5jZQgFAAAAA3BtdAAAAAZhbW91bnQEAAAAFHF1YW50aXR5b2ZwcmljZWFzc2V0CQAAZQAAAAIFAAAAEUNoZWNrQXNzZXRCYWxhbmNlBQAAABFuZXdiYWxhbmNlb2ZBc3NldAQAAAAZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAICAAAACFBhaXJfVVZfBQAAAAxFbnRlckFzc2V0SUQEAAAADFZvdGluZ1N0YXR1cwkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkAASwAAAACAgAAAA5Wb3RpbmdfU3RhdHVzXwUAAAAMRW50ZXJBc3NldElEBAAAABNDdXJyZW50Vm90aW5nU3RhdHVzAgAAAAFGBAAAAAdTd2FwRmVlAAAAAAAAAAABBAAAABBTd2FwRmVldG9yZWNlaXZlCQAAaQAAAAIJAABoAAAAAgUAAAAUcXVhbnRpdHlvZnByaWNlYXNzZXQFAAAAB1N3YXBGZWUAAAAAAAAAAGQEAAAAFHVzZXJiYWxhbmNldG9yZWNlaXZlCQAAZQAAAAIFAAAAFHF1YW50aXR5b2ZwcmljZWFzc2V0BQAAABBTd2FwRmVldG9yZWNlaXZlBAAAAA9TdW11cG9mU3dhcFR4bnMEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwIAAAATVG90YWxfb2ZfU3dhcHNfVHhucwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAABAAAABJOZXdTdW11cG9mU3dhcFR4bnMJAABkAAAAAgUAAAAPU3VtdXBvZlN3YXBUeG5zAAAAAAAAAAABBAAAABlTdW11cG9mVVNEVFRvQXNzZXRTd2FwRmVlBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgIAAAAZVG90YWxfU3dhcF9GZWVfQ29sbGVjdGVkXwUAAAAMRW50ZXJBc3NldElEAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAEAAAAHE5ld1N1bXVwb2ZVU0RUVG9Bc3NldFN3YXBGZWUJAABkAAAAAgUAAAAZU3VtdXBvZlVTRFRUb0Fzc2V0U3dhcEZlZQUAAAAQU3dhcEZlZXRvcmVjZWl2ZQQAAAARU3VtdXBBc3NldEJhbGFuY2UEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALQmFsYW5jZV9vZl8JAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQCAAAAAV8FAAAADEVudGVyQXNzZXRJRAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAABAAAABZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQAAZQAAAAIFAAAAEUNoZWNrQXNzZXRCYWxhbmNlBQAAABRxdWFudGl0eW9mcHJpY2Vhc3NldAQAAAAQU3VtdXBVU0RUQmFsYW5jZQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwUAAAAMRW50ZXJBc3NldElEAgAAAAFfCQACWAAAAAEFAAAAC1VTRFRBc3NldElEAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAEAAAAFU5ld1N1bXVwb2ZVU0RUQmFsYW5jZQkAAGQAAAACBQAAABBDaGVja1VTRFRCYWxhbmNlCAUAAAADcG10AAAABmFtb3VudAMJAQAAAAIhPQAAAAIFAAAAGWNoZWNrcGFpcmlzYXZhaWxhYmxlb3Jub3QFAAAADEVudGVyQXNzZXRJRAkAAAIAAAABAgAAACtQYWlyIGlzIG5vdCBhdmFpbGFibGUgaW4gV2hpdGVsaXN0ZWQgQXNzZXQuAwkAAAAAAAACBQAAAAxWb3RpbmdTdGF0dXMFAAAAE0N1cnJlbnRWb3RpbmdTdGF0dXMJAAACAAAAAQkAASwAAAACBQAAAAxFbnRlckFzc2V0SUQCAAAAICBpcyBub3QgQSBXaGl0ZWxpc3RlZCBUb2tlbiBZZXQuAwkAAAAAAAACBQAAAAxFbnRlckFzc2V0SUQJAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQJAAACAAAAAQIAAAB7SW5wdXQgY2FuIE5ldmVyIGJlIGEgVVNEVCBBc3NldElELiBFbnRlciBXaGl0ZWxpc3RlZCBBc3NldElEIGluIGlucHV0IGFuZCBBdHRhY2ggVVNEVCBhcyBhbiBhdHRhY2htZW50IFRva2VuIGluIHBheW1lbnRbMV0uAwkBAAAAAiE9AAAAAggFAAAAA3BtdAAAAAdhc3NldElkBQAAAAtVU0RUQXNzZXRJRAkAAAIAAAABAgAAAH5Zb3UgY2FuIEF0dGFjaCBVU0RUIGFzIGFuIEF0dGFjaGVkIFBheW1lbnRbMV0gdG8gU3dhcCBVU0RUIFRvIFJlcXVpcmVkIFRva2VuLiBBbnkgb3RoZXIgYXNzZXQgZWxzZSB0aGFuIFVTRFQgd2lsbCBiZSByZWplY3RlZC4DCQAAZgAAAAIAAAAAAAAPQkAIBQAAAANwbXQAAAAGYW1vdW50CQAAAgAAAAECAAAAWVlvdXIgQXR0YWNoZWQgVVNEVCBBbW91bnQgaXMgdmVyeSBsb3cuIEF0dGFjaCBBdGxlYXN0IDEgVVNEVCB0byBDbGFpbSB0aGUgbWluaW11bSBUb2tlbnMuAwkAAAAAAAACBQAAABBDaGVja1VTRFRCYWxhbmNlAAAAAAAAAAAACQAAAgAAAAECAAAAZVN3YXAgUGFpciBOZWVkIHRvIEFkZCBMaXF1aWRpdHkgZmlyc3QgaW50byBQb29sLiBPbmx5IEFmdGVyIHRoYXQgUGFpciB3aWxsIGJlIGFjdGl2YXRlZCBmb3IgU3dhcHBpbmcuAwkAAAAAAAACBQAAABFDaGVja0Fzc2V0QmFsYW5jZQAAAAAAAAAAAAkAAAIAAAABAgAAAGVTd2FwIFBhaXIgTmVlZCB0byBBZGQgTGlxdWlkaXR5IGZpcnN0IGludG8gUG9vbC4gT25seSBBZnRlciB0aGF0IFBhaXIgd2lsbCBiZSBhY3RpdmF0ZWQgZm9yIFN3YXBwaW5nLgMJAABmAAAAAgUAAAAUcXVhbnRpdHlvZnByaWNlYXNzZXQFAAAAEUNoZWNrQXNzZXRCYWxhbmNlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAB1Qb29sIE9ubHkgaGFzIGEgTGlxdWlkaXR5IG9mIAkAAaQAAAABBQAAABFDaGVja0Fzc2V0QmFsYW5jZQIAAAAhIFRva2Vucy4gQWRkIExpcXVpZGl0eSBpbnRvIFBvb2wuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAICAAAAGVRvdGFsX1N3YXBfRmVlX0NvbGxlY3RlZF8FAAAADEVudGVyQXNzZXRJRAUAAAAcTmV3U3VtdXBvZlVTRFRUb0Fzc2V0U3dhcEZlZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAATVG90YWxfb2ZfU3dhcHNfVHhucwUAAAASTmV3U3VtdXBvZlN3YXBUeG5zCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwkAAlgAAAABBQAAAAtVU0RUQXNzZXRJRAIAAAABXwUAAAAMRW50ZXJBc3NldElEBQAAABZOZXdTdW11cG9mQXNzZXRCYWxhbmNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwUAAAAMRW50ZXJBc3NldElEAgAAAAFfCQACWAAAAAEFAAAAC1VTRFRBc3NldElEBQAAABVOZXdTdW11cG9mVVNEVEJhbGFuY2UJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABR1c2VyYmFsYW5jZXRvcmVjZWl2ZQkAAlkAAAABBQAAAAxFbnRlckFzc2V0SUQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAaQ29sbGVjdEFzc2V0U3dhcEZlZUFkZHJlc3MFAAAAEFN3YXBGZWV0b3JlY2VpdmUJAAJZAAAAAQUAAAAMRW50ZXJBc3NldElEBQAAAANuaWwAAAABaQEAAAAMQWRkTGlxdWlkaXR5AAAAAQAAAAxFbnRlckFzc2V0SUQEAAAADWNhbGxlcmFkZHJlc3MJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAEcG10MQkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAEcG10MgkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQQAAAAZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAICAAAACFBhaXJfVVZfBQAAAAxFbnRlckFzc2V0SUQEAAAADFZvdGluZ1N0YXR1cwkBAAAAEUBleHRy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IFlldC4DCQAAAAAAAAIFAAAADEVudGVyQXNzZXRJRAkAAlgAAAABBQAAAAtVU0RUQXNzZXRJRAkAAAIAAAABAgAAAJRJbnB1dCBjYW4gTmV2ZXIgYmUgYSBVU0RUIEFzc2V0SUQuIEVudGVyIFdoaXRlbGlzdGVkIEFzc2V0SUQgaW4gaW5wdXQgYXMgd2VsbCBhcyBpbiBwYXltZW50WzFdIGFuZCBBdHRhY2ggVVNEVCBhcyBhbiBhdHRhY2htZW50IFRva2VuIGluIHBheW1lbnRbMl0uAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAAItUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkIGFzIHBheW1lbnQgaW4gNTAlLTUwJS4gS2luZGx5IEF0dGFjaCBwYXltZW50MSA9IFVTRFQgVG9rZW4gYW5kIHBheW1lbnQyID0gVG9rZW4geW91IHdhbnQgdG8gYWRkIGZvciBMaXF1aWRpdHkuAwkBAAAAAiE9AAAAAggFAAAABHBtdDEAAAAHYXNzZXRJZAUAAAALVVNEVEFzc2V0SUQJAAACAAAAAQIAAABUSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkIGZvciBMaXF1aWRpdHkgaW4gcGF5bWVudFsxXSwgcGxlYXNlIGF0dGFjaCBVU0RUIFRva2VuIG9ubHkuAwkAAGYAAAACAAAAAAAAmJaACAUAAAAEcG10MQAAAAZhbW91bnQJAAACAAAAAQIAAAAscGxlYXNlIGF0dGFjaCBhdGxlYXN0IDEwIFVTRFQgaW4gcGF5bWVudFsxXS4DCQAAAAAAAAIIBQAAAARwbXQyAAAAB2Fzc2V0SWQFAAAAC1VTRFRBc3NldElECQAAAgAAAAECAAAAj1lvdSBBdHRhY2hlZCBVU0RUIGFzc2V0IGZvciBMaXF1aWRpdHkgaW4gYm90aCBwYXltZW50cywgS2luZGx5IEF0dGFjaCBwYXltZW50MSA9IFVTRFQgVG9rZW4gYW5kIHBheW1lbnQyID0gVG9rZW4geW91IHdhbnQgdG8gYWRkIGZvciBMaXF1aWRpdHkuAwkBAAAAAiE9AAAAAggFAAAABHBtdDIAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAxFbnRlckFzc2V0SUQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAADUFzc2V0IFN0cmluZyAFAAAADEVudGVyQXNzZXRJRAIAAABOIGlzIG5vdCBtYXRjaGluZyB3aXRoIGF0dGFjaGVkIHBheW1lbnRbMl0uIFN0cmluZyBhbmQgcGF5bWVudFsyXSBtdXN0IGJlIHNhbWUuAwkBAAAAAiE9AAAAAggFAAAABHBtdDIAAAAGYW1vdW50BQAAABZxdWFudGl0eW9mRW50ZXJBc3NldElECQAAAgAAAAEJAAEsAAAAAgIAAABYQXR0YWNoZWQgcGF5bWVudFsyXSBxdWFudGl0eSBpcyBub3QgbWF0Y2hpbmcgYXMgcGVyIGF0dGFjaGVkIHBheW1lbnRbMV0gVVNEVC5JdCBtdXN0IGJlIAkAAaQAAAABBQAAABZxdWFudGl0eW9mRW50ZXJBc3NldElECQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAtCYWxhbmNlX29mXwUAAAAMRW50ZXJBc3NldElEAgAAAAFfCQACWAAAAAEFAAAAC1VTRFRBc3NldElEBQAAABROZXdVU0RUSG9sZGluZ0luUGFpcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALQmFsYW5jZV9vZl8JAAJYAAAAAQUAAAALVVNEVEFzc2V0SUQCAAAAAV8FAAAADEVudGVyQXNzZXRJRAUAAAAVTmV3QXNzZXRIb2xkaW5nSW5QYWlyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAICAAAACVRvdGFsX0xQXwUAAAAMRW50ZXJBc3NldElEBQAAABBOZXdMUFRva2VuSXNzdWVkCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAOUmVpc3N1ZWFzc2V0SWQFAAAAEnF1YW50aXR5b2ZMUFRva2VuMQYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABJxdWFudGl0eW9mTFBUb2tlbjEFAAAADlJlaXNzdWVhc3NldElkBQAAAANuaWwAAAABaQEAAAAPUmVtb3ZlUGFpckVudHJ5AAAAAQAAAAxFbnRlckFzc2V0SUQEAAAAC2FkbWlucmlnaHRzCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzAgAAABVQb2xhcml0eV9BZG1pbl9SaWdodHMEAAAADmNoZWNrZW5kaGVpZ2h0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQABLAAAAAICAAAAClZvdGluZ19FSF8FAAAADEVudGVyQXNzZXRJRAQAAAAZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAICAAAACFBhaXJfVVZfBQAAAAxFbnRlckFzc2V0SUQEAAAADFZvdGluZ1N0YXR1cwkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkAASwAAAACAgAAAA5Wb3RpbmdfU3RhdHVzXwUAAAAMRW50ZXJBc3NldElEBAAAAA9OZXdWb3RpbmdTdGF0dXMCAAAAAVAEAAAADWNhbGxlcmFkZHJlc3MJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAANY3VycmVudGhlaWdodAUAAAAGaGVpZ2h0BAAAAB1wZW5kaW5nYmxvY2tzZm9ycHJvamVjdGV4cGlyZQkAAGUAAAACBQAAAA5jaGVja2VuZGhlaWdodAUAAAAGaGVpZ2h0AwkBAAAAAiE9AAAAAgUAAAAZY2hlY2twYWlyaXNhdmFpbGFibGVvcm5vdAUAAAAMRW50ZXJBc3NldElECQAAAgAAAAECAAAAJVBhaXIgaXMgbm90IGF2YWlsYWJsZSBpbiBWb3RpbmcgTGlzdC4DCQEAAAACIT0AAAACBQAAAAthZG1pbnJpZ2h0cwUAAAANY2FsbGVyYWRkcmVzcwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAiSSBrbm93IFlvdSBhcmUgbm90IEFuIEFkbWluLiBPbmx5IAUAAAALYWRtaW5yaWdodHMCAAAAHyBoYXMgcmlnaHRzIHRvIHJlbW92ZSB0aGUgcGFpci4DCQAAZgAAAAIFAAAADmNoZWNrZW5kaGVpZ2h0BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAANlZvdGluZyBBbHJlYWR5IFJ1bm5pbmcuIFlvdSBjYW4gcmVtb3ZlIHRoZSBwYWlyIGFmdGVyIAkAAaQAAAABBQAAAB1wZW5kaW5nYmxvY2tzZm9ycHJvamVjdGV4cGlyZQIAAAAHIEJsb2NrcwMJAAAAAAAAAgUAAAAMVm90aW5nU3RhdHVzBQAAAA9OZXdWb3RpbmdTdGF0dXMJAAACAAAAAQkAASwAAAACBQAAAAxFbnRlckFzc2V0SUQCAAAALCBpcyBub3cgV2hpdGVsaXN0ZWQuIFNvIHlvdSBjYW4ndCByZW1vdmUgaXQuCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAAEsAAAAAgIAAAAIUGFpcl9VVl8FAAAADEVudGVyQXNzZXRJRAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAICAAAAClZvdGluZ19TSF8FAAAADEVudGVyQXNzZXRJRAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAICAAAAClZvdGluZ19FSF8FAAAADEVudGVyQXNzZXRJRAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAICAAAADlZvdGluZ19QZXJpb2RfBQAAAAxFbnRlckFzc2V0SUQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkAASwAAAACAgAAAApWb3Rlc19SZXFfBQAAAAxFbnRlckFzc2V0SUQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkAASwAAAACAgAAAAxMaXN0aW5nX0ZlZV8FAAAADEVudGVyQXNzZXRJRAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQABLAAAAAICAAAADlZvdGluZ19TdGF0dXNfBQAAAAxFbnRlckFzc2V0SUQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkAASwAAAACAgAAAAtWb3Rlc19SY3ZkXwUAAAAMRW50ZXJBc3NldElEBQAAAANuaWwAAAABaQEAAAALUmVtb3ZlRW50cnkAAAAEAAAAA0tleQAAAARLZXkxAAAABEtleTIAAAAES2V5MwkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAANLZXkJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAES2V5MQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAARLZXkyCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAABEtleTMFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAByRtYXRjaDAFAAAAAnR4CQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQSnfII=", "height": 1679976, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GD45vhBoyo5pX1ckVLACFsCFKLUHxRyjh4ogHjwzFK8F Next: FtTcXfRCUHVgnKZHpnmuxRRtWU6WY8q8mDogiUzL53EA Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let USDTAssetID = base58'Zn3cLHW7aAVPm5aACcTjvg7e7iEy2cKDtbowok5qa9H'
45
6+let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
57
6-@Callable(i)
7-func RegisterPairForVoting (AssetID1,days,ListingPrice) = {
8- let pmt1 = value(i.payments[0])
9- let pmt2 = value(i.payments[1])
10- let FeeAddress = base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr'
11- let maximumvotingdays = 90
12- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
13- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
14- let currentKey = toBase58String(i.caller.bytes)
15- let TN = !(isDefined(pmt2.assetId))
16- let oneday = 1440
17- let NoOfDaysBlocks = (oneday * days)
18- let gap = (NoOfDaysBlocks - 43199)
19- let votesrequired = ((100000 + ((11574 * gap) / 10000)) * 100000000)
20- let votingExpire = (height + NoOfDaysBlocks)
21- let fetchpair = getString(this, ("Pair_Under_Voting_" + AssetID1))
22- let votingstatus = "Fail"
23- let assetinfopmt2 = fromBase58String(AssetID1)
24- let reverseprice = fraction(1, 1000000000000, ListingPrice)
25- if ((43 > size(AssetID1)))
26- then throw("Wrong AssetID1 is Entered for Voting. Please Enter a Valid AssetID1. Probably you entered an ASSETID1 less than 43 Chars.")
27- else if ((29 >= days))
28- then throw("Enter no. of days in between 30 to 90.")
29- else if ((days > maximumvotingdays))
30- then throw("You Entered days greater than 90 please Enter no. of days in between 1 to 90.")
31- else if ((fetchpair == AssetID1))
32- then throw("Pair Already Exist in Voting List.")
33- else if ((size(i.payments) != 2))
34- then throw("Two attached assets expected as payment. Kindly Attach payment1 = Ballet Token and payment2 = Token you want to add to List for Voting.")
35- else if ((pmt1.assetId != BalletAssetID))
36- then throw("Incorrect asset attached for Voting in payment[1], please attach 1000 Ballet Token only.")
37- else if ((10000000 > pmt1.amount))
38- then throw((((("You attached only " + toString(fraction(pmt1.amount, 1, 100000000))) + ".") + toString(fraction(pmt1.amount, 1, 10000000))) + " Ballet for Voting in payment[1], please attach 1000 Ballet Token only."))
39- else if ((pmt2.assetId != assetinfopmt2))
40- then throw("Asset String Attached in ASSETID1 is not matching with Payment2 AssetID.")
41- else if ((TN == true))
42- then throw("You Attached TN Asset ID for Voting, please attach the Token You want to list in payment[2].")
43- else if ((pmt2.assetId == BalletAssetID))
44- then throw("You Attached Ballet asset for Voting in both payments, please attach the Token You want to list in payment[2].")
45- else if ((99 >= ListingPrice))
46- then throw("Lower listing Price is Entered per token, please enter as a valid range in between range [0.000100-1M] USDT.")
47- else if ((ListingPrice > 999999999999))
48- then throw("Higher listing Price is Entered per token, please enter as a valid range in between range [0.000100-1M] USDT.")
49- else [StringEntry(("Pair_Under_Voting_" + AssetID1), AssetID1), StringEntry(("Voting_Status_" + AssetID1), votingstatus), IntegerEntry(("Voting_Start_Height_" + AssetID1), height), IntegerEntry(("Voting_End_Height_" + AssetID1), votingExpire), IntegerEntry(("Voting_Period_" + AssetID1), NoOfDaysBlocks), IntegerEntry(("Voting_Listing_Fee_" + AssetID1), pmt1.amount), IntegerEntry(("Votes_Required_" + AssetID1), votesrequired), IntegerEntry(("Votes_Received_" + AssetID1), 0), IntegerEntry(((("Price_Of_" + AssetID1) + "_") + toBase58String(USDTAssetID)), ListingPrice), IntegerEntry(((("ReversePrice_Of_" + AssetID1) + "_") + toBase58String(USDTAssetID)), reverseprice), ScriptTransfer(addressFromPublicKey(FeeAddress), pmt1.amount, BalletAssetID)]
50- }
8+let CollectBalletFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
519
10+let IssueBalletFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
5211
12+let CollectUSDTSwapFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
13+
14+let CollectAssetSwapFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
5315
5416 @Callable(i)
5517 func IssueBallet () = {
5618 let pmt = value(i.payments[0])
5719 let currentKey = toBase58String(i.caller.bytes)
58- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
5920 let PricePerBallet = getIntegerValue(this, "BALLET/TN")
6021 let NewBalletToUser = fraction(100000, pmt.amount, PricePerBallet)
6122 let PreviousIssuedBallet = getIntegerValue(this, "Total_Issued_Ballet:")
6425 let BalletReserveValue = (PreviousBalletReserveValue + pmt.amount)
6526 let PreviousBalletBackupPrice = getIntegerValue(this, "Ballet_Backup_Value_In_TN:")
6627 let BalletBackupPrice = fraction(100000, BalletReserveValue, TotalIssuedBallet)
67- let FeeAddress = base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr'
6828 let FeePercentage = 1
6929 let BalanceTokensReturnedToUser = (100 - FeePercentage)
7030 if (isDefined(pmt.assetId))
7131 then throw("Incorrect asset attached, please attach TN.")
7232 else if ((5000000 > pmt.amount))
7333 then throw("Please Attach minimum 0.05 TN To Issue Ballet Asset.")
74- else [IntegerEntry("Total_Issued_Ballet:", TotalIssuedBallet), IntegerEntry("Total_Ballet_Reserve_In_TN:", BalletReserveValue), IntegerEntry("Ballet_Backup_Value_In_TN:", BalletBackupPrice), StringEntry("message", "<h1>Ballet Issued Successfully!</h1><br>"), Reissue(BalletAssetID, NewBalletToUser, true), ScriptTransfer(i.caller, ((NewBalletToUser * BalanceTokensReturnedToUser) / 100), BalletAssetID), ScriptTransfer(addressFromPublicKey(FeeAddress), ((NewBalletToUser * FeePercentage) / 100), BalletAssetID)]
34+ else [IntegerEntry("Total_Issued_Ballet:", TotalIssuedBallet), IntegerEntry("Total_Ballet_Reserve_In_TN:", BalletReserveValue), IntegerEntry("Ballet_Backup_Value_In_TN:", BalletBackupPrice), StringEntry("message", "<h1>Ballet Issued Successfully!</h1><br>"), Reissue(BalletAssetID, NewBalletToUser, true), ScriptTransfer(i.caller, ((NewBalletToUser * BalanceTokensReturnedToUser) / 100), BalletAssetID), ScriptTransfer(IssueBalletFeeAddress, ((NewBalletToUser * FeePercentage) / 100), BalletAssetID)]
7535 }
7636
7737
8040 func Liquidate () = {
8141 let currentKey = toBase58String(i.callerPublicKey)
8242 let pmt = value(i.payments[0])
83- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
8443 let PreviousIssuedBallet = getIntegerValue(this, "Total_Issued_Ballet:")
8544 let TotalIssuedBallet = (PreviousIssuedBallet - pmt.amount)
8645 let PreviousBalletReserveValue = getIntegerValue(this, "Total_Ballet_Reserve_In_TN:")
9857
9958
10059 @Callable(i)
60+func RegisterPairForVoting (EnterAssetID,days) = {
61+ let pmt1 = value(i.payments[0])
62+ let pmt2 = value(i.payments[1])
63+ let maximumvotingdays = 90
64+ let currentKey = toBase58String(i.caller.bytes)
65+ let TN = !(isDefined(pmt2.assetId))
66+ let oneday = 1440
67+ let NoOfDaysBlocks = (oneday * days)
68+ let gap = (NoOfDaysBlocks - 43199)
69+ let votesrequired = ((100000 + ((11574 * gap) / 10000)) * 100000000)
70+ let votingExpire = (height + NoOfDaysBlocks)
71+ let fetchpair = getString(this, ("Pair_UV_" + EnterAssetID))
72+ let votingstatus = "F"
73+ let assetinfopmt2 = fromBase58String(EnterAssetID)
74+ if ((43 > size(EnterAssetID)))
75+ then throw("Wrong AssetID is Entered for Voting. Please Enter a Valid AssetID. Probably you entered an AssetID less than 43 Chars.")
76+ else if ((29 >= days))
77+ then throw("Enter no. of days in between 30 to 90.")
78+ else if ((days > maximumvotingdays))
79+ then throw("You Entered days greater than 90 please Enter no. of days in between 1 to 90.")
80+ else if ((fetchpair == EnterAssetID))
81+ then throw("Pair Already Exist in Voting List.")
82+ else if ((size(i.payments) != 2))
83+ then throw("Two attached assets expected as payment. Kindly Attach payment1 = Ballet Token & payment2 = Token you want to List for Voting.")
84+ else if ((pmt1.assetId != BalletAssetID))
85+ then throw("Incorrect asset attached for Voting in payment[1], please attach 1000 Ballet Token only.")
86+ else if ((pmt1.amount != 10000000))
87+ then throw((((("You attached only " + toString(fraction(pmt1.amount, 1, 100000000))) + ".") + toString(fraction(pmt1.amount, 1, 10000000))) + " Ballet for Voting in payment[1], please attach 1000 Ballet Token only."))
88+ else if ((pmt2.assetId != assetinfopmt2))
89+ then throw("Input String and Attached AssetID in payment2 is not matching.")
90+ else if ((TN == true))
91+ then throw("You Attached TN Asset ID for Voting, please attach the Token You want to list in payment[2].")
92+ else if ((pmt2.assetId == BalletAssetID))
93+ then throw("You Attached Ballet asset for Voting in both payments, please attach the Token You want to list in payment[2].")
94+ else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), StringEntry(("Voting_Status_" + EnterAssetID), votingstatus), IntegerEntry(("Voting_SH_" + EnterAssetID), height), IntegerEntry(("Voting_EH_" + EnterAssetID), votingExpire), IntegerEntry(("Voting_Period_" + EnterAssetID), NoOfDaysBlocks), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), IntegerEntry(("Votes_Req_" + EnterAssetID), votesrequired), IntegerEntry(("Votes_Rcvd_" + EnterAssetID), 0), ScriptTransfer(CollectBalletFeeAddress, pmt1.amount, BalletAssetID)]
95+ }
96+
97+
98+
99+@Callable(i)
101100 func DoVoting (EnterAssetID) = {
102101 let pmt = if ((size(i.payments) == 1))
103102 then i.payments[0]
104103 else throw("Ballet Token is required as Attached payment")
105104 let calleraddress = toBase58String(i.caller.bytes)
106- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
107- let NewVotingStatus = "Pass"
108- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
109- let checkprojectexpireheight = getIntegerValue(this, ("Voting_End_Height_" + EnterAssetID))
110- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
111- let checkvotesrequired = getIntegerValue(this, ("Votes_Required_" + EnterAssetID))
112- let checkvotesreceived = getIntegerValue(this, ("Votes_Received_" + EnterAssetID))
105+ let NewVotingStatus = "P"
106+ let checkendheight = getIntegerValue(this, ("Voting_EH_" + EnterAssetID))
107+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
108+ let checkvotesrequired = getIntegerValue(this, ("Votes_Req_" + EnterAssetID))
109+ let checkvotesreceived = getIntegerValue(this, ("Votes_Rcvd_" + EnterAssetID))
113110 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
114- let currentvotes = match getInteger(this, ("Votes_Received_" + EnterAssetID)) {
111+ let currentvotes = match getInteger(this, ("Votes_Rcvd_" + EnterAssetID)) {
115112 case a: Int =>
116113 a
117114 case _ =>
118115 0
119116 }
120117 let newvotescount = (currentvotes + pmt.amount)
121- let individualvotes = match getInteger(this, ((("Votes_Received_" + calleraddress) + "_") + EnterAssetID)) {
118+ let individualvotes = match getInteger(this, ((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID)) {
122119 case b: Int =>
123120 b
124121 case _ =>
127124 let individualvotescount = (individualvotes + pmt.amount)
128125 let checkwhitelist = (checkvotesreceived >= checkvotesrequired)
129126 let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
130- let decimals = info.decimals
131127 if ((checkpairisavailableornot != EnterAssetID))
132128 then throw("Pair is not available in Voting List.")
133- else if ((height > checkprojectexpireheight))
129+ else if ((height > checkendheight))
134130 then throw((("Voting timeline for " + EnterAssetID) + " is expired."))
135131 else if ((pmt.assetId != BalletAssetID))
136- then throw("Kindly Attach Only 44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y (Ballet).")
132+ then throw((("Kindly Attach Only " + toBase58String(BalletAssetID)) + " Token."))
137133 else if ((VotingStatus == NewVotingStatus))
138134 then throw((("Voting for " + EnterAssetID) + " pair is completed and it’s available in whitelist."))
139135 else if (checkwhitelist)
140- then [StringEntry(("Voting_Status_" + EnterAssetID), NewVotingStatus), IntegerEntry(("Decimals_of_" + EnterAssetID), decimals), IntegerEntry(((("Old_Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry(((("New_Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry(((("Old_Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(((("New_Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(((("Total_of_pair_Txns_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry("Total_of_Swaps_Txns", 0), IntegerEntry("Total_Swap_Fee_Collected", 0)]
141- else [IntegerEntry(("Votes_Received_" + EnterAssetID), newvotescount), IntegerEntry(((("Votes_Received_" + calleraddress) + "_") + EnterAssetID), individualvotescount)]
136+ then [StringEntry(("Voting_Status_" + EnterAssetID), NewVotingStatus), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(("Total_of_pair_Txns_" + EnterAssetID), 0), IntegerEntry("Total_of_Swaps_Txns", 0), IntegerEntry(("Total_Swap_Fee_Collected_" + toBase58String(USDTAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0)]
137+ else [IntegerEntry(("Votes_Rcvd_" + EnterAssetID), newvotescount), IntegerEntry(((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID), individualvotescount)]
142138 }
143139
144140
145141
146142 @Callable(i)
147143 func WithdrawVotedTokens (EnterAssetID) = {
148- let pmt = i.payments[0]
144+ let pmt = if ((size(i.payments) == 1))
145+ then i.payments[0]
146+ else throw("0.1 TN Token is required as Attached payment.")
149147 let calleraddress = toBase58String(i.caller.bytes)
150- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
151- let checkprojectexpireheight = getIntegerValue(this, ("Voting_End_Height_" + EnterAssetID))
152- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
153- let checkuservotingbalance = getIntegerValue(this, ((("Votes_Received_" + calleraddress) + "_") + EnterAssetID))
154- let pendingblocksforprojectexpire = (checkprojectexpireheight - height)
148+ let checkendheight = getIntegerValue(this, ("Voting_EH_" + EnterAssetID))
149+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
150+ let checkuservotingbalance = valueOrErrorMessage(getInteger(this, ((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID)), (calleraddress + " Address never voted and exist in list."))
151+ let pendingblocksforprojectexpire = (checkendheight - height)
155152 if ((checkpairisavailableornot != EnterAssetID))
156153 then throw("Pair is not available in Voting List.")
157- else if ((checkprojectexpireheight > height))
158- then throw((("Voting Already Running. You can withdraw your Ballet Token only after the expire of " + toString(pendingblocksforprojectexpire)) + " Blocks"))
154+ else if ((checkendheight > height))
155+ then throw((("Voting Already Running. You can withdraw your Ballet Token after " + toString(pendingblocksforprojectexpire)) + " blocks"))
159156 else if ((0 >= checkuservotingbalance))
160157 then throw("You don't have any dues of ballet balance in this Voting Pair.")
161158 else if (isDefined(pmt.assetId))
162159 then throw("Don't attach any other asset. Please attach 0.1 TN as a fee to release your token")
163160 else if ((pmt.amount != 10000000))
164161 then throw("Please attach 0.1 TN as a fee to release your token.")
165- else [IntegerEntry(((("Votes_Received_" + calleraddress) + "_") + EnterAssetID), 0), ScriptTransfer(i.caller, checkuservotingbalance, BalletAssetID)]
162+ else [IntegerEntry(((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID), 0), ScriptTransfer(i.caller, checkuservotingbalance, BalletAssetID)]
163+ }
164+
165+
166+
167+@Callable(i)
168+func IssueLPToken (EnterAssetID) = {
169+ let adminrights = valueOrErrorMessage(getString(this, "LP_Admin_Rights"), "LP Admin Rights are Not Included into Smart Contract. Deploy Admin Rights First.")
170+ let calleraddress = toBase58String(i.caller.bytes)
171+ let checkpairisavailableornot = valueOrErrorMessage(getString(this, ("Pair_UV_" + EnterAssetID)), "Asset not Found in Whitelisted Token")
172+ let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
173+ let name = info.name
174+ let NewVotingStatus = "P"
175+ let VotingStatus = valueOrErrorMessage(getString(this, ("Voting_Status_" + EnterAssetID)), ("Voting Status is Missing for " + EnterAssetID))
176+ let LPissue = Issue((("LP-" + name) + "-USDT"), (((("LP-" + name) + "-USDT") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), 1, 0, true)
177+ let LPid = calculateAssetId(LPissue)
178+ if ((adminrights != calleraddress))
179+ then throw((("Your are not allowded to Issue LP Token. Only " + adminrights) + " can issue the LP Token."))
180+ else if ((checkpairisavailableornot != EnterAssetID))
181+ then throw("Pair is not available in Voting List.")
182+ else if ((VotingStatus != NewVotingStatus))
183+ then throw("LP Token must be a Whitelisted Token.")
184+ else [LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid))]
166185 }
167186
168187
172191 let calleraddress = toBase58String(i.caller.bytes)
173192 let pmt = if ((size(i.payments) == 1))
174193 then i.payments[0]
175- else throw("Whitelisted Swap Token is required as Attached payment[1].")
176- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
177- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
194+ else throw("Whitelisted Token is required as Attached payment[1].")
195+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
178196 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
179- let CheckPairPrice = getIntegerValue(this, ((("Price_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
180- let CheckOldBalanceAssettoUSDT = getIntegerValue(this, ((("Old_Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
181- let CheckOldBalanceUSDTtoAsset = getIntegerValue(this, ((("Old_Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
182- let CheckAssetDecimals = getIntegerValue(this, ("Decimals_of_" + EnterAssetID))
183- let CurrentVotingStatus = "Fail"
197+ let CheckUSDTBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
198+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
199+ let newbalanceofUSDT = fraction(CheckUSDTBalance, CheckAssetBalance, (CheckAssetBalance + pmt.amount))
200+ let quantityofpriceasset = (CheckUSDTBalance - newbalanceofUSDT)
201+ let CurrentVotingStatus = "F"
184202 let SwapFee = 1
185- let amountAssetDecimals = CheckAssetDecimals
186- let priceAssetDecimals = 6
187- let decimalsgap = ((6 - amountAssetDecimals) - 8)
188- let quantityofpriceasset = (((pmt.amount * CheckPairPrice) * pow(10, 0, decimalsgap, 0, 0, UP)) / pow(10, 0, amountAssetDecimals, 0, 0, UP))
189- let getUSDTBalance = assetBalance(this, USDTAssetID)
190- let newUSDTBalance = (getUSDTBalance - quantityofpriceasset)
191- if ((checkpairisavailableornot != EnterAssetID))
192- then throw("Pair is not available in Whitelisted Asset.")
193- else if ((VotingStatus == CurrentVotingStatus))
194- then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
195- else if ((pmt.assetId == USDTAssetID))
196- then throw("You can't Attach USDT as an Attached Payment. Only Whitelisted Tokens are accepted.")
197- else if ((pmt.assetId != fromBase58String(EnterAssetID)))
198- then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
199- else if ((10000 > quantityofpriceasset))
200- then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 1 cent atleast."))
201- else if ((CheckOldBalanceAssettoUSDT == 0))
203+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 100)
204+ let userbalancetoreceive = (quantityofpriceasset - SwapFeetoreceive)
205+ let SumupofAssetToUSDTSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + toBase58String(USDTAssetID))) {
206+ case a: Int =>
207+ a
208+ case _ =>
209+ 0
210+ }
211+ let NewSumupofAssetToUSDTSwapFee = (SumupofAssetToUSDTSwapFee + SwapFeetoreceive)
212+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID)) {
213+ case a: Int =>
214+ a
215+ case _ =>
216+ 0
217+ }
218+ let NewSumupofAssetBalance = (CheckAssetBalance + pmt.amount)
219+ let SumupUSDTBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID))) {
220+ case a: Int =>
221+ a
222+ case _ =>
223+ 0
224+ }
225+ let NewSumupofUSDTBalance = (CheckUSDTBalance - quantityofpriceasset)
226+ let SumupofSwapTxns = match getInteger(this, "Total_of_Swaps_Txns") {
227+ case a: Int =>
228+ a
229+ case _ =>
230+ 0
231+ }
232+ let NewSumupofSwapTxns = (SumupofSwapTxns + 1)
233+ if ((EnterAssetID == toBase58String(USDTAssetID)))
234+ then throw("Input can Never be a USDT AssetID. Enter Whitelisted AssetID in input and Attach Whitelisted Asset as an attachment Token in payment[1].")
235+ else if ((checkpairisavailableornot != EnterAssetID))
236+ then throw("Pair is not available in Whitelisted Asset.")
237+ else if ((VotingStatus == CurrentVotingStatus))
238+ then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
239+ else if ((pmt.assetId == USDTAssetID))
240+ then throw("You can't Attach USDT as an Attached Payment. Only Whitelisted Tokens are accepted.")
241+ else if ((pmt.assetId != fromBase58String(EnterAssetID)))
242+ then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
243+ else if ((CheckUSDTBalance == 0))
202244 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
203- else if ((CheckOldBalanceUSDTtoAsset == 0))
245+ else if ((CheckAssetBalance == 0))
204246 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
205- else [IntegerEntry(((("Price_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), CheckPairPrice), ScriptTransfer(i.caller, ((quantityofpriceasset * 99) / 100), USDTAssetID), ScriptTransfer(i.caller, ((quantityofpriceasset * SwapFee) / 100), USDTAssetID)]
247+ else if ((1000000 > quantityofpriceasset))
248+ then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 1 dollar atleast."))
249+ else if ((quantityofpriceasset > CheckUSDTBalance))
250+ then throw((("Pool Only has a Liquidity of " + toString((CheckUSDTBalance / pow(10, 0, 6, 0, 0, UP)))) + " USDT. Add Liquidity into Pool."))
251+ else [IntegerEntry(("Total_Swap_Fee_Collected_" + toBase58String(USDTAssetID)), NewSumupofAssetToUSDTSwapFee), IntegerEntry("Total_of_Swaps_Txns", NewSumupofSwapTxns), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), NewSumupofUSDTBalance), ScriptTransfer(i.caller, userbalancetoreceive, USDTAssetID), ScriptTransfer(CollectUSDTSwapFeeAddress, SwapFeetoreceive, USDTAssetID)]
206252 }
207253
208254
213259 let pmt = if ((size(i.payments) == 1))
214260 then i.payments[0]
215261 else throw("Only USDT Token is required as an Attached payment[1].")
216- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
217- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
262+ let CheckUSDTBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
263+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
264+ let newbalanceofAsset = fraction(CheckUSDTBalance, CheckAssetBalance, (CheckUSDTBalance + pmt.amount))
265+ let quantityofpriceasset = (CheckAssetBalance - newbalanceofAsset)
266+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
218267 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
219- let CheckReversePairPrice = getIntegerValue(this, ((("ReversePrice_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
220- let CheckAssetDecimals = getIntegerValue(this, ("Decimals_of_" + EnterAssetID))
221- let CurrentVotingStatus = "Fail"
222- let ReverseSwapFee = 1
223- let amountAssetDecimals = CheckAssetDecimals
224- let priceAssetDecimals = 6
225- let decimalsgap = ((6 - amountAssetDecimals) - 8)
226- let quantityofpriceasset = ((pmt.amount * CheckReversePairPrice) / pow(10, 0, amountAssetDecimals, 0, 0, UP))
227- let getAssetBalance = assetBalance(this, fromBase58String(EnterAssetID))
228- let newAssetBalance = (getAssetBalance - quantityofpriceasset)
268+ let CurrentVotingStatus = "F"
269+ let SwapFee = 1
270+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 100)
271+ let userbalancetoreceive = (quantityofpriceasset - SwapFeetoreceive)
272+ let SumupofSwapTxns = match getInteger(this, "Total_of_Swaps_Txns") {
273+ case a: Int =>
274+ a
275+ case _ =>
276+ 0
277+ }
278+ let NewSumupofSwapTxns = (SumupofSwapTxns + 1)
279+ let SumupofUSDTToAssetSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + EnterAssetID)) {
280+ case a: Int =>
281+ a
282+ case _ =>
283+ 0
284+ }
285+ let NewSumupofUSDTToAssetSwapFee = (SumupofUSDTToAssetSwapFee + SwapFeetoreceive)
286+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID)) {
287+ case a: Int =>
288+ a
289+ case _ =>
290+ 0
291+ }
292+ let NewSumupofAssetBalance = (CheckAssetBalance - quantityofpriceasset)
293+ let SumupUSDTBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID))) {
294+ case a: Int =>
295+ a
296+ case _ =>
297+ 0
298+ }
299+ let NewSumupofUSDTBalance = (CheckUSDTBalance + pmt.amount)
229300 if ((checkpairisavailableornot != EnterAssetID))
230301 then throw("Pair is not available in Whitelisted Asset.")
231302 else if ((VotingStatus == CurrentVotingStatus))
232303 then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
233304 else if ((EnterAssetID == toBase58String(USDTAssetID)))
234- then throw("Input can Never be a USDT AssetID. Enter AssetID in input and Attach USDT as attachment Token.")
305+ then throw("Input can Never be a USDT AssetID. Enter Whitelisted AssetID in input and Attach USDT as an attachment Token in payment[1].")
235306 else if ((pmt.assetId != USDTAssetID))
236- then throw("You can Attach USDT as an Attached Payment to Swap USDT To Required Token. Any other asset else than USDT will be rejected.")
307+ then throw("You can Attach USDT as an Attached Payment[1] to Swap USDT To Required Token. Any other asset else than USDT will be rejected.")
237308 else if ((1000000 > pmt.amount))
238309 then throw("Your Attached USDT Amount is very low. Attach Atleast 1 USDT to Claim the minimum Tokens.")
239- else [IntegerEntry(((("ReversePrice_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), CheckReversePairPrice), ScriptTransfer(i.caller, ((quantityofpriceasset * 99) / 100), fromBase58String(EnterAssetID)), ScriptTransfer(i.caller, ((quantityofpriceasset * ReverseSwapFee) / 100), fromBase58String(EnterAssetID))]
310+ else if ((CheckUSDTBalance == 0))
311+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
312+ else if ((CheckAssetBalance == 0))
313+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
314+ else if ((quantityofpriceasset > CheckAssetBalance))
315+ then throw((("Pool Only has a Liquidity of " + toString(CheckAssetBalance)) + " Tokens. Add Liquidity into Pool."))
316+ else [IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), NewSumupofUSDTToAssetSwapFee), IntegerEntry("Total_of_Swaps_Txns", NewSumupofSwapTxns), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), NewSumupofUSDTBalance), ScriptTransfer(i.caller, userbalancetoreceive, fromBase58String(EnterAssetID)), ScriptTransfer(CollectAssetSwapFeeAddress, SwapFeetoreceive, fromBase58String(EnterAssetID))]
240317 }
241318
242319
244321 @Callable(i)
245322 func AddLiquidity (EnterAssetID) = {
246323 let calleraddress = toBase58String(i.caller.bytes)
247- let pmt = if ((size(i.payments) == 1))
248- then i.payments[0]
249- else throw("Whitelisted Swap Token is required as Attached payment[1].")
250- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
251- nil
324+ let pmt1 = value(i.payments[0])
325+ let pmt2 = value(i.payments[1])
326+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
327+ let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
328+ let ReissueassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or May be not Generated."))
329+ let CurrentVotingStatus = "F"
330+ let AddLiquidityFee = 100000
331+ let CheckUSDTBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
332+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
333+ let newpriceofAsset = fraction(CheckUSDTBalance, 1, CheckAssetBalance)
334+ let quantityofEnterAssetID = fraction(1, pmt1.amount, newpriceofAsset)
335+ let quantityofLPToken1 = pmt2.amount
336+ let USDTHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID))) {
337+ case a: Int =>
338+ a
339+ case _ =>
340+ 0
341+ }
342+ let NewUSDTHoldingInPair = (USDTHoldingInPair + pmt1.amount)
343+ let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID)) {
344+ case a: Int =>
345+ a
346+ case _ =>
347+ 0
348+ }
349+ let NewAssetHoldingInPair = (AssetHoldingInPair + pmt2.amount)
350+ let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
351+ case a: Int =>
352+ a
353+ case _ =>
354+ 0
355+ }
356+ let NewLPTokenIssued = (LPTokenIssued + quantityofLPToken1)
357+ if ((checkpairisavailableornot != EnterAssetID))
358+ then throw("Pair is not available in Whitelisted Asset.")
359+ else if ((VotingStatus == CurrentVotingStatus))
360+ then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
361+ else if ((EnterAssetID == toBase58String(USDTAssetID)))
362+ then throw("Input can Never be a USDT AssetID. Enter Whitelisted AssetID in input as well as in payment[1] and Attach USDT as an attachment Token in payment[2].")
363+ else if ((size(i.payments) != 2))
364+ then throw("Two attached assets expected as payment in 50%-50%. Kindly Attach payment1 = USDT Token and payment2 = Token you want to add for Liquidity.")
365+ else if ((pmt1.assetId != USDTAssetID))
366+ then throw("Incorrect asset attached for Liquidity in payment[1], please attach USDT Token only.")
367+ else if ((10000000 > pmt1.amount))
368+ then throw("please attach atleast 10 USDT in payment[1].")
369+ else if ((pmt2.assetId == USDTAssetID))
370+ then throw("You Attached USDT asset for Liquidity in both payments, Kindly Attach payment1 = USDT Token and payment2 = Token you want to add for Liquidity.")
371+ else if ((pmt2.assetId != fromBase58String(EnterAssetID)))
372+ then throw((("Asset String " + EnterAssetID) + " is not matching with attached payment[2]. String and payment[2] must be same."))
373+ else if ((pmt2.amount != quantityofEnterAssetID))
374+ then throw(("Attached payment[2] quantity is not matching as per attached payment[1] USDT.It must be " + toString(quantityofEnterAssetID)))
375+ else [IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), NewUSDTHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), Reissue(ReissueassetId, quantityofLPToken1, true), ScriptTransfer(i.caller, quantityofLPToken1, ReissueassetId)]
252376 }
253377
254378
256380 @Callable(i)
257381 func RemovePairEntry (EnterAssetID) = {
258382 let adminrights = getStringValue(this, "Polarity_Admin_Rights")
259- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
260- let checkprojectexpireheight = getIntegerValue(this, ("Voting_End_Height_" + EnterAssetID))
261- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
383+ let checkendheight = getIntegerValue(this, ("Voting_EH_" + EnterAssetID))
384+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
262385 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
263- let NewVotingStatus = "Pass"
386+ let NewVotingStatus = "P"
264387 let calleraddress = toBase58String(i.caller.bytes)
265388 let currentheight = height
266- let pendingblocksforprojectexpire = (checkprojectexpireheight - height)
389+ let pendingblocksforprojectexpire = (checkendheight - height)
267390 if ((checkpairisavailableornot != EnterAssetID))
268391 then throw("Pair is not available in Voting List.")
269392 else if ((adminrights != calleraddress))
270393 then throw((("I know You are not An Admin. Only " + adminrights) + " has rights to remove the pair."))
271- else if ((checkprojectexpireheight > height))
394+ else if ((checkendheight > height))
272395 then throw((("Voting Already Running. You can remove the pair after " + toString(pendingblocksforprojectexpire)) + " Blocks"))
273396 else if ((VotingStatus == NewVotingStatus))
274397 then throw((EnterAssetID + " is now Whitelisted. So you can't remove it."))
275- else [DeleteEntry(("Pair_Under_Voting_" + EnterAssetID)), DeleteEntry(("Voting_Start_Height_" + EnterAssetID)), DeleteEntry(("Voting_End_Height_" + EnterAssetID)), DeleteEntry(("Voting_Period_" + EnterAssetID)), DeleteEntry(("Votes_Required_" + EnterAssetID)), DeleteEntry(("Voting_Listing_Fee_" + EnterAssetID)), DeleteEntry(("Voting_Status_" + EnterAssetID)), DeleteEntry(("Votes_Received_" + EnterAssetID)), DeleteEntry(((("Price_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))]
398+ else [DeleteEntry(("Pair_UV_" + EnterAssetID)), DeleteEntry(("Voting_SH_" + EnterAssetID)), DeleteEntry(("Voting_EH_" + EnterAssetID)), DeleteEntry(("Voting_Period_" + EnterAssetID)), DeleteEntry(("Votes_Req_" + EnterAssetID)), DeleteEntry(("Listing_Fee_" + EnterAssetID)), DeleteEntry(("Voting_Status_" + EnterAssetID)), DeleteEntry(("Votes_Rcvd_" + EnterAssetID))]
276399 }
400+
401+
402+
403+@Callable(i)
404+func RemoveEntry (Key,Key1,Key2,Key3) = [DeleteEntry(Key), DeleteEntry(Key1), DeleteEntry(Key2), DeleteEntry(Key3)]
277405
278406
279407 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let USDTAssetID = base58'Zn3cLHW7aAVPm5aACcTjvg7e7iEy2cKDtbowok5qa9H'
45
6+let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
57
6-@Callable(i)
7-func RegisterPairForVoting (AssetID1,days,ListingPrice) = {
8- let pmt1 = value(i.payments[0])
9- let pmt2 = value(i.payments[1])
10- let FeeAddress = base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr'
11- let maximumvotingdays = 90
12- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
13- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
14- let currentKey = toBase58String(i.caller.bytes)
15- let TN = !(isDefined(pmt2.assetId))
16- let oneday = 1440
17- let NoOfDaysBlocks = (oneday * days)
18- let gap = (NoOfDaysBlocks - 43199)
19- let votesrequired = ((100000 + ((11574 * gap) / 10000)) * 100000000)
20- let votingExpire = (height + NoOfDaysBlocks)
21- let fetchpair = getString(this, ("Pair_Under_Voting_" + AssetID1))
22- let votingstatus = "Fail"
23- let assetinfopmt2 = fromBase58String(AssetID1)
24- let reverseprice = fraction(1, 1000000000000, ListingPrice)
25- if ((43 > size(AssetID1)))
26- then throw("Wrong AssetID1 is Entered for Voting. Please Enter a Valid AssetID1. Probably you entered an ASSETID1 less than 43 Chars.")
27- else if ((29 >= days))
28- then throw("Enter no. of days in between 30 to 90.")
29- else if ((days > maximumvotingdays))
30- then throw("You Entered days greater than 90 please Enter no. of days in between 1 to 90.")
31- else if ((fetchpair == AssetID1))
32- then throw("Pair Already Exist in Voting List.")
33- else if ((size(i.payments) != 2))
34- then throw("Two attached assets expected as payment. Kindly Attach payment1 = Ballet Token and payment2 = Token you want to add to List for Voting.")
35- else if ((pmt1.assetId != BalletAssetID))
36- then throw("Incorrect asset attached for Voting in payment[1], please attach 1000 Ballet Token only.")
37- else if ((10000000 > pmt1.amount))
38- then throw((((("You attached only " + toString(fraction(pmt1.amount, 1, 100000000))) + ".") + toString(fraction(pmt1.amount, 1, 10000000))) + " Ballet for Voting in payment[1], please attach 1000 Ballet Token only."))
39- else if ((pmt2.assetId != assetinfopmt2))
40- then throw("Asset String Attached in ASSETID1 is not matching with Payment2 AssetID.")
41- else if ((TN == true))
42- then throw("You Attached TN Asset ID for Voting, please attach the Token You want to list in payment[2].")
43- else if ((pmt2.assetId == BalletAssetID))
44- then throw("You Attached Ballet asset for Voting in both payments, please attach the Token You want to list in payment[2].")
45- else if ((99 >= ListingPrice))
46- then throw("Lower listing Price is Entered per token, please enter as a valid range in between range [0.000100-1M] USDT.")
47- else if ((ListingPrice > 999999999999))
48- then throw("Higher listing Price is Entered per token, please enter as a valid range in between range [0.000100-1M] USDT.")
49- else [StringEntry(("Pair_Under_Voting_" + AssetID1), AssetID1), StringEntry(("Voting_Status_" + AssetID1), votingstatus), IntegerEntry(("Voting_Start_Height_" + AssetID1), height), IntegerEntry(("Voting_End_Height_" + AssetID1), votingExpire), IntegerEntry(("Voting_Period_" + AssetID1), NoOfDaysBlocks), IntegerEntry(("Voting_Listing_Fee_" + AssetID1), pmt1.amount), IntegerEntry(("Votes_Required_" + AssetID1), votesrequired), IntegerEntry(("Votes_Received_" + AssetID1), 0), IntegerEntry(((("Price_Of_" + AssetID1) + "_") + toBase58String(USDTAssetID)), ListingPrice), IntegerEntry(((("ReversePrice_Of_" + AssetID1) + "_") + toBase58String(USDTAssetID)), reverseprice), ScriptTransfer(addressFromPublicKey(FeeAddress), pmt1.amount, BalletAssetID)]
50- }
8+let CollectBalletFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
519
10+let IssueBalletFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
5211
12+let CollectUSDTSwapFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
13+
14+let CollectAssetSwapFeeAddress = addressFromPublicKey(base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr')
5315
5416 @Callable(i)
5517 func IssueBallet () = {
5618 let pmt = value(i.payments[0])
5719 let currentKey = toBase58String(i.caller.bytes)
58- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
5920 let PricePerBallet = getIntegerValue(this, "BALLET/TN")
6021 let NewBalletToUser = fraction(100000, pmt.amount, PricePerBallet)
6122 let PreviousIssuedBallet = getIntegerValue(this, "Total_Issued_Ballet:")
6223 let TotalIssuedBallet = (PreviousIssuedBallet + NewBalletToUser)
6324 let PreviousBalletReserveValue = getIntegerValue(this, "Total_Ballet_Reserve_In_TN:")
6425 let BalletReserveValue = (PreviousBalletReserveValue + pmt.amount)
6526 let PreviousBalletBackupPrice = getIntegerValue(this, "Ballet_Backup_Value_In_TN:")
6627 let BalletBackupPrice = fraction(100000, BalletReserveValue, TotalIssuedBallet)
67- let FeeAddress = base58'GKmJ6BchUgQfwKp4mp5eX8Y9xLioYRm6e1gDfFgdAcCr'
6828 let FeePercentage = 1
6929 let BalanceTokensReturnedToUser = (100 - FeePercentage)
7030 if (isDefined(pmt.assetId))
7131 then throw("Incorrect asset attached, please attach TN.")
7232 else if ((5000000 > pmt.amount))
7333 then throw("Please Attach minimum 0.05 TN To Issue Ballet Asset.")
74- else [IntegerEntry("Total_Issued_Ballet:", TotalIssuedBallet), IntegerEntry("Total_Ballet_Reserve_In_TN:", BalletReserveValue), IntegerEntry("Ballet_Backup_Value_In_TN:", BalletBackupPrice), StringEntry("message", "<h1>Ballet Issued Successfully!</h1><br>"), Reissue(BalletAssetID, NewBalletToUser, true), ScriptTransfer(i.caller, ((NewBalletToUser * BalanceTokensReturnedToUser) / 100), BalletAssetID), ScriptTransfer(addressFromPublicKey(FeeAddress), ((NewBalletToUser * FeePercentage) / 100), BalletAssetID)]
34+ else [IntegerEntry("Total_Issued_Ballet:", TotalIssuedBallet), IntegerEntry("Total_Ballet_Reserve_In_TN:", BalletReserveValue), IntegerEntry("Ballet_Backup_Value_In_TN:", BalletBackupPrice), StringEntry("message", "<h1>Ballet Issued Successfully!</h1><br>"), Reissue(BalletAssetID, NewBalletToUser, true), ScriptTransfer(i.caller, ((NewBalletToUser * BalanceTokensReturnedToUser) / 100), BalletAssetID), ScriptTransfer(IssueBalletFeeAddress, ((NewBalletToUser * FeePercentage) / 100), BalletAssetID)]
7535 }
7636
7737
7838
7939 @Callable(i)
8040 func Liquidate () = {
8141 let currentKey = toBase58String(i.callerPublicKey)
8242 let pmt = value(i.payments[0])
83- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
8443 let PreviousIssuedBallet = getIntegerValue(this, "Total_Issued_Ballet:")
8544 let TotalIssuedBallet = (PreviousIssuedBallet - pmt.amount)
8645 let PreviousBalletReserveValue = getIntegerValue(this, "Total_Ballet_Reserve_In_TN:")
8746 let PreviousBalletBackupPrice = getIntegerValue(this, "Ballet_Backup_Value_In_TN:")
8847 let calculateburnvalue = fraction(PreviousBalletBackupPrice, pmt.amount, 100000)
8948 let BalletReserveValue = (PreviousBalletReserveValue - calculateburnvalue)
9049 let BalletBackupPrice = fraction(100000, BalletReserveValue, TotalIssuedBallet)
9150 if ((pmt.assetId != BalletAssetID))
9251 then throw("Kindly Deposit Only 44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y (Ballet).")
9352 else if ((100000 > pmt.amount))
9453 then throw("Attach Amount must be greater than 0.001 Ballet.")
9554 else [Burn(BalletAssetID, pmt.amount), IntegerEntry("Total_Issued_Ballet:", TotalIssuedBallet), IntegerEntry("Total_Ballet_Reserve_In_TN:", BalletReserveValue), IntegerEntry("Ballet_Backup_Value_In_TN:", BalletBackupPrice), StringEntry("message", "<h1>Ballet Liquidated Successfully!</h1><br>"), ScriptTransfer(i.caller, calculateburnvalue, unit)]
9655 }
9756
9857
9958
10059 @Callable(i)
60+func RegisterPairForVoting (EnterAssetID,days) = {
61+ let pmt1 = value(i.payments[0])
62+ let pmt2 = value(i.payments[1])
63+ let maximumvotingdays = 90
64+ let currentKey = toBase58String(i.caller.bytes)
65+ let TN = !(isDefined(pmt2.assetId))
66+ let oneday = 1440
67+ let NoOfDaysBlocks = (oneday * days)
68+ let gap = (NoOfDaysBlocks - 43199)
69+ let votesrequired = ((100000 + ((11574 * gap) / 10000)) * 100000000)
70+ let votingExpire = (height + NoOfDaysBlocks)
71+ let fetchpair = getString(this, ("Pair_UV_" + EnterAssetID))
72+ let votingstatus = "F"
73+ let assetinfopmt2 = fromBase58String(EnterAssetID)
74+ if ((43 > size(EnterAssetID)))
75+ then throw("Wrong AssetID is Entered for Voting. Please Enter a Valid AssetID. Probably you entered an AssetID less than 43 Chars.")
76+ else if ((29 >= days))
77+ then throw("Enter no. of days in between 30 to 90.")
78+ else if ((days > maximumvotingdays))
79+ then throw("You Entered days greater than 90 please Enter no. of days in between 1 to 90.")
80+ else if ((fetchpair == EnterAssetID))
81+ then throw("Pair Already Exist in Voting List.")
82+ else if ((size(i.payments) != 2))
83+ then throw("Two attached assets expected as payment. Kindly Attach payment1 = Ballet Token & payment2 = Token you want to List for Voting.")
84+ else if ((pmt1.assetId != BalletAssetID))
85+ then throw("Incorrect asset attached for Voting in payment[1], please attach 1000 Ballet Token only.")
86+ else if ((pmt1.amount != 10000000))
87+ then throw((((("You attached only " + toString(fraction(pmt1.amount, 1, 100000000))) + ".") + toString(fraction(pmt1.amount, 1, 10000000))) + " Ballet for Voting in payment[1], please attach 1000 Ballet Token only."))
88+ else if ((pmt2.assetId != assetinfopmt2))
89+ then throw("Input String and Attached AssetID in payment2 is not matching.")
90+ else if ((TN == true))
91+ then throw("You Attached TN Asset ID for Voting, please attach the Token You want to list in payment[2].")
92+ else if ((pmt2.assetId == BalletAssetID))
93+ then throw("You Attached Ballet asset for Voting in both payments, please attach the Token You want to list in payment[2].")
94+ else [StringEntry(("Pair_UV_" + EnterAssetID), EnterAssetID), StringEntry(("Voting_Status_" + EnterAssetID), votingstatus), IntegerEntry(("Voting_SH_" + EnterAssetID), height), IntegerEntry(("Voting_EH_" + EnterAssetID), votingExpire), IntegerEntry(("Voting_Period_" + EnterAssetID), NoOfDaysBlocks), IntegerEntry(("Listing_Fee_" + EnterAssetID), pmt1.amount), IntegerEntry(("Votes_Req_" + EnterAssetID), votesrequired), IntegerEntry(("Votes_Rcvd_" + EnterAssetID), 0), ScriptTransfer(CollectBalletFeeAddress, pmt1.amount, BalletAssetID)]
95+ }
96+
97+
98+
99+@Callable(i)
101100 func DoVoting (EnterAssetID) = {
102101 let pmt = if ((size(i.payments) == 1))
103102 then i.payments[0]
104103 else throw("Ballet Token is required as Attached payment")
105104 let calleraddress = toBase58String(i.caller.bytes)
106- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
107- let NewVotingStatus = "Pass"
108- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
109- let checkprojectexpireheight = getIntegerValue(this, ("Voting_End_Height_" + EnterAssetID))
110- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
111- let checkvotesrequired = getIntegerValue(this, ("Votes_Required_" + EnterAssetID))
112- let checkvotesreceived = getIntegerValue(this, ("Votes_Received_" + EnterAssetID))
105+ let NewVotingStatus = "P"
106+ let checkendheight = getIntegerValue(this, ("Voting_EH_" + EnterAssetID))
107+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
108+ let checkvotesrequired = getIntegerValue(this, ("Votes_Req_" + EnterAssetID))
109+ let checkvotesreceived = getIntegerValue(this, ("Votes_Rcvd_" + EnterAssetID))
113110 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
114- let currentvotes = match getInteger(this, ("Votes_Received_" + EnterAssetID)) {
111+ let currentvotes = match getInteger(this, ("Votes_Rcvd_" + EnterAssetID)) {
115112 case a: Int =>
116113 a
117114 case _ =>
118115 0
119116 }
120117 let newvotescount = (currentvotes + pmt.amount)
121- let individualvotes = match getInteger(this, ((("Votes_Received_" + calleraddress) + "_") + EnterAssetID)) {
118+ let individualvotes = match getInteger(this, ((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID)) {
122119 case b: Int =>
123120 b
124121 case _ =>
125122 0
126123 }
127124 let individualvotescount = (individualvotes + pmt.amount)
128125 let checkwhitelist = (checkvotesreceived >= checkvotesrequired)
129126 let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
130- let decimals = info.decimals
131127 if ((checkpairisavailableornot != EnterAssetID))
132128 then throw("Pair is not available in Voting List.")
133- else if ((height > checkprojectexpireheight))
129+ else if ((height > checkendheight))
134130 then throw((("Voting timeline for " + EnterAssetID) + " is expired."))
135131 else if ((pmt.assetId != BalletAssetID))
136- then throw("Kindly Attach Only 44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y (Ballet).")
132+ then throw((("Kindly Attach Only " + toBase58String(BalletAssetID)) + " Token."))
137133 else if ((VotingStatus == NewVotingStatus))
138134 then throw((("Voting for " + EnterAssetID) + " pair is completed and it’s available in whitelist."))
139135 else if (checkwhitelist)
140- then [StringEntry(("Voting_Status_" + EnterAssetID), NewVotingStatus), IntegerEntry(("Decimals_of_" + EnterAssetID), decimals), IntegerEntry(((("Old_Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry(((("New_Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry(((("Old_Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(((("New_Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(((("Total_of_pair_Txns_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry("Total_of_Swaps_Txns", 0), IntegerEntry("Total_Swap_Fee_Collected", 0)]
141- else [IntegerEntry(("Votes_Received_" + EnterAssetID), newvotescount), IntegerEntry(((("Votes_Received_" + calleraddress) + "_") + EnterAssetID), individualvotescount)]
136+ then [StringEntry(("Voting_Status_" + EnterAssetID), NewVotingStatus), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), 0), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), 0), IntegerEntry(("Total_of_pair_Txns_" + EnterAssetID), 0), IntegerEntry("Total_of_Swaps_Txns", 0), IntegerEntry(("Total_Swap_Fee_Collected_" + toBase58String(USDTAssetID)), 0), IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), 0)]
137+ else [IntegerEntry(("Votes_Rcvd_" + EnterAssetID), newvotescount), IntegerEntry(((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID), individualvotescount)]
142138 }
143139
144140
145141
146142 @Callable(i)
147143 func WithdrawVotedTokens (EnterAssetID) = {
148- let pmt = i.payments[0]
144+ let pmt = if ((size(i.payments) == 1))
145+ then i.payments[0]
146+ else throw("0.1 TN Token is required as Attached payment.")
149147 let calleraddress = toBase58String(i.caller.bytes)
150- let BalletAssetID = base58'44Mq8KqUhM94t93MiBq3S22iiuGczMxpKmse5dBy2w5y'
151- let checkprojectexpireheight = getIntegerValue(this, ("Voting_End_Height_" + EnterAssetID))
152- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
153- let checkuservotingbalance = getIntegerValue(this, ((("Votes_Received_" + calleraddress) + "_") + EnterAssetID))
154- let pendingblocksforprojectexpire = (checkprojectexpireheight - height)
148+ let checkendheight = getIntegerValue(this, ("Voting_EH_" + EnterAssetID))
149+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
150+ let checkuservotingbalance = valueOrErrorMessage(getInteger(this, ((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID)), (calleraddress + " Address never voted and exist in list."))
151+ let pendingblocksforprojectexpire = (checkendheight - height)
155152 if ((checkpairisavailableornot != EnterAssetID))
156153 then throw("Pair is not available in Voting List.")
157- else if ((checkprojectexpireheight > height))
158- then throw((("Voting Already Running. You can withdraw your Ballet Token only after the expire of " + toString(pendingblocksforprojectexpire)) + " Blocks"))
154+ else if ((checkendheight > height))
155+ then throw((("Voting Already Running. You can withdraw your Ballet Token after " + toString(pendingblocksforprojectexpire)) + " blocks"))
159156 else if ((0 >= checkuservotingbalance))
160157 then throw("You don't have any dues of ballet balance in this Voting Pair.")
161158 else if (isDefined(pmt.assetId))
162159 then throw("Don't attach any other asset. Please attach 0.1 TN as a fee to release your token")
163160 else if ((pmt.amount != 10000000))
164161 then throw("Please attach 0.1 TN as a fee to release your token.")
165- else [IntegerEntry(((("Votes_Received_" + calleraddress) + "_") + EnterAssetID), 0), ScriptTransfer(i.caller, checkuservotingbalance, BalletAssetID)]
162+ else [IntegerEntry(((("Votes_Rcvd_" + calleraddress) + "_") + EnterAssetID), 0), ScriptTransfer(i.caller, checkuservotingbalance, BalletAssetID)]
163+ }
164+
165+
166+
167+@Callable(i)
168+func IssueLPToken (EnterAssetID) = {
169+ let adminrights = valueOrErrorMessage(getString(this, "LP_Admin_Rights"), "LP Admin Rights are Not Included into Smart Contract. Deploy Admin Rights First.")
170+ let calleraddress = toBase58String(i.caller.bytes)
171+ let checkpairisavailableornot = valueOrErrorMessage(getString(this, ("Pair_UV_" + EnterAssetID)), "Asset not Found in Whitelisted Token")
172+ let info = valueOrErrorMessage(assetInfo(fromBase58String(EnterAssetID)), (("Asset " + EnterAssetID) + " doesn't exist"))
173+ let name = info.name
174+ let NewVotingStatus = "P"
175+ let VotingStatus = valueOrErrorMessage(getString(this, ("Voting_Status_" + EnterAssetID)), ("Voting Status is Missing for " + EnterAssetID))
176+ let LPissue = Issue((("LP-" + name) + "-USDT"), (((("LP-" + name) + "-USDT") + " is a Liquidity Provider Token Issued Against ") + EnterAssetID), 1, 0, true)
177+ let LPid = calculateAssetId(LPissue)
178+ if ((adminrights != calleraddress))
179+ then throw((("Your are not allowded to Issue LP Token. Only " + adminrights) + " can issue the LP Token."))
180+ else if ((checkpairisavailableornot != EnterAssetID))
181+ then throw("Pair is not available in Voting List.")
182+ else if ((VotingStatus != NewVotingStatus))
183+ then throw("LP Token must be a Whitelisted Token.")
184+ else [LPissue, StringEntry(("LP_" + EnterAssetID), toBase58String(LPid))]
166185 }
167186
168187
169188
170189 @Callable(i)
171190 func SwapAssetToUSDTPairEntry (EnterAssetID) = {
172191 let calleraddress = toBase58String(i.caller.bytes)
173192 let pmt = if ((size(i.payments) == 1))
174193 then i.payments[0]
175- else throw("Whitelisted Swap Token is required as Attached payment[1].")
176- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
177- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
194+ else throw("Whitelisted Token is required as Attached payment[1].")
195+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
178196 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
179- let CheckPairPrice = getIntegerValue(this, ((("Price_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
180- let CheckOldBalanceAssettoUSDT = getIntegerValue(this, ((("Old_Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
181- let CheckOldBalanceUSDTtoAsset = getIntegerValue(this, ((("Old_Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
182- let CheckAssetDecimals = getIntegerValue(this, ("Decimals_of_" + EnterAssetID))
183- let CurrentVotingStatus = "Fail"
197+ let CheckUSDTBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
198+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
199+ let newbalanceofUSDT = fraction(CheckUSDTBalance, CheckAssetBalance, (CheckAssetBalance + pmt.amount))
200+ let quantityofpriceasset = (CheckUSDTBalance - newbalanceofUSDT)
201+ let CurrentVotingStatus = "F"
184202 let SwapFee = 1
185- let amountAssetDecimals = CheckAssetDecimals
186- let priceAssetDecimals = 6
187- let decimalsgap = ((6 - amountAssetDecimals) - 8)
188- let quantityofpriceasset = (((pmt.amount * CheckPairPrice) * pow(10, 0, decimalsgap, 0, 0, UP)) / pow(10, 0, amountAssetDecimals, 0, 0, UP))
189- let getUSDTBalance = assetBalance(this, USDTAssetID)
190- let newUSDTBalance = (getUSDTBalance - quantityofpriceasset)
191- if ((checkpairisavailableornot != EnterAssetID))
192- then throw("Pair is not available in Whitelisted Asset.")
193- else if ((VotingStatus == CurrentVotingStatus))
194- then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
195- else if ((pmt.assetId == USDTAssetID))
196- then throw("You can't Attach USDT as an Attached Payment. Only Whitelisted Tokens are accepted.")
197- else if ((pmt.assetId != fromBase58String(EnterAssetID)))
198- then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
199- else if ((10000 > quantityofpriceasset))
200- then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 1 cent atleast."))
201- else if ((CheckOldBalanceAssettoUSDT == 0))
203+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 100)
204+ let userbalancetoreceive = (quantityofpriceasset - SwapFeetoreceive)
205+ let SumupofAssetToUSDTSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + toBase58String(USDTAssetID))) {
206+ case a: Int =>
207+ a
208+ case _ =>
209+ 0
210+ }
211+ let NewSumupofAssetToUSDTSwapFee = (SumupofAssetToUSDTSwapFee + SwapFeetoreceive)
212+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID)) {
213+ case a: Int =>
214+ a
215+ case _ =>
216+ 0
217+ }
218+ let NewSumupofAssetBalance = (CheckAssetBalance + pmt.amount)
219+ let SumupUSDTBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID))) {
220+ case a: Int =>
221+ a
222+ case _ =>
223+ 0
224+ }
225+ let NewSumupofUSDTBalance = (CheckUSDTBalance - quantityofpriceasset)
226+ let SumupofSwapTxns = match getInteger(this, "Total_of_Swaps_Txns") {
227+ case a: Int =>
228+ a
229+ case _ =>
230+ 0
231+ }
232+ let NewSumupofSwapTxns = (SumupofSwapTxns + 1)
233+ if ((EnterAssetID == toBase58String(USDTAssetID)))
234+ then throw("Input can Never be a USDT AssetID. Enter Whitelisted AssetID in input and Attach Whitelisted Asset as an attachment Token in payment[1].")
235+ else if ((checkpairisavailableornot != EnterAssetID))
236+ then throw("Pair is not available in Whitelisted Asset.")
237+ else if ((VotingStatus == CurrentVotingStatus))
238+ then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
239+ else if ((pmt.assetId == USDTAssetID))
240+ then throw("You can't Attach USDT as an Attached Payment. Only Whitelisted Tokens are accepted.")
241+ else if ((pmt.assetId != fromBase58String(EnterAssetID)))
242+ then throw(("Incorrect asset attached, please attach or send " + EnterAssetID))
243+ else if ((CheckUSDTBalance == 0))
202244 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
203- else if ((CheckOldBalanceUSDTtoAsset == 0))
245+ else if ((CheckAssetBalance == 0))
204246 then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
205- else [IntegerEntry(((("Price_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), CheckPairPrice), ScriptTransfer(i.caller, ((quantityofpriceasset * 99) / 100), USDTAssetID), ScriptTransfer(i.caller, ((quantityofpriceasset * SwapFee) / 100), USDTAssetID)]
247+ else if ((1000000 > quantityofpriceasset))
248+ then throw((("Your Attached Asset Amount is very low. Attach More " + EnterAssetID) + " Tokens to Claim the minimum Amount of 1 dollar atleast."))
249+ else if ((quantityofpriceasset > CheckUSDTBalance))
250+ then throw((("Pool Only has a Liquidity of " + toString((CheckUSDTBalance / pow(10, 0, 6, 0, 0, UP)))) + " USDT. Add Liquidity into Pool."))
251+ else [IntegerEntry(("Total_Swap_Fee_Collected_" + toBase58String(USDTAssetID)), NewSumupofAssetToUSDTSwapFee), IntegerEntry("Total_of_Swaps_Txns", NewSumupofSwapTxns), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), NewSumupofUSDTBalance), ScriptTransfer(i.caller, userbalancetoreceive, USDTAssetID), ScriptTransfer(CollectUSDTSwapFeeAddress, SwapFeetoreceive, USDTAssetID)]
206252 }
207253
208254
209255
210256 @Callable(i)
211257 func SwapUSDTToAssetPairEntry (EnterAssetID) = {
212258 let calleraddress = toBase58String(i.caller.bytes)
213259 let pmt = if ((size(i.payments) == 1))
214260 then i.payments[0]
215261 else throw("Only USDT Token is required as an Attached payment[1].")
216- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
217- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
262+ let CheckUSDTBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
263+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
264+ let newbalanceofAsset = fraction(CheckUSDTBalance, CheckAssetBalance, (CheckUSDTBalance + pmt.amount))
265+ let quantityofpriceasset = (CheckAssetBalance - newbalanceofAsset)
266+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
218267 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
219- let CheckReversePairPrice = getIntegerValue(this, ((("ReversePrice_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
220- let CheckAssetDecimals = getIntegerValue(this, ("Decimals_of_" + EnterAssetID))
221- let CurrentVotingStatus = "Fail"
222- let ReverseSwapFee = 1
223- let amountAssetDecimals = CheckAssetDecimals
224- let priceAssetDecimals = 6
225- let decimalsgap = ((6 - amountAssetDecimals) - 8)
226- let quantityofpriceasset = ((pmt.amount * CheckReversePairPrice) / pow(10, 0, amountAssetDecimals, 0, 0, UP))
227- let getAssetBalance = assetBalance(this, fromBase58String(EnterAssetID))
228- let newAssetBalance = (getAssetBalance - quantityofpriceasset)
268+ let CurrentVotingStatus = "F"
269+ let SwapFee = 1
270+ let SwapFeetoreceive = ((quantityofpriceasset * SwapFee) / 100)
271+ let userbalancetoreceive = (quantityofpriceasset - SwapFeetoreceive)
272+ let SumupofSwapTxns = match getInteger(this, "Total_of_Swaps_Txns") {
273+ case a: Int =>
274+ a
275+ case _ =>
276+ 0
277+ }
278+ let NewSumupofSwapTxns = (SumupofSwapTxns + 1)
279+ let SumupofUSDTToAssetSwapFee = match getInteger(this, ("Total_Swap_Fee_Collected_" + EnterAssetID)) {
280+ case a: Int =>
281+ a
282+ case _ =>
283+ 0
284+ }
285+ let NewSumupofUSDTToAssetSwapFee = (SumupofUSDTToAssetSwapFee + SwapFeetoreceive)
286+ let SumupAssetBalance = match getInteger(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID)) {
287+ case a: Int =>
288+ a
289+ case _ =>
290+ 0
291+ }
292+ let NewSumupofAssetBalance = (CheckAssetBalance - quantityofpriceasset)
293+ let SumupUSDTBalance = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID))) {
294+ case a: Int =>
295+ a
296+ case _ =>
297+ 0
298+ }
299+ let NewSumupofUSDTBalance = (CheckUSDTBalance + pmt.amount)
229300 if ((checkpairisavailableornot != EnterAssetID))
230301 then throw("Pair is not available in Whitelisted Asset.")
231302 else if ((VotingStatus == CurrentVotingStatus))
232303 then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
233304 else if ((EnterAssetID == toBase58String(USDTAssetID)))
234- then throw("Input can Never be a USDT AssetID. Enter AssetID in input and Attach USDT as attachment Token.")
305+ then throw("Input can Never be a USDT AssetID. Enter Whitelisted AssetID in input and Attach USDT as an attachment Token in payment[1].")
235306 else if ((pmt.assetId != USDTAssetID))
236- then throw("You can Attach USDT as an Attached Payment to Swap USDT To Required Token. Any other asset else than USDT will be rejected.")
307+ then throw("You can Attach USDT as an Attached Payment[1] to Swap USDT To Required Token. Any other asset else than USDT will be rejected.")
237308 else if ((1000000 > pmt.amount))
238309 then throw("Your Attached USDT Amount is very low. Attach Atleast 1 USDT to Claim the minimum Tokens.")
239- else [IntegerEntry(((("ReversePrice_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), CheckReversePairPrice), ScriptTransfer(i.caller, ((quantityofpriceasset * 99) / 100), fromBase58String(EnterAssetID)), ScriptTransfer(i.caller, ((quantityofpriceasset * ReverseSwapFee) / 100), fromBase58String(EnterAssetID))]
310+ else if ((CheckUSDTBalance == 0))
311+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
312+ else if ((CheckAssetBalance == 0))
313+ then throw("Swap Pair Need to Add Liquidity first into Pool. Only After that Pair will be activated for Swapping.")
314+ else if ((quantityofpriceasset > CheckAssetBalance))
315+ then throw((("Pool Only has a Liquidity of " + toString(CheckAssetBalance)) + " Tokens. Add Liquidity into Pool."))
316+ else [IntegerEntry(("Total_Swap_Fee_Collected_" + EnterAssetID), NewSumupofUSDTToAssetSwapFee), IntegerEntry("Total_of_Swaps_Txns", NewSumupofSwapTxns), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), NewSumupofAssetBalance), IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), NewSumupofUSDTBalance), ScriptTransfer(i.caller, userbalancetoreceive, fromBase58String(EnterAssetID)), ScriptTransfer(CollectAssetSwapFeeAddress, SwapFeetoreceive, fromBase58String(EnterAssetID))]
240317 }
241318
242319
243320
244321 @Callable(i)
245322 func AddLiquidity (EnterAssetID) = {
246323 let calleraddress = toBase58String(i.caller.bytes)
247- let pmt = if ((size(i.payments) == 1))
248- then i.payments[0]
249- else throw("Whitelisted Swap Token is required as Attached payment[1].")
250- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
251- nil
324+ let pmt1 = value(i.payments[0])
325+ let pmt2 = value(i.payments[1])
326+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
327+ let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
328+ let ReissueassetId = fromBase58String(valueOrErrorMessage(getString(this, ("LP_" + EnterAssetID)), "LP Token is Missing or May be not Generated."))
329+ let CurrentVotingStatus = "F"
330+ let AddLiquidityFee = 100000
331+ let CheckUSDTBalance = getIntegerValue(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))
332+ let CheckAssetBalance = getIntegerValue(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID))
333+ let newpriceofAsset = fraction(CheckUSDTBalance, 1, CheckAssetBalance)
334+ let quantityofEnterAssetID = fraction(1, pmt1.amount, newpriceofAsset)
335+ let quantityofLPToken1 = pmt2.amount
336+ let USDTHoldingInPair = match getInteger(this, ((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID))) {
337+ case a: Int =>
338+ a
339+ case _ =>
340+ 0
341+ }
342+ let NewUSDTHoldingInPair = (USDTHoldingInPair + pmt1.amount)
343+ let AssetHoldingInPair = match getInteger(this, ((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID)) {
344+ case a: Int =>
345+ a
346+ case _ =>
347+ 0
348+ }
349+ let NewAssetHoldingInPair = (AssetHoldingInPair + pmt2.amount)
350+ let LPTokenIssued = match getIntegerValue(this, ("Total_LP_" + EnterAssetID)) {
351+ case a: Int =>
352+ a
353+ case _ =>
354+ 0
355+ }
356+ let NewLPTokenIssued = (LPTokenIssued + quantityofLPToken1)
357+ if ((checkpairisavailableornot != EnterAssetID))
358+ then throw("Pair is not available in Whitelisted Asset.")
359+ else if ((VotingStatus == CurrentVotingStatus))
360+ then throw((EnterAssetID + " is not A Whitelisted Token Yet."))
361+ else if ((EnterAssetID == toBase58String(USDTAssetID)))
362+ then throw("Input can Never be a USDT AssetID. Enter Whitelisted AssetID in input as well as in payment[1] and Attach USDT as an attachment Token in payment[2].")
363+ else if ((size(i.payments) != 2))
364+ then throw("Two attached assets expected as payment in 50%-50%. Kindly Attach payment1 = USDT Token and payment2 = Token you want to add for Liquidity.")
365+ else if ((pmt1.assetId != USDTAssetID))
366+ then throw("Incorrect asset attached for Liquidity in payment[1], please attach USDT Token only.")
367+ else if ((10000000 > pmt1.amount))
368+ then throw("please attach atleast 10 USDT in payment[1].")
369+ else if ((pmt2.assetId == USDTAssetID))
370+ then throw("You Attached USDT asset for Liquidity in both payments, Kindly Attach payment1 = USDT Token and payment2 = Token you want to add for Liquidity.")
371+ else if ((pmt2.assetId != fromBase58String(EnterAssetID)))
372+ then throw((("Asset String " + EnterAssetID) + " is not matching with attached payment[2]. String and payment[2] must be same."))
373+ else if ((pmt2.amount != quantityofEnterAssetID))
374+ then throw(("Attached payment[2] quantity is not matching as per attached payment[1] USDT.It must be " + toString(quantityofEnterAssetID)))
375+ else [IntegerEntry(((("Balance_of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)), NewUSDTHoldingInPair), IntegerEntry(((("Balance_of_" + toBase58String(USDTAssetID)) + "_") + EnterAssetID), NewAssetHoldingInPair), IntegerEntry(("Total_LP_" + EnterAssetID), NewLPTokenIssued), Reissue(ReissueassetId, quantityofLPToken1, true), ScriptTransfer(i.caller, quantityofLPToken1, ReissueassetId)]
252376 }
253377
254378
255379
256380 @Callable(i)
257381 func RemovePairEntry (EnterAssetID) = {
258382 let adminrights = getStringValue(this, "Polarity_Admin_Rights")
259- let USDTAssetID = base58'GyqTYDea3DWBaAyQs5S5uH2223ucELYFazJpZLCfMznU'
260- let checkprojectexpireheight = getIntegerValue(this, ("Voting_End_Height_" + EnterAssetID))
261- let checkpairisavailableornot = getString(this, ("Pair_Under_Voting_" + EnterAssetID))
383+ let checkendheight = getIntegerValue(this, ("Voting_EH_" + EnterAssetID))
384+ let checkpairisavailableornot = getString(this, ("Pair_UV_" + EnterAssetID))
262385 let VotingStatus = getStringValue(this, ("Voting_Status_" + EnterAssetID))
263- let NewVotingStatus = "Pass"
386+ let NewVotingStatus = "P"
264387 let calleraddress = toBase58String(i.caller.bytes)
265388 let currentheight = height
266- let pendingblocksforprojectexpire = (checkprojectexpireheight - height)
389+ let pendingblocksforprojectexpire = (checkendheight - height)
267390 if ((checkpairisavailableornot != EnterAssetID))
268391 then throw("Pair is not available in Voting List.")
269392 else if ((adminrights != calleraddress))
270393 then throw((("I know You are not An Admin. Only " + adminrights) + " has rights to remove the pair."))
271- else if ((checkprojectexpireheight > height))
394+ else if ((checkendheight > height))
272395 then throw((("Voting Already Running. You can remove the pair after " + toString(pendingblocksforprojectexpire)) + " Blocks"))
273396 else if ((VotingStatus == NewVotingStatus))
274397 then throw((EnterAssetID + " is now Whitelisted. So you can't remove it."))
275- else [DeleteEntry(("Pair_Under_Voting_" + EnterAssetID)), DeleteEntry(("Voting_Start_Height_" + EnterAssetID)), DeleteEntry(("Voting_End_Height_" + EnterAssetID)), DeleteEntry(("Voting_Period_" + EnterAssetID)), DeleteEntry(("Votes_Required_" + EnterAssetID)), DeleteEntry(("Voting_Listing_Fee_" + EnterAssetID)), DeleteEntry(("Voting_Status_" + EnterAssetID)), DeleteEntry(("Votes_Received_" + EnterAssetID)), DeleteEntry(((("Price_Of_" + EnterAssetID) + "_") + toBase58String(USDTAssetID)))]
398+ else [DeleteEntry(("Pair_UV_" + EnterAssetID)), DeleteEntry(("Voting_SH_" + EnterAssetID)), DeleteEntry(("Voting_EH_" + EnterAssetID)), DeleteEntry(("Voting_Period_" + EnterAssetID)), DeleteEntry(("Votes_Req_" + EnterAssetID)), DeleteEntry(("Listing_Fee_" + EnterAssetID)), DeleteEntry(("Voting_Status_" + EnterAssetID)), DeleteEntry(("Votes_Rcvd_" + EnterAssetID))]
276399 }
400+
401+
402+
403+@Callable(i)
404+func RemoveEntry (Key,Key1,Key2,Key3) = [DeleteEntry(Key), DeleteEntry(Key1), DeleteEntry(Key2), DeleteEntry(Key3)]
277405
278406
279407 @Verifier(tx)
280408 func verify () = match tx {
281409 case _ =>
282410 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
283411 }
284412

github/deemru/w8io/169f3d6 
76.62 ms