tx · 7CY3DHR7HV5ydXRX6awQYcTxNLuumhDc17FhpFRSfVp8

3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1:  -0.03400000 Waves

2023.08.10 20:22 [2704780] smart account 3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1 > SELF 0.00000000 Waves

{ "type": 13, "id": "7CY3DHR7HV5ydXRX6awQYcTxNLuumhDc17FhpFRSfVp8", "fee": 3400000, "feeAssetId": null, "timestamp": 1691688190445, "version": 2, "chainId": 84, "sender": "3MqzpRGNBq3GSxMonFoenAhNRDHJ2a8omm1", "senderPublicKey": "Cm1uVVKocYw3S4eL9bYUMNZe5vpBPipgiiTx37eL6E8F", "proofs": [ "2fshVXCecexj7Xp8MeKprKTTewxjcsiQL4wpWwezHYaR8Qj9LqRcuZRRGvjRJ9kuCSQsYfe1wnjXmcETBzoEcZSU", "2SwPEwH89eD5c3NbYsQBDHiw6nEbFUzHwybiFYQtGkZpJ5WzHSXERPamzZPHVpc1MeuJ8huRJAHjEHDa8JDpAsVE" ], "script": "base64:BgJQCAISBAoCAQgSAwoBCBIUChIIAQEIAQEBAQEBAQEYBAEBBBgSBAoCAQgSBAoCAQgSBAoCAQgSBQoDAQEIEgMKAQESAwoBARIECgIBARIAEgBMAAlrZXlBY3RpdmUCBmFjdGl2ZQALa0FjdGl2ZUdsb2ICFGFjdGl2ZV9hbGxfY29udHJhY3RzAA9rZXlBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA9rZXlBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA9rZXlBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zACFrZXlMYXVuY2hwYWREYXRhVHJhbnNhY3Rpb25TdGF0dXMCIWxhdW5jaHBhZF9kYXRhX3RyYW5zYWN0aW9uX3N0YXR1cwASa2V5TGF1bmNocGFkTmV4dElkAhFsYXVuY2hwYWRfbmV4dF9pZAAUa2V5TGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQADWtleUluaXRDYWxsZXICC2luaXRfY2FsbGVyAAprZXlBZGRyZXNzAghfYWRkcmVzcwANa2V5SW5pdEhlaWdodAIMX2luaXRfaGVpZ2h0AA5rZXlTdGFydEhlaWdodAINX3N0YXJ0X2hlaWdodAARa2V5RmluYWxpc2VIZWlnaHQCEF9maW5hbGlzZV9oZWlnaHQADGtleUNvbWlzc2lvbgIKX2NvbWlzc2lvbgAKa2V5QXNzZXRJZAIJX2Fzc2V0X2lkABNrZXlUb3RhbFRva2VuQW1vdW50AhNfdG90YWxfdG9rZW5fYW1vdW50ABprZXlUb3RhbEFtb3VudEJ1eUFzc2V0U29sZAIVX3RvdGFsX2J1eV9hc3NldF9zb2xkABJrZXlUb2tlbnNQZXJUaWNrZXQCEl90b2tlbnNfcGVyX3RpY2tldAAQa2V5UHJpY2VQZXJUb2tlbgIQX3ByaWNlX3Blcl90b2tlbgAQa2V5U3dvcFBlclRpY2tldAIQX3N3b3BfcGVyX3RpY2tldAAWa2V5U3dvcGZpVGlja2V0c0Ftb3VudAIXX3RpY2tldHNfc3dvcGZpX21lbWJlcnMAF2tleUNhbXBhaWduVG9rZW5zQW1vdW50AhNfdG9rZW5zX2FjY2Vzc19saXN0ABZrZXlUb2tlbnNQZXJBbGxvY2F0aW9uAhZfdG9rZW5zX3Blcl9hbGxvY2F0aW9uABNrZXlUaWNrZXRMYXN0TnVtYmVyAhNfdGlja2V0X2xhc3RfbnVtYmVyABNrZXlHb3Zlcm5hbmNlU3Rha2VkAg1fR1N3b3BfYW1vdW50AAxrZXlVc2VyUmVmSWQCB19yZWZfaWQADWtleVZlcmlmeUhhc2gCDF92ZXJpZnlfaGFzaAALa2V5RHVyYXRpb24CCV9kdXJhdGlvbgAca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwInX3RvdGFsX3B1cmNoYXNlZF9idXlfYXNzZXRfaW5fbWFya2V0aW5nACVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkAjFfdG90YWxfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmdfZmluYWxpemVkABNrZXlUcmFuc2ZlckJ1eUFzc2V0AhNfdHJhbnNmZXJfYnV5X2Fzc2V0ABRrZXlGcmVlelN3b3BEdXJhdGlvbgIVX2ZyZWV6ZV9zd29wX2R1cmF0aW9uABhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4CGF9mcmVlemVfYWRkaXRpb25hbF90b2tlbgAQa2V5RnJlZXplVG9rZW5JZAIQX2ZyZWV6ZV90b2tlbl9pZAAWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgIWX2ZyZWV6ZV90b2tlbl9kdXJhdGlvbgAXa2V5RnJlZXplVG9rZW5QZXJUaWNrZXQCGF9mcmVlemVfdG9rZW5fcGVyX3RpY2tldAALa2V5QnV5VG9rZW4CCl9idXlfdG9rZW4ADmtleUNsYWltUGFyYW1zAg1fY2xhaW1fcGFyYW1zABtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24CG19oaWdoX2NvbXBldGl0aW9uX2NvbWlzc2lvbgAWa2V5SGlnaENvbXBldGl0aW9uU2FsZQIWX2hpZ2hfY29tcGV0aXRpb25fc2FsZQAVa2V5SENUaWNrZXRMYXN0TnVtYmVyAiRfaGlnaF9jb21wZXRpdGlvbl90aWNrZXRfbGFzdF9udW1iZXIAGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAIZX3RpY2tldHNfaGlnaF9jb21wZXRpdGlvbgAca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwImX3RvdGFsX2J1eV9hc3NldF9zb2xkX2hpZ2hfY29tcGV0aXRpb24AFGtleVVzZXJDbGFpbWVkVG9rZW5zAg9fY2xhaW1lZF90b2tlbnMAF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zAhNfY2xhaW1lZF9idXlfdG9rZW5zABprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAIPX2JvdWdodF90aWNrZXRzAA5rZXlVc2VyVGlja2V0cwIPX3RpY2tldHNfbnVtYmVyABBrZXlVc2VySENUaWNrZXRzAiBfdGlja2V0c19udW1iZXJfaGlnaF9jb21wZXRpdGlvbgAca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAIgX2JvdWdodF90aWNrZXRzX2hpZ2hfY29tcGV0aXRpb24AG2tleVVzZXJBdmFpbGFibGVBbGxvY2F0aW9ucwIdX2F2YWlsYWJsZV9wdXJjaGFzZV9tYXJrZXRpbmcAIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nAiFfcHVyY2hhc2VkX2J1eV9hc3NldF9pbl9tYXJrZXRpbmcAGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwITX2JvdWdodF9hbGxvY2F0aW9ucwASa2V5VXNlckNsYWltU3RhdHVzAg1fY2xhaW1fc3RhdHVzABprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAIPX3RpY2tldHNfcmVzdWx0AClrZXlVc2VyV2lubmVkSGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAIgX3RpY2tldHNfcmVzdWx0X2hpZ2hfY29tcGV0aXRpb24AEmtleVVzZXJGcmVlemVUb2tlbgIUX2ZyZWV6ZV90b2tlbl9hbW91bnQABm9yYWNsZQkBB0FkZHJlc3MBARoBV4r/CGiaNbpAzWF08hI33qY38Po4zugeOAAKZ292ZXJuYW5jZQkBB0FkZHJlc3MBARoBV8lXnLdvepYMywgiOQ98homAomzcs7cW7QAQY29tbWlzc2lvbldhbGxldAkBB0FkZHJlc3MBARoBV6BRpy/wPSJ8xbXfMYJKm3TgPPkqMILhZwASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEBGgFX5A6nNk+SC9eXz6QdPzUbz0Nq66o883GdAARVU0ROASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QASYWRtaW5QdWJLZXlTdGFraW5nASCyPZ8dhjeaV4XmI1H04Td7I49qWAHdPugNaMCOdHtYKAAUbWF4QWxsb2NhdGlvbnNBbW91bnQAAgARYWN0aXZlTGF1bmNocGFkSWQJAQt2YWx1ZU9yRWxzZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFFGtleUxhdW5jaHBhZEFjdGl2ZUlkAP///////////wEBC2dldEFkbWluUHViAQtrZXlBZG1pblB1YgQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFC2tleUFkbWluUHViAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgECGUFkbWluIHB1YmxpYyBrZXkgaXMgZW1wdHkADGFkbWluUHViS2V5MQkBC2dldEFkbWluUHViAQUPa2V5QWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJAQtnZXRBZG1pblB1YgEFD2tleUFkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQELZ2V0QWRtaW5QdWIBBQ9rZXlBZG1pblB1YktleTMBDGdldEFzc2V0SW5mbwEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAQIc3RyaW5nSWQJANgEAQUCaWQEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJpZAkArAICCQCsAgICBkFzc2V0IAUIc3RyaW5nSWQCDiBkb2Vzbid0IGV4aXN0CQCVCgMFCHN0cmluZ0lkCAUEaW5mbwRuYW1lCAUEaW5mbwhkZWNpbWFscwMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAkAlQoDAgVXQVZFUwIFV0FWRVMACAkAAgECC01hdGNoIGVycm9yARJnZXRMYXVuY2hwYWROZXh0SWQACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEmtleUxhdW5jaHBhZE5leHRJZAABARBzdGFrZWRVc2RuQW1vdW50AAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJzdGFraW5nVVNETkFkZHJlc3MJAKwCAgkArAICCQCsAgICDHJwZF9iYWxhbmNlXwkA2AQBBQRVU0ROAgFfCQClCAEFBHRoaXMAAAAGYWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFCWtleUFjdGl2ZQYACmFjdGl2ZUdsb2IJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlBQtrQWN0aXZlR2xvYgYBCGlzQWN0aXZlAAMDBQZhY3RpdmUFCmFjdGl2ZUdsb2IHBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCGFzc2V0U3RyAwkAAAIFCGFzc2V0U3RyAgVXQVZFUwkAlgoEBQR1bml0AgVXQVZFUwIFV0FWRVMACAQIc3RyaW5nSWQFCGFzc2V0U3RyBAJpZAkA2QQBBQhhc3NldFN0cgQEaW5mbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmlkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJYKBAUCaWQFCHN0cmluZ0lkCAUEaW5mbwRuYW1lCAUEaW5mbwhkZWNpbWFscwwBaQENaGFzaGluZ1JhbmRvbQILbGF1bmNocGFkSWQEaGFzaAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDWtleVZlcmlmeUhhc2gFBGhhc2gFA25pbAFpAQppbml0Q2FsbGVyAQdhZGRyZXNzCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXIFB2FkZHJlc3MFA25pbAFpAQRpbml0Eg5wcm9qZWN0QWRkcmVzcwtzdGFydEhlaWdodAhkdXJhdGlvbghidXlUb2tlbgpjb21taXNzaW9uD3Rva2Vuc1BlclRpY2tldA1wcmljZVBlclRva2VuE3N3b3BmaVRpY2tldHNBbW91bnQUY2FtcGFpZ25Ub2tlbnNBbW91bnQTdG9rZW5zUGVyQWxsb2NhdGlvbg1zd29wUGVyVGlja2V0EnN3b3BGcmVlemVEdXJhdGlvbgtjbGFpbVBhcmFtcxNIaWdoQ29tcGV0aXRpb25TYWxlGGhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbhxoaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50FWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgxmcmVlemVQYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rZXlJbml0Q2FsbGVyAgAJAAIBAilPbmx5IHByb2plY3QgYWRtaW4gY2FuIGNhbGwgaW5pdCBmdW5jdGlvbgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkAZgIFBmhlaWdodAULc3RhcnRIZWlnaHQJAAIBAjNTdGFydCBoZWlnaHQgbXVzdCBiZSBncmVhdGVyIHRoYW4gYmxvY2tjaGFpbiBoZWlnaHQDAwUVZnJlZXplQWRkaXRpb25hbFRva2VuCQECIT0CCQCQAwEFDGZyZWV6ZVBhcmFtcwADBwkAAgECJEZyZWV6ZSBwYXJhbXMgbGlzdCBtdXN0IGhhdmUgMyBpdGVtcwQLbGF1bmNocGFkSWQJARJnZXRMYXVuY2hwYWROZXh0SWQABA5sYXVuY2hwYWRJZFN0cgkApAMBBQtsYXVuY2hwYWRJZAQLJHQwNjUwMDY1NzUJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwNjUwMDY1NzUCXzEECnBtdEFzc2V0SWQIBQskdDA2NTAwNjU3NQJfMgQLJHQwNjU4NDY2NTcJAQxnZXRBc3NldEluZm8BBQpwbXRBc3NldElkBA1wbXRTdHJBc3NldElkCAULJHQwNjU4NDY2NTcCXzEEDHBtdEFzc2V0TmFtZQgFCyR0MDY1ODQ2NjU3Al8yBAtwbXREZWNpbWFscwgFCyR0MDY1ODQ2NjU3Al8zBBVmcmVlemVBZGRpdGlvbmFsRW50cnkDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgYJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUQa2V5RnJlZXplVG9rZW5JZAkAkQMCBQxmcmVlemVQYXJhbXMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5RnJlZXplVG9rZW5EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGZyZWV6ZVBhcmFtcwACBQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDXBtdFN0ckFzc2V0SWQCCl9sYXVuY2hwYWQFC2xhdW5jaHBhZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrZXlMYXVuY2hwYWROZXh0SWQJAGQCBQtsYXVuY2hwYWRJZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFkZHJlc3MFDnByb2plY3RBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ1rZXlJbml0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDmtleVN0YXJ0SGVpZ2h0BQtzdGFydEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgULa2V5RHVyYXRpb24FCGR1cmF0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFC2tleUJ1eVRva2VuBQhidXlUb2tlbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUUa2V5RnJlZXpTd29wRHVyYXRpb24FEnN3b3BGcmVlemVEdXJhdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VG90YWxUb2tlbkFtb3VudAUJcG10QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFCmtleUFzc2V0SWQFDXBtdFN0ckFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFDGtleUNvbWlzc2lvbgUKY29tbWlzc2lvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUTa2V5VGlja2V0TGFzdE51bWJlcgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBRVrZXlIQ1RpY2tldExhc3ROdW1iZXIAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUSa2V5VG9rZW5zUGVyVGlja2V0BQ90b2tlbnNQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVByaWNlUGVyVG9rZW4FDXByaWNlUGVyVG9rZW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFEGtleVN3b3BQZXJUaWNrZXQFDXN3b3BQZXJUaWNrZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFFmtleVN3b3BmaVRpY2tldHNBbW91bnQFE3N3b3BmaVRpY2tldHNBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFF2tleUNhbXBhaWduVG9rZW5zQW1vdW50BRRjYW1wYWlnblRva2Vuc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFDmxhdW5jaHBhZElkU3RyBQ5rZXlDbGFpbVBhcmFtcwkAuQkCBQtjbGFpbVBhcmFtcwIBLAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUWa2V5SGlnaENvbXBldGl0aW9uU2FsZQUTSGlnaENvbXBldGl0aW9uU2FsZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQ5sYXVuY2hwYWRJZFN0cgUba2V5SGlnaENvbXBldGl0aW9uQ29taXNzaW9uBRhoaWdoQ29tcGV0aXRpb25Db21pc3Npb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUObGF1bmNocGFkSWRTdHIFGGtleUhpZ2hDb21wZXRpdGlvbkFtb3VudAUcaGlnaENvbXBldGl0aW9uVGlja2V0c0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa2V5TGF1bmNocGFkQWN0aXZlSWQFC2xhdW5jaHBhZElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtleUluaXRDYWxsZXICAAUDbmlsBRVmcmVlemVBZGRpdGlvbmFsRW50cnkBaQEQY29tbWl0U3dvcGZpU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECyR0MDkyNjM5MzM4CQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFCyR0MDkyNjM5MzM4Al8xBApwbXRBc3NldElkCAULJHQwOTI2MzkzMzgCXzIECyR0MDkzNDM5NDkzCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFCyR0MDkzNDM5NDkzAl8xBA1idXlBc3NldFN0cklkCAULJHQwOTM0Mzk0OTMCXzIEDGJ1eUFzc2V0TmFtZQgFCyR0MDkzNDM5NDkzAl8zBBBidXlBc3NldERlY2ltYWxzCAULJHQwOTM0Mzk0OTMCXzQEC3N0YWtlZFN3b3BzCQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdmVybmFuY2UJAKwCAgkApQgBCAUBaQZjYWxsZXIFE2tleUdvdmVybmFuY2VTdGFrZWQAAAQXYWxsb3dlZFRpY2tldHNBbW91bnRBbGwJAGkCBQtzdGFrZWRTd29wcwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlTd29wUGVyVGlja2V0BBNib3VnaHRUaWNrZXRzQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAAABBRhbGxvd2VkVGlja2V0c0Ftb3VudAkAZQIFF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsBRNib3VnaHRUaWNrZXRzQW1vdW50BAtzdGFydEhlaWdodAkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0BAhkdXJhdGlvbgkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uBBVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRhrZXlGcmVlemVBZGRpdGlvbmFsVG9rZW4HAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAGYCBQtzdGFydEhlaWdodAUGaGVpZ2h0CQACAQIeTGF1bmNocGFkIHNhbGUgbm90IHN0YXJ0ZWQgeWV0AwkAZgIFBmhlaWdodAkAZAIFC3N0YXJ0SGVpZ2h0BQhkdXJhdGlvbgkAAgECFExhdW5jaHBhZCBzYWxlIGVuZGVkAwMJAQEhAQUVZnJlZXplQWRkaXRpb25hbFRva2VuAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkBAiE9AgUKcG10QXNzZXRJZAUKYnV5QXNzZXRJZAcJAAIBCQCsAgIJAKwCAgIYT25lIGF0dGFjaGVkIHBheW1lbnQgaW4gBQxidXlBc3NldE5hbWUCCSBleHBlY3RlZAMDBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4DCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAIGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkBwQNZnJlZXplVG9rZW5JZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkCQACAQkArAICCQCsAgIJAKwCAgIpVHdvIGF0dGFjaGVkIHBheW1lbnRzIGV4cGVjdGVkOiBGaXJzdCBpbiAFDGJ1eUFzc2V0TmFtZQIMLCBzZWNvbmQgaW4gBQ1mcmVlemVUb2tlbklkAwMJAGcCAAAFF2FsbG93ZWRUaWNrZXRzQW1vdW50QWxsBgkAZwIAAAUUYWxsb3dlZFRpY2tldHNBbW91bnQJAAIBAipOb3QgZW5vdWdodCBTV09QIGluIHN0YWtpbmcgdG8gYnV5IHRpY2tldHMECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTEzMDUxMTQ0OQkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxMTMwNTExNDQ5Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxMTMwNTExNDQ5Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDExMzA1MTE0NDkCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxMTMwNTExNDQ5Al80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDGtleUNvbWlzc2lvbgBkBA9idXlUaWNrZXRBbW91bnQJAGkCBQlwbXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAlwMBCQDMCAIFD2J1eVRpY2tldEFtb3VudAkAzAgCBRRhbGxvd2VkVGlja2V0c0Ftb3VudAUDbmlsBBxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uCQBoAgUWYWxsb3dlZEJ1eVRpY2tldEFtb3VudAkAZAIFC3RpY2tldFByaWNlBRNjb21taXNzaW9uUGVyVGlja2V0BAZjaGFuZ2UJAGUCBQlwbXRBbW91bnQFHGFsbG93ZWRCdXlQcmljZVdpdGhDb21pc3Npb24DCQAAAgUPYnV5VGlja2V0QW1vdW50AAAJAAIBCQCsAgIJAKwCAgIMTm90IGVub3VnaHQgBQxidXlBc3NldE5hbWUCDyB0byBidXkgdGlja2V0cwMJAQIhPQIFBmNoYW5nZQAACQACAQkArAICCQCsAgIJAKwCAgkArAICAhZXcm9uZyBwYXltZW50LiBUbyBidXkgCQCkAwEFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQCGHRpY2tldHMgeW91IG5lZWQgdG8gcGF5IAkApAMBBRxhbGxvd2VkQnV5UHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUEFWZyZWV6ZUFkZGl0aW9uYWxFbnRyeQMFFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgQNZnJlZXplVG9rZW5JZAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkBBRmcmVlemVUb2tlblBlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRdrZXlGcmVlemVUb2tlblBlclRpY2tldAQNJHQwMTI2MTMxMjcwMAkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAQdhc3NldElkBA9wbXRBbW91bnRGcmVlemUIBQ0kdDAxMjYxMzEyNzAwAl8xBBBwbXRBc3NldElkRnJlZXplCAUNJHQwMTI2MTMxMjcwMAJfMgQNJHQwMTI3MTcxMjgwOAkBDGdldEFzc2V0SW5mbwEFCnBtdEFzc2V0SWQEE3BtdEZyZWV6ZVN0ckFzc2V0SWQIBQ0kdDAxMjcxNzEyODA4Al8xBBJwbXRGcmVlemVBc3NldE5hbWUIBQ0kdDAxMjcxNzEyODA4Al8yBBFwbXRGcmVlemVEZWNpbWFscwgFDSR0MDEyNzE3MTI4MDgCXzMEEG5lZWRGcmVlemVUb2tlbnMJAGgCBRRmcmVlemVUb2tlblBlclRpY2tldAUPYnV5VGlja2V0QW1vdW50AwMJAQIhPQIFE3BtdEZyZWV6ZVN0ckFzc2V0SWQFDWZyZWV6ZVRva2VuSWQGCQECIT0CBRBuZWVkRnJlZXplVG9rZW5zBQ9wbXRBbW91bnRGcmVlemUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEFlvdSBuZWVkIHRvIGFkZCAJAKQDAQUQbmVlZEZyZWV6ZVRva2VucwIBIAUScG10RnJlZXplQXNzZXROYW1lAhQgYXMgYSBzZWNvbmQgcGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJGcmVlemVUb2tlbgUPcG10QW1vdW50RnJlZXplBQNuaWwFA25pbAQYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlVc2VyVGlja2V0cwIABBZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRpY2tldExhc3ROdW1iZXIEC2JvdWdodFJhbmdlCQCsAgIJAKwCAgkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgABAgEtCQCkAwEJAGQCBRZsYXN0Qm91Z2h0VGlja2V0TnVtYmVyBRZhbGxvd2VkQnV5VGlja2V0QW1vdW50BBtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMJAKwCAgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAwkBAiE9AgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAgAJAKwCAgIBLAULYm91Z2h0UmFuZ2UJAKwCAgIABQtib3VnaHRSYW5nZQQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAkAZAIFE2JvdWdodFRpY2tldHNBbW91bnQFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VGlja2V0TGFzdE51bWJlcgkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIFFmFsbG93ZWRCdXlUaWNrZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFDmtleVVzZXJUaWNrZXRzBRtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMFA25pbAUVZnJlZXplQWRkaXRpb25hbEVudHJ5AwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUY29tbWl0QWNjZXNzTGlzdFNhbGUCC2xhdW5jaHBhZElkBXJlZklkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA0kdDAxNDg3OTE0OTU0CQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFDSR0MDE0ODc5MTQ5NTQCXzEECnBtdEFzc2V0SWQIBQ0kdDAxNDg3OTE0OTU0Al8yBA0kdDAxNDk1OTE1MTA5CQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDE0OTU5MTUxMDkCXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAxNDk1OTE1MTA5Al8yBAxidXlBc3NldE5hbWUIBQ0kdDAxNDk1OTE1MTA5Al8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMTQ5NTkxNTEwOQJfNAQTdXNlclVzZG5Jbk1hcmtldGluZwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUga2V5VXNlckFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcAAAQPdXNkbkluTWFya2V0aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5QW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwAABBFib3VnaHRBbGxvY2F0aW9ucwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUYa2V5VXNlckJvdWdodEFsbG9jYXRpb25zAAAECmNvbW1pc3Npb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUMa2V5Q29taXNzaW9uBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4EE3Rva2Vuc1BlckFsbG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgQNJHQwMTU3NzgxNTkyMgkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxNTc3ODE1OTIyAl8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxNTc3ODE1OTIyAl8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDE1Nzc4MTU5MjICXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxNTc3ODE1OTIyAl80BBxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uCQBrAwkAawMFCnRva2VuUHJpY2UFE3Rva2Vuc1BlckFsbG9jYXRpb24JAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04JAGQCAGQFCmNvbW1pc3Npb24AZAQLc3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlTdGFydEhlaWdodAQIZHVyYXRpb24JAQV2YWx1ZQEJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgMJAQIhPQIFEWFjdGl2ZUxhdW5jaHBhZElkBQtsYXVuY2hwYWRJZAkAAgECN1RoZXJlIGlzIG5vIGFjdGl2ZSBsYXVuY2hwYWQgb3IgdGhpcyBsYXVuY2hwYWQgaXMgZW5kZWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQDCQBnAgURYm91Z2h0QWxsb2NhdGlvbnMFFG1heEFsbG9jYXRpb25zQW1vdW50CQACAQkArAICCQCsAgICEVlvdSBjYW4gYnV5IG9ubHkgCQCkAwEFFG1heEFsbG9jYXRpb25zQW1vdW50AgthbGxvY2F0aW9ucwMDCQECIT0CBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQlwbXRBbW91bnQJAQIhPQIJAGgCBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uAAIFCXBtdEFtb3VudAcJAAIBCQCsAgIJAKwCAgkArAICAjJXcm9uZyBwYXltZW50LiBZb3UgY2FuIGJ1eSAxIG9yIDIgYWxsb2NhdGlvbnMgZm9yIAkApAMBBRxhbGxvY2F0aW9uUHJpY2VXaXRoQ29taXNzaW9uBQxidXlBc3NldE5hbWUCDyBwZXIgYWxsb2NhdGlvbgQUYnV5QWxsb2NhdGlvbnNBbW91bnQJAGkCBQlwbXRBbW91bnQFHGFsbG9jYXRpb25QcmljZVdpdGhDb21pc3Npb24EA2ludgMJAAACBQpidXlBc3NldElkBQRVU0ROCQD8BwQFEnN0YWtpbmdVU0ROQWRkcmVzcwIMbG9ja05ldXRyaW5vBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFCXBtdEFtb3VudAUDbmlsAAADCQAAAgUDaW52BQNpbnYECWJhc2VFbnRyeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwkAZAIFEWJvdWdodEFsbG9jYXRpb25zBRRidXlBbGxvY2F0aW9uc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFIGtleVVzZXJBbW91bnRCdXlBc3NldEluTWFya2V0aW5nCQBkAgUTdXNlclVzZG5Jbk1hcmtldGluZwUJcG10QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFHGtleUFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcJAGQCBQ91c2RuSW5NYXJrZXRpbmcFCXBtdEFtb3VudAUDbmlsAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUMa2V5VXNlclJlZklkBQVyZWZJZAUDbmlsBQliYXNlRW50cnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZY29tbWl0SGlnaENvbXBldGl0aW9uU2FsZQILbGF1bmNocGFkSWQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDE4MTgwMTgyNTUJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAUNJHQwMTgxODAxODI1NQJfMQQKcG10QXNzZXRJZAgFDSR0MDE4MTgwMTgyNTUCXzIEDSR0MDE4MjYwMTg0MTAJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMTgyNjAxODQxMAJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDE4MjYwMTg0MTACXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDE4MjYwMTg0MTACXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAxODI2MDE4NDEwAl80BAtzdGFydEhlaWdodAkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFDmtleVN0YXJ0SGVpZ2h0BAhkdXJhdGlvbgkBBXZhbHVlAQkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUR1cmF0aW9uBBVib3VnaHRIQ1RpY2tldHNBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQAAAQTaGlnaENvbXBldGl0aW9uU2FsZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleUhpZ2hDb21wZXRpdGlvblNhbGUHAwkBAiE9AgURYWN0aXZlTGF1bmNocGFkSWQFC2xhdW5jaHBhZElkCQACAQI3VGhlcmUgaXMgbm8gYWN0aXZlIGxhdW5jaHBhZCBvciB0aGlzIGxhdW5jaHBhZCBpcyBlbmRlZAMJAQEhAQUTaGlnaENvbXBldGl0aW9uU2FsZQkAAgECNFRoZXJlIGlzIG5vIGhpZ2ggY29tcGV0aXRpb24gc2FsZSBmb3IgdGhpcyBsYXVuY2hwYWQDCQBmAgULc3RhcnRIZWlnaHQFBmhlaWdodAkAAgECHkxhdW5jaHBhZCBzYWxlIG5vdCBzdGFydGVkIHlldAMJAGYCBQZoZWlnaHQJAGQCBQtzdGFydEhlaWdodAUIZHVyYXRpb24JAAIBAhRMYXVuY2hwYWQgc2FsZSBlbmRlZAMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQECIT0CBQpwbXRBc3NldElkBQpidXlBc3NldElkCQACAQkArAICCQCsAgICGE9uZSBhdHRhY2hlZCBwYXltZW50IGluIAUMYnV5QXNzZXROYW1lAgkgZXhwZWN0ZWQECnRva2VuUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUQa2V5UHJpY2VQZXJUb2tlbgQPdG9rZW5zUGVyVGlja2V0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEmtleVRva2Vuc1BlclRpY2tldAQNJHQwMTk1ODMxOTcyNwkBFmdldEFzc2V0SW5mb0Zyb21TdHJpbmcBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFzc2V0SWQEB3Rva2VuSWQIBQ0kdDAxOTU4MzE5NzI3Al8xBA90b2tlblN0ckFzc2V0SWQIBQ0kdDAxOTU4MzE5NzI3Al8yBA50b2tlbkFzc2V0TmFtZQgFDSR0MDE5NTgzMTk3MjcCXzMEDXRva2VuRGVjaW1hbHMIBQ0kdDAxOTU4MzE5NzI3Al80BAt0aWNrZXRQcmljZQkAawMFD3Rva2Vuc1BlclRpY2tldAUKdG9rZW5QcmljZQkAbAYACgAABQ10b2tlbkRlY2ltYWxzAAAAAAUERE9XTgQTY29tbWlzc2lvblBlclRpY2tldAkAawMFC3RpY2tldFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgBkBA9idXlUaWNrZXRBbW91bnQJAGkCBQlwbXRBbW91bnQJAGQCBQt0aWNrZXRQcmljZQUTY29tbWlzc2lvblBlclRpY2tldAQVYnV5UHJpY2VXaXRoQ29taXNzaW9uCQBoAgUPYnV5VGlja2V0QW1vdW50CQBkAgULdGlja2V0UHJpY2UFE2NvbW1pc3Npb25QZXJUaWNrZXQEBmNoYW5nZQkAZQIFCXBtdEFtb3VudAUVYnV5UHJpY2VXaXRoQ29taXNzaW9uAwkAAAIFD2J1eVRpY2tldEFtb3VudAAACQACAQkArAICCQCsAgICDE5vdCBlbm91Z2h0IAUMYnV5QXNzZXROYW1lAg8gdG8gYnV5IHRpY2tldHMDCQECIT0CBQZjaGFuZ2UAAAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgIWV3JvbmcgcGF5bWVudC4gVG8gYnV5IAkApAMBBQ9idXlUaWNrZXRBbW91bnQCGHRpY2tldHMgeW91IG5lZWQgdG8gcGF5IAkApAMBBRVidXlQcmljZVdpdGhDb21pc3Npb24FDGJ1eUFzc2V0TmFtZQQYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlVc2VySENUaWNrZXRzAgAEFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUVa2V5SENUaWNrZXRMYXN0TnVtYmVyBAtib3VnaHRSYW5nZQkArAICCQCsAgIJAKQDAQkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIAAQIBLQkApAMBCQBkAgUWbGFzdEJvdWdodFRpY2tldE51bWJlcgUPYnV5VGlja2V0QW1vdW50BBtuZXdVc2VyQm91Z2h0VGlja2V0c051bWJlcnMJAKwCAgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAwkBAiE9AgUYdXNlckJvdWdodFRpY2tldHNOdW1iZXJzAgAJAKwCAgIBLAULYm91Z2h0UmFuZ2UJAKwCAgIABQtib3VnaHRSYW5nZQQDaW52AwkAAAIFCmJ1eUFzc2V0SWQFBFVTRE4JAPwHBAUSc3Rha2luZ1VTRE5BZGRyZXNzAgxsb2NrTmV1dHJpbm8FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUJcG10QW1vdW50BQNuaWwAAAMJAAACBQNpbnYFA2ludgQJYmFzZUVudHJ5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUca2V5VXNlckhDQm91Z2h0VGlja2V0c0Ftb3VudAkAZAIFFWJvdWdodEhDVGlja2V0c0Ftb3VudAUPYnV5VGlja2V0QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFWtleUhDVGlja2V0TGFzdE51bWJlcgkAZAIFFmxhc3RCb3VnaHRUaWNrZXROdW1iZXIFD2J1eVRpY2tldEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUQa2V5VXNlckhDVGlja2V0cwUbbmV3VXNlckJvdWdodFRpY2tldHNOdW1iZXJzBQNuaWwDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlVc2VyUmVmSWQFBXJlZklkBQNuaWwFCWJhc2VFbnRyeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhmaW5hbGlzZQMLbGF1bmNocGFkSWQJdnJmSGVpZ2h0CnNlY3JldFdvcmQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkECXNhdmVkSGFzaAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ1rZXlWZXJpZnlIYXNoBAhjYWxjSGFzaAkA2AQBCQD3AwEJAMsBAgkAmgMBBQl2cmZIZWlnaHQJAJsDAQUKc2VjcmV0V29yZAMJAQIhPQIFCGNhbGNIYXNoBQlzYXZlZEhhc2gJAAIBAhx2cmYgSGVpZ2h0IGhhc2ggbm90IG1hdGNoaW5nBA0kdDAyMjM0MDIyNDkwCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQV2YWx1ZQEJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgQKYnV5QXNzZXRJZAgFDSR0MDIyMzQwMjI0OTACXzEEDWJ1eUFzc2V0U3RySWQIBQ0kdDAyMjM0MDIyNDkwAl8yBAxidXlBc3NldE5hbWUIBQ0kdDAyMjM0MDIyNDkwAl8zBBBidXlBc3NldERlY2ltYWxzCAUNJHQwMjIzNDAyMjQ5MAJfNAQOcHJvamVjdEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUKa2V5QWRkcmVzcwQKY29tbWlzc2lvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlDb21pc3Npb24EDGNvbW1pc3Npb25IQwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlIaWdoQ29tcGV0aXRpb25Db21pc3Npb24EEnRyYW5zZmVyZWRCdXlBc3NldAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFE2tleVRyYW5zZmVyQnV5QXNzZXQAAAQbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGmtleVRvdGFsQW1vdW50QnV5QXNzZXRTb2xkBBZzd29wZmlIQ0J1eUFzc2V0QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUca2V5VG90YWxBbW91bnRCdXlBc3NldFNvbGRIQwAABBZzd29wZmlNZW1iZXJzQ29taXNzaW9uCQBrAwUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BQpjb21taXNzaW9uAGQEEXN3b3BmaUhDQ29taXNzaW9uCQBrAwUWc3dvcGZpSENCdXlBc3NldEFtb3VudAUMY29tbWlzc2lvbkhDAGQEHnRvdGFsQW1vdW50QnV5QXNzZXRJbk1hcmtldGluZwkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBSVrZXlBbW91bnRCdXlBc3NldEluTWFya2V0aW5nRmluYWxpemVkBBJtYXJrZXRpbmdDb21pc3Npb24JAGsDBR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFCmNvbW1pc3Npb24AZAQNdW5zdGFrZUFtb3VudAkAZQIJAGQCCQBkAgkAZAIJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFFnN3b3BmaU1lbWJlcnNDb21pc3Npb24FEm1hcmtldGluZ0NvbWlzc2lvbgUWc3dvcGZpSENCdXlBc3NldEFtb3VudAURc3dvcGZpSENDb21pc3Npb24FEnRyYW5zZmVyZWRCdXlBc3NldAMJAGYCBRJ0cmFuc2ZlcmVkQnV5QXNzZXQJAGQCCQBkAgUbc3dvcGZpTWVtYmVyc0J1eUFzc2V0QW1vdW50BR50b3RhbEFtb3VudEJ1eUFzc2V0SW5NYXJrZXRpbmcFFnN3b3BmaUhDQnV5QXNzZXRBbW91bnQJAAIBAihDYW4ndCB0cmFuc2ZlciBuZWdhdGl2ZSB2YWx1ZSB0byBwcm9qZWN0BANpbnYDCQAAAgUKYnV5QXNzZXRJZAUEVVNETgkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDnVubG9ja05ldXRyaW5vCQDMCAIFDXVuc3Rha2VBbW91bnQJAMwIAgkA2AQBBQRVU0ROBQNuaWwFA25pbAAAAwkAAAIFA2ludgUDaW52CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEWtleUZpbmFsaXNlSGVpZ2h0BQZoZWlnaHQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUOcHJvamVjdEFkZHJlc3MJAGUCCQBkAgkAZAIFG3N3b3BmaU1lbWJlcnNCdXlBc3NldEFtb3VudAUWc3dvcGZpSENCdXlBc3NldEFtb3VudAUedG90YWxBbW91bnRCdXlBc3NldEluTWFya2V0aW5nBRJ0cmFuc2ZlcmVkQnV5QXNzZXQFCmJ1eUFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQY29tbWlzc2lvbldhbGxldAkAZAIJAGQCBRZzd29wZmlNZW1iZXJzQ29taXNzaW9uBRJtYXJrZXRpbmdDb21pc3Npb24FEXN3b3BmaUhDQ29taXNzaW9uBQpidXlBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0BC2xhdW5jaHBhZElkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABA1ib3VnaHRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRprZXlVc2VyQm91Z2h0VGlja2V0c0Ftb3VudAAABA9ib3VnaHRIQ1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFHGtleVVzZXJIQ0JvdWdodFRpY2tldHNBbW91bnQAAAQRYm91Z2h0QWxsb2NhdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFGGtleVVzZXJCb3VnaHRBbGxvY2F0aW9ucwAABA91c2VyQ2xhaW1TdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJDbGFpbVN0YXR1cwcEDmZpbmFsaXplSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQAAAMJAAACBQ5maW5hbGl6ZUhlaWdodAAACQACAQIxWW91IGNhbid0IGNsYWltIGJlY2F1c2UgcmVzdWx0cyBhcmUgbm90IGZpbmFsaXplZAMFD3VzZXJDbGFpbVN0YXR1cwkAAgECF1lvdSBhcmUgYWxyZWFkeSBjbGFpbWVkAwMDCQAAAgUNYm91Z2h0VGlja2V0cwAACQAAAgURYm91Z2h0QWxsb2NhdGlvbnMAAAcJAAACBQ9ib3VnaHRIQ1RpY2tldHMAAAcJAAIBAi5Zb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSB5b3UgZG9uJ3QgYnV5IGFueXRoaW5nBA0kdDAyNTU3NDI1NzUxCQEWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlCdXlUb2tlbgkA2AQBBQRVU0ROBApidXlBc3NldElkCAUNJHQwMjU1NzQyNTc1MQJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDI1NTc0MjU3NTECXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDI1NTc0MjU3NTECXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAyNTU3NDI1NzUxAl80BA13b25uZWRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRprZXlVc2VyV2lubmVkVGlja2V0c0Ftb3VudAAABA93b25uZWRIQ1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFKWtleVVzZXJXaW5uZWRIaWdoQ29tcGV0aXRpb25UaWNrZXRzQW1vdW50AAAEFGF3YWlsYWJsZUFsbG9jYXRpb25zCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRtrZXlVc2VyQXZhaWxhYmxlQWxsb2NhdGlvbnMAAAQKY29tbWlzc2lvbgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQxrZXlDb21pc3Npb24EDGNvbW1pc3Npb25IQwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFG2tleUhpZ2hDb21wZXRpdGlvbkNvbWlzc2lvbgAABBJhbGxvd2VkQWxsb2NhdGlvbnMJAJcDAQkAzAgCBRFib3VnaHRBbGxvY2F0aW9ucwkAzAgCBRRhd2FpbGFibGVBbGxvY2F0aW9ucwUDbmlsBAp0b2tlblByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFEGtleVByaWNlUGVyVG9rZW4ED3Rva2Vuc1BlclRpY2tldAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRJrZXlUb2tlbnNQZXJUaWNrZXQEDSR0MDI2NjY3MjY4MTEJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQprZXlBc3NldElkBAd0b2tlbklkCAUNJHQwMjY2NjcyNjgxMQJfMQQPdG9rZW5TdHJBc3NldElkCAUNJHQwMjY2NjcyNjgxMQJfMgQOdG9rZW5Bc3NldE5hbWUIBQ0kdDAyNjY2NzI2ODExAl8zBA10b2tlbkRlY2ltYWxzCAUNJHQwMjY2NjcyNjgxMQJfNAQLdGlja2V0UHJpY2UJAGsDBQ90b2tlbnNQZXJUaWNrZXQFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04EE3Rva2Vuc1BlckFsbG9jYXRpb24JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUWa2V5VG9rZW5zUGVyQWxsb2NhdGlvbgQUdHJhbnNmZXJUb2tlbnNBbW91bnQJAGQCCQBkAgkAaAIFDXdvbm5lZFRpY2tldHMFD3Rva2Vuc1BlclRpY2tldAkAaAIFEmFsbG93ZWRBbGxvY2F0aW9ucwUTdG9rZW5zUGVyQWxsb2NhdGlvbgkAaAIFD3dvbm5lZEhDVGlja2V0cwUPdG9rZW5zUGVyVGlja2V0BBtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMJAGgCCQBlAgURYm91Z2h0QWxsb2NhdGlvbnMFEmFsbG93ZWRBbGxvY2F0aW9ucwUTdG9rZW5zUGVyQWxsb2NhdGlvbgQWYnV5QXNzZXRGb3JBbGxvY2F0aW9ucwkAawMJAGsDBRtub3RBbGxvd2VkQWxsb2NhdGlvbnNUb2tlbnMFCnRva2VuUHJpY2UJAGwGAAoAAAUNdG9rZW5EZWNpbWFscwAAAAAFBERPV04JAGQCAGQFCmNvbW1pc3Npb24AZAQaYnV5QXNzZXRGb3JVbndvbm5lZFRpY2tldHMJAGsDCQBoAgkAZQIFDWJvdWdodFRpY2tldHMFDXdvbm5lZFRpY2tldHMFC3RpY2tldFByaWNlCQBkAgBkBQpjb21taXNzaW9uAGQEHGJ1eUFzc2V0Rm9ySENVbndvbm5lZFRpY2tldHMJAGsDCQBoAgkAZQIFD2JvdWdodEhDVGlja2V0cwUPd29ubmVkSENUaWNrZXRzBQt0aWNrZXRQcmljZQkAZAIAZAUMY29tbWlzc2lvbkhDAGQED2NsYWltZWRCdXlUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUXa2V5VXNlckNsYWltZWRCdXlUb2tlbnMAAAMDAwkAZgIAAAUWYnV5QXNzZXRGb3JBbGxvY2F0aW9ucwYJAGYCAAAFGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzBgkAZgIAAAUcYnV5QXNzZXRGb3JIQ1Vud29ubmVkVGlja2V0cwkAAgECUkVycm9yIHdpdGggYWxsb3dlZCBhbGxvY2F0aW9uIHBhcmFtIG9yIHdvbm5lZCB0aWNrZXRzIHBhcmFtIHBsZWFzZSBjb250YWN0IHN1cHBvcnQEFnJldHVybmVkQnV5QXNzZXRBbW91bnQJAGUCCQBkAgkAZAIFGmJ1eUFzc2V0Rm9yVW53b25uZWRUaWNrZXRzBRxidXlBc3NldEZvckhDVW53b25uZWRUaWNrZXRzBRZidXlBc3NldEZvckFsbG9jYXRpb25zBQ9jbGFpbWVkQnV5VG9rZW4EEHRyYW5zZmVyQnV5QXNzZXQDCQBmAgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUWcmV0dXJuZWRCdXlBc3NldEFtb3VudAUKYnV5QXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFF2tleVVzZXJDbGFpbWVkQnV5VG9rZW5zBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50BQNuaWwFA25pbAQDaW52AwMJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAJAAACBQpidXlBc3NldElkBQRVU0ROBwkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDnVubG9ja05ldXRyaW5vCQDMCAIFFnJldHVybmVkQnV5QXNzZXRBbW91bnQJAMwIAgkA2AQBBQRVU0ROBQNuaWwFA25pbAAAAwkAAAIFA2ludgUDaW52BA1jbGFpbWVkUGFyYW1zCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQ5rZXlDbGFpbVBhcmFtcwIIY2xhaW1BbGwCASwDCQAAAgkAkQMCBQ1jbGFpbWVkUGFyYW1zAAACCGNsYWltQWxsBA50cmFuc2ZlclRva2VucwMJAGYCBRR0cmFuc2ZlclRva2Vuc0Ftb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUUdHJhbnNmZXJUb2tlbnNBbW91bnQFB3Rva2VuSWQFA25pbAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFEmtleVVzZXJDbGFpbVN0YXR1cwYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRRrZXlVc2VyQ2xhaW1lZFRva2VucwUUdHJhbnNmZXJUb2tlbnNBbW91bnQFA25pbAUOdHJhbnNmZXJUb2tlbnMFEHRyYW5zZmVyQnV5QXNzZXQDCQAAAgkAkQMCBQ1jbGFpbWVkUGFyYW1zAAACC2NsYWltUGVyaW9kBA1jbGFpbWVkVG9rZW5zCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFC2xhdW5jaHBhZElkBRRrZXlVc2VyQ2xhaW1lZFRva2VucwAABAx1bmxvY2tQZXJpb2QJAQV2YWx1ZQEJALYJAQkAkQMCBQ1jbGFpbWVkUGFyYW1zAAIEC2Jsb2NrSGVpZ2h0CQBkAgkBBXZhbHVlAQkAtgkBCQCRAwIFDWNsYWltZWRQYXJhbXMAAwUOZmluYWxpemVIZWlnaHQEDHVubG9ja0hlaWdodAkAZAIFDHVubG9ja1BlcmlvZAULYmxvY2tIZWlnaHQEEmFsbG93ZWRTdGFydEFtb3VudAkAawMFFHRyYW5zZmVyVG9rZW5zQW1vdW50CQEFdmFsdWUBCQC2CQEJAJEDAgUNY2xhaW1lZFBhcmFtcwABAGQEE2FsbG93ZWRUb2tlbnNBbW91bnQJAGQCBRJhbGxvd2VkU3RhcnRBbW91bnQDCQBmAgUGaGVpZ2h0BQtibG9ja0hlaWdodAkAZQIJAGsDCQBlAgUUdHJhbnNmZXJUb2tlbnNBbW91bnQFEmFsbG93ZWRTdGFydEFtb3VudAkAZQIJAJcDAQkAzAgCBQZoZWlnaHQJAMwIAgUMdW5sb2NrSGVpZ2h0BQNuaWwFC2Jsb2NrSGVpZ2h0BQx1bmxvY2tQZXJpb2QFDWNsYWltZWRUb2tlbnMJAGUCAAAFDWNsYWltZWRUb2tlbnMEEGNsYWltU3RhdHVzRW50cnkDCQBnAgUUdHJhbnNmZXJUb2tlbnNBbW91bnQJAGQCBQ1jbGFpbWVkVG9rZW5zBRNhbGxvd2VkVG9rZW5zQW1vdW50CQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckNsYWltU3RhdHVzBgUDbmlsBQNuaWwDAwkAZgIFE2FsbG93ZWRUb2tlbnNBbW91bnQAAAYJAGYCBRZyZXR1cm5lZEJ1eUFzc2V0QW1vdW50AAAEDnRyYW5zZmVyVG9rZW5zAwkAZgIFE2FsbG93ZWRUb2tlbnNBbW91bnQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQULbGF1bmNocGFkSWQFFGtleVVzZXJDbGFpbWVkVG9rZW5zCQBkAgUNY2xhaW1lZFRva2VucwUTYWxsb3dlZFRva2Vuc0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFE2FsbG93ZWRUb2tlbnNBbW91bnQFB3Rva2VuSWQFA25pbAUDbmlsCQDOCAIFEHRyYW5zZmVyQnV5QXNzZXQFDnRyYW5zZmVyVG9rZW5zCQACAQIQTm90aGluZyB0byBjbGFpbQkAAgECFlVua25vd24gY2xhaW0gZnVuY3Rpb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQY2xhaW1GcmVlemVUb2tlbgELbGF1bmNocGFkSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEFWZyZWV6ZUFkZGl0aW9uYWxUb2tlbgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFGGtleUZyZWV6ZUFkZGl0aW9uYWxUb2tlbgcDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAURa2V5RmluYWxpc2VIZWlnaHQJAAIBAjFZb3UgY2FuJ3QgY2xhaW0gYmVjYXVzZSByZXN1bHRzIGFyZSBub3QgZmluYWxpemVkAwkBASEBBRVmcmVlemVBZGRpdGlvbmFsVG9rZW4JAAIBAjlUaGVyZSBhcmUgbm8gYWRkaXRpb25hbCB0b2tlbiBmcmVlemluZyBmb3IgdGhpcyBsYXVuY2hwYWQEB3Rva2VuSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRBrZXlGcmVlemVUb2tlbklkBBF1c2VyVG9rZW5zRnJlZXplZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckZyZWV6ZVRva2VuAAAEC3N0YXJ0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUOa2V5U3RhcnRIZWlnaHQAAAQIZHVyYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBQtrZXlEdXJhdGlvbgAABBNmcmVlemVUb2tlbkR1cmF0aW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFFmtleUZyZWV6ZVRva2VuRHVyYXRpb24EDmJsb2NrRW5kSGVpZ2h0CQBkAgkAZAIFC3N0YXJ0SGVpZ2h0BQhkdXJhdGlvbgUTZnJlZXplVG9rZW5EdXJhdGlvbgMJAAACBRF1c2VyVG9rZW5zRnJlZXplZAAACQACAQI4WW91IGFyZSBhbHJlYWR5IGNsYWltZWQgeW91ciB0b2tlbnMgb3Igbm90IHBhaWQgYW55dGhpbmcDCQBmAgUOYmxvY2tFbmRIZWlnaHQFBmhlaWdodAkAAgEJAKwCAgIZWW91ciB0b2tlbnMgZnJlZXplZCB0ZWVsIAkApAMBBQ5ibG9ja0VuZEhlaWdodAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEXVzZXJUb2tlbnNGcmVlemVkBQd0b2tlbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQtsYXVuY2hwYWRJZAUSa2V5VXNlckZyZWV6ZVRva2VuAAAFA25pbAFpARB0cmFuc2ZlckJ1eUFzc2V0AgtsYXVuY2hwYWRJZAZhbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkEDnByb2plY3RBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFCmtleUFkZHJlc3MEDSR0MDMyOTc2MzMxMjYJARZnZXRBc3NldEluZm9Gcm9tU3RyaW5nAQkBBXZhbHVlAQkAnQgCBQR0aGlzCQCsAgIJAKQDAQULbGF1bmNocGFkSWQFC2tleUJ1eVRva2VuBApidXlBc3NldElkCAUNJHQwMzI5NzYzMzEyNgJfMQQNYnV5QXNzZXRTdHJJZAgFDSR0MDMyOTc2MzMxMjYCXzIEDGJ1eUFzc2V0TmFtZQgFDSR0MDMyOTc2MzMxMjYCXzMEEGJ1eUFzc2V0RGVjaW1hbHMIBQ0kdDAzMjk3NjMzMTI2Al80BBJ0cmFuc2ZlcmVkQnV5QXNzZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFC2xhdW5jaHBhZElkBRNrZXlUcmFuc2ZlckJ1eUFzc2V0AAAEA2ludgMDCQBmAgUGYW1vdW50AAAJAAACBQpidXlBc3NldElkBQRVU0ROBwkA/AcEBRJzdGFraW5nVVNETkFkZHJlc3MCDnVubG9ja05ldXRyaW5vCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFBFVTRE4FA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQtsYXVuY2hwYWRJZAUTa2V5VHJhbnNmZXJCdXlBc3NldAkAZAIFEnRyYW5zZmVyZWRCdXlBc3NldAUGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDnByb2plY3RBZGRyZXNzBQZhbW91bnQFCmJ1eUFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEFBmFjdGl2ZQkAAgECFURBcHAgYWxyZWFkeSBpbmFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBwUDbmlsAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMFBmFjdGl2ZQkAAgECE0RBcHAgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCWtleUFjdGl2ZQYFA25pbADtRa9s", "height": 2704780, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6qY1pd8wZLXtPN88Eh7fykUDgWK8g4YUjcB9VhAMoju5 Next: 5Unuj6SH4L7t9EfURPMuZpSKjFF42oHnwvHsHJaE7jfk Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
5+
6+let kActiveGlob = "active_all_contracts"
57
68 let keyAdminPubKey1 = "admin_pub_1"
79
111113
112114 let keyUserFreezeToken = "_freeze_token_amount"
113115
114-let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
116+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
115117
116-let governance = Address(base58'3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs')
118+let governance = Address(base58'3PLHVWCqA9DJPDbadUofTohnCULLauiDWhS')
117119
118-let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
120+let commissionWallet = Address(base58'3PGYafJ2GuqPckmZNywet8moiPnBHz51Xdg')
119121
120-let stakingUSDNAddress = Address(base58'3MvKopk5a1HPTCPgzMixcSanqJ9jskZzjfu')
122+let stakingUSDNAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
121123
122124 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
123125
124-let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
126+let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
125127
126128 let maxAllocationsAmount = 2
127129
161163
162164 let active = valueOrElse(getBoolean(this, keyActive), true)
163165
164-func isActive () = if (active)
166+let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
167+
168+func isActive () = if (if (active)
169+ then activeGlob
170+ else false)
165171 then unit
166172 else throw("DApp is inactive at this moment")
167173
205211 else {
206212 let launchpadId = getLaunchpadNextId()
207213 let launchpadIdStr = toString(launchpadId)
208- let $t063786453 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
209- let pmtAmount = $t063786453._1
210- let pmtAssetId = $t063786453._2
211- let $t064626535 = getAssetInfo(pmtAssetId)
212- let pmtStrAssetId = $t064626535._1
213- let pmtAssetName = $t064626535._2
214- let pmtDecimals = $t064626535._3
214+ let $t065006575 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
215+ let pmtAmount = $t065006575._1
216+ let pmtAssetId = $t065006575._2
217+ let $t065846657 = getAssetInfo(pmtAssetId)
218+ let pmtStrAssetId = $t065846657._1
219+ let pmtAssetName = $t065846657._2
220+ let pmtDecimals = $t065846657._3
215221 let freezeAdditionalEntry = if (freezeAdditionalToken)
216222 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
217223 else nil
222228
223229 @Callable(i)
224230 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
225- let $t091419216 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
226- let pmtAmount = $t091419216._1
227- let pmtAssetId = $t091419216._2
228- let $t092219371 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
229- let buyAssetId = $t092219371._1
230- let buyAssetStrId = $t092219371._2
231- let buyAssetName = $t092219371._3
232- let buyAssetDecimals = $t092219371._4
231+ let $t092639338 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
232+ let pmtAmount = $t092639338._1
233+ let pmtAssetId = $t092639338._2
234+ let $t093439493 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
235+ let buyAssetId = $t093439493._1
236+ let buyAssetStrId = $t093439493._2
237+ let buyAssetName = $t093439493._3
238+ let buyAssetDecimals = $t093439493._4
233239 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
234240 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
235241 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
265271 else {
266272 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
267273 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
268- let $t01118311327 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
269- let tokenId = $t01118311327._1
270- let tokenStrAssetId = $t01118311327._2
271- let tokenAssetName = $t01118311327._3
272- let tokenDecimals = $t01118311327._4
274+ let $t01130511449 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
275+ let tokenId = $t01130511449._1
276+ let tokenStrAssetId = $t01130511449._2
277+ let tokenAssetName = $t01130511449._3
278+ let tokenDecimals = $t01130511449._4
273279 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
274280 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
275281 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
285291 then {
286292 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
287293 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
288- let $t01249112578 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
289- let pmtAmountFreeze = $t01249112578._1
290- let pmtAssetIdFreeze = $t01249112578._2
291- let $t01259512686 = getAssetInfo(pmtAssetId)
292- let pmtFreezeStrAssetId = $t01259512686._1
293- let pmtFreezeAssetName = $t01259512686._2
294- let pmtFreezeDecimals = $t01259512686._3
294+ let $t01261312700 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
295+ let pmtAmountFreeze = $t01261312700._1
296+ let pmtAssetIdFreeze = $t01261312700._2
297+ let $t01271712808 = getAssetInfo(pmtAssetId)
298+ let pmtFreezeStrAssetId = $t01271712808._1
299+ let pmtFreezeAssetName = $t01271712808._2
300+ let pmtFreezeDecimals = $t01271712808._3
295301 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
296302 if (if ((pmtFreezeStrAssetId != freezeTokenId))
297303 then true
325331
326332 @Callable(i)
327333 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
328- let $t01475714832 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
329- let pmtAmount = $t01475714832._1
330- let pmtAssetId = $t01475714832._2
331- let $t01483714987 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
332- let buyAssetId = $t01483714987._1
333- let buyAssetStrId = $t01483714987._2
334- let buyAssetName = $t01483714987._3
335- let buyAssetDecimals = $t01483714987._4
334+ let $t01487914954 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
335+ let pmtAmount = $t01487914954._1
336+ let pmtAssetId = $t01487914954._2
337+ let $t01495915109 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
338+ let buyAssetId = $t01495915109._1
339+ let buyAssetStrId = $t01495915109._2
340+ let buyAssetName = $t01495915109._3
341+ let buyAssetDecimals = $t01495915109._4
336342 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
337343 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
338344 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
339345 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
340346 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
341347 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
342- let $t01565615800 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
343- let tokenId = $t01565615800._1
344- let tokenStrAssetId = $t01565615800._2
345- let tokenAssetName = $t01565615800._3
346- let tokenDecimals = $t01565615800._4
348+ let $t01577815922 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
349+ let tokenId = $t01577815922._1
350+ let tokenStrAssetId = $t01577815922._2
351+ let tokenAssetName = $t01577815922._3
352+ let tokenDecimals = $t01577815922._4
347353 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
348354 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
349355 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
383389
384390 @Callable(i)
385391 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
386- let $t01805818133 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
387- let pmtAmount = $t01805818133._1
388- let pmtAssetId = $t01805818133._2
389- let $t01813818288 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
390- let buyAssetId = $t01813818288._1
391- let buyAssetStrId = $t01813818288._2
392- let buyAssetName = $t01813818288._3
393- let buyAssetDecimals = $t01813818288._4
392+ let $t01818018255 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
393+ let pmtAmount = $t01818018255._1
394+ let pmtAssetId = $t01818018255._2
395+ let $t01826018410 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
396+ let buyAssetId = $t01826018410._1
397+ let buyAssetStrId = $t01826018410._2
398+ let buyAssetName = $t01826018410._3
399+ let buyAssetDecimals = $t01826018410._4
394400 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
395401 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
396402 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
410416 else {
411417 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412418 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413- let $t01946119605 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414- let tokenId = $t01946119605._1
415- let tokenStrAssetId = $t01946119605._2
416- let tokenAssetName = $t01946119605._3
417- let tokenDecimals = $t01946119605._4
419+ let $t01958319727 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
420+ let tokenId = $t01958319727._1
421+ let tokenStrAssetId = $t01958319727._2
422+ let tokenAssetName = $t01958319727._3
423+ let tokenDecimals = $t01958319727._4
418424 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419425 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420426 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
455461 if ((calcHash != savedHash))
456462 then throw("vrf Height hash not matching")
457463 else {
458- let $t02221822368 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
459- let buyAssetId = $t02221822368._1
460- let buyAssetStrId = $t02221822368._2
461- let buyAssetName = $t02221822368._3
462- let buyAssetDecimals = $t02221822368._4
464+ let $t02234022490 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
465+ let buyAssetId = $t02234022490._1
466+ let buyAssetStrId = $t02234022490._2
467+ let buyAssetName = $t02234022490._3
468+ let buyAssetDecimals = $t02234022490._4
463469 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
464470 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
465471 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
504510 else false)
505511 then throw("You can't claim because you don't buy anything")
506512 else {
507- let $t02545225629 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
508- let buyAssetId = $t02545225629._1
509- let buyAssetStrId = $t02545225629._2
510- let buyAssetName = $t02545225629._3
511- let buyAssetDecimals = $t02545225629._4
513+ let $t02557425751 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
514+ let buyAssetId = $t02557425751._1
515+ let buyAssetStrId = $t02557425751._2
516+ let buyAssetName = $t02557425751._3
517+ let buyAssetDecimals = $t02557425751._4
512518 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
513519 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
514520 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
517523 let allowedAllocations = min([boughtAllocations, awailableAllocations])
518524 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
519525 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
520- let $t02654526689 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521- let tokenId = $t02654526689._1
522- let tokenStrAssetId = $t02654526689._2
523- let tokenAssetName = $t02654526689._3
524- let tokenDecimals = $t02654526689._4
526+ let $t02666726811 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527+ let tokenId = $t02666726811._1
528+ let tokenStrAssetId = $t02666726811._2
529+ let tokenAssetName = $t02666726811._3
530+ let tokenDecimals = $t02666726811._4
525531 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
526532 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
527533 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
616622 @Callable(i)
617623 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
618624 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
619- let $t03285433004 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
620- let buyAssetId = $t03285433004._1
621- let buyAssetStrId = $t03285433004._2
622- let buyAssetName = $t03285433004._3
623- let buyAssetDecimals = $t03285433004._4
625+ let $t03297633126 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
626+ let buyAssetId = $t03297633126._1
627+ let buyAssetStrId = $t03297633126._2
628+ let buyAssetName = $t03297633126._3
629+ let buyAssetDecimals = $t03297633126._4
624630 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
625631 let inv = if (if ((amount > 0))
626632 then (buyAssetId == USDN)
647653 else [BooleanEntry(keyActive, true)])
648654
649655
650-@Verifier(tx)
651-func verify () = {
652- let multiSignedByAdmins = {
653- let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
654- then 1
655- else 0
656- let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
657- then 1
658- else 0
659- let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
660- then 1
661- else 0
662- (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
663- }
664- let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
665- then true
666- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
667- then true
668- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
669- then true
670- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
671- match tx {
672- case dtx: DataTransaction =>
673- if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
674- then signedByAdmin
675- else false
676- case _ =>
677- multiSignedByAdmins
678- }
679- }
680-
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let keyActive = "active"
5+
6+let kActiveGlob = "active_all_contracts"
57
68 let keyAdminPubKey1 = "admin_pub_1"
79
810 let keyAdminPubKey2 = "admin_pub_2"
911
1012 let keyAdminPubKey3 = "admin_pub_3"
1113
1214 let keyLaunchpadDataTransactionStatus = "launchpad_data_transaction_status"
1315
1416 let keyLaunchpadNextId = "launchpad_next_id"
1517
1618 let keyLaunchpadActiveId = "launchpad_active_id"
1719
1820 let keyInitCaller = "init_caller"
1921
2022 let keyAddress = "_address"
2123
2224 let keyInitHeight = "_init_height"
2325
2426 let keyStartHeight = "_start_height"
2527
2628 let keyFinaliseHeight = "_finalise_height"
2729
2830 let keyComission = "_comission"
2931
3032 let keyAssetId = "_asset_id"
3133
3234 let keyTotalTokenAmount = "_total_token_amount"
3335
3436 let keyTotalAmountBuyAssetSold = "_total_buy_asset_sold"
3537
3638 let keyTokensPerTicket = "_tokens_per_ticket"
3739
3840 let keyPricePerToken = "_price_per_token"
3941
4042 let keySwopPerTicket = "_swop_per_ticket"
4143
4244 let keySwopfiTicketsAmount = "_tickets_swopfi_members"
4345
4446 let keyCampaignTokensAmount = "_tokens_access_list"
4547
4648 let keyTokensPerAllocation = "_tokens_per_allocation"
4749
4850 let keyTicketLastNumber = "_ticket_last_number"
4951
5052 let keyGovernanceStaked = "_GSwop_amount"
5153
5254 let keyUserRefId = "_ref_id"
5355
5456 let keyVerifyHash = "_verify_hash"
5557
5658 let keyDuration = "_duration"
5759
5860 let keyAmountBuyAssetInMarketing = "_total_purchased_buy_asset_in_marketing"
5961
6062 let keyAmountBuyAssetInMarketingFinalized = "_total_purchased_buy_asset_in_marketing_finalized"
6163
6264 let keyTransferBuyAsset = "_transfer_buy_asset"
6365
6466 let keyFreezSwopDuration = "_freeze_swop_duration"
6567
6668 let keyFreezeAdditionalToken = "_freeze_additional_token"
6769
6870 let keyFreezeTokenId = "_freeze_token_id"
6971
7072 let keyFreezeTokenDuration = "_freeze_token_duration"
7173
7274 let keyFreezeTokenPerTicket = "_freeze_token_per_ticket"
7375
7476 let keyBuyToken = "_buy_token"
7577
7678 let keyClaimParams = "_claim_params"
7779
7880 let keyHighCompetitionComission = "_high_competition_comission"
7981
8082 let keyHighCompetitionSale = "_high_competition_sale"
8183
8284 let keyHCTicketLastNumber = "_high_competition_ticket_last_number"
8385
8486 let keyHighCompetitionAmount = "_tickets_high_competition"
8587
8688 let keyTotalAmountBuyAssetSoldHC = "_total_buy_asset_sold_high_competition"
8789
8890 let keyUserClaimedTokens = "_claimed_tokens"
8991
9092 let keyUserClaimedBuyTokens = "_claimed_buy_tokens"
9193
9294 let keyUserBoughtTicketsAmount = "_bought_tickets"
9395
9496 let keyUserTickets = "_tickets_number"
9597
9698 let keyUserHCTickets = "_tickets_number_high_competition"
9799
98100 let keyUserHCBoughtTicketsAmount = "_bought_tickets_high_competition"
99101
100102 let keyUserAvailableAllocations = "_available_purchase_marketing"
101103
102104 let keyUserAmountBuyAssetInMarketing = "_purchased_buy_asset_in_marketing"
103105
104106 let keyUserBoughtAllocations = "_bought_allocations"
105107
106108 let keyUserClaimStatus = "_claim_status"
107109
108110 let keyUserWinnedTicketsAmount = "_tickets_result"
109111
110112 let keyUserWinnedHighCompetitionTicketsAmount = "_tickets_result_high_competition"
111113
112114 let keyUserFreezeToken = "_freeze_token_amount"
113115
114-let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
116+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
115117
116-let governance = Address(base58'3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs')
118+let governance = Address(base58'3PLHVWCqA9DJPDbadUofTohnCULLauiDWhS')
117119
118-let commissionWallet = Address(base58'3N2hBdeDEs7wCNA9EY8qv3B6drjgKD64xQG')
120+let commissionWallet = Address(base58'3PGYafJ2GuqPckmZNywet8moiPnBHz51Xdg')
119121
120-let stakingUSDNAddress = Address(base58'3MvKopk5a1HPTCPgzMixcSanqJ9jskZzjfu')
122+let stakingUSDNAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
121123
122124 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
123125
124-let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
126+let adminPubKeyStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
125127
126128 let maxAllocationsAmount = 2
127129
128130 let activeLaunchpadId = valueOrElse(getIntegerValue(this, keyLaunchpadActiveId), -1)
129131
130132 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
131133 case string: String =>
132134 fromBase58String(string)
133135 case nothing =>
134136 throw("Admin public key is empty")
135137 }
136138
137139
138140 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
139141
140142 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
141143
142144 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
143145
144146 func getAssetInfo (assetId) = match assetId {
145147 case id: ByteVector =>
146148 let stringId = toBase58String(id)
147149 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
148150 $Tuple3(stringId, info.name, info.decimals)
149151 case waves: Unit =>
150152 $Tuple3("WAVES", "WAVES", 8)
151153 case _ =>
152154 throw("Match error")
153155 }
154156
155157
156158 func getLaunchpadNextId () = valueOrElse(getInteger(this, keyLaunchpadNextId), 1)
157159
158160
159161 func stakedUsdnAmount () = valueOrElse(getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))), 0)
160162
161163
162164 let active = valueOrElse(getBoolean(this, keyActive), true)
163165
164-func isActive () = if (active)
166+let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
167+
168+func isActive () = if (if (active)
169+ then activeGlob
170+ else false)
165171 then unit
166172 else throw("DApp is inactive at this moment")
167173
168174
169175 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
170176 then unit
171177 else throw("Only admin can call this function")
172178
173179
174180 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
175181 then $Tuple4(unit, "WAVES", "WAVES", 8)
176182 else {
177183 let stringId = assetStr
178184 let id = fromBase58String(assetStr)
179185 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
180186 $Tuple4(id, stringId, info.name, info.decimals)
181187 }
182188
183189
184190 @Callable(i)
185191 func hashingRandom (launchpadId,hash) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry((toString(launchpadId) + keyVerifyHash), hash)]))
186192
187193
188194
189195 @Callable(i)
190196 func initCaller (address) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [StringEntry(keyInitCaller, address)]))
191197
192198
193199
194200 @Callable(i)
195201 func init (projectAddress,startHeight,duration,buyToken,commission,tokensPerTicket,pricePerToken,swopfiTicketsAmount,campaignTokensAmount,tokensPerAllocation,swopPerTicket,swopFreezeDuration,claimParams,HighCompetitionSale,highCompetitionComission,highCompetitionTicketsAmount,freezeAdditionalToken,freezeParams) = valueOrElse(isActive(), if ((toString(i.caller) != valueOrElse(getString(this, keyInitCaller), "")))
196202 then throw("Only project admin can call init function")
197203 else if ((size(i.payments) != 1))
198204 then throw("One attached payment expected")
199205 else if ((height > startHeight))
200206 then throw("Start height must be greater than blockchain height")
201207 else if (if (freezeAdditionalToken)
202208 then (size(freezeParams) != 3)
203209 else false)
204210 then throw("Freeze params list must have 3 items")
205211 else {
206212 let launchpadId = getLaunchpadNextId()
207213 let launchpadIdStr = toString(launchpadId)
208- let $t063786453 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
209- let pmtAmount = $t063786453._1
210- let pmtAssetId = $t063786453._2
211- let $t064626535 = getAssetInfo(pmtAssetId)
212- let pmtStrAssetId = $t064626535._1
213- let pmtAssetName = $t064626535._2
214- let pmtDecimals = $t064626535._3
214+ let $t065006575 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
215+ let pmtAmount = $t065006575._1
216+ let pmtAssetId = $t065006575._2
217+ let $t065846657 = getAssetInfo(pmtAssetId)
218+ let pmtStrAssetId = $t065846657._1
219+ let pmtAssetName = $t065846657._2
220+ let pmtDecimals = $t065846657._3
215221 let freezeAdditionalEntry = if (freezeAdditionalToken)
216222 then [BooleanEntry((launchpadIdStr + keyFreezeAdditionalToken), true), StringEntry((launchpadIdStr + keyFreezeTokenId), freezeParams[0]), IntegerEntry((launchpadIdStr + keyFreezeTokenDuration), parseIntValue(freezeParams[1])), IntegerEntry((launchpadIdStr + keyFreezeTokenPerTicket), parseIntValue(freezeParams[2]))]
217223 else nil
218224 ([IntegerEntry((pmtStrAssetId + "_launchpad"), launchpadId), IntegerEntry(keyLaunchpadNextId, (launchpadId + 1)), StringEntry((launchpadIdStr + keyAddress), projectAddress), IntegerEntry((launchpadIdStr + keyInitHeight), height), IntegerEntry((launchpadIdStr + keyStartHeight), startHeight), IntegerEntry((launchpadIdStr + keyDuration), duration), StringEntry((launchpadIdStr + keyBuyToken), buyToken), IntegerEntry((launchpadIdStr + keyFreezSwopDuration), swopFreezeDuration), IntegerEntry((launchpadIdStr + keyTotalTokenAmount), pmtAmount), StringEntry((launchpadIdStr + keyAssetId), pmtStrAssetId), IntegerEntry((launchpadIdStr + keyComission), commission), IntegerEntry((launchpadIdStr + keyTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyHCTicketLastNumber), 0), IntegerEntry((launchpadIdStr + keyTokensPerTicket), tokensPerTicket), IntegerEntry((launchpadIdStr + keyPricePerToken), pricePerToken), IntegerEntry((launchpadIdStr + keySwopPerTicket), swopPerTicket), IntegerEntry((launchpadIdStr + keySwopfiTicketsAmount), swopfiTicketsAmount), IntegerEntry((launchpadIdStr + keyCampaignTokensAmount), campaignTokensAmount), IntegerEntry((launchpadIdStr + keyTokensPerAllocation), tokensPerAllocation), StringEntry((launchpadIdStr + keyClaimParams), makeString(claimParams, ",")), BooleanEntry((launchpadIdStr + keyHighCompetitionSale), HighCompetitionSale), IntegerEntry((launchpadIdStr + keyHighCompetitionComission), highCompetitionComission), IntegerEntry((launchpadIdStr + keyHighCompetitionAmount), highCompetitionTicketsAmount), IntegerEntry(keyLaunchpadActiveId, launchpadId), StringEntry(keyInitCaller, "")] ++ freezeAdditionalEntry)
219225 })
220226
221227
222228
223229 @Callable(i)
224230 func commitSwopfiSale (launchpadId,refId) = valueOrElse(isActive(), {
225- let $t091419216 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
226- let pmtAmount = $t091419216._1
227- let pmtAssetId = $t091419216._2
228- let $t092219371 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
229- let buyAssetId = $t092219371._1
230- let buyAssetStrId = $t092219371._2
231- let buyAssetName = $t092219371._3
232- let buyAssetDecimals = $t092219371._4
231+ let $t092639338 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
232+ let pmtAmount = $t092639338._1
233+ let pmtAssetId = $t092639338._2
234+ let $t093439493 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
235+ let buyAssetId = $t093439493._1
236+ let buyAssetStrId = $t093439493._2
237+ let buyAssetName = $t093439493._3
238+ let buyAssetDecimals = $t093439493._4
233239 let stakedSwops = valueOrElse(getInteger(governance, (toString(i.caller) + keyGovernanceStaked)), 0)
234240 let allowedTicketsAmountAll = (stakedSwops / getIntegerValue(this, (toString(launchpadId) + keySwopPerTicket)))
235241 let boughtTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
236242 let allowedTicketsAmount = (allowedTicketsAmountAll - boughtTicketsAmount)
237243 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
238244 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
239245 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
240246 if ((activeLaunchpadId != launchpadId))
241247 then throw("There is no active launchpad or this launchpad is ended")
242248 else if ((startHeight > height))
243249 then throw("Launchpad sale not started yet")
244250 else if ((height > (startHeight + duration)))
245251 then throw("Launchpad sale ended")
246252 else if (if (!(freezeAdditionalToken))
247253 then if ((size(i.payments) != 1))
248254 then true
249255 else (pmtAssetId != buyAssetId)
250256 else false)
251257 then throw((("One attached payment in " + buyAssetName) + " expected"))
252258 else if (if (freezeAdditionalToken)
253259 then if ((size(i.payments) != 2))
254260 then true
255261 else (pmtAssetId != buyAssetId)
256262 else false)
257263 then {
258264 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
259265 throw(((("Two attached payments expected: First in " + buyAssetName) + ", second in ") + freezeTokenId))
260266 }
261267 else if (if ((0 >= allowedTicketsAmountAll))
262268 then true
263269 else (0 >= allowedTicketsAmount))
264270 then throw("Not enought SWOP in staking to buy tickets")
265271 else {
266272 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
267273 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
268- let $t01118311327 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
269- let tokenId = $t01118311327._1
270- let tokenStrAssetId = $t01118311327._2
271- let tokenAssetName = $t01118311327._3
272- let tokenDecimals = $t01118311327._4
274+ let $t01130511449 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
275+ let tokenId = $t01130511449._1
276+ let tokenStrAssetId = $t01130511449._2
277+ let tokenAssetName = $t01130511449._3
278+ let tokenDecimals = $t01130511449._4
273279 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
274280 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyComission)), 100)
275281 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
276282 let allowedBuyTicketAmount = min([buyTicketAmount, allowedTicketsAmount])
277283 let allowedBuyPriceWithComission = (allowedBuyTicketAmount * (ticketPrice + commissionPerTicket))
278284 let change = (pmtAmount - allowedBuyPriceWithComission)
279285 if ((buyTicketAmount == 0))
280286 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
281287 else if ((change != 0))
282288 then throw((((("Wrong payment. To buy " + toString(allowedBuyTicketAmount)) + "tickets you need to pay ") + toString(allowedBuyPriceWithComission)) + buyAssetName))
283289 else {
284290 let freezeAdditionalEntry = if (freezeAdditionalToken)
285291 then {
286292 let freezeTokenId = getStringValue(this, (toString(launchpadId) + keyFreezeTokenId))
287293 let freezeTokenPerTicket = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenPerTicket))
288- let $t01249112578 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
289- let pmtAmountFreeze = $t01249112578._1
290- let pmtAssetIdFreeze = $t01249112578._2
291- let $t01259512686 = getAssetInfo(pmtAssetId)
292- let pmtFreezeStrAssetId = $t01259512686._1
293- let pmtFreezeAssetName = $t01259512686._2
294- let pmtFreezeDecimals = $t01259512686._3
294+ let $t01261312700 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
295+ let pmtAmountFreeze = $t01261312700._1
296+ let pmtAssetIdFreeze = $t01261312700._2
297+ let $t01271712808 = getAssetInfo(pmtAssetId)
298+ let pmtFreezeStrAssetId = $t01271712808._1
299+ let pmtFreezeAssetName = $t01271712808._2
300+ let pmtFreezeDecimals = $t01271712808._3
295301 let needFreezeTokens = (freezeTokenPerTicket * buyTicketAmount)
296302 if (if ((pmtFreezeStrAssetId != freezeTokenId))
297303 then true
298304 else (needFreezeTokens != pmtAmountFreeze))
299305 then throw((((("You need to add " + toString(needFreezeTokens)) + " ") + pmtFreezeAssetName) + " as a second payment"))
300306 else [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), pmtAmountFreeze)]
301307 }
302308 else nil
303309 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets)), "")
304310 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyTicketLastNumber))
305311 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + allowedBuyTicketAmount)))
306312 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
307313 then ("," + boughtRange)
308314 else ("" + boughtRange)))
309315 let inv = if ((buyAssetId == USDN))
310316 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
311317 else 0
312318 if ((inv == inv))
313319 then {
314320 let baseEntry = ([IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount), (boughtTicketsAmount + allowedBuyTicketAmount)), IntegerEntry((toString(launchpadId) + keyTicketLastNumber), (lastBoughtTicketNumber + allowedBuyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserTickets), newUserBoughtTicketsNumbers)] ++ freezeAdditionalEntry)
315321 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
316322 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
317323 else baseEntry
318324 }
319325 else throw("Strict value is not equal to itself.")
320326 }
321327 }
322328 })
323329
324330
325331
326332 @Callable(i)
327333 func commitAccessListSale (launchpadId,refId) = valueOrElse(isActive(), {
328- let $t01475714832 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
329- let pmtAmount = $t01475714832._1
330- let pmtAssetId = $t01475714832._2
331- let $t01483714987 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
332- let buyAssetId = $t01483714987._1
333- let buyAssetStrId = $t01483714987._2
334- let buyAssetName = $t01483714987._3
335- let buyAssetDecimals = $t01483714987._4
334+ let $t01487914954 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
335+ let pmtAmount = $t01487914954._1
336+ let pmtAssetId = $t01487914954._2
337+ let $t01495915109 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
338+ let buyAssetId = $t01495915109._1
339+ let buyAssetStrId = $t01495915109._2
340+ let buyAssetName = $t01495915109._3
341+ let buyAssetDecimals = $t01495915109._4
336342 let userUsdnInMarketing = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing)), 0)
337343 let usdnInMarketing = valueOrElse(getInteger(this, (toString(launchpadId) + keyAmountBuyAssetInMarketing)), 0)
338344 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
339345 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
340346 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
341347 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
342- let $t01565615800 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
343- let tokenId = $t01565615800._1
344- let tokenStrAssetId = $t01565615800._2
345- let tokenAssetName = $t01565615800._3
346- let tokenDecimals = $t01565615800._4
348+ let $t01577815922 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
349+ let tokenId = $t01577815922._1
350+ let tokenStrAssetId = $t01577815922._2
351+ let tokenAssetName = $t01577815922._3
352+ let tokenDecimals = $t01577815922._4
347353 let allocationPriceWithComission = fraction(fraction(tokenPrice, tokensPerAllocation, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
348354 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
349355 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
350356 if ((activeLaunchpadId != launchpadId))
351357 then throw("There is no active launchpad or this launchpad is ended")
352358 else if ((startHeight > height))
353359 then throw("Launchpad sale not started yet")
354360 else if ((height > (startHeight + duration)))
355361 then throw("Launchpad sale ended")
356362 else if (if ((size(i.payments) != 1))
357363 then true
358364 else (pmtAssetId != buyAssetId))
359365 then throw((("One attached payment in " + buyAssetName) + " expected"))
360366 else if ((boughtAllocations >= maxAllocationsAmount))
361367 then throw((("You can buy only " + toString(maxAllocationsAmount)) + "allocations"))
362368 else if (if ((allocationPriceWithComission != pmtAmount))
363369 then ((allocationPriceWithComission * 2) != pmtAmount)
364370 else false)
365371 then throw(((("Wrong payment. You can buy 1 or 2 allocations for " + toString(allocationPriceWithComission)) + buyAssetName) + " per allocation"))
366372 else {
367373 let buyAllocationsAmount = (pmtAmount / allocationPriceWithComission)
368374 let inv = if ((buyAssetId == USDN))
369375 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
370376 else 0
371377 if ((inv == inv))
372378 then {
373379 let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations), (boughtAllocations + buyAllocationsAmount)), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAmountBuyAssetInMarketing), (userUsdnInMarketing + pmtAmount)), IntegerEntry((toString(launchpadId) + keyAmountBuyAssetInMarketing), (usdnInMarketing + pmtAmount))]
374380 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
375381 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
376382 else baseEntry
377383 }
378384 else throw("Strict value is not equal to itself.")
379385 }
380386 })
381387
382388
383389
384390 @Callable(i)
385391 func commitHighCompetitionSale (launchpadId,refId) = valueOrElse(isActive(), {
386- let $t01805818133 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
387- let pmtAmount = $t01805818133._1
388- let pmtAssetId = $t01805818133._2
389- let $t01813818288 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
390- let buyAssetId = $t01813818288._1
391- let buyAssetStrId = $t01813818288._2
392- let buyAssetName = $t01813818288._3
393- let buyAssetDecimals = $t01813818288._4
392+ let $t01818018255 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
393+ let pmtAmount = $t01818018255._1
394+ let pmtAssetId = $t01818018255._2
395+ let $t01826018410 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
396+ let buyAssetId = $t01826018410._1
397+ let buyAssetStrId = $t01826018410._2
398+ let buyAssetName = $t01826018410._3
399+ let buyAssetDecimals = $t01826018410._4
394400 let startHeight = value(getInteger(this, (toString(launchpadId) + keyStartHeight)))
395401 let duration = value(getInteger(this, (toString(launchpadId) + keyDuration)))
396402 let boughtHCTicketsAmount = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
397403 let highCompetitionSale = valueOrElse(getBoolean(this, (toString(launchpadId) + keyHighCompetitionSale)), false)
398404 if ((activeLaunchpadId != launchpadId))
399405 then throw("There is no active launchpad or this launchpad is ended")
400406 else if (!(highCompetitionSale))
401407 then throw("There is no high competition sale for this launchpad")
402408 else if ((startHeight > height))
403409 then throw("Launchpad sale not started yet")
404410 else if ((height > (startHeight + duration)))
405411 then throw("Launchpad sale ended")
406412 else if (if ((size(i.payments) != 1))
407413 then true
408414 else (pmtAssetId != buyAssetId))
409415 then throw((("One attached payment in " + buyAssetName) + " expected"))
410416 else {
411417 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
412418 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
413- let $t01946119605 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
414- let tokenId = $t01946119605._1
415- let tokenStrAssetId = $t01946119605._2
416- let tokenAssetName = $t01946119605._3
417- let tokenDecimals = $t01946119605._4
419+ let $t01958319727 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
420+ let tokenId = $t01958319727._1
421+ let tokenStrAssetId = $t01958319727._2
422+ let tokenAssetName = $t01958319727._3
423+ let tokenDecimals = $t01958319727._4
418424 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
419425 let commissionPerTicket = fraction(ticketPrice, getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission)), 100)
420426 let buyTicketAmount = (pmtAmount / (ticketPrice + commissionPerTicket))
421427 let buyPriceWithComission = (buyTicketAmount * (ticketPrice + commissionPerTicket))
422428 let change = (pmtAmount - buyPriceWithComission)
423429 if ((buyTicketAmount == 0))
424430 then throw((("Not enought " + buyAssetName) + " to buy tickets"))
425431 else if ((change != 0))
426432 then throw((((("Wrong payment. To buy " + toString(buyTicketAmount)) + "tickets you need to pay ") + toString(buyPriceWithComission)) + buyAssetName))
427433 else {
428434 let userBoughtTicketsNumbers = valueOrElse(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets)), "")
429435 let lastBoughtTicketNumber = getIntegerValue(this, (toString(launchpadId) + keyHCTicketLastNumber))
430436 let boughtRange = ((toString((lastBoughtTicketNumber + 1)) + "-") + toString((lastBoughtTicketNumber + buyTicketAmount)))
431437 let newUserBoughtTicketsNumbers = (userBoughtTicketsNumbers + (if ((userBoughtTicketsNumbers != ""))
432438 then ("," + boughtRange)
433439 else ("" + boughtRange)))
434440 let inv = if ((buyAssetId == USDN))
435441 then invoke(stakingUSDNAddress, "lockNeutrino", nil, [AttachedPayment(pmtAssetId, pmtAmount)])
436442 else 0
437443 if ((inv == inv))
438444 then {
439445 let baseEntry = [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount), (boughtHCTicketsAmount + buyTicketAmount)), IntegerEntry((toString(launchpadId) + keyHCTicketLastNumber), (lastBoughtTicketNumber + buyTicketAmount)), StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCTickets), newUserBoughtTicketsNumbers)]
440446 if (!(isDefined(getString(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId)))))
441447 then (baseEntry ++ [StringEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserRefId), refId)])
442448 else baseEntry
443449 }
444450 else throw("Strict value is not equal to itself.")
445451 }
446452 }
447453 })
448454
449455
450456
451457 @Callable(i)
452458 func finalise (launchpadId,vrfHeight,secretWord) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
453459 let savedHash = getStringValue(this, (toString(launchpadId) + keyVerifyHash))
454460 let calcHash = toBase58String(sha256((toBytes(vrfHeight) + toBytes(secretWord))))
455461 if ((calcHash != savedHash))
456462 then throw("vrf Height hash not matching")
457463 else {
458- let $t02221822368 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
459- let buyAssetId = $t02221822368._1
460- let buyAssetStrId = $t02221822368._2
461- let buyAssetName = $t02221822368._3
462- let buyAssetDecimals = $t02221822368._4
464+ let $t02234022490 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
465+ let buyAssetId = $t02234022490._1
466+ let buyAssetStrId = $t02234022490._2
467+ let buyAssetName = $t02234022490._3
468+ let buyAssetDecimals = $t02234022490._4
463469 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
464470 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
465471 let commissionHC = getIntegerValue(this, (toString(launchpadId) + keyHighCompetitionComission))
466472 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
467473 let swopfiMembersBuyAssetAmount = getIntegerValue(this, (toString(launchpadId) + keyTotalAmountBuyAssetSold))
468474 let swopfiHCBuyAssetAmount = valueOrElse(getInteger(this, (toString(launchpadId) + keyTotalAmountBuyAssetSoldHC)), 0)
469475 let swopfiMembersComission = fraction(swopfiMembersBuyAssetAmount, commission, 100)
470476 let swopfiHCComission = fraction(swopfiHCBuyAssetAmount, commissionHC, 100)
471477 let totalAmountBuyAssetInMarketing = getIntegerValue(this, (toString(launchpadId) + keyAmountBuyAssetInMarketingFinalized))
472478 let marketingComission = fraction(totalAmountBuyAssetInMarketing, commission, 100)
473479 let unstakeAmount = ((((((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiMembersComission) + marketingComission) + swopfiHCBuyAssetAmount) + swopfiHCComission) - transferedBuyAsset)
474480 if ((transferedBuyAsset > ((swopfiMembersBuyAssetAmount + totalAmountBuyAssetInMarketing) + swopfiHCBuyAssetAmount)))
475481 then throw("Can't transfer negative value to project")
476482 else {
477483 let inv = if ((buyAssetId == USDN))
478484 then invoke(stakingUSDNAddress, "unlockNeutrino", [unstakeAmount, toBase58String(USDN)], nil)
479485 else 0
480486 if ((inv == inv))
481487 then [IntegerEntry((toString(launchpadId) + keyFinaliseHeight), height), ScriptTransfer(projectAddress, (((swopfiMembersBuyAssetAmount + swopfiHCBuyAssetAmount) + totalAmountBuyAssetInMarketing) - transferedBuyAsset), buyAssetId), ScriptTransfer(commissionWallet, ((swopfiMembersComission + marketingComission) + swopfiHCComission), buyAssetId)]
482488 else throw("Strict value is not equal to itself.")
483489 }
484490 }
485491 }))
486492
487493
488494
489495 @Callable(i)
490496 func claim (launchpadId) = valueOrElse(isActive(), {
491497 let boughtTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtTicketsAmount)), 0)
492498 let boughtHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserHCBoughtTicketsAmount)), 0)
493499 let boughtAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserBoughtAllocations)), 0)
494500 let userClaimStatus = valueOrElse(getBoolean(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus)), false)
495501 let finalizeHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)), 0)
496502 if ((finalizeHeight == 0))
497503 then throw("You can't claim because results are not finalized")
498504 else if (userClaimStatus)
499505 then throw("You are already claimed")
500506 else if (if (if ((boughtTickets == 0))
501507 then (boughtAllocations == 0)
502508 else false)
503509 then (boughtHCTickets == 0)
504510 else false)
505511 then throw("You can't claim because you don't buy anything")
506512 else {
507- let $t02545225629 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
508- let buyAssetId = $t02545225629._1
509- let buyAssetStrId = $t02545225629._2
510- let buyAssetName = $t02545225629._3
511- let buyAssetDecimals = $t02545225629._4
513+ let $t02557425751 = getAssetInfoFromString(valueOrElse(getString(this, (toString(launchpadId) + keyBuyToken)), toBase58String(USDN)))
514+ let buyAssetId = $t02557425751._1
515+ let buyAssetStrId = $t02557425751._2
516+ let buyAssetName = $t02557425751._3
517+ let buyAssetDecimals = $t02557425751._4
512518 let wonnedTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedTicketsAmount)), 0)
513519 let wonnedHCTickets = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserWinnedHighCompetitionTicketsAmount)), 0)
514520 let awailableAllocations = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserAvailableAllocations)), 0)
515521 let commission = getIntegerValue(this, (toString(launchpadId) + keyComission))
516522 let commissionHC = valueOrElse(getInteger(this, (toString(launchpadId) + keyHighCompetitionComission)), 0)
517523 let allowedAllocations = min([boughtAllocations, awailableAllocations])
518524 let tokenPrice = getIntegerValue(this, (toString(launchpadId) + keyPricePerToken))
519525 let tokensPerTicket = getIntegerValue(this, (toString(launchpadId) + keyTokensPerTicket))
520- let $t02654526689 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
521- let tokenId = $t02654526689._1
522- let tokenStrAssetId = $t02654526689._2
523- let tokenAssetName = $t02654526689._3
524- let tokenDecimals = $t02654526689._4
526+ let $t02666726811 = getAssetInfoFromString(getStringValue(this, (toString(launchpadId) + keyAssetId)))
527+ let tokenId = $t02666726811._1
528+ let tokenStrAssetId = $t02666726811._2
529+ let tokenAssetName = $t02666726811._3
530+ let tokenDecimals = $t02666726811._4
525531 let ticketPrice = fraction(tokensPerTicket, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN))
526532 let tokensPerAllocation = getIntegerValue(this, (toString(launchpadId) + keyTokensPerAllocation))
527533 let transferTokensAmount = (((wonnedTickets * tokensPerTicket) + (allowedAllocations * tokensPerAllocation)) + (wonnedHCTickets * tokensPerTicket))
528534 let notAllowedAllocationsTokens = ((boughtAllocations - allowedAllocations) * tokensPerAllocation)
529535 let buyAssetForAllocations = fraction(fraction(notAllowedAllocationsTokens, tokenPrice, pow(10, 0, tokenDecimals, 0, 0, DOWN)), (100 + commission), 100)
530536 let buyAssetForUnwonnedTickets = fraction(((boughtTickets - wonnedTickets) * ticketPrice), (100 + commission), 100)
531537 let buyAssetForHCUnwonnedTickets = fraction(((boughtHCTickets - wonnedHCTickets) * ticketPrice), (100 + commissionHC), 100)
532538 let claimedBuyToken = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens)), 0)
533539 if (if (if ((0 > buyAssetForAllocations))
534540 then true
535541 else (0 > buyAssetForUnwonnedTickets))
536542 then true
537543 else (0 > buyAssetForHCUnwonnedTickets))
538544 then throw("Error with allowed allocation param or wonned tickets param please contact support")
539545 else {
540546 let returnedBuyAssetAmount = (((buyAssetForUnwonnedTickets + buyAssetForHCUnwonnedTickets) + buyAssetForAllocations) - claimedBuyToken)
541547 let transferBuyAsset = if ((returnedBuyAssetAmount > 0))
542548 then [ScriptTransfer(i.caller, returnedBuyAssetAmount, buyAssetId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedBuyTokens), returnedBuyAssetAmount)]
543549 else nil
544550 let inv = if (if ((returnedBuyAssetAmount > 0))
545551 then (buyAssetId == USDN)
546552 else false)
547553 then invoke(stakingUSDNAddress, "unlockNeutrino", [returnedBuyAssetAmount, toBase58String(USDN)], nil)
548554 else 0
549555 if ((inv == inv))
550556 then {
551557 let claimedParams = split(valueOrElse(getString(this, (toString(launchpadId) + keyClaimParams)), "claimAll"), ",")
552558 if ((claimedParams[0] == "claimAll"))
553559 then {
554560 let transferTokens = if ((transferTokensAmount > 0))
555561 then [ScriptTransfer(i.caller, transferTokensAmount, tokenId)]
556562 else nil
557563 (([BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), transferTokensAmount)] ++ transferTokens) ++ transferBuyAsset)
558564 }
559565 else if ((claimedParams[0] == "claimPeriod"))
560566 then {
561567 let claimedTokens = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens)), 0)
562568 let unlockPeriod = value(parseInt(claimedParams[2]))
563569 let blockHeight = (value(parseInt(claimedParams[3])) + finalizeHeight)
564570 let unlockHeight = (unlockPeriod + blockHeight)
565571 let allowedStartAmount = fraction(transferTokensAmount, value(parseInt(claimedParams[1])), 100)
566572 let allowedTokensAmount = (allowedStartAmount + (if ((height > blockHeight))
567573 then (fraction((transferTokensAmount - allowedStartAmount), (min([height, unlockHeight]) - blockHeight), unlockPeriod) - claimedTokens)
568574 else (0 - claimedTokens)))
569575 let claimStatusEntry = if ((transferTokensAmount >= (claimedTokens + allowedTokensAmount)))
570576 then [BooleanEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimStatus), true)]
571577 else nil
572578 if (if ((allowedTokensAmount > 0))
573579 then true
574580 else (returnedBuyAssetAmount > 0))
575581 then {
576582 let transferTokens = if ((allowedTokensAmount > 0))
577583 then [IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserClaimedTokens), (claimedTokens + allowedTokensAmount)), ScriptTransfer(i.caller, allowedTokensAmount, tokenId)]
578584 else nil
579585 (transferBuyAsset ++ transferTokens)
580586 }
581587 else throw("Nothing to claim")
582588 }
583589 else throw("Unknown claim function")
584590 }
585591 else throw("Strict value is not equal to itself.")
586592 }
587593 }
588594 })
589595
590596
591597
592598 @Callable(i)
593599 func claimFreezeToken (launchpadId) = valueOrElse(isActive(), {
594600 let freezeAdditionalToken = valueOrElse(getBoolean(this, (toString(launchpadId) + keyFreezeAdditionalToken)), false)
595601 if (!(isDefined(getInteger(this, (toString(launchpadId) + keyFinaliseHeight)))))
596602 then throw("You can't claim because results are not finalized")
597603 else if (!(freezeAdditionalToken))
598604 then throw("There are no additional token freezing for this launchpad")
599605 else {
600606 let tokenId = fromBase58String(getStringValue(this, (toString(launchpadId) + keyFreezeTokenId)))
601607 let userTokensFreezed = valueOrElse(getInteger(this, (((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken)), 0)
602608 let startHeight = valueOrElse(getInteger(this, (toString(launchpadId) + keyStartHeight)), 0)
603609 let duration = valueOrElse(getInteger(this, (toString(launchpadId) + keyDuration)), 0)
604610 let freezeTokenDuration = getIntegerValue(this, (toString(launchpadId) + keyFreezeTokenDuration))
605611 let blockEndHeight = ((startHeight + duration) + freezeTokenDuration)
606612 if ((userTokensFreezed == 0))
607613 then throw("You are already claimed your tokens or not paid anything")
608614 else if ((blockEndHeight > height))
609615 then throw(("Your tokens freezed teel " + toString(blockEndHeight)))
610616 else [ScriptTransfer(i.caller, userTokensFreezed, tokenId), IntegerEntry((((toString(i.caller) + "_") + toString(launchpadId)) + keyUserFreezeToken), 0)]
611617 }
612618 })
613619
614620
615621
616622 @Callable(i)
617623 func transferBuyAsset (launchpadId,amount) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), {
618624 let projectAddress = addressFromStringValue(getStringValue(this, (toString(launchpadId) + keyAddress)))
619- let $t03285433004 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
620- let buyAssetId = $t03285433004._1
621- let buyAssetStrId = $t03285433004._2
622- let buyAssetName = $t03285433004._3
623- let buyAssetDecimals = $t03285433004._4
625+ let $t03297633126 = getAssetInfoFromString(value(getString(this, (toString(launchpadId) + keyBuyToken))))
626+ let buyAssetId = $t03297633126._1
627+ let buyAssetStrId = $t03297633126._2
628+ let buyAssetName = $t03297633126._3
629+ let buyAssetDecimals = $t03297633126._4
624630 let transferedBuyAsset = valueOrElse(getInteger(this, (toString(launchpadId) + keyTransferBuyAsset)), 0)
625631 let inv = if (if ((amount > 0))
626632 then (buyAssetId == USDN)
627633 else false)
628634 then invoke(stakingUSDNAddress, "unlockNeutrino", [amount, toBase58String(USDN)], nil)
629635 else 0
630636 if ((inv == inv))
631637 then [IntegerEntry((toString(launchpadId) + keyTransferBuyAsset), (transferedBuyAsset + amount)), ScriptTransfer(projectAddress, amount, buyAssetId)]
632638 else throw("Strict value is not equal to itself.")
633639 }))
634640
635641
636642
637643 @Callable(i)
638644 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
639645 then throw("DApp already inactive")
640646 else [BooleanEntry(keyActive, false)])
641647
642648
643649
644650 @Callable(i)
645651 func activate () = valueOrElse(isAdminCall(i), if (active)
646652 then throw("DApp already active")
647653 else [BooleanEntry(keyActive, true)])
648654
649655
650-@Verifier(tx)
651-func verify () = {
652- let multiSignedByAdmins = {
653- let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
654- then 1
655- else 0
656- let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
657- then 1
658- else 0
659- let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
660- then 1
661- else 0
662- (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
663- }
664- let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
665- then true
666- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
667- then true
668- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
669- then true
670- else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
671- match tx {
672- case dtx: DataTransaction =>
673- if (valueOrElse(getBoolean(oracle, keyLaunchpadDataTransactionStatus), false))
674- then signedByAdmin
675- else false
676- case _ =>
677- multiSignedByAdmins
678- }
679- }
680-

github/deemru/w8io/3ef1775 
162.31 ms