tx · 3aoN9AuXMwdLHaBekAL7buTEmtTJQuxrgBgzypWPaab7

3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx:  -0.01200000 Waves

2023.09.05 16:25 [2742135] smart account 3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx > SELF 0.00000000 Waves

{ "type": 13, "id": "3aoN9AuXMwdLHaBekAL7buTEmtTJQuxrgBgzypWPaab7", "fee": 1200000, "feeAssetId": null, "timestamp": 1693920398119, "version": 2, "chainId": 84, "sender": "3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx", "senderPublicKey": "UGqkWsCpv7xRVXkQRXyLd6pWPDtYGXmPip7FxSd1pAu", "proofs": [ "18wBmDuhtPoNgRvvWtGQCkN6N3bqhpyUDVo1hjvmAk8GBCC2MNK7sToFLNrk7yKP9Mt9kTQmKgzadoNKh8ZaHrX" ], "script": "base64:BgIgCAISBwoFAQEBAQESABIAEgQKAggBEgQKAggBEgMKAQE0AA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAANbGFzdFRvdXJJZEtleQIOJXNfX2xhc3RUb3VySWQBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEDdElkCQCsAgICFiVzJWRfX3RvdXJTdGF0aWNEYXRhX18JAKQDAQUDdElkARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQN0SWQJAKwCAgIXJXMlZF9fdG91ckR5bmFtaWNEYXRhX18JAKQDAQUDdElkARNrZXlTY29yZUJvYXJkQnlUb3VyAQN0SWQJAKwCAgISJXMlZF9fc2NvcmVCb2FyZF9fCQCkAwEFA3RJZAEba2V5TGFzdFJlZ2lzdGVyZWRUb3VyQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAiAlcyVzX19sYXN0UmVnaXN0ZXJlZFRvdXJCeUR1Y2tfXwULZHVja0Fzc2V0SWQBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICISVzJWQlc19faXNSZWdpc3RlcmVkQnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEba2V5TGFzdEF0dGVtcHRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAiAlcyVkJXNfX2xhc3RBdHRlbXB0QnlUb3VyQW5kRHVjawkAzAgCCQCkAwEFA3RJZAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsAgJfXwEaa2V5QmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sCA3RJZAtkdWNrQXNzZXRJZAkAuQkCCQDMCAICHyVzJWQlc19fYmVzdFJlc3VsdEJ5VG91ckFuZER1Y2sJAMwIAgkApAMBBQN0SWQJAMwIAgULZHVja0Fzc2V0SWQFA25pbAICX18ACWlkeFN0YXRpYwAAAAppZHhEeW5hbWljAAEBC2dldFRvdXJEYXRhAgx0b3VyQ29udHJhY3QDdElkBAZzdGF0aWMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18EB2R5bmFtaWMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFA3RJZAIFIGRhdGECAl9fCQDMCAIFBnN0YXRpYwkAzAgCBQdkeW5hbWljBQNuaWwAE3RTdGF0aWNSZWdpc3RlckNvc3QAAgASdFN0YXRpY0F0dGVtcHRDb3N0AAMADHRTdGF0aWNTdGFydAAFAAp0U3RhdGljRW5kAAYADnREeW5hbWljU3RhdHVzAAEAD3REeW5hbWljV2luRHVjawACABF0RHluYW1pY1dpblJlc3VsdAADABV0RHluYW1pY1RvdGFsUmVnQ291bnQABAAVdER5bmFtaWNUb3RhbEF0dGVtcHRzAAUAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEADUlkeENmZ1dsZ0RhcHAABAEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBQ1JZHhDZmdXbGdEYXBwAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhNOb3QgaW5pdGlhbGl6ZWQgeWV0AQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQBBHBhZEwCA3ZhbANsZW4EBHZhbFMJAKQDAQUDdmFsBAZ6ZXJvZXMJALACAgkApAMBCQBsBgAKAAAJAGUCBQNsZW4JALECAQUEdmFsUwAAAAAFBERPV04AAQkArAICBQZ6ZXJvZXMFBHZhbFMAE01BWFRPVVJOQU1FTlRMRU5HVEgAgJj/zQEABEhPVVIAgN3bAQAKYWRtaW5zTGlzdAkAzAgCCQClCAEFBHRoaXMJAMwIAgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BFZTJSRUxVSENGQ0JzbVNDTmNCSjhOM1VSTFZRZW5kZTcDCQAAAgEBVAUHJG1hdGNoMAIjM010QmdKVGFMeFBCM0M3VUpEMVVFOHFqa0h0aGZLdkZRWVkJAAIBAg1Vbmtub3duIGNoYWluBQNuaWwBCnN0YXRpY0RhdGEHBHR4SWQMcmVnaXN0ZXJDb3N0C2F0dGVtcHRDb3N0DGNyZWF0aW9uVGltZQlzdGFydFRpbWUHZW5kVGltZQludW1HcmFuZHMJALkJAgkAzAgCAg4lcyVkJWQlZCVkJWQlZAkAzAgCBQR0eElkCQDMCAIJAKQDAQUMcmVnaXN0ZXJDb3N0CQDMCAIJAKQDAQULYXR0ZW1wdENvc3QJAMwIAgkApAMBBQxjcmVhdGlvblRpbWUJAMwIAgkApAMBBQlzdGFydFRpbWUJAMwIAgkApAMBBQdlbmRUaW1lCQDMCAIJAKQDAQUJbnVtR3JhbmRzBQNuaWwFA1NFUAELZHluYW1pY0RhdGEFBnN0YXR1cwd3aW5EdWNrCXdpblJlc3VsdAl0b3RhbFJlZ3MNdG90YWxBdHRlbXB0cwkAuQkCCQDMCAICCiVzJXMlZCVkJWQJAMwIAgUGc3RhdHVzCQDMCAIFB3dpbkR1Y2sJAMwIAgkApAMBBQl3aW5SZXN1bHQJAMwIAgkApAMBBQl0b3RhbFJlZ3MJAMwIAgkApAMBBQ10b3RhbEF0dGVtcHRzBQNuaWwFA1NFUAEGcHJvbG9nAAkBBWFzSW50AQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCCnNhdmVMYXN0VHgFA25pbAUDbmlsAQxkdWNrQnlDYWxsZXIBBmNhbGxlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBBQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQGAWkBEGNyZWF0ZVRvdXJuYW1lbnQFCXN0YXJ0VGltZQdlbmRUaW1lDHJlZ2lzdGVyQ29zdAthdHRlbXB0Q29zdAludW1HcmFuZHMEBmNhbGxlcgkApQgBCAUBaQZjYWxsZXIDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQphZG1pbnNMaXN0BQZjYWxsZXIJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQGbGFzdElkCQCfCAEFDWxhc3RUb3VySWRLZXkEA3RJZAMJAQlpc0RlZmluZWQBBQZsYXN0SWQECmxhc3RUb3VySWQJAQV2YWx1ZQEFBmxhc3RJZAQHZHluYW1pYwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUKbGFzdFRvdXJJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUKbGFzdFRvdXJJZAIFIGRhdGEEBnN0YXR1cwkAkQMCCQC1CQIFB2R5bmFtaWMFA1NFUAUOdER5bmFtaWNTdGF0dXMDCQECIT0CBQZzdGF0dXMCCEFSQ0hJVkVECQACAQkArAICAixDdXJyZW50IHRvdXJuZW1lbnQgaXMgbm90IGNvbXBsZXRlZCwgc3RhdHVzPQUGc3RhdHVzCQBkAgUKbGFzdFRvdXJJZAABAAEEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXADCQBmAgUDbm93BQlzdGFydFRpbWUJAAIBCQCsAgIJAKwCAgkArAICAgpzdGFydFRpbWU9CQCkAwEFCXN0YXJ0VGltZQIQIDwgY3JlYXRpb25UaW1lPQkApAMBBQNub3cDCQBmAgUJc3RhcnRUaW1lBQdlbmRUaW1lCQACAQkArAICCQCsAgIJAKwCAgIIZW5kVGltZT0JAKQDAQUHZW5kVGltZQINIDwgc3RhcnRUaW1lPQkApAMBBQlzdGFydFRpbWUDCQBmAgkAZQIFB2VuZFRpbWUFCXN0YXJ0VGltZQUTTUFYVE9VUk5BTUVOVExFTkdUSAkAAgEJAKwCAgkArAICCQCsAgICH1RvdXJuYW1lbnQgcGVyaW9kIGV4Y2VlZHMgbWF4OiAJAKQDAQkAZQIFB2VuZFRpbWUFCXN0YXJ0VGltZQIDID4gCQCkAwEFE01BWFRPVVJOQU1FTlRMRU5HVEgDAwkAZwIAAAUMcmVnaXN0ZXJDb3N0BgkAZwIAAAULYXR0ZW1wdENvc3QJAAIBCQCsAgIJAKwCAgkArAICAiRDb3N0IHNob3VsZCBiZSBwb3NpdGl2ZSwgYnV0IHBhc3NlZCAJAKQDAQUMcmVnaXN0ZXJDb3N0AgUgYW5kIAkApAMBBQthdHRlbXB0Q29zdAMJAGYCAAAFCW51bUdyYW5kcwkAAgECLU51bWJlciBvZiBHcmFuZCBQcml6ZXMgc2hvdWxkIGJlIG5vbi1uZWdhdGl2ZQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1sYXN0VG91cklkS2V5BQN0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkBCnN0YXRpY0RhdGEHCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFDHJlZ2lzdGVyQ29zdAULYXR0ZW1wdENvc3QFA25vdwUJc3RhcnRUaW1lBQdlbmRUaW1lBQludW1HcmFuZHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAQtkeW5hbWljRGF0YQUCB0NSRUFURUQCASAAAAAAAAAFA25pbAUDdElkAWkBCHJlZ2lzdGVyAAQMcHJvbG9nUmVzdWx0CQEGcHJvbG9nAAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIVV0xHT0xEIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUKcG10QXNzZXRJZAUKd2xnQXNzZXRJZAkAAgECFVdMR09MRCBwYXltZW50cyBvbmx5IQQGbGFzdElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUNbGFzdFRvdXJJZEtleQIVTm8gYWN0aXZlIHRvdXJuYW1lbnRzBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUEdGhpcwUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQGc3RhdHVzCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAwkBASEBAwMDCQAAAgUGc3RhdHVzAgdDUkVBVEVECQBmAgUDbm93CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQx0U3RhdGljU3RhcnQHCQBmAgkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFBEhPVVIFA25vdwcGAwkAAAIFBnN0YXR1cwIKSU5QUk9HUkVTUwkAZgIJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQRIT1VSBQNub3cHCQACAQITQ2Fubm90IHJlZ2lzdGVyIG5vdwQHcmVnQ29zdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUTdFN0YXRpY1JlZ2lzdGVyQ29zdAMJAQIhPQIFBndsZ0FtdAUHcmVnQ29zdAkAAgEJAKwCAgkArAICAhBOZWVkIHBheW1lbnQgb2YgCQEKZml4ZWRQb2ludAIFB3JlZ0Nvc3QACAIHIFdMR09MRAQLZHVja0Fzc2V0SWQJAQxkdWNrQnlDYWxsZXIBCAUBaQxvcmlnaW5DYWxsZXIEDW9sZFNjb3JlQm9hcmQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBE2tleVNjb3JlQm9hcmRCeVRvdXIBBQZsYXN0SWQCAAMDCQELdmFsdWVPckVsc2UCCQCgCAEJARxrZXlJc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrAgUGbGFzdElkBQtkdWNrQXNzZXRJZAcGCQEIY29udGFpbnMCBQ1vbGRTY29yZUJvYXJkBQtkdWNrQXNzZXRJZAkAAgEJAKwCAgkArAICCQCsAgICCllvdXIgZHVjayAFC2R1Y2tBc3NldElkAiUgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGF0IHRvdXJuYW1lbnQgCQCkAwEFBmxhc3RJZAQSdXBkYXRlZER5bmFtaWNEYXRhCQELZHluYW1pY0RhdGEFAgpJTlBST0dSRVNTCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljV2luRHVjawkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0CQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxSZWdDb3VudAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbEF0dGVtcHRzCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARtrZXlMYXN0UmVnaXN0ZXJlZFRvdXJCeUR1Y2sBBQtkdWNrQXNzZXRJZAUGbGFzdElkCQDMCAIJAQxCb29sZWFuRW50cnkCCQEca2V5SXNSZWdpc3RlcmVkQnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlTY29yZUJvYXJkQnlUb3VyAQUGbGFzdElkAwkAAAIFDW9sZFNjb3JlQm9hcmQCAAkArAICBQtkdWNrQXNzZXRJZAIEOjAwMAkArAICCQCsAgIJAKwCAgUNb2xkU2NvcmVCb2FyZAIBXwULZHVja0Fzc2V0SWQCBDowMDAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQZsYXN0SWQFEnVwZGF0ZWREeW5hbWljRGF0YQUDbmlsBQxwcm9sb2dSZXN1bHQBaQEKbmV3QXR0ZW1wdAAEDHByb2xvZ1Jlc3VsdAkBBnByb2xvZwAEC2R1Y2tBc3NldElkCQEMZHVja0J5Q2FsbGVyAQgFAWkMb3JpZ2luQ2FsbGVyBAZsYXN0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ1sYXN0VG91cklkS2V5AhVObyBhY3RpdmUgdG91cm5hbWVudHMEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEBXREYXRhCQELZ2V0VG91ckRhdGECBQR0aGlzBQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljBAZzdGF0dXMJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMDCQEBIQEDCQAAAgUGc3RhdHVzAgpJTlBST0dSRVNTCQBmAgkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFBEhPVVIFA25vdwcJAAIBAhdBdHRlbXB0IGlzIG5vdCBwb3NzaWJsZQMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEca2V5SXNSZWdpc3RlcmVkQnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQHCQACAQkArAICCQCsAgIJAKwCAgIKWW91ciBkdWNrIAULZHVja0Fzc2V0SWQCISBpcyBub3QgcmVnaXN0ZXJlZCBhdCB0b3VybmFtZW50IAkApAMBBQZsYXN0SWQEE2F0dGVtcHRzSXRlcmF0b3JLZXkJARtrZXlMYXN0QXR0ZW1wdEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkBAtsYXN0QXR0ZW1wdAkAnwgBBRNhdHRlbXB0c0l0ZXJhdG9yS2V5BAskdDA2MDg4NjcyMAMJAQEhAQkBCWlzRGVmaW5lZAEFC2xhc3RBdHRlbXB0CQCUCgIAAAAAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAhVXTEdPTEQgcGF5bWVudHMgb25seSEDCQECIT0CBQpwbXRBc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAdhdHRDb3N0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBRJ0U3RhdGljQXR0ZW1wdENvc3QDCQECIT0CBQZ3bGdBbXQFB2F0dENvc3QJAAIBCQCsAgIJAKwCAgIQTmVlZCBwYXltZW50IG9mIAkBCmZpeGVkUG9pbnQCBQdhdHRDb3N0AAgCByBXTEdPTEQJAJQKAgkAZAIJAQV2YWx1ZQEFC2xhc3RBdHRlbXB0AAEAAQQNcGF5ZWRBdHRlbXB0cwgFCyR0MDYwODg2NzIwAl8xBAlpbmNyZW1lbnQIBQskdDA2MDg4NjcyMAJfMgQSdXBkYXRlZER5bmFtaWNEYXRhCQELZHluYW1pY0RhdGEFAgpJTlBST0dSRVNTCQCRAwIFB2R5bmFtaWMFD3REeW5hbWljV2luRHVjawkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwUVdER5bmFtaWNUb3RhbFJlZ0NvdW50CQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwUJaW5jcmVtZW50BAd0b3VyTG9jCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAITaW5pdER1Y2tUb3VyQXR0ZW1wdAkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTYXR0ZW1wdHNJdGVyYXRvcktleQUNcGF5ZWRBdHRlbXB0cwkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFBmxhc3RJZAUSdXBkYXRlZER5bmFtaWNEYXRhBQNuaWwJAMwIAgUMcHJvbG9nUmVzdWx0CQDMCAIFDXBheWVkQXR0ZW1wdHMJAMwIAgUHdG91ckxvYwUDbmlsAWkBEXVwZGF0ZUR5bmFtaWNEYXRhAgtkdWNrQXNzZXRJZAduZXdCZXN0AwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAZsYXN0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ1sYXN0VG91cklkS2V5AhVObyBhY3RpdmUgdG91cm5hbWVudHMEBXREYXRhCQELZ2V0VG91ckRhdGECBQR0aGlzBQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljAwMDCQBnAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFEXREeW5hbWljV2luUmVzdWx0BQduZXdCZXN0BgkBAiE9AgkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwIKSU5QUk9HUkVTUwYJAGYCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAkAlAoCBQNuaWwAAAQSdXBkYXRlZER5bmFtaWNEYXRhCQELZHluYW1pY0RhdGEFAgpJTlBST0dSRVNTBQtkdWNrQXNzZXRJZAUHbmV3QmVzdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxSZWdDb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlUb3VyRHluYW1pY0RhdGFCeUlkAQUGbGFzdElkBRJ1cGRhdGVkRHluYW1pY0RhdGEFA25pbAAAAWkBDnNhdmVEdWNrUmVzdWx0AgtkdWNrQXNzZXRJZAduZXdCZXN0AwkBAiE9AggFAWkGY2FsbGVyBQ9zdGFraW5nQ29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAZsYXN0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ1sYXN0VG91cklkS2V5AhVObyBhY3RpdmUgdG91cm5hbWVudHMEBXREYXRhCQELZ2V0VG91ckRhdGECBQR0aGlzBQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8EDWJlc3RSZXN1bHRLZXkJARprZXlCZXN0UmVzdWx0QnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQDAwMDCQAAAgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBVAkAAAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BQZsYXN0SWQHCQAAAgkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwIKSU5QUk9HUkVTUwcJAGcCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAcEDW9sZEJlc3RSZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNYmVzdFJlc3VsdEtleQAABAhzY29yZUtleQkBE2tleVNjb3JlQm9hcmRCeVRvdXIBBQZsYXN0SWQEDW9sZFNjb3JlQm9hcmQJAQt2YWx1ZU9yRWxzZQIJAKIIAQUIc2NvcmVLZXkCAAQHdXBkYXRlZAMJAGYCBQduZXdCZXN0BQ1vbGRCZXN0UmVzdWx0AwkBASEBCQEIY29udGFpbnMCBQ1vbGRTY29yZUJvYXJkBQtkdWNrQXNzZXRJZAkAAgEJAKwCAgIcc2NvcmVCb2FyZCBkb2VzIG5vdCBjb250YWluIAULZHVja0Fzc2V0SWQEBXBhcnRzCQC9CQIFDW9sZFNjb3JlQm9hcmQFC2R1Y2tBc3NldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAJEDAgUFcGFydHMAAAULZHVja0Fzc2V0SWQCAToJAQRwYWRMAgUHbmV3QmVzdAADCQCwAgIJAJEDAgUFcGFydHMAAQAEBQ1vbGRTY29yZUJvYXJkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFDWJlc3RSZXN1bHRLZXkJAJYDAQkAzAgCBQ1vbGRCZXN0UmVzdWx0CQDMCAIFB25ld0Jlc3QFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQhzY29yZUtleQUHdXBkYXRlZAUDbmlsAAAJAJQKAgUDbmlsAAABaQEQZmluaXNoVG91cm5hbWVudAEDdElkBAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUKYWRtaW5zTGlzdAUGY2FsbGVyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBXREYXRhCQELZ2V0VG91ckRhdGECBQR0aGlzBQN0SWQEB2R5bmFtaWMJAJEDAgUFdERhdGEFCmlkeER5bmFtaWMEBnN0YXR1cwkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwMJAAACBQZzdGF0dXMCCEFSQ0hJVkVECQACAQkArAICCQCsAgICC1RvdXJuYW1lbnQgCQCkAwEFA3RJZAIUIGlzIGFscmVhZHkgQVJDSElWRUQEEnVwZGF0ZWREeW5hbWljRGF0YQkBC2R5bmFtaWNEYXRhBQIIQVJDSElWRUQJAJEDAgUHZHluYW1pYwUPdER5bmFtaWNXaW5EdWNrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHZHluYW1pYwURdER5bmFtaWNXaW5SZXN1bHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsUmVnQ291bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsQXR0ZW1wdHMJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFA3RJZAUSdXBkYXRlZER5bmFtaWNEYXRhBQNuaWwAAADd0Buc", "height": 2742135, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9YC1hZU7qSPga9Ts4kUWFAtsycG6RRXnCFPiP3exZyRE Next: 9iiwT1LASVMPfQGFTWbMTRfNsirwT1jUcnHy6CQqRRkw Diff:
OldNewDifferences
159159 else throw("Unknown chain")
160160 }]
161161
162-func ar (as,at,au,av,aw,ax) = makeString(["%s%d%d%d%d%d", as, toString(at), toString(au), toString(av), toString(aw), toString(ax)], I)
162+func ar (as,at,au,av,aw,ax,ay) = makeString(["%s%d%d%d%d%d%d", as, toString(at), toString(au), toString(av), toString(aw), toString(ax), toString(ay)], I)
163163
164164
165-func ay (az,aA,aB,aC,aD) = makeString(["%s%s%d%d%d", az, aA, toString(aB), toString(aC), toString(aD)], I)
165+func az (aA,aB,aC,aD,aE) = makeString(["%s%s%d%d%d", aA, aB, toString(aC), toString(aD), toString(aE)], I)
166166
167167
168-func aE () = ad(invoke(W, "saveLastTx", nil, nil))
168+func aF () = ad(invoke(W, "saveLastTx", nil, nil))
169169
170170
171-func aF (aG) = valueOrErrorMessage(getString(W, b(toString(aG))), "You don't have a duck staked")
171+func aG (aH) = valueOrErrorMessage(getString(W, b(toString(aH))), "You don't have a duck staked")
172172
173173
174-@Callable(aH)
175-func createTournament (aw,ax,at,au) = {
176- let aG = toString(aH.caller)
177- if (!(containsElement(aq, aG)))
174+@Callable(aI)
175+func createTournament (aw,ax,at,au,ay) = {
176+ let aH = toString(aI.caller)
177+ if (!(containsElement(aq, aH)))
178178 then throw("Permission denied")
179179 else {
180- let aI = getInteger(f)
181- let h = if (isDefined(aI))
180+ let aJ = getInteger(f)
181+ let h = if (isDefined(aJ))
182182 then {
183- let aJ = value(aI)
184- let t = valueOrErrorMessage(getString(i(aJ)), (("Error reading tournament " + toString(aJ)) + " data"))
185- let az = split(t, I)[y]
186- if ((az != "ARCHIVED"))
187- then throw(("Current tournement is not completed, status=" + az))
188- else (aJ + 1)
183+ let aK = value(aJ)
184+ let t = valueOrErrorMessage(getString(i(aK)), (("Error reading tournament " + toString(aK)) + " data"))
185+ let aA = split(t, I)[y]
186+ if ((aA != "ARCHIVED"))
187+ then throw(("Current tournement is not completed, status=" + aA))
188+ else (aK + 1)
189189 }
190190 else 1
191- let aK = lastBlock.timestamp
192- if ((aK > aw))
193- then throw(((("startTime=" + toString(aw)) + " < creationTime=") + toString(aK)))
191+ let aL = lastBlock.timestamp
192+ if ((aL > aw))
193+ then throw(((("startTime=" + toString(aw)) + " < creationTime=") + toString(aL)))
194194 else if ((aw > ax))
195195 then throw(((("endTime=" + toString(ax)) + " < startTime=") + toString(aw)))
196196 else if (((ax - aw) > ao))
199199 then true
200200 else (0 >= au))
201201 then throw(((("Cost should be positive, but passed " + toString(at)) + " and ") + toString(au)))
202- else $Tuple2([IntegerEntry(f, h), StringEntry(g(h), ar(toBase58String(aH.transactionId), at, au, aK, aw, ax)), StringEntry(i(h), ay("CREATED", " ", 0, 0, 0))], h)
202+ else if ((0 > ay))
203+ then throw("Number of Grand Prizes should be non-negative")
204+ else $Tuple2([IntegerEntry(f, h), StringEntry(g(h), ar(toBase58String(aI.transactionId), at, au, aL, aw, ax, ay)), StringEntry(i(h), az("CREATED", " ", 0, 0, 0))], h)
203205 }
204206 }
205207
206208
207209
208-@Callable(aH)
210+@Callable(aI)
209211 func register () = {
210- let aL = aE()
211- if ((size(aH.payments) != 1))
212+ let aM = aF()
213+ if ((size(aI.payments) != 1))
212214 then throw("exactly 1 payment must be attached")
213215 else {
214- let aM = aH.payments[0]
215- let aN = aM.amount
216- let aO = valueOrErrorMessage(aM.assetId, "WLGOLD payments only!")
217- if ((aO != Z))
216+ let aN = aI.payments[0]
217+ let aO = aN.amount
218+ let aP = valueOrErrorMessage(aN.assetId, "WLGOLD payments only!")
219+ if ((aP != Z))
218220 then throw("WLGOLD payments only!")
219221 else {
220- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
221- let aK = lastBlock.timestamp
222- let aP = q(this, aI)
223- let s = aP[o]
224- let t = aP[p]
225- let az = t[y]
226- if (!(if (if (if ((az == "CREATED"))
227- then (aK > parseIntValue(s[w]))
222+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
223+ let aL = lastBlock.timestamp
224+ let aQ = q(this, aJ)
225+ let s = aQ[o]
226+ let t = aQ[p]
227+ let aA = t[y]
228+ if (!(if (if (if ((aA == "CREATED"))
229+ then (aL > parseIntValue(s[w]))
228230 else false)
229- then ((parseIntValue(s[x]) - ap) > aK)
231+ then ((parseIntValue(s[x]) - ap) > aL)
230232 else false)
231233 then true
232- else if ((az == "INPROGRESS"))
233- then ((parseIntValue(s[x]) - ap) > aK)
234+ else if ((aA == "INPROGRESS"))
235+ then ((parseIntValue(s[x]) - ap) > aL)
234236 else false))
235237 then throw("Cannot register now")
236238 else {
237- let aQ = parseIntValue(s[u])
238- if ((aN != aQ))
239- then throw((("Need payment of " + af(aQ, 8)) + " WLGOLD"))
239+ let aR = parseIntValue(s[u])
240+ if ((aO != aR))
241+ then throw((("Need payment of " + af(aR, 8)) + " WLGOLD"))
240242 else {
241- let e = aF(aH.originCaller)
242- let aR = valueOrElse(getString(j(aI)), "")
243- if (if (valueOrElse(getBoolean(l(aI, e)), false))
243+ let e = aG(aI.originCaller)
244+ let aS = valueOrElse(getString(j(aJ)), "")
245+ if (if (valueOrElse(getBoolean(l(aJ, e)), false))
244246 then true
245- else contains(aR, e))
246- then throw(((("Your duck " + e) + " is already registered at tournament ") + toString(aI)))
247+ else contains(aS, e))
248+ then throw(((("Your duck " + e) + " is already registered at tournament ") + toString(aJ)))
247249 else {
248- let aS = ay("INPROGRESS", t[z], parseIntValue(t[A]), (parseIntValue(t[B]) + 1), parseIntValue(t[C]))
249- $Tuple2([IntegerEntry(k(e), aI), BooleanEntry(l(aI, e), true), StringEntry(j(aI), if ((aR == ""))
250+ let aT = az("INPROGRESS", t[z], parseIntValue(t[A]), (parseIntValue(t[B]) + 1), parseIntValue(t[C]))
251+ $Tuple2([IntegerEntry(k(e), aJ), BooleanEntry(l(aJ, e), true), StringEntry(j(aJ), if ((aS == ""))
250252 then (e + ":000")
251- else (((aR + "_") + e) + ":000")), StringEntry(i(aI), aS)], aL)
253+ else (((aS + "_") + e) + ":000")), StringEntry(i(aJ), aT)], aM)
252254 }
253255 }
254256 }
258260
259261
260262
261-@Callable(aH)
263+@Callable(aI)
262264 func newAttempt () = {
263- let aL = aE()
264- let e = aF(aH.originCaller)
265- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
266- let aK = lastBlock.timestamp
267- let aP = q(this, aI)
268- let s = aP[o]
269- let t = aP[p]
270- let az = t[y]
271- if (!(if ((az == "INPROGRESS"))
272- then ((parseIntValue(s[x]) - ap) > aK)
265+ let aM = aF()
266+ let e = aG(aI.originCaller)
267+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
268+ let aL = lastBlock.timestamp
269+ let aQ = q(this, aJ)
270+ let s = aQ[o]
271+ let t = aQ[p]
272+ let aA = t[y]
273+ if (!(if ((aA == "INPROGRESS"))
274+ then ((parseIntValue(s[x]) - ap) > aL)
273275 else false))
274276 then throw("Attempt is not possible")
275- else if (!(valueOrElse(getBoolean(l(aI, e)), false)))
276- then throw(((("Your duck " + e) + " is not registered at tournament ") + toString(aI)))
277+ else if (!(valueOrElse(getBoolean(l(aJ, e)), false)))
278+ then throw(((("Your duck " + e) + " is not registered at tournament ") + toString(aJ)))
277279 else {
278- let aT = m(aI, e)
279- let aU = getInteger(aT)
280- let aV = if (!(isDefined(aU)))
280+ let aU = m(aJ, e)
281+ let aV = getInteger(aU)
282+ let aW = if (!(isDefined(aV)))
281283 then $Tuple2(0, 0)
282- else if ((size(aH.payments) != 1))
284+ else if ((size(aI.payments) != 1))
283285 then throw("exactly 1 payment must be attached")
284286 else {
285- let aM = aH.payments[0]
286- let aN = aM.amount
287- let aO = valueOrErrorMessage(aM.assetId, "WLGOLD payments only!")
288- if ((aO != Z))
287+ let aN = aI.payments[0]
288+ let aO = aN.amount
289+ let aP = valueOrErrorMessage(aN.assetId, "WLGOLD payments only!")
290+ if ((aP != Z))
289291 then throw("WLGOLD payments only!")
290292 else {
291- let aW = parseIntValue(s[v])
292- if ((aN != aW))
293- then throw((("Need payment of " + af(aW, 8)) + " WLGOLD"))
294- else $Tuple2((value(aU) + 1), 1)
293+ let aX = parseIntValue(s[v])
294+ if ((aO != aX))
295+ then throw((("Need payment of " + af(aX, 8)) + " WLGOLD"))
296+ else $Tuple2((value(aV) + 1), 1)
295297 }
296298 }
297- let aX = aV._1
298- let aY = aV._2
299- let aS = ay("INPROGRESS", t[z], parseIntValue(t[A]), parseIntValue(t[B]), (parseIntValue(t[C]) + aY))
300- let aZ = aa(invoke(W, "initDuckTourAttempt", [e], nil))
301- $Tuple2([IntegerEntry(aT, aX), StringEntry(i(aI), aS)], [aL, aX, aZ])
299+ let aY = aW._1
300+ let aZ = aW._2
301+ let aT = az("INPROGRESS", t[z], parseIntValue(t[A]), parseIntValue(t[B]), (parseIntValue(t[C]) + aZ))
302+ let ba = aa(invoke(W, "initDuckTourAttempt", [e], nil))
303+ $Tuple2([IntegerEntry(aU, aY), StringEntry(i(aJ), aT)], [aM, aY, ba])
302304 }
303305 }
304306
305307
306308
307-@Callable(aH)
308-func updateDynamicData (e,ba) = if ((aH.caller != W))
309+@Callable(aI)
310+func updateDynamicData (e,bb) = if ((aI.caller != W))
309311 then throw("Access denied")
310312 else {
311- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
312- let aP = q(this, aI)
313- let s = aP[o]
314- let t = aP[p]
315- if (if (if ((parseIntValue(t[A]) >= ba))
313+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
314+ let aQ = q(this, aJ)
315+ let s = aQ[o]
316+ let t = aQ[p]
317+ if (if (if ((parseIntValue(t[A]) >= bb))
316318 then true
317319 else (t[y] != "INPROGRESS"))
318320 then true
319321 else (lastBlock.timestamp > parseIntValue(s[x])))
320322 then $Tuple2(nil, 0)
321323 else {
322- let aS = ay("INPROGRESS", e, ba, parseIntValue(t[B]), parseIntValue(t[C]))
323- $Tuple2([StringEntry(i(aI), aS)], 0)
324+ let aT = az("INPROGRESS", e, bb, parseIntValue(t[B]), parseIntValue(t[C]))
325+ $Tuple2([StringEntry(i(aJ), aT)], 0)
324326 }
325327 }
326328
327329
328330
329-@Callable(aH)
330-func saveDuckResult (e,ba) = if ((aH.caller != W))
331+@Callable(aI)
332+func saveDuckResult (e,bb) = if ((aI.caller != W))
331333 then throw("Access denied")
332334 else {
333- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
334- let aP = q(this, aI)
335- let s = aP[o]
336- let t = aP[p]
337- let bb = split(valueOrElse(getString(W, d(e)), a), "_")
338- let bc = n(aI, e)
339- if (if (if (if ((bb[E] == "T"))
340- then (parseIntValue(bb[D]) == aI)
335+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
336+ let aQ = q(this, aJ)
337+ let s = aQ[o]
338+ let t = aQ[p]
339+ let bc = split(valueOrElse(getString(W, d(e)), a), "_")
340+ let bd = n(aJ, e)
341+ if (if (if (if ((bc[E] == "T"))
342+ then (parseIntValue(bc[D]) == aJ)
341343 else false)
342344 then (t[y] == "INPROGRESS")
343345 else false)
344346 then (parseIntValue(s[x]) >= lastBlock.timestamp)
345347 else false)
346348 then {
347- let bd = valueOrElse(getInteger(bc), 0)
348- let be = j(aI)
349- let aR = valueOrElse(getString(be), "")
350- let bf = if ((ba > bd))
351- then if (!(contains(aR, e)))
349+ let be = valueOrElse(getInteger(bd), 0)
350+ let bf = j(aJ)
351+ let aS = valueOrElse(getString(bf), "")
352+ let bg = if ((bb > be))
353+ then if (!(contains(aS, e)))
352354 then throw(("scoreBoard does not contain " + e))
353355 else {
354- let bg = split_51C(aR, e)
355- ((((bg[0] + e) + ":") + al(ba, 3)) + drop(bg[1], 4))
356+ let bh = split_51C(aS, e)
357+ ((((bh[0] + e) + ":") + al(bb, 3)) + drop(bh[1], 4))
356358 }
357- else aR
358- $Tuple2([IntegerEntry(bc, max([bd, ba])), StringEntry(be, bf)], 0)
359+ else aS
360+ $Tuple2([IntegerEntry(bd, max([be, bb])), StringEntry(bf, bg)], 0)
359361 }
360362 else $Tuple2(nil, 0)
361363 }
362364
363365
364366
365-@Callable(aH)
367+@Callable(aI)
366368 func finishTournament (h) = {
367- let aG = toString(aH.caller)
368- if (!(containsElement(aq, aG)))
369+ let aH = toString(aI.caller)
370+ if (!(containsElement(aq, aH)))
369371 then throw("Permission denied")
370372 else {
371- let aP = q(this, h)
372- let t = aP[p]
373- let az = t[y]
374- if ((az == "ARCHIVED"))
373+ let aQ = q(this, h)
374+ let t = aQ[p]
375+ let aA = t[y]
376+ if ((aA == "ARCHIVED"))
375377 then throw((("Tournament " + toString(h)) + " is already ARCHIVED"))
376378 else {
377- let aS = ay("ARCHIVED", t[z], parseIntValue(t[A]), parseIntValue(t[B]), parseIntValue(t[C]))
378- $Tuple2([StringEntry(i(h), aS)], 0)
379+ let aT = az("ARCHIVED", t[z], parseIntValue(t[A]), parseIntValue(t[B]), parseIntValue(t[C]))
380+ $Tuple2([StringEntry(i(h), aT)], 0)
379381 }
380382 }
381383 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "Africa_F_Africa"
55
66 func b (c) = ("stakedDuckByOwner_" + c)
77
88
99 func d (e) = ("duckLocation_" + e)
1010
1111
1212 let f = "%s__lastTourId"
1313
1414 func g (h) = ("%s%d__tourStaticData__" + toString(h))
1515
1616
1717 func i (h) = ("%s%d__tourDynamicData__" + toString(h))
1818
1919
2020 func j (h) = ("%s%d__scoreBoard__" + toString(h))
2121
2222
2323 func k (e) = ("%s%s__lastRegisteredTourByDuck__" + e)
2424
2525
2626 func l (h,e) = makeString(["%s%d%s__isRegisteredByTourAndDuck", toString(h), e], "__")
2727
2828
2929 func m (h,e) = makeString(["%s%d%s__lastAttemptByTourAndDuck", toString(h), e], "__")
3030
3131
3232 func n (h,e) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(h), e], "__")
3333
3434
3535 let o = 0
3636
3737 let p = 1
3838
3939 func q (r,h) = {
4040 let s = split(valueOrErrorMessage(getString(r, g(h)), (("Error reading tournament " + toString(h)) + " data")), "__")
4141 let t = split(valueOrErrorMessage(getString(r, i(h)), (("Error reading tournament " + toString(h)) + " data")), "__")
4242 [s, t]
4343 }
4444
4545
4646 let u = 2
4747
4848 let v = 3
4949
5050 let w = 5
5151
5252 let x = 6
5353
5454 let y = 1
5555
5656 let z = 2
5757
5858 let A = 3
5959
6060 let B = 4
6161
6262 let C = 5
6363
6464 let D = 0
6565
6666 let E = 1
6767
6868 let F = take(drop(this.bytes, 1), 1)
6969
7070 let G = {
7171 let H = F
7272 if ((base58'2W' == H))
7373 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
7474 else if ((base58'2T' == H))
7575 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
7676 else throw("Unknown chain")
7777 }
7878
7979 let I = "__"
8080
8181 func J (K,L) = valueOrErrorMessage(getString(K, L), makeString(["mandatory ", toString(K), ".", L, " is not defined"], ""))
8282
8383
8484 let M = 1
8585
8686 let N = 4
8787
8888 func O () = "%s__restConfig"
8989
9090
9191 func P () = "%s__restAddr"
9292
9393
9494 func Q (R) = split_4C(J(R, O()), I)
9595
9696
9797 func S (T,U) = valueOrErrorMessage(addressFromString(T[U]), ("Rest cfg doesn't contain address at index " + toString(U)))
9898
9999
100100 let V = addressFromStringValue(valueOrElse(getString(this, P()), G))
101101
102102 let T = Q(V)
103103
104104 let W = S(T, M)
105105
106106 let X = S(T, N)
107107
108108 let Y = "wlg_assetId"
109109
110110 let Z = valueOrErrorMessage(getBinary(X, Y), "Not initialized yet")
111111
112112 func aa (ab) = {
113113 let H = ab
114114 if ($isInstanceOf(H, "String"))
115115 then {
116116 let ac = H
117117 ac
118118 }
119119 else throw("fail to cast into String")
120120 }
121121
122122
123123 func ad (ab) = {
124124 let H = ab
125125 if ($isInstanceOf(H, "Int"))
126126 then {
127127 let ae = H
128128 ae
129129 }
130130 else throw("fail to cast into Int")
131131 }
132132
133133
134134 func af (ag,ah) = {
135135 let ai = pow(10, 0, ah, 0, 0, DOWN)
136136 let aj = toString((ag % ai))
137137 let ak = drop(toString(ai), (1 + size(aj)))
138138 (((toString((ag / ai)) + ".") + ak) + aj)
139139 }
140140
141141
142142 func al (ag,am) = {
143143 let an = toString(ag)
144144 let ak = drop(toString(pow(10, 0, (am - size(an)), 0, 0, DOWN)), 1)
145145 (ak + an)
146146 }
147147
148148
149149 let ao = 432000000
150150
151151 let ap = 3600000
152152
153153 let aq = [toString(this), {
154154 let H = F
155155 if ((base58'2W' == H))
156156 then "3PEe2RELUHCFCBsmSCNcBJ8N3URLVQende7"
157157 else if ((base58'2T' == H))
158158 then "3MtBgJTaLxPB3C7UJD1UE8qjkHthfKvFQYY"
159159 else throw("Unknown chain")
160160 }]
161161
162-func ar (as,at,au,av,aw,ax) = makeString(["%s%d%d%d%d%d", as, toString(at), toString(au), toString(av), toString(aw), toString(ax)], I)
162+func ar (as,at,au,av,aw,ax,ay) = makeString(["%s%d%d%d%d%d%d", as, toString(at), toString(au), toString(av), toString(aw), toString(ax), toString(ay)], I)
163163
164164
165-func ay (az,aA,aB,aC,aD) = makeString(["%s%s%d%d%d", az, aA, toString(aB), toString(aC), toString(aD)], I)
165+func az (aA,aB,aC,aD,aE) = makeString(["%s%s%d%d%d", aA, aB, toString(aC), toString(aD), toString(aE)], I)
166166
167167
168-func aE () = ad(invoke(W, "saveLastTx", nil, nil))
168+func aF () = ad(invoke(W, "saveLastTx", nil, nil))
169169
170170
171-func aF (aG) = valueOrErrorMessage(getString(W, b(toString(aG))), "You don't have a duck staked")
171+func aG (aH) = valueOrErrorMessage(getString(W, b(toString(aH))), "You don't have a duck staked")
172172
173173
174-@Callable(aH)
175-func createTournament (aw,ax,at,au) = {
176- let aG = toString(aH.caller)
177- if (!(containsElement(aq, aG)))
174+@Callable(aI)
175+func createTournament (aw,ax,at,au,ay) = {
176+ let aH = toString(aI.caller)
177+ if (!(containsElement(aq, aH)))
178178 then throw("Permission denied")
179179 else {
180- let aI = getInteger(f)
181- let h = if (isDefined(aI))
180+ let aJ = getInteger(f)
181+ let h = if (isDefined(aJ))
182182 then {
183- let aJ = value(aI)
184- let t = valueOrErrorMessage(getString(i(aJ)), (("Error reading tournament " + toString(aJ)) + " data"))
185- let az = split(t, I)[y]
186- if ((az != "ARCHIVED"))
187- then throw(("Current tournement is not completed, status=" + az))
188- else (aJ + 1)
183+ let aK = value(aJ)
184+ let t = valueOrErrorMessage(getString(i(aK)), (("Error reading tournament " + toString(aK)) + " data"))
185+ let aA = split(t, I)[y]
186+ if ((aA != "ARCHIVED"))
187+ then throw(("Current tournement is not completed, status=" + aA))
188+ else (aK + 1)
189189 }
190190 else 1
191- let aK = lastBlock.timestamp
192- if ((aK > aw))
193- then throw(((("startTime=" + toString(aw)) + " < creationTime=") + toString(aK)))
191+ let aL = lastBlock.timestamp
192+ if ((aL > aw))
193+ then throw(((("startTime=" + toString(aw)) + " < creationTime=") + toString(aL)))
194194 else if ((aw > ax))
195195 then throw(((("endTime=" + toString(ax)) + " < startTime=") + toString(aw)))
196196 else if (((ax - aw) > ao))
197197 then throw(((("Tournament period exceeds max: " + toString((ax - aw))) + " > ") + toString(ao)))
198198 else if (if ((0 >= at))
199199 then true
200200 else (0 >= au))
201201 then throw(((("Cost should be positive, but passed " + toString(at)) + " and ") + toString(au)))
202- else $Tuple2([IntegerEntry(f, h), StringEntry(g(h), ar(toBase58String(aH.transactionId), at, au, aK, aw, ax)), StringEntry(i(h), ay("CREATED", " ", 0, 0, 0))], h)
202+ else if ((0 > ay))
203+ then throw("Number of Grand Prizes should be non-negative")
204+ else $Tuple2([IntegerEntry(f, h), StringEntry(g(h), ar(toBase58String(aI.transactionId), at, au, aL, aw, ax, ay)), StringEntry(i(h), az("CREATED", " ", 0, 0, 0))], h)
203205 }
204206 }
205207
206208
207209
208-@Callable(aH)
210+@Callable(aI)
209211 func register () = {
210- let aL = aE()
211- if ((size(aH.payments) != 1))
212+ let aM = aF()
213+ if ((size(aI.payments) != 1))
212214 then throw("exactly 1 payment must be attached")
213215 else {
214- let aM = aH.payments[0]
215- let aN = aM.amount
216- let aO = valueOrErrorMessage(aM.assetId, "WLGOLD payments only!")
217- if ((aO != Z))
216+ let aN = aI.payments[0]
217+ let aO = aN.amount
218+ let aP = valueOrErrorMessage(aN.assetId, "WLGOLD payments only!")
219+ if ((aP != Z))
218220 then throw("WLGOLD payments only!")
219221 else {
220- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
221- let aK = lastBlock.timestamp
222- let aP = q(this, aI)
223- let s = aP[o]
224- let t = aP[p]
225- let az = t[y]
226- if (!(if (if (if ((az == "CREATED"))
227- then (aK > parseIntValue(s[w]))
222+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
223+ let aL = lastBlock.timestamp
224+ let aQ = q(this, aJ)
225+ let s = aQ[o]
226+ let t = aQ[p]
227+ let aA = t[y]
228+ if (!(if (if (if ((aA == "CREATED"))
229+ then (aL > parseIntValue(s[w]))
228230 else false)
229- then ((parseIntValue(s[x]) - ap) > aK)
231+ then ((parseIntValue(s[x]) - ap) > aL)
230232 else false)
231233 then true
232- else if ((az == "INPROGRESS"))
233- then ((parseIntValue(s[x]) - ap) > aK)
234+ else if ((aA == "INPROGRESS"))
235+ then ((parseIntValue(s[x]) - ap) > aL)
234236 else false))
235237 then throw("Cannot register now")
236238 else {
237- let aQ = parseIntValue(s[u])
238- if ((aN != aQ))
239- then throw((("Need payment of " + af(aQ, 8)) + " WLGOLD"))
239+ let aR = parseIntValue(s[u])
240+ if ((aO != aR))
241+ then throw((("Need payment of " + af(aR, 8)) + " WLGOLD"))
240242 else {
241- let e = aF(aH.originCaller)
242- let aR = valueOrElse(getString(j(aI)), "")
243- if (if (valueOrElse(getBoolean(l(aI, e)), false))
243+ let e = aG(aI.originCaller)
244+ let aS = valueOrElse(getString(j(aJ)), "")
245+ if (if (valueOrElse(getBoolean(l(aJ, e)), false))
244246 then true
245- else contains(aR, e))
246- then throw(((("Your duck " + e) + " is already registered at tournament ") + toString(aI)))
247+ else contains(aS, e))
248+ then throw(((("Your duck " + e) + " is already registered at tournament ") + toString(aJ)))
247249 else {
248- let aS = ay("INPROGRESS", t[z], parseIntValue(t[A]), (parseIntValue(t[B]) + 1), parseIntValue(t[C]))
249- $Tuple2([IntegerEntry(k(e), aI), BooleanEntry(l(aI, e), true), StringEntry(j(aI), if ((aR == ""))
250+ let aT = az("INPROGRESS", t[z], parseIntValue(t[A]), (parseIntValue(t[B]) + 1), parseIntValue(t[C]))
251+ $Tuple2([IntegerEntry(k(e), aJ), BooleanEntry(l(aJ, e), true), StringEntry(j(aJ), if ((aS == ""))
250252 then (e + ":000")
251- else (((aR + "_") + e) + ":000")), StringEntry(i(aI), aS)], aL)
253+ else (((aS + "_") + e) + ":000")), StringEntry(i(aJ), aT)], aM)
252254 }
253255 }
254256 }
255257 }
256258 }
257259 }
258260
259261
260262
261-@Callable(aH)
263+@Callable(aI)
262264 func newAttempt () = {
263- let aL = aE()
264- let e = aF(aH.originCaller)
265- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
266- let aK = lastBlock.timestamp
267- let aP = q(this, aI)
268- let s = aP[o]
269- let t = aP[p]
270- let az = t[y]
271- if (!(if ((az == "INPROGRESS"))
272- then ((parseIntValue(s[x]) - ap) > aK)
265+ let aM = aF()
266+ let e = aG(aI.originCaller)
267+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
268+ let aL = lastBlock.timestamp
269+ let aQ = q(this, aJ)
270+ let s = aQ[o]
271+ let t = aQ[p]
272+ let aA = t[y]
273+ if (!(if ((aA == "INPROGRESS"))
274+ then ((parseIntValue(s[x]) - ap) > aL)
273275 else false))
274276 then throw("Attempt is not possible")
275- else if (!(valueOrElse(getBoolean(l(aI, e)), false)))
276- then throw(((("Your duck " + e) + " is not registered at tournament ") + toString(aI)))
277+ else if (!(valueOrElse(getBoolean(l(aJ, e)), false)))
278+ then throw(((("Your duck " + e) + " is not registered at tournament ") + toString(aJ)))
277279 else {
278- let aT = m(aI, e)
279- let aU = getInteger(aT)
280- let aV = if (!(isDefined(aU)))
280+ let aU = m(aJ, e)
281+ let aV = getInteger(aU)
282+ let aW = if (!(isDefined(aV)))
281283 then $Tuple2(0, 0)
282- else if ((size(aH.payments) != 1))
284+ else if ((size(aI.payments) != 1))
283285 then throw("exactly 1 payment must be attached")
284286 else {
285- let aM = aH.payments[0]
286- let aN = aM.amount
287- let aO = valueOrErrorMessage(aM.assetId, "WLGOLD payments only!")
288- if ((aO != Z))
287+ let aN = aI.payments[0]
288+ let aO = aN.amount
289+ let aP = valueOrErrorMessage(aN.assetId, "WLGOLD payments only!")
290+ if ((aP != Z))
289291 then throw("WLGOLD payments only!")
290292 else {
291- let aW = parseIntValue(s[v])
292- if ((aN != aW))
293- then throw((("Need payment of " + af(aW, 8)) + " WLGOLD"))
294- else $Tuple2((value(aU) + 1), 1)
293+ let aX = parseIntValue(s[v])
294+ if ((aO != aX))
295+ then throw((("Need payment of " + af(aX, 8)) + " WLGOLD"))
296+ else $Tuple2((value(aV) + 1), 1)
295297 }
296298 }
297- let aX = aV._1
298- let aY = aV._2
299- let aS = ay("INPROGRESS", t[z], parseIntValue(t[A]), parseIntValue(t[B]), (parseIntValue(t[C]) + aY))
300- let aZ = aa(invoke(W, "initDuckTourAttempt", [e], nil))
301- $Tuple2([IntegerEntry(aT, aX), StringEntry(i(aI), aS)], [aL, aX, aZ])
299+ let aY = aW._1
300+ let aZ = aW._2
301+ let aT = az("INPROGRESS", t[z], parseIntValue(t[A]), parseIntValue(t[B]), (parseIntValue(t[C]) + aZ))
302+ let ba = aa(invoke(W, "initDuckTourAttempt", [e], nil))
303+ $Tuple2([IntegerEntry(aU, aY), StringEntry(i(aJ), aT)], [aM, aY, ba])
302304 }
303305 }
304306
305307
306308
307-@Callable(aH)
308-func updateDynamicData (e,ba) = if ((aH.caller != W))
309+@Callable(aI)
310+func updateDynamicData (e,bb) = if ((aI.caller != W))
309311 then throw("Access denied")
310312 else {
311- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
312- let aP = q(this, aI)
313- let s = aP[o]
314- let t = aP[p]
315- if (if (if ((parseIntValue(t[A]) >= ba))
313+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
314+ let aQ = q(this, aJ)
315+ let s = aQ[o]
316+ let t = aQ[p]
317+ if (if (if ((parseIntValue(t[A]) >= bb))
316318 then true
317319 else (t[y] != "INPROGRESS"))
318320 then true
319321 else (lastBlock.timestamp > parseIntValue(s[x])))
320322 then $Tuple2(nil, 0)
321323 else {
322- let aS = ay("INPROGRESS", e, ba, parseIntValue(t[B]), parseIntValue(t[C]))
323- $Tuple2([StringEntry(i(aI), aS)], 0)
324+ let aT = az("INPROGRESS", e, bb, parseIntValue(t[B]), parseIntValue(t[C]))
325+ $Tuple2([StringEntry(i(aJ), aT)], 0)
324326 }
325327 }
326328
327329
328330
329-@Callable(aH)
330-func saveDuckResult (e,ba) = if ((aH.caller != W))
331+@Callable(aI)
332+func saveDuckResult (e,bb) = if ((aI.caller != W))
331333 then throw("Access denied")
332334 else {
333- let aI = valueOrErrorMessage(getInteger(f), "No active tournaments")
334- let aP = q(this, aI)
335- let s = aP[o]
336- let t = aP[p]
337- let bb = split(valueOrElse(getString(W, d(e)), a), "_")
338- let bc = n(aI, e)
339- if (if (if (if ((bb[E] == "T"))
340- then (parseIntValue(bb[D]) == aI)
335+ let aJ = valueOrErrorMessage(getInteger(f), "No active tournaments")
336+ let aQ = q(this, aJ)
337+ let s = aQ[o]
338+ let t = aQ[p]
339+ let bc = split(valueOrElse(getString(W, d(e)), a), "_")
340+ let bd = n(aJ, e)
341+ if (if (if (if ((bc[E] == "T"))
342+ then (parseIntValue(bc[D]) == aJ)
341343 else false)
342344 then (t[y] == "INPROGRESS")
343345 else false)
344346 then (parseIntValue(s[x]) >= lastBlock.timestamp)
345347 else false)
346348 then {
347- let bd = valueOrElse(getInteger(bc), 0)
348- let be = j(aI)
349- let aR = valueOrElse(getString(be), "")
350- let bf = if ((ba > bd))
351- then if (!(contains(aR, e)))
349+ let be = valueOrElse(getInteger(bd), 0)
350+ let bf = j(aJ)
351+ let aS = valueOrElse(getString(bf), "")
352+ let bg = if ((bb > be))
353+ then if (!(contains(aS, e)))
352354 then throw(("scoreBoard does not contain " + e))
353355 else {
354- let bg = split_51C(aR, e)
355- ((((bg[0] + e) + ":") + al(ba, 3)) + drop(bg[1], 4))
356+ let bh = split_51C(aS, e)
357+ ((((bh[0] + e) + ":") + al(bb, 3)) + drop(bh[1], 4))
356358 }
357- else aR
358- $Tuple2([IntegerEntry(bc, max([bd, ba])), StringEntry(be, bf)], 0)
359+ else aS
360+ $Tuple2([IntegerEntry(bd, max([be, bb])), StringEntry(bf, bg)], 0)
359361 }
360362 else $Tuple2(nil, 0)
361363 }
362364
363365
364366
365-@Callable(aH)
367+@Callable(aI)
366368 func finishTournament (h) = {
367- let aG = toString(aH.caller)
368- if (!(containsElement(aq, aG)))
369+ let aH = toString(aI.caller)
370+ if (!(containsElement(aq, aH)))
369371 then throw("Permission denied")
370372 else {
371- let aP = q(this, h)
372- let t = aP[p]
373- let az = t[y]
374- if ((az == "ARCHIVED"))
373+ let aQ = q(this, h)
374+ let t = aQ[p]
375+ let aA = t[y]
376+ if ((aA == "ARCHIVED"))
375377 then throw((("Tournament " + toString(h)) + " is already ARCHIVED"))
376378 else {
377- let aS = ay("ARCHIVED", t[z], parseIntValue(t[A]), parseIntValue(t[B]), parseIntValue(t[C]))
378- $Tuple2([StringEntry(i(h), aS)], 0)
379+ let aT = az("ARCHIVED", t[z], parseIntValue(t[A]), parseIntValue(t[B]), parseIntValue(t[C]))
380+ $Tuple2([StringEntry(i(h), aT)], 0)
379381 }
380382 }
381383 }
382384
383385

github/deemru/w8io/169f3d6 
102.62 ms