tx · EMZh2L3KWDk4k7pNdRP6T2Nq7bdCKFJnuh9mEYo7b9H8

3PPod6TWkaqUd5Hx2CkM236PFPreqLu1nhN:  -0.00600000 Waves

2022.09.17 23:57 [3299088] smart account 3PPod6TWkaqUd5Hx2CkM236PFPreqLu1nhN > SELF 0.00000000 Waves

{ "type": 13, "id": "EMZh2L3KWDk4k7pNdRP6T2Nq7bdCKFJnuh9mEYo7b9H8", "fee": 600000, "feeAssetId": null, "timestamp": 1663448279970, "version": 2, "chainId": 87, "sender": "3PPod6TWkaqUd5Hx2CkM236PFPreqLu1nhN", "senderPublicKey": "5XJeDoDVZrQ5rX8EcMWwMUHpYWs6CuAWoNgEn5rA8wgv", "proofs": [ "33YWw5CzDebKaNB1QvoqZ6yQ9SJkxk5oMEVzSY94ZjAPGrEtHrz2aMDxXjvDXbEZVMCnCwGCrAD3Yc5YyzGou9N7" ], "script": "base64:BgIhCAISBQoDCAEIEgQKAggBEgMKAQgSAwoBCBIECgIICBIAGgAEVVNETgEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEACmZlZUFkZHJlc3MJAQdBZGRyZXNzAQEaAVcfqkivNjk8ZqY49VHF/62O5PcNLqNyO/oACW1pbkFtb3VudACAreIEAAxmZWVOdW1lcmF0b3IABQAOZmVlRGVub21pbmF0b3IABQEQZ2V0U3RhcnRCbG9ja0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgxfc3RhcnRfYmxvY2sBDmdldEVuZEJsb2NrS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCCl9lbmRfYmxvY2sBDmdldEZpbmlzaEF0S2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCEF9maW5pc2hfYXRfYmxvY2sBF2dldEFuc3dlckRhcHBBZGRyZXNzS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9hbnN3ZXJfZGFwcAEXZ2V0QW5zd2VyRnVuY0FkZHJlc3NLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIMX2Fuc3dlcl9mdW5jAQxnZXRSZXN1bHRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIHX3Jlc3VsdAEIZ2V0SWRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIDX2lkAQ1nZXRBbnN3ZXJOS2V5AgdldmVudElkAW4JAKwCAgkArAICBQdldmVudElkAghfYW5zd2VyXwkApAMBBQFuARJnZXRBbnN3ZXJzQ291bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIOX2Fuc3dlcnNfY291bnQBDGdldFN0YXR1c0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgdfc3RhdHVzAQpnZXREZXNjS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9kZXNjcmlwdGlvbgERZ2V0VG90YWxBbW91bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAINX3RvdGFsX2Ftb3VudAENZ2V0QW1vdW50TktleQIHZXZlbnRJZAFuCQCsAgIJAKwCAgUHZXZlbnRJZAkApAMBBQFuAgdfYW1vdW50ARNnZXRBbW91bnRBZGRyZXNzS2V5AgdldmVudElkB2FkZHJlc3MJAKwCAgkArAICBQdldmVudElkBQdhZGRyZXNzAgdfYW1vdW50ARNnZXRDaG9pY2VBZGRyZXNzS2V5AgdldmVudElkB2FkZHJlc3MJAKwCAgkArAICBQdldmVudElkBQdhZGRyZXNzAgdfY2hvaWNlARtnZXRBbHJlYWR5Q2xhaW1lZEFkZHJlc3NLZXkCB2V2ZW50SWQHYWRkcmVzcwkArAICCQCsAgIFB2V2ZW50SWQFB2FkZHJlc3MCEF9hbHJlYWR5X2NsYWltZWQBD2dldEFuc3dlclJlc3VsdAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgQjZXJyAQlnZXRTdGF0dXMBB2V2ZW50SWQEBnN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEMZ2V0U3RhdHVzS2V5AQUHZXZlbnRJZAIBIwMDCQECIT0CBQZzdGF0dXMCASMJAGYCBQZoZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDmdldEZpbmlzaEF0S2V5AQUHZXZlbnRJZAAABwIIZmluaXNoZWQFBnN0YXR1cwEHaXNBZG1pbgEGY2FsbGVyAwkAAAIFBmNhbGxlcgUEdGhpcwYHAQ1yZWdpc3RlckV2ZW50BwR0eGlkBGRlc2MKc3RhcnRCbG9jawhlbmRCbG9jawhmaW5pc2hBdAtjaGVja2VyRGFwcAtjaGVja2VyRnVuYwQHZXZlbnRJZAUEdHhpZAQMYW5zd2VyUmVzdWx0CQEPZ2V0QW5zd2VyUmVzdWx0AQkA/AcEBQR0aGlzAgVjaGVjawkAzAgCBQtjaGVja2VyRGFwcAkAzAgCBQtjaGVja2VyRnVuYwUDbmlsBQNuaWwDCQAAAgUMYW5zd2VyUmVzdWx0BQxhbnN3ZXJSZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARBnZXRTdGFydEJsb2NrS2V5AQUHZXZlbnRJZAUKc3RhcnRCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmdldEVuZEJsb2NrS2V5AQUHZXZlbnRJZAUIZW5kQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRGaW5pc2hBdEtleQEFB2V2ZW50SWQFCGZpbmlzaEF0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARdnZXRBbnN3ZXJEYXBwQWRkcmVzc0tleQEFB2V2ZW50SWQFC2NoZWNrZXJEYXBwCQDMCAIJAQtTdHJpbmdFbnRyeQIJARdnZXRBbnN3ZXJGdW5jQWRkcmVzc0tleQEFB2V2ZW50SWQFC2NoZWNrZXJGdW5jCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQpnZXREZXNjS2V5AQUHZXZlbnRJZAUEZGVzYwkAzAgCCQELU3RyaW5nRW50cnkCCQEMZ2V0U3RhdHVzS2V5AQUHZXZlbnRJZAIGYWN0aXZlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQhnZXRJZEtleQEFB2V2ZW50SWQFB2V2ZW50SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWdldEFuc3dlck5LZXkCBQdldmVudElkAAECAk5PCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1nZXRBbnN3ZXJOS2V5AgUHZXZlbnRJZAACAgNZRVMJAMwIAgkBDEludGVnZXJFbnRyeQIJARJnZXRBbnN3ZXJzQ291bnRLZXkBBQdldmVudElkAAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxnZXRSZXN1bHRLZXkBBQdldmVudElkAAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQY2hlY2tFdmVudEFuc3dlcgEHZXZlbnRJZAUDbmlsBgFpARNzaW1wbGVSZWdpc3RlckV2ZW50AwRkZXNjCnN0YXJ0QmxvY2sLY2hlY2tlckZ1bmMDCQEBIQEJAQdpc0FkbWluAQgFAWkGY2FsbGVyCQACAQIRb25seSBhZG1pbiBjYW4gZG8EBHR4aWQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAQIZW5kQmxvY2sJAGQCBQpzdGFydEJsb2NrAKALBAhmaW5pc2hBdAkAZAIFCGVuZEJsb2NrAKALBAtjaGVja2VyRGFwcAkApQgBBQR0aGlzCQENcmVnaXN0ZXJFdmVudAcFBHR4aWQFBGRlc2MFCnN0YXJ0QmxvY2sFCGVuZEJsb2NrBQhmaW5pc2hBdAULY2hlY2tlckRhcHAFC2NoZWNrZXJGdW5jAWkBBmNob2ljZQIHZXZlbnRJZAZjaG9pY2UEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBAVjaGVjawkA/AcEBQR0aGlzAgtjaGVja1Jlc3VsdAUDbmlsBQNuaWwDCQAAAgUFY2hlY2sFBWNoZWNrBAZzdGF0dXMJAQlnZXRTdGF0dXMBBQdldmVudElkAwkAAAIFBnN0YXR1cwIGYWN0aXZlAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUEVVNETgQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMJAGYCBQltaW5BbW91bnQFBmFtb3VudAkAAgECG2Ftb3VudCBpcyBsZXNzIHRoYW4gYWxsb3dlZAQMYW5zd2Vyc0NvdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzAgADAwkAAAIFBmNob2ljZQAABgkAZgIFBmNob2ljZQUMYW5zd2Vyc0NvdW50CQACAQIRY2hvaWNlIGlzIGludmFsaWQEDGN1cnJlbnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQERZ2V0VG90YWxBbW91bnRLZXkBBQdldmVudElkAAAEC2Nob2ljZVRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ1nZXRBbW91bnROS2V5AgUHZXZlbnRJZAUGY2hvaWNlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJARFnZXRUb3RhbEFtb3VudEtleQEFB2V2ZW50SWQJAGQCBQxjdXJyZW50VG90YWwFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWdldEFtb3VudE5LZXkCBQdldmVudElkBQZjaG9pY2UJAGQCBQtjaG9pY2VUb3RhbAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETZ2V0Q2hvaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQFB2FkZHJlc3MFBmNob2ljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2dldEFtb3VudEFkZHJlc3NLZXkCBQdldmVudElkBQdhZGRyZXNzBQZhbW91bnQFA25pbAkAAgECC0JhZCBwYXltZW50CQACAQIPWW91IGNhbmB0IGRvIGl0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQdldmVudElkBAdhZGRyZXNzCAUBaQZjYWxsZXIEBnN0YXR1cwkBCWdldFN0YXR1cwEFB2V2ZW50SWQDCQAAAgUGc3RhdHVzAghmaW5pc2hlZAQLdG90YWxBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJARFnZXRUb3RhbEFtb3VudEtleQEFB2V2ZW50SWQEA2ZlZQkAawMFC3RvdGFsQW1vdW50BQxmZWVOdW1lcmF0b3IFDmZlZURlbm9taW5hdG9yBAdyZXdhcmRzCQBlAgULdG90YWxBbW91bnQFA2ZlZQMJAAACBQdhZGRyZXNzBQpmZWVBZGRyZXNzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCmZlZUFkZHJlc3MFA2ZlZQUEVVNETgUDbmlsBA5hbHJlYWR5Q2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQEbZ2V0QWxyZWFkeUNsYWltZWRBZGRyZXNzS2V5AgUHZXZlbnRJZAkApQgBBQdhZGRyZXNzBwMFDmFscmVhZHlDbGFpbWVkCQACAQIWUmV3YXJkIGFscmVhZHkgY2xhaW1lZAQNYWRkcmVzc0Nob2ljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBE2dldENob2ljZUFkZHJlc3NLZXkCBQdldmVudElkCQClCAEFB2FkZHJlc3MEBnJlc3VsdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDGdldFJlc3VsdEtleQEFB2V2ZW50SWQEC2Nob2ljZVRvdGFsCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQENZ2V0QW1vdW50TktleQIFB2V2ZW50SWQFBnJlc3VsdAQNYWRkcmVzc0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBE2dldEFtb3VudEFkZHJlc3NLZXkCBQdldmVudElkCQClCAEFB2FkZHJlc3MDCQAAAgUNYWRkcmVzc0Nob2ljZQUGcmVzdWx0BA1hZGRyZXNzUmV3YXJkCQBrAwUHcmV3YXJkcwUNYWRkcmVzc0Ftb3VudAULY2hvaWNlVG90YWwJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARNnZXRDaG9pY2VBZGRyZXNzS2V5AgUHZXZlbnRJZAkApQgBBQdhZGRyZXNzBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQdhZGRyZXNzBQ1hZGRyZXNzUmV3YXJkBQRVU0ROBQNuaWwJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwkAAgECD1lvdSBjYW5gdCBkbyBpdAFpAQtjaGVja1Jlc3VsdAEHZXZlbnRJZAQGc3RhdHVzCQEJZ2V0U3RhdHVzAQUHZXZlbnRJZAMJAAACBQZzdGF0dXMCBmFjdGl2ZQQLY2hlY2tlckRhcHAJAJ0IAgUEdGhpcwkBF2dldEFuc3dlckRhcHBBZGRyZXNzS2V5AQUHZXZlbnRJZAQLY2hlY2tlckZ1bmMJAJ0IAgUEdGhpcwkBF2dldEFuc3dlckZ1bmNBZGRyZXNzS2V5AQUHZXZlbnRJZAQNY3VycmVudFJlc3VsdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDGdldFJlc3VsdEtleQEFB2V2ZW50SWQEDGFuc3dlclJlc3VsdAkBD2dldEFuc3dlclJlc3VsdAEJAPwHBAUEdGhpcwIFY2hlY2sJAMwIAgULY2hlY2tlckRhcHAJAMwIAgULY2hlY2tlckZ1bmMFA25pbAUDbmlsAwkAAAIFDGFuc3dlclJlc3VsdAUMYW5zd2VyUmVzdWx0AwkBAiE9AgUMYW5zd2VyUmVzdWx0BQ1jdXJyZW50UmVzdWx0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxnZXRTdGF0dXNLZXkBBQdldmVudElkAghmaW5pc2hlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDGdldFJlc3VsdEtleQEFB2V2ZW50SWQFDGFuc3dlclJlc3VsdAUDbmlsCQACAQIScmVzdWx0IG5vdCBjaGFuZ2VkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIQRXZlbnQgbm90IGFjdGl2ZQFpAQVjaGVjawIEZGFwcAhmdW5jdGlvbgMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECEG9ubHkgbWFpbiBjYW4gZG8EDGFuc3dlclJlc3VsdAkBD2dldEFuc3dlclJlc3VsdAEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEZGFwcAUIZnVuY3Rpb24FA25pbAUDbmlsCQCUCgIFA25pbAUMYW5zd2VyUmVzdWx0AWkBEWNoZWNrVmlyZXNWZXN0aW5nAAMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECEG9ubHkgbWFpbiBjYW4gZG8EDm9wVmlyZXNBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUDJySkdmYjVNYmVpdlpOU3FkVm1zRDFZMk16OHk2SnIzWgQIZW5hYmxlZDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUOb3BWaXJlc0FkZHJlc3MCDXN5c3RlbV9wYXVzZWQGBAhlbmFibGVkMQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ5vcFZpcmVzQWRkcmVzcwIlb3BfbGlxdWlkYW9fYWxsX3dpdGhkcmF3VmVzdGVkX3BhdXNlZAYECGVuYWJsZWQyCQELdmFsdWVPckVsc2UCCQCbCAIFDm9wVmlyZXNBZGRyZXNzAipvcF9saXF1aWRhb19hbGxfd2l0aGRyYXdWZXN0ZWRfdXNkbl9wYXVzZWQGAwMDBQhlbmFibGVkMAUIZW5hYmxlZDEHBQhlbmFibGVkMgcJAJQKAgUDbmlsAAIJAJQKAgUDbmlsAAEAQ0gPIw==", "height": 3299088, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2vUi3PJmyofv1SN4P7cLErs8uCcQEju3Y8Z4YyaT9q5R Next: 532JsXx9m8RKoVA4yi3GUEtYCdh7cYDy2755HivWFAu4 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
5+
6+let feeAddress = Address(base58'3P4pKfj9UZHqj6pb18921oSftYuQw35gExR')
7+
8+let minAmount = 10000000
9+
10+let feeNumerator = 5
11+
12+let feeDenominator = 5
13+
414 func getStartBlockKey (eventId) = (eventId + "_start_block")
515
616
2535 func getAnswerNKey (eventId,n) = ((eventId + "_answer_") + toString(n))
2636
2737
38+func getAnswersCountKey (eventId) = (eventId + "_answers_count")
39+
40+
2841 func getStatusKey (eventId) = (eventId + "_status")
2942
3043
3144 func getDescKey (eventId) = (eventId + "_description")
45+
46+
47+func getTotalAmountKey (eventId) = (eventId + "_total_amount")
48+
49+
50+func getAmountNKey (eventId,n) = ((eventId + toString(n)) + "_amount")
51+
52+
53+func getAmountAddressKey (eventId,address) = ((eventId + address) + "_amount")
54+
55+
56+func getChoiceAddressKey (eventId,address) = ((eventId + address) + "_choice")
57+
58+
59+func getAlreadyClaimedAddressKey (eventId,address) = ((eventId + address) + "_already_claimed")
3260
3361
3462 func getAnswerResult (v) = match v {
5684
5785 func registerEvent (txid,desc,startBlock,endBlock,finishAt,checkerDapp,checkerFunc) = {
5886 let eventId = txid
59- let answerResult = getAnswerResult(invoke(addressFromStringValue(checkerDapp), checkerFunc, [eventId], nil))
60- if ((answerResult == 0))
61- then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getResultKey(eventId), 1)]
62- else throw("already exists?")
87+ let answerResult = getAnswerResult(invoke(this, "check", [checkerDapp, checkerFunc], nil))
88+ if ((answerResult == answerResult))
89+ then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getAnswersCountKey(eventId), 2), IntegerEntry(getResultKey(eventId), 1)]
90+ else throw("Strict value is not equal to itself.")
6391 }
6492
6593
80108
81109
82110 @Callable(i)
83-func checkFirstEvents (eventId) = {
111+func choice (eventId,choice) = {
112+ let address = toString(i.caller)
113+ let check = invoke(this, "checkResult", nil, nil)
114+ if ((check == check))
115+ then {
116+ let status = getStatus(eventId)
117+ if ((status == "active"))
118+ then if (if ((size(i.payments) != 1))
119+ then true
120+ else (i.payments[0].assetId != USDN))
121+ then {
122+ let amount = i.payments[0].amount
123+ if ((minAmount > amount))
124+ then throw("amount is less than allowed")
125+ else {
126+ let answersCount = getIntegerValue(this, "")
127+ if (if ((choice == 0))
128+ then true
129+ else (choice > answersCount))
130+ then throw("choice is invalid")
131+ else {
132+ let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
133+ let choiceTotal = valueOrElse(getInteger(this, getAmountNKey(eventId, choice)), 0)
134+[IntegerEntry(getTotalAmountKey(eventId), (currentTotal + amount)), IntegerEntry(getAmountNKey(eventId, choice), (choiceTotal + amount)), IntegerEntry(getChoiceAddressKey(eventId, address), choice), IntegerEntry(getAmountAddressKey(eventId, address), amount)]
135+ }
136+ }
137+ }
138+ else throw("Bad payment")
139+ else throw("You can`t do it")
140+ }
141+ else throw("Strict value is not equal to itself.")
142+ }
143+
144+
145+
146+@Callable(i)
147+func claim (eventId) = {
148+ let address = i.caller
84149 let status = getStatus(eventId)
85- if ((status == "#"))
86- then if (!(isAdmin(i.caller)))
87- then throw("only admin can do")
88- else $Tuple2(nil, 0)
89- else $Tuple2(nil, $Tuple2(nil, 1))
150+ if ((status == "finished"))
151+ then {
152+ let totalAmount = getIntegerValue(this, getTotalAmountKey(eventId))
153+ let fee = fraction(totalAmount, feeNumerator, feeDenominator)
154+ let rewards = (totalAmount - fee)
155+ if ((address == feeAddress))
156+ then [ScriptTransfer(feeAddress, fee, USDN)]
157+ else {
158+ let alreadyClaimed = valueOrElse(getBoolean(this, getAlreadyClaimedAddressKey(eventId, toString(address))), false)
159+ if (alreadyClaimed)
160+ then throw("Reward already claimed")
161+ else {
162+ let addressChoice = getIntegerValue(this, getChoiceAddressKey(eventId, toString(address)))
163+ let result = getIntegerValue(this, getResultKey(eventId))
164+ let choiceTotal = getIntegerValue(this, getAmountNKey(eventId, result))
165+ let addressAmount = getIntegerValue(this, getAmountAddressKey(eventId, toString(address)))
166+ if ((addressChoice == result))
167+ then {
168+ let addressReward = fraction(rewards, addressAmount, choiceTotal)
169+[BooleanEntry(getChoiceAddressKey(eventId, toString(address)), true), ScriptTransfer(address, addressReward, USDN)]
170+ }
171+ else throw("Something went wrong")
172+ }
173+ }
174+ }
175+ else throw("You can`t do it")
90176 }
177+
178+
179+
180+@Callable(i)
181+func checkResult (eventId) = {
182+ let status = getStatus(eventId)
183+ if ((status == "active"))
184+ then {
185+ let checkerDapp = getString(this, getAnswerDappAddressKey(eventId))
186+ let checkerFunc = getString(this, getAnswerFuncAddressKey(eventId))
187+ let currentResult = getIntegerValue(this, getResultKey(eventId))
188+ let answerResult = getAnswerResult(invoke(this, "check", [checkerDapp, checkerFunc], nil))
189+ if ((answerResult == answerResult))
190+ then if ((answerResult != currentResult))
191+ then [StringEntry(getStatusKey(eventId), "finished"), IntegerEntry(getResultKey(eventId), answerResult)]
192+ else throw("result not changed")
193+ else throw("Strict value is not equal to itself.")
194+ }
195+ else throw("Event not active")
196+ }
197+
198+
199+
200+@Callable(i)
201+func check (dapp,function) = if ((this != i.caller))
202+ then throw("only main can do")
203+ else {
204+ let answerResult = getAnswerResult(invoke(addressFromStringValue(dapp), function, nil, nil))
205+ $Tuple2(nil, answerResult)
206+ }
207+
208+
209+
210+@Callable(i)
211+func checkViresVesting () = if ((this != i.caller))
212+ then throw("only main can do")
213+ else {
214+ let opViresAddress = addressFromStringValue("3P2rJGfb5MbeivZNSqdVmsD1Y2Mz8y6Jr3Z")
215+ let enabled0 = valueOrElse(getBoolean(opViresAddress, "system_paused"), true)
216+ let enabled1 = valueOrElse(getBoolean(opViresAddress, "op_liquidao_all_withdrawVested_paused"), true)
217+ let enabled2 = valueOrElse(getBoolean(opViresAddress, "op_liquidao_all_withdrawVested_usdn_paused"), true)
218+ if (if (if (enabled0)
219+ then enabled1
220+ else false)
221+ then enabled2
222+ else false)
223+ then $Tuple2(nil, 2)
224+ else $Tuple2(nil, 1)
225+ }
91226
92227
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
5+
6+let feeAddress = Address(base58'3P4pKfj9UZHqj6pb18921oSftYuQw35gExR')
7+
8+let minAmount = 10000000
9+
10+let feeNumerator = 5
11+
12+let feeDenominator = 5
13+
414 func getStartBlockKey (eventId) = (eventId + "_start_block")
515
616
717 func getEndBlockKey (eventId) = (eventId + "_end_block")
818
919
1020 func getFinishAtKey (eventId) = (eventId + "_finish_at_block")
1121
1222
1323 func getAnswerDappAddressKey (eventId) = (eventId + "_answer_dapp")
1424
1525
1626 func getAnswerFuncAddressKey (eventId) = (eventId + "_answer_func")
1727
1828
1929 func getResultKey (eventId) = (eventId + "_result")
2030
2131
2232 func getIdKey (eventId) = (eventId + "_id")
2333
2434
2535 func getAnswerNKey (eventId,n) = ((eventId + "_answer_") + toString(n))
2636
2737
38+func getAnswersCountKey (eventId) = (eventId + "_answers_count")
39+
40+
2841 func getStatusKey (eventId) = (eventId + "_status")
2942
3043
3144 func getDescKey (eventId) = (eventId + "_description")
45+
46+
47+func getTotalAmountKey (eventId) = (eventId + "_total_amount")
48+
49+
50+func getAmountNKey (eventId,n) = ((eventId + toString(n)) + "_amount")
51+
52+
53+func getAmountAddressKey (eventId,address) = ((eventId + address) + "_amount")
54+
55+
56+func getChoiceAddressKey (eventId,address) = ((eventId + address) + "_choice")
57+
58+
59+func getAlreadyClaimedAddressKey (eventId,address) = ((eventId + address) + "_already_claimed")
3260
3361
3462 func getAnswerResult (v) = match v {
3563 case x: Int =>
3664 x
3765 case t =>
3866 throw("#err")
3967 }
4068
4169
4270 func getStatus (eventId) = {
4371 let status = valueOrElse(getString(this, getStatusKey(eventId)), "#")
4472 if (if ((status != "#"))
4573 then (height > valueOrElse(getInteger(this, getFinishAtKey(eventId)), 0))
4674 else false)
4775 then "finished"
4876 else status
4977 }
5078
5179
5280 func isAdmin (caller) = if ((caller == this))
5381 then true
5482 else false
5583
5684
5785 func registerEvent (txid,desc,startBlock,endBlock,finishAt,checkerDapp,checkerFunc) = {
5886 let eventId = txid
59- let answerResult = getAnswerResult(invoke(addressFromStringValue(checkerDapp), checkerFunc, [eventId], nil))
60- if ((answerResult == 0))
61- then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getResultKey(eventId), 1)]
62- else throw("already exists?")
87+ let answerResult = getAnswerResult(invoke(this, "check", [checkerDapp, checkerFunc], nil))
88+ if ((answerResult == answerResult))
89+ then [IntegerEntry(getStartBlockKey(eventId), startBlock), IntegerEntry(getEndBlockKey(eventId), endBlock), IntegerEntry(getFinishAtKey(eventId), finishAt), StringEntry(getAnswerDappAddressKey(eventId), checkerDapp), StringEntry(getAnswerFuncAddressKey(eventId), checkerFunc), StringEntry(getDescKey(eventId), desc), StringEntry(getStatusKey(eventId), "active"), StringEntry(getIdKey(eventId), eventId), StringEntry(getAnswerNKey(eventId, 1), "NO"), StringEntry(getAnswerNKey(eventId, 2), "YES"), IntegerEntry(getAnswersCountKey(eventId), 2), IntegerEntry(getResultKey(eventId), 1)]
90+ else throw("Strict value is not equal to itself.")
6391 }
6492
6593
6694 func checkEventAnswer (eventId) = nil
6795
6896
6997 @Callable(i)
7098 func simpleRegisterEvent (desc,startBlock,checkerFunc) = if (!(isAdmin(i.caller)))
7199 then throw("only admin can do")
72100 else {
73101 let txid = toBase58String(i.transactionId)
74102 let endBlock = (startBlock + 1440)
75103 let finishAt = (endBlock + 1440)
76104 let checkerDapp = toString(this)
77105 registerEvent(txid, desc, startBlock, endBlock, finishAt, checkerDapp, checkerFunc)
78106 }
79107
80108
81109
82110 @Callable(i)
83-func checkFirstEvents (eventId) = {
111+func choice (eventId,choice) = {
112+ let address = toString(i.caller)
113+ let check = invoke(this, "checkResult", nil, nil)
114+ if ((check == check))
115+ then {
116+ let status = getStatus(eventId)
117+ if ((status == "active"))
118+ then if (if ((size(i.payments) != 1))
119+ then true
120+ else (i.payments[0].assetId != USDN))
121+ then {
122+ let amount = i.payments[0].amount
123+ if ((minAmount > amount))
124+ then throw("amount is less than allowed")
125+ else {
126+ let answersCount = getIntegerValue(this, "")
127+ if (if ((choice == 0))
128+ then true
129+ else (choice > answersCount))
130+ then throw("choice is invalid")
131+ else {
132+ let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0)
133+ let choiceTotal = valueOrElse(getInteger(this, getAmountNKey(eventId, choice)), 0)
134+[IntegerEntry(getTotalAmountKey(eventId), (currentTotal + amount)), IntegerEntry(getAmountNKey(eventId, choice), (choiceTotal + amount)), IntegerEntry(getChoiceAddressKey(eventId, address), choice), IntegerEntry(getAmountAddressKey(eventId, address), amount)]
135+ }
136+ }
137+ }
138+ else throw("Bad payment")
139+ else throw("You can`t do it")
140+ }
141+ else throw("Strict value is not equal to itself.")
142+ }
143+
144+
145+
146+@Callable(i)
147+func claim (eventId) = {
148+ let address = i.caller
84149 let status = getStatus(eventId)
85- if ((status == "#"))
86- then if (!(isAdmin(i.caller)))
87- then throw("only admin can do")
88- else $Tuple2(nil, 0)
89- else $Tuple2(nil, $Tuple2(nil, 1))
150+ if ((status == "finished"))
151+ then {
152+ let totalAmount = getIntegerValue(this, getTotalAmountKey(eventId))
153+ let fee = fraction(totalAmount, feeNumerator, feeDenominator)
154+ let rewards = (totalAmount - fee)
155+ if ((address == feeAddress))
156+ then [ScriptTransfer(feeAddress, fee, USDN)]
157+ else {
158+ let alreadyClaimed = valueOrElse(getBoolean(this, getAlreadyClaimedAddressKey(eventId, toString(address))), false)
159+ if (alreadyClaimed)
160+ then throw("Reward already claimed")
161+ else {
162+ let addressChoice = getIntegerValue(this, getChoiceAddressKey(eventId, toString(address)))
163+ let result = getIntegerValue(this, getResultKey(eventId))
164+ let choiceTotal = getIntegerValue(this, getAmountNKey(eventId, result))
165+ let addressAmount = getIntegerValue(this, getAmountAddressKey(eventId, toString(address)))
166+ if ((addressChoice == result))
167+ then {
168+ let addressReward = fraction(rewards, addressAmount, choiceTotal)
169+[BooleanEntry(getChoiceAddressKey(eventId, toString(address)), true), ScriptTransfer(address, addressReward, USDN)]
170+ }
171+ else throw("Something went wrong")
172+ }
173+ }
174+ }
175+ else throw("You can`t do it")
90176 }
177+
178+
179+
180+@Callable(i)
181+func checkResult (eventId) = {
182+ let status = getStatus(eventId)
183+ if ((status == "active"))
184+ then {
185+ let checkerDapp = getString(this, getAnswerDappAddressKey(eventId))
186+ let checkerFunc = getString(this, getAnswerFuncAddressKey(eventId))
187+ let currentResult = getIntegerValue(this, getResultKey(eventId))
188+ let answerResult = getAnswerResult(invoke(this, "check", [checkerDapp, checkerFunc], nil))
189+ if ((answerResult == answerResult))
190+ then if ((answerResult != currentResult))
191+ then [StringEntry(getStatusKey(eventId), "finished"), IntegerEntry(getResultKey(eventId), answerResult)]
192+ else throw("result not changed")
193+ else throw("Strict value is not equal to itself.")
194+ }
195+ else throw("Event not active")
196+ }
197+
198+
199+
200+@Callable(i)
201+func check (dapp,function) = if ((this != i.caller))
202+ then throw("only main can do")
203+ else {
204+ let answerResult = getAnswerResult(invoke(addressFromStringValue(dapp), function, nil, nil))
205+ $Tuple2(nil, answerResult)
206+ }
207+
208+
209+
210+@Callable(i)
211+func checkViresVesting () = if ((this != i.caller))
212+ then throw("only main can do")
213+ else {
214+ let opViresAddress = addressFromStringValue("3P2rJGfb5MbeivZNSqdVmsD1Y2Mz8y6Jr3Z")
215+ let enabled0 = valueOrElse(getBoolean(opViresAddress, "system_paused"), true)
216+ let enabled1 = valueOrElse(getBoolean(opViresAddress, "op_liquidao_all_withdrawVested_paused"), true)
217+ let enabled2 = valueOrElse(getBoolean(opViresAddress, "op_liquidao_all_withdrawVested_usdn_paused"), true)
218+ if (if (if (enabled0)
219+ then enabled1
220+ else false)
221+ then enabled2
222+ else false)
223+ then $Tuple2(nil, 2)
224+ else $Tuple2(nil, 1)
225+ }
91226
92227

github/deemru/w8io/3ef1775 
53.81 ms