tx · 96Bmj119hwHbRa5eShmBtahyEDE4gF8wAHN4T1eJP8WE 3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx: -0.01600000 Waves 2023.09.08 00:25 [2745503] smart account 3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx > SELF 0.00000000 Waves
{ "type": 13, "id": "96Bmj119hwHbRa5eShmBtahyEDE4gF8wAHN4T1eJP8WE", "fee": 1600000, "feeAssetId": null, "timestamp": 1694121923934, "version": 2, "chainId": 84, "sender": "3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx", "senderPublicKey": "UGqkWsCpv7xRVXkQRXyLd6pWPDtYGXmPip7FxSd1pAu", "proofs": [ "5SSuLWBBHwHQwNehbzroRGTEq8vTLsYQXFci69hPz4ZnoDuhakBHumjxw1DdWW1HGgHtevKCBrEJb9T6xSs8U8iP" ], "script": "base64:BgIkCAISBwoFAQEBAQESABIAEgQKAggBEgMKAQESAwoBARIDCgEBOgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQADWxhc3RUb3VySWRLZXkCDiVzX19sYXN0VG91cklkARVrZXlUb3VyU3RhdGljRGF0YUJ5SWQBA3RJZAkArAICAhYlcyVkX190b3VyU3RhdGljRGF0YV9fCQCkAwEFA3RJZAEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEDdElkCQCsAgICFyVzJWRfX3RvdXJEeW5hbWljRGF0YV9fCQCkAwEFA3RJZAETa2V5U2NvcmVCb2FyZEJ5VG91cgEDdElkCQCsAgICEiVzJWRfX3Njb3JlQm9hcmRfXwkApAMBBQN0SWQBEmtleVN1bVNjb3Jlc0J5VG91cgEDdElkCQCsAgICESVzJWRfX3N1bVNjb3Jlc19fCQCkAwEFA3RJZAEWa2V5VW5wYWlkUmV3YXJkc0J5VG91cgEDdElkCQCsAgICFSVzJWRfX3VucGFpZFJld2FyZHNfXwkApAMBBQN0SWQBG2tleUxhc3RSZWdpc3RlcmVkVG91ckJ5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIgJXMlc19fbGFzdFJlZ2lzdGVyZWRUb3VyQnlEdWNrX18FC2R1Y2tBc3NldElkARxrZXlJc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAiElcyVkJXNfX2lzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18BGWtleUlzQXdhcmRlZEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICHiVzJWQlc19faXNBd2FyZGVkQnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEba2V5TGFzdEF0dGVtcHRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAiAlcyVkJXNfX2xhc3RBdHRlbXB0QnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICHyVzJWQlc19fYmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18BFmtleUJlc3RUeEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICGyVzJWQlc19fYmVzdFR4QnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwAJaWR4U3RhdGljAAAACmlkeER5bmFtaWMAAQATdFN0YXRpY1JlZ2lzdGVyQ29zdAACABJ0U3RhdGljQXR0ZW1wdENvc3QAAwAMdFN0YXRpY1N0YXJ0AAUACnRTdGF0aWNFbmQABgAQdFN0YXRpY051bUdyYW5kcwAHAA50RHluYW1pY1N0YXR1cwABAA90RHluYW1pY0xlYWRlcnMAAgARdER5bmFtaWNXaW5SZXN1bHQAAwAVdER5bmFtaWNUb3RhbFJlZ0NvdW50AAQAFXREeW5hbWljVG90YWxBdHRlbXB0cwAFAQtnZXRUb3VyRGF0YQIMdG91ckNvbnRyYWN0A3RJZAQGc3RhdGljCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQx0b3VyQ29udHJhY3QJARVrZXlUb3VyU3RhdGljRGF0YUJ5SWQBBQN0SWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFA3RJZAIFIGRhdGECAl9fBAdkeW5hbWljCQC8CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQx0b3VyQ29udHJhY3QJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUDdElkCQCsAgIJAKwCAgIZRXJyb3IgcmVhZGluZyB0b3VybmFtZW50IAkApAMBBQN0SWQCBSBkYXRhAgJfXwkAzAgCBQZzdGF0aWMJAMwIAgUHZHluYW1pYwUDbmlsAQ5pc0luVG91cm5hbWVudAIMdG91ckNvbnRyYWN0CGxvY2F0aW9uBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMdG91ckNvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAEA2xvYwkAtQkCBQhsb2NhdGlvbgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFDHRvdXJDb250cmFjdAUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwMDAwkAAAIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFUCQAAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2xvYwUPbG9jSWR4Q29udGluZW50BQZsYXN0SWQHCQAAAgkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwIKSU5QUk9HUkVTUwcJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQNub3cHAAVjaGFpbgkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQAVZGVmYXVsdFJlc3RBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUFFDdXZGYnZoNExrUFVucm5VMXozam5iQTFwOW0zV05odgMJAAACAQFUBQckbWF0Y2gwAiMzTXVta0dHenRDS0FYcFdEcXhrZGRvZnFYU1VicVFrdlNKeQkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18BD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABFJZHhDZmdTdGFraW5nRGFwcAABAA1JZHhDZmdXbGdEYXBwAAQBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAC3dsZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUNSWR4Q2ZnV2xnRGFwcAANd2xnQXNzZXRJZEtleQILd2xnX2Fzc2V0SWQACndsZ0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQt3bGdDb250cmFjdAUNd2xnQXNzZXRJZEtleQITTm90IGluaXRpYWxpemVkIHlldAEIYXNTdHJpbmcBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAW4FByRtYXRjaDAFAW4JAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCmZpeGVkUG9pbnQCA3ZhbAhkZWNpbWFscwQGdGVuUG93CQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQHbG93UGFydAkApAMBCQBqAgUDdmFsBQZ0ZW5Qb3cEBnplcm9lcwkAsAICCQCkAwEFBnRlblBvdwkAZAIAAQkAsQIBBQdsb3dQYXJ0CQCsAgIJAKwCAgkArAICCQCkAwEJAGkCBQN2YWwFBnRlblBvdwIBLgUGemVyb2VzBQdsb3dQYXJ0AQRwYWRMAgN2YWwDbGVuBAR2YWxTCQCkAwEFA3ZhbAQGemVyb2VzCQCwAgIJAKQDAQkAbAYACgAACQBlAgUDbGVuCQCxAgEFBHZhbFMAAAAABQRET1dOAAEJAKwCAgUGemVyb2VzBQR2YWxTABNNQVhUT1VSTkFNRU5UTEVOR1RIAICY/80BAARIT1VSAIDd2wEACmFkbWluc0xpc3QJAMwIAgkApQgBBQR0aGlzCQDMCAIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQRWUyUkVMVUhDRkNCc21TQ05jQko4TjNVUkxWUWVuZGU3AwkAAAIBAVQFByRtYXRjaDACIzNNdEJnSlRhTHhQQjNDN1VKRDFVRThxamtIdGhmS3ZGUVlZCQACAQINVW5rbm93biBjaGFpbgUDbmlsAQpzdGF0aWNEYXRhBwR0eElkDHJlZ2lzdGVyQ29zdAthdHRlbXB0Q29zdAxjcmVhdGlvblRpbWUJc3RhcnRUaW1lB2VuZFRpbWUJbnVtR3JhbmRzCQC5CQIJAMwIAgIOJXMlZCVkJWQlZCVkJWQJAMwIAgUEdHhJZAkAzAgCCQCkAwEFDHJlZ2lzdGVyQ29zdAkAzAgCCQCkAwEFC2F0dGVtcHRDb3N0CQDMCAIJAKQDAQUMY3JlYXRpb25UaW1lCQDMCAIJAKQDAQUJc3RhcnRUaW1lCQDMCAIJAKQDAQUHZW5kVGltZQkAzAgCCQCkAwEFCW51bUdyYW5kcwUDbmlsBQNTRVABC2R5bmFtaWNEYXRhBQZzdGF0dXMHbGVhZGVycwl3aW5SZXN1bHQJdG90YWxSZWdzDXRvdGFsQXR0ZW1wdHMJALoJAgkAzAgCAgolcyVzJWQlZCVkCQDMCAIFBnN0YXR1cwkAzAgCBQdsZWFkZXJzCQDMCAIJAKQDAQUJd2luUmVzdWx0CQDMCAIJAKQDAQUJdG90YWxSZWdzCQDMCAIJAKQDAQUNdG90YWxBdHRlbXB0cwUDbmlsBQNTRVABBnByb2xvZwAJAQVhc0ludAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AgpzYXZlTGFzdFR4BQNuaWwFA25pbAEMZHVja0J5Q2FsbGVyAQZjYWxsZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQUGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBwFpARBjcmVhdGVUb3VybmFtZW50BQlzdGFydFRpbWUHZW5kVGltZQxyZWdpc3RlckNvc3QLYXR0ZW1wdENvc3QJbnVtR3JhbmRzBAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUKYWRtaW5zTGlzdAUGY2FsbGVyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBmxhc3RJZAkAnwgBBQ1sYXN0VG91cklkS2V5BAN0SWQDCQEJaXNEZWZpbmVkAQUGbGFzdElkBApsYXN0VG91cklkCQEFdmFsdWUBBQZsYXN0SWQEB2R5bmFtaWMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFCmxhc3RUb3VySWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFCmxhc3RUb3VySWQCBSBkYXRhBAZzdGF0dXMJAJEDAgkAtQkCBQdkeW5hbWljBQNTRVAFDnREeW5hbWljU3RhdHVzAwkBAiE9AgUGc3RhdHVzAghBUkNISVZFRAkAAgEJAKwCAgIsQ3VycmVudCB0b3VybmVtZW50IGlzIG5vdCBjb21wbGV0ZWQsIHN0YXR1cz0FBnN0YXR1cwkAZAIFCmxhc3RUb3VySWQAAQABBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wAwkAZgIFA25vdwUJc3RhcnRUaW1lCQACAQkArAICCQCsAgIJAKwCAgIKc3RhcnRUaW1lPQkApAMBBQlzdGFydFRpbWUCECA8IGNyZWF0aW9uVGltZT0JAKQDAQUDbm93AwkAZgIFCXN0YXJ0VGltZQUHZW5kVGltZQkAAgEJAKwCAgkArAICCQCsAgICCGVuZFRpbWU9CQCkAwEFB2VuZFRpbWUCDSA8IHN0YXJ0VGltZT0JAKQDAQUJc3RhcnRUaW1lAwkAZgIJAGUCBQdlbmRUaW1lBQlzdGFydFRpbWUFE01BWFRPVVJOQU1FTlRMRU5HVEgJAAIBCQCsAgIJAKwCAgkArAICAh9Ub3VybmFtZW50IHBlcmlvZCBleGNlZWRzIG1heDogCQCkAwEJAGUCBQdlbmRUaW1lBQlzdGFydFRpbWUCAyA+IAkApAMBBRNNQVhUT1VSTkFNRU5UTEVOR1RIAwMJAGcCAAAFDHJlZ2lzdGVyQ29zdAYJAGcCAAAFC2F0dGVtcHRDb3N0CQACAQkArAICCQCsAgIJAKwCAgIkQ29zdCBzaG91bGQgYmUgcG9zaXRpdmUsIGJ1dCBwYXNzZWQgCQCkAwEFDHJlZ2lzdGVyQ29zdAIFIGFuZCAJAKQDAQULYXR0ZW1wdENvc3QDCQBmAgAABQludW1HcmFuZHMJAAIBAi1OdW1iZXIgb2YgR3JhbmQgUHJpemVzIHNob3VsZCBiZSBub24tbmVnYXRpdmUJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUNbGFzdFRvdXJJZEtleQUDdElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlUb3VyU3RhdGljRGF0YUJ5SWQBBQN0SWQJAQpzdGF0aWNEYXRhBwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQxyZWdpc3RlckNvc3QFC2F0dGVtcHRDb3N0BQNub3cFCXN0YXJ0VGltZQUHZW5kVGltZQUJbnVtR3JhbmRzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUDdElkCQELZHluYW1pY0RhdGEFAgdDUkVBVEVEAgEgAAAAAAAABQNuaWwFA3RJZAFpAQhyZWdpc3RlcgAEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGd2xnQW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCFVdMR09MRCBwYXltZW50cyBvbmx5IQMJAQIhPQIFCnBtdEFzc2V0SWQFCndsZ0Fzc2V0SWQJAAIBAhVXTEdPTEQgcGF5bWVudHMgb25seSEEBmxhc3RJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFDWxhc3RUb3VySWRLZXkCFU5vIGFjdGl2ZSB0b3VybmFtZW50cwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFBHRoaXMFBmxhc3RJZAQGc3RhdGljCQCRAwIFBXREYXRhBQlpZHhTdGF0aWMEB2R5bmFtaWMJAJEDAgUFdERhdGEFCmlkeER5bmFtaWMEBnN0YXR1cwkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwMJAQEhAQMDAwkAAAIFBnN0YXR1cwIHQ1JFQVRFRAkAZgIFA25vdwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUMdFN0YXRpY1N0YXJ0BwkAZgIJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQRIT1VSBQNub3cHBgMJAAACBQZzdGF0dXMCCklOUFJPR1JFU1MJAGYCCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUESE9VUgUDbm93BwkAAgECE0Nhbm5vdCByZWdpc3RlciBub3cEB3JlZ0Nvc3QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFE3RTdGF0aWNSZWdpc3RlckNvc3QDCQECIT0CBQZ3bGdBbXQFB3JlZ0Nvc3QJAAIBCQCsAgIJAKwCAgIQTmVlZCBwYXltZW50IG9mIAkBCmZpeGVkUG9pbnQCBQdyZWdDb3N0AAgCByBXTEdPTEQEC2R1Y2tBc3NldElkCQEMZHVja0J5Q2FsbGVyAQgFAWkMb3JpZ2luQ2FsbGVyBA1vbGRTY29yZUJvYXJkCQELdmFsdWVPckVsc2UCCQCiCAEJARNrZXlTY29yZUJvYXJkQnlUb3VyAQUGbGFzdElkAgADAwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEca2V5SXNSZWdpc3RlcmVkQnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQHBgkBCGNvbnRhaW5zAgUNb2xkU2NvcmVCb2FyZAULZHVja0Fzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAgpZb3VyIGR1Y2sgBQtkdWNrQXNzZXRJZAIlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBhdCB0b3VybmFtZW50IAkApAMBBQZsYXN0SWQEEnVwZGF0ZWREeW5hbWljRGF0YQkBC2R5bmFtaWNEYXRhBQIKSU5QUk9HUkVTUwkAkQMCBQdkeW5hbWljBQ90RHluYW1pY0xlYWRlcnMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRF0RHluYW1pY1dpblJlc3VsdAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsUmVnQ291bnQAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEba2V5TGFzdFJlZ2lzdGVyZWRUb3VyQnlEdWNrAQULZHVja0Fzc2V0SWQFBmxhc3RJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkBgkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5U2NvcmVCb2FyZEJ5VG91cgEFBmxhc3RJZAMJAAACBQ1vbGRTY29yZUJvYXJkAgAJAKwCAgULZHVja0Fzc2V0SWQCBDowMDAJAKwCAgkArAICCQCsAgIFDW9sZFNjb3JlQm9hcmQCAV8FC2R1Y2tBc3NldElkAgQ6MDAwCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUGbGFzdElkBRJ1cGRhdGVkRHluYW1pY0RhdGEFA25pbAUMcHJvbG9nUmVzdWx0AWkBCm5ld0F0dGVtcHQABAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cABAtkdWNrQXNzZXRJZAkBDGR1Y2tCeUNhbGxlcgEIBQFpDG9yaWdpbkNhbGxlcgQGbGFzdElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUNbGFzdFRvdXJJZEtleQIVTm8gYWN0aXZlIHRvdXJuYW1lbnRzBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUEdGhpcwUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQGc3RhdHVzCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAwkBASEBAwkAAAIFBnN0YXR1cwIKSU5QUk9HUkVTUwkAZgIJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQRIT1VSBQNub3cHCQACAQIXQXR0ZW1wdCBpcyBub3QgcG9zc2libGUDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkBwkAAgEJAKwCAgkArAICCQCsAgICCllvdXIgZHVjayAFC2R1Y2tBc3NldElkAiEgaXMgbm90IHJlZ2lzdGVyZWQgYXQgdG91cm5hbWVudCAJAKQDAQUGbGFzdElkBBNhdHRlbXB0c0l0ZXJhdG9yS2V5CQEba2V5TGFzdEF0dGVtcHRCeVRvdXJBbmREdWNrAgUGbGFzdElkBQtkdWNrQXNzZXRJZAQLbGFzdEF0dGVtcHQJAJ8IAQUTYXR0ZW1wdHNJdGVyYXRvcktleQQLJHQwNjEwNDY3MzYDCQEBIQEJAQlpc0RlZmluZWQBBQtsYXN0QXR0ZW1wdAkAlAoCAAAAAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIVV0xHT0xEIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUKcG10QXNzZXRJZAUKd2xnQXNzZXRJZAkAAgECFVdMR09MRCBwYXltZW50cyBvbmx5IQQHYXR0Q29zdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUSdFN0YXRpY0F0dGVtcHRDb3N0AwkBAiE9AgUGd2xnQW10BQdhdHRDb3N0CQACAQkArAICCQCsAgICEE5lZWQgcGF5bWVudCBvZiAJAQpmaXhlZFBvaW50AgUHYXR0Q29zdAAIAgcgV0xHT0xECQCUCgIJAGQCCQEFdmFsdWUBBQtsYXN0QXR0ZW1wdAABAAEEDXBheWVkQXR0ZW1wdHMIBQskdDA2MTA0NjczNgJfMQQJaW5jcmVtZW50CAULJHQwNjEwNDY3MzYCXzIEEnVwZGF0ZWREeW5hbWljRGF0YQkBC2R5bmFtaWNEYXRhBQIKSU5QUk9HUkVTUwkAkQMCBQdkeW5hbWljBQ90RHluYW1pY0xlYWRlcnMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRF0RHluYW1pY1dpblJlc3VsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxSZWdDb3VudAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsQXR0ZW1wdHMFCWluY3JlbWVudAQHdG91ckxvYwkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCE2luaXREdWNrVG91ckF0dGVtcHQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2F0dGVtcHRzSXRlcmF0b3JLZXkFDXBheWVkQXR0ZW1wdHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQZsYXN0SWQFEnVwZGF0ZWREeW5hbWljRGF0YQUDbmlsCQDMCAIFDHByb2xvZ1Jlc3VsdAkAzAgCBQ1wYXllZEF0dGVtcHRzCQDMCAIFB3RvdXJMb2MFA25pbAFpAQ5zYXZlRHVja1Jlc3VsdAILZHVja0Fzc2V0SWQLZHVja05ld0Jlc3QDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkAAgECDUFjY2VzcyBkZW5pZWQEBmxhc3RJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFDWxhc3RUb3VySWRLZXkCFU5vIGFjdGl2ZSB0b3VybmFtZW50cwQFdERhdGEJAQtnZXRUb3VyRGF0YQIFBHRoaXMFBmxhc3RJZAQGc3RhdGljCQCRAwIFBXREYXRhBQlpZHhTdGF0aWMEB2R5bmFtaWMJAJEDAgUFdERhdGEFCmlkeER5bmFtaWMEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EDWJlc3RSZXN1bHRLZXkJARprZXlCZXN0UmVzdWx0QnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQEDHN1bVNjb3Jlc0tleQkBEmtleVN1bVNjb3Jlc0J5VG91cgEFBmxhc3RJZAQMb2xkU3VtU2NvcmVzCQELdmFsdWVPckVsc2UCCQCfCAEFDHN1bVNjb3Jlc0tleQAAAwkBDmlzSW5Ub3VybmFtZW50AgUEdGhpcwULY3VyTG9jYXRpb24EC2R1Y2tPbGRCZXN0CQELdmFsdWVPckVsc2UCCQCfCAEFDWJlc3RSZXN1bHRLZXkAAAQIc2NvcmVLZXkJARNrZXlTY29yZUJvYXJkQnlUb3VyAQUGbGFzdElkBA1vbGRTY29yZUJvYXJkCQELdmFsdWVPckVsc2UCCQCiCAEFCHNjb3JlS2V5AgAECyR0MDgyMjk5MzkwAwkAZgIFC2R1Y2tOZXdCZXN0BQtkdWNrT2xkQmVzdAMJAQEhAQkBCGNvbnRhaW5zAgUNb2xkU2NvcmVCb2FyZAULZHVja0Fzc2V0SWQJAAIBCQCsAgICHHNjb3JlQm9hcmQgZG9lcyBub3QgY29udGFpbiAFC2R1Y2tBc3NldElkBAdvbGRCZXN0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwURdER5bmFtaWNXaW5SZXN1bHQEB2xlYWRlcnMJAJEDAgUHZHluYW1pYwUPdER5bmFtaWNMZWFkZXJzBA5vbGRMZWFkZXJzTGlzdAMDCQAAAgUHbGVhZGVycwIABgkAAAIFB2xlYWRlcnMCASAFA25pbAkAvAkCBQdsZWFkZXJzAgEsBA5uZXdMZWFkZXJzTGlzdAMJAGYCBQtkdWNrTmV3QmVzdAUHb2xkQmVzdAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAwMJAGYCBQdvbGRCZXN0BQtkdWNrTmV3QmVzdAYJAQ9jb250YWluc0VsZW1lbnQCBQ5vbGRMZWFkZXJzTGlzdAULZHVja0Fzc2V0SWQFDm9sZExlYWRlcnNMaXN0CQDNCAIFDm9sZExlYWRlcnNMaXN0BQtkdWNrQXNzZXRJZAQSdXBkYXRlZER5bmFtaWNEYXRhCQELZHluYW1pY0RhdGEFAgpJTlBST0dSRVNTCQC6CQIFDm5ld0xlYWRlcnNMaXN0AgEsCQCWAwEJAMwIAgULZHVja05ld0Jlc3QJAMwIAgUHb2xkQmVzdAUDbmlsCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbFJlZ0NvdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbEF0dGVtcHRzBAVwYXJ0cwkAvQkCBQ1vbGRTY29yZUJvYXJkBQtkdWNrQXNzZXRJZAkAlQoDCQCsAgIJAKwCAgkArAICCQCsAgIJAJEDAgUFcGFydHMAAAULZHVja0Fzc2V0SWQCAToJAQRwYWRMAgULZHVja05ld0Jlc3QAAwkAsAICCQCRAwIFBXBhcnRzAAEABAkAZQIJAGQCBQxvbGRTdW1TY29yZXMFC2R1Y2tOZXdCZXN0BQtkdWNrT2xkQmVzdAkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFBmxhc3RJZAUSdXBkYXRlZER5bmFtaWNEYXRhBQNuaWwJAJUKAwUNb2xkU2NvcmVCb2FyZAUMb2xkU3VtU2NvcmVzBQNuaWwEDW5ld1Njb3JlQm9hcmQIBQskdDA4MjI5OTM5MAJfMQQMbmV3U3VtU2NvcmVzCAULJHQwODIyOTkzOTACXzIEDWdsb2JhbEFjdGlvbnMIBQskdDA4MjI5OTM5MAJfMwkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDWJlc3RSZXN1bHRLZXkJAJYDAQkAzAgCBQtkdWNrT2xkQmVzdAkAzAgCBQtkdWNrTmV3QmVzdAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxzdW1TY29yZXNLZXkFDG5ld1N1bVNjb3JlcwkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5QmVzdFR4QnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkAzAgCCQELU3RyaW5nRW50cnkCBQhzY29yZUtleQUNbmV3U2NvcmVCb2FyZAUDbmlsBQ1nbG9iYWxBY3Rpb25zAAAJAJQKAgUDbmlsAAABaQERcHJvY2Vzc1RvdXJuYW1lbnQBA3RJZAQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFCmFkbWluc0xpc3QFBmNhbGxlcgkAAgECEVBlcm1pc3Npb24gZGVuaWVkBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUEdGhpcwUDdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQGc3RhdHVzCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzBA1yZWdpc3RyYXRpb25zCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbFJlZ0NvdW50BAxwYWlkQXR0ZW1wdHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsQXR0ZW1wdHMEB3JlZ0Nvc3QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFE3RTdGF0aWNSZWdpc3RlckNvc3QEB2F0dENvc3QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFEnRTdGF0aWNBdHRlbXB0Q29zdAMJAAACBQZzdGF0dXMCCEFSQ0hJVkVECQACAQkArAICCQCsAgICC1RvdXJuYW1lbnQgCQCkAwEFA3RJZAIUIGlzIGFscmVhZHkgQVJDSElWRUQDAwkAAAIFBnN0YXR1cwIKSU5QUk9HUkVTUwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFA25vdwcJAAIBCQCsAgIJAKwCAgILVG91cm5hbWVudCAJAKQDAQUDdElkAhAgaXMgbm90IG92ZXIgeWV0BBJ1cGRhdGVkRHluYW1pY0RhdGEJAQtkeW5hbWljRGF0YQUCClBST0NFU1NJTkcJAJEDAgUHZHluYW1pYwUPdER5bmFtaWNMZWFkZXJzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwURdER5bmFtaWNXaW5SZXN1bHQFDXJlZ2lzdHJhdGlvbnMFDHBhaWRBdHRlbXB0cwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUDdElkBRJ1cGRhdGVkRHluYW1pY0RhdGEJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlVbnBhaWRSZXdhcmRzQnlUb3VyAQUDdElkCQBpAgkAZAIJAGgCBQ1yZWdpc3RyYXRpb25zBQdyZWdDb3N0CQBoAgUMcGFpZEF0dGVtcHRzBQdhdHRDb3N0AAIFA25pbAAAAWkBEGZpbmlzaFRvdXJuYW1lbnQBA3RJZAQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFCmFkbWluc0xpc3QFBmNhbGxlcgkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUEdGhpcwUDdElkBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljBAZzdGF0dXMJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMDCQAAAgUGc3RhdHVzAghBUkNISVZFRAkAAgEJAKwCAgkArAICAgtUb3VybmFtZW50IAkApAMBBQN0SWQCFCBpcyBhbHJlYWR5IEFSQ0hJVkVEBBJ1cGRhdGVkRHluYW1pY0RhdGEJAQtkeW5hbWljRGF0YQUCCEFSQ0hJVkVECQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbFJlZ0NvdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbEF0dGVtcHRzCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQFEnVwZGF0ZWREeW5hbWljRGF0YQUDbmlsAAABaQEKY2xhaW1Qcml6ZQEDdElkBAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBXREYXRhCQELZ2V0VG91ckRhdGECBQR0aGlzBQN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljBAZzdGF0dXMJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMDCQECIT0CBQZzdGF0dXMCClBST0NFU1NJTkcJAAIBCQCsAgIJAKwCAgILVG91cm5hbWVudCAJAKQDAQUDdElkAhIgaXMgbm90IFBST0NFU1NJTkcEDXJlZ2lzdHJhdGlvbnMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsUmVnQ291bnQEDHBhaWRBdHRlbXB0cwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwQHcmVnQ29zdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUTdFN0YXRpY1JlZ2lzdGVyQ29zdAQHYXR0Q29zdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUSdFN0YXRpY0F0dGVtcHRDb3N0BAphd2FyZEZ1bmRzCQBpAgkAZAIJAGgCBQ1yZWdpc3RyYXRpb25zBQdyZWdDb3N0CQBoAgUMcGFpZEF0dGVtcHRzBQdhdHRDb3N0AAIECXVucGFpZEtleQkBFmtleVVucGFpZFJld2FyZHNCeVRvdXIBBQN0SWQEC3VucGFpZEZ1bmRzCQELdmFsdWVPckVsc2UCCQCfCAEFCXVucGFpZEtleQAABAtkdWNrQXNzZXRJZAkBDGR1Y2tCeUNhbGxlcgEIBQFpDG9yaWdpbkNhbGxlcgQKc2NvcmVCb2FyZAkBC3ZhbHVlT3JFbHNlAgkAoggBCQETa2V5U2NvcmVCb2FyZEJ5VG91cgEFA3RJZAIAAwkBASEBCQELdmFsdWVPckVsc2UCCQCgCAEJARxrZXlJc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrAgUDdElkBQtkdWNrQXNzZXRJZAcJAAIBCQCsAgIJAKwCAgkArAICAgpZb3VyIGR1Y2sgBQtkdWNrQXNzZXRJZAIhIGlzIG5vdCByZWdpc3RlcmVkIGF0IHRvdXJuYW1lbnQgCQCkAwEFA3RJZAQNYmVzdFJlc3VsdEtleQkBGmtleUJlc3RSZXN1bHRCeVRvdXJBbmREdWNrAgUDdElkBQtkdWNrQXNzZXRJZAQIZHVja0Jlc3QJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNYmVzdFJlc3VsdEtleQAAAwkAAAIFCGR1Y2tCZXN0AAAJAAIBAhhZb3VyIGR1Y2sgZ290IHplcm8gc2NvcmUECmF3YXJkZWRLZXkJARlrZXlJc0F3YXJkZWRCeVRvdXJBbmREdWNrAgUDdElkBQtkdWNrQXNzZXRJZAMJAQt2YWx1ZU9yRWxzZQIJAKAIAQUKYXdhcmRlZEtleQcJAAIBCQCsAgIJAKwCAgkArAICAgpZb3VyIGR1Y2sgBQtkdWNrQXNzZXRJZAIiIGlzIGFscmVhZHkgYXdhcmRlZCBhdCB0b3VybmFtZW50IAkApAMBBQN0SWQEDHN1bVNjb3Jlc0tleQkBEmtleVN1bVNjb3Jlc0J5VG91cgEFA3RJZAQJc3VtU2NvcmVzCQELdmFsdWVPckVsc2UCCQCfCAEFDHN1bVNjb3Jlc0tleQAABAdsZWFkZXJzCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljTGVhZGVycwQLbGVhZGVyc0xpc3QDAwkAAAIFB2xlYWRlcnMCAAYJAAACBQdsZWFkZXJzAgEgBQNuaWwJALwJAgUHbGVhZGVycwIBLAQKbnVtTGVhZGVycwkAkAMBBQtsZWFkZXJzTGlzdAMJAAACBQpudW1MZWFkZXJzAAAJAAIBCQCsAgICGU5vIGxlYWRlcnMgYXQgdG91cm5hbWVudCAJAKQDAQUDdElkBAludW1HcmFuZHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFEHRTdGF0aWNOdW1HcmFuZHMECXdpblJlc3VsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0BA9zdW1MZWFkZXJTY29yZXMDCQBmAgUKbnVtTGVhZGVycwUJbnVtR3JhbmRzAAADCQEPY29udGFpbnNFbGVtZW50AgULbGVhZGVyc0xpc3QFC2R1Y2tBc3NldElkCQACAQIwQXMgb25lIG9mIHdpbm5lcnMsIHlvdSB3aWxsIGJlIGF3YXJkZWQgYnkgYWRtaW5zCQBoAgUKbnVtTGVhZGVycwUJd2luUmVzdWx0BAp5b3VyQW1vdW50CQCXAwEJAMwIAgkAawMFCGR1Y2tCZXN0BQphd2FyZEZ1bmRzCQBlAgUJc3VtU2NvcmVzBQ9zdW1MZWFkZXJTY29yZXMJAMwIAgULdW5wYWlkRnVuZHMFA25pbAQPbmV3VW5wYWlkQW1vdW50CQBlAgULdW5wYWlkRnVuZHMFCnlvdXJBbW91bnQEEnVwZGF0ZWREeW5hbWljRGF0YQkBC2R5bmFtaWNEYXRhBQIIQVJDSElWRUQJAJEDAgUHZHluYW1pYwUPdER5bmFtaWNMZWFkZXJzBQl3aW5SZXN1bHQFDXJlZ2lzdHJhdGlvbnMFDHBhaWRBdHRlbXB0cwQNYXJjaGl2ZUFjdGlvbgMJAGcCAAAFD25ld1VucGFpZEFtb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFA3RJZAUSdXBkYXRlZER5bmFtaWNEYXRhBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQp5b3VyQW1vdW50BQp3bGdBc3NldElkCQDMCAIJAQxCb29sZWFuRW50cnkCBQphd2FyZGVkS2V5BgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJdW5wYWlkS2V5BQ9uZXdVbnBhaWRBbW91bnQFA25pbAUNYXJjaGl2ZUFjdGlvbgAAAIkF/zA=", "height": 2745503, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BCacf5hMi9hLL11KHiSLFv2k2eMnq8Ujuszg7H8Az7AX Next: 2Lt9XTqmK62tLhMwRwXrXxvMvCPGqqyLGMBZX1v1aSnj Diff:
Old | New | Differences | |
---|---|---|---|
45 | 45 | func s (j,g) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(j), g], "__") | |
46 | 46 | ||
47 | 47 | ||
48 | - | ||
48 | + | func t (j,g) = makeString(["%s%d%s__bestTxByTourAndDuck", toString(j), g], "__") | |
49 | 49 | ||
50 | - | let u = 1 | |
51 | 50 | ||
52 | - | let | |
51 | + | let u = 0 | |
53 | 52 | ||
54 | - | let | |
53 | + | let v = 1 | |
55 | 54 | ||
56 | - | let | |
55 | + | let w = 2 | |
57 | 56 | ||
58 | - | let | |
57 | + | let x = 3 | |
59 | 58 | ||
60 | - | let | |
59 | + | let y = 5 | |
61 | 60 | ||
62 | - | let | |
61 | + | let z = 6 | |
63 | 62 | ||
64 | - | let | |
63 | + | let A = 7 | |
65 | 64 | ||
66 | - | let | |
65 | + | let B = 1 | |
67 | 66 | ||
68 | - | let | |
67 | + | let C = 2 | |
69 | 68 | ||
70 | - | let | |
69 | + | let D = 3 | |
71 | 70 | ||
72 | - | func F (G,j) = { | |
73 | - | let H = split(valueOrErrorMessage(getString(G, i(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
74 | - | let I = split_4C(valueOrErrorMessage(getString(G, k(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
75 | - | [H, I] | |
71 | + | let E = 4 | |
72 | + | ||
73 | + | let F = 5 | |
74 | + | ||
75 | + | func G (H,j) = { | |
76 | + | let I = split(valueOrErrorMessage(getString(H, i(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
77 | + | let J = split_4C(valueOrErrorMessage(getString(H, k(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
78 | + | [I, J] | |
76 | 79 | } | |
77 | 80 | ||
78 | 81 | ||
79 | - | func | |
80 | - | let | |
81 | - | let | |
82 | - | let | |
83 | - | let | |
84 | - | let | |
85 | - | let | |
86 | - | if (if (if (( | |
87 | - | then (parseIntValue( | |
82 | + | func K (H,L) = { | |
83 | + | let M = valueOrElse(getInteger(H, h), 0) | |
84 | + | let N = split(L, "_") | |
85 | + | let O = lastBlock.timestamp | |
86 | + | let P = G(H, M) | |
87 | + | let I = P[u] | |
88 | + | let J = P[v] | |
89 | + | if (if (if ((N[c] == "T")) | |
90 | + | then (parseIntValue(N[b]) == M) | |
88 | 91 | else false) | |
89 | - | then ( | |
92 | + | then (J[B] == "INPROGRESS") | |
90 | 93 | else false) | |
91 | - | then (parseIntValue( | |
94 | + | then (parseIntValue(I[z]) > O) | |
92 | 95 | else false | |
93 | 96 | } | |
94 | 97 | ||
95 | 98 | ||
96 | - | let | |
99 | + | let Q = take(drop(this.bytes, 1), 1) | |
97 | 100 | ||
98 | - | let | |
99 | - | let | |
100 | - | if ((base58'2W' == | |
101 | + | let R = { | |
102 | + | let S = Q | |
103 | + | if ((base58'2W' == S)) | |
101 | 104 | then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv" | |
102 | - | else if ((base58'2T' == | |
105 | + | else if ((base58'2T' == S)) | |
103 | 106 | then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy" | |
104 | 107 | else throw("Unknown chain") | |
105 | 108 | } | |
106 | 109 | ||
107 | - | let | |
110 | + | let T = "__" | |
108 | 111 | ||
109 | - | func | |
112 | + | func U (V,W) = valueOrErrorMessage(getString(V, W), makeString(["mandatory ", toString(V), ".", W, " is not defined"], "")) | |
110 | 113 | ||
111 | 114 | ||
112 | - | let | |
115 | + | let X = 1 | |
113 | 116 | ||
114 | - | let | |
117 | + | let Y = 4 | |
115 | 118 | ||
116 | - | func | |
119 | + | func Z () = "%s__restConfig" | |
117 | 120 | ||
118 | 121 | ||
119 | - | func | |
122 | + | func aa () = "%s__restAddr" | |
120 | 123 | ||
121 | 124 | ||
122 | - | func | |
125 | + | func ab (ac) = split_4C(U(ac, Z()), T) | |
123 | 126 | ||
124 | 127 | ||
125 | - | func | |
128 | + | func ad (ae,af) = valueOrErrorMessage(addressFromString(ae[af]), ("Rest cfg doesn't contain address at index " + toString(af))) | |
126 | 129 | ||
127 | 130 | ||
128 | - | let | |
131 | + | let ag = addressFromStringValue(valueOrElse(getString(this, aa()), R)) | |
129 | 132 | ||
130 | - | let | |
133 | + | let ae = ab(ag) | |
131 | 134 | ||
132 | - | let | |
135 | + | let ah = ad(ae, X) | |
133 | 136 | ||
134 | - | let | |
137 | + | let ai = ad(ae, Y) | |
135 | 138 | ||
136 | - | let | |
139 | + | let aj = "wlg_assetId" | |
137 | 140 | ||
138 | - | let | |
141 | + | let ak = valueOrErrorMessage(getBinary(ai, aj), "Not initialized yet") | |
139 | 142 | ||
140 | - | func | |
141 | - | let | |
142 | - | if ($isInstanceOf( | |
143 | + | func al (am) = { | |
144 | + | let S = am | |
145 | + | if ($isInstanceOf(S, "String")) | |
143 | 146 | then { | |
144 | - | let | |
145 | - | | |
147 | + | let an = S | |
148 | + | an | |
146 | 149 | } | |
147 | 150 | else throw("fail to cast into String") | |
148 | 151 | } | |
149 | 152 | ||
150 | 153 | ||
151 | - | func | |
152 | - | let | |
153 | - | if ($isInstanceOf( | |
154 | + | func ao (am) = { | |
155 | + | let S = am | |
156 | + | if ($isInstanceOf(S, "Int")) | |
154 | 157 | then { | |
155 | - | let | |
156 | - | | |
158 | + | let ap = S | |
159 | + | ap | |
157 | 160 | } | |
158 | 161 | else throw("fail to cast into Int") | |
159 | 162 | } | |
160 | 163 | ||
161 | 164 | ||
162 | - | func | |
163 | - | let | |
164 | - | let | |
165 | - | let | |
166 | - | (((toString(( | |
165 | + | func aq (ar,as) = { | |
166 | + | let at = pow(10, 0, as, 0, 0, DOWN) | |
167 | + | let au = toString((ar % at)) | |
168 | + | let av = drop(toString(at), (1 + size(au))) | |
169 | + | (((toString((ar / at)) + ".") + av) + au) | |
167 | 170 | } | |
168 | 171 | ||
169 | 172 | ||
170 | - | func | |
171 | - | let | |
172 | - | let | |
173 | - | ( | |
173 | + | func aw (ar,ax) = { | |
174 | + | let ay = toString(ar) | |
175 | + | let av = drop(toString(pow(10, 0, (ax - size(ay)), 0, 0, DOWN)), 1) | |
176 | + | (av + ay) | |
174 | 177 | } | |
175 | 178 | ||
176 | 179 | ||
177 | - | let | |
180 | + | let az = 432000000 | |
178 | 181 | ||
179 | - | let | |
182 | + | let aA = 3600000 | |
180 | 183 | ||
181 | - | let | |
182 | - | let | |
183 | - | if ((base58'2W' == | |
184 | + | let aB = [toString(this), { | |
185 | + | let S = Q | |
186 | + | if ((base58'2W' == S)) | |
184 | 187 | then "3PEe2RELUHCFCBsmSCNcBJ8N3URLVQende7" | |
185 | - | else if ((base58'2T' == | |
188 | + | else if ((base58'2T' == S)) | |
186 | 189 | then "3MtBgJTaLxPB3C7UJD1UE8qjkHthfKvFQYY" | |
187 | 190 | else throw("Unknown chain") | |
188 | 191 | }] | |
189 | 192 | ||
190 | - | func | |
193 | + | func aC (aD,aE,aF,aG,aH,aI,aJ) = makeString(["%s%d%d%d%d%d%d", aD, toString(aE), toString(aF), toString(aG), toString(aH), toString(aI), toString(aJ)], T) | |
191 | 194 | ||
192 | 195 | ||
193 | - | func | |
196 | + | func aK (aL,aM,aN,aO,aP) = makeString_2C(["%s%s%d%d%d", aL, aM, toString(aN), toString(aO), toString(aP)], T) | |
194 | 197 | ||
195 | 198 | ||
196 | - | func | |
199 | + | func aQ () = ao(invoke(ah, "saveLastTx", nil, nil)) | |
197 | 200 | ||
198 | 201 | ||
199 | - | func | |
202 | + | func aR (aS) = valueOrErrorMessage(getString(ah, d(toString(aS))), "You don't have a duck staked") | |
200 | 203 | ||
201 | 204 | ||
202 | - | @Callable( | |
203 | - | func createTournament ( | |
204 | - | let | |
205 | - | if (!(containsElement( | |
205 | + | @Callable(aT) | |
206 | + | func createTournament (aH,aI,aE,aF,aJ) = { | |
207 | + | let aS = toString(aT.caller) | |
208 | + | if (!(containsElement(aB, aS))) | |
206 | 209 | then throw("Permission denied") | |
207 | 210 | else { | |
208 | - | let | |
209 | - | let j = if (isDefined( | |
211 | + | let M = getInteger(h) | |
212 | + | let j = if (isDefined(M)) | |
210 | 213 | then { | |
211 | - | let | |
212 | - | let | |
213 | - | let | |
214 | - | if (( | |
215 | - | then throw(("Current tournement is not completed, status=" + | |
216 | - | else ( | |
214 | + | let aU = value(M) | |
215 | + | let J = valueOrErrorMessage(getString(k(aU)), (("Error reading tournament " + toString(aU)) + " data")) | |
216 | + | let aL = split(J, T)[B] | |
217 | + | if ((aL != "ARCHIVED")) | |
218 | + | then throw(("Current tournement is not completed, status=" + aL)) | |
219 | + | else (aU + 1) | |
217 | 220 | } | |
218 | 221 | else 1 | |
219 | - | let | |
220 | - | if (( | |
221 | - | then throw(((("startTime=" + toString( | |
222 | - | else if (( | |
223 | - | then throw(((("endTime=" + toString( | |
224 | - | else if ((( | |
225 | - | then throw(((("Tournament period exceeds max: " + toString(( | |
226 | - | else if (if ((0 >= | |
222 | + | let O = lastBlock.timestamp | |
223 | + | if ((O > aH)) | |
224 | + | then throw(((("startTime=" + toString(aH)) + " < creationTime=") + toString(O))) | |
225 | + | else if ((aH > aI)) | |
226 | + | then throw(((("endTime=" + toString(aI)) + " < startTime=") + toString(aH))) | |
227 | + | else if (((aI - aH) > az)) | |
228 | + | then throw(((("Tournament period exceeds max: " + toString((aI - aH))) + " > ") + toString(az))) | |
229 | + | else if (if ((0 >= aE)) | |
227 | 230 | then true | |
228 | - | else (0 >= | |
229 | - | then throw(((("Cost should be positive, but passed " + toString( | |
230 | - | else if ((0 > | |
231 | + | else (0 >= aF)) | |
232 | + | then throw(((("Cost should be positive, but passed " + toString(aE)) + " and ") + toString(aF))) | |
233 | + | else if ((0 > aJ)) | |
231 | 234 | then throw("Number of Grand Prizes should be non-negative") | |
232 | - | else $Tuple2([IntegerEntry(h, j), StringEntry(i(j), | |
235 | + | else $Tuple2([IntegerEntry(h, j), StringEntry(i(j), aC(toBase58String(aT.transactionId), aE, aF, O, aH, aI, aJ)), StringEntry(k(j), aK("CREATED", " ", 0, 0, 0))], j) | |
233 | 236 | } | |
234 | 237 | } | |
235 | 238 | ||
236 | 239 | ||
237 | 240 | ||
238 | - | @Callable( | |
241 | + | @Callable(aT) | |
239 | 242 | func register () = { | |
240 | - | let | |
241 | - | if ((size( | |
243 | + | let aV = aQ() | |
244 | + | if ((size(aT.payments) != 1)) | |
242 | 245 | then throw("exactly 1 payment must be attached") | |
243 | 246 | else { | |
244 | - | let | |
245 | - | let | |
246 | - | let | |
247 | - | if (( | |
247 | + | let aW = aT.payments[0] | |
248 | + | let aX = aW.amount | |
249 | + | let aY = valueOrErrorMessage(aW.assetId, "WLGOLD payments only!") | |
250 | + | if ((aY != ak)) | |
248 | 251 | then throw("WLGOLD payments only!") | |
249 | 252 | else { | |
250 | - | let | |
251 | - | let | |
252 | - | let | |
253 | - | let | |
254 | - | let | |
255 | - | let | |
256 | - | if (!(if (if (if (( | |
257 | - | then ( | |
253 | + | let M = valueOrErrorMessage(getInteger(h), "No active tournaments") | |
254 | + | let O = lastBlock.timestamp | |
255 | + | let P = G(this, M) | |
256 | + | let I = P[u] | |
257 | + | let J = P[v] | |
258 | + | let aL = J[B] | |
259 | + | if (!(if (if (if ((aL == "CREATED")) | |
260 | + | then (O > parseIntValue(I[y])) | |
258 | 261 | else false) | |
259 | - | then ((parseIntValue( | |
262 | + | then ((parseIntValue(I[z]) - aA) > O) | |
260 | 263 | else false) | |
261 | 264 | then true | |
262 | - | else if (( | |
263 | - | then ((parseIntValue( | |
265 | + | else if ((aL == "INPROGRESS")) | |
266 | + | then ((parseIntValue(I[z]) - aA) > O) | |
264 | 267 | else false)) | |
265 | 268 | then throw("Cannot register now") | |
266 | 269 | else { | |
267 | - | let | |
268 | - | if (( | |
269 | - | then throw((("Need payment of " + | |
270 | + | let aZ = parseIntValue(I[w]) | |
271 | + | if ((aX != aZ)) | |
272 | + | then throw((("Need payment of " + aq(aZ, 8)) + " WLGOLD")) | |
270 | 273 | else { | |
271 | - | let g = | |
272 | - | let | |
273 | - | if (if (valueOrElse(getBoolean(p( | |
274 | + | let g = aR(aT.originCaller) | |
275 | + | let ba = valueOrElse(getString(l(M)), "") | |
276 | + | if (if (valueOrElse(getBoolean(p(M, g)), false)) | |
274 | 277 | then true | |
275 | - | else contains( | |
276 | - | then throw(((("Your duck " + g) + " is already registered at tournament ") + toString( | |
278 | + | else contains(ba, g)) | |
279 | + | then throw(((("Your duck " + g) + " is already registered at tournament ") + toString(M))) | |
277 | 280 | else { | |
278 | - | let | |
279 | - | $Tuple2([IntegerEntry(o(g), | |
281 | + | let bb = aK("INPROGRESS", J[C], parseIntValue(J[D]), (parseIntValue(J[E]) + 1), parseIntValue(J[F])) | |
282 | + | $Tuple2([IntegerEntry(o(g), M), BooleanEntry(p(M, g), true), StringEntry(l(M), if ((ba == "")) | |
280 | 283 | then (g + ":000") | |
281 | - | else ((( | |
284 | + | else (((ba + "_") + g) + ":000")), StringEntry(k(M), bb)], aV) | |
282 | 285 | } | |
283 | 286 | } | |
284 | 287 | } | |
288 | 291 | ||
289 | 292 | ||
290 | 293 | ||
291 | - | @Callable( | |
294 | + | @Callable(aT) | |
292 | 295 | func newAttempt () = { | |
293 | - | let | |
294 | - | let g = | |
295 | - | let | |
296 | - | let | |
297 | - | let | |
298 | - | let | |
299 | - | let | |
300 | - | let | |
301 | - | if (!(if (( | |
302 | - | then ((parseIntValue( | |
296 | + | let aV = aQ() | |
297 | + | let g = aR(aT.originCaller) | |
298 | + | let M = valueOrErrorMessage(getInteger(h), "No active tournaments") | |
299 | + | let O = lastBlock.timestamp | |
300 | + | let P = G(this, M) | |
301 | + | let I = P[u] | |
302 | + | let J = P[v] | |
303 | + | let aL = J[B] | |
304 | + | if (!(if ((aL == "INPROGRESS")) | |
305 | + | then ((parseIntValue(I[z]) - aA) > O) | |
303 | 306 | else false)) | |
304 | 307 | then throw("Attempt is not possible") | |
305 | - | else if (!(valueOrElse(getBoolean(p( | |
306 | - | then throw(((("Your duck " + g) + " is not registered at tournament ") + toString( | |
308 | + | else if (!(valueOrElse(getBoolean(p(M, g)), false))) | |
309 | + | then throw(((("Your duck " + g) + " is not registered at tournament ") + toString(M))) | |
307 | 310 | else { | |
308 | - | let | |
309 | - | let | |
310 | - | let | |
311 | + | let bc = r(M, g) | |
312 | + | let bd = getInteger(bc) | |
313 | + | let be = if (!(isDefined(bd))) | |
311 | 314 | then $Tuple2(0, 0) | |
312 | - | else if ((size( | |
315 | + | else if ((size(aT.payments) != 1)) | |
313 | 316 | then throw("exactly 1 payment must be attached") | |
314 | 317 | else { | |
315 | - | let | |
316 | - | let | |
317 | - | let | |
318 | - | if (( | |
318 | + | let aW = aT.payments[0] | |
319 | + | let aX = aW.amount | |
320 | + | let aY = valueOrErrorMessage(aW.assetId, "WLGOLD payments only!") | |
321 | + | if ((aY != ak)) | |
319 | 322 | then throw("WLGOLD payments only!") | |
320 | 323 | else { | |
321 | - | let | |
322 | - | if (( | |
323 | - | then throw((("Need payment of " + | |
324 | - | else $Tuple2((value( | |
324 | + | let bf = parseIntValue(I[x]) | |
325 | + | if ((aX != bf)) | |
326 | + | then throw((("Need payment of " + aq(bf, 8)) + " WLGOLD")) | |
327 | + | else $Tuple2((value(bd) + 1), 1) | |
325 | 328 | } | |
326 | 329 | } | |
327 | - | let | |
328 | - | let | |
329 | - | let | |
330 | - | let | |
331 | - | $Tuple2([IntegerEntry( | |
330 | + | let bg = be._1 | |
331 | + | let bh = be._2 | |
332 | + | let bb = aK("INPROGRESS", J[C], parseIntValue(J[D]), parseIntValue(J[E]), (parseIntValue(J[F]) + bh)) | |
333 | + | let bi = al(invoke(ah, "initDuckTourAttempt", [g], nil)) | |
334 | + | $Tuple2([IntegerEntry(bc, bg), StringEntry(k(M), bb)], [aV, bg, bi]) | |
332 | 335 | } | |
333 | 336 | } | |
334 | 337 | ||
335 | 338 | ||
336 | 339 | ||
337 | - | @Callable( | |
338 | - | func saveDuckResult (g, | |
340 | + | @Callable(aT) | |
341 | + | func saveDuckResult (g,bj) = if ((aT.caller != ah)) | |
339 | 342 | then throw("Access denied") | |
340 | 343 | else { | |
341 | - | let | |
342 | - | let | |
343 | - | let | |
344 | - | let | |
345 | - | let | |
346 | - | let | |
347 | - | let | |
348 | - | let | |
349 | - | if ( | |
344 | + | let M = valueOrErrorMessage(getInteger(h), "No active tournaments") | |
345 | + | let P = G(this, M) | |
346 | + | let I = P[u] | |
347 | + | let J = P[v] | |
348 | + | let bk = valueOrElse(getString(ah, f(g)), a) | |
349 | + | let bl = s(M, g) | |
350 | + | let bm = m(M) | |
351 | + | let bn = valueOrElse(getInteger(bm), 0) | |
352 | + | if (K(this, bk)) | |
350 | 353 | then { | |
351 | - | let | |
352 | - | let | |
353 | - | let | |
354 | - | let | |
355 | - | then if (!(contains( | |
354 | + | let bo = valueOrElse(getInteger(bl), 0) | |
355 | + | let bp = l(M) | |
356 | + | let ba = valueOrElse(getString(bp), "") | |
357 | + | let bq = if ((bj > bo)) | |
358 | + | then if (!(contains(ba, g))) | |
356 | 359 | then throw(("scoreBoard does not contain " + g)) | |
357 | 360 | else { | |
358 | - | let | |
359 | - | let | |
360 | - | let | |
361 | + | let br = parseIntValue(J[D]) | |
362 | + | let aM = J[C] | |
363 | + | let bs = if (if ((aM == "")) | |
361 | 364 | then true | |
362 | - | else ( | |
365 | + | else (aM == " ")) | |
363 | 366 | then nil | |
364 | - | else split_4C( | |
365 | - | let | |
367 | + | else split_4C(aM, ",") | |
368 | + | let bt = if ((bj > br)) | |
366 | 369 | then [g] | |
367 | - | else if (if (( | |
370 | + | else if (if ((br > bj)) | |
368 | 371 | then true | |
369 | - | else containsElement( | |
370 | - | then | |
371 | - | else ( | |
372 | - | let | |
373 | - | let | |
374 | - | $Tuple3((((( | |
372 | + | else containsElement(bs, g)) | |
373 | + | then bs | |
374 | + | else (bs :+ g) | |
375 | + | let bb = aK("INPROGRESS", makeString_2C(bt, ","), max([bj, br]), parseIntValue(J[E]), parseIntValue(J[F])) | |
376 | + | let bu = split_51C(ba, g) | |
377 | + | $Tuple3(((((bu[0] + g) + ":") + aw(bj, 3)) + drop(bu[1], 4)), ((bn + bj) - bo), [StringEntry(k(M), bb)]) | |
375 | 378 | } | |
376 | - | else $Tuple3( | |
377 | - | let | |
378 | - | let | |
379 | - | let | |
380 | - | $Tuple2(([IntegerEntry( | |
379 | + | else $Tuple3(ba, bn, nil) | |
380 | + | let bv = bq._1 | |
381 | + | let bw = bq._2 | |
382 | + | let bx = bq._3 | |
383 | + | $Tuple2(([IntegerEntry(bl, max([bo, bj])), IntegerEntry(bm, bw), StringEntry(t(M, g), toBase58String(aT.transactionId)), StringEntry(bp, bv)] ++ bx), 0) | |
381 | 384 | } | |
382 | 385 | else $Tuple2(nil, 0) | |
383 | 386 | } | |
384 | 387 | ||
385 | 388 | ||
386 | 389 | ||
387 | - | @Callable( | |
390 | + | @Callable(aT) | |
388 | 391 | func processTournament (j) = { | |
389 | - | let | |
390 | - | if (!(containsElement( | |
392 | + | let aS = toString(aT.caller) | |
393 | + | if (!(containsElement(aB, aS))) | |
391 | 394 | then throw("Permission denied") | |
392 | 395 | else { | |
393 | - | let | |
394 | - | let | |
395 | - | let | |
396 | - | let | |
397 | - | let | |
398 | - | let | |
399 | - | let | |
400 | - | let | |
401 | - | let | |
402 | - | if (( | |
396 | + | let O = lastBlock.timestamp | |
397 | + | let P = G(this, j) | |
398 | + | let I = P[u] | |
399 | + | let J = P[v] | |
400 | + | let aL = J[B] | |
401 | + | let by = parseIntValue(J[E]) | |
402 | + | let bz = parseIntValue(J[F]) | |
403 | + | let aZ = parseIntValue(I[w]) | |
404 | + | let bf = parseIntValue(I[x]) | |
405 | + | if ((aL == "ARCHIVED")) | |
403 | 406 | then throw((("Tournament " + toString(j)) + " is already ARCHIVED")) | |
404 | - | else if (if (( | |
405 | - | then (parseIntValue( | |
407 | + | else if (if ((aL == "INPROGRESS")) | |
408 | + | then (parseIntValue(I[z]) > O) | |
406 | 409 | else false) | |
407 | 410 | then throw((("Tournament " + toString(j)) + " is not over yet")) | |
408 | 411 | else { | |
409 | - | let | |
410 | - | $Tuple2([StringEntry(k(j), | |
412 | + | let bb = aK("PROCESSING", J[C], parseIntValue(J[D]), by, bz) | |
413 | + | $Tuple2([StringEntry(k(j), bb), IntegerEntry(n(j), (((by * aZ) + (bz * bf)) / 2))], 0) | |
411 | 414 | } | |
412 | 415 | } | |
413 | 416 | } | |
414 | 417 | ||
415 | 418 | ||
416 | 419 | ||
417 | - | @Callable( | |
420 | + | @Callable(aT) | |
418 | 421 | func finishTournament (j) = { | |
419 | - | let | |
420 | - | if (!(containsElement( | |
422 | + | let aS = toString(aT.caller) | |
423 | + | if (!(containsElement(aB, aS))) | |
421 | 424 | then throw("Permission denied") | |
422 | 425 | else { | |
423 | - | let | |
424 | - | let | |
425 | - | let | |
426 | - | if (( | |
426 | + | let P = G(this, j) | |
427 | + | let J = P[v] | |
428 | + | let aL = J[B] | |
429 | + | if ((aL == "ARCHIVED")) | |
427 | 430 | then throw((("Tournament " + toString(j)) + " is already ARCHIVED")) | |
428 | 431 | else { | |
429 | - | let | |
430 | - | $Tuple2([StringEntry(k(j), | |
432 | + | let bb = aK("ARCHIVED", J[C], parseIntValue(J[D]), parseIntValue(J[E]), parseIntValue(J[F])) | |
433 | + | $Tuple2([StringEntry(k(j), bb)], 0) | |
431 | 434 | } | |
432 | 435 | } | |
433 | 436 | } | |
434 | 437 | ||
435 | 438 | ||
436 | 439 | ||
437 | - | @Callable( | |
440 | + | @Callable(aT) | |
438 | 441 | func claimPrize (j) = { | |
439 | - | let | |
440 | - | if ((size( | |
442 | + | let aV = aQ() | |
443 | + | if ((size(aT.payments) != 0)) | |
441 | 444 | then throw("No payments required") | |
442 | 445 | else { | |
443 | - | let | |
444 | - | let | |
445 | - | let | |
446 | - | let | |
447 | - | if (( | |
446 | + | let P = G(this, j) | |
447 | + | let I = P[u] | |
448 | + | let J = P[v] | |
449 | + | let aL = J[B] | |
450 | + | if ((aL != "PROCESSING")) | |
448 | 451 | then throw((("Tournament " + toString(j)) + " is not PROCESSING")) | |
449 | 452 | else { | |
450 | - | let | |
451 | - | let | |
452 | - | let | |
453 | - | let | |
454 | - | let | |
455 | - | let | |
456 | - | let | |
457 | - | let g = | |
458 | - | let | |
453 | + | let by = parseIntValue(J[E]) | |
454 | + | let bz = parseIntValue(J[F]) | |
455 | + | let aZ = parseIntValue(I[w]) | |
456 | + | let bf = parseIntValue(I[x]) | |
457 | + | let bA = (((by * aZ) + (bz * bf)) / 2) | |
458 | + | let bB = n(j) | |
459 | + | let bC = valueOrElse(getInteger(bB), 0) | |
460 | + | let g = aR(aT.originCaller) | |
461 | + | let bD = valueOrElse(getString(l(j)), "") | |
459 | 462 | if (!(valueOrElse(getBoolean(p(j, g)), false))) | |
460 | 463 | then throw(((("Your duck " + g) + " is not registered at tournament ") + toString(j))) | |
461 | 464 | else { | |
462 | - | let | |
463 | - | let | |
464 | - | if (( | |
465 | + | let bl = s(j, g) | |
466 | + | let bE = valueOrElse(getInteger(bl), 0) | |
467 | + | if ((bE == 0)) | |
465 | 468 | then throw("Your duck got zero score") | |
466 | 469 | else { | |
467 | - | let | |
468 | - | if (valueOrElse(getBoolean( | |
470 | + | let bF = q(j, g) | |
471 | + | if (valueOrElse(getBoolean(bF), false)) | |
469 | 472 | then throw(((("Your duck " + g) + " is already awarded at tournament ") + toString(j))) | |
470 | 473 | else { | |
471 | - | let | |
472 | - | let | |
473 | - | let | |
474 | - | let | |
474 | + | let bm = m(j) | |
475 | + | let bG = valueOrElse(getInteger(bm), 0) | |
476 | + | let aM = J[C] | |
477 | + | let bH = if (if ((aM == "")) | |
475 | 478 | then true | |
476 | - | else ( | |
479 | + | else (aM == " ")) | |
477 | 480 | then nil | |
478 | - | else split_4C( | |
479 | - | let | |
480 | - | if (( | |
481 | + | else split_4C(aM, ",") | |
482 | + | let bI = size(bH) | |
483 | + | if ((bI == 0)) | |
481 | 484 | then throw(("No leaders at tournament " + toString(j))) | |
482 | 485 | else { | |
483 | - | let | |
484 | - | let | |
485 | - | let | |
486 | + | let aJ = parseIntValue(I[A]) | |
487 | + | let aN = parseIntValue(J[D]) | |
488 | + | let bJ = if ((bI > aJ)) | |
486 | 489 | then 0 | |
487 | - | else if (containsElement( | |
490 | + | else if (containsElement(bH, g)) | |
488 | 491 | then throw("As one of winners, you will be awarded by admins") | |
489 | - | else ( | |
490 | - | let | |
491 | - | let | |
492 | - | let | |
493 | - | let | |
494 | - | then [StringEntry(k(j), | |
492 | + | else (bI * aN) | |
493 | + | let bK = min([fraction(bE, bA, (bG - bJ)), bC]) | |
494 | + | let bL = (bC - bK) | |
495 | + | let bb = aK("ARCHIVED", J[C], aN, by, bz) | |
496 | + | let bM = if ((0 >= bL)) | |
497 | + | then [StringEntry(k(j), bb)] | |
495 | 498 | else nil | |
496 | - | $Tuple2(([ScriptTransfer( | |
499 | + | $Tuple2(([ScriptTransfer(aT.caller, bK, ak), BooleanEntry(bF, true), IntegerEntry(bB, bL)] ++ bM), 0) | |
497 | 500 | } | |
498 | 501 | } | |
499 | 502 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = "Africa_F_Africa" | |
5 | 5 | ||
6 | 6 | let b = 0 | |
7 | 7 | ||
8 | 8 | let c = 1 | |
9 | 9 | ||
10 | 10 | func d (e) = ("stakedDuckByOwner_" + e) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func f (g) = ("duckLocation_" + g) | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | let h = "%s__lastTourId" | |
17 | 17 | ||
18 | 18 | func i (j) = ("%s%d__tourStaticData__" + toString(j)) | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func k (j) = ("%s%d__tourDynamicData__" + toString(j)) | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func l (j) = ("%s%d__scoreBoard__" + toString(j)) | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func m (j) = ("%s%d__sumScores__" + toString(j)) | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | func n (j) = ("%s%d__unpaidRewards__" + toString(j)) | |
31 | 31 | ||
32 | 32 | ||
33 | 33 | func o (g) = ("%s%s__lastRegisteredTourByDuck__" + g) | |
34 | 34 | ||
35 | 35 | ||
36 | 36 | func p (j,g) = makeString(["%s%d%s__isRegisteredByTourAndDuck", toString(j), g], "__") | |
37 | 37 | ||
38 | 38 | ||
39 | 39 | func q (j,g) = makeString(["%s%d%s__isAwardedByTourAndDuck", toString(j), g], "__") | |
40 | 40 | ||
41 | 41 | ||
42 | 42 | func r (j,g) = makeString(["%s%d%s__lastAttemptByTourAndDuck", toString(j), g], "__") | |
43 | 43 | ||
44 | 44 | ||
45 | 45 | func s (j,g) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(j), g], "__") | |
46 | 46 | ||
47 | 47 | ||
48 | - | ||
48 | + | func t (j,g) = makeString(["%s%d%s__bestTxByTourAndDuck", toString(j), g], "__") | |
49 | 49 | ||
50 | - | let u = 1 | |
51 | 50 | ||
52 | - | let | |
51 | + | let u = 0 | |
53 | 52 | ||
54 | - | let | |
53 | + | let v = 1 | |
55 | 54 | ||
56 | - | let | |
55 | + | let w = 2 | |
57 | 56 | ||
58 | - | let | |
57 | + | let x = 3 | |
59 | 58 | ||
60 | - | let | |
59 | + | let y = 5 | |
61 | 60 | ||
62 | - | let | |
61 | + | let z = 6 | |
63 | 62 | ||
64 | - | let | |
63 | + | let A = 7 | |
65 | 64 | ||
66 | - | let | |
65 | + | let B = 1 | |
67 | 66 | ||
68 | - | let | |
67 | + | let C = 2 | |
69 | 68 | ||
70 | - | let | |
69 | + | let D = 3 | |
71 | 70 | ||
72 | - | func F (G,j) = { | |
73 | - | let H = split(valueOrErrorMessage(getString(G, i(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
74 | - | let I = split_4C(valueOrErrorMessage(getString(G, k(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
75 | - | [H, I] | |
71 | + | let E = 4 | |
72 | + | ||
73 | + | let F = 5 | |
74 | + | ||
75 | + | func G (H,j) = { | |
76 | + | let I = split(valueOrErrorMessage(getString(H, i(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
77 | + | let J = split_4C(valueOrErrorMessage(getString(H, k(j)), (("Error reading tournament " + toString(j)) + " data")), "__") | |
78 | + | [I, J] | |
76 | 79 | } | |
77 | 80 | ||
78 | 81 | ||
79 | - | func | |
80 | - | let | |
81 | - | let | |
82 | - | let | |
83 | - | let | |
84 | - | let | |
85 | - | let | |
86 | - | if (if (if (( | |
87 | - | then (parseIntValue( | |
82 | + | func K (H,L) = { | |
83 | + | let M = valueOrElse(getInteger(H, h), 0) | |
84 | + | let N = split(L, "_") | |
85 | + | let O = lastBlock.timestamp | |
86 | + | let P = G(H, M) | |
87 | + | let I = P[u] | |
88 | + | let J = P[v] | |
89 | + | if (if (if ((N[c] == "T")) | |
90 | + | then (parseIntValue(N[b]) == M) | |
88 | 91 | else false) | |
89 | - | then ( | |
92 | + | then (J[B] == "INPROGRESS") | |
90 | 93 | else false) | |
91 | - | then (parseIntValue( | |
94 | + | then (parseIntValue(I[z]) > O) | |
92 | 95 | else false | |
93 | 96 | } | |
94 | 97 | ||
95 | 98 | ||
96 | - | let | |
99 | + | let Q = take(drop(this.bytes, 1), 1) | |
97 | 100 | ||
98 | - | let | |
99 | - | let | |
100 | - | if ((base58'2W' == | |
101 | + | let R = { | |
102 | + | let S = Q | |
103 | + | if ((base58'2W' == S)) | |
101 | 104 | then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv" | |
102 | - | else if ((base58'2T' == | |
105 | + | else if ((base58'2T' == S)) | |
103 | 106 | then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy" | |
104 | 107 | else throw("Unknown chain") | |
105 | 108 | } | |
106 | 109 | ||
107 | - | let | |
110 | + | let T = "__" | |
108 | 111 | ||
109 | - | func | |
112 | + | func U (V,W) = valueOrErrorMessage(getString(V, W), makeString(["mandatory ", toString(V), ".", W, " is not defined"], "")) | |
110 | 113 | ||
111 | 114 | ||
112 | - | let | |
115 | + | let X = 1 | |
113 | 116 | ||
114 | - | let | |
117 | + | let Y = 4 | |
115 | 118 | ||
116 | - | func | |
119 | + | func Z () = "%s__restConfig" | |
117 | 120 | ||
118 | 121 | ||
119 | - | func | |
122 | + | func aa () = "%s__restAddr" | |
120 | 123 | ||
121 | 124 | ||
122 | - | func | |
125 | + | func ab (ac) = split_4C(U(ac, Z()), T) | |
123 | 126 | ||
124 | 127 | ||
125 | - | func | |
128 | + | func ad (ae,af) = valueOrErrorMessage(addressFromString(ae[af]), ("Rest cfg doesn't contain address at index " + toString(af))) | |
126 | 129 | ||
127 | 130 | ||
128 | - | let | |
131 | + | let ag = addressFromStringValue(valueOrElse(getString(this, aa()), R)) | |
129 | 132 | ||
130 | - | let | |
133 | + | let ae = ab(ag) | |
131 | 134 | ||
132 | - | let | |
135 | + | let ah = ad(ae, X) | |
133 | 136 | ||
134 | - | let | |
137 | + | let ai = ad(ae, Y) | |
135 | 138 | ||
136 | - | let | |
139 | + | let aj = "wlg_assetId" | |
137 | 140 | ||
138 | - | let | |
141 | + | let ak = valueOrErrorMessage(getBinary(ai, aj), "Not initialized yet") | |
139 | 142 | ||
140 | - | func | |
141 | - | let | |
142 | - | if ($isInstanceOf( | |
143 | + | func al (am) = { | |
144 | + | let S = am | |
145 | + | if ($isInstanceOf(S, "String")) | |
143 | 146 | then { | |
144 | - | let | |
145 | - | | |
147 | + | let an = S | |
148 | + | an | |
146 | 149 | } | |
147 | 150 | else throw("fail to cast into String") | |
148 | 151 | } | |
149 | 152 | ||
150 | 153 | ||
151 | - | func | |
152 | - | let | |
153 | - | if ($isInstanceOf( | |
154 | + | func ao (am) = { | |
155 | + | let S = am | |
156 | + | if ($isInstanceOf(S, "Int")) | |
154 | 157 | then { | |
155 | - | let | |
156 | - | | |
158 | + | let ap = S | |
159 | + | ap | |
157 | 160 | } | |
158 | 161 | else throw("fail to cast into Int") | |
159 | 162 | } | |
160 | 163 | ||
161 | 164 | ||
162 | - | func | |
163 | - | let | |
164 | - | let | |
165 | - | let | |
166 | - | (((toString(( | |
165 | + | func aq (ar,as) = { | |
166 | + | let at = pow(10, 0, as, 0, 0, DOWN) | |
167 | + | let au = toString((ar % at)) | |
168 | + | let av = drop(toString(at), (1 + size(au))) | |
169 | + | (((toString((ar / at)) + ".") + av) + au) | |
167 | 170 | } | |
168 | 171 | ||
169 | 172 | ||
170 | - | func | |
171 | - | let | |
172 | - | let | |
173 | - | ( | |
173 | + | func aw (ar,ax) = { | |
174 | + | let ay = toString(ar) | |
175 | + | let av = drop(toString(pow(10, 0, (ax - size(ay)), 0, 0, DOWN)), 1) | |
176 | + | (av + ay) | |
174 | 177 | } | |
175 | 178 | ||
176 | 179 | ||
177 | - | let | |
180 | + | let az = 432000000 | |
178 | 181 | ||
179 | - | let | |
182 | + | let aA = 3600000 | |
180 | 183 | ||
181 | - | let | |
182 | - | let | |
183 | - | if ((base58'2W' == | |
184 | + | let aB = [toString(this), { | |
185 | + | let S = Q | |
186 | + | if ((base58'2W' == S)) | |
184 | 187 | then "3PEe2RELUHCFCBsmSCNcBJ8N3URLVQende7" | |
185 | - | else if ((base58'2T' == | |
188 | + | else if ((base58'2T' == S)) | |
186 | 189 | then "3MtBgJTaLxPB3C7UJD1UE8qjkHthfKvFQYY" | |
187 | 190 | else throw("Unknown chain") | |
188 | 191 | }] | |
189 | 192 | ||
190 | - | func | |
193 | + | func aC (aD,aE,aF,aG,aH,aI,aJ) = makeString(["%s%d%d%d%d%d%d", aD, toString(aE), toString(aF), toString(aG), toString(aH), toString(aI), toString(aJ)], T) | |
191 | 194 | ||
192 | 195 | ||
193 | - | func | |
196 | + | func aK (aL,aM,aN,aO,aP) = makeString_2C(["%s%s%d%d%d", aL, aM, toString(aN), toString(aO), toString(aP)], T) | |
194 | 197 | ||
195 | 198 | ||
196 | - | func | |
199 | + | func aQ () = ao(invoke(ah, "saveLastTx", nil, nil)) | |
197 | 200 | ||
198 | 201 | ||
199 | - | func | |
202 | + | func aR (aS) = valueOrErrorMessage(getString(ah, d(toString(aS))), "You don't have a duck staked") | |
200 | 203 | ||
201 | 204 | ||
202 | - | @Callable( | |
203 | - | func createTournament ( | |
204 | - | let | |
205 | - | if (!(containsElement( | |
205 | + | @Callable(aT) | |
206 | + | func createTournament (aH,aI,aE,aF,aJ) = { | |
207 | + | let aS = toString(aT.caller) | |
208 | + | if (!(containsElement(aB, aS))) | |
206 | 209 | then throw("Permission denied") | |
207 | 210 | else { | |
208 | - | let | |
209 | - | let j = if (isDefined( | |
211 | + | let M = getInteger(h) | |
212 | + | let j = if (isDefined(M)) | |
210 | 213 | then { | |
211 | - | let | |
212 | - | let | |
213 | - | let | |
214 | - | if (( | |
215 | - | then throw(("Current tournement is not completed, status=" + | |
216 | - | else ( | |
214 | + | let aU = value(M) | |
215 | + | let J = valueOrErrorMessage(getString(k(aU)), (("Error reading tournament " + toString(aU)) + " data")) | |
216 | + | let aL = split(J, T)[B] | |
217 | + | if ((aL != "ARCHIVED")) | |
218 | + | then throw(("Current tournement is not completed, status=" + aL)) | |
219 | + | else (aU + 1) | |
217 | 220 | } | |
218 | 221 | else 1 | |
219 | - | let | |
220 | - | if (( | |
221 | - | then throw(((("startTime=" + toString( | |
222 | - | else if (( | |
223 | - | then throw(((("endTime=" + toString( | |
224 | - | else if ((( | |
225 | - | then throw(((("Tournament period exceeds max: " + toString(( | |
226 | - | else if (if ((0 >= | |
222 | + | let O = lastBlock.timestamp | |
223 | + | if ((O > aH)) | |
224 | + | then throw(((("startTime=" + toString(aH)) + " < creationTime=") + toString(O))) | |
225 | + | else if ((aH > aI)) | |
226 | + | then throw(((("endTime=" + toString(aI)) + " < startTime=") + toString(aH))) | |
227 | + | else if (((aI - aH) > az)) | |
228 | + | then throw(((("Tournament period exceeds max: " + toString((aI - aH))) + " > ") + toString(az))) | |
229 | + | else if (if ((0 >= aE)) | |
227 | 230 | then true | |
228 | - | else (0 >= | |
229 | - | then throw(((("Cost should be positive, but passed " + toString( | |
230 | - | else if ((0 > | |
231 | + | else (0 >= aF)) | |
232 | + | then throw(((("Cost should be positive, but passed " + toString(aE)) + " and ") + toString(aF))) | |
233 | + | else if ((0 > aJ)) | |
231 | 234 | then throw("Number of Grand Prizes should be non-negative") | |
232 | - | else $Tuple2([IntegerEntry(h, j), StringEntry(i(j), | |
235 | + | else $Tuple2([IntegerEntry(h, j), StringEntry(i(j), aC(toBase58String(aT.transactionId), aE, aF, O, aH, aI, aJ)), StringEntry(k(j), aK("CREATED", " ", 0, 0, 0))], j) | |
233 | 236 | } | |
234 | 237 | } | |
235 | 238 | ||
236 | 239 | ||
237 | 240 | ||
238 | - | @Callable( | |
241 | + | @Callable(aT) | |
239 | 242 | func register () = { | |
240 | - | let | |
241 | - | if ((size( | |
243 | + | let aV = aQ() | |
244 | + | if ((size(aT.payments) != 1)) | |
242 | 245 | then throw("exactly 1 payment must be attached") | |
243 | 246 | else { | |
244 | - | let | |
245 | - | let | |
246 | - | let | |
247 | - | if (( | |
247 | + | let aW = aT.payments[0] | |
248 | + | let aX = aW.amount | |
249 | + | let aY = valueOrErrorMessage(aW.assetId, "WLGOLD payments only!") | |
250 | + | if ((aY != ak)) | |
248 | 251 | then throw("WLGOLD payments only!") | |
249 | 252 | else { | |
250 | - | let | |
251 | - | let | |
252 | - | let | |
253 | - | let | |
254 | - | let | |
255 | - | let | |
256 | - | if (!(if (if (if (( | |
257 | - | then ( | |
253 | + | let M = valueOrErrorMessage(getInteger(h), "No active tournaments") | |
254 | + | let O = lastBlock.timestamp | |
255 | + | let P = G(this, M) | |
256 | + | let I = P[u] | |
257 | + | let J = P[v] | |
258 | + | let aL = J[B] | |
259 | + | if (!(if (if (if ((aL == "CREATED")) | |
260 | + | then (O > parseIntValue(I[y])) | |
258 | 261 | else false) | |
259 | - | then ((parseIntValue( | |
262 | + | then ((parseIntValue(I[z]) - aA) > O) | |
260 | 263 | else false) | |
261 | 264 | then true | |
262 | - | else if (( | |
263 | - | then ((parseIntValue( | |
265 | + | else if ((aL == "INPROGRESS")) | |
266 | + | then ((parseIntValue(I[z]) - aA) > O) | |
264 | 267 | else false)) | |
265 | 268 | then throw("Cannot register now") | |
266 | 269 | else { | |
267 | - | let | |
268 | - | if (( | |
269 | - | then throw((("Need payment of " + | |
270 | + | let aZ = parseIntValue(I[w]) | |
271 | + | if ((aX != aZ)) | |
272 | + | then throw((("Need payment of " + aq(aZ, 8)) + " WLGOLD")) | |
270 | 273 | else { | |
271 | - | let g = | |
272 | - | let | |
273 | - | if (if (valueOrElse(getBoolean(p( | |
274 | + | let g = aR(aT.originCaller) | |
275 | + | let ba = valueOrElse(getString(l(M)), "") | |
276 | + | if (if (valueOrElse(getBoolean(p(M, g)), false)) | |
274 | 277 | then true | |
275 | - | else contains( | |
276 | - | then throw(((("Your duck " + g) + " is already registered at tournament ") + toString( | |
278 | + | else contains(ba, g)) | |
279 | + | then throw(((("Your duck " + g) + " is already registered at tournament ") + toString(M))) | |
277 | 280 | else { | |
278 | - | let | |
279 | - | $Tuple2([IntegerEntry(o(g), | |
281 | + | let bb = aK("INPROGRESS", J[C], parseIntValue(J[D]), (parseIntValue(J[E]) + 1), parseIntValue(J[F])) | |
282 | + | $Tuple2([IntegerEntry(o(g), M), BooleanEntry(p(M, g), true), StringEntry(l(M), if ((ba == "")) | |
280 | 283 | then (g + ":000") | |
281 | - | else ((( | |
284 | + | else (((ba + "_") + g) + ":000")), StringEntry(k(M), bb)], aV) | |
282 | 285 | } | |
283 | 286 | } | |
284 | 287 | } | |
285 | 288 | } | |
286 | 289 | } | |
287 | 290 | } | |
288 | 291 | ||
289 | 292 | ||
290 | 293 | ||
291 | - | @Callable( | |
294 | + | @Callable(aT) | |
292 | 295 | func newAttempt () = { | |
293 | - | let | |
294 | - | let g = | |
295 | - | let | |
296 | - | let | |
297 | - | let | |
298 | - | let | |
299 | - | let | |
300 | - | let | |
301 | - | if (!(if (( | |
302 | - | then ((parseIntValue( | |
296 | + | let aV = aQ() | |
297 | + | let g = aR(aT.originCaller) | |
298 | + | let M = valueOrErrorMessage(getInteger(h), "No active tournaments") | |
299 | + | let O = lastBlock.timestamp | |
300 | + | let P = G(this, M) | |
301 | + | let I = P[u] | |
302 | + | let J = P[v] | |
303 | + | let aL = J[B] | |
304 | + | if (!(if ((aL == "INPROGRESS")) | |
305 | + | then ((parseIntValue(I[z]) - aA) > O) | |
303 | 306 | else false)) | |
304 | 307 | then throw("Attempt is not possible") | |
305 | - | else if (!(valueOrElse(getBoolean(p( | |
306 | - | then throw(((("Your duck " + g) + " is not registered at tournament ") + toString( | |
308 | + | else if (!(valueOrElse(getBoolean(p(M, g)), false))) | |
309 | + | then throw(((("Your duck " + g) + " is not registered at tournament ") + toString(M))) | |
307 | 310 | else { | |
308 | - | let | |
309 | - | let | |
310 | - | let | |
311 | + | let bc = r(M, g) | |
312 | + | let bd = getInteger(bc) | |
313 | + | let be = if (!(isDefined(bd))) | |
311 | 314 | then $Tuple2(0, 0) | |
312 | - | else if ((size( | |
315 | + | else if ((size(aT.payments) != 1)) | |
313 | 316 | then throw("exactly 1 payment must be attached") | |
314 | 317 | else { | |
315 | - | let | |
316 | - | let | |
317 | - | let | |
318 | - | if (( | |
318 | + | let aW = aT.payments[0] | |
319 | + | let aX = aW.amount | |
320 | + | let aY = valueOrErrorMessage(aW.assetId, "WLGOLD payments only!") | |
321 | + | if ((aY != ak)) | |
319 | 322 | then throw("WLGOLD payments only!") | |
320 | 323 | else { | |
321 | - | let | |
322 | - | if (( | |
323 | - | then throw((("Need payment of " + | |
324 | - | else $Tuple2((value( | |
324 | + | let bf = parseIntValue(I[x]) | |
325 | + | if ((aX != bf)) | |
326 | + | then throw((("Need payment of " + aq(bf, 8)) + " WLGOLD")) | |
327 | + | else $Tuple2((value(bd) + 1), 1) | |
325 | 328 | } | |
326 | 329 | } | |
327 | - | let | |
328 | - | let | |
329 | - | let | |
330 | - | let | |
331 | - | $Tuple2([IntegerEntry( | |
330 | + | let bg = be._1 | |
331 | + | let bh = be._2 | |
332 | + | let bb = aK("INPROGRESS", J[C], parseIntValue(J[D]), parseIntValue(J[E]), (parseIntValue(J[F]) + bh)) | |
333 | + | let bi = al(invoke(ah, "initDuckTourAttempt", [g], nil)) | |
334 | + | $Tuple2([IntegerEntry(bc, bg), StringEntry(k(M), bb)], [aV, bg, bi]) | |
332 | 335 | } | |
333 | 336 | } | |
334 | 337 | ||
335 | 338 | ||
336 | 339 | ||
337 | - | @Callable( | |
338 | - | func saveDuckResult (g, | |
340 | + | @Callable(aT) | |
341 | + | func saveDuckResult (g,bj) = if ((aT.caller != ah)) | |
339 | 342 | then throw("Access denied") | |
340 | 343 | else { | |
341 | - | let | |
342 | - | let | |
343 | - | let | |
344 | - | let | |
345 | - | let | |
346 | - | let | |
347 | - | let | |
348 | - | let | |
349 | - | if ( | |
344 | + | let M = valueOrErrorMessage(getInteger(h), "No active tournaments") | |
345 | + | let P = G(this, M) | |
346 | + | let I = P[u] | |
347 | + | let J = P[v] | |
348 | + | let bk = valueOrElse(getString(ah, f(g)), a) | |
349 | + | let bl = s(M, g) | |
350 | + | let bm = m(M) | |
351 | + | let bn = valueOrElse(getInteger(bm), 0) | |
352 | + | if (K(this, bk)) | |
350 | 353 | then { | |
351 | - | let | |
352 | - | let | |
353 | - | let | |
354 | - | let | |
355 | - | then if (!(contains( | |
354 | + | let bo = valueOrElse(getInteger(bl), 0) | |
355 | + | let bp = l(M) | |
356 | + | let ba = valueOrElse(getString(bp), "") | |
357 | + | let bq = if ((bj > bo)) | |
358 | + | then if (!(contains(ba, g))) | |
356 | 359 | then throw(("scoreBoard does not contain " + g)) | |
357 | 360 | else { | |
358 | - | let | |
359 | - | let | |
360 | - | let | |
361 | + | let br = parseIntValue(J[D]) | |
362 | + | let aM = J[C] | |
363 | + | let bs = if (if ((aM == "")) | |
361 | 364 | then true | |
362 | - | else ( | |
365 | + | else (aM == " ")) | |
363 | 366 | then nil | |
364 | - | else split_4C( | |
365 | - | let | |
367 | + | else split_4C(aM, ",") | |
368 | + | let bt = if ((bj > br)) | |
366 | 369 | then [g] | |
367 | - | else if (if (( | |
370 | + | else if (if ((br > bj)) | |
368 | 371 | then true | |
369 | - | else containsElement( | |
370 | - | then | |
371 | - | else ( | |
372 | - | let | |
373 | - | let | |
374 | - | $Tuple3((((( | |
372 | + | else containsElement(bs, g)) | |
373 | + | then bs | |
374 | + | else (bs :+ g) | |
375 | + | let bb = aK("INPROGRESS", makeString_2C(bt, ","), max([bj, br]), parseIntValue(J[E]), parseIntValue(J[F])) | |
376 | + | let bu = split_51C(ba, g) | |
377 | + | $Tuple3(((((bu[0] + g) + ":") + aw(bj, 3)) + drop(bu[1], 4)), ((bn + bj) - bo), [StringEntry(k(M), bb)]) | |
375 | 378 | } | |
376 | - | else $Tuple3( | |
377 | - | let | |
378 | - | let | |
379 | - | let | |
380 | - | $Tuple2(([IntegerEntry( | |
379 | + | else $Tuple3(ba, bn, nil) | |
380 | + | let bv = bq._1 | |
381 | + | let bw = bq._2 | |
382 | + | let bx = bq._3 | |
383 | + | $Tuple2(([IntegerEntry(bl, max([bo, bj])), IntegerEntry(bm, bw), StringEntry(t(M, g), toBase58String(aT.transactionId)), StringEntry(bp, bv)] ++ bx), 0) | |
381 | 384 | } | |
382 | 385 | else $Tuple2(nil, 0) | |
383 | 386 | } | |
384 | 387 | ||
385 | 388 | ||
386 | 389 | ||
387 | - | @Callable( | |
390 | + | @Callable(aT) | |
388 | 391 | func processTournament (j) = { | |
389 | - | let | |
390 | - | if (!(containsElement( | |
392 | + | let aS = toString(aT.caller) | |
393 | + | if (!(containsElement(aB, aS))) | |
391 | 394 | then throw("Permission denied") | |
392 | 395 | else { | |
393 | - | let | |
394 | - | let | |
395 | - | let | |
396 | - | let | |
397 | - | let | |
398 | - | let | |
399 | - | let | |
400 | - | let | |
401 | - | let | |
402 | - | if (( | |
396 | + | let O = lastBlock.timestamp | |
397 | + | let P = G(this, j) | |
398 | + | let I = P[u] | |
399 | + | let J = P[v] | |
400 | + | let aL = J[B] | |
401 | + | let by = parseIntValue(J[E]) | |
402 | + | let bz = parseIntValue(J[F]) | |
403 | + | let aZ = parseIntValue(I[w]) | |
404 | + | let bf = parseIntValue(I[x]) | |
405 | + | if ((aL == "ARCHIVED")) | |
403 | 406 | then throw((("Tournament " + toString(j)) + " is already ARCHIVED")) | |
404 | - | else if (if (( | |
405 | - | then (parseIntValue( | |
407 | + | else if (if ((aL == "INPROGRESS")) | |
408 | + | then (parseIntValue(I[z]) > O) | |
406 | 409 | else false) | |
407 | 410 | then throw((("Tournament " + toString(j)) + " is not over yet")) | |
408 | 411 | else { | |
409 | - | let | |
410 | - | $Tuple2([StringEntry(k(j), | |
412 | + | let bb = aK("PROCESSING", J[C], parseIntValue(J[D]), by, bz) | |
413 | + | $Tuple2([StringEntry(k(j), bb), IntegerEntry(n(j), (((by * aZ) + (bz * bf)) / 2))], 0) | |
411 | 414 | } | |
412 | 415 | } | |
413 | 416 | } | |
414 | 417 | ||
415 | 418 | ||
416 | 419 | ||
417 | - | @Callable( | |
420 | + | @Callable(aT) | |
418 | 421 | func finishTournament (j) = { | |
419 | - | let | |
420 | - | if (!(containsElement( | |
422 | + | let aS = toString(aT.caller) | |
423 | + | if (!(containsElement(aB, aS))) | |
421 | 424 | then throw("Permission denied") | |
422 | 425 | else { | |
423 | - | let | |
424 | - | let | |
425 | - | let | |
426 | - | if (( | |
426 | + | let P = G(this, j) | |
427 | + | let J = P[v] | |
428 | + | let aL = J[B] | |
429 | + | if ((aL == "ARCHIVED")) | |
427 | 430 | then throw((("Tournament " + toString(j)) + " is already ARCHIVED")) | |
428 | 431 | else { | |
429 | - | let | |
430 | - | $Tuple2([StringEntry(k(j), | |
432 | + | let bb = aK("ARCHIVED", J[C], parseIntValue(J[D]), parseIntValue(J[E]), parseIntValue(J[F])) | |
433 | + | $Tuple2([StringEntry(k(j), bb)], 0) | |
431 | 434 | } | |
432 | 435 | } | |
433 | 436 | } | |
434 | 437 | ||
435 | 438 | ||
436 | 439 | ||
437 | - | @Callable( | |
440 | + | @Callable(aT) | |
438 | 441 | func claimPrize (j) = { | |
439 | - | let | |
440 | - | if ((size( | |
442 | + | let aV = aQ() | |
443 | + | if ((size(aT.payments) != 0)) | |
441 | 444 | then throw("No payments required") | |
442 | 445 | else { | |
443 | - | let | |
444 | - | let | |
445 | - | let | |
446 | - | let | |
447 | - | if (( | |
446 | + | let P = G(this, j) | |
447 | + | let I = P[u] | |
448 | + | let J = P[v] | |
449 | + | let aL = J[B] | |
450 | + | if ((aL != "PROCESSING")) | |
448 | 451 | then throw((("Tournament " + toString(j)) + " is not PROCESSING")) | |
449 | 452 | else { | |
450 | - | let | |
451 | - | let | |
452 | - | let | |
453 | - | let | |
454 | - | let | |
455 | - | let | |
456 | - | let | |
457 | - | let g = | |
458 | - | let | |
453 | + | let by = parseIntValue(J[E]) | |
454 | + | let bz = parseIntValue(J[F]) | |
455 | + | let aZ = parseIntValue(I[w]) | |
456 | + | let bf = parseIntValue(I[x]) | |
457 | + | let bA = (((by * aZ) + (bz * bf)) / 2) | |
458 | + | let bB = n(j) | |
459 | + | let bC = valueOrElse(getInteger(bB), 0) | |
460 | + | let g = aR(aT.originCaller) | |
461 | + | let bD = valueOrElse(getString(l(j)), "") | |
459 | 462 | if (!(valueOrElse(getBoolean(p(j, g)), false))) | |
460 | 463 | then throw(((("Your duck " + g) + " is not registered at tournament ") + toString(j))) | |
461 | 464 | else { | |
462 | - | let | |
463 | - | let | |
464 | - | if (( | |
465 | + | let bl = s(j, g) | |
466 | + | let bE = valueOrElse(getInteger(bl), 0) | |
467 | + | if ((bE == 0)) | |
465 | 468 | then throw("Your duck got zero score") | |
466 | 469 | else { | |
467 | - | let | |
468 | - | if (valueOrElse(getBoolean( | |
470 | + | let bF = q(j, g) | |
471 | + | if (valueOrElse(getBoolean(bF), false)) | |
469 | 472 | then throw(((("Your duck " + g) + " is already awarded at tournament ") + toString(j))) | |
470 | 473 | else { | |
471 | - | let | |
472 | - | let | |
473 | - | let | |
474 | - | let | |
474 | + | let bm = m(j) | |
475 | + | let bG = valueOrElse(getInteger(bm), 0) | |
476 | + | let aM = J[C] | |
477 | + | let bH = if (if ((aM == "")) | |
475 | 478 | then true | |
476 | - | else ( | |
479 | + | else (aM == " ")) | |
477 | 480 | then nil | |
478 | - | else split_4C( | |
479 | - | let | |
480 | - | if (( | |
481 | + | else split_4C(aM, ",") | |
482 | + | let bI = size(bH) | |
483 | + | if ((bI == 0)) | |
481 | 484 | then throw(("No leaders at tournament " + toString(j))) | |
482 | 485 | else { | |
483 | - | let | |
484 | - | let | |
485 | - | let | |
486 | + | let aJ = parseIntValue(I[A]) | |
487 | + | let aN = parseIntValue(J[D]) | |
488 | + | let bJ = if ((bI > aJ)) | |
486 | 489 | then 0 | |
487 | - | else if (containsElement( | |
490 | + | else if (containsElement(bH, g)) | |
488 | 491 | then throw("As one of winners, you will be awarded by admins") | |
489 | - | else ( | |
490 | - | let | |
491 | - | let | |
492 | - | let | |
493 | - | let | |
494 | - | then [StringEntry(k(j), | |
492 | + | else (bI * aN) | |
493 | + | let bK = min([fraction(bE, bA, (bG - bJ)), bC]) | |
494 | + | let bL = (bC - bK) | |
495 | + | let bb = aK("ARCHIVED", J[C], aN, by, bz) | |
496 | + | let bM = if ((0 >= bL)) | |
497 | + | then [StringEntry(k(j), bb)] | |
495 | 498 | else nil | |
496 | - | $Tuple2(([ScriptTransfer( | |
499 | + | $Tuple2(([ScriptTransfer(aT.caller, bK, ak), BooleanEntry(bF, true), IntegerEntry(bB, bL)] ++ bM), 0) | |
497 | 500 | } | |
498 | 501 | } | |
499 | 502 | } | |
500 | 503 | } | |
501 | 504 | } | |
502 | 505 | } | |
503 | 506 | } | |
504 | 507 | ||
505 | 508 |
github/deemru/w8io/169f3d6 202.17 ms ◑![]()