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:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# 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 | + | ||
4 | 14 | func getStartBlockKey (eventId) = (eventId + "_start_block") | |
5 | 15 | ||
6 | 16 | ||
25 | 35 | func getAnswerNKey (eventId,n) = ((eventId + "_answer_") + toString(n)) | |
26 | 36 | ||
27 | 37 | ||
38 | + | func getAnswersCountKey (eventId) = (eventId + "_answers_count") | |
39 | + | ||
40 | + | ||
28 | 41 | func getStatusKey (eventId) = (eventId + "_status") | |
29 | 42 | ||
30 | 43 | ||
31 | 44 | 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") | |
32 | 60 | ||
33 | 61 | ||
34 | 62 | func getAnswerResult (v) = match v { | |
56 | 84 | ||
57 | 85 | func registerEvent (txid,desc,startBlock,endBlock,finishAt,checkerDapp,checkerFunc) = { | |
58 | 86 | let eventId = txid | |
59 | - | let answerResult = getAnswerResult(invoke( | |
60 | - | if ((answerResult == | |
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(" | |
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.") | |
63 | 91 | } | |
64 | 92 | ||
65 | 93 | ||
80 | 108 | ||
81 | 109 | ||
82 | 110 | @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 | |
84 | 149 | 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") | |
90 | 176 | } | |
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 | + | } | |
91 | 226 | ||
92 | 227 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# 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 | + | ||
4 | 14 | func getStartBlockKey (eventId) = (eventId + "_start_block") | |
5 | 15 | ||
6 | 16 | ||
7 | 17 | func getEndBlockKey (eventId) = (eventId + "_end_block") | |
8 | 18 | ||
9 | 19 | ||
10 | 20 | func getFinishAtKey (eventId) = (eventId + "_finish_at_block") | |
11 | 21 | ||
12 | 22 | ||
13 | 23 | func getAnswerDappAddressKey (eventId) = (eventId + "_answer_dapp") | |
14 | 24 | ||
15 | 25 | ||
16 | 26 | func getAnswerFuncAddressKey (eventId) = (eventId + "_answer_func") | |
17 | 27 | ||
18 | 28 | ||
19 | 29 | func getResultKey (eventId) = (eventId + "_result") | |
20 | 30 | ||
21 | 31 | ||
22 | 32 | func getIdKey (eventId) = (eventId + "_id") | |
23 | 33 | ||
24 | 34 | ||
25 | 35 | func getAnswerNKey (eventId,n) = ((eventId + "_answer_") + toString(n)) | |
26 | 36 | ||
27 | 37 | ||
38 | + | func getAnswersCountKey (eventId) = (eventId + "_answers_count") | |
39 | + | ||
40 | + | ||
28 | 41 | func getStatusKey (eventId) = (eventId + "_status") | |
29 | 42 | ||
30 | 43 | ||
31 | 44 | 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") | |
32 | 60 | ||
33 | 61 | ||
34 | 62 | func getAnswerResult (v) = match v { | |
35 | 63 | case x: Int => | |
36 | 64 | x | |
37 | 65 | case t => | |
38 | 66 | throw("#err") | |
39 | 67 | } | |
40 | 68 | ||
41 | 69 | ||
42 | 70 | func getStatus (eventId) = { | |
43 | 71 | let status = valueOrElse(getString(this, getStatusKey(eventId)), "#") | |
44 | 72 | if (if ((status != "#")) | |
45 | 73 | then (height > valueOrElse(getInteger(this, getFinishAtKey(eventId)), 0)) | |
46 | 74 | else false) | |
47 | 75 | then "finished" | |
48 | 76 | else status | |
49 | 77 | } | |
50 | 78 | ||
51 | 79 | ||
52 | 80 | func isAdmin (caller) = if ((caller == this)) | |
53 | 81 | then true | |
54 | 82 | else false | |
55 | 83 | ||
56 | 84 | ||
57 | 85 | func registerEvent (txid,desc,startBlock,endBlock,finishAt,checkerDapp,checkerFunc) = { | |
58 | 86 | let eventId = txid | |
59 | - | let answerResult = getAnswerResult(invoke( | |
60 | - | if ((answerResult == | |
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(" | |
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.") | |
63 | 91 | } | |
64 | 92 | ||
65 | 93 | ||
66 | 94 | func checkEventAnswer (eventId) = nil | |
67 | 95 | ||
68 | 96 | ||
69 | 97 | @Callable(i) | |
70 | 98 | func simpleRegisterEvent (desc,startBlock,checkerFunc) = if (!(isAdmin(i.caller))) | |
71 | 99 | then throw("only admin can do") | |
72 | 100 | else { | |
73 | 101 | let txid = toBase58String(i.transactionId) | |
74 | 102 | let endBlock = (startBlock + 1440) | |
75 | 103 | let finishAt = (endBlock + 1440) | |
76 | 104 | let checkerDapp = toString(this) | |
77 | 105 | registerEvent(txid, desc, startBlock, endBlock, finishAt, checkerDapp, checkerFunc) | |
78 | 106 | } | |
79 | 107 | ||
80 | 108 | ||
81 | 109 | ||
82 | 110 | @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 | |
84 | 149 | 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") | |
90 | 176 | } | |
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 | + | } | |
91 | 226 | ||
92 | 227 |
github/deemru/w8io/3ef1775 53.81 ms ◑