tx · 4E3w3Cq34z7CAWJyB9ffwyoAb1RKVmgL88T6q4dubgzV

3N5GdQtkca26RjfqCjZySc6xKVLy3ak2neK:  -0.02000000 Waves

2025.02.04 16:12 [3489018] smart account 3N5GdQtkca26RjfqCjZySc6xKVLy3ak2neK > SELF 0.00000000 Waves

{ "type": 13, "id": "4E3w3Cq34z7CAWJyB9ffwyoAb1RKVmgL88T6q4dubgzV", "fee": 2000000, "feeAssetId": null, "timestamp": 1738674742648, "version": 2, "chainId": 84, "sender": "3N5GdQtkca26RjfqCjZySc6xKVLy3ak2neK", "senderPublicKey": "74hB8d2UATLmzddfh4KTpRuMhnVNAHSGirdFByhNSTW5", "proofs": [ "SpA8r5fCgwz4EmuhcD1DK2BMTBc3F5bBChH9kfqPWysVpnNJY5DZP1HzY28MKBCvTJppJxJtkkw7N5SdDJZWnoe" ], "script": "base64:BwI8CAISAwoBAhIAEgQKAggBEgASBAoCCAESBAoCCAgSAwoBCBIECgIIARIDCgEBEgMKAQgSAwoBCBIDCgEIEQARcmVxdWlyZWRXWFhBbW91bnQAgMivoCUAFWN5Y2xlRHVyYXRpb25JbkJsb2NrcwDoBwAYZW1lcmdlbmN5Vm90aW5nVGhyZXNob2xkAAoADXRvdGFsVm90ZXNrZXkCCnRvdGFsVm90ZXMACnd4eEFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDU3KQECDnByb2plY3RBc3NldElkAA14V2F2ZXNBc3NldElkCQERQGV4dHJOYXRpdmUoMTA1NykBAg14V2F2ZXNBc3NldElkAAxjdXJyZW50Q3ljbGUJAGkCCQBlAggFCWxhc3RCbG9jawZoZWlnaHQJARFAZXh0ck5hdGl2ZSgxMDU1KQECCnN0YXJ0QmxvY2sFFWN5Y2xlRHVyYXRpb25JbkJsb2NrcwAgY3VycmVudEN5Y2xlUmVxdWVzdGVkV2l0aGRyYXdhbHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICAhdjeWNsZVJlcXVlc3RlZFdpdGhkcmF3OgkApAMBBQxjdXJyZW50Q3ljbGUAAAAdY3VycmVudEN5Y2xlUmVxdWVzdGVkRGVwb3NpdHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICAhZjeWNsZVJlcXVlc3RlZERlcG9zaXQ6CQCkAwEFDGN1cnJlbnRDeWNsZQAAAAp0b3RhbFZvdGVzCQERQGV4dHJOYXRpdmUoMTA1NSkBBQ10b3RhbFZvdGVza2V5ARZhc3NlcnRWYWxpZGF0b3JBZGRyZXNzARB2YWxpZGF0b3JBZGRyZXNzAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICAgp2YWxpZGF0b3I6CQClCAEFEHZhbGlkYXRvckFkZHJlc3MFBHVuaXQJAAIBAhFVbmtub3duIHZhbGlkYXRvcgEQYXNzZXJ0T25lUGF5bWVudAEKaW52b2NhdGlvbgMJAQIhPQIJAJADAQgFCmludm9jYXRpb24IcGF5bWVudHMAAQkAAgECD05vdCBvbmUgcGF5bWVudAUEdW5pdAESYXNzZXJ0UGF5bWVudEFzc2V0AgppbnZvY2F0aW9uDWV4cGVjdGVkVG9rZW4DCQECIT0CCAkAkQMCCAUKaW52b2NhdGlvbghwYXltZW50cwAAB2Fzc2V0SWQFDWV4cGVjdGVkVG9rZW4JAAIBAhNVbmV4cGVjdGVkIGFzc2V0IGlkBQR1bml0AQphc3NlcnRVaW50AQF2AwkAZgIAAAUBdgkAAgECDEludmFsaWQgdWludAUEdW5pdAEbYXNzZXJ0QWN0aXZlVmFsaWRhdG9yU3RhdHVzARB2YWxpZGF0b3JBZGRyZXNzBBJ2YWxpZGF0b3JTdGF0dXNLZXkJAKwCAgIQdmFsaWRhdG9yU3RhdHVzOgkApQgBBRB2YWxpZGF0b3JBZGRyZXNzAwkBASEBCQERQGV4dHJOYXRpdmUoMTA1NikBBRJ2YWxpZGF0b3JTdGF0dXNLZXkJAAIBAhJVbmFjdGl2ZSB2YWxpZGF0b3IFBHVuaXQBG2Fzc2VydEN5Y2xlTG93ZXJUaGF0Q3VycmVudAEFY3ljbGUDCQBmAgUMY3VycmVudEN5Y2xlBQVjeWNsZQUEdW5pdAkAAgECDUludmFsaWQgY3ljbGUBFmFzc2VydENhbGxlcklzQ29udHJhY3QBCmludm9jYXRpb24DCQECIT0CBQR0aGlzCAUKaW52b2NhdGlvbgZjYWxsZXIJAAIBAgxVbmF1dGhvcml6ZWQFBHVuaXQMCmludm9jYXRpb24BBGluaXQBCnd4eFRva2VuSWQEC2NhbGxlckNoZWNrCQEWYXNzZXJ0Q2FsbGVySXNDb250cmFjdAEFCmludm9jYXRpb24DCQAAAgULY2FsbGVyQ2hlY2sFC2NhbGxlckNoZWNrAwkBCWlzRGVmaW5lZAEJAKEIAQIOcHJvamVjdEFzc2V0SWQJAAIBAgtJbml0aWFsaXplZAQFaXNzdWUJAMIIBQIGeFdhdmVzAgZ4V2F2ZXMAAAAIBgQPeFdhdmVzQXNzZXRJZElkCQC4CAEFBWlzc3VlCQDMCAIFBWlzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFZvdGVza2V5AAAJAMwIAgkBC0JpbmFyeUVudHJ5AgIOcHJvamVjdEFzc2V0SWQFCnd4eFRva2VuSWQJAMwIAgkBC0JpbmFyeUVudHJ5AgINeFdhdmVzQXNzZXRJZAUPeFdhdmVzQXNzZXRJZElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgpzdGFydEJsb2NrCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgIWdG90YWxSZXF1ZXN0ZWRXaXRoZHJhdwAACQDMCAIJAQxJbnRlZ2VyRW50cnkCAhFyZXF1aXJlZFdYWEFtb3VudAURcmVxdWlyZWRXWFhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQICGGVtZXJnZW5jeVZvdGluZ1RocmVzaG9sZAUYZW1lcmdlbmN5Vm90aW5nVGhyZXNob2xkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KaW52b2NhdGlvbgEOcmVxdWVzdERlcG9zaXQABBFfYXNzZXJ0T25lUGF5bWVudAkBEGFzc2VydE9uZVBheW1lbnQBBQppbnZvY2F0aW9uAwkAAAIFEV9hc3NlcnRPbmVQYXltZW50BRFfYXNzZXJ0T25lUGF5bWVudAQTX2Fzc2VydFBheW1lbnRBc3NldAkBEmFzc2VydFBheW1lbnRBc3NldAIFCmludm9jYXRpb24FBHVuaXQDCQAAAgUTX2Fzc2VydFBheW1lbnRBc3NldAUTX2Fzc2VydFBheW1lbnRBc3NldAQLd2F2ZXNBbW91bnQICQCRAwIIBQppbnZvY2F0aW9uCHBheW1lbnRzAAAGYW1vdW50BAljYWxsZXJLZXkJAKUIAQgFCmludm9jYXRpb24GY2FsbGVyBBNyZXF1ZXN0ZWREZXBvc2l0S2V5CQCsAgIJAKwCAgkArAICAhFyZXF1ZXN0ZWREZXBvc2l0OgUJY2FsbGVyS2V5AgF8CQCkAwEFDGN1cnJlbnRDeWNsZQQRcmVxdWVzdGVkRGVwb3NpdHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUTcmVxdWVzdGVkRGVwb3NpdEtleQAABBZ0b3RhbFJlcXVlc3RlZERlcG9zaXRzCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgIWY3ljbGVSZXF1ZXN0ZWREZXBvc2l0OgkApAMBBQxjdXJyZW50Q3ljbGUAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUTcmVxdWVzdGVkRGVwb3NpdEtleQkAZAIFEXJlcXVlc3RlZERlcG9zaXRzBQt3YXZlc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhZjeWNsZVJlcXVlc3RlZERlcG9zaXQ6CQCkAwEFDGN1cnJlbnRDeWNsZQkAZAIFFnRvdGFsUmVxdWVzdGVkRGVwb3NpdHMFC3dhdmVzQW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KaW52b2NhdGlvbgEOcHJvY2Vzc0RlcG9zaXQCCXJlY2lwaWVudAVjeWNsZQQMX2Fzc2VydEN5Y2xlCQEbYXNzZXJ0Q3ljbGVMb3dlclRoYXRDdXJyZW50AQUFY3ljbGUDCQAAAgUMX2Fzc2VydEN5Y2xlBQxfYXNzZXJ0Q3ljbGUEEHJlY2lwaWVudEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXJlY2lwaWVudAQTcmVxdWVzdGVkRGVwb3NpdEtleQkArAICCQCsAgIJAKwCAgIRcmVxdWVzdGVkRGVwb3NpdDoFCXJlY2lwaWVudAIBfAkApAMBBQVjeWNsZQQWY3ljbGVSZXF1ZXN0ZWREZXBvc2l0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgIWY3ljbGVSZXF1ZXN0ZWREZXBvc2l0OgkApAMBBQVjeWNsZQIfTm8gcmVxdWVzdGVkIGRlcG9zaXRzIGZvciBjeWNsZQQQcmVxdWVzdGVkRGVwb3NpdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFE3JlcXVlc3RlZERlcG9zaXRLZXkCFE5vIHJlcXVlc3RlZCBkZXBvc2l0BA1scFRva2VuSXNzdWVkCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFDXhXYXZlc0Fzc2V0SWQCD1Vrbm93biBhc3NldCBpZAhxdWFudGl0eQQJcG9vbFZhbHVlCQBlAggJAO8HAQUEdGhpcwdyZWd1bGFyBRZjeWNsZVJlcXVlc3RlZERlcG9zaXRzBAx4V2F2ZXNBbW91bnQDCQAAAgUNbHBUb2tlbklzc3VlZAAABRByZXF1ZXN0ZWREZXBvc2l0CQBrAwUQcmVxdWVzdGVkRGVwb3NpdAUNbHBUb2tlbklzc3VlZAUJcG9vbFZhbHVlBA1uZXdDeWNsZVZhbHVlCQBlAgUWY3ljbGVSZXF1ZXN0ZWREZXBvc2l0cwUQcmVxdWVzdGVkRGVwb3NpdAQTY3ljbGVXaXRoZHJhd0NoYW5nZQMJAGcCAAEFDW5ld0N5Y2xlVmFsdWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICAhZjeWNsZVJlcXVlc3RlZERlcG9zaXQ6CQCkAwEFBWN5Y2xlBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIWY3ljbGVSZXF1ZXN0ZWREZXBvc2l0OgkApAMBBQVjeWNsZQUNbmV3Q3ljbGVWYWx1ZQUDbmlsCQDOCAIFE2N5Y2xlV2l0aGRyYXdDaGFuZ2UJAMwIAgkBC0RlbGV0ZUVudHJ5AQUTcmVxdWVzdGVkRGVwb3NpdEtleQkAzAgCCQEHUmVpc3N1ZQMFDXhXYXZlc0Fzc2V0SWQFDHhXYXZlc0Ftb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQcmVjaXBpZW50QWRkcmVzcwUMeFdhdmVzQW1vdW50BQ14V2F2ZXNBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KaW52b2NhdGlvbgEPcmVxdWVzdFdpdGhkcmF3AAQRX2Fzc2VydE9uZVBheW1lbnQJARBhc3NlcnRPbmVQYXltZW50AQUKaW52b2NhdGlvbgMJAAACBRFfYXNzZXJ0T25lUGF5bWVudAURX2Fzc2VydE9uZVBheW1lbnQEE19hc3NlcnRQYXltZW50QXNzZXQJARJhc3NlcnRQYXltZW50QXNzZXQCBQppbnZvY2F0aW9uBQ14V2F2ZXNBc3NldElkAwkAAAIFE19hc3NlcnRQYXltZW50QXNzZXQFE19hc3NlcnRQYXltZW50QXNzZXQEDHhXYXZlc0Ftb3VudAgJAJEDAggFCmludm9jYXRpb24IcGF5bWVudHMAAAZhbW91bnQECWNhbGxlcktleQkApQgBCAUKaW52b2NhdGlvbgZjYWxsZXIEHXJlcXVlc3RlZFdpdGhkcmF3Rm9yQ2FsbGVyS2V5CQCsAgIJAKwCAgkArAICAhJyZXF1ZXN0ZWRXaXRoZHJhdzoFCWNhbGxlcktleQIBfAkApAMBBQxjdXJyZW50Q3ljbGUEGnJlcXVlc3RlZFdpdGhkcmF3Rm9yQ2FsbGVyCQELdmFsdWVPckVsc2UCCQCfCAEFHXJlcXVlc3RlZFdpdGhkcmF3Rm9yQ2FsbGVyS2V5AAAEFnRvdGFsUmVxdWVzdGVkV2l0aGRyYXcJAQt2YWx1ZU9yRWxzZQIJAJ8IAQIWdG90YWxSZXF1ZXN0ZWRXaXRoZHJhdwAABB1jdXJyZW50Q3ljbGVSZXF1ZXN0ZWRXaXRoZHJhdwUgY3VycmVudEN5Y2xlUmVxdWVzdGVkV2l0aGRyYXdhbHMJAMwIAgkBDEludGVnZXJFbnRyeQIFHXJlcXVlc3RlZFdpdGhkcmF3Rm9yQ2FsbGVyS2V5CQBkAgUacmVxdWVzdGVkV2l0aGRyYXdGb3JDYWxsZXIFDHhXYXZlc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhdjeWNsZVJlcXVlc3RlZFdpdGhkcmF3OgkApAMBBQxjdXJyZW50Q3ljbGUJAGQCBR1jdXJyZW50Q3ljbGVSZXF1ZXN0ZWRXaXRoZHJhdwUMeFdhdmVzQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhZ0b3RhbFJlcXVlc3RlZFdpdGhkcmF3CQBkAgUWdG90YWxSZXF1ZXN0ZWRXaXRoZHJhdwUMeFdhdmVzQW1vdW50BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KaW52b2NhdGlvbgEPcHJvY2Vzc1dpdGhkcmF3AglyZWNpcGllbnQFY3ljbGUEDF9hc3NlcnRDeWNsZQkBG2Fzc2VydEN5Y2xlTG93ZXJUaGF0Q3VycmVudAEFBWN5Y2xlAwkAAAIFDF9hc3NlcnRDeWNsZQUMX2Fzc2VydEN5Y2xlBBByZWNpcGllbnRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQlyZWNpcGllbnQEFHJlcXVlc3RlZFdpdGhkcmF3S2V5CQCsAgIJAKwCAgkArAICAhJyZXF1ZXN0ZWRXaXRoZHJhdzoFCXJlY2lwaWVudAIBfAkApAMBBQVjeWNsZQQTcmVxdWVzdGVkV2l0aGRyYXdhbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFFHJlcXVlc3RlZFdpdGhkcmF3S2V5AhVObyByZXF1ZXN0ZWQgd2l0aGRyYXcEFmN5Y2xlUmVxdWVzdGVkV2l0aGRyYXcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgICF2N5Y2xlUmVxdWVzdGVkV2l0aGRyYXc6CQCkAwEFBWN5Y2xlAiJObyByZXF1ZXN0ZWQgd2l0aGRyYXdhbHMgZm9yIGN5Y2xlBAlwb29sVmFsdWUICQDvBwEFBHRoaXMHcmVndWxhcgQNbHBUb2tlbklzc3VlZAgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQ14V2F2ZXNBc3NldElkAg9Va25vd24gYXNzZXQgaWQIcXVhbnRpdHkEFnRvdGFsUmVxdWVzdGVkV2l0aGRyYXcJAQt2YWx1ZU9yRWxzZQIJAJ8IAQIWdG90YWxSZXF1ZXN0ZWRXaXRoZHJhdwAABAt3YXZlc0Ftb3VudAkAawMFE3JlcXVlc3RlZFdpdGhkcmF3YWwFCXBvb2xWYWx1ZQUNbHBUb2tlbklzc3VlZAQNbmV3Q3ljbGVWYWx1ZQkAZQIFFmN5Y2xlUmVxdWVzdGVkV2l0aGRyYXcFE3JlcXVlc3RlZFdpdGhkcmF3YWwEE2N5Y2xlV2l0aGRyYXdDaGFuZ2UDCQAAAgUNbmV3Q3ljbGVWYWx1ZQAACQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgIXY3ljbGVSZXF1ZXN0ZWRXaXRoZHJhdzoJAKQDAQUFY3ljbGUFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhdjeWNsZVJlcXVlc3RlZFdpdGhkcmF3OgkApAMBBQVjeWNsZQUNbmV3Q3ljbGVWYWx1ZQUDbmlsCQDOCAIFE2N5Y2xlV2l0aGRyYXdDaGFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQICFnRvdGFsUmVxdWVzdGVkV2l0aGRyYXcJAGUCBRZ0b3RhbFJlcXVlc3RlZFdpdGhkcmF3BRNyZXF1ZXN0ZWRXaXRoZHJhd2FsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEHJlY2lwaWVudEFkZHJlc3MFC3dhdmVzQW1vdW50BQR1bml0CQDMCAIJAQRCdXJuAgUNeFdhdmVzQXNzZXRJZAUTcmVxdWVzdGVkV2l0aGRyYXdhbAkAzAgCCQELRGVsZXRlRW50cnkBBRRyZXF1ZXN0ZWRXaXRoZHJhd0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCmludm9jYXRpb24BCHJlZ2lzdGVyAgl2YWxpZGF0b3ILbWV0YWRhdGFVcmwEEV9hc3NlcnRPbmVQYXltZW50CQEQYXNzZXJ0T25lUGF5bWVudAEFCmludm9jYXRpb24DCQAAAgURX2Fzc2VydE9uZVBheW1lbnQFEV9hc3NlcnRPbmVQYXltZW50BBNfYXNzZXJ0UGF5bWVudEFzc2V0CQESYXNzZXJ0UGF5bWVudEFzc2V0AgUKaW52b2NhdGlvbgUKd3h4QXNzZXRJZAMJAAACBRNfYXNzZXJ0UGF5bWVudEFzc2V0BRNfYXNzZXJ0UGF5bWVudEFzc2V0BBNfYXNzZXJ0VmFsaWRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQl2YWxpZGF0b3IDCQAAAgUTX2Fzc2VydFZhbGlkQWRkcmVzcwUTX2Fzc2VydFZhbGlkQWRkcmVzcwQJd3h4QW1vdW50CAkAkQMCCAUKaW52b2NhdGlvbghwYXltZW50cwAABmFtb3VudAQMdmFsaWRhdG9yS2V5CQCsAgICCnZhbGlkYXRvcjoFCXZhbGlkYXRvcgQSdmFsaWRhdG9yU3RhdHVzS2V5CQCsAgICEHZhbGlkYXRvclN0YXR1czoFCXZhbGlkYXRvcgQXdmFsaWRhdG9yUmVnaXN0cmF0b3JLZXkJAKwCAgIVdmFsaWRhdG9yUmVnaXN0cmF0b3I6BQl2YWxpZGF0b3IDCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQx2YWxpZGF0b3JLZXkJAAIBAhJBbHJlYWR5IHJlZ2lzdGVyZWQDCQECIT0CBRFyZXF1aXJlZFdYWEFtb3VudAUJd3h4QW1vdW50CQACAQISSW52YWxpZCBXWFggYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFDHZhbGlkYXRvcktleQULbWV0YWRhdGFVcmwJAMwIAgkBDEJvb2xlYW5FbnRyeQIFEnZhbGlkYXRvclN0YXR1c0tleQYJAMwIAgkBC0JpbmFyeUVudHJ5AgUXdmFsaWRhdG9yUmVnaXN0cmF0b3JLZXkICAUKaW52b2NhdGlvbgZjYWxsZXIFYnl0ZXMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgppbnZvY2F0aW9uAQpkZXJlZ2lzdGVyAQl2YWxpZGF0b3IEEHZhbGlkYXRvckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXZhbGlkYXRvcgQXdmFsaWRhdG9yUmVnaXN0cmF0b3JLZXkJAKwCAgIVdmFsaWRhdG9yUmVnaXN0cmF0b3I6BQl2YWxpZGF0b3IEEnZhbGlkYXRvclN0YXR1c0tleQkArAICAhB2YWxpZGF0b3JTdGF0dXM6BQl2YWxpZGF0b3IEEXZhbGlkYXRvclZvdGVzS2V5CQCsAgICBnZvdGVzOgUJdmFsaWRhdG9yBBdfYXNzZXJ0VmFsaWRhdG9yQWRkcmVzcwkBFmFzc2VydFZhbGlkYXRvckFkZHJlc3MBBRB2YWxpZGF0b3JBZGRyZXNzAwkAAAIFF19hc3NlcnRWYWxpZGF0b3JBZGRyZXNzBRdfYXNzZXJ0VmFsaWRhdG9yQWRkcmVzcwQZX2Fzc2V0Q2FsbGVySXNSZWdpc3RyYXRvcgMJAQIhPQIJARFAZXh0ck5hdGl2ZSgxMDU3KQEFF3ZhbGlkYXRvclJlZ2lzdHJhdG9yS2V5CAgFCmludm9jYXRpb24GY2FsbGVyBWJ5dGVzCQACAQITV3JvbmcgZGVyZWdpc3RyYXRvcgUEdW5pdAMJAAACBRlfYXNzZXRDYWxsZXJJc1JlZ2lzdHJhdG9yBRlfYXNzZXRDYWxsZXJJc1JlZ2lzdHJhdG9yBBN2YWxpZGF0b3JMZWFzZUlkS2V5CQCsAgICCGxlYXNlSWQ6BQl2YWxpZGF0b3IEBmNhbmNlbAQHJG1hdGNoMAkAoQgBBRN2YWxpZGF0b3JMZWFzZUlkS2V5AwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDMCAIJAQtMZWFzZUNhbmNlbAEFAmlkBQNuaWwDCQABAgUHJG1hdGNoMAIEVW5pdAUDbmlsCQACAQILTWF0Y2ggZXJyb3IJAM4IAgkAzggCAwkBEUBleHRyTmF0aXZlKDEwNTYpAQUSdmFsaWRhdG9yU3RhdHVzS2V5BA52YWxpZGF0b3JWb3RlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBRF2YWxpZGF0b3JWb3Rlc0tleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFZvdGVza2V5CQBlAgUKdG90YWxWb3RlcwUOdmFsaWRhdG9yVm90ZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFCmludm9jYXRpb24GY2FsbGVyBRFyZXF1aXJlZFdYWEFtb3VudAUKd3h4QXNzZXRJZAUDbmlsBQNuaWwFBmNhbmNlbAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICBnZvdGVzOgUJdmFsaWRhdG9yCQDMCAIJAQtEZWxldGVFbnRyeQEFEnZhbGlkYXRvclN0YXR1c0tleQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICCnZhbGlkYXRvcjoFCXZhbGlkYXRvcgkAzAgCCQELRGVsZXRlRW50cnkBBRF2YWxpZGF0b3JWb3Rlc0tleQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICEHZhbGlkYXRvckxlYXNlczoFCXZhbGlkYXRvcgkAzAgCCQELRGVsZXRlRW50cnkBBRN2YWxpZGF0b3JMZWFzZUlkS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgITbGF0ZXN0TGVhc2luZ0N5Y2xlOgUJdmFsaWRhdG9yBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KaW52b2NhdGlvbgEEdm90ZQIJdmFsaWRhdG9yCGludGVydmFsBBB2YWxpZGF0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQl2YWxpZGF0b3IEF19hc3NlcnRWYWxpZGF0b3JBZGRyZXNzCQEWYXNzZXJ0VmFsaWRhdG9yQWRkcmVzcwEFEHZhbGlkYXRvckFkZHJlc3MDCQAAAgUXX2Fzc2VydFZhbGlkYXRvckFkZHJlc3MFF19hc3NlcnRWYWxpZGF0b3JBZGRyZXNzBBVfYXNzZXRWYWxpZGF0b3JTdGF0dXMJARthc3NlcnRBY3RpdmVWYWxpZGF0b3JTdGF0dXMBBRB2YWxpZGF0b3JBZGRyZXNzAwkAAAIFFV9hc3NldFZhbGlkYXRvclN0YXR1cwUVX2Fzc2V0VmFsaWRhdG9yU3RhdHVzBBFfYXNzZXJ0T25lUGF5bWVudAkBEGFzc2VydE9uZVBheW1lbnQBBQppbnZvY2F0aW9uAwkAAAIFEV9hc3NlcnRPbmVQYXltZW50BRFfYXNzZXJ0T25lUGF5bWVudAQTX2Fzc2VydFBheW1lbnRBc3NldAkBEmFzc2VydFBheW1lbnRBc3NldAIFCmludm9jYXRpb24FCnd4eEFzc2V0SWQDCQAAAgUTX2Fzc2VydFBheW1lbnRBc3NldAUTX2Fzc2VydFBheW1lbnRBc3NldAQLX2Fzc2VydFVpbnQJAQphc3NlcnRVaW50AQUIaW50ZXJ2YWwDCQAAAgULX2Fzc2VydFVpbnQFC19hc3NlcnRVaW50BAt1bmxvY2tCbG9jawkAZAIIBQlsYXN0QmxvY2sGaGVpZ2h0BQhpbnRlcnZhbAQJdXNlclZvdGVzCAkAkQMCCAUKaW52b2NhdGlvbghwYXltZW50cwAABmFtb3VudAQIdXNlckxvY2sICQCRAwIIBQppbnZvY2F0aW9uCHBheW1lbnRzAAAGYW1vdW50BAljYWxsZXJLZXkJAKUIAQgFCmludm9jYXRpb24GY2FsbGVyBA51bmxvY2tCbG9ja0tleQkArAICCQCsAgIJAKwCAgIMdW5sb2NrQmxvY2s6BQljYWxsZXJLZXkCAXwJAKQDAQULdW5sb2NrQmxvY2sEFnRvdGFsVmFsaWRhdG9yVm90ZXNLZXkJAKwCAgIGdm90ZXM6BQl2YWxpZGF0b3IEC3VzZXJWb3RlS2V5CQCsAgIJAKwCAgkArAICAgl1c2VyVm90ZToFCWNhbGxlcktleQIBfAkApAMBBQt1bmxvY2tCbG9jawQLdXNlckxvY2tLZXkJAKwCAgkArAICCQCsAgICCXVzZXJMb2NrOgUJY2FsbGVyS2V5AgF8CQCkAwEFC3VubG9ja0Jsb2NrBBN0b3RhbFZhbGlkYXRvclZvdGVzCQELdmFsdWVPckVsc2UCCQCfCAEFFnRvdGFsVmFsaWRhdG9yVm90ZXNLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgULdXNlclZvdGVLZXkFCXVzZXJWb3RlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgULdXNlckxvY2tLZXkFCHVzZXJMb2NrCQDMCAIJAQtCaW5hcnlFbnRyeQIFDnVubG9ja0Jsb2NrS2V5CAUQdmFsaWRhdG9yQWRkcmVzcwVieXRlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUWdG90YWxWYWxpZGF0b3JWb3Rlc0tleQkAZAIFE3RvdGFsVmFsaWRhdG9yVm90ZXMFCXVzZXJWb3RlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdG90YWxWb3Rlc2tleQkAZAIFCnRvdGFsVm90ZXMFCXVzZXJWb3RlcwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCmludm9jYXRpb24BBnJlZGVlbQELdW5sb2NrQmxvY2sEEl9hc3NlcnRVbmxvY2tCbG9jawMJAGYCBQt1bmxvY2tCbG9jawgFCWxhc3RCbG9jawZoZWlnaHQJAAIBAglUb28gZWFybHkFBHVuaXQDCQAAAgUSX2Fzc2VydFVubG9ja0Jsb2NrBRJfYXNzZXJ0VW5sb2NrQmxvY2sECWNhbGxlcktleQkApQgBCAUKaW52b2NhdGlvbgZjYWxsZXIEDnVubG9ja0Jsb2NrS2V5CQCsAgIJAKwCAgkArAICAgx1bmxvY2tCbG9jazoFCWNhbGxlcktleQIBfAkApAMBBQt1bmxvY2tCbG9jawQLdXNlclZvdGVLZXkJAKwCAgkArAICCQCsAgICCXVzZXJWb3RlOgUJY2FsbGVyS2V5AgF8CQCkAwEFC3VubG9ja0Jsb2NrBAt1c2VyTG9ja0tleQkArAICCQCsAgIJAKwCAgIJdXNlckxvY2s6BQljYWxsZXJLZXkCAXwJAKQDAQULdW5sb2NrQmxvY2sEEHZhbGlkYXRvckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoQgBBQ51bmxvY2tCbG9ja0tleQIMVW5rbm93biBsb2NrBBF2YWxpZGF0b3JWb3Rlc0tleQkArAICAgZ2b3RlczoJANgEAQUQdmFsaWRhdG9yQWRkcmVzcwQJdXNlclZvdGVzCQERQGV4dHJOYXRpdmUoMTA1NSkBBQt1c2VyVm90ZUtleQQTdG90YWxWYWxpZGF0b3JWb3RlcwkBEUBleHRyTmF0aXZlKDEwNTUpAQURdmFsaWRhdG9yVm90ZXNLZXkECHVzZXJMb2NrCQERQGV4dHJOYXRpdmUoMTA1NSkBBQt1c2VyTG9ja0tleQQSdmFsaWRhdG9yU3RhdHVzS2V5CQCsAgICEHZhbGlkYXRvclN0YXR1czoJANgEAQUQdmFsaWRhdG9yQWRkcmVzcwkAzggCAwkBEUBleHRyTmF0aXZlKDEwNTYpAQUSdmFsaWRhdG9yU3RhdHVzS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFZvdGVza2V5CQBlAgUKdG90YWxWb3RlcwUJdXNlclZvdGVzBQNuaWwFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUKaW52b2NhdGlvbgZjYWxsZXIFCHVzZXJMb2NrBQp3eHhBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF2YWxpZGF0b3JWb3Rlc0tleQkAZQIFE3RvdGFsVmFsaWRhdG9yVm90ZXMFCXVzZXJWb3RlcwkAzAgCCQELRGVsZXRlRW50cnkBBQt1c2VyVm90ZUtleQkAzAgCCQELRGVsZXRlRW50cnkBBQ51bmxvY2tCbG9ja0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCmludm9jYXRpb24BB2xlYXNpbmcBCXZhbGlkYXRvcgQQdmFsaWRhdG9yQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJdmFsaWRhdG9yBBdfYXNzZXJ0VmFsaWRhdG9yQWRkcmVzcwkBFmFzc2VydFZhbGlkYXRvckFkZHJlc3MBBRB2YWxpZGF0b3JBZGRyZXNzAwkAAAIFF19hc3NlcnRWYWxpZGF0b3JBZGRyZXNzBRdfYXNzZXJ0VmFsaWRhdG9yQWRkcmVzcwQVX2Fzc2V0VmFsaWRhdG9yU3RhdHVzCQEbYXNzZXJ0QWN0aXZlVmFsaWRhdG9yU3RhdHVzAQUQdmFsaWRhdG9yQWRkcmVzcwMJAAACBRVfYXNzZXRWYWxpZGF0b3JTdGF0dXMFFV9hc3NldFZhbGlkYXRvclN0YXR1cwQTdmFsaWRhdG9yTGVhc2VJZEtleQkArAICAghsZWFzZUlkOgUJdmFsaWRhdG9yBBVsYXRlc3RMZWFzaW5nQ3ljbGVLZXkJAKwCAgITbGF0ZXN0TGVhc2luZ0N5Y2xlOgUJdmFsaWRhdG9yBA52YWxpZGF0b3JWb3RlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQCsAgICBnZvdGVzOgUJdmFsaWRhdG9yAAAEEmN1cnJlbnRMZWFzZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQCsAgICEHZhbGlkYXRvckxlYXNlczoFCXZhbGlkYXRvcgAABBNfY2hlY2tMZWFzaW5nU3RhdHVzAwkAAAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVbGF0ZXN0TGVhc2luZ0N5Y2xlS2V5AP///////////wEFDGN1cnJlbnRDeWNsZQkAAgECDkFscmVhZHkgbGVhc2VkBQR1bml0AwkAAAIFE19jaGVja0xlYXNpbmdTdGF0dXMFE19jaGVja0xlYXNpbmdTdGF0dXMEDWxwVG9rZW5Jc3N1ZWQICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUNeFdhdmVzQXNzZXRJZAIPVWtub3duIGFzc2V0IGlkCHF1YW50aXR5BAlwb29sVmFsdWUJAGUCCAkA7wcBBQR0aGlzB3JlZ3VsYXIFHWN1cnJlbnRDeWNsZVJlcXVlc3RlZERlcG9zaXRzBBZ0b3RhbFJlcXVlc3RlZFdpdGhkcmF3CQELdmFsdWVPckVsc2UCCQCfCAECFnRvdGFsUmVxdWVzdGVkV2l0aGRyYXcAAAQbcHJldmlvdXNseVJlcXVlc3RlZFdpdGhkcmF3CQBlAgUWdG90YWxSZXF1ZXN0ZWRXaXRoZHJhdwUgY3VycmVudEN5Y2xlUmVxdWVzdGVkV2l0aGRyYXdhbHMEEXJlcXVlc3RlZFdpdGhkcmF3AwkAAAIFDWxwVG9rZW5Jc3N1ZWQAAAUbcHJldmlvdXNseVJlcXVlc3RlZFdpdGhkcmF3CQBrAwUbcHJldmlvdXNseVJlcXVlc3RlZFdpdGhkcmF3BQlwb29sVmFsdWUFDWxwVG9rZW5Jc3N1ZWQEEXRhcmdldExlYXNlQW1vdW50CQBrAwkAZQIFCXBvb2xWYWx1ZQURcmVxdWVzdGVkV2l0aGRyYXcFDnZhbGlkYXRvclZvdGVzBQp0b3RhbFZvdGVzBAZjYW5jZWwEByRtYXRjaDAJAKEIAQUTdmFsaWRhdG9yTGVhc2VJZEtleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkAzAgCCQELTGVhc2VDYW5jZWwBBQJpZAUDbmlsAwkAAQIFByRtYXRjaDACBFVuaXQFA25pbAkAAgECC01hdGNoIGVycm9yAwkBAiE9AgURdGFyZ2V0TGVhc2VBbW91bnQFEmN1cnJlbnRMZWFzZUFtb3VudAQFbGVhc2UJAMQIAgUQdmFsaWRhdG9yQWRkcmVzcwURdGFyZ2V0TGVhc2VBbW91bnQJAM4IAgUGY2FuY2VsAwkAAAIFEXRhcmdldExlYXNlQW1vdW50AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIQdmFsaWRhdG9yTGVhc2VzOgUJdmFsaWRhdG9yBRF0YXJnZXRMZWFzZUFtb3VudAkAzAgCCQELRGVsZXRlRW50cnkBBRN2YWxpZGF0b3JMZWFzZUlkS2V5BQNuaWwJAMwIAgUFbGVhc2UJAMwIAgkBC0JpbmFyeUVudHJ5AgUTdmFsaWRhdG9yTGVhc2VJZEtleQkAuQgBBQVsZWFzZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhB2YWxpZGF0b3JMZWFzZXM6BQl2YWxpZGF0b3IFEXRhcmdldExlYXNlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXRlc3RMZWFzaW5nQ3ljbGVLZXkFDGN1cnJlbnRDeWNsZQUDbmlsCQACAQIPTm90aGluZyBjaGFuZ2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCmludm9jYXRpb24BD2VtZXJnZW5jeVZvdGluZwEJdmFsaWRhdG9yBBB2YWxpZGF0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQl2YWxpZGF0b3IEF19hc3NlcnRWYWxpZGF0b3JBZGRyZXNzCQEWYXNzZXJ0VmFsaWRhdG9yQWRkcmVzcwEFEHZhbGlkYXRvckFkZHJlc3MDCQAAAgUXX2Fzc2VydFZhbGlkYXRvckFkZHJlc3MFF19hc3NlcnRWYWxpZGF0b3JBZGRyZXNzBBVfYXNzZXRWYWxpZGF0b3JTdGF0dXMJARthc3NlcnRBY3RpdmVWYWxpZGF0b3JTdGF0dXMBBRB2YWxpZGF0b3JBZGRyZXNzAwkAAAIFFV9hc3NldFZhbGlkYXRvclN0YXR1cwUVX2Fzc2V0VmFsaWRhdG9yU3RhdHVzBBFfYXNzZXJ0T25lUGF5bWVudAkBEGFzc2VydE9uZVBheW1lbnQBBQppbnZvY2F0aW9uAwkAAAIFEV9hc3NlcnRPbmVQYXltZW50BRFfYXNzZXJ0T25lUGF5bWVudAQTX2Fzc2VydFBheW1lbnRBc3NldAkBEmFzc2VydFBheW1lbnRBc3NldAIFCmludm9jYXRpb24FDXhXYXZlc0Fzc2V0SWQDCQAAAgUTX2Fzc2VydFBheW1lbnRBc3NldAUTX2Fzc2VydFBheW1lbnRBc3NldAQKdm90ZUFtb3VudAgJAJEDAggFCmludm9jYXRpb24IcGF5bWVudHMAAAZhbW91bnQECWNhbGxlcktleQkApQgBCAUKaW52b2NhdGlvbgZjYWxsZXIEEWVtZXJnZW5jeVZvdGVzS2V5CQCsAgICD2VtZXJnZW5jeVZvdGVzOgUJdmFsaWRhdG9yBBVlbWVyZ2VuY3lVc2VyVm90ZXNLZXkJAKwCAgkArAICAhNlbWVyZ2VuY3lVc2VyVm90ZXM6BQljYWxsZXJLZXkFCXZhbGlkYXRvcgQOZW1lcmdlbmN5Vm90ZXMJAGQCBQp2b3RlQW1vdW50CQELdmFsdWVPckVsc2UCCQCfCAEFEWVtZXJnZW5jeVZvdGVzS2V5AAAECHF1YW50aXR5CAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFDXhXYXZlc0Fzc2V0SWQCD1Vrbm93biBhc3NldCBpZAhxdWFudGl0eQQMd3h4QXNzZXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUKd3h4QXNzZXRJZAIPVWtub3duIGFzc2V0IGlkBA5pc1ZhbGlkYXRvckJhZAkAZgIJAGkCCQBoAgUOZW1lcmdlbmN5Vm90ZXMAZAUIcXVhbnRpdHkFGGVtZXJnZW5jeVZvdGluZ1RocmVzaG9sZAQKcHVuaXNobWVudAMFDmlzVmFsaWRhdG9yQmFkBBN2YWxpZGF0b3JMZWFzZUlkS2V5CQCsAgICCGxlYXNlSWQ6BQl2YWxpZGF0b3IEBmNhbmNlbAQHJG1hdGNoMAkAoQgBBRN2YWxpZGF0b3JMZWFzZUlkS2V5AwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDMCAIJAQtMZWFzZUNhbmNlbAEFAmlkBQNuaWwDCQABAgUHJG1hdGNoMAIEVW5pdAUDbmlsCQACAQILTWF0Y2ggZXJyb3IEEXZhbGlkYXRvclZvdGVzS2V5CQCsAgICBnZvdGVzOgUJdmFsaWRhdG9yBBN0b3RhbFZhbGlkYXRvclZvdGVzCQELdmFsdWVPckVsc2UCCQCfCAEFEXZhbGlkYXRvclZvdGVzS2V5AAAJAM4IAgUGY2FuY2VsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQx3eHhBc3NldEluZm8GaXNzdWVyBRFyZXF1aXJlZFdYWEFtb3VudAUKd3h4QXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdG90YWxWb3Rlc2tleQkAZQIFCnRvdGFsVm90ZXMFE3RvdGFsVmFsaWRhdG9yVm90ZXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgIQdmFsaWRhdG9yU3RhdHVzOgUJdmFsaWRhdG9yBwkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICEHZhbGlkYXRvckxlYXNlczoFCXZhbGlkYXRvcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgICCGxlYXNlSWQ6BQl2YWxpZGF0b3IJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICAhNsYXRlc3RMZWFzaW5nQ3ljbGU6BQl2YWxpZGF0b3IFA25pbAUDbmlsCQDOCAIFCnB1bmlzaG1lbnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEWVtZXJnZW5jeVZvdGVzS2V5CQBkAgUKdm90ZUFtb3VudAUOZW1lcmdlbmN5Vm90ZXMJAMwIAgkBDEludGVnZXJFbnRyeQIFFWVtZXJnZW5jeVVzZXJWb3Rlc0tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVZW1lcmdlbmN5VXNlclZvdGVzS2V5AAAFDmVtZXJnZW5jeVZvdGVzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KaW52b2NhdGlvbgETcmVkZWVtRW1lcmdlbmN5Vm90ZQEJdmFsaWRhdG9yBBB2YWxpZGF0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQl2YWxpZGF0b3IECWNhbGxlcktleQkApQgBCAUKaW52b2NhdGlvbgZjYWxsZXIEFWVtZXJnZW5jeVVzZXJWb3Rlc0tleQkArAICCQCsAgICE2VtZXJnZW5jeVVzZXJWb3RlczoFCWNhbGxlcktleQUJdmFsaWRhdG9yBBJlbWVyZ2VuY3lVc2VyVm90ZXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRVlbWVyZ2VuY3lVc2VyVm90ZXNLZXkCG05vIGVtZXJnZW5jeSB2b3RlcyBmb3IgdXNlcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUKaW52b2NhdGlvbgZjYWxsZXIFEmVtZXJnZW5jeVVzZXJWb3RlcwUNeFdhdmVzQXNzZXRJZAUDbmlsAFbPJjE=", "height": 3489018, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7DCodDwbTH1DBru6Y9ckzdsKVe5ouFtDvafc9w5ux2VT Next: none Diff:
OldNewDifferences
99
1010 let totalVoteskey = "totalVotes"
1111
12-func getProjectAssetId () = getBinaryValue("projectAssetId")
12+let wxxAssetId = getBinaryValue("projectAssetId")
1313
14+let xWavesAssetId = getBinaryValue("xWavesAssetId")
1415
15-func getXWavesAssetId () = getBinaryValue("xWavesAssetId")
16+let currentCycle = ((lastBlock.height - getIntegerValue("startBlock")) / cycleDurationInBlocks)
1617
18+let currentCycleRequestedWithdrawals = valueOrElse(getInteger(("cycleRequestedWithdraw:" + toString(currentCycle))), 0)
1719
18-func getCurrentCycle () = {
19- let startBlock = getIntegerValue("startBlock")
20- ((lastBlock.height - startBlock) / cycleDurationInBlocks)
21- }
20+let currentCycleRequestedDeposits = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString(currentCycle))), 0)
2221
22+let totalVotes = getIntegerValue(totalVoteskey)
2323
24-func assertValidatorAddress (validatorAddress) = if (isDefined(getString(this, ("validator:" + toBase58String(validatorAddress)))))
24+func assertValidatorAddress (validatorAddress) = if (isDefined(getString(this, ("validator:" + toString(validatorAddress)))))
2525 then unit
2626 else throw("Unknown validator")
2727
4242
4343
4444 func assertActiveValidatorStatus (validatorAddress) = {
45- let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
45+ let validatorStatusKey = ("validatorStatus:" + toString(validatorAddress))
4646 if (!(getBooleanValue(validatorStatusKey)))
4747 then throw("Unactive validator")
4848 else unit
4949 }
5050
5151
52-func assertCycleLowerThatCurrent (cycle) = {
53- let currentCycle = getCurrentCycle()
54- if ((currentCycle > cycle))
55- then unit
56- else throw("Invalid cycle")
57- }
52+func assertCycleLowerThatCurrent (cycle) = if ((currentCycle > cycle))
53+ then unit
54+ else throw("Invalid cycle")
5855
5956
60-func assertCallerIsContract (invocation) = if ((this.bytes != invocation.caller.bytes))
57+func assertCallerIsContract (invocation) = if ((this != invocation.caller))
6158 then throw("Unauthorized")
6259 else unit
6360
6461
65-func getPrevCycleRequestedWithdrawals () = valueOrElse(getInteger(("cycleRequestedWithdraw:" + toString((getCurrentCycle() - 1)))), 0)
66-
67-
68-func getPrevCycleRequestedDeposits () = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString((getCurrentCycle() - 1)))), 0)
69-
70-
71-func getCurrentCycleRequestedWithdrawals () = valueOrElse(getInteger(("cycleRequestedWithdraw:" + toString(getCurrentCycle()))), 0)
72-
73-
74-func getCurrentCycleRequestedDeposits () = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString(getCurrentCycle()))), 0)
75-
76-
7762 @Callable(invocation)
78-func init (projectTokenId) = {
63+func init (wxxTokenId) = {
7964 let callerCheck = assertCallerIsContract(invocation)
8065 if ((callerCheck == callerCheck))
8166 then if (isDefined(getBinary("projectAssetId")))
8368 else {
8469 let issue = Issue("xWaves", "xWaves", 0, 8, true)
8570 let xWavesAssetIdId = calculateAssetId(issue)
86-[issue, IntegerEntry(totalVoteskey, 0), BinaryEntry("projectAssetId", projectTokenId), BinaryEntry("xWavesAssetId", xWavesAssetIdId), IntegerEntry("startBlock", lastBlock.height), IntegerEntry("totalRequestedWithdraw", 0), IntegerEntry("requiredWXXAmount", requiredWXXAmount), IntegerEntry("emergencyVotingThreshold", emergencyVotingThreshold)]
71+[issue, IntegerEntry(totalVoteskey, 0), BinaryEntry("projectAssetId", wxxTokenId), BinaryEntry("xWavesAssetId", xWavesAssetIdId), IntegerEntry("startBlock", lastBlock.height), IntegerEntry("totalRequestedWithdraw", 0), IntegerEntry("requiredWXXAmount", requiredWXXAmount), IntegerEntry("emergencyVotingThreshold", emergencyVotingThreshold)]
8772 }
8873 else throw("Strict value is not equal to itself.")
8974 }
9984 if ((_assertPaymentAsset == _assertPaymentAsset))
10085 then {
10186 let wavesAmount = invocation.payments[0].amount
102- let callerKey = toBase58String(invocation.caller.bytes)
103- let currentCycle = getCurrentCycle()
87+ let callerKey = toString(invocation.caller)
10488 let requestedDepositKey = ((("requestedDeposit:" + callerKey) + "|") + toString(currentCycle))
10589 let requestedDeposits = valueOrElse(getInteger(requestedDepositKey), 0)
10690 let totalRequestedDeposits = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString(currentCycle))), 0)
118102 let _assertCycle = assertCycleLowerThatCurrent(cycle)
119103 if ((_assertCycle == _assertCycle))
120104 then {
121- let xWavesAssetId = getXWavesAssetId()
122- let requestedDepositKey = ((("requestedDeposit:" + toBase58String(recipient)) + "|") + toString(cycle))
105+ let recipientAddress = addressFromStringValue(recipient)
106+ let requestedDepositKey = ((("requestedDeposit:" + recipient) + "|") + toString(cycle))
123107 let cycleRequestedDeposits = valueOrErrorMessage(getInteger(("cycleRequestedDeposit:" + toString(cycle))), "No requested deposits for cycle")
124108 let requestedDeposit = valueOrErrorMessage(getInteger(requestedDepositKey), "No requested deposit")
125109 let lpTokenIssued = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
126110 let poolValue = (wavesBalance(this).regular - cycleRequestedDeposits)
127111 let xWavesAmount = if ((lpTokenIssued == 0))
128112 then requestedDeposit
129- else toInt(((toBigInt(requestedDeposit) * toBigInt(lpTokenIssued)) / toBigInt(poolValue)))
113+ else fraction(requestedDeposit, lpTokenIssued, poolValue)
130114 let newCycleValue = (cycleRequestedDeposits - requestedDeposit)
131- let cycleWithdrawChange = if ((newCycleValue == 0))
115+ let cycleWithdrawChange = if ((1 >= newCycleValue))
132116 then [DeleteEntry(("cycleRequestedDeposit:" + toString(cycle)))]
133117 else [IntegerEntry(("cycleRequestedDeposit:" + toString(cycle)), newCycleValue)]
134- (cycleWithdrawChange ++ [DeleteEntry(requestedDepositKey), Reissue(xWavesAssetId, xWavesAmount, true), ScriptTransfer(Address(recipient), xWavesAmount, xWavesAssetId)])
118+ (cycleWithdrawChange ++ [DeleteEntry(requestedDepositKey), Reissue(xWavesAssetId, xWavesAmount, true), ScriptTransfer(recipientAddress, xWavesAmount, xWavesAssetId)])
135119 }
136120 else throw("Strict value is not equal to itself.")
137121 }
143127 let _assertOnePayment = assertOnePayment(invocation)
144128 if ((_assertOnePayment == _assertOnePayment))
145129 then {
146- let _assertPaymentAsset = assertPaymentAsset(invocation, getXWavesAssetId())
130+ let _assertPaymentAsset = assertPaymentAsset(invocation, xWavesAssetId)
147131 if ((_assertPaymentAsset == _assertPaymentAsset))
148132 then {
149133 let xWavesAmount = invocation.payments[0].amount
150- let currentCycle = getCurrentCycle()
151- let callerKey = toBase58String(invocation.caller.bytes)
134+ let callerKey = toString(invocation.caller)
152135 let requestedWithdrawForCallerKey = ((("requestedWithdraw:" + callerKey) + "|") + toString(currentCycle))
153136 let requestedWithdrawForCaller = valueOrElse(getInteger(requestedWithdrawForCallerKey), 0)
154137 let totalRequestedWithdraw = valueOrElse(getInteger("totalRequestedWithdraw"), 0)
155- let currentCycleRequestedWithdraw = getCurrentCycleRequestedWithdrawals()
138+ let currentCycleRequestedWithdraw = currentCycleRequestedWithdrawals
156139 [IntegerEntry(requestedWithdrawForCallerKey, (requestedWithdrawForCaller + xWavesAmount)), IntegerEntry(("cycleRequestedWithdraw:" + toString(currentCycle)), (currentCycleRequestedWithdraw + xWavesAmount)), IntegerEntry("totalRequestedWithdraw", (totalRequestedWithdraw + xWavesAmount))]
157140 }
158141 else throw("Strict value is not equal to itself.")
167150 let _assertCycle = assertCycleLowerThatCurrent(cycle)
168151 if ((_assertCycle == _assertCycle))
169152 then {
170- let recipientKey = toBase58String(recipient)
171- let xWavesAssetId = getXWavesAssetId()
172- let requestedWithdrawKey = ((("requestedWithdraw:" + recipientKey) + "|") + toString(cycle))
153+ let recipientAddress = addressFromStringValue(recipient)
154+ let requestedWithdrawKey = ((("requestedWithdraw:" + recipient) + "|") + toString(cycle))
173155 let requestedWithdrawal = valueOrErrorMessage(getInteger(requestedWithdrawKey), "No requested withdraw")
174156 let cycleRequestedWithdraw = valueOrErrorMessage(getInteger(("cycleRequestedWithdraw:" + toString(cycle))), "No requested withdrawals for cycle")
175157 let poolValue = wavesBalance(this).regular
176158 let lpTokenIssued = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
177159 let totalRequestedWithdraw = valueOrElse(getInteger("totalRequestedWithdraw"), 0)
178- let wavesAmount = toInt(((toBigInt(requestedWithdrawal) * toBigInt(poolValue)) / toBigInt(lpTokenIssued)))
160+ let wavesAmount = fraction(requestedWithdrawal, poolValue, lpTokenIssued)
179161 let newCycleValue = (cycleRequestedWithdraw - requestedWithdrawal)
180162 let cycleWithdrawChange = if ((newCycleValue == 0))
181163 then [DeleteEntry(("cycleRequestedWithdraw:" + toString(cycle)))]
182164 else [IntegerEntry(("cycleRequestedWithdraw:" + toString(cycle)), newCycleValue)]
183- (cycleWithdrawChange ++ [IntegerEntry("totalRequestedWithdraw", (totalRequestedWithdraw - requestedWithdrawal)), ScriptTransfer(Address(recipient), wavesAmount, unit), Burn(getXWavesAssetId(), requestedWithdrawal), DeleteEntry(requestedWithdrawKey)])
165+ (cycleWithdrawChange ++ [IntegerEntry("totalRequestedWithdraw", (totalRequestedWithdraw - requestedWithdrawal)), ScriptTransfer(recipientAddress, wavesAmount, unit), Burn(xWavesAssetId, requestedWithdrawal), DeleteEntry(requestedWithdrawKey)])
184166 }
185167 else throw("Strict value is not equal to itself.")
186168 }
188170
189171
190172 @Callable(invocation)
191-func register (validatorAddress,metadataUrl) = {
173+func register (validator,metadataUrl) = {
192174 let _assertOnePayment = assertOnePayment(invocation)
193175 if ((_assertOnePayment == _assertOnePayment))
194176 then {
195- let _assertPaymentAsset = assertPaymentAsset(invocation, getProjectAssetId())
177+ let _assertPaymentAsset = assertPaymentAsset(invocation, wxxAssetId)
196178 if ((_assertPaymentAsset == _assertPaymentAsset))
197179 then {
198- let wxxAmount = invocation.payments[0].amount
199- let validatorKey = ("validator:" + toBase58String(validatorAddress))
200- let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
201- let validatorRegistratorKey = ("validatorRegistrator:" + toBase58String(validatorAddress))
202- if (isDefined(getString(this, validatorKey)))
203- then throw("Already registered")
204- else if ((requiredWXXAmount != wxxAmount))
205- then throw("Invalid WXX amount")
206- else [StringEntry(validatorKey, metadataUrl), BooleanEntry(validatorStatusKey, true), BinaryEntry(validatorRegistratorKey, invocation.caller.bytes)]
180+ let _assertValidAddress = addressFromStringValue(validator)
181+ if ((_assertValidAddress == _assertValidAddress))
182+ then {
183+ let wxxAmount = invocation.payments[0].amount
184+ let validatorKey = ("validator:" + validator)
185+ let validatorStatusKey = ("validatorStatus:" + validator)
186+ let validatorRegistratorKey = ("validatorRegistrator:" + validator)
187+ if (isDefined(getString(this, validatorKey)))
188+ then throw("Already registered")
189+ else if ((requiredWXXAmount != wxxAmount))
190+ then throw("Invalid WXX amount")
191+ else [StringEntry(validatorKey, metadataUrl), BooleanEntry(validatorStatusKey, true), BinaryEntry(validatorRegistratorKey, invocation.caller.bytes)]
192+ }
193+ else throw("Strict value is not equal to itself.")
207194 }
208195 else throw("Strict value is not equal to itself.")
209196 }
213200
214201
215202 @Callable(invocation)
216-func deregister (validatorAddress) = {
217- let validatorKey = toBase58String(validatorAddress)
218- let validatorRegistratorKey = ("validatorRegistrator:" + toBase58String(validatorAddress))
219- let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
220- let validatorVotesKey = ("votes:" + validatorKey)
203+func deregister (validator) = {
204+ let validatorAddress = addressFromStringValue(validator)
205+ let validatorRegistratorKey = ("validatorRegistrator:" + validator)
206+ let validatorStatusKey = ("validatorStatus:" + validator)
207+ let validatorVotesKey = ("votes:" + validator)
221208 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
222209 if ((_assertValidatorAddress == _assertValidatorAddress))
223210 then {
226213 else unit
227214 if ((_assetCallerIsRegistrator == _assetCallerIsRegistrator))
228215 then {
229- let validatorLeaseIdKey = ("leaseId:" + validatorKey)
216+ let validatorLeaseIdKey = ("leaseId:" + validator)
230217 let cancel = match getBinary(validatorLeaseIdKey) {
231218 case id: ByteVector =>
232219 [LeaseCancel(id)]
238225 (((if (getBooleanValue(validatorStatusKey))
239226 then {
240227 let validatorVotes = valueOrElse(getInteger(validatorVotesKey), 0)
241- let totalVotes = getIntegerValue(totalVoteskey)
242-[IntegerEntry(totalVoteskey, (totalVotes - validatorVotes)), ScriptTransfer(invocation.caller, requiredWXXAmount, getProjectAssetId())]
228+[IntegerEntry(totalVoteskey, (totalVotes - validatorVotes)), ScriptTransfer(invocation.caller, requiredWXXAmount, wxxAssetId)]
243229 }
244- else nil) ++ cancel) ++ [DeleteEntry(("votes:" + validatorKey)), DeleteEntry(validatorStatusKey), DeleteEntry(("validator:" + validatorKey)), DeleteEntry(validatorVotesKey), DeleteEntry(("validatorLeases:" + validatorKey)), DeleteEntry(validatorLeaseIdKey), DeleteEntry(("latestLeasingCycle:" + validatorKey))])
230+ else nil) ++ cancel) ++ [DeleteEntry(("votes:" + validator)), DeleteEntry(validatorStatusKey), DeleteEntry(("validator:" + validator)), DeleteEntry(validatorVotesKey), DeleteEntry(("validatorLeases:" + validator)), DeleteEntry(validatorLeaseIdKey), DeleteEntry(("latestLeasingCycle:" + validator))])
245231 }
246232 else throw("Strict value is not equal to itself.")
247233 }
251237
252238
253239 @Callable(invocation)
254-func vote (validatorAddress,interval) = {
240+func vote (validator,interval) = {
241+ let validatorAddress = addressFromStringValue(validator)
255242 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
256243 if ((_assertValidatorAddress == _assertValidatorAddress))
257244 then {
261248 let _assertOnePayment = assertOnePayment(invocation)
262249 if ((_assertOnePayment == _assertOnePayment))
263250 then {
264- let _assertPaymentAsset = assertPaymentAsset(invocation, getProjectAssetId())
251+ let _assertPaymentAsset = assertPaymentAsset(invocation, wxxAssetId)
265252 if ((_assertPaymentAsset == _assertPaymentAsset))
266253 then {
267254 let _assertUint = assertUint(interval)
270257 let unlockBlock = (lastBlock.height + interval)
271258 let userVotes = invocation.payments[0].amount
272259 let userLock = invocation.payments[0].amount
273- let validatorKey = toBase58String(validatorAddress)
274- let callerKey = toBase58String(invocation.caller.bytes)
260+ let callerKey = toString(invocation.caller)
275261 let unlockBlockKey = ((("unlockBlock:" + callerKey) + "|") + toString(unlockBlock))
276- let totalValidatorVotesKey = ("votes:" + validatorKey)
262+ let totalValidatorVotesKey = ("votes:" + validator)
277263 let userVoteKey = ((("userVote:" + callerKey) + "|") + toString(unlockBlock))
278264 let userLockKey = ((("userLock:" + callerKey) + "|") + toString(unlockBlock))
279265 let totalValidatorVotes = valueOrElse(getInteger(totalValidatorVotesKey), 0)
280- let totalVotes = valueOrElse(getInteger(totalVoteskey), 0)
281-[IntegerEntry(userVoteKey, userVotes), IntegerEntry(userLockKey, userLock), BinaryEntry(unlockBlockKey, validatorAddress), IntegerEntry(totalValidatorVotesKey, (totalValidatorVotes + userVotes)), IntegerEntry(totalVoteskey, (totalVotes + userVotes))]
266+[IntegerEntry(userVoteKey, userVotes), IntegerEntry(userLockKey, userLock), BinaryEntry(unlockBlockKey, validatorAddress.bytes), IntegerEntry(totalValidatorVotesKey, (totalValidatorVotes + userVotes)), IntegerEntry(totalVoteskey, (totalVotes + userVotes))]
282267 }
283268 else throw("Strict value is not equal to itself.")
284269 }
300285 else unit
301286 if ((_assertUnlockBlock == _assertUnlockBlock))
302287 then {
303- let callerKey = toBase58String(invocation.caller.bytes)
304- let projectAssetId = getProjectAssetId()
288+ let callerKey = toString(invocation.caller)
305289 let unlockBlockKey = ((("unlockBlock:" + callerKey) + "|") + toString(unlockBlock))
306290 let userVoteKey = ((("userVote:" + callerKey) + "|") + toString(unlockBlock))
307291 let userLockKey = ((("userLock:" + callerKey) + "|") + toString(unlockBlock))
309293 let validatorVotesKey = ("votes:" + toBase58String(validatorAddress))
310294 let userVotes = getIntegerValue(userVoteKey)
311295 let totalValidatorVotes = getIntegerValue(validatorVotesKey)
312- let totalVotes = getIntegerValue(totalVoteskey)
313296 let userLock = getIntegerValue(userLockKey)
314297 let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
315298 ((if (getBooleanValue(validatorStatusKey))
316299 then [IntegerEntry(totalVoteskey, (totalVotes - userVotes))]
317- else nil) ++ [ScriptTransfer(invocation.caller, userLock, projectAssetId), IntegerEntry(validatorVotesKey, (totalValidatorVotes - userVotes)), DeleteEntry(userVoteKey), DeleteEntry(unlockBlockKey)])
300+ else nil) ++ [ScriptTransfer(invocation.caller, userLock, wxxAssetId), IntegerEntry(validatorVotesKey, (totalValidatorVotes - userVotes)), DeleteEntry(userVoteKey), DeleteEntry(unlockBlockKey)])
318301 }
319302 else throw("Strict value is not equal to itself.")
320303 }
322305
323306
324307 @Callable(invocation)
325-func leasing (validatorAddress) = {
308+func leasing (validator) = {
309+ let validatorAddress = addressFromStringValue(validator)
326310 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
327311 if ((_assertValidatorAddress == _assertValidatorAddress))
328312 then {
329313 let _assetValidatorStatus = assertActiveValidatorStatus(validatorAddress)
330314 if ((_assetValidatorStatus == _assetValidatorStatus))
331315 then {
332- let validatorKey = toBase58String(validatorAddress)
333- let validatorLeaseIdKey = ("leaseId:" + validatorKey)
334- let latestLeasingCycleKey = ("latestLeasingCycle:" + validatorKey)
335- let totalVotes = valueOrElse(getInteger(totalVoteskey), 0)
336- let validatorVotes = valueOrElse(getInteger(("votes:" + validatorKey)), 0)
337- let currentLeaseAmount = valueOrElse(getInteger(("validatorLeases:" + validatorKey)), 0)
338- let currentCycle = getCurrentCycle()
316+ let validatorLeaseIdKey = ("leaseId:" + validator)
317+ let latestLeasingCycleKey = ("latestLeasingCycle:" + validator)
318+ let validatorVotes = valueOrElse(getInteger(("votes:" + validator)), 0)
319+ let currentLeaseAmount = valueOrElse(getInteger(("validatorLeases:" + validator)), 0)
339320 let _checkLeasingStatus = if ((valueOrElse(getInteger(latestLeasingCycleKey), -1) == currentCycle))
340321 then throw("Already leased")
341322 else unit
342323 if ((_checkLeasingStatus == _checkLeasingStatus))
343324 then {
344- let lpTokenIssued = valueOrErrorMessage(assetInfo(getXWavesAssetId()), "Uknown asset id").quantity
345- let poolValue = (wavesBalance(this).regular - getCurrentCycleRequestedDeposits())
325+ let lpTokenIssued = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
326+ let poolValue = (wavesBalance(this).regular - currentCycleRequestedDeposits)
346327 let totalRequestedWithdraw = valueOrElse(getInteger("totalRequestedWithdraw"), 0)
347- let previouslyRequestedWithdraw = (totalRequestedWithdraw - getCurrentCycleRequestedWithdrawals())
328+ let previouslyRequestedWithdraw = (totalRequestedWithdraw - currentCycleRequestedWithdrawals)
348329 let requestedWithdraw = if ((lpTokenIssued == 0))
349330 then previouslyRequestedWithdraw
350- else toInt(((toBigInt(previouslyRequestedWithdraw) * toBigInt(poolValue)) / toBigInt(lpTokenIssued)))
351- let wavesAmount = (poolValue - requestedWithdraw)
352- let targetLeaseAmountBigInt = ((toBigInt(wavesAmount) * toBigInt(validatorVotes)) / toBigInt(totalVotes))
353- let targetLeaseAmount = toInt(targetLeaseAmountBigInt)
331+ else fraction(previouslyRequestedWithdraw, poolValue, lpTokenIssued)
332+ let targetLeaseAmount = fraction((poolValue - requestedWithdraw), validatorVotes, totalVotes)
354333 let cancel = match getBinary(validatorLeaseIdKey) {
355334 case id: ByteVector =>
356335 [LeaseCancel(id)]
361340 }
362341 if ((targetLeaseAmount != currentLeaseAmount))
363342 then {
364- let lease = Lease(Address(validatorAddress), targetLeaseAmount)
343+ let lease = Lease(validatorAddress, targetLeaseAmount)
365344 (cancel ++ (if ((targetLeaseAmount == 0))
366- then [IntegerEntry(("validatorLeases:" + validatorKey), targetLeaseAmount), DeleteEntry(validatorLeaseIdKey)]
367- else [lease, BinaryEntry(validatorLeaseIdKey, calculateLeaseId(lease)), IntegerEntry(("validatorLeases:" + validatorKey), targetLeaseAmount), IntegerEntry(latestLeasingCycleKey, currentCycle)]))
345+ then [IntegerEntry(("validatorLeases:" + validator), targetLeaseAmount), DeleteEntry(validatorLeaseIdKey)]
346+ else [lease, BinaryEntry(validatorLeaseIdKey, calculateLeaseId(lease)), IntegerEntry(("validatorLeases:" + validator), targetLeaseAmount), IntegerEntry(latestLeasingCycleKey, currentCycle)]))
368347 }
369348 else throw("Nothing changes")
370349 }
378357
379358
380359 @Callable(invocation)
381-func emergencyVoting (validatorAddress) = {
360+func emergencyVoting (validator) = {
361+ let validatorAddress = addressFromStringValue(validator)
382362 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
383363 if ((_assertValidatorAddress == _assertValidatorAddress))
384364 then {
388368 let _assertOnePayment = assertOnePayment(invocation)
389369 if ((_assertOnePayment == _assertOnePayment))
390370 then {
391- let _assertPaymentAsset = assertPaymentAsset(invocation, getXWavesAssetId())
371+ let _assertPaymentAsset = assertPaymentAsset(invocation, xWavesAssetId)
392372 if ((_assertPaymentAsset == _assertPaymentAsset))
393373 then {
394374 let voteAmount = invocation.payments[0].amount
395- let callerKey = toBase58String(invocation.caller.bytes)
396- let validatorKey = toBase58String(validatorAddress)
397- let emergencyVotesKey = ("emergencyVotes:" + validatorKey)
398- let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validatorKey)
375+ let callerKey = toString(invocation.caller)
376+ let emergencyVotesKey = ("emergencyVotes:" + validator)
377+ let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validator)
399378 let emergencyVotes = (voteAmount + valueOrElse(getInteger(emergencyVotesKey), 0))
400- let projectAssetId = getProjectAssetId()
401- let quantity = valueOrErrorMessage(assetInfo(getXWavesAssetId()), "Uknown asset id").quantity
402- let wxxAssetInfo = valueOrErrorMessage(assetInfo(projectAssetId), "Uknown asset id")
379+ let quantity = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
380+ let wxxAssetInfo = valueOrErrorMessage(assetInfo(wxxAssetId), "Uknown asset id")
403381 let isValidatorBad = (((emergencyVotes * 100) / quantity) > emergencyVotingThreshold)
404382 let punishment = if (isValidatorBad)
405383 then {
406- let validatorLeaseIdKey = ("leaseId:" + validatorKey)
384+ let validatorLeaseIdKey = ("leaseId:" + validator)
407385 let cancel = match getBinary(validatorLeaseIdKey) {
408386 case id: ByteVector =>
409387 [LeaseCancel(id)]
412390 case _ =>
413391 throw("Match error")
414392 }
415- let validatorVotesKey = ("votes:" + validatorKey)
393+ let validatorVotesKey = ("votes:" + validator)
416394 let totalValidatorVotes = valueOrElse(getInteger(validatorVotesKey), 0)
417- let totalVotes = getIntegerValue(totalVoteskey)
418- (cancel ++ [ScriptTransfer(wxxAssetInfo.issuer, requiredWXXAmount, projectAssetId), IntegerEntry(totalVoteskey, (totalVotes - totalValidatorVotes)), BooleanEntry(("validatorStatus:" + validatorKey), false), DeleteEntry(("validatorLeases:" + validatorKey)), DeleteEntry(("leaseId:" + validatorKey)), DeleteEntry(("latestLeasingCycle:" + validatorKey))])
395+ (cancel ++ [ScriptTransfer(wxxAssetInfo.issuer, requiredWXXAmount, wxxAssetId), IntegerEntry(totalVoteskey, (totalVotes - totalValidatorVotes)), BooleanEntry(("validatorStatus:" + validator), false), DeleteEntry(("validatorLeases:" + validator)), DeleteEntry(("leaseId:" + validator)), DeleteEntry(("latestLeasingCycle:" + validator))])
419396 }
420397 else nil
421398 (punishment ++ [IntegerEntry(emergencyVotesKey, (voteAmount + emergencyVotes)), IntegerEntry(emergencyUserVotesKey, (valueOrElse(getInteger(emergencyUserVotesKey), 0) + emergencyVotes))])
432409
433410
434411 @Callable(invocation)
435-func redeemEmergencyVote (validatorAddress) = {
436- let callerKey = toBase58String(invocation.caller.bytes)
437- let validatorKey = toBase58String(validatorAddress)
438- let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validatorKey)
412+func redeemEmergencyVote (validator) = {
413+ let validatorAddress = addressFromStringValue(validator)
414+ let callerKey = toString(invocation.caller)
415+ let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validator)
439416 let emergencyUserVotes = valueOrErrorMessage(getInteger(emergencyUserVotesKey), "No emergency votes for user")
440- let xWavesAssetId = getXWavesAssetId()
441417 [ScriptTransfer(invocation.caller, emergencyUserVotes, xWavesAssetId)]
442418 }
443419
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let requiredWXXAmount = 10000000000
55
66 let cycleDurationInBlocks = 1000
77
88 let emergencyVotingThreshold = 10
99
1010 let totalVoteskey = "totalVotes"
1111
12-func getProjectAssetId () = getBinaryValue("projectAssetId")
12+let wxxAssetId = getBinaryValue("projectAssetId")
1313
14+let xWavesAssetId = getBinaryValue("xWavesAssetId")
1415
15-func getXWavesAssetId () = getBinaryValue("xWavesAssetId")
16+let currentCycle = ((lastBlock.height - getIntegerValue("startBlock")) / cycleDurationInBlocks)
1617
18+let currentCycleRequestedWithdrawals = valueOrElse(getInteger(("cycleRequestedWithdraw:" + toString(currentCycle))), 0)
1719
18-func getCurrentCycle () = {
19- let startBlock = getIntegerValue("startBlock")
20- ((lastBlock.height - startBlock) / cycleDurationInBlocks)
21- }
20+let currentCycleRequestedDeposits = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString(currentCycle))), 0)
2221
22+let totalVotes = getIntegerValue(totalVoteskey)
2323
24-func assertValidatorAddress (validatorAddress) = if (isDefined(getString(this, ("validator:" + toBase58String(validatorAddress)))))
24+func assertValidatorAddress (validatorAddress) = if (isDefined(getString(this, ("validator:" + toString(validatorAddress)))))
2525 then unit
2626 else throw("Unknown validator")
2727
2828
2929 func assertOnePayment (invocation) = if ((size(invocation.payments) != 1))
3030 then throw("Not one payment")
3131 else unit
3232
3333
3434 func assertPaymentAsset (invocation,expectedToken) = if ((invocation.payments[0].assetId != expectedToken))
3535 then throw("Unexpected asset id")
3636 else unit
3737
3838
3939 func assertUint (v) = if ((0 > v))
4040 then throw("Invalid uint")
4141 else unit
4242
4343
4444 func assertActiveValidatorStatus (validatorAddress) = {
45- let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
45+ let validatorStatusKey = ("validatorStatus:" + toString(validatorAddress))
4646 if (!(getBooleanValue(validatorStatusKey)))
4747 then throw("Unactive validator")
4848 else unit
4949 }
5050
5151
52-func assertCycleLowerThatCurrent (cycle) = {
53- let currentCycle = getCurrentCycle()
54- if ((currentCycle > cycle))
55- then unit
56- else throw("Invalid cycle")
57- }
52+func assertCycleLowerThatCurrent (cycle) = if ((currentCycle > cycle))
53+ then unit
54+ else throw("Invalid cycle")
5855
5956
60-func assertCallerIsContract (invocation) = if ((this.bytes != invocation.caller.bytes))
57+func assertCallerIsContract (invocation) = if ((this != invocation.caller))
6158 then throw("Unauthorized")
6259 else unit
6360
6461
65-func getPrevCycleRequestedWithdrawals () = valueOrElse(getInteger(("cycleRequestedWithdraw:" + toString((getCurrentCycle() - 1)))), 0)
66-
67-
68-func getPrevCycleRequestedDeposits () = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString((getCurrentCycle() - 1)))), 0)
69-
70-
71-func getCurrentCycleRequestedWithdrawals () = valueOrElse(getInteger(("cycleRequestedWithdraw:" + toString(getCurrentCycle()))), 0)
72-
73-
74-func getCurrentCycleRequestedDeposits () = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString(getCurrentCycle()))), 0)
75-
76-
7762 @Callable(invocation)
78-func init (projectTokenId) = {
63+func init (wxxTokenId) = {
7964 let callerCheck = assertCallerIsContract(invocation)
8065 if ((callerCheck == callerCheck))
8166 then if (isDefined(getBinary("projectAssetId")))
8267 then throw("Initialized")
8368 else {
8469 let issue = Issue("xWaves", "xWaves", 0, 8, true)
8570 let xWavesAssetIdId = calculateAssetId(issue)
86-[issue, IntegerEntry(totalVoteskey, 0), BinaryEntry("projectAssetId", projectTokenId), BinaryEntry("xWavesAssetId", xWavesAssetIdId), IntegerEntry("startBlock", lastBlock.height), IntegerEntry("totalRequestedWithdraw", 0), IntegerEntry("requiredWXXAmount", requiredWXXAmount), IntegerEntry("emergencyVotingThreshold", emergencyVotingThreshold)]
71+[issue, IntegerEntry(totalVoteskey, 0), BinaryEntry("projectAssetId", wxxTokenId), BinaryEntry("xWavesAssetId", xWavesAssetIdId), IntegerEntry("startBlock", lastBlock.height), IntegerEntry("totalRequestedWithdraw", 0), IntegerEntry("requiredWXXAmount", requiredWXXAmount), IntegerEntry("emergencyVotingThreshold", emergencyVotingThreshold)]
8772 }
8873 else throw("Strict value is not equal to itself.")
8974 }
9075
9176
9277
9378 @Callable(invocation)
9479 func requestDeposit () = {
9580 let _assertOnePayment = assertOnePayment(invocation)
9681 if ((_assertOnePayment == _assertOnePayment))
9782 then {
9883 let _assertPaymentAsset = assertPaymentAsset(invocation, unit)
9984 if ((_assertPaymentAsset == _assertPaymentAsset))
10085 then {
10186 let wavesAmount = invocation.payments[0].amount
102- let callerKey = toBase58String(invocation.caller.bytes)
103- let currentCycle = getCurrentCycle()
87+ let callerKey = toString(invocation.caller)
10488 let requestedDepositKey = ((("requestedDeposit:" + callerKey) + "|") + toString(currentCycle))
10589 let requestedDeposits = valueOrElse(getInteger(requestedDepositKey), 0)
10690 let totalRequestedDeposits = valueOrElse(getInteger(("cycleRequestedDeposit:" + toString(currentCycle))), 0)
10791 [IntegerEntry(requestedDepositKey, (requestedDeposits + wavesAmount)), IntegerEntry(("cycleRequestedDeposit:" + toString(currentCycle)), (totalRequestedDeposits + wavesAmount))]
10892 }
10993 else throw("Strict value is not equal to itself.")
11094 }
11195 else throw("Strict value is not equal to itself.")
11296 }
11397
11498
11599
116100 @Callable(invocation)
117101 func processDeposit (recipient,cycle) = {
118102 let _assertCycle = assertCycleLowerThatCurrent(cycle)
119103 if ((_assertCycle == _assertCycle))
120104 then {
121- let xWavesAssetId = getXWavesAssetId()
122- let requestedDepositKey = ((("requestedDeposit:" + toBase58String(recipient)) + "|") + toString(cycle))
105+ let recipientAddress = addressFromStringValue(recipient)
106+ let requestedDepositKey = ((("requestedDeposit:" + recipient) + "|") + toString(cycle))
123107 let cycleRequestedDeposits = valueOrErrorMessage(getInteger(("cycleRequestedDeposit:" + toString(cycle))), "No requested deposits for cycle")
124108 let requestedDeposit = valueOrErrorMessage(getInteger(requestedDepositKey), "No requested deposit")
125109 let lpTokenIssued = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
126110 let poolValue = (wavesBalance(this).regular - cycleRequestedDeposits)
127111 let xWavesAmount = if ((lpTokenIssued == 0))
128112 then requestedDeposit
129- else toInt(((toBigInt(requestedDeposit) * toBigInt(lpTokenIssued)) / toBigInt(poolValue)))
113+ else fraction(requestedDeposit, lpTokenIssued, poolValue)
130114 let newCycleValue = (cycleRequestedDeposits - requestedDeposit)
131- let cycleWithdrawChange = if ((newCycleValue == 0))
115+ let cycleWithdrawChange = if ((1 >= newCycleValue))
132116 then [DeleteEntry(("cycleRequestedDeposit:" + toString(cycle)))]
133117 else [IntegerEntry(("cycleRequestedDeposit:" + toString(cycle)), newCycleValue)]
134- (cycleWithdrawChange ++ [DeleteEntry(requestedDepositKey), Reissue(xWavesAssetId, xWavesAmount, true), ScriptTransfer(Address(recipient), xWavesAmount, xWavesAssetId)])
118+ (cycleWithdrawChange ++ [DeleteEntry(requestedDepositKey), Reissue(xWavesAssetId, xWavesAmount, true), ScriptTransfer(recipientAddress, xWavesAmount, xWavesAssetId)])
135119 }
136120 else throw("Strict value is not equal to itself.")
137121 }
138122
139123
140124
141125 @Callable(invocation)
142126 func requestWithdraw () = {
143127 let _assertOnePayment = assertOnePayment(invocation)
144128 if ((_assertOnePayment == _assertOnePayment))
145129 then {
146- let _assertPaymentAsset = assertPaymentAsset(invocation, getXWavesAssetId())
130+ let _assertPaymentAsset = assertPaymentAsset(invocation, xWavesAssetId)
147131 if ((_assertPaymentAsset == _assertPaymentAsset))
148132 then {
149133 let xWavesAmount = invocation.payments[0].amount
150- let currentCycle = getCurrentCycle()
151- let callerKey = toBase58String(invocation.caller.bytes)
134+ let callerKey = toString(invocation.caller)
152135 let requestedWithdrawForCallerKey = ((("requestedWithdraw:" + callerKey) + "|") + toString(currentCycle))
153136 let requestedWithdrawForCaller = valueOrElse(getInteger(requestedWithdrawForCallerKey), 0)
154137 let totalRequestedWithdraw = valueOrElse(getInteger("totalRequestedWithdraw"), 0)
155- let currentCycleRequestedWithdraw = getCurrentCycleRequestedWithdrawals()
138+ let currentCycleRequestedWithdraw = currentCycleRequestedWithdrawals
156139 [IntegerEntry(requestedWithdrawForCallerKey, (requestedWithdrawForCaller + xWavesAmount)), IntegerEntry(("cycleRequestedWithdraw:" + toString(currentCycle)), (currentCycleRequestedWithdraw + xWavesAmount)), IntegerEntry("totalRequestedWithdraw", (totalRequestedWithdraw + xWavesAmount))]
157140 }
158141 else throw("Strict value is not equal to itself.")
159142 }
160143 else throw("Strict value is not equal to itself.")
161144 }
162145
163146
164147
165148 @Callable(invocation)
166149 func processWithdraw (recipient,cycle) = {
167150 let _assertCycle = assertCycleLowerThatCurrent(cycle)
168151 if ((_assertCycle == _assertCycle))
169152 then {
170- let recipientKey = toBase58String(recipient)
171- let xWavesAssetId = getXWavesAssetId()
172- let requestedWithdrawKey = ((("requestedWithdraw:" + recipientKey) + "|") + toString(cycle))
153+ let recipientAddress = addressFromStringValue(recipient)
154+ let requestedWithdrawKey = ((("requestedWithdraw:" + recipient) + "|") + toString(cycle))
173155 let requestedWithdrawal = valueOrErrorMessage(getInteger(requestedWithdrawKey), "No requested withdraw")
174156 let cycleRequestedWithdraw = valueOrErrorMessage(getInteger(("cycleRequestedWithdraw:" + toString(cycle))), "No requested withdrawals for cycle")
175157 let poolValue = wavesBalance(this).regular
176158 let lpTokenIssued = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
177159 let totalRequestedWithdraw = valueOrElse(getInteger("totalRequestedWithdraw"), 0)
178- let wavesAmount = toInt(((toBigInt(requestedWithdrawal) * toBigInt(poolValue)) / toBigInt(lpTokenIssued)))
160+ let wavesAmount = fraction(requestedWithdrawal, poolValue, lpTokenIssued)
179161 let newCycleValue = (cycleRequestedWithdraw - requestedWithdrawal)
180162 let cycleWithdrawChange = if ((newCycleValue == 0))
181163 then [DeleteEntry(("cycleRequestedWithdraw:" + toString(cycle)))]
182164 else [IntegerEntry(("cycleRequestedWithdraw:" + toString(cycle)), newCycleValue)]
183- (cycleWithdrawChange ++ [IntegerEntry("totalRequestedWithdraw", (totalRequestedWithdraw - requestedWithdrawal)), ScriptTransfer(Address(recipient), wavesAmount, unit), Burn(getXWavesAssetId(), requestedWithdrawal), DeleteEntry(requestedWithdrawKey)])
165+ (cycleWithdrawChange ++ [IntegerEntry("totalRequestedWithdraw", (totalRequestedWithdraw - requestedWithdrawal)), ScriptTransfer(recipientAddress, wavesAmount, unit), Burn(xWavesAssetId, requestedWithdrawal), DeleteEntry(requestedWithdrawKey)])
184166 }
185167 else throw("Strict value is not equal to itself.")
186168 }
187169
188170
189171
190172 @Callable(invocation)
191-func register (validatorAddress,metadataUrl) = {
173+func register (validator,metadataUrl) = {
192174 let _assertOnePayment = assertOnePayment(invocation)
193175 if ((_assertOnePayment == _assertOnePayment))
194176 then {
195- let _assertPaymentAsset = assertPaymentAsset(invocation, getProjectAssetId())
177+ let _assertPaymentAsset = assertPaymentAsset(invocation, wxxAssetId)
196178 if ((_assertPaymentAsset == _assertPaymentAsset))
197179 then {
198- let wxxAmount = invocation.payments[0].amount
199- let validatorKey = ("validator:" + toBase58String(validatorAddress))
200- let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
201- let validatorRegistratorKey = ("validatorRegistrator:" + toBase58String(validatorAddress))
202- if (isDefined(getString(this, validatorKey)))
203- then throw("Already registered")
204- else if ((requiredWXXAmount != wxxAmount))
205- then throw("Invalid WXX amount")
206- else [StringEntry(validatorKey, metadataUrl), BooleanEntry(validatorStatusKey, true), BinaryEntry(validatorRegistratorKey, invocation.caller.bytes)]
180+ let _assertValidAddress = addressFromStringValue(validator)
181+ if ((_assertValidAddress == _assertValidAddress))
182+ then {
183+ let wxxAmount = invocation.payments[0].amount
184+ let validatorKey = ("validator:" + validator)
185+ let validatorStatusKey = ("validatorStatus:" + validator)
186+ let validatorRegistratorKey = ("validatorRegistrator:" + validator)
187+ if (isDefined(getString(this, validatorKey)))
188+ then throw("Already registered")
189+ else if ((requiredWXXAmount != wxxAmount))
190+ then throw("Invalid WXX amount")
191+ else [StringEntry(validatorKey, metadataUrl), BooleanEntry(validatorStatusKey, true), BinaryEntry(validatorRegistratorKey, invocation.caller.bytes)]
192+ }
193+ else throw("Strict value is not equal to itself.")
207194 }
208195 else throw("Strict value is not equal to itself.")
209196 }
210197 else throw("Strict value is not equal to itself.")
211198 }
212199
213200
214201
215202 @Callable(invocation)
216-func deregister (validatorAddress) = {
217- let validatorKey = toBase58String(validatorAddress)
218- let validatorRegistratorKey = ("validatorRegistrator:" + toBase58String(validatorAddress))
219- let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
220- let validatorVotesKey = ("votes:" + validatorKey)
203+func deregister (validator) = {
204+ let validatorAddress = addressFromStringValue(validator)
205+ let validatorRegistratorKey = ("validatorRegistrator:" + validator)
206+ let validatorStatusKey = ("validatorStatus:" + validator)
207+ let validatorVotesKey = ("votes:" + validator)
221208 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
222209 if ((_assertValidatorAddress == _assertValidatorAddress))
223210 then {
224211 let _assetCallerIsRegistrator = if ((getBinaryValue(validatorRegistratorKey) != invocation.caller.bytes))
225212 then throw("Wrong deregistrator")
226213 else unit
227214 if ((_assetCallerIsRegistrator == _assetCallerIsRegistrator))
228215 then {
229- let validatorLeaseIdKey = ("leaseId:" + validatorKey)
216+ let validatorLeaseIdKey = ("leaseId:" + validator)
230217 let cancel = match getBinary(validatorLeaseIdKey) {
231218 case id: ByteVector =>
232219 [LeaseCancel(id)]
233220 case _: Unit =>
234221 nil
235222 case _ =>
236223 throw("Match error")
237224 }
238225 (((if (getBooleanValue(validatorStatusKey))
239226 then {
240227 let validatorVotes = valueOrElse(getInteger(validatorVotesKey), 0)
241- let totalVotes = getIntegerValue(totalVoteskey)
242-[IntegerEntry(totalVoteskey, (totalVotes - validatorVotes)), ScriptTransfer(invocation.caller, requiredWXXAmount, getProjectAssetId())]
228+[IntegerEntry(totalVoteskey, (totalVotes - validatorVotes)), ScriptTransfer(invocation.caller, requiredWXXAmount, wxxAssetId)]
243229 }
244- else nil) ++ cancel) ++ [DeleteEntry(("votes:" + validatorKey)), DeleteEntry(validatorStatusKey), DeleteEntry(("validator:" + validatorKey)), DeleteEntry(validatorVotesKey), DeleteEntry(("validatorLeases:" + validatorKey)), DeleteEntry(validatorLeaseIdKey), DeleteEntry(("latestLeasingCycle:" + validatorKey))])
230+ else nil) ++ cancel) ++ [DeleteEntry(("votes:" + validator)), DeleteEntry(validatorStatusKey), DeleteEntry(("validator:" + validator)), DeleteEntry(validatorVotesKey), DeleteEntry(("validatorLeases:" + validator)), DeleteEntry(validatorLeaseIdKey), DeleteEntry(("latestLeasingCycle:" + validator))])
245231 }
246232 else throw("Strict value is not equal to itself.")
247233 }
248234 else throw("Strict value is not equal to itself.")
249235 }
250236
251237
252238
253239 @Callable(invocation)
254-func vote (validatorAddress,interval) = {
240+func vote (validator,interval) = {
241+ let validatorAddress = addressFromStringValue(validator)
255242 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
256243 if ((_assertValidatorAddress == _assertValidatorAddress))
257244 then {
258245 let _assetValidatorStatus = assertActiveValidatorStatus(validatorAddress)
259246 if ((_assetValidatorStatus == _assetValidatorStatus))
260247 then {
261248 let _assertOnePayment = assertOnePayment(invocation)
262249 if ((_assertOnePayment == _assertOnePayment))
263250 then {
264- let _assertPaymentAsset = assertPaymentAsset(invocation, getProjectAssetId())
251+ let _assertPaymentAsset = assertPaymentAsset(invocation, wxxAssetId)
265252 if ((_assertPaymentAsset == _assertPaymentAsset))
266253 then {
267254 let _assertUint = assertUint(interval)
268255 if ((_assertUint == _assertUint))
269256 then {
270257 let unlockBlock = (lastBlock.height + interval)
271258 let userVotes = invocation.payments[0].amount
272259 let userLock = invocation.payments[0].amount
273- let validatorKey = toBase58String(validatorAddress)
274- let callerKey = toBase58String(invocation.caller.bytes)
260+ let callerKey = toString(invocation.caller)
275261 let unlockBlockKey = ((("unlockBlock:" + callerKey) + "|") + toString(unlockBlock))
276- let totalValidatorVotesKey = ("votes:" + validatorKey)
262+ let totalValidatorVotesKey = ("votes:" + validator)
277263 let userVoteKey = ((("userVote:" + callerKey) + "|") + toString(unlockBlock))
278264 let userLockKey = ((("userLock:" + callerKey) + "|") + toString(unlockBlock))
279265 let totalValidatorVotes = valueOrElse(getInteger(totalValidatorVotesKey), 0)
280- let totalVotes = valueOrElse(getInteger(totalVoteskey), 0)
281-[IntegerEntry(userVoteKey, userVotes), IntegerEntry(userLockKey, userLock), BinaryEntry(unlockBlockKey, validatorAddress), IntegerEntry(totalValidatorVotesKey, (totalValidatorVotes + userVotes)), IntegerEntry(totalVoteskey, (totalVotes + userVotes))]
266+[IntegerEntry(userVoteKey, userVotes), IntegerEntry(userLockKey, userLock), BinaryEntry(unlockBlockKey, validatorAddress.bytes), IntegerEntry(totalValidatorVotesKey, (totalValidatorVotes + userVotes)), IntegerEntry(totalVoteskey, (totalVotes + userVotes))]
282267 }
283268 else throw("Strict value is not equal to itself.")
284269 }
285270 else throw("Strict value is not equal to itself.")
286271 }
287272 else throw("Strict value is not equal to itself.")
288273 }
289274 else throw("Strict value is not equal to itself.")
290275 }
291276 else throw("Strict value is not equal to itself.")
292277 }
293278
294279
295280
296281 @Callable(invocation)
297282 func redeem (unlockBlock) = {
298283 let _assertUnlockBlock = if ((unlockBlock > lastBlock.height))
299284 then throw("Too early")
300285 else unit
301286 if ((_assertUnlockBlock == _assertUnlockBlock))
302287 then {
303- let callerKey = toBase58String(invocation.caller.bytes)
304- let projectAssetId = getProjectAssetId()
288+ let callerKey = toString(invocation.caller)
305289 let unlockBlockKey = ((("unlockBlock:" + callerKey) + "|") + toString(unlockBlock))
306290 let userVoteKey = ((("userVote:" + callerKey) + "|") + toString(unlockBlock))
307291 let userLockKey = ((("userLock:" + callerKey) + "|") + toString(unlockBlock))
308292 let validatorAddress = valueOrErrorMessage(getBinary(unlockBlockKey), "Unknown lock")
309293 let validatorVotesKey = ("votes:" + toBase58String(validatorAddress))
310294 let userVotes = getIntegerValue(userVoteKey)
311295 let totalValidatorVotes = getIntegerValue(validatorVotesKey)
312- let totalVotes = getIntegerValue(totalVoteskey)
313296 let userLock = getIntegerValue(userLockKey)
314297 let validatorStatusKey = ("validatorStatus:" + toBase58String(validatorAddress))
315298 ((if (getBooleanValue(validatorStatusKey))
316299 then [IntegerEntry(totalVoteskey, (totalVotes - userVotes))]
317- else nil) ++ [ScriptTransfer(invocation.caller, userLock, projectAssetId), IntegerEntry(validatorVotesKey, (totalValidatorVotes - userVotes)), DeleteEntry(userVoteKey), DeleteEntry(unlockBlockKey)])
300+ else nil) ++ [ScriptTransfer(invocation.caller, userLock, wxxAssetId), IntegerEntry(validatorVotesKey, (totalValidatorVotes - userVotes)), DeleteEntry(userVoteKey), DeleteEntry(unlockBlockKey)])
318301 }
319302 else throw("Strict value is not equal to itself.")
320303 }
321304
322305
323306
324307 @Callable(invocation)
325-func leasing (validatorAddress) = {
308+func leasing (validator) = {
309+ let validatorAddress = addressFromStringValue(validator)
326310 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
327311 if ((_assertValidatorAddress == _assertValidatorAddress))
328312 then {
329313 let _assetValidatorStatus = assertActiveValidatorStatus(validatorAddress)
330314 if ((_assetValidatorStatus == _assetValidatorStatus))
331315 then {
332- let validatorKey = toBase58String(validatorAddress)
333- let validatorLeaseIdKey = ("leaseId:" + validatorKey)
334- let latestLeasingCycleKey = ("latestLeasingCycle:" + validatorKey)
335- let totalVotes = valueOrElse(getInteger(totalVoteskey), 0)
336- let validatorVotes = valueOrElse(getInteger(("votes:" + validatorKey)), 0)
337- let currentLeaseAmount = valueOrElse(getInteger(("validatorLeases:" + validatorKey)), 0)
338- let currentCycle = getCurrentCycle()
316+ let validatorLeaseIdKey = ("leaseId:" + validator)
317+ let latestLeasingCycleKey = ("latestLeasingCycle:" + validator)
318+ let validatorVotes = valueOrElse(getInteger(("votes:" + validator)), 0)
319+ let currentLeaseAmount = valueOrElse(getInteger(("validatorLeases:" + validator)), 0)
339320 let _checkLeasingStatus = if ((valueOrElse(getInteger(latestLeasingCycleKey), -1) == currentCycle))
340321 then throw("Already leased")
341322 else unit
342323 if ((_checkLeasingStatus == _checkLeasingStatus))
343324 then {
344- let lpTokenIssued = valueOrErrorMessage(assetInfo(getXWavesAssetId()), "Uknown asset id").quantity
345- let poolValue = (wavesBalance(this).regular - getCurrentCycleRequestedDeposits())
325+ let lpTokenIssued = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
326+ let poolValue = (wavesBalance(this).regular - currentCycleRequestedDeposits)
346327 let totalRequestedWithdraw = valueOrElse(getInteger("totalRequestedWithdraw"), 0)
347- let previouslyRequestedWithdraw = (totalRequestedWithdraw - getCurrentCycleRequestedWithdrawals())
328+ let previouslyRequestedWithdraw = (totalRequestedWithdraw - currentCycleRequestedWithdrawals)
348329 let requestedWithdraw = if ((lpTokenIssued == 0))
349330 then previouslyRequestedWithdraw
350- else toInt(((toBigInt(previouslyRequestedWithdraw) * toBigInt(poolValue)) / toBigInt(lpTokenIssued)))
351- let wavesAmount = (poolValue - requestedWithdraw)
352- let targetLeaseAmountBigInt = ((toBigInt(wavesAmount) * toBigInt(validatorVotes)) / toBigInt(totalVotes))
353- let targetLeaseAmount = toInt(targetLeaseAmountBigInt)
331+ else fraction(previouslyRequestedWithdraw, poolValue, lpTokenIssued)
332+ let targetLeaseAmount = fraction((poolValue - requestedWithdraw), validatorVotes, totalVotes)
354333 let cancel = match getBinary(validatorLeaseIdKey) {
355334 case id: ByteVector =>
356335 [LeaseCancel(id)]
357336 case _: Unit =>
358337 nil
359338 case _ =>
360339 throw("Match error")
361340 }
362341 if ((targetLeaseAmount != currentLeaseAmount))
363342 then {
364- let lease = Lease(Address(validatorAddress), targetLeaseAmount)
343+ let lease = Lease(validatorAddress, targetLeaseAmount)
365344 (cancel ++ (if ((targetLeaseAmount == 0))
366- then [IntegerEntry(("validatorLeases:" + validatorKey), targetLeaseAmount), DeleteEntry(validatorLeaseIdKey)]
367- else [lease, BinaryEntry(validatorLeaseIdKey, calculateLeaseId(lease)), IntegerEntry(("validatorLeases:" + validatorKey), targetLeaseAmount), IntegerEntry(latestLeasingCycleKey, currentCycle)]))
345+ then [IntegerEntry(("validatorLeases:" + validator), targetLeaseAmount), DeleteEntry(validatorLeaseIdKey)]
346+ else [lease, BinaryEntry(validatorLeaseIdKey, calculateLeaseId(lease)), IntegerEntry(("validatorLeases:" + validator), targetLeaseAmount), IntegerEntry(latestLeasingCycleKey, currentCycle)]))
368347 }
369348 else throw("Nothing changes")
370349 }
371350 else throw("Strict value is not equal to itself.")
372351 }
373352 else throw("Strict value is not equal to itself.")
374353 }
375354 else throw("Strict value is not equal to itself.")
376355 }
377356
378357
379358
380359 @Callable(invocation)
381-func emergencyVoting (validatorAddress) = {
360+func emergencyVoting (validator) = {
361+ let validatorAddress = addressFromStringValue(validator)
382362 let _assertValidatorAddress = assertValidatorAddress(validatorAddress)
383363 if ((_assertValidatorAddress == _assertValidatorAddress))
384364 then {
385365 let _assetValidatorStatus = assertActiveValidatorStatus(validatorAddress)
386366 if ((_assetValidatorStatus == _assetValidatorStatus))
387367 then {
388368 let _assertOnePayment = assertOnePayment(invocation)
389369 if ((_assertOnePayment == _assertOnePayment))
390370 then {
391- let _assertPaymentAsset = assertPaymentAsset(invocation, getXWavesAssetId())
371+ let _assertPaymentAsset = assertPaymentAsset(invocation, xWavesAssetId)
392372 if ((_assertPaymentAsset == _assertPaymentAsset))
393373 then {
394374 let voteAmount = invocation.payments[0].amount
395- let callerKey = toBase58String(invocation.caller.bytes)
396- let validatorKey = toBase58String(validatorAddress)
397- let emergencyVotesKey = ("emergencyVotes:" + validatorKey)
398- let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validatorKey)
375+ let callerKey = toString(invocation.caller)
376+ let emergencyVotesKey = ("emergencyVotes:" + validator)
377+ let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validator)
399378 let emergencyVotes = (voteAmount + valueOrElse(getInteger(emergencyVotesKey), 0))
400- let projectAssetId = getProjectAssetId()
401- let quantity = valueOrErrorMessage(assetInfo(getXWavesAssetId()), "Uknown asset id").quantity
402- let wxxAssetInfo = valueOrErrorMessage(assetInfo(projectAssetId), "Uknown asset id")
379+ let quantity = valueOrErrorMessage(assetInfo(xWavesAssetId), "Uknown asset id").quantity
380+ let wxxAssetInfo = valueOrErrorMessage(assetInfo(wxxAssetId), "Uknown asset id")
403381 let isValidatorBad = (((emergencyVotes * 100) / quantity) > emergencyVotingThreshold)
404382 let punishment = if (isValidatorBad)
405383 then {
406- let validatorLeaseIdKey = ("leaseId:" + validatorKey)
384+ let validatorLeaseIdKey = ("leaseId:" + validator)
407385 let cancel = match getBinary(validatorLeaseIdKey) {
408386 case id: ByteVector =>
409387 [LeaseCancel(id)]
410388 case _: Unit =>
411389 nil
412390 case _ =>
413391 throw("Match error")
414392 }
415- let validatorVotesKey = ("votes:" + validatorKey)
393+ let validatorVotesKey = ("votes:" + validator)
416394 let totalValidatorVotes = valueOrElse(getInteger(validatorVotesKey), 0)
417- let totalVotes = getIntegerValue(totalVoteskey)
418- (cancel ++ [ScriptTransfer(wxxAssetInfo.issuer, requiredWXXAmount, projectAssetId), IntegerEntry(totalVoteskey, (totalVotes - totalValidatorVotes)), BooleanEntry(("validatorStatus:" + validatorKey), false), DeleteEntry(("validatorLeases:" + validatorKey)), DeleteEntry(("leaseId:" + validatorKey)), DeleteEntry(("latestLeasingCycle:" + validatorKey))])
395+ (cancel ++ [ScriptTransfer(wxxAssetInfo.issuer, requiredWXXAmount, wxxAssetId), IntegerEntry(totalVoteskey, (totalVotes - totalValidatorVotes)), BooleanEntry(("validatorStatus:" + validator), false), DeleteEntry(("validatorLeases:" + validator)), DeleteEntry(("leaseId:" + validator)), DeleteEntry(("latestLeasingCycle:" + validator))])
419396 }
420397 else nil
421398 (punishment ++ [IntegerEntry(emergencyVotesKey, (voteAmount + emergencyVotes)), IntegerEntry(emergencyUserVotesKey, (valueOrElse(getInteger(emergencyUserVotesKey), 0) + emergencyVotes))])
422399 }
423400 else throw("Strict value is not equal to itself.")
424401 }
425402 else throw("Strict value is not equal to itself.")
426403 }
427404 else throw("Strict value is not equal to itself.")
428405 }
429406 else throw("Strict value is not equal to itself.")
430407 }
431408
432409
433410
434411 @Callable(invocation)
435-func redeemEmergencyVote (validatorAddress) = {
436- let callerKey = toBase58String(invocation.caller.bytes)
437- let validatorKey = toBase58String(validatorAddress)
438- let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validatorKey)
412+func redeemEmergencyVote (validator) = {
413+ let validatorAddress = addressFromStringValue(validator)
414+ let callerKey = toString(invocation.caller)
415+ let emergencyUserVotesKey = (("emergencyUserVotes:" + callerKey) + validator)
439416 let emergencyUserVotes = valueOrErrorMessage(getInteger(emergencyUserVotesKey), "No emergency votes for user")
440- let xWavesAssetId = getXWavesAssetId()
441417 [ScriptTransfer(invocation.caller, emergencyUserVotes, xWavesAssetId)]
442418 }
443419
444420

github/deemru/w8io/169f3d6 
79.73 ms