tx · 5PCnFypGYzFyQDDeSAKVcua3qAfnjdXBkx2BVVymKftH

3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ:  -0.10000000 Waves

2020.11.30 20:18 [1288446] smart account 3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ > SELF 0.00000000 Waves

{ "type": 13, "id": "5PCnFypGYzFyQDDeSAKVcua3qAfnjdXBkx2BVVymKftH", "fee": 10000000, "feeAssetId": null, "timestamp": 1606756689125, "version": 2, "chainId": 84, "sender": "3MtV1AQ8fEPk76tjKgvrufuMe5aA3q4TviQ", "senderPublicKey": "3Fjao2FW1JXSPd5EkP7C3uerW18HYacYsaMYALFMGA6N", "proofs": [ "En8qHsWU7reaVnDJD1Uq2F51bnHDWsn7gn82puUhcdSKeU2sTErGrLkA7GUZnnzV7HcjTmmyiQyw9x7MEe9sogB" ], "script": "base64:AAIDAAAAAAAAAFAIARIECgIICBIECgIICBIECgIIARIDCgEIEgUKAwgICBIFCgMICAESAwoBCBIECgIICBIECgIICBIDCgEIEgUKAwgIARIFCgMICAgSAwoBCAAAAAkAAAAABlFVT1JVTQAAAAAAAAAAAQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEAAAADa2V5BAAAAAN2YWwEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWIFAAAAByRtYXRjaDAFAAAAAWIAAAAAAAAAAAAFAAAAA3ZhbAEAAAAMdHJ5R2V0U3RyaW5nAAAAAQAAAANrZXkEAAAAA3ZhbAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgIAAAAABQAAAAN2YWwAAAAADG1haW5Db250cmFjdAUAAAAEdGhpcwEAAAAHaXNPd25lcgAAAAEAAAAHYWRkcmVzcwMJAAAAAAAAAgUAAAAHYWRkcmVzcwUAAAAEdGhpcwYJAAAAAAAAAgUAAAAHYWRkcmVzcwUAAAAMbWFpbkNvbnRyYWN0AQAAAAhnZXRHcm91cAAAAAAEAAAAA3ZhbAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAxtYWluQ29udHJhY3QCAAAAFXdvcmtpbmdfZ3JvdXBfbWVtYmVycwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiAgAAAAAFAAAAA3ZhbAEAAAAKZ2V0TWVtYmVycwAAAAAEAAAAA3ZhbAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAxtYWluQ29udHJhY3QCAAAAC2Rhb19tZW1iZXJzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWIFAAAAByRtYXRjaDAFAAAAAWICAAAAAAUAAAADdmFsAQAAAA1pc0dyb3VwTWVtYmVyAAAAAQAAAAFhBAAAAAN2YWwEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAMbWFpbkNvbnRyYWN0CQABLAAAAAIJAAEsAAAAAgIAAAAVd29ya2luZ19ncm91cF9tZW1iZXJfCQAEJQAAAAEFAAAAAWECAAAAB193ZWlnaHQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgAAAAAAAAAAAAkAAGYAAAACBQAAAAN2YWwAAAAAAAAAAAABAAAADWNhbk1lbWJlclZvdGUAAAABAAAAAWkEAAAAA3ZhbAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAxtYWluQ29udHJhY3QJAAEsAAAAAgkAASwAAAACAgAAAAtkYW9fbWVtYmVyXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAB193ZWlnaHQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgAAAAAAAAAAAAkAAGYAAAACBQAAAAN2YWwAAAAAAAAAAAAAAAANAAAAAWkBAAAAB2FkZFRhc2sAAAACAAAABXRpdGxlAAAABGxpbmsDCQEAAAABIQAAAAEJAQAAAA1pc0dyb3VwTWVtYmVyAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAIGdyYW50cyB3b3JraW5nIGdyb3VwIGFjY2VzcyBvbmx5CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQCAAAABl90aXRsZQUAAAAFdGl0bGUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18JAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAIAAAAFX2xpbmsFAAAABGxpbmsFAAAAA25pbAAAAAFpAQAAAA5hZGRUYXNrRGV0YWlscwAAAAIAAAAGdGFza0lkAAAAC2RldGFpbHNMaW5rAwkBAAAAASEAAAABCQEAAAANaXNHcm91cE1lbWJlcgAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAACBncmFudHMgd29ya2luZyBncm91cCBhY2Nlc3Mgb25seQQAAAAGcmV3YXJkCAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50AAAABmFtb3VudAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAdfcmV3YXJkBQAAAAZyZXdhcmQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAIX2RldGFpbHMFAAAAC2RldGFpbHNMaW5rCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAAB19zdGF0dXMCAAAACHByb3Bvc2VkBQAAAANuaWwAAAABaQEAAAATdm90ZUZvclRhc2tQcm9wb3NhbAAAAAIAAAAGdGFza0lkAAAACXZvdGVWYWx1ZQMJAQAAAAEhAAAAAQkBAAAADWNhbk1lbWJlclZvdGUAAAABBQAAAAFpCQAAAgAAAAECAAAADnlvdSBjYW4ndCB2b3RlAwkBAAAAAiE9AAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAdfc3RhdHVzAgAAAAhwcm9wb3NlZAkAAAIAAAABAgAAAB92b3RpbmcgaXMgY2xvc2VkIG9yIG5vdCBzdGFydGVkAwMJAQAAAAIhPQAAAAIFAAAACXZvdGVWYWx1ZQD//////////wkBAAAAAiE9AAAAAgUAAAAJdm90ZVZhbHVlAAAAAAAAAAABBwkAAAIAAAABAgAAABh5b3UgbmVlZCB0byB2b3RlIDEgb3IgLTEEAAAAB3ZvdGVLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAdfdm90ZWRfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAMcHJldmlvdXNWb3RlCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAAB3ZvdGVLZXkDCQEAAAABIQAAAAEJAAAAAAAAAgUAAAAMcHJldmlvdXNWb3RlAAAAAAAAAAAACQAAAgAAAAECAAAAFnlvdSBoYXZlIGFscmVhZHkgdm90ZWQEAAAACXZvdGluZ0tleQkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAA1fdm90aW5nX3N0YXRlBAAAAAt2b3RpbmdTdGF0ZQkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAAl2b3RpbmdLZXkEAAAADnZvdGVzQW1vdW50S2V5CQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAADl92b3RpbmdfYW1vdW50BAAAABB2b3Rlc0Ftb3VudFN0YXRlCQAAZAAAAAIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAJdm90aW5nS2V5AAAAAAAAAAABBAAAAA5uZXdWb3RpbmdTdGF0ZQkAAGQAAAACBQAAAAt2b3RpbmdTdGF0ZQUAAAAJdm90ZVZhbHVlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAJdm90aW5nS2V5BQAAAA5uZXdWb3RpbmdTdGF0ZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHdm90ZUtleQUAAAAJdm90ZVZhbHVlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA52b3Rlc0Ftb3VudEtleQUAAAAQdm90ZXNBbW91bnRTdGF0ZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAehIAUAAAAEdW5pdAUAAAADbmlsAAAAAWkBAAAAGGZpbmlzaFRhc2tQcm9wb3NhbFZvdGluZwAAAAEAAAAGdGFza0lkAwkAAGYAAAACBQAAAAZRVU9SVU0JAABpAAAAAgkAAGgAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAOX3ZvdGluZ19hbW91bnQAAAAAAAAAAGQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAAIZGFvX3NpemUJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAACm1vcmUgdGhhbiAJAAGkAAAAAQUAAAAGUVVPUlVNAgAAADIlIG1lbWJlcnMgaGF2ZSB0byB2b3RlIGJlZm9yZSBmaW5pc2hpbmcgdGhlIHZvdGluZwMJAQAAAAEhAAAAAQkBAAAADWlzR3JvdXBNZW1iZXIAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAAgZ3JhbnRzIHdvcmtpbmcgZ3JvdXAgYWNjZXNzIG9ubHkEAAAACXZvdGluZ0tleQkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAA1fdm90aW5nX3N0YXRlBAAAAAt2b3RpbmdTdGF0ZQkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAAl2b3RpbmdLZXkDCQAAZgAAAAIFAAAAC3ZvdGluZ1N0YXRlAAAAAAAAAAAABAAAAAx2b3RpbmdSZXN1bHQCAAAADnJlYWR5X3RvX2FwcGx5CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAAB19zdGF0dXMFAAAADHZvdGluZ1Jlc3VsdAUAAAADbmlsBAAAAAx2b3RpbmdSZXN1bHQCAAAACHJlamVjdGVkCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAAB19zdGF0dXMFAAAADHZvdGluZ1Jlc3VsdAUAAAADbmlsAAAAAWkBAAAADGFwcGx5Rm9yVGFzawAAAAMAAAAGdGFza0lkAAAACHRlYW1OYW1lAAAABGxpbmsEAAAABnN0YXR1cwkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAHX3N0YXR1cwMJAQAAAAIhPQAAAAIFAAAABnN0YXR1cwIAAAAOcmVhZHlfdG9fYXBwbHkJAAACAAAAAQIAAAAkVGhpcyBncmFudCBoYXMgbm90IHlldCBiZWVuIGFwcHJvdmVkBAAAAAdsaXN0S2V5CQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAAC19hcHBsaWNhbnRzBAAAABVjdXJyZW50QXBwbGljYW50c0xpc3QJAQAAAAx0cnlHZXRTdHJpbmcAAAABBQAAAAdsaXN0S2V5BAAAAAxhcHBsaWNhbnRLZXkJAAEwAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIAAAAAAAAAAAoEAAAABmxlYWRlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAEW5ld0FwcGxpY2FudHNMaXN0CQABLAAAAAIJAAEsAAAAAgUAAAAVY3VycmVudEFwcGxpY2FudHNMaXN0AgAAAAE7BQAAAAZsZWFkZXIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAABV9hcHBfBQAAAAxhcHBsaWNhbnRLZXkCAAAABV9uYW1lBQAAAAh0ZWFtTmFtZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAFX2FwcF8FAAAADGFwcGxpY2FudEtleQIAAAAFX2xpbmsFAAAABGxpbmsJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAABV9hcHBfBQAAAAxhcHBsaWNhbnRLZXkCAAAAB19sZWFkZXIFAAAABmxlYWRlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAFX2FwcF8FAAAADGFwcGxpY2FudEtleQIAAAADX2lkBQAAAAxhcHBsaWNhbnRLZXkJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAB2xpc3RLZXkFAAAAEW5ld0FwcGxpY2FudHNMaXN0BQAAAANuaWwAAAABaQEAAAAQdm90ZUZvckFwcGxpY2FudAAAAAMAAAAGdGFza0lkAAAADnRlYW1JZGVudGlmaWVyAAAACXZvdGVWYWx1ZQMJAQAAAAEhAAAAAQkBAAAADWNhbk1lbWJlclZvdGUAAAABBQAAAAFpCQAAAgAAAAECAAAADnlvdSBjYW4ndCB2b3RlBAAAAAh2b3RlSGFzaAkAASwAAAACCQABMAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAAAKCQABMAAAAAIFAAAADnRlYW1JZGVudGlmaWVyAAAAAAAAAAAKBAAAAAd2b3RlS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAGX3ZvdGVfBQAAAAh2b3RlSGFzaAQAAAAEdm90ZQkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAAd2b3RlS2V5AwkBAAAAAiE9AAAAAgUAAAAEdm90ZQAAAAAAAAAAAAkAAAIAAAABAgAAACN5b3UgaGF2ZSBhbHJlYWR5IHZvdGVkIG9uIHRoaXMgdGVhbQQAAAASdGVhbVZvdGVzQW1vdW50S2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAVfYXBwXwUAAAAOdGVhbUlkZW50aWZpZXICAAAABl92b3RlcwQAAAAMdGVhbVNjb3JlS2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAVfYXBwXwUAAAAOdGVhbUlkZW50aWZpZXICAAAABl9zY29yZQQAAAAPdGVhbVZvdGVzQW1vdW50CQAAZAAAAAIAAAAAAAAAAAEJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAASdGVhbVZvdGVzQW1vdW50S2V5BAAAAAxuZXdUZWFtU2NvcmUJAABkAAAAAgUAAAAJdm90ZVZhbHVlCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAADHRlYW1TY29yZUtleQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHdm90ZUtleQUAAAAJdm90ZVZhbHVlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAx0ZWFtU2NvcmVLZXkFAAAADG5ld1RlYW1TY29yZQUAAAADbmlsAAAAAWkBAAAAFmZpbmlzaEFwcGxpY2FudHNWb3RpbmcAAAABAAAABnRhc2tJZAQAAAAabWluVm90ZXNUb0FwcHJvdmVBcHBsaWNhbnQAAAAAAAAAAAEDCQEAAAABIQAAAAEJAQAAAA1pc0dyb3VwTWVtYmVyAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAIGdyYW50cyB3b3JraW5nIGdyb3VwIGFjY2VzcyBvbmx5BAAAAAhsaXN0S2V5cwkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAALX2FwcGxpY2FudHMEAAAADmFwcGxpY2FudHNMaXN0CQAEtQAAAAIFAAAACGxpc3RLZXlzAgAAAAE7AwkAAAAAAAACCQABkAAAAAEFAAAADmFwcGxpY2FudHNMaXN0AAAAAAAAAAAACQAAAgAAAAECAAAAKE5vIG9uZSBoYXMgYXBwbGllZCB0byB0aGUgaGFja2F0aG9uLCB5ZXQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAKX3BlcmZvcm1lcgUAAAAIbGlzdEtleXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAHX3N0YXR1cwIAAAAPcmVhZHlfdG9fc3VibWl0BQAAAANuaWwAAAABaQEAAAARZW5hYmxlU3VibWlzc2lvbnMAAAACAAAABnRhc2tJZAAAAAhqdXJ5TGlzdAMJAQAAAAEhAAAAAQkBAAAADWlzR3JvdXBNZW1iZXIAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAAgZ3JhbnRzIHdvcmtpbmcgZ3JvdXAgYWNjZXNzIG9ubHkJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAHX3N0YXR1cwIAAAAMd29ya19zdGFydGVkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAABV9qdXJ5BQAAAAhqdXJ5TGlzdAUAAAADbmlsAAAAAWkBAAAADnN1Ym1pdFNvbHV0aW9uAAAAAgAAAAZ0YXNrSWQAAAAMc29sdXRpb25MaW5rCgEAAAAVYXJlU3VibWlzc2lvbnNFbmFibGVkAAAAAQAAAAZ0YXNrSWQJAAAAAAAAAgkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAHX3N0YXR1cwIAAAAMd29ya19zdGFydGVkBAAAAA50ZWFtSWRlbnRpZmllcgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAApfcGVyZm9ybWVyAwkBAAAAASEAAAABCQEAAAAVYXJlU3VibWlzc2lvbnNFbmFibGVkAAAAAQUAAAAGdGFza0lkCQAAAgAAAAECAAAAI25vdCBwb3NzaWJsZSB0byB1cGxvYWQgc29sdXRpb24gbm93AwkBAAAAAiE9AAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAABV9hcHBfBQAAAA50ZWFtSWRlbnRpZmllcgIAAAAHX2xlYWRlcgkAAAIAAAABAgAAABB0ZWFtIGxlYWRlciBvbmx5CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAVfYXBwXwUAAAAOdGVhbUlkZW50aWZpZXICAAAACF9wcm9jZXNzAgAAAA53b3JrX3N1Ym1pdHRlZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAFX2FwcF8FAAAADnRlYW1JZGVudGlmaWVyAgAAAAlfc29sdXRpb24FAAAADHNvbHV0aW9uTGluawUAAAADbmlsAAAAAWkBAAAAD3N0b3BTdWJtaXNzaW9ucwAAAAEAAAAGdGFza0lkAwkBAAAAASEAAAABCQEAAAANaXNHcm91cE1lbWJlcgAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAACBncmFudHMgd29ya2luZyBncm91cCBhY2Nlc3Mgb25seQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAdfc3RhdHVzAgAAAA13b3JrX2ZpbmlzaGVkBQAAAANuaWwAAAABaQEAAAAPdm90ZUZvclNvbHV0aW9uAAAAAwAAAAZ0YXNrSWQAAAAOdGVhbUlkZW50aWZpZXIAAAAJdm90ZVZhbHVlCgEAAAAMaXNKdXJ5TWVtYmVyAAAAAgAAAAFpAAAABnRhc2tJZAYDCQEAAAABIQAAAAEJAQAAAAxpc0p1cnlNZW1iZXIAAAACBQAAAAFpBQAAAAZ0YXNrSWQJAAACAAAAAQIAAAAOeW91IGNhbid0IHZvdGUEAAAACHZvdGVIYXNoCQABLAAAAAIJAAEwAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIAAAAAAAAAAAoJAAEwAAAAAgUAAAAOdGVhbUlkZW50aWZpZXIAAAAAAAAAAAoEAAAAB3ZvdGVLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAA5fc29sdXRpb252b3RlXwUAAAAIdm90ZUhhc2gEAAAABHZvdGUJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAHdm90ZUtleQMJAQAAAAIhPQAAAAIFAAAABHZvdGUAAAAAAAAAAAAJAAACAAAAAQIAAAAneW91IGhhdmUgYWxyZWFkeSB2b3RlZCBvbiB0aGlzIHNvbHV0aW9uBAAAABJ0ZWFtVm90ZXNBbW91bnRLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAABV9hcHBfBQAAAA50ZWFtSWRlbnRpZmllcgIAAAAOX3NvbHV0aW9udm90ZXMEAAAADHRlYW1TY29yZUtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAFX2FwcF8FAAAADnRlYW1JZGVudGlmaWVyAgAAAA5fc29sdXRpb25zY29yZQQAAAAPdGVhbVZvdGVzQW1vdW50CQAAZAAAAAIAAAAAAAAAAAEJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAASdGVhbVZvdGVzQW1vdW50S2V5BAAAAAxuZXdUZWFtU2NvcmUJAABkAAAAAgUAAAAJdm90ZVZhbHVlCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAADHRlYW1TY29yZUtleQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHdm90ZUtleQUAAAAJdm90ZVZhbHVlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAx0ZWFtU2NvcmVLZXkFAAAADG5ld1RlYW1TY29yZQUAAAADbmlsAAAAAWkBAAAAEGFjY2VwdFdvcmtSZXN1bHQAAAADAAAABnRhc2tJZAAAABB3aW5uZXJJZGVudGlmaWVyAAAACnJlcG9ydExpbmsDCQEAAAABIQAAAAEJAQAAAA1pc0dyb3VwTWVtYmVyAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAIGdyYW50cyB3b3JraW5nIGdyb3VwIGFjY2VzcyBvbmx5BAAAAAxyZXdhcmRBbW91bnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAAdfcmV3YXJkBAAAAAt0ZWFtQWRkcmVzcwkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAZ0YXNrc18FAAAABnRhc2tJZAIAAAAFX2FwcF8FAAAAEHdpbm5lcklkZW50aWZpZXICAAAAB19sZWFkZXIJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAAB19zdGF0dXMCAAAADXdvcmtfZmluaXNoZWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAABV9hcHBfBQAAABB3aW5uZXJJZGVudGlmaWVyAgAAAAhfcHJvY2VzcwIAAAAGd2lubmVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAAB19yZXBvcnQFAAAACnJlcG9ydExpbmsFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAC3RlYW1BZGRyZXNzBQAAAAxyZXdhcmRBbW91bnQFAAAABHVuaXQFAAAAA25pbAAAAAFpAQAAAApyZWplY3RUYXNrAAAAAQAAAAZ0YXNrSWQDCQEAAAABIQAAAAEJAQAAAA1pc0dyb3VwTWVtYmVyAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAIGdyYW50cyB3b3JraW5nIGdyb3VwIGFjY2VzcyBvbmx5BAAAAA50ZWFtSWRlbnRpZmllcgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAICAAAABnRhc2tzXwUAAAAGdGFza0lkAgAAAApfcGVyZm9ybWVyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGdGFza3NfBQAAAAZ0YXNrSWQCAAAAB19zdGF0dXMCAAAACHJlamVjdGVkBQAAAANuaWwAAAAA1JKFoA==", "height": 1288446, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AUewYi5WsC1EFqBAb4ywzF3ndZQGZgUfue828f85qKjQ Next: HR7iWwCxPc8HbX878WDmwLj9JY3RCAkJZTrcLwokNHFm Diff:
OldNewDifferences
2727
2828 let mainContract = this
2929
30-func isOwner (address) = (address == this)
30+func isOwner (address) = if ((address == this))
31+ then true
32+ else (address == mainContract)
3133
3234
3335 func getGroup () = {
7577
7678
7779 @Callable(i)
78-func addTask (title,link) = WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link)])
80+func addTask (title,link) = if (!(isGroupMember(i.caller)))
81+ then throw("grants working group access only")
82+ else WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link)])
7983
8084
8185
8286 @Callable(i)
83-func addTaskDetails (taskId,reward) = {
84- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
85- if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
86- then throw("team leader only")
87- else WriteSet([DataEntry((("tasks_" + taskId) + "_requestedreward"), reward)])
88- }
89-
90-
91-
92-@Callable(i)
93-func initTaskVoting (taskId) = if (!(isGroupMember(i.caller)))
87+func addTaskDetails (taskId,detailsLink) = if (!(isGroupMember(i.caller)))
9488 then throw("grants working group access only")
95- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "voting_started")])
89+ else {
90+ let reward = extract(i.payment).amount
91+ WriteSet([DataEntry((("tasks_" + taskId) + "_reward"), reward), DataEntry((("tasks_" + taskId) + "_details"), detailsLink), DataEntry((("tasks_" + taskId) + "_status"), "proposed")])
92+ }
9693
9794
9895
132129 let votingState = tryGetInteger(votingKey)
133130 if ((votingState > 0))
134131 then {
135- let votingResult = "approved"
132+ let votingResult = "ready_to_apply"
136133 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
137134 }
138135 else {
144141
145142
146143 @Callable(i)
147-func startWork (taskId) = {
144+func applyForTask (taskId,teamName,link) = {
145+ let status = tryGetString((("tasks_" + taskId) + "_status"))
146+ if ((status != "ready_to_apply"))
147+ then throw("This grant has not yet been approved")
148+ else {
149+ let listKey = (("tasks_" + taskId) + "_applicants")
150+ let currentApplicantsList = tryGetString(listKey)
151+ let applicantKey = drop(toString(i.caller), 10)
152+ let leader = toString(i.caller)
153+ let newApplicantsList = ((currentApplicantsList + ";") + leader)
154+ WriteSet([DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_name"), teamName), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_link"), link), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_leader"), leader), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_id"), applicantKey), DataEntry(listKey, newApplicantsList)])
155+ }
156+ }
157+
158+
159+
160+@Callable(i)
161+func voteForApplicant (taskId,teamIdentifier,voteValue) = if (!(canMemberVote(i)))
162+ then throw("you can't vote")
163+ else {
164+ let voteHash = (drop(toString(i.caller), 10) + drop(teamIdentifier, 10))
165+ let voteKey = ((("tasks_" + taskId) + "_vote_") + voteHash)
166+ let vote = tryGetInteger(voteKey)
167+ if ((vote != 0))
168+ then throw("you have already voted on this team")
169+ else {
170+ let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
171+ let teamScoreKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_score")
172+ let teamVotesAmount = (1 + tryGetInteger(teamVotesAmountKey))
173+ let newTeamScore = (voteValue + tryGetInteger(teamScoreKey))
174+ WriteSet([DataEntry(voteKey, voteValue), DataEntry(teamScoreKey, newTeamScore)])
175+ }
176+ }
177+
178+
179+
180+@Callable(i)
181+func finishApplicantsVoting (taskId) = {
182+ let minVotesToApproveApplicant = 1
183+ if (!(isGroupMember(i.caller)))
184+ then throw("grants working group access only")
185+ else {
186+ let listKeys = tryGetString((("tasks_" + taskId) + "_applicants"))
187+ let applicantsList = split(listKeys, ";")
188+ if ((size(applicantsList) == 0))
189+ then throw("No one has applied to the hackathon, yet")
190+ else WriteSet([DataEntry((("tasks_" + taskId) + "_performer"), listKeys), DataEntry((("tasks_" + taskId) + "_status"), "ready_to_submit")])
191+ }
192+ }
193+
194+
195+
196+@Callable(i)
197+func enableSubmissions (taskId,juryList) = if (!(isGroupMember(i.caller)))
198+ then throw("grants working group access only")
199+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started"), DataEntry((("tasks_" + taskId) + "_jury"), juryList)])
200+
201+
202+
203+@Callable(i)
204+func submitSolution (taskId,solutionLink) = {
205+ func areSubmissionsEnabled (taskId) = (tryGetString((("tasks_" + taskId) + "_status")) == "work_started")
206+
148207 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
149- if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
150- then throw("team leader only")
151- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started")])
208+ if (!(areSubmissionsEnabled(taskId)))
209+ then throw("not possible to upload solution now")
210+ else if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
211+ then throw("team leader only")
212+ else WriteSet([DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "work_submitted"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_solution"), solutionLink)])
152213 }
214+
215+
216+
217+@Callable(i)
218+func stopSubmissions (taskId) = if (!(isGroupMember(i.caller)))
219+ then throw("grants working group access only")
220+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished")])
221+
222+
223+
224+@Callable(i)
225+func voteForSolution (taskId,teamIdentifier,voteValue) = {
226+ func isJuryMember (i,taskId) = true
227+
228+ if (!(isJuryMember(i, taskId)))
229+ then throw("you can't vote")
230+ else {
231+ let voteHash = (drop(toString(i.caller), 10) + drop(teamIdentifier, 10))
232+ let voteKey = ((("tasks_" + taskId) + "_solutionvote_") + voteHash)
233+ let vote = tryGetInteger(voteKey)
234+ if ((vote != 0))
235+ then throw("you have already voted on this solution")
236+ else {
237+ let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_solutionvotes")
238+ let teamScoreKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_solutionscore")
239+ let teamVotesAmount = (1 + tryGetInteger(teamVotesAmountKey))
240+ let newTeamScore = (voteValue + tryGetInteger(teamScoreKey))
241+ WriteSet([DataEntry(voteKey, voteValue), DataEntry(teamScoreKey, newTeamScore)])
242+ }
243+ }
244+ }
245+
246+
247+
248+@Callable(i)
249+func acceptWorkResult (taskId,winnerIdentifier,reportLink) = if (!(isGroupMember(i.caller)))
250+ then throw("grants working group access only")
251+ else {
252+ let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
253+ let teamAddress = getStringValue(this, (((("tasks_" + taskId) + "_app_") + winnerIdentifier) + "_leader"))
254+ ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((((("tasks_" + taskId) + "_app_") + winnerIdentifier) + "_process"), "winner"), DataEntry((("tasks_" + taskId) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
255+ }
153256
154257
155258
158261 then throw("grants working group access only")
159262 else {
160263 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
161- WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "rejected")])
162- }
163-
164-
165-
166-@Callable(i)
167-func acceptWorkResult (taskId,reportLink) = if (!(isGroupMember(i.caller)))
168- then throw("grants working group access only")
169- else {
170- let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
171- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
172- let teamAddress = getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))
173- ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
264+ WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
174265 }
175266
176267
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let QUORUM = 1
55
66 func tryGetInteger (key) = {
77 let val = match getInteger(this, key) {
88 case b: Int =>
99 b
1010 case _ =>
1111 0
1212 }
1313 val
1414 }
1515
1616
1717 func tryGetString (key) = {
1818 let val = match getString(this, key) {
1919 case b: String =>
2020 b
2121 case _ =>
2222 ""
2323 }
2424 val
2525 }
2626
2727
2828 let mainContract = this
2929
30-func isOwner (address) = (address == this)
30+func isOwner (address) = if ((address == this))
31+ then true
32+ else (address == mainContract)
3133
3234
3335 func getGroup () = {
3436 let val = match getString(mainContract, "working_group_members") {
3537 case b: String =>
3638 b
3739 case _ =>
3840 ""
3941 }
4042 val
4143 }
4244
4345
4446 func getMembers () = {
4547 let val = match getString(mainContract, "dao_members") {
4648 case b: String =>
4749 b
4850 case _ =>
4951 ""
5052 }
5153 val
5254 }
5355
5456
5557 func isGroupMember (a) = {
5658 let val = match getInteger(mainContract, (("working_group_member_" + toString(a)) + "_weight")) {
5759 case b: Int =>
5860 b
5961 case _ =>
6062 0
6163 }
6264 (val > 0)
6365 }
6466
6567
6668 func canMemberVote (i) = {
6769 let val = match getInteger(mainContract, (("dao_member_" + toString(i.caller)) + "_weight")) {
6870 case b: Int =>
6971 b
7072 case _ =>
7173 0
7274 }
7375 (val > 0)
7476 }
7577
7678
7779 @Callable(i)
78-func addTask (title,link) = WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link)])
80+func addTask (title,link) = if (!(isGroupMember(i.caller)))
81+ then throw("grants working group access only")
82+ else WriteSet([DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_title"), title), DataEntry((("tasks_" + toBase58String(i.transactionId)) + "_link"), link)])
7983
8084
8185
8286 @Callable(i)
83-func addTaskDetails (taskId,reward) = {
84- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
85- if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
86- then throw("team leader only")
87- else WriteSet([DataEntry((("tasks_" + taskId) + "_requestedreward"), reward)])
88- }
89-
90-
91-
92-@Callable(i)
93-func initTaskVoting (taskId) = if (!(isGroupMember(i.caller)))
87+func addTaskDetails (taskId,detailsLink) = if (!(isGroupMember(i.caller)))
9488 then throw("grants working group access only")
95- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "voting_started")])
89+ else {
90+ let reward = extract(i.payment).amount
91+ WriteSet([DataEntry((("tasks_" + taskId) + "_reward"), reward), DataEntry((("tasks_" + taskId) + "_details"), detailsLink), DataEntry((("tasks_" + taskId) + "_status"), "proposed")])
92+ }
9693
9794
9895
9996 @Callable(i)
10097 func voteForTaskProposal (taskId,voteValue) = if (!(canMemberVote(i)))
10198 then throw("you can't vote")
10299 else if ((getStringValue(this, (("tasks_" + taskId) + "_status")) != "proposed"))
103100 then throw("voting is closed or not started")
104101 else if (if ((voteValue != -1))
105102 then (voteValue != 1)
106103 else false)
107104 then throw("you need to vote 1 or -1")
108105 else {
109106 let voteKey = ((("tasks_" + taskId) + "_voted_") + toString(i.caller))
110107 let previousVote = tryGetInteger(voteKey)
111108 if (!((previousVote == 0)))
112109 then throw("you have already voted")
113110 else {
114111 let votingKey = (("tasks_" + taskId) + "_voting_state")
115112 let votingState = tryGetInteger(votingKey)
116113 let votesAmountKey = (("tasks_" + taskId) + "_voting_amount")
117114 let votesAmountState = (tryGetInteger(votingKey) + 1)
118115 let newVotingState = (votingState + voteValue)
119116 ScriptResult(WriteSet([DataEntry(votingKey, newVotingState), DataEntry(voteKey, voteValue), DataEntry(votesAmountKey, votesAmountState)]), TransferSet([ScriptTransfer(i.caller, 500000, unit)]))
120117 }
121118 }
122119
123120
124121
125122 @Callable(i)
126123 func finishTaskProposalVoting (taskId) = if ((QUORUM > ((tryGetInteger((("tasks_" + taskId) + "_voting_amount")) * 100) / tryGetInteger("dao_size"))))
127124 then throw((("more than " + toString(QUORUM)) + "% members have to vote before finishing the voting"))
128125 else if (!(isGroupMember(i.caller)))
129126 then throw("grants working group access only")
130127 else {
131128 let votingKey = (("tasks_" + taskId) + "_voting_state")
132129 let votingState = tryGetInteger(votingKey)
133130 if ((votingState > 0))
134131 then {
135- let votingResult = "approved"
132+ let votingResult = "ready_to_apply"
136133 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
137134 }
138135 else {
139136 let votingResult = "rejected"
140137 WriteSet([DataEntry((("tasks_" + taskId) + "_status"), votingResult)])
141138 }
142139 }
143140
144141
145142
146143 @Callable(i)
147-func startWork (taskId) = {
144+func applyForTask (taskId,teamName,link) = {
145+ let status = tryGetString((("tasks_" + taskId) + "_status"))
146+ if ((status != "ready_to_apply"))
147+ then throw("This grant has not yet been approved")
148+ else {
149+ let listKey = (("tasks_" + taskId) + "_applicants")
150+ let currentApplicantsList = tryGetString(listKey)
151+ let applicantKey = drop(toString(i.caller), 10)
152+ let leader = toString(i.caller)
153+ let newApplicantsList = ((currentApplicantsList + ";") + leader)
154+ WriteSet([DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_name"), teamName), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_link"), link), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_leader"), leader), DataEntry((((("tasks_" + taskId) + "_app_") + applicantKey) + "_id"), applicantKey), DataEntry(listKey, newApplicantsList)])
155+ }
156+ }
157+
158+
159+
160+@Callable(i)
161+func voteForApplicant (taskId,teamIdentifier,voteValue) = if (!(canMemberVote(i)))
162+ then throw("you can't vote")
163+ else {
164+ let voteHash = (drop(toString(i.caller), 10) + drop(teamIdentifier, 10))
165+ let voteKey = ((("tasks_" + taskId) + "_vote_") + voteHash)
166+ let vote = tryGetInteger(voteKey)
167+ if ((vote != 0))
168+ then throw("you have already voted on this team")
169+ else {
170+ let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_votes")
171+ let teamScoreKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_score")
172+ let teamVotesAmount = (1 + tryGetInteger(teamVotesAmountKey))
173+ let newTeamScore = (voteValue + tryGetInteger(teamScoreKey))
174+ WriteSet([DataEntry(voteKey, voteValue), DataEntry(teamScoreKey, newTeamScore)])
175+ }
176+ }
177+
178+
179+
180+@Callable(i)
181+func finishApplicantsVoting (taskId) = {
182+ let minVotesToApproveApplicant = 1
183+ if (!(isGroupMember(i.caller)))
184+ then throw("grants working group access only")
185+ else {
186+ let listKeys = tryGetString((("tasks_" + taskId) + "_applicants"))
187+ let applicantsList = split(listKeys, ";")
188+ if ((size(applicantsList) == 0))
189+ then throw("No one has applied to the hackathon, yet")
190+ else WriteSet([DataEntry((("tasks_" + taskId) + "_performer"), listKeys), DataEntry((("tasks_" + taskId) + "_status"), "ready_to_submit")])
191+ }
192+ }
193+
194+
195+
196+@Callable(i)
197+func enableSubmissions (taskId,juryList) = if (!(isGroupMember(i.caller)))
198+ then throw("grants working group access only")
199+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started"), DataEntry((("tasks_" + taskId) + "_jury"), juryList)])
200+
201+
202+
203+@Callable(i)
204+func submitSolution (taskId,solutionLink) = {
205+ func areSubmissionsEnabled (taskId) = (tryGetString((("tasks_" + taskId) + "_status")) == "work_started")
206+
148207 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
149- if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
150- then throw("team leader only")
151- else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_started")])
208+ if (!(areSubmissionsEnabled(taskId)))
209+ then throw("not possible to upload solution now")
210+ else if ((toString(i.caller) != getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))))
211+ then throw("team leader only")
212+ else WriteSet([DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "work_submitted"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_solution"), solutionLink)])
152213 }
214+
215+
216+
217+@Callable(i)
218+func stopSubmissions (taskId) = if (!(isGroupMember(i.caller)))
219+ then throw("grants working group access only")
220+ else WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished")])
221+
222+
223+
224+@Callable(i)
225+func voteForSolution (taskId,teamIdentifier,voteValue) = {
226+ func isJuryMember (i,taskId) = true
227+
228+ if (!(isJuryMember(i, taskId)))
229+ then throw("you can't vote")
230+ else {
231+ let voteHash = (drop(toString(i.caller), 10) + drop(teamIdentifier, 10))
232+ let voteKey = ((("tasks_" + taskId) + "_solutionvote_") + voteHash)
233+ let vote = tryGetInteger(voteKey)
234+ if ((vote != 0))
235+ then throw("you have already voted on this solution")
236+ else {
237+ let teamVotesAmountKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_solutionvotes")
238+ let teamScoreKey = (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_solutionscore")
239+ let teamVotesAmount = (1 + tryGetInteger(teamVotesAmountKey))
240+ let newTeamScore = (voteValue + tryGetInteger(teamScoreKey))
241+ WriteSet([DataEntry(voteKey, voteValue), DataEntry(teamScoreKey, newTeamScore)])
242+ }
243+ }
244+ }
245+
246+
247+
248+@Callable(i)
249+func acceptWorkResult (taskId,winnerIdentifier,reportLink) = if (!(isGroupMember(i.caller)))
250+ then throw("grants working group access only")
251+ else {
252+ let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
253+ let teamAddress = getStringValue(this, (((("tasks_" + taskId) + "_app_") + winnerIdentifier) + "_leader"))
254+ ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((((("tasks_" + taskId) + "_app_") + winnerIdentifier) + "_process"), "winner"), DataEntry((("tasks_" + taskId) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
255+ }
153256
154257
155258
156259 @Callable(i)
157260 func rejectTask (taskId) = if (!(isGroupMember(i.caller)))
158261 then throw("grants working group access only")
159262 else {
160263 let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
161- WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_process"), "rejected")])
162- }
163-
164-
165-
166-@Callable(i)
167-func acceptWorkResult (taskId,reportLink) = if (!(isGroupMember(i.caller)))
168- then throw("grants working group access only")
169- else {
170- let rewardAmount = tryGetInteger((("tasks_" + taskId) + "_reward"))
171- let teamIdentifier = getStringValue(this, (("tasks_" + taskId) + "_performer"))
172- let teamAddress = getStringValue(this, (((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_leader"))
173- ScriptResult(WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "work_finished"), DataEntry((((("tasks_" + taskId) + "_app_") + teamIdentifier) + "_report"), reportLink)]), TransferSet([ScriptTransfer(addressFromStringValue(teamAddress), rewardAmount, unit)]))
264+ WriteSet([DataEntry((("tasks_" + taskId) + "_status"), "rejected")])
174265 }
175266
176267

github/deemru/w8io/3ef1775 
52.06 ms