tx · 9essiegU7N7Nwxr6sx9WLTfte3eHBPLWXoVA9ppxmQCy 3PPod6TWkaqUd5Hx2CkM236PFPreqLu1nhN: -0.00700000 Waves 2022.09.18 00:20 [3299113] smart account 3PPod6TWkaqUd5Hx2CkM236PFPreqLu1nhN > SELF 0.00000000 Waves
{ "type": 13, "id": "9essiegU7N7Nwxr6sx9WLTfte3eHBPLWXoVA9ppxmQCy", "fee": 700000, "feeAssetId": null, "timestamp": 1663449625424, "version": 2, "chainId": 87, "sender": "3PPod6TWkaqUd5Hx2CkM236PFPreqLu1nhN", "senderPublicKey": "5XJeDoDVZrQ5rX8EcMWwMUHpYWs6CuAWoNgEn5rA8wgv", "proofs": [ "2Zjh95rSoZj68spyDGR6EgeLBCfApVC8Gzgb4DHYbUrQDAneiLipYAc9j3HjFz92QtoGBoy6GLcDF8HPpDHGXxoy" ], "script": "base64:BgIhCAISBQoDCAEIEgQKAggBEgMKAQgSAwoBCBIECgIICBIAGgAEVVNETgEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEACmZlZUFkZHJlc3MJAQdBZGRyZXNzAQEaAVcfqkivNjk8ZqY49VHF/62O5PcNLqNyO/oACW1pbkFtb3VudACAreIEAAxmZWVOdW1lcmF0b3IABQAOZmVlRGVub21pbmF0b3IABQEQZ2V0U3RhcnRCbG9ja0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgxfc3RhcnRfYmxvY2sBDmdldEVuZEJsb2NrS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCCl9lbmRfYmxvY2sBDmdldEZpbmlzaEF0S2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCEF9maW5pc2hfYXRfYmxvY2sBF2dldEFuc3dlckRhcHBBZGRyZXNzS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9hbnN3ZXJfZGFwcAEXZ2V0QW5zd2VyRnVuY0FkZHJlc3NLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIMX2Fuc3dlcl9mdW5jAQxnZXRSZXN1bHRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIHX3Jlc3VsdAEIZ2V0SWRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIDX2lkAQ1nZXRBbnN3ZXJOS2V5AgdldmVudElkAW4JAKwCAgkArAICBQdldmVudElkAghfYW5zd2VyXwkApAMBBQFuARJnZXRBbnN3ZXJzQ291bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAIOX2Fuc3dlcnNfY291bnQBDGdldFN0YXR1c0tleQEHZXZlbnRJZAkArAICBQdldmVudElkAgdfc3RhdHVzAQpnZXREZXNjS2V5AQdldmVudElkCQCsAgIFB2V2ZW50SWQCDF9kZXNjcmlwdGlvbgERZ2V0VG90YWxBbW91bnRLZXkBB2V2ZW50SWQJAKwCAgUHZXZlbnRJZAINX3RvdGFsX2Ftb3VudAENZ2V0QW1vdW50TktleQIHZXZlbnRJZAFuCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfCQCkAwEFAW4CB19hbW91bnQBE2dldEFtb3VudEFkZHJlc3NLZXkCB2V2ZW50SWQHYWRkcmVzcwkArAICCQCsAgIJAKwCAgUHZXZlbnRJZAIBXwUHYWRkcmVzcwIHX2Ftb3VudAETZ2V0Q2hvaWNlQWRkcmVzc0tleQIHZXZlbnRJZAdhZGRyZXNzCQCsAgIJAKwCAgkArAICBQdldmVudElkAgFfBQdhZGRyZXNzAgdfY2hvaWNlARtnZXRBbHJlYWR5Q2xhaW1lZEFkZHJlc3NLZXkCB2V2ZW50SWQHYWRkcmVzcwkArAICCQCsAgIJAKwCAgUHZXZlbnRJZAIBXwUHYWRkcmVzcwIQX2FscmVhZHlfY2xhaW1lZAEPZ2V0QW5zd2VyUmVzdWx0AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAQBdAUHJG1hdGNoMAkAAgECBCNlcnIBCWdldFN0YXR1cwEHZXZlbnRJZAQGc3RhdHVzCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQxnZXRTdGF0dXNLZXkBBQdldmVudElkAgEjAwMJAAACBQZzdGF0dXMCCGZpbmlzaGVkBgkAAAIFBnN0YXR1cwIBIwUGc3RhdHVzBAhmaW5pc2hBdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDmdldEZpbmlzaEF0S2V5AQUHZXZlbnRJZAQKc3RhcnRCbG9jawkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBEGdldFN0YXJ0QmxvY2tLZXkBBQdldmVudElkBAhlbmRCbG9jawkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDmdldEVuZEJsb2NrS2V5AQUHZXZlbnRJZAMDCQBnAgUGaGVpZ2h0BQpzdGFydEJsb2NrCQBnAgUIZW5kQmxvY2sFBmhlaWdodAcCBmFjdGl2ZQMDCQBmAgUGaGVpZ2h0BQhlbmRCbG9jawkAZwIFCGZpbmlzaEF0BQZoZWlnaHQHAgR3YWl0AwkAZgIFBmhlaWdodAUIZmluaXNoQXQCCGZpbmlzaGVkCQACAQIOdW5rbm93biBzdGF0dXMBB2lzQWRtaW4BBmNhbGxlcgMJAAACBQZjYWxsZXIFBHRoaXMGBwENcmVnaXN0ZXJFdmVudAcEdHhpZARkZXNjCnN0YXJ0QmxvY2sIZW5kQmxvY2sIZmluaXNoQXQLY2hlY2tlckRhcHALY2hlY2tlckZ1bmMEB2V2ZW50SWQFBHR4aWQEDGFuc3dlclJlc3VsdAkBD2dldEFuc3dlclJlc3VsdAEJAPwHBAUEdGhpcwIFY2hlY2sJAMwIAgULY2hlY2tlckRhcHAJAMwIAgULY2hlY2tlckZ1bmMFA25pbAUDbmlsAwkAAAIFDGFuc3dlclJlc3VsdAUMYW5zd2VyUmVzdWx0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQZ2V0U3RhcnRCbG9ja0tleQEFB2V2ZW50SWQFCnN0YXJ0QmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5nZXRFbmRCbG9ja0tleQEFB2V2ZW50SWQFCGVuZEJsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOZ2V0RmluaXNoQXRLZXkBBQdldmVudElkBQhmaW5pc2hBdAkAzAgCCQELU3RyaW5nRW50cnkCCQEXZ2V0QW5zd2VyRGFwcEFkZHJlc3NLZXkBBQdldmVudElkBQtjaGVja2VyRGFwcAkAzAgCCQELU3RyaW5nRW50cnkCCQEXZ2V0QW5zd2VyRnVuY0FkZHJlc3NLZXkBBQdldmVudElkBQtjaGVja2VyRnVuYwkAzAgCCQELU3RyaW5nRW50cnkCCQEKZ2V0RGVzY0tleQEFB2V2ZW50SWQFBGRlc2MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFN0YXR1c0tleQEFB2V2ZW50SWQCBmFjdGl2ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEIZ2V0SWRLZXkBBQdldmVudElkBQdldmVudElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1nZXRBbnN3ZXJOS2V5AgUHZXZlbnRJZAABAgJOTwkAzAgCCQELU3RyaW5nRW50cnkCCQENZ2V0QW5zd2VyTktleQIFB2V2ZW50SWQAAgIDWUVTCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESZ2V0QW5zd2Vyc0NvdW50S2V5AQUHZXZlbnRJZAACCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMZ2V0UmVzdWx0S2V5AQUHZXZlbnRJZAABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEGNoZWNrRXZlbnRBbnN3ZXIBB2V2ZW50SWQFA25pbAYBaQETc2ltcGxlUmVnaXN0ZXJFdmVudAMEZGVzYwpzdGFydEJsb2NrC2NoZWNrZXJGdW5jAwkBASEBCQEHaXNBZG1pbgEIBQFpBmNhbGxlcgkAAgECEW9ubHkgYWRtaW4gY2FuIGRvBAR0eGlkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQECGVuZEJsb2NrCQBkAgUKc3RhcnRCbG9jawADBAhmaW5pc2hBdAkAZAIFCGVuZEJsb2NrAAMEC2NoZWNrZXJEYXBwCQClCAEFBHRoaXMJAQ1yZWdpc3RlckV2ZW50BwUEdHhpZAUEZGVzYwUKc3RhcnRCbG9jawUIZW5kQmxvY2sFCGZpbmlzaEF0BQtjaGVja2VyRGFwcAULY2hlY2tlckZ1bmMBaQEGY2hvaWNlAgdldmVudElkBmNob2ljZQQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBWNoZWNrCQD8BwQFBHRoaXMCC2NoZWNrUmVzdWx0CQDMCAIFB2V2ZW50SWQFA25pbAUDbmlsAwkAAAIFBWNoZWNrBQVjaGVjawQGc3RhdHVzCQEJZ2V0U3RhdHVzAQUHZXZlbnRJZAMJAAACBQZzdGF0dXMCBmFjdGl2ZQMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQRVU0ROBwQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMJAGYCBQltaW5BbW91bnQFBmFtb3VudAkAAgECG2Ftb3VudCBpcyBsZXNzIHRoYW4gYWxsb3dlZAQMYW5zd2Vyc0NvdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQESZ2V0QW5zd2Vyc0NvdW50S2V5AQUHZXZlbnRJZAMDCQAAAgUGY2hvaWNlAAAGCQBmAgUGY2hvaWNlBQxhbnN3ZXJzQ291bnQJAAIBAhFjaG9pY2UgaXMgaW52YWxpZAQMY3VycmVudFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARFnZXRUb3RhbEFtb3VudEtleQEFB2V2ZW50SWQAAAQLY2hvaWNlVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDWdldEFtb3VudE5LZXkCBQdldmVudElkBQZjaG9pY2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWdldFRvdGFsQW1vdW50S2V5AQUHZXZlbnRJZAkAZAIFDGN1cnJlbnRUb3RhbAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENZ2V0QW1vdW50TktleQIFB2V2ZW50SWQFBmNob2ljZQkAZAIFC2Nob2ljZVRvdGFsBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARNnZXRDaG9pY2VBZGRyZXNzS2V5AgUHZXZlbnRJZAUHYWRkcmVzcwUGY2hvaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETZ2V0QW1vdW50QWRkcmVzc0tleQIFB2V2ZW50SWQFB2FkZHJlc3MFBmFtb3VudAUDbmlsCQACAQILQmFkIHBheW1lbnQJAAIBAg9Zb3UgY2FuYHQgZG8gaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0BB2V2ZW50SWQEB2FkZHJlc3MIBQFpBmNhbGxlcgQGc3RhdHVzCQEJZ2V0U3RhdHVzAQUHZXZlbnRJZAMJAAACBQZzdGF0dXMCCGZpbmlzaGVkBAt0b3RhbEFtb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBEWdldFRvdGFsQW1vdW50S2V5AQUHZXZlbnRJZAQDZmVlCQBrAwULdG90YWxBbW91bnQFDGZlZU51bWVyYXRvcgUOZmVlRGVub21pbmF0b3IEB3Jld2FyZHMJAGUCBQt0b3RhbEFtb3VudAUDZmVlAwkAAAIFB2FkZHJlc3MFCmZlZUFkZHJlc3MJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKZmVlQWRkcmVzcwUDZmVlBQRVU0ROBQNuaWwEDmFscmVhZHlDbGFpbWVkCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARtnZXRBbHJlYWR5Q2xhaW1lZEFkZHJlc3NLZXkCBQdldmVudElkCQClCAEFB2FkZHJlc3MHAwUOYWxyZWFkeUNsYWltZWQJAAIBAhZSZXdhcmQgYWxyZWFkeSBjbGFpbWVkBA1hZGRyZXNzQ2hvaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQETZ2V0Q2hvaWNlQWRkcmVzc0tleQIFB2V2ZW50SWQJAKUIAQUHYWRkcmVzcwQGcmVzdWx0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEMZ2V0UmVzdWx0S2V5AQUHZXZlbnRJZAQLY2hvaWNlVG90YWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ1nZXRBbW91bnROS2V5AgUHZXZlbnRJZAUGcmVzdWx0BA1hZGRyZXNzQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQETZ2V0QW1vdW50QWRkcmVzc0tleQIFB2V2ZW50SWQJAKUIAQUHYWRkcmVzcwMJAAACBQ1hZGRyZXNzQ2hvaWNlBQZyZXN1bHQEDWFkZHJlc3NSZXdhcmQJAGsDBQdyZXdhcmRzBQ1hZGRyZXNzQW1vdW50BQtjaG9pY2VUb3RhbAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBE2dldENob2ljZUFkZHJlc3NLZXkCBQdldmVudElkCQClCAEFB2FkZHJlc3MGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFB2FkZHJlc3MFDWFkZHJlc3NSZXdhcmQFBFVTRE4FA25pbAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nCQACAQIPWW91IGNhbmB0IGRvIGl0AWkBC2NoZWNrUmVzdWx0AQdldmVudElkBAZzdGF0dXMJAQlnZXRTdGF0dXMBBQdldmVudElkAwkAAAIFBnN0YXR1cwIGYWN0aXZlBAtjaGVja2VyRGFwcAkAnQgCBQR0aGlzCQEXZ2V0QW5zd2VyRGFwcEFkZHJlc3NLZXkBBQdldmVudElkBAtjaGVja2VyRnVuYwkAnQgCBQR0aGlzCQEXZ2V0QW5zd2VyRnVuY0FkZHJlc3NLZXkBBQdldmVudElkBA1jdXJyZW50UmVzdWx0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEMZ2V0UmVzdWx0S2V5AQUHZXZlbnRJZAQMYW5zd2VyUmVzdWx0CQEPZ2V0QW5zd2VyUmVzdWx0AQkA/AcEBQR0aGlzAgVjaGVjawkAzAgCBQtjaGVja2VyRGFwcAkAzAgCBQtjaGVja2VyRnVuYwUDbmlsBQNuaWwDCQAAAgUMYW5zd2VyUmVzdWx0BQxhbnN3ZXJSZXN1bHQDCQECIT0CBQxhbnN3ZXJSZXN1bHQFDWN1cnJlbnRSZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGdldFN0YXR1c0tleQEFB2V2ZW50SWQCCGZpbmlzaGVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMZ2V0UmVzdWx0S2V5AQUHZXZlbnRJZAUMYW5zd2VyUmVzdWx0BQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECEEV2ZW50IG5vdCBhY3RpdmUBaQEFY2hlY2sCBGRhcHAIZnVuY3Rpb24DCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAhBvbmx5IG1haW4gY2FuIGRvBAxhbnN3ZXJSZXN1bHQJAQ9nZXRBbnN3ZXJSZXN1bHQBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGRhcHAFCGZ1bmN0aW9uBQNuaWwFA25pbAkAlAoCBQNuaWwFDGFuc3dlclJlc3VsdAFpARFjaGVja1ZpcmVzVmVzdGluZwADCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAhBvbmx5IG1haW4gY2FuIGRvBA5vcFZpcmVzQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1AyckpHZmI1TWJlaXZaTlNxZFZtc0QxWTJNejh5NkpyM1oECGVuYWJsZWQwCQELdmFsdWVPckVsc2UCCQCbCAIFDm9wVmlyZXNBZGRyZXNzAg1zeXN0ZW1fcGF1c2VkBgQIZW5hYmxlZDEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUOb3BWaXJlc0FkZHJlc3MCJW9wX2xpcXVpZGFvX2FsbF93aXRoZHJhd1Zlc3RlZF9wYXVzZWQGBAhlbmFibGVkMgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ5vcFZpcmVzQWRkcmVzcwIqb3BfbGlxdWlkYW9fYWxsX3dpdGhkcmF3VmVzdGVkX3VzZG5fcGF1c2VkBgMDAwUIZW5hYmxlZDAFCGVuYWJsZWQxBwUIZW5hYmxlZDIHCQCUCgIFA25pbAACCQCUCgIFA25pbAABALFZwy4=", "height": 3299113, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Cx5kUHt6oT1kz13JFgV6wgyds6kJcKy3AF1nHt7b9sQ5 Next: 9gwefKYkoqpQpkqcHvpyBDFMCV7LaU4z1H5QBsaEqdiX Diff:
Old | New | Differences | |
---|---|---|---|
69 | 69 | ||
70 | 70 | func getStatus (eventId) = { | |
71 | 71 | let status = valueOrElse(getString(this, getStatusKey(eventId)), "#") | |
72 | - | if (if ((status != "#")) | |
73 | - | then (height > valueOrElse(getInteger(this, getFinishAtKey(eventId)), 0)) | |
74 | - | else false) | |
75 | - | then "finished" | |
76 | - | else status | |
72 | + | if (if ((status == "finished")) | |
73 | + | then true | |
74 | + | else (status == "#")) | |
75 | + | then status | |
76 | + | else { | |
77 | + | let finishAt = getIntegerValue(this, getFinishAtKey(eventId)) | |
78 | + | let startBlock = getIntegerValue(this, getStartBlockKey(eventId)) | |
79 | + | let endBlock = getIntegerValue(this, getEndBlockKey(eventId)) | |
80 | + | if (if ((height >= startBlock)) | |
81 | + | then (endBlock >= height) | |
82 | + | else false) | |
83 | + | then "active" | |
84 | + | else if (if ((height > endBlock)) | |
85 | + | then (finishAt >= height) | |
86 | + | else false) | |
87 | + | then "wait" | |
88 | + | else if ((height > finishAt)) | |
89 | + | then "finished" | |
90 | + | else throw("unknown status") | |
91 | + | } | |
77 | 92 | } | |
78 | 93 | ||
79 | 94 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
5 | 5 | ||
6 | 6 | let feeAddress = Address(base58'3P4pKfj9UZHqj6pb18921oSftYuQw35gExR') | |
7 | 7 | ||
8 | 8 | let minAmount = 10000000 | |
9 | 9 | ||
10 | 10 | let feeNumerator = 5 | |
11 | 11 | ||
12 | 12 | let feeDenominator = 5 | |
13 | 13 | ||
14 | 14 | func getStartBlockKey (eventId) = (eventId + "_start_block") | |
15 | 15 | ||
16 | 16 | ||
17 | 17 | func getEndBlockKey (eventId) = (eventId + "_end_block") | |
18 | 18 | ||
19 | 19 | ||
20 | 20 | func getFinishAtKey (eventId) = (eventId + "_finish_at_block") | |
21 | 21 | ||
22 | 22 | ||
23 | 23 | func getAnswerDappAddressKey (eventId) = (eventId + "_answer_dapp") | |
24 | 24 | ||
25 | 25 | ||
26 | 26 | func getAnswerFuncAddressKey (eventId) = (eventId + "_answer_func") | |
27 | 27 | ||
28 | 28 | ||
29 | 29 | func getResultKey (eventId) = (eventId + "_result") | |
30 | 30 | ||
31 | 31 | ||
32 | 32 | func getIdKey (eventId) = (eventId + "_id") | |
33 | 33 | ||
34 | 34 | ||
35 | 35 | func getAnswerNKey (eventId,n) = ((eventId + "_answer_") + toString(n)) | |
36 | 36 | ||
37 | 37 | ||
38 | 38 | func getAnswersCountKey (eventId) = (eventId + "_answers_count") | |
39 | 39 | ||
40 | 40 | ||
41 | 41 | func getStatusKey (eventId) = (eventId + "_status") | |
42 | 42 | ||
43 | 43 | ||
44 | 44 | func getDescKey (eventId) = (eventId + "_description") | |
45 | 45 | ||
46 | 46 | ||
47 | 47 | func getTotalAmountKey (eventId) = (eventId + "_total_amount") | |
48 | 48 | ||
49 | 49 | ||
50 | 50 | func getAmountNKey (eventId,n) = (((eventId + "_") + toString(n)) + "_amount") | |
51 | 51 | ||
52 | 52 | ||
53 | 53 | func getAmountAddressKey (eventId,address) = (((eventId + "_") + address) + "_amount") | |
54 | 54 | ||
55 | 55 | ||
56 | 56 | func getChoiceAddressKey (eventId,address) = (((eventId + "_") + address) + "_choice") | |
57 | 57 | ||
58 | 58 | ||
59 | 59 | func getAlreadyClaimedAddressKey (eventId,address) = (((eventId + "_") + address) + "_already_claimed") | |
60 | 60 | ||
61 | 61 | ||
62 | 62 | func getAnswerResult (v) = match v { | |
63 | 63 | case x: Int => | |
64 | 64 | x | |
65 | 65 | case t => | |
66 | 66 | throw("#err") | |
67 | 67 | } | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func getStatus (eventId) = { | |
71 | 71 | let status = valueOrElse(getString(this, getStatusKey(eventId)), "#") | |
72 | - | if (if ((status != "#")) | |
73 | - | then (height > valueOrElse(getInteger(this, getFinishAtKey(eventId)), 0)) | |
74 | - | else false) | |
75 | - | then "finished" | |
76 | - | else status | |
72 | + | if (if ((status == "finished")) | |
73 | + | then true | |
74 | + | else (status == "#")) | |
75 | + | then status | |
76 | + | else { | |
77 | + | let finishAt = getIntegerValue(this, getFinishAtKey(eventId)) | |
78 | + | let startBlock = getIntegerValue(this, getStartBlockKey(eventId)) | |
79 | + | let endBlock = getIntegerValue(this, getEndBlockKey(eventId)) | |
80 | + | if (if ((height >= startBlock)) | |
81 | + | then (endBlock >= height) | |
82 | + | else false) | |
83 | + | then "active" | |
84 | + | else if (if ((height > endBlock)) | |
85 | + | then (finishAt >= height) | |
86 | + | else false) | |
87 | + | then "wait" | |
88 | + | else if ((height > finishAt)) | |
89 | + | then "finished" | |
90 | + | else throw("unknown status") | |
91 | + | } | |
77 | 92 | } | |
78 | 93 | ||
79 | 94 | ||
80 | 95 | func isAdmin (caller) = if ((caller == this)) | |
81 | 96 | then true | |
82 | 97 | else false | |
83 | 98 | ||
84 | 99 | ||
85 | 100 | func registerEvent (txid,desc,startBlock,endBlock,finishAt,checkerDapp,checkerFunc) = { | |
86 | 101 | let eventId = txid | |
87 | 102 | let answerResult = getAnswerResult(invoke(this, "check", [checkerDapp, checkerFunc], nil)) | |
88 | 103 | if ((answerResult == answerResult)) | |
89 | 104 | 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 | 105 | else throw("Strict value is not equal to itself.") | |
91 | 106 | } | |
92 | 107 | ||
93 | 108 | ||
94 | 109 | func checkEventAnswer (eventId) = nil | |
95 | 110 | ||
96 | 111 | ||
97 | 112 | @Callable(i) | |
98 | 113 | func simpleRegisterEvent (desc,startBlock,checkerFunc) = if (!(isAdmin(i.caller))) | |
99 | 114 | then throw("only admin can do") | |
100 | 115 | else { | |
101 | 116 | let txid = toBase58String(i.transactionId) | |
102 | 117 | let endBlock = (startBlock + 3) | |
103 | 118 | let finishAt = (endBlock + 3) | |
104 | 119 | let checkerDapp = toString(this) | |
105 | 120 | registerEvent(txid, desc, startBlock, endBlock, finishAt, checkerDapp, checkerFunc) | |
106 | 121 | } | |
107 | 122 | ||
108 | 123 | ||
109 | 124 | ||
110 | 125 | @Callable(i) | |
111 | 126 | func choice (eventId,choice) = { | |
112 | 127 | let address = toString(i.caller) | |
113 | 128 | let check = invoke(this, "checkResult", [eventId], nil) | |
114 | 129 | if ((check == check)) | |
115 | 130 | then { | |
116 | 131 | let status = getStatus(eventId) | |
117 | 132 | if ((status == "active")) | |
118 | 133 | then if (if ((size(i.payments) == 1)) | |
119 | 134 | then (i.payments[0].assetId == USDN) | |
120 | 135 | else false) | |
121 | 136 | then { | |
122 | 137 | let amount = i.payments[0].amount | |
123 | 138 | if ((minAmount > amount)) | |
124 | 139 | then throw("amount is less than allowed") | |
125 | 140 | else { | |
126 | 141 | let answersCount = getIntegerValue(this, getAnswersCountKey(eventId)) | |
127 | 142 | if (if ((choice == 0)) | |
128 | 143 | then true | |
129 | 144 | else (choice > answersCount)) | |
130 | 145 | then throw("choice is invalid") | |
131 | 146 | else { | |
132 | 147 | let currentTotal = valueOrElse(getInteger(this, getTotalAmountKey(eventId)), 0) | |
133 | 148 | let choiceTotal = valueOrElse(getInteger(this, getAmountNKey(eventId, choice)), 0) | |
134 | 149 | [IntegerEntry(getTotalAmountKey(eventId), (currentTotal + amount)), IntegerEntry(getAmountNKey(eventId, choice), (choiceTotal + amount)), IntegerEntry(getChoiceAddressKey(eventId, address), choice), IntegerEntry(getAmountAddressKey(eventId, address), amount)] | |
135 | 150 | } | |
136 | 151 | } | |
137 | 152 | } | |
138 | 153 | else throw("Bad payment") | |
139 | 154 | else throw("You can`t do it") | |
140 | 155 | } | |
141 | 156 | else throw("Strict value is not equal to itself.") | |
142 | 157 | } | |
143 | 158 | ||
144 | 159 | ||
145 | 160 | ||
146 | 161 | @Callable(i) | |
147 | 162 | func claim (eventId) = { | |
148 | 163 | let address = i.caller | |
149 | 164 | let status = getStatus(eventId) | |
150 | 165 | if ((status == "finished")) | |
151 | 166 | then { | |
152 | 167 | let totalAmount = getIntegerValue(this, getTotalAmountKey(eventId)) | |
153 | 168 | let fee = fraction(totalAmount, feeNumerator, feeDenominator) | |
154 | 169 | let rewards = (totalAmount - fee) | |
155 | 170 | if ((address == feeAddress)) | |
156 | 171 | then [ScriptTransfer(feeAddress, fee, USDN)] | |
157 | 172 | else { | |
158 | 173 | let alreadyClaimed = valueOrElse(getBoolean(this, getAlreadyClaimedAddressKey(eventId, toString(address))), false) | |
159 | 174 | if (alreadyClaimed) | |
160 | 175 | then throw("Reward already claimed") | |
161 | 176 | else { | |
162 | 177 | let addressChoice = getIntegerValue(this, getChoiceAddressKey(eventId, toString(address))) | |
163 | 178 | let result = getIntegerValue(this, getResultKey(eventId)) | |
164 | 179 | let choiceTotal = getIntegerValue(this, getAmountNKey(eventId, result)) | |
165 | 180 | let addressAmount = getIntegerValue(this, getAmountAddressKey(eventId, toString(address))) | |
166 | 181 | if ((addressChoice == result)) | |
167 | 182 | then { | |
168 | 183 | let addressReward = fraction(rewards, addressAmount, choiceTotal) | |
169 | 184 | [BooleanEntry(getChoiceAddressKey(eventId, toString(address)), true), ScriptTransfer(address, addressReward, USDN)] | |
170 | 185 | } | |
171 | 186 | else throw("Something went wrong") | |
172 | 187 | } | |
173 | 188 | } | |
174 | 189 | } | |
175 | 190 | else throw("You can`t do it") | |
176 | 191 | } | |
177 | 192 | ||
178 | 193 | ||
179 | 194 | ||
180 | 195 | @Callable(i) | |
181 | 196 | func checkResult (eventId) = { | |
182 | 197 | let status = getStatus(eventId) | |
183 | 198 | if ((status == "active")) | |
184 | 199 | then { | |
185 | 200 | let checkerDapp = getString(this, getAnswerDappAddressKey(eventId)) | |
186 | 201 | let checkerFunc = getString(this, getAnswerFuncAddressKey(eventId)) | |
187 | 202 | let currentResult = getIntegerValue(this, getResultKey(eventId)) | |
188 | 203 | let answerResult = getAnswerResult(invoke(this, "check", [checkerDapp, checkerFunc], nil)) | |
189 | 204 | if ((answerResult == answerResult)) | |
190 | 205 | then if ((answerResult != currentResult)) | |
191 | 206 | then [StringEntry(getStatusKey(eventId), "finished"), IntegerEntry(getResultKey(eventId), answerResult)] | |
192 | 207 | else nil | |
193 | 208 | else throw("Strict value is not equal to itself.") | |
194 | 209 | } | |
195 | 210 | else throw("Event not active") | |
196 | 211 | } | |
197 | 212 | ||
198 | 213 | ||
199 | 214 | ||
200 | 215 | @Callable(i) | |
201 | 216 | func check (dapp,function) = if ((this != i.caller)) | |
202 | 217 | then throw("only main can do") | |
203 | 218 | else { | |
204 | 219 | let answerResult = getAnswerResult(invoke(addressFromStringValue(dapp), function, nil, nil)) | |
205 | 220 | $Tuple2(nil, answerResult) | |
206 | 221 | } | |
207 | 222 | ||
208 | 223 | ||
209 | 224 | ||
210 | 225 | @Callable(i) | |
211 | 226 | func checkViresVesting () = if ((this != i.caller)) | |
212 | 227 | then throw("only main can do") | |
213 | 228 | else { | |
214 | 229 | let opViresAddress = addressFromStringValue("3P2rJGfb5MbeivZNSqdVmsD1Y2Mz8y6Jr3Z") | |
215 | 230 | let enabled0 = valueOrElse(getBoolean(opViresAddress, "system_paused"), true) | |
216 | 231 | let enabled1 = valueOrElse(getBoolean(opViresAddress, "op_liquidao_all_withdrawVested_paused"), true) | |
217 | 232 | let enabled2 = valueOrElse(getBoolean(opViresAddress, "op_liquidao_all_withdrawVested_usdn_paused"), true) | |
218 | 233 | if (if (if (enabled0) | |
219 | 234 | then enabled1 | |
220 | 235 | else false) | |
221 | 236 | then enabled2 | |
222 | 237 | else false) | |
223 | 238 | then $Tuple2(nil, 2) | |
224 | 239 | else $Tuple2(nil, 1) | |
225 | 240 | } | |
226 | 241 | ||
227 | 242 |
github/deemru/w8io/6500d08 54.63 ms ◑