tx · QbnTx68yL38nvVb4JpdRV3ojkoZM7rqE5wLRYvgBWgc

3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk:  -0.01600000 Waves

2022.10.08 21:20 [2263883] smart account 3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk > SELF 0.00000000 Waves

{ "type": 13, "id": "QbnTx68yL38nvVb4JpdRV3ojkoZM7rqE5wLRYvgBWgc", "fee": 1600000, "feeAssetId": null, "timestamp": 1665264074043, "version": 2, "chainId": 84, "sender": "3N3dmyiBdj7pmjnQrzTTvmfzKSqndSzCMmk", "senderPublicKey": "AR4BeE6hYADMvKxgRQs4ADN3krEqb2j8WE3WfJxzL3zE", "proofs": [ "3WZrf1hxCmumx1Zs3fsCkwyc6QkP6aEJKQ6GWxhYAhdhCXUQHhKghKL7FN3U3dZx1C4xubNS1KQcwmMN9KwrNtQE" ], "script": "base64:BgJFCAISAwoBCBIAEgMKAQgSAwoBCBIDCgEIEgcKBQgIAQEIEgMKAQgSBAoCCAgSBQoDCAgBEgMKAQgSABIFCgMICAgSABIAJgAFd2F2ZXMAgMLXLwAOdGlja2V0UHJpY2VJbnQAwIQ9AAt0aWNrZXRQcmljZQUOdGlja2V0UHJpY2VJbnQABmludkZlZQCgwh4AEndpdGhkcmF3RmVlUGVyY2VudAAFABZmZWVDb2xsZWN0b3JBZGRyZXNzS2V5AhNmZWVDb2xsZWN0b3JBZGRyZXNzABl0b3VybmFtZW50QnV5SW5GZWVQZXJjZW50AAoADmRlcG9zaXRBc3NldElkAiw1dWUxZml1VjZqNlVCcjZYZjI4UW1zNnk1RnF6S3RxdmF4eGh3dTdoVFE1OAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAESZ2V0VGlja2V0c0NvdW50S2V5AQ1hZGRyZXNzU3RyaW5nCQCsAgIFDWFkZHJlc3NTdHJpbmcCDV90aWNrZXRzQ291bnQBImJ1eUluQW1vdW50Rm9yVG91cm5hbWVudEZvckFjY291bnQCDHRvdXJuYW1lbnRJZAdhY2NvdW50CQCsAgIJAKwCAgUMdG91cm5hbWVudElkAhdfYnV5SW5BbW91bnRGb3JBY2NvdW50XwUHYWNjb3VudAEjYnV5SW5Bc3NldElkRm9yVG91cm5hbWVudEZvckFjY291bnQCDHRvdXJuYW1lbnRJZAdhY2NvdW50CQCsAgIJAKwCAgUMdG91cm5hbWVudElkAhhfYnV5SW5Bc3NldElkRm9yQWNjb3VudF8FB2FjY291bnQBHXRpY2tldEZvclRvdXJuYW1lbnRGb3JBY2NvdW50Agx0b3VybmFtZW50SWQHYWNjb3VudAkArAICCQCsAgIFDHRvdXJuYW1lbnRJZAISX3RpY2tldEZvckFjY291bnRfBQdhY2NvdW50ASZ0b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIkX3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50AS90b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudE1pbnVzRmVlc0tleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAItX3RvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50TWludXNGZWVzARR0b3VybmFtZW50Q3JlYXRvcktleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAISX3RvdXJuYW1lbnRDcmVhdG9yARF0b3VybmFtZW50TmFtZUtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIPX3RvdXJuYW1lbnROYW1lARh0b3VybmFtZW50UHJpemVBbW91bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCFl90b3VybmFtZW50UHJpemVBbW91bnQBHHRvdXJuYW1lbnRNYXhQbGF5ZXJzQ291bnRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCGl90b3VybmFtZW50TWF4UGxheWVyc0NvdW50ARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhdfdG91cm5hbWVudFBsYXllcnNDb3VudAEZdG91cm5hbWVudFByaXplQXNzZXRJZEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIXX3RvdXJuYW1lbnRQcml6ZUFzc2V0SWQBG3RvdXJuYW1lbnRQcml6ZUFzc2V0TmFtZUtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIZX3RvdXJuYW1lbnRQcml6ZUFzc2V0TmFtZQEYdG91cm5hbWVudEJ1eUluQW1vdW50S2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhZfdG91cm5hbWVudEJ1eUluQW1vdW50ARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhdfdG91cm5hbWVudEJ1eUluQXNzZXRJZAEbdG91cm5hbWVudEJ1eUluQXNzZXROYW1lS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAhlfdG91cm5hbWVudEJ1eUluQXNzZXROYW1lAR90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzS2V5AQx0b3VybmFtZW50SWQJAKwCAgUMdG91cm5hbWVudElkAh1fdG91cm5hbWVudEJ1eUluQXNzZXREZWNpbWFscwEfdG91cm5hbWVudFByaXplQXNzZXREZWNpbWFsc0tleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIdX3RvdXJuYW1lbnRQcml6ZUFzc2V0RGVjaW1hbHMBE3RvdXJuYW1lbnRTdGF0dXNLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCEV90b3VybmFtZW50U3RhdHVzAR50b3VybmFtZW50QnV5SW5GZWVDb2xsZWN0ZWRLZXkBDHRvdXJuYW1lbnRJZAkArAICBQx0b3VybmFtZW50SWQCHF90b3VybmFtZW50QnV5SW5GZWVDb2xsZWN0ZWQBIXRvdXJuYW1lbnRXaW5uaW5nVHJhbnNhY3Rpb25JZEtleQEMdG91cm5hbWVudElkCQCsAgIFDHRvdXJuYW1lbnRJZAIfX3RvdXJuYW1lbnRXaW5uaW5nVHJhbnNhY3Rpb25JZAENZ2FtZVdpbm5lcktleQEGZ2FtZUlkCQCsAgIFBmdhbWVJZAIHX3dpbm5lcgEYYWRkcmVzc0F2YWlsYWJsZUZ1bmRzS2V5AQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCD19hdmFpbGFibGVGdW5kcwEaYWRkcmVzc1RvdGFsTG9ja2VkRnVuZHNLZXkBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIRX3RvdGFsTG9ja2VkRnVuZHMBIWFkZHJlc3NMb2NrZWRGdW5kc1RvdGFsSGlzdG9yeUtleQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhhfbG9ja2VkRnVuZHNUb3RhbEhpc3RvcnkBHGFkZHJlc3NMb2NrZWRGdW5kc0ZvckdhbWVLZXkCB2FkZHJlc3MGZ2FtZUlkCQCsAgIJAKwCAgUHYWRkcmVzcwINX2xvY2tlZEZ1bmRzXwUGZ2FtZUlkARphZGRyZXNzQXZhaWxhYmxlUmV3YXJkc0tleQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhFfYXZhaWxhYmxlUmV3YXJkcwEPZ2V0VGlja2V0c0NvdW50AQ1hZGRyZXNzU3RyaW5nCQENdHJ5R2V0SW50ZWdlcgEJARJnZXRUaWNrZXRzQ291bnRLZXkBBQ1hZGRyZXNzU3RyaW5nAQ1jb25zdW1lVGlja2V0AQpwbGF5ZXJBZGRyBBJjdXJyZW50VGlja2V0Q291bnQJAQ9nZXRUaWNrZXRzQ291bnQBBQpwbGF5ZXJBZGRyBBVuZXdDdXJyZW50VGlja2V0Q291bnQJAGUCBRJjdXJyZW50VGlja2V0Q291bnQAAQMJAGYCAAAFFW5ld0N1cnJlbnRUaWNrZXRDb3VudAAABRVuZXdDdXJyZW50VGlja2V0Q291bnQOAWkBFnNldEZlZUNvbGxlY3RvckFkZHJlc3MBDWNvbGxlY3RvckFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBPbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQIFFmZlZUNvbGxlY3RvckFkZHJlc3NLZXkFDWNvbGxlY3RvckFkZHIFA25pbAFpAQxkZXBvc2l0RnVuZHMABANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQDCQECIT0CCAUDcG10B2Fzc2V0SWQJANkEAQUOZGVwb3NpdEFzc2V0SWQJAAIBAhlZb3UgY2FuIG9ubHkgZGVwb3NpdCBVU0ROBA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEFWN1cnJlbnRBdmFpbGFibGVGdW5kcwkBDXRyeUdldEludGVnZXIBCQEYYWRkcmVzc0F2YWlsYWJsZUZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYYWRkcmVzc0F2YWlsYWJsZUZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cgkAZAIFFWN1cnJlbnRBdmFpbGFibGVGdW5kcwgFA3BtdAZhbW91bnQFA25pbAABAWkBGGNhbmNlbFNpZ25VcFRvVG91cm5hbWVudAEMdG91cm5hbWVudElkBBB0b3VybmFtZW50U3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAMJAQIhPQIFEHRvdXJuYW1lbnRTdGF0dXMCDHJlZ2lzdHJhdGlvbgkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQPcGFpZEJ1eUluQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgQQcGFpZEJ1eUluQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQkBI2J1eUluQXNzZXRJZEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyBB1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAkBDXRyeUdldEludGVnZXIBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAQZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkBQ9wYWlkQnV5SW5BbW91bnQECWZlZXNUYWtlbgkAawMFGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQFGXRvdXJuYW1lbnRCdXlJbkZlZVBlcmNlbnQAZAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDWNhbGxlckFkZHJTdHIFD3BhaWRCdXlJbkFtb3VudAkA2QQBBRBwYWlkQnV5SW5Bc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAR10aWNrZXRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEiYnV5SW5BbW91bnRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEjYnV5SW5Bc3NldElkRm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQBlAgUdYWxyZWFkeVJlZ2lzdGVyZWRQbGF5ZXJzQ291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEvdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRNaW51c0ZlZXNLZXkBBQx0b3VybmFtZW50SWQJAGUCBRl0b3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50BQlmZWVzVGFrZW4FA25pbAABAWkBEnNpZ25VcFRvVG91cm5hbWVudAEMdG91cm5hbWVudElkBA9tYXhQbGF5ZXJzQ291bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARx0b3VybmFtZW50TWF4UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkBB1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAkBDXRyeUdldEludGVnZXIBCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAQQdG91cm5hbWVudFN0YXR1cwkBEUBleHRyTmF0aXZlKDEwNTgpAQkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQDCQECIT0CBRB0b3VybmFtZW50U3RhdHVzAgxyZWdpc3RyYXRpb24JAAIBAihUb3VybmFtZW50IGlzIG5vdCBpbiByZWdpc3RyYXRpb24gcGhhc2UhAwkAAAIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50BQ9tYXhQbGF5ZXJzQ291bnQJAAIBAjVUb3VybmFtZW50IGlzIGN1cnJlbnRseSBmdWxsLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIQQDcG10AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQACAQIhUGxlYXNlIGF0dGFjaCBleGFjdGx5IG9uZSBwYXltZW50BAxidXlJbkFzc2V0aWQEByRtYXRjaDAIBQNwbXQHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgRVbml0BAFiBQckbWF0Y2gwAgADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiCQACAQILTWF0Y2ggZXJyb3IEE2J1eUluUmVxdWlyZWRBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARh0b3VybmFtZW50QnV5SW5BbW91bnRLZXkBBQx0b3VybmFtZW50SWQEFGJ1eUluUmVxdWlyZWRBc3NldElkCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQEZdG91cm5hbWVudEJ1eUluQXNzZXRJZEtleQEFDHRvdXJuYW1lbnRJZAMJAQIhPQIFE2J1eUluUmVxdWlyZWRBbW91bnQIBQNwbXQGYW1vdW50CQACAQkArAICAixBdHRhY2hlZCBwYXltZW50IGFtb3VudCBpcyBpbnZhbGlkLCBtdXN0IGJlIAkApAMBBRNidXlJblJlcXVpcmVkQW1vdW50AwkBAiE9AgUUYnV5SW5SZXF1aXJlZEFzc2V0SWQFDGJ1eUluQXNzZXRpZAkAAgEJAKwCAgIuQXR0YWNoZWQgcGF5bWVudCBhc3NldCBpZCBpcyBpbnZhbGlkLCBtdXN0IGJlIAUUYnV5SW5SZXF1aXJlZEFzc2V0SWQEDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkBJnRvdXJuYW1lbnRUb3RhbEJ1eUluQ29sbGVjdGVkQW1vdW50S2V5AQUMdG91cm5hbWVudElkCAUDcG10BmFtb3VudAQJZmVlc1Rha2VuCQBrAwUZdG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudAUZdG91cm5hbWVudEJ1eUluRmVlUGVyY2VudABkCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAR10aWNrZXRGb3JUb3VybmFtZW50Rm9yQWNjb3VudAIFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgYJAMwIAgkBDEludGVnZXJFbnRyeQIJASJidXlJbkFtb3VudEZvclRvdXJuYW1lbnRGb3JBY2NvdW50AgUMdG91cm5hbWVudElkBQ1jYWxsZXJBZGRyU3RyCAUDcG10BmFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEjYnV5SW5Bc3NldElkRm9yVG91cm5hbWVudEZvckFjY291bnQCBQx0b3VybmFtZW50SWQFDWNhbGxlckFkZHJTdHIFDGJ1eUluQXNzZXRpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGXRvdXJuYW1lbnRQbGF5ZXJzQ291bnRLZXkBBQx0b3VybmFtZW50SWQJAGQCBR1hbHJlYWR5UmVnaXN0ZXJlZFBsYXllcnNDb3VudAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEmdG91cm5hbWVudFRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnRLZXkBBQx0b3VybmFtZW50SWQFGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAS90b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudE1pbnVzRmVlc0tleQEFDHRvdXJuYW1lbnRJZAkAZQIFGXRvdGFsQnV5SW5Db2xsZWN0ZWRBbW91bnQFCWZlZXNUYWtlbgUDbmlsAAEBaQEQY2FuY2VsVG91cm5hbWVudAEMdG91cm5hbWVudElkBA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEEXRvdXJuYW1lbnRDcmVhdG9yCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQEDGNyZWF0b3JDaGVjawMJAAACBRF0b3VybmFtZW50Q3JlYXRvcgUNY2FsbGVyQWRkclN0cgYDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkAAgECJk9ubHkgdG91cm5hbWVudCBjcmVhdG9yIGNhbiBjYW5jZWwgaXQhAwkAAAIFDGNyZWF0b3JDaGVjawUMY3JlYXRvckNoZWNrBBB0b3VybmFtZW50U3RhdHVzCQERQGV4dHJOYXRpdmUoMTA1OCkBCQETdG91cm5hbWVudFN0YXR1c0tleQEFDHRvdXJuYW1lbnRJZAMJAQIhPQIFEHRvdXJuYW1lbnRTdGF0dXMCDHJlZ2lzdHJhdGlvbgkAAgECKFRvdXJuYW1lbnQgaXMgbm90IGluIHJlZ2lzdHJhdGlvbiBwaGFzZSEEHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50CQENdHJ5R2V0SW50ZWdlcgEJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkAwkAZgIFHWFscmVhZHlSZWdpc3RlcmVkUGxheWVyc0NvdW50AAAJAAIBAkVDYW5ub3QgY2FuY2VsIGEgdG91cm5hbWVudCB3aGVuIHBsYXllcnMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZCB0byBpdCEEFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBGHRvdXJuYW1lbnRQcml6ZUFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQWdG91cm5hbWVudFByaXplQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQkBGXRvdXJuYW1lbnRQcml6ZUFzc2V0SWRLZXkBBQx0b3VybmFtZW50SWQJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQEYdG91cm5hbWVudFByaXplQW1vdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARx0b3VybmFtZW50TWF4UGxheWVyc0NvdW50S2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50UHJpemVBc3NldElkS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARt0b3VybmFtZW50UHJpemVBc3NldE5hbWVLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBH3RvdXJuYW1lbnRQcml6ZUFzc2V0RGVjaW1hbHNLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGHRvdXJuYW1lbnRCdXlJbkFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEbdG91cm5hbWVudEJ1eUluQXNzZXROYW1lS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAR90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQUMdG91cm5hbWVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARF0b3VybmFtZW50TmFtZUtleQEFDHRvdXJuYW1lbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQURdG91cm5hbWVudENyZWF0b3IFFXRvdXJuYW1lbnRQcml6ZUFtb3VudAkA2QQBBRZ0b3VybmFtZW50UHJpemVBc3NldElkBQNuaWwAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBjcmVhdGVUb3VybmFtZW50BQx0b3VybmFtZW50SWQEbmFtZQxwbGF5ZXJzQ291bnQLYnV5SW5BbW91bnQMYnV5SW5Bc3NldElkBANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQEEXRvdXJuYW1lbnRDcmVhdG9yBAckbWF0Y2gwCQCiCAEJARR0b3VybmFtZW50Q3JlYXRvcktleQEFDHRvdXJuYW1lbnRJZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEB2NyZWF0b3IFByRtYXRjaDAJAAIBCQCsAgICJ1RvdXJuYW1lbnQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGlzIGlkIAUMdG91cm5hbWVudElkBQR1bml0AwkAAAIFEXRvdXJuYW1lbnRDcmVhdG9yBRF0b3VybmFtZW50Q3JlYXRvcgQMcHJpemVBc3NldElkBAckbWF0Y2gwCAUDcG10B2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIEVW5pdAQBYgUHJG1hdGNoMAIAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgkAAgECC01hdGNoIGVycm9yBAxhc3NldERldGFpbHMEByRtYXRjaDAIBQNwbXQHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgRVbml0BAFiBQckbWF0Y2gwCQDMCAICBVdhdmVzCQDMCAIACAUDbmlsAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAEByRtYXRjaDEJAOwHAQUBYgMJAAECBQckbWF0Y2gxAgVBc3NldAQFYXNzZXQFByRtYXRjaDEJAMwIAggFBWFzc2V0BG5hbWUJAMwIAggFBWFzc2V0CGRlY2ltYWxzBQNuaWwJAAIBAhBDYW4ndCBmaW5kIGFzc2V0CQACAQILTWF0Y2ggZXJyb3IECmJ1eUluQXNzZXQEByRtYXRjaDAJAOwHAQkA2QQBBQxidXlJbkFzc2V0SWQDCQABAgUHJG1hdGNoMAIFQXNzZXQEBWFzc2V0BQckbWF0Y2gwCQDMCAIIBQVhc3NldARuYW1lCQDMCAIIBQVhc3NldAhkZWNpbWFscwUDbmlsCQDMCAICAAkAzAgCAAAFA25pbAQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARh0b3VybmFtZW50UHJpemVBbW91bnRLZXkBBQx0b3VybmFtZW50SWQIBQNwbXQGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZdG91cm5hbWVudFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEcdG91cm5hbWVudE1heFBsYXllcnNDb3VudEtleQEFDHRvdXJuYW1lbnRJZAUMcGxheWVyc0NvdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARl0b3VybmFtZW50UHJpemVBc3NldElkS2V5AQUMdG91cm5hbWVudElkBQxwcml6ZUFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBG3RvdXJuYW1lbnRQcml6ZUFzc2V0TmFtZUtleQEFDHRvdXJuYW1lbnRJZAoAAUAJAJEDAgUMYXNzZXREZXRhaWxzAAADCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfdG91cm5hbWVudFByaXplQXNzZXREZWNpbWFsc0tleQEFDHRvdXJuYW1lbnRJZAoAAUAJAJEDAgUMYXNzZXREZXRhaWxzAAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAgxyZWdpc3RyYXRpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJARh0b3VybmFtZW50QnV5SW5BbW91bnRLZXkBBQx0b3VybmFtZW50SWQFC2J1eUluQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARt0b3VybmFtZW50QnV5SW5Bc3NldE5hbWVLZXkBBQx0b3VybmFtZW50SWQKAAFACQCRAwIFCmJ1eUluQXNzZXQAAAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAR90b3VybmFtZW50QnV5SW5Bc3NldERlY2ltYWxzS2V5AQUMdG91cm5hbWVudElkCgABQAkAkQMCBQpidXlJbkFzc2V0AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQUMdG91cm5hbWVudElkBQxidXlJbkFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEXRvdXJuYW1lbnROYW1lS2V5AQUMdG91cm5hbWVudElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJARR0b3VybmFtZW50Q3JlYXRvcktleQEFDHRvdXJuYW1lbnRJZAUNY2FsbGVyQWRkclN0cgUDbmlsAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPc3RhcnRUb3VybmFtZW50AQx0b3VybmFtZW50SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBPbmx5CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE3RvdXJuYW1lbnRTdGF0dXNLZXkBBQx0b3VybmFtZW50SWQCB3N0YXJ0ZWQFA25pbAABAWkBEGZpbmlzaFRvdXJuYW1lbnQCDHRvdXJuYW1lbnRJZB13aW5uaW5nVHJhbnNmZXJ0VHJhbnNhY3Rpb25JZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkEEXRvdXJuYW1lbnRDcmVhdG9yCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEUdG91cm5hbWVudENyZWF0b3JLZXkBBQx0b3VybmFtZW50SWQEGnRvdXJuYW1lbnRUb3RhbEJ1eUluQW1vdW50CQENdHJ5R2V0SW50ZWdlcgEJASZ0b3VybmFtZW50VG90YWxCdXlJbkNvbGxlY3RlZEFtb3VudEtleQEFDHRvdXJuYW1lbnRJZAQVdG91cm5hbWVudEJ1eUluQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEYdG91cm5hbWVudEJ1eUluQW1vdW50S2V5AQUMdG91cm5hbWVudElkBBZ0b3VybmFtZW50QnV5SW5Bc3NldElkBAckbWF0Y2gwCQCiCAEJARl0b3VybmFtZW50QnV5SW5Bc3NldElkS2V5AQUMdG91cm5hbWVudElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQCaWQFByRtYXRjaDADCQAAAgUCaWQCAAUEdW5pdAkA2QQBBQJpZAUEdW5pdAQSdG91cm5hbWVudEJ1eUluRmVlCQBrAwUadG91cm5hbWVudFRvdGFsQnV5SW5BbW91bnQFGXRvdXJuYW1lbnRCdXlJbkZlZVBlcmNlbnQAZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJASF0b3VybmFtZW50V2lubmluZ1RyYW5zYWN0aW9uSWRLZXkBBQx0b3VybmFtZW50SWQFHXdpbm5pbmdUcmFuc2ZlcnRUcmFuc2FjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARN0b3VybmFtZW50U3RhdHVzS2V5AQUMdG91cm5hbWVudElkAghmaW5pc2hlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHnRvdXJuYW1lbnRCdXlJbkZlZUNvbGxlY3RlZEtleQEFDHRvdXJuYW1lbnRJZAUSdG91cm5hbWVudEJ1eUluRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXRvdXJuYW1lbnRDcmVhdG9yCQBlAgUadG91cm5hbWVudFRvdGFsQnV5SW5BbW91bnQFEnRvdXJuYW1lbnRCdXlJbkZlZQUWdG91cm5hbWVudEJ1eUluQXNzZXRJZAUDbmlsAAEBaQEOcGxheWVyRXhpdEdhbWUDBmdhbWVJZApwbGF5ZXJBZGRyD2V4aXRTdGFja0Ftb3VudAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkEF2N1cnJlbnRUb3RhbExvY2tlZEZ1bmRzCQENdHJ5R2V0SW50ZWdlcgEJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFCnBsYXllckFkZHIEIGN1cnJlbnRHYW1lTG9ja2VkQW1vdW50Rm9yUGxheWVyCQENdHJ5R2V0SW50ZWdlcgEJARxhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lS2V5AgUKcGxheWVyQWRkcgUGZ2FtZUlkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFCnBsYXllckFkZHIJAGUCBRdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwUgY3VycmVudEdhbWVMb2NrZWRBbW91bnRGb3JQbGF5ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARxhZGRyZXNzTG9ja2VkRnVuZHNGb3JHYW1lS2V5AgUKcGxheWVyQWRkcgUGZ2FtZUlkAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKcGxheWVyQWRkcgUPZXhpdFN0YWNrQW1vdW50CQDZBAEFDmRlcG9zaXRBc3NldElkBQNuaWwAAQFpARBsb2NrRnVuZHNGb3JHYW1lAQZnYW1lSWQEA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIVBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAAgECGVlvdSBjYW4gb25seSBkZXBvc2l0IFVTRE4EDWNhbGxlckFkZHJTdHIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQXY3VycmVudFRvdGFsTG9ja2VkRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGmFkZHJlc3NUb3RhbExvY2tlZEZ1bmRzS2V5AQUNY2FsbGVyQWRkclN0cgQeY3VycmVudExvY2tlZEZ1bmRzVG90YWxIaXN0b3J5CQENdHJ5R2V0SW50ZWdlcgEJASFhZGRyZXNzTG9ja2VkRnVuZHNUb3RhbEhpc3RvcnlLZXkBBQ1jYWxsZXJBZGRyU3RyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARphZGRyZXNzVG90YWxMb2NrZWRGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIJAGQCBRdjdXJyZW50VG90YWxMb2NrZWRGdW5kcwgFA3BtdAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJASFhZGRyZXNzTG9ja2VkRnVuZHNUb3RhbEhpc3RvcnlLZXkBBQ1jYWxsZXJBZGRyU3RyCQBkAgUeY3VycmVudExvY2tlZEZ1bmRzVG90YWxIaXN0b3J5CAUDcG10BmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHGFkZHJlc3NMb2NrZWRGdW5kc0ZvckdhbWVLZXkCBQ1jYWxsZXJBZGRyU3RyBQZnYW1lSWQIBQNwbXQGYW1vdW50BQNuaWwAAQFpAQ13aXRoZHJhd0Z1bmRzAAQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBBmZWVDb2xsZWN0b3JBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBBRZmZWVDb2xsZWN0b3JBZGRyZXNzS2V5BBVjdXJyZW50QXZhaWxhYmxlRnVuZHMJAQ10cnlHZXRJbnRlZ2VyAQkBGGFkZHJlc3NBdmFpbGFibGVGdW5kc0tleQEFDWNhbGxlckFkZHJTdHIEC3dpdGhkcmF3RmVlCQBrAwUVY3VycmVudEF2YWlsYWJsZUZ1bmRzBRJ3aXRoZHJhd0ZlZVBlcmNlbnQAZAQUYWN0dWFsQXZhaWxhYmxlRnVuZHMJAGUCBRVjdXJyZW50QXZhaWxhYmxlRnVuZHMFC3dpdGhkcmF3RmVlAwkAZwIAAAUUYWN0dWFsQXZhaWxhYmxlRnVuZHMJAAIBAh5ObyBhdmFpbGFibGUgZnVuZHMgdG8gd2l0aGRyYXcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhhZGRyZXNzQXZhaWxhYmxlRnVuZHNLZXkBBQ1jYWxsZXJBZGRyU3RyAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRRhY3R1YWxBdmFpbGFibGVGdW5kcwkA2QQBBQ5kZXBvc2l0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRBmZWVDb2xsZWN0b3JBZGRyBQt3aXRoZHJhd0ZlZQkA2QQBBQ5kZXBvc2l0QXNzZXRJZAUDbmlsAWkBEHNldFdpbm5lckhlYWRzVXADBmdhbWVJZA13aW5uZXJBZGRyU3RyD290aGVyUGxheWVyQWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCkFkbWluIE9ubHkEE2F2YWlsYWJsZVJld2FyZHNLZXkJARphZGRyZXNzQXZhaWxhYmxlUmV3YXJkc0tleQEFDXdpbm5lckFkZHJTdHIEF2N1cnJlbnRBdmFpbGFibGVSZXdhcmRzCQENdHJ5R2V0SW50ZWdlcgEFE2F2YWlsYWJsZVJld2FyZHNLZXkEFG5ld1RpY2tldENvdW50V2lubmVyCQENY29uc3VtZVRpY2tldAEFDXdpbm5lckFkZHJTdHIEGW5ld1RpY2tldENvdW50T3RoZXJQbGF5ZXIJAQ1jb25zdW1lVGlja2V0AQUPb3RoZXJQbGF5ZXJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1nYW1lV2lubmVyS2V5AQUGZ2FtZUlkBQ13aW5uZXJBZGRyU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNhdmFpbGFibGVSZXdhcmRzS2V5CQBkAgUXY3VycmVudEF2YWlsYWJsZVJld2FyZHMJAGgCBQt0aWNrZXRQcmljZQACCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0VGlja2V0c0NvdW50S2V5AQUNd2lubmVyQWRkclN0cgUUbmV3VGlja2V0Q291bnRXaW5uZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUaWNrZXRzQ291bnRLZXkBBQ9vdGhlclBsYXllckFkZHIFGW5ld1RpY2tldENvdW50T3RoZXJQbGF5ZXIFA25pbAFpAQ93aXRoZHJhd1Jld2FyZHMABA1jYWxsZXJBZGRyU3RyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEEGZlZUNvbGxlY3RvckFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDU4KQEFFmZlZUNvbGxlY3RvckFkZHJlc3NLZXkEF2N1cnJlbnRBdmFpbGFibGVSZXdhcmRzCQENdHJ5R2V0SW50ZWdlcgEJARphZGRyZXNzQXZhaWxhYmxlUmV3YXJkc0tleQEFDWNhbGxlckFkZHJTdHIEC3dpdGhkcmF3RmVlCQBrAwUXY3VycmVudEF2YWlsYWJsZVJld2FyZHMFEndpdGhkcmF3RmVlUGVyY2VudABkBBZhY3R1YWxBdmFpbGFibGVSZXdhcmRzCQBlAgkAZQIFF2N1cnJlbnRBdmFpbGFibGVSZXdhcmRzBQZpbnZGZWUFC3dpdGhkcmF3RmVlAwkAZwIAAAUXY3VycmVudEF2YWlsYWJsZVJld2FyZHMJAAIBAiBObyBhdmFpbGFibGUgcmV3YXJkcyB0byB3aXRoZHJhdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmFkZHJlc3NBdmFpbGFibGVSZXdhcmRzS2V5AQUNY2FsbGVyQWRkclN0cgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUWYWN0dWFsQXZhaWxhYmxlUmV3YXJkcwUEdW5pdAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRBmZWVDb2xsZWN0b3JBZGRyBQt3aXRoZHJhd0ZlZQUEdW5pdAUDbmlsAWkBCmJ1eVRpY2tldHMABANwbXQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiFQbGVhc2UgYXR0YWNoIGV4YWN0bHkgb25lIHBheW1lbnQDCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkCQACAQInVGlja2V0cyBjYW4gb25seSBpYmUgcHVyY2hhc2VkIGluIFdhdmVzAwkBAiE9AggFA3BtdAZhbW91bnQFC3RpY2tldFByaWNlCQACAQkArAICCQCsAgICH1RoZSBwYXltZW50IG11c3QgYmUgb2YgZXhhY3RseSAJAKQDAQUOdGlja2V0UHJpY2VJbnQCBiB3YXZlcwQNY2FsbGVyQWRkclN0cgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBBNjdXJyZW50VGlja2V0c0NvdW50CQENdHJ5R2V0SW50ZWdlcgEJARJnZXRUaWNrZXRzQ291bnRLZXkBBQ1jYWxsZXJBZGRyU3RyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRUaWNrZXRzQ291bnRLZXkBBQ1jYWxsZXJBZGRyU3RyCQBkAgUTY3VycmVudFRpY2tldHNDb3VudAABBQNuaWwAAQECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnOVCu/", "height": 2263883, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: H5vptWcjz4WPsYBEns1hEzCtjeDRsetyRaRc5U3gLDme Next: BBN1dZSuqf9cuCTqhWWjhN1nHDw8aUxhNuNe7agtgDhY Diff:
OldNewDifferences
3838
3939
4040 func tournamentTotalBuyInCollectedAmountKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmount")
41+
42+
43+func tournamentTotalBuyInCollectedAmountMinusFeesKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmountMinusFees")
4144
4245
4346 func tournamentCreatorKey (tournamentId) = (tournamentId + "_tournamentCreator")
148151 let paidBuyInAmount = getIntegerValue(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr))
149152 let paidBuyInAssetId = getStringValue(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr))
150153 let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
151- let totalBuyInCollectedAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
152- $Tuple2([ScriptTransfer(addressFromStringValue(callerAddrStr), paidBuyInAmount, fromBase58String(paidBuyInAssetId)), DeleteEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr)), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount - 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), (totalBuyInCollectedAmount - paidBuyInAmount))], 1)
154+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) - paidBuyInAmount)
155+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
156+ $Tuple2([ScriptTransfer(addressFromStringValue(callerAddrStr), paidBuyInAmount, fromBase58String(paidBuyInAssetId)), DeleteEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr)), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount - 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
153157 }
154158 }
155159
184188 then throw(("Attached payment asset id is invalid, must be " + buyInRequiredAssetId))
185189 else {
186190 let callerAddrStr = toBase58String(i.caller.bytes)
187- let totalBuyInCollectedAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
188- $Tuple2([BooleanEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr), true), IntegerEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr), pmt.amount), StringEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr), buyInAssetid), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount + 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), (totalBuyInCollectedAmount + pmt.amount))], 1)
191+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) + pmt.amount)
192+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
193+ $Tuple2([BooleanEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr), true), IntegerEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr), pmt.amount), StringEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr), buyInAssetid), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount + 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
189194 }
190195 }
191196 }
287292 }
288293 else throw("Strict value is not equal to itself.")
289294 }
295+
296+
297+
298+@Callable(i)
299+func startTournament (tournamentId) = if ((i.caller != this))
300+ then throw("Admin Only")
301+ else $Tuple2([StringEntry(tournamentStatusKey(tournamentId), "started")], 1)
290302
291303
292304
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let waves = 100000000
55
66 let ticketPriceInt = 1000000
77
88 let ticketPrice = ticketPriceInt
99
1010 let invFee = 500000
1111
1212 let withdrawFeePercent = 5
1313
1414 let feeCollectorAddressKey = "feeCollectorAddress"
1515
1616 let tournamentBuyInFeePercent = 10
1717
1818 let depositAssetId = "5ue1fiuV6j6UBr6Xf28Qms6y5FqzKtqvaxxhwu7hTQ58"
1919
2020 func tryGetInteger (key) = match getInteger(this, key) {
2121 case b: Int =>
2222 b
2323 case _ =>
2424 0
2525 }
2626
2727
2828 func getTicketsCountKey (addressString) = (addressString + "_ticketsCount")
2929
3030
3131 func buyInAmountForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAmountForAccount_") + account)
3232
3333
3434 func buyInAssetIdForTournamentForAccount (tournamentId,account) = ((tournamentId + "_buyInAssetIdForAccount_") + account)
3535
3636
3737 func ticketForTournamentForAccount (tournamentId,account) = ((tournamentId + "_ticketForAccount_") + account)
3838
3939
4040 func tournamentTotalBuyInCollectedAmountKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmount")
41+
42+
43+func tournamentTotalBuyInCollectedAmountMinusFeesKey (tournamentId) = (tournamentId + "_tournamentTotalBuyInCollectedAmountMinusFees")
4144
4245
4346 func tournamentCreatorKey (tournamentId) = (tournamentId + "_tournamentCreator")
4447
4548
4649 func tournamentNameKey (tournamentId) = (tournamentId + "_tournamentName")
4750
4851
4952 func tournamentPrizeAmountKey (tournamentId) = (tournamentId + "_tournamentPrizeAmount")
5053
5154
5255 func tournamentMaxPlayersCountKey (tournamentId) = (tournamentId + "_tournamentMaxPlayersCount")
5356
5457
5558 func tournamentPlayersCountKey (tournamentId) = (tournamentId + "_tournamentPlayersCount")
5659
5760
5861 func tournamentPrizeAssetIdKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetId")
5962
6063
6164 func tournamentPrizeAssetNameKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetName")
6265
6366
6467 func tournamentBuyInAmountKey (tournamentId) = (tournamentId + "_tournamentBuyInAmount")
6568
6669
6770 func tournamentBuyInAssetIdKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetId")
6871
6972
7073 func tournamentBuyInAssetNameKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetName")
7174
7275
7376 func tournamentBuyInAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentBuyInAssetDecimals")
7477
7578
7679 func tournamentPrizeAssetDecimalsKey (tournamentId) = (tournamentId + "_tournamentPrizeAssetDecimals")
7780
7881
7982 func tournamentStatusKey (tournamentId) = (tournamentId + "_tournamentStatus")
8083
8184
8285 func tournamentBuyInFeeCollectedKey (tournamentId) = (tournamentId + "_tournamentBuyInFeeCollected")
8386
8487
8588 func tournamentWinningTransactionIdKey (tournamentId) = (tournamentId + "_tournamentWinningTransactionId")
8689
8790
8891 func gameWinnerKey (gameId) = (gameId + "_winner")
8992
9093
9194 func addressAvailableFundsKey (address) = (address + "_availableFunds")
9295
9396
9497 func addressTotalLockedFundsKey (address) = (address + "_totalLockedFunds")
9598
9699
97100 func addressLockedFundsTotalHistoryKey (address) = (address + "_lockedFundsTotalHistory")
98101
99102
100103 func addressLockedFundsForGameKey (address,gameId) = ((address + "_lockedFunds_") + gameId)
101104
102105
103106 func addressAvailableRewardsKey (address) = (address + "_availableRewards")
104107
105108
106109 func getTicketsCount (addressString) = tryGetInteger(getTicketsCountKey(addressString))
107110
108111
109112 func consumeTicket (playerAddr) = {
110113 let currentTicketCount = getTicketsCount(playerAddr)
111114 let newCurrentTicketCount = (currentTicketCount - 1)
112115 if ((0 > newCurrentTicketCount))
113116 then 0
114117 else newCurrentTicketCount
115118 }
116119
117120
118121 @Callable(i)
119122 func setFeeCollectorAddress (collectorAddr) = if ((i.caller != this))
120123 then throw("Admin Only")
121124 else [StringEntry(feeCollectorAddressKey, collectorAddr)]
122125
123126
124127
125128 @Callable(i)
126129 func depositFunds () = {
127130 let pmt = if ((size(i.payments) == 1))
128131 then i.payments[0]
129132 else throw("Please attach exactly one payment")
130133 if ((pmt.assetId != fromBase58String(depositAssetId)))
131134 then throw("You can only deposit USDN")
132135 else {
133136 let callerAddrStr = toBase58String(i.caller.bytes)
134137 let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
135138 $Tuple2([IntegerEntry(addressAvailableFundsKey(callerAddrStr), (currentAvailableFunds + pmt.amount))], 1)
136139 }
137140 }
138141
139142
140143
141144 @Callable(i)
142145 func cancelSignUpToTournament (tournamentId) = {
143146 let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
144147 if ((tournamentStatus != "registration"))
145148 then throw("Tournament is not in registration phase!")
146149 else {
147150 let callerAddrStr = toBase58String(i.caller.bytes)
148151 let paidBuyInAmount = getIntegerValue(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr))
149152 let paidBuyInAssetId = getStringValue(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr))
150153 let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
151- let totalBuyInCollectedAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
152- $Tuple2([ScriptTransfer(addressFromStringValue(callerAddrStr), paidBuyInAmount, fromBase58String(paidBuyInAssetId)), DeleteEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr)), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount - 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), (totalBuyInCollectedAmount - paidBuyInAmount))], 1)
154+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) - paidBuyInAmount)
155+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
156+ $Tuple2([ScriptTransfer(addressFromStringValue(callerAddrStr), paidBuyInAmount, fromBase58String(paidBuyInAssetId)), DeleteEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr)), DeleteEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr)), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount - 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
153157 }
154158 }
155159
156160
157161
158162 @Callable(i)
159163 func signUpToTournament (tournamentId) = {
160164 let maxPlayersCount = getIntegerValue(this, tournamentMaxPlayersCountKey(tournamentId))
161165 let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
162166 let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
163167 if ((tournamentStatus != "registration"))
164168 then throw("Tournament is not in registration phase!")
165169 else if ((alreadyRegisteredPlayersCount == maxPlayersCount))
166170 then throw("Tournament is currently full, please try again later!")
167171 else {
168172 let pmt = if ((size(i.payments) == 1))
169173 then i.payments[0]
170174 else throw("Please attach exactly one payment")
171175 let buyInAssetid = match pmt.assetId {
172176 case b: Unit =>
173177 ""
174178 case b: ByteVector =>
175179 toBase58String(b)
176180 case _ =>
177181 throw("Match error")
178182 }
179183 let buyInRequiredAmount = getIntegerValue(this, tournamentBuyInAmountKey(tournamentId))
180184 let buyInRequiredAssetId = getStringValue(this, tournamentBuyInAssetIdKey(tournamentId))
181185 if ((buyInRequiredAmount != pmt.amount))
182186 then throw(("Attached payment amount is invalid, must be " + toString(buyInRequiredAmount)))
183187 else if ((buyInRequiredAssetId != buyInAssetid))
184188 then throw(("Attached payment asset id is invalid, must be " + buyInRequiredAssetId))
185189 else {
186190 let callerAddrStr = toBase58String(i.caller.bytes)
187- let totalBuyInCollectedAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
188- $Tuple2([BooleanEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr), true), IntegerEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr), pmt.amount), StringEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr), buyInAssetid), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount + 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), (totalBuyInCollectedAmount + pmt.amount))], 1)
191+ let totalBuyInCollectedAmount = (tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId)) + pmt.amount)
192+ let feesTaken = fraction(totalBuyInCollectedAmount, tournamentBuyInFeePercent, 100)
193+ $Tuple2([BooleanEntry(ticketForTournamentForAccount(tournamentId, callerAddrStr), true), IntegerEntry(buyInAmountForTournamentForAccount(tournamentId, callerAddrStr), pmt.amount), StringEntry(buyInAssetIdForTournamentForAccount(tournamentId, callerAddrStr), buyInAssetid), IntegerEntry(tournamentPlayersCountKey(tournamentId), (alreadyRegisteredPlayersCount + 1)), IntegerEntry(tournamentTotalBuyInCollectedAmountKey(tournamentId), totalBuyInCollectedAmount), IntegerEntry(tournamentTotalBuyInCollectedAmountMinusFeesKey(tournamentId), (totalBuyInCollectedAmount - feesTaken))], 1)
189194 }
190195 }
191196 }
192197
193198
194199
195200 @Callable(i)
196201 func cancelTournament (tournamentId) = {
197202 let callerAddrStr = toBase58String(i.caller.bytes)
198203 let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
199204 let creatorCheck = if ((tournamentCreator == callerAddrStr))
200205 then true
201206 else if ((i.caller == this))
202207 then true
203208 else throw("Only tournament creator can cancel it!")
204209 if ((creatorCheck == creatorCheck))
205210 then {
206211 let tournamentStatus = getStringValue(tournamentStatusKey(tournamentId))
207212 if ((tournamentStatus != "registration"))
208213 then throw("Tournament is not in registration phase!")
209214 else {
210215 let alreadyRegisteredPlayersCount = tryGetInteger(tournamentPlayersCountKey(tournamentId))
211216 if ((alreadyRegisteredPlayersCount > 0))
212217 then throw("Cannot cancel a tournament when players are already registered to it!")
213218 else {
214219 let tournamentPrizeAmount = getIntegerValue(tournamentPrizeAmountKey(tournamentId))
215220 let tournamentPrizeAssetId = getStringValue(tournamentPrizeAssetIdKey(tournamentId))
216221 $Tuple2([DeleteEntry(tournamentPrizeAmountKey(tournamentId)), DeleteEntry(tournamentPlayersCountKey(tournamentId)), DeleteEntry(tournamentMaxPlayersCountKey(tournamentId)), DeleteEntry(tournamentPrizeAssetIdKey(tournamentId)), DeleteEntry(tournamentPrizeAssetNameKey(tournamentId)), DeleteEntry(tournamentPrizeAssetDecimalsKey(tournamentId)), DeleteEntry(tournamentStatusKey(tournamentId)), DeleteEntry(tournamentBuyInAmountKey(tournamentId)), DeleteEntry(tournamentBuyInAssetNameKey(tournamentId)), DeleteEntry(tournamentBuyInAssetDecimalsKey(tournamentId)), DeleteEntry(tournamentBuyInAssetIdKey(tournamentId)), DeleteEntry(tournamentNameKey(tournamentId)), DeleteEntry(tournamentCreatorKey(tournamentId)), ScriptTransfer(addressFromStringValue(tournamentCreator), tournamentPrizeAmount, fromBase58String(tournamentPrizeAssetId))], 1)
217222 }
218223 }
219224 }
220225 else throw("Strict value is not equal to itself.")
221226 }
222227
223228
224229
225230 @Callable(i)
226231 func createTournament (tournamentId,name,playersCount,buyInAmount,buyInAssetId) = {
227232 let pmt = if ((size(i.payments) == 1))
228233 then i.payments[0]
229234 else throw("Please attach exactly one payment")
230235 let tournamentCreator = match getString(tournamentCreatorKey(tournamentId)) {
231236 case creator: String =>
232237 throw(("Tournament already exists with this id " + tournamentId))
233238 case _ =>
234239 unit
235240 }
236241 if ((tournamentCreator == tournamentCreator))
237242 then {
238243 let prizeAssetId = match pmt.assetId {
239244 case b: Unit =>
240245 ""
241246 case b: ByteVector =>
242247 toBase58String(b)
243248 case _ =>
244249 throw("Match error")
245250 }
246251 let assetDetails = match pmt.assetId {
247252 case b: Unit =>
248253 ["Waves", 8]
249254 case b: ByteVector =>
250255 match assetInfo(b) {
251256 case asset: Asset =>
252257 [asset.name, asset.decimals]
253258 case _ =>
254259 throw("Can't find asset")
255260 }
256261 case _ =>
257262 throw("Match error")
258263 }
259264 let buyInAsset = match assetInfo(fromBase58String(buyInAssetId)) {
260265 case asset: Asset =>
261266 [asset.name, asset.decimals]
262267 case _ =>
263268 ["", 0]
264269 }
265270 let callerAddrStr = toBase58String(i.caller.bytes)
266271 $Tuple2([IntegerEntry(tournamentPrizeAmountKey(tournamentId), pmt.amount), IntegerEntry(tournamentPlayersCountKey(tournamentId), 0), IntegerEntry(tournamentMaxPlayersCountKey(tournamentId), playersCount), StringEntry(tournamentPrizeAssetIdKey(tournamentId), prizeAssetId), StringEntry(tournamentPrizeAssetNameKey(tournamentId), {
267272 let @ = assetDetails[0]
268273 if ($isInstanceOf(@, "String"))
269274 then @
270275 else throw(($getType(@) + " couldn't be cast to String"))
271276 }), IntegerEntry(tournamentPrizeAssetDecimalsKey(tournamentId), {
272277 let @ = assetDetails[1]
273278 if ($isInstanceOf(@, "Int"))
274279 then @
275280 else throw(($getType(@) + " couldn't be cast to Int"))
276281 }), StringEntry(tournamentStatusKey(tournamentId), "registration"), IntegerEntry(tournamentBuyInAmountKey(tournamentId), buyInAmount), StringEntry(tournamentBuyInAssetNameKey(tournamentId), {
277282 let @ = buyInAsset[0]
278283 if ($isInstanceOf(@, "String"))
279284 then @
280285 else throw(($getType(@) + " couldn't be cast to String"))
281286 }), IntegerEntry(tournamentBuyInAssetDecimalsKey(tournamentId), {
282287 let @ = buyInAsset[1]
283288 if ($isInstanceOf(@, "Int"))
284289 then @
285290 else throw(($getType(@) + " couldn't be cast to Int"))
286291 }), StringEntry(tournamentBuyInAssetIdKey(tournamentId), buyInAssetId), StringEntry(tournamentNameKey(tournamentId), name), StringEntry(tournamentCreatorKey(tournamentId), callerAddrStr)], 1)
287292 }
288293 else throw("Strict value is not equal to itself.")
289294 }
295+
296+
297+
298+@Callable(i)
299+func startTournament (tournamentId) = if ((i.caller != this))
300+ then throw("Admin Only")
301+ else $Tuple2([StringEntry(tournamentStatusKey(tournamentId), "started")], 1)
290302
291303
292304
293305 @Callable(i)
294306 func finishTournament (tournamentId,winningTransfertTransactionId) = if ((i.caller != this))
295307 then throw("Admin Only")
296308 else {
297309 let tournamentCreator = getStringValue(tournamentCreatorKey(tournamentId))
298310 let tournamentTotalBuyInAmount = tryGetInteger(tournamentTotalBuyInCollectedAmountKey(tournamentId))
299311 let tournamentBuyInAmount = getIntegerValue(tournamentBuyInAmountKey(tournamentId))
300312 let tournamentBuyInAssetId = match getString(tournamentBuyInAssetIdKey(tournamentId)) {
301313 case id: String =>
302314 if ((id == ""))
303315 then unit
304316 else fromBase58String(id)
305317 case _ =>
306318 unit
307319 }
308320 let tournamentBuyInFee = fraction(tournamentTotalBuyInAmount, tournamentBuyInFeePercent, 100)
309321 $Tuple2([StringEntry(tournamentWinningTransactionIdKey(tournamentId), winningTransfertTransactionId), StringEntry(tournamentStatusKey(tournamentId), "finished"), IntegerEntry(tournamentBuyInFeeCollectedKey(tournamentId), tournamentBuyInFee), ScriptTransfer(addressFromStringValue(tournamentCreator), (tournamentTotalBuyInAmount - tournamentBuyInFee), tournamentBuyInAssetId)], 1)
310322 }
311323
312324
313325
314326 @Callable(i)
315327 func playerExitGame (gameId,playerAddr,exitStackAmount) = if ((i.caller != this))
316328 then throw("Admin Only")
317329 else {
318330 let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(playerAddr))
319331 let currentGameLockedAmountForPlayer = tryGetInteger(addressLockedFundsForGameKey(playerAddr, gameId))
320332 $Tuple2([IntegerEntry(addressTotalLockedFundsKey(playerAddr), (currentTotalLockedFunds - currentGameLockedAmountForPlayer)), IntegerEntry(addressLockedFundsForGameKey(playerAddr, gameId), 0), ScriptTransfer(addressFromStringValue(playerAddr), exitStackAmount, fromBase58String(depositAssetId))], 1)
321333 }
322334
323335
324336
325337 @Callable(i)
326338 func lockFundsForGame (gameId) = {
327339 let pmt = if ((size(i.payments) == 1))
328340 then i.payments[0]
329341 else throw("Please attach exactly one payment")
330342 if ((pmt.assetId != fromBase58String(depositAssetId)))
331343 then throw("You can only deposit USDN")
332344 else {
333345 let callerAddrStr = toBase58String(i.caller.bytes)
334346 let currentTotalLockedFunds = tryGetInteger(addressTotalLockedFundsKey(callerAddrStr))
335347 let currentLockedFundsTotalHistory = tryGetInteger(addressLockedFundsTotalHistoryKey(callerAddrStr))
336348 $Tuple2([IntegerEntry(addressTotalLockedFundsKey(callerAddrStr), (currentTotalLockedFunds + pmt.amount)), IntegerEntry(addressLockedFundsTotalHistoryKey(callerAddrStr), (currentLockedFundsTotalHistory + pmt.amount)), IntegerEntry(addressLockedFundsForGameKey(callerAddrStr, gameId), pmt.amount)], 1)
337349 }
338350 }
339351
340352
341353
342354 @Callable(i)
343355 func withdrawFunds () = {
344356 let callerAddrStr = toBase58String(i.caller.bytes)
345357 let feeCollectorAddr = addressFromStringValue(getStringValue(feeCollectorAddressKey))
346358 let currentAvailableFunds = tryGetInteger(addressAvailableFundsKey(callerAddrStr))
347359 let withdrawFee = fraction(currentAvailableFunds, withdrawFeePercent, 100)
348360 let actualAvailableFunds = (currentAvailableFunds - withdrawFee)
349361 if ((0 >= actualAvailableFunds))
350362 then throw("No available funds to withdraw")
351363 else [IntegerEntry(addressAvailableFundsKey(callerAddrStr), 0), ScriptTransfer(i.caller, actualAvailableFunds, fromBase58String(depositAssetId)), ScriptTransfer(feeCollectorAddr, withdrawFee, fromBase58String(depositAssetId))]
352364 }
353365
354366
355367
356368 @Callable(i)
357369 func setWinnerHeadsUp (gameId,winnerAddrStr,otherPlayerAddr) = if ((i.caller != this))
358370 then throw("Admin Only")
359371 else {
360372 let availableRewardsKey = addressAvailableRewardsKey(winnerAddrStr)
361373 let currentAvailableRewards = tryGetInteger(availableRewardsKey)
362374 let newTicketCountWinner = consumeTicket(winnerAddrStr)
363375 let newTicketCountOtherPlayer = consumeTicket(otherPlayerAddr)
364376 [StringEntry(gameWinnerKey(gameId), winnerAddrStr), IntegerEntry(availableRewardsKey, (currentAvailableRewards + (ticketPrice * 2))), IntegerEntry(getTicketsCountKey(winnerAddrStr), newTicketCountWinner), IntegerEntry(getTicketsCountKey(otherPlayerAddr), newTicketCountOtherPlayer)]
365377 }
366378
367379
368380
369381 @Callable(i)
370382 func withdrawRewards () = {
371383 let callerAddrStr = toBase58String(i.caller.bytes)
372384 let feeCollectorAddr = addressFromStringValue(getStringValue(feeCollectorAddressKey))
373385 let currentAvailableRewards = tryGetInteger(addressAvailableRewardsKey(callerAddrStr))
374386 let withdrawFee = fraction(currentAvailableRewards, withdrawFeePercent, 100)
375387 let actualAvailableRewards = ((currentAvailableRewards - invFee) - withdrawFee)
376388 if ((0 >= currentAvailableRewards))
377389 then throw("No available rewards to withdraw")
378390 else [IntegerEntry(addressAvailableRewardsKey(callerAddrStr), 0), ScriptTransfer(i.caller, actualAvailableRewards, unit), ScriptTransfer(feeCollectorAddr, withdrawFee, unit)]
379391 }
380392
381393
382394
383395 @Callable(i)
384396 func buyTickets () = {
385397 let pmt = if ((size(i.payments) == 1))
386398 then i.payments[0]
387399 else throw("Please attach exactly one payment")
388400 if (isDefined(pmt.assetId))
389401 then throw("Tickets can only ibe purchased in Waves")
390402 else if ((pmt.amount != ticketPrice))
391403 then throw((("The payment must be of exactly " + toString(ticketPriceInt)) + " waves"))
392404 else {
393405 let callerAddrStr = toBase58String(i.caller.bytes)
394406 let currentTicketsCount = tryGetInteger(getTicketsCountKey(callerAddrStr))
395407 $Tuple2([IntegerEntry(getTicketsCountKey(callerAddrStr), (currentTicketsCount + 1))], 1)
396408 }
397409 }
398410
399411
400412 @Verifier(tx)
401413 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
402414

github/deemru/w8io/169f3d6 
50.80 ms