tx · 7w79SMLQzy6sU9UA4mqF75bPHBW8LhiMLn3htTSkKVLp

3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx:  -0.00700000 Waves

2023.08.05 16:55 [2697375] smart account 3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx > SELF 0.00000000 Waves

{ "type": 13, "id": "7w79SMLQzy6sU9UA4mqF75bPHBW8LhiMLn3htTSkKVLp", "fee": 700000, "feeAssetId": null, "timestamp": 1691243766344, "version": 2, "chainId": 84, "sender": "3N3nfqFcxXfd3T18V9icDdh58MJ9wQ2k2xx", "senderPublicKey": "UGqkWsCpv7xRVXkQRXyLd6pWPDtYGXmPip7FxSd1pAu", "proofs": [ "MSukrgCURuZHdQ76ZmV5QwmiNothqZvL7c6c53L6aJva4rFftZc4nQhNuWAbJsnPMDdu1i8fAV9txffgJkNxFVr" ], "script": "base64:BgIMCAISBgoEAQEBARIAJwEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQN0SWQJAKwCAgIWJXMlZF9fdG91clN0YXRpY0RhdGFfXwkApAMBBQN0SWQBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBA3RJZAkArAICAhclcyVkX190b3VyRHluYW1pY0RhdGFfXwkApAMBBQN0SWQBF2tleUFsbFJlZ2lzdHJhbmRzQnlUb3VyAQN0SWQJAKwCAgIWJXMlZF9fYWxsUmVnaXN0cmFuZHNfXwkApAMBBQN0SWQAE3RTdGF0aWNSZWdpc3RlckNvc3QAAgAMdFN0YXRpY1N0YXJ0AAUACnRTdGF0aWNFbmQABgAOdER5bmFtaWNTdGF0dXMAAQAPdER5bmFtaWNXaW5EdWNrAAIAEXREeW5hbWljV2luUmVzdWx0AAMAFXREeW5hbWljVG90YWxSZWdDb3VudAAEABV0RHluYW1pY1RvdGFsQXR0ZW1wdHMABQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BRQ3V2RmJ2aDRMa1BVbnJuVTF6M2puYkExcDltM1dOaHYDCQAAAgEBVAUHJG1hdGNoMAIjM011bWtHR3p0Q0tBWHBXRHF4a2Rkb2ZxWFNVYnFRa3ZTSnkJAAIBAg1Vbmtub3duIGNoYWluAANTRVACAl9fAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQANSWR4Q2ZnV2xnRGFwcAAEAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIHcmVzdENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFB3Jlc3RDZmcFA2lkeAkArAICAipSZXN0IGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAADXdsZ0Fzc2V0SWRLZXkCC3dsZ19hc3NldElkAAp3bGdBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgULd2xnQ29udHJhY3QFDXdsZ0Fzc2V0SWRLZXkCE05vdCBpbml0aWFsaXplZCB5ZXQBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEKZml4ZWRQb2ludAIDdmFsCGRlY2ltYWxzBAZ0ZW5Qb3cJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAdsb3dQYXJ0CQCkAwEJAGoCBQN2YWwFBnRlblBvdwQGemVyb2VzCQCwAgIJAKQDAQUGdGVuUG93CQBkAgABCQCxAgEFB2xvd1BhcnQJAKwCAgkArAICCQCsAgIJAKQDAQkAaQIFA3ZhbAUGdGVuUG93AgEuBQZ6ZXJvZXMFB2xvd1BhcnQAE01BWFRPVVJOQU1FTlRMRU5HVEgAgJj/zQEABEhPVVIAgN3bAQAKYWRtaW5zTGlzdAkAzAgCCQClCAEFBHRoaXMJAMwIAgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BFZTJSRUxVSENGQ0JzbVNDTmNCSjhOM1VSTFZRZW5kZTcDCQAAAgEBVAUHJG1hdGNoMAIjM010QmdKVGFMeFBCM0M3VUpEMVVFOHFqa0h0aGZLdkZRWVkJAAIBAg1Vbmtub3duIGNoYWluBQNuaWwADWxhc3RUb3VySWRLZXkCDiVzX19sYXN0VG91cklkARtrZXlMYXN0UmVnaXN0ZXJlZFRvdXJCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICICVzJXNfX2xhc3RSZWdpc3RlcmVkVG91ckJ5RHVja19fBQtkdWNrQXNzZXRJZAEca2V5SXNSZWdpc3RlcmVkQnlUb3VyQW5kRHVjawIDdElkC2R1Y2tBc3NldElkCQC5CQIJAMwIAgIhJXMlZCVzX19pc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwFA1NFUAEKc3RhdGljRGF0YQYEdHhJZAxyZWdpc3RlckNvc3QLYXR0ZW1wdENvc3QMY3JlYXRpb25UaW1lCXN0YXJ0VGltZQdlbmRUaW1lCQC5CQIJAMwIAgIMJXMlZCVkJWQlZCVkCQDMCAIFBHR4SWQJAMwIAgkApAMBBQxyZWdpc3RlckNvc3QJAMwIAgkApAMBBQthdHRlbXB0Q29zdAkAzAgCCQCkAwEFDGNyZWF0aW9uVGltZQkAzAgCCQCkAwEFCXN0YXJ0VGltZQkAzAgCCQCkAwEFB2VuZFRpbWUFA25pbAUDU0VQAQtkeW5hbWljRGF0YQUGc3RhdHVzB3dpbkR1Y2sJd2luUmVzdWx0CXRvdGFsUmVncw10b3RhbEF0dGVtcHRzCQC5CQIJAMwIAgIKJXMlcyVkJWQlZAkAzAgCBQZzdGF0dXMJAMwIAgUHd2luRHVjawkAzAgCCQCkAwEFCXdpblJlc3VsdAkAzAgCCQCkAwEFCXRvdGFsUmVncwkAzAgCCQCkAwEFDXRvdGFsQXR0ZW1wdHMFA25pbAUDU0VQAQZwcm9sb2cACQEFYXNJbnQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIKc2F2ZUxhc3RUeAUDbmlsBQNuaWwCAWkBEGNyZWF0ZVRvdXJuYW1lbnQECXN0YXJ0VGltZQdlbmRUaW1lDHJlZ2lzdGVyQ29zdAthdHRlbXB0Q29zdAQGY2FsbGVyCQClCAEIBQFpBmNhbGxlcgMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFCmFkbWluc0xpc3QFBmNhbGxlcgkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAZsYXN0SWQJAJ8IAQUNbGFzdFRvdXJJZEtleQQDdElkAwkBCWlzRGVmaW5lZAEFBmxhc3RJZAQKbGFzdFRvdXJJZAkBBXZhbHVlAQUGbGFzdElkBAdkeW5hbWljCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQpsYXN0VG91cklkCQCsAgIJAKwCAgIZRXJyb3IgcmVhZGluZyB0b3VybmFtZW50IAkApAMBBQpsYXN0VG91cklkAgUgZGF0YQQGc3RhdHVzCQCRAwIJALUJAgUHZHluYW1pYwUDU0VQBQ50RHluYW1pY1N0YXR1cwMJAQIhPQIFBnN0YXR1cwIIQVJDSElWRUQJAAIBCQCsAgICLEN1cnJlbnQgdG91cm5lbWVudCBpcyBub3QgY29tcGxldGVkLCBzdGF0dXM9BQZzdGF0dXMJAGQCBQpsYXN0VG91cklkAAEAAQQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGYCBQNub3cFCXN0YXJ0VGltZQkAAgEJAKwCAgkArAICCQCsAgICCnN0YXJ0VGltZT0JAKQDAQUJc3RhcnRUaW1lAhAgPCBjcmVhdGlvblRpbWU9CQCkAwEFA25vdwMJAGYCBQlzdGFydFRpbWUFB2VuZFRpbWUJAAIBCQCsAgIJAKwCAgkArAICAghlbmRUaW1lPQkApAMBBQdlbmRUaW1lAg0gPCBzdGFydFRpbWU9CQCkAwEFCXN0YXJ0VGltZQMJAGYCCQBlAgUHZW5kVGltZQUJc3RhcnRUaW1lBRNNQVhUT1VSTkFNRU5UTEVOR1RICQACAQkArAICCQCsAgIJAKwCAgIfVG91cm5hbWVudCBwZXJpb2QgZXhjZWVkcyBtYXg6IAkApAMBCQBlAgUHZW5kVGltZQUJc3RhcnRUaW1lAgMgPiAJAKQDAQUTTUFYVE9VUk5BTUVOVExFTkdUSAMDCQBnAgAABQxyZWdpc3RlckNvc3QGCQBnAgAABQthdHRlbXB0Q29zdAkAAgEJAKwCAgkArAICCQCsAgICJENvc3Qgc2hvdWxkIGJlIHBvc2l0aXZlLCBidXQgcGFzc2VkIAkApAMBBQxyZWdpc3RlckNvc3QCBSBhbmQgCQCkAwEFC2F0dGVtcHRDb3N0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFDWxhc3RUb3VySWRLZXkFA3RJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQUDdElkCQEKc3RhdGljRGF0YQYJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUMcmVnaXN0ZXJDb3N0BQthdHRlbXB0Q29zdAUDbm93BQlzdGFydFRpbWUFB2VuZFRpbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAQtkeW5hbWljRGF0YQUCB0NSRUFURUQCAAAAAAAAAAUDbmlsBQN0SWQBaQEIcmVnaXN0ZXIABAxwcm9sb2dSZXN1bHQJAQZwcm9sb2cAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFA3BtdAdhc3NldElkAhVXTEdPTEQgcGF5bWVudHMgb25seSEDCQECIT0CBQpwbXRBc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAZsYXN0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ1sYXN0VG91cklkS2V5AhVObyBhY3RpdmUgdG91cm5hbWVudHMEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEBnN0YXRpYwkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFBmxhc3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUGbGFzdElkAgUgZGF0YQUDU0VQBAdkeW5hbWljCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFBmxhc3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUGbGFzdElkAgUgZGF0YQUDU0VQBAZzdGF0dXMJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMDCQEBIQEDAwMJAAACBQZzdGF0dXMCB0NSRUFURUQJAGYCBQNub3cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFDHRTdGF0aWNTdGFydAcJAGYCCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUESE9VUgUDbm93BwYDCQAAAgUGc3RhdHVzAgpJTlBST0dSRVNTCQBmAgkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFBEhPVVIFA25vdwcJAAIBAhNDYW5ub3QgcmVnaXN0ZXIgbm93BAdyZWdDb3N0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBRN0U3RhdGljUmVnaXN0ZXJDb3N0AwkBAiE9AgUGd2xnQW10BQdyZWdDb3N0CQACAQkArAICCQCsAgICEE5lZWQgcGF5bWVudCBvZiAJAQpmaXhlZFBvaW50AgUHcmVnQ29zdAAIAgcgV0xHT0xEBARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEDm9sZFJlZ2lzdHJhbmRzCQELdmFsdWVPckVsc2UCCQCiCAEJARdrZXlBbGxSZWdpc3RyYW5kc0J5VG91cgEFBmxhc3RJZAIABAdyZWdMaXN0AwkAAAIFDm9sZFJlZ2lzdHJhbmRzAgAFA25pbAkAvQkCBQ5vbGRSZWdpc3RyYW5kcwIBXwMDCQELdmFsdWVPckVsc2UCCQCgCAEJARxrZXlJc1JlZ2lzdGVyZWRCeVRvdXJBbmREdWNrAgUGbGFzdElkBQtkdWNrQXNzZXRJZAcGCQEPY29udGFpbnNFbGVtZW50AgUHcmVnTGlzdAULZHVja0Fzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAgpZb3VyIGR1Y2sgBQtkdWNrQXNzZXRJZAIlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBhdCB0b3VybmFtZW50IAkApAMBBQZsYXN0SWQEEnVwZGF0ZWREeW5hbWljRGF0YQkBC2R5bmFtaWNEYXRhBQIKSU5QUk9HUkVTUwkAkQMCBQdkeW5hbWljBQ90RHluYW1pY1dpbkR1Y2sJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRF0RHluYW1pY1dpblJlc3VsdAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdkeW5hbWljBRV0RHluYW1pY1RvdGFsUmVnQ291bnQAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB2R5bmFtaWMFFXREeW5hbWljVG90YWxBdHRlbXB0cwkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEba2V5TGFzdFJlZ2lzdGVyZWRUb3VyQnlEdWNrAQULZHVja0Fzc2V0SWQFBmxhc3RJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBHGtleUlzUmVnaXN0ZXJlZEJ5VG91ckFuZER1Y2sCBQZsYXN0SWQFC2R1Y2tBc3NldElkBgkAzAgCCQELU3RyaW5nRW50cnkCCQEXa2V5QWxsUmVnaXN0cmFuZHNCeVRvdXIBBQZsYXN0SWQJALsJAgkAzQgCBQdyZWdMaXN0BQtkdWNrQXNzZXRJZAIBXwkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5VG91ckR5bmFtaWNEYXRhQnlJZAEFBmxhc3RJZAUSdXBkYXRlZER5bmFtaWNEYXRhBQNuaWwFDHByb2xvZ1Jlc3VsdACOCvX4", "height": 2697375, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 84D41qbBENBSPDqhHaLyHpM4x43pTidvbitRrovfyF9V Next: Af8Ya79QSUcKfzfyqHyQrhjgdpXxCb1q9qWUkkmCCmvF Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
5+
6+
7+func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
8+
9+
10+func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
11+
12+
13+func keyAllRegistrandsByTour (tId) = ("%s%d__allRegistrands__" + toString(tId))
14+
15+
16+let tStaticRegisterCost = 2
17+
18+let tStaticStart = 5
19+
20+let tStaticEnd = 6
21+
22+let tDynamicStatus = 1
23+
24+let tDynamicWinDuck = 2
25+
26+let tDynamicWinResult = 3
27+
28+let tDynamicTotalRegCount = 4
29+
30+let tDynamicTotalAttempts = 5
31+
432 let chain = take(drop(this.bytes, 1), 1)
33+
34+let defaultRestAddressStr = match chain {
35+ case _ =>
36+ if ((base58'2W' == $match0))
37+ then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
38+ else if ((base58'2T' == $match0))
39+ then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
40+ else throw("Unknown chain")
41+}
542
643 let SEP = "__"
744
45+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
46+
47+
48+let IdxCfgStakingDapp = 1
49+
50+let IdxCfgWlgDapp = 4
51+
52+func keyRestCfg () = "%s__restConfig"
53+
54+
55+func keyRestAddress () = "%s__restAddr"
56+
57+
58+func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
59+
60+
61+func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
62+
63+
64+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
65+
66+let restCfg = readRestCfgOrFail(restContract)
67+
68+let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
69+
70+let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
71+
72+let wlgAssetIdKey = "wlg_assetId"
73+
74+let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
75+
76+func asInt (v) = match v {
77+ case n: Int =>
78+ n
79+ case _ =>
80+ throw("fail to cast into Int")
81+}
82+
83+
84+func fixedPoint (val,decimals) = {
85+ let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
86+ let lowPart = toString((val % tenPow))
87+ let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
88+ (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
89+ }
90+
91+
892 let MAXTOURNAMENTLENGTH = 432000000
93+
94+let HOUR = 3600000
995
1096 let adminsList = [toString(this), match chain {
1197 case _ =>
16102 else throw("Unknown chain")
17103 }]
18104
19-let tDynamicStatus = 1
20-
21105 let lastTourIdKey = "%s__lastTourId"
22106
23-func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
107+func keyLastRegisteredTourByDuck (duckAssetId) = ("%s%s__lastRegisteredTourByDuck__" + duckAssetId)
24108
25109
26-func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
110+func keyIsRegisteredByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isRegisteredByTourAndDuck", toString(tId), duckAssetId], SEP)
27111
28112
29113 func staticData (txId,registerCost,attemptCost,creationTime,startTime,endTime) = makeString(["%s%d%d%d%d%d", txId, toString(registerCost), toString(attemptCost), toString(creationTime), toString(startTime), toString(endTime)], SEP)
30114
31115
32116 func dynamicData (status,winDuck,winResult,totalRegs,totalAttempts) = makeString(["%s%s%d%d%d", status, winDuck, toString(winResult), toString(totalRegs), toString(totalAttempts)], SEP)
117+
118+
119+func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
33120
34121
35122 @Callable(i)
42129 let tId = if (isDefined(lastId))
43130 then {
44131 let lastTourId = value(lastId)
45- let dynamic = valueOrErrorMessage(getString(keyTourDynamicDataById(lastTourId)), (("Error reading tournament " + toString(lastTourId)) + " status"))
132+ let dynamic = valueOrErrorMessage(getString(keyTourDynamicDataById(lastTourId)), (("Error reading tournament " + toString(lastTourId)) + " data"))
46133 let status = split(dynamic, SEP)[tDynamicStatus]
47134 if ((status != "ARCHIVED"))
48135 then throw(("Current tournement is not completed, status=" + status))
60147 then true
61148 else (0 >= attemptCost))
62149 then throw(((("Cost should be positive, but passed " + toString(registerCost)) + " and ") + toString(attemptCost)))
63- else $Tuple2([IntegerEntry(lastTourIdKey, tId), StringEntry(keyTourStaticDataById(tId), staticData(toBase58String(i.transactionId), registerCost, attemptCost, now, startTime, endTime)), StringEntry(keyTourDynamicDataById(tId), dynamicData("CREATED", "", 0, 0, 0))], 0)
150+ else $Tuple2([IntegerEntry(lastTourIdKey, tId), StringEntry(keyTourStaticDataById(tId), staticData(toBase58String(i.transactionId), registerCost, attemptCost, now, startTime, endTime)), StringEntry(keyTourDynamicDataById(tId), dynamicData("CREATED", "", 0, 0, 0))], tId)
151+ }
152+ }
153+
154+
155+
156+@Callable(i)
157+func register () = {
158+ let prologResult = prolog()
159+ if ((size(i.payments) != 1))
160+ then throw("exactly 1 payment must be attached")
161+ else {
162+ let pmt = i.payments[0]
163+ let wlgAmt = pmt.amount
164+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WLGOLD payments only!")
165+ if ((pmtAssetId != wlgAssetId))
166+ then throw("WLGOLD payments only!")
167+ else {
168+ let lastId = valueOrErrorMessage(getInteger(lastTourIdKey), "No active tournaments")
169+ let now = lastBlock.timestamp
170+ let static = split(valueOrErrorMessage(getString(keyTourStaticDataById(lastId)), (("Error reading tournament " + toString(lastId)) + " data")), SEP)
171+ let dynamic = split(valueOrErrorMessage(getString(keyTourDynamicDataById(lastId)), (("Error reading tournament " + toString(lastId)) + " data")), SEP)
172+ let status = dynamic[tDynamicStatus]
173+ if (!(if (if (if ((status == "CREATED"))
174+ then (now > parseIntValue(static[tStaticStart]))
175+ else false)
176+ then ((parseIntValue(static[tStaticEnd]) - HOUR) > now)
177+ else false)
178+ then true
179+ else if ((status == "INPROGRESS"))
180+ then ((parseIntValue(static[tStaticEnd]) - HOUR) > now)
181+ else false))
182+ then throw("Cannot register now")
183+ else {
184+ let regCost = parseIntValue(static[tStaticRegisterCost])
185+ if ((wlgAmt != regCost))
186+ then throw((("Need payment of " + fixedPoint(regCost, 8)) + " WLGOLD"))
187+ else {
188+ let addr = toString(i.originCaller)
189+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(addr)), "You don't have a duck staked")
190+ let oldRegistrands = valueOrElse(getString(keyAllRegistrandsByTour(lastId)), "")
191+ let regList = if ((oldRegistrands == ""))
192+ then nil
193+ else split_51C(oldRegistrands, "_")
194+ if (if (valueOrElse(getBoolean(keyIsRegisteredByTourAndDuck(lastId, duckAssetId)), false))
195+ then true
196+ else containsElement(regList, duckAssetId))
197+ then throw(((("Your duck " + duckAssetId) + " is already registered at tournament ") + toString(lastId)))
198+ else {
199+ let updatedDynamicData = dynamicData("INPROGRESS", dynamic[tDynamicWinDuck], parseIntValue(dynamic[tDynamicWinResult]), (parseIntValue(dynamic[tDynamicTotalRegCount]) + 1), parseIntValue(dynamic[tDynamicTotalAttempts]))
200+ $Tuple2([IntegerEntry(keyLastRegisteredTourByDuck(duckAssetId), lastId), BooleanEntry(keyIsRegisteredByTourAndDuck(lastId, duckAssetId), true), StringEntry(keyAllRegistrandsByTour(lastId), makeString_11C((regList :+ duckAssetId), "_")), StringEntry(keyTourDynamicDataById(lastId), updatedDynamicData)], prologResult)
201+ }
202+ }
203+ }
204+ }
64205 }
65206 }
66207
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
5+
6+
7+func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
8+
9+
10+func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
11+
12+
13+func keyAllRegistrandsByTour (tId) = ("%s%d__allRegistrands__" + toString(tId))
14+
15+
16+let tStaticRegisterCost = 2
17+
18+let tStaticStart = 5
19+
20+let tStaticEnd = 6
21+
22+let tDynamicStatus = 1
23+
24+let tDynamicWinDuck = 2
25+
26+let tDynamicWinResult = 3
27+
28+let tDynamicTotalRegCount = 4
29+
30+let tDynamicTotalAttempts = 5
31+
432 let chain = take(drop(this.bytes, 1), 1)
33+
34+let defaultRestAddressStr = match chain {
35+ case _ =>
36+ if ((base58'2W' == $match0))
37+ then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
38+ else if ((base58'2T' == $match0))
39+ then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
40+ else throw("Unknown chain")
41+}
542
643 let SEP = "__"
744
45+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
46+
47+
48+let IdxCfgStakingDapp = 1
49+
50+let IdxCfgWlgDapp = 4
51+
52+func keyRestCfg () = "%s__restConfig"
53+
54+
55+func keyRestAddress () = "%s__restAddr"
56+
57+
58+func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
59+
60+
61+func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
62+
63+
64+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
65+
66+let restCfg = readRestCfgOrFail(restContract)
67+
68+let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
69+
70+let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
71+
72+let wlgAssetIdKey = "wlg_assetId"
73+
74+let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "Not initialized yet")
75+
76+func asInt (v) = match v {
77+ case n: Int =>
78+ n
79+ case _ =>
80+ throw("fail to cast into Int")
81+}
82+
83+
84+func fixedPoint (val,decimals) = {
85+ let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
86+ let lowPart = toString((val % tenPow))
87+ let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
88+ (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
89+ }
90+
91+
892 let MAXTOURNAMENTLENGTH = 432000000
93+
94+let HOUR = 3600000
995
1096 let adminsList = [toString(this), match chain {
1197 case _ =>
1298 if ((base58'2W' == $match0))
1399 then "3PEe2RELUHCFCBsmSCNcBJ8N3URLVQende7"
14100 else if ((base58'2T' == $match0))
15101 then "3MtBgJTaLxPB3C7UJD1UE8qjkHthfKvFQYY"
16102 else throw("Unknown chain")
17103 }]
18104
19-let tDynamicStatus = 1
20-
21105 let lastTourIdKey = "%s__lastTourId"
22106
23-func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
107+func keyLastRegisteredTourByDuck (duckAssetId) = ("%s%s__lastRegisteredTourByDuck__" + duckAssetId)
24108
25109
26-func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
110+func keyIsRegisteredByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__isRegisteredByTourAndDuck", toString(tId), duckAssetId], SEP)
27111
28112
29113 func staticData (txId,registerCost,attemptCost,creationTime,startTime,endTime) = makeString(["%s%d%d%d%d%d", txId, toString(registerCost), toString(attemptCost), toString(creationTime), toString(startTime), toString(endTime)], SEP)
30114
31115
32116 func dynamicData (status,winDuck,winResult,totalRegs,totalAttempts) = makeString(["%s%s%d%d%d", status, winDuck, toString(winResult), toString(totalRegs), toString(totalAttempts)], SEP)
117+
118+
119+func prolog () = asInt(invoke(stakingContract, "saveLastTx", nil, nil))
33120
34121
35122 @Callable(i)
36123 func createTournament (startTime,endTime,registerCost,attemptCost) = {
37124 let caller = toString(i.caller)
38125 if (!(containsElement(adminsList, caller)))
39126 then throw("Permission denied")
40127 else {
41128 let lastId = getInteger(lastTourIdKey)
42129 let tId = if (isDefined(lastId))
43130 then {
44131 let lastTourId = value(lastId)
45- let dynamic = valueOrErrorMessage(getString(keyTourDynamicDataById(lastTourId)), (("Error reading tournament " + toString(lastTourId)) + " status"))
132+ let dynamic = valueOrErrorMessage(getString(keyTourDynamicDataById(lastTourId)), (("Error reading tournament " + toString(lastTourId)) + " data"))
46133 let status = split(dynamic, SEP)[tDynamicStatus]
47134 if ((status != "ARCHIVED"))
48135 then throw(("Current tournement is not completed, status=" + status))
49136 else (lastTourId + 1)
50137 }
51138 else 1
52139 let now = lastBlock.timestamp
53140 if ((now > startTime))
54141 then throw(((("startTime=" + toString(startTime)) + " < creationTime=") + toString(now)))
55142 else if ((startTime > endTime))
56143 then throw(((("endTime=" + toString(endTime)) + " < startTime=") + toString(startTime)))
57144 else if (((endTime - startTime) > MAXTOURNAMENTLENGTH))
58145 then throw(((("Tournament period exceeds max: " + toString((endTime - startTime))) + " > ") + toString(MAXTOURNAMENTLENGTH)))
59146 else if (if ((0 >= registerCost))
60147 then true
61148 else (0 >= attemptCost))
62149 then throw(((("Cost should be positive, but passed " + toString(registerCost)) + " and ") + toString(attemptCost)))
63- else $Tuple2([IntegerEntry(lastTourIdKey, tId), StringEntry(keyTourStaticDataById(tId), staticData(toBase58String(i.transactionId), registerCost, attemptCost, now, startTime, endTime)), StringEntry(keyTourDynamicDataById(tId), dynamicData("CREATED", "", 0, 0, 0))], 0)
150+ else $Tuple2([IntegerEntry(lastTourIdKey, tId), StringEntry(keyTourStaticDataById(tId), staticData(toBase58String(i.transactionId), registerCost, attemptCost, now, startTime, endTime)), StringEntry(keyTourDynamicDataById(tId), dynamicData("CREATED", "", 0, 0, 0))], tId)
151+ }
152+ }
153+
154+
155+
156+@Callable(i)
157+func register () = {
158+ let prologResult = prolog()
159+ if ((size(i.payments) != 1))
160+ then throw("exactly 1 payment must be attached")
161+ else {
162+ let pmt = i.payments[0]
163+ let wlgAmt = pmt.amount
164+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WLGOLD payments only!")
165+ if ((pmtAssetId != wlgAssetId))
166+ then throw("WLGOLD payments only!")
167+ else {
168+ let lastId = valueOrErrorMessage(getInteger(lastTourIdKey), "No active tournaments")
169+ let now = lastBlock.timestamp
170+ let static = split(valueOrErrorMessage(getString(keyTourStaticDataById(lastId)), (("Error reading tournament " + toString(lastId)) + " data")), SEP)
171+ let dynamic = split(valueOrErrorMessage(getString(keyTourDynamicDataById(lastId)), (("Error reading tournament " + toString(lastId)) + " data")), SEP)
172+ let status = dynamic[tDynamicStatus]
173+ if (!(if (if (if ((status == "CREATED"))
174+ then (now > parseIntValue(static[tStaticStart]))
175+ else false)
176+ then ((parseIntValue(static[tStaticEnd]) - HOUR) > now)
177+ else false)
178+ then true
179+ else if ((status == "INPROGRESS"))
180+ then ((parseIntValue(static[tStaticEnd]) - HOUR) > now)
181+ else false))
182+ then throw("Cannot register now")
183+ else {
184+ let regCost = parseIntValue(static[tStaticRegisterCost])
185+ if ((wlgAmt != regCost))
186+ then throw((("Need payment of " + fixedPoint(regCost, 8)) + " WLGOLD"))
187+ else {
188+ let addr = toString(i.originCaller)
189+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(addr)), "You don't have a duck staked")
190+ let oldRegistrands = valueOrElse(getString(keyAllRegistrandsByTour(lastId)), "")
191+ let regList = if ((oldRegistrands == ""))
192+ then nil
193+ else split_51C(oldRegistrands, "_")
194+ if (if (valueOrElse(getBoolean(keyIsRegisteredByTourAndDuck(lastId, duckAssetId)), false))
195+ then true
196+ else containsElement(regList, duckAssetId))
197+ then throw(((("Your duck " + duckAssetId) + " is already registered at tournament ") + toString(lastId)))
198+ else {
199+ let updatedDynamicData = dynamicData("INPROGRESS", dynamic[tDynamicWinDuck], parseIntValue(dynamic[tDynamicWinResult]), (parseIntValue(dynamic[tDynamicTotalRegCount]) + 1), parseIntValue(dynamic[tDynamicTotalAttempts]))
200+ $Tuple2([IntegerEntry(keyLastRegisteredTourByDuck(duckAssetId), lastId), BooleanEntry(keyIsRegisteredByTourAndDuck(lastId, duckAssetId), true), StringEntry(keyAllRegistrandsByTour(lastId), makeString_11C((regList :+ duckAssetId), "_")), StringEntry(keyTourDynamicDataById(lastId), updatedDynamicData)], prologResult)
201+ }
202+ }
203+ }
204+ }
64205 }
65206 }
66207
67208

github/deemru/w8io/169f3d6 
43.80 ms