tx · GbVXK5mGcDWzuj4S8ues9qFZqgGo8UM3jBtBFuAygDy6

3MuMiS4jTTcuf13zMuonyb8JBE1jJkQ5JNe:  -0.01400000 Waves

2021.02.19 02:13 [1404220] smart account 3MuMiS4jTTcuf13zMuonyb8JBE1jJkQ5JNe > SELF 0.00000000 Waves

{ "type": 13, "id": "GbVXK5mGcDWzuj4S8ues9qFZqgGo8UM3jBtBFuAygDy6", "fee": 1400000, "feeAssetId": null, "timestamp": 1613690045883, "version": 2, "chainId": 84, "sender": "3MuMiS4jTTcuf13zMuonyb8JBE1jJkQ5JNe", "senderPublicKey": "8QFH4kvTaVWhAPErMqKKRzRhYtv7egJFn1UpMdj8pMf3", "proofs": [ "37kNp2sdecLKFrA4R2RVntbuvx2r6xia2bC6dRvswEBR397EoT5VU7LiCCsQu8msFZZoyiNsjNKMWGkSXTeqW1Dc" ], "script": "base64:AAIDAAAAAAAAAC0IARIHCgUICAgICBIECgIICBIHCgUICAgICBIICgYICAgICAgSBQoDCAgIEgAAAAAQAAAAAA9zdG9yYWdlVmVyaWZpZXIJAQAAAAdleHRyYWN0AAAAAQkBAAAAEWFkZHJlc3NGcm9tU3RyaW5nAAAAAQIAAAAjM1BBanJUcVlMZ0ZHMjRrUndpeVUzNG5vdW16NHB6MmtYUEsAAAAABGJhbmsCAAAAIzNQRmFjc3Z1VTlzbjJac3RhTENXS1duNDh5VDF2ZkFSUlJVAAAAAA1hY2NlcHRlZFRva2VuAQAAACCDx5KvuFSvDgI1y5lvl1slpMZLfkCDV27XrzwDq+oRHQAAAAAGdXNkbklEAgAAACxERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAEAAAAKY2hlY2tFbnRyeQAAAAIAAAAGcHJlZml4AAAABHV1aWQEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAZwcmVmaXgFAAAABHV1aWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAETk9ORQEAAAAPY2hlY2tFbnRyeUVtYWlsAAAAAgAAAAR1dWlkAAAABmRvbWFpbgQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAEdXVpZAIAAAABQAUAAAAGZG9tYWluAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAABE5PTkUBAAAACWNoZWNrVVVJRAAAAAEAAAAEdXVpZAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAAR1dWlkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAABE5PTkUBAAAAEmNoZWNrSWZXaGl0ZUxpc3RlZAAAAAEAAAANY2FsbGVyQWRkcmVzcwQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQABLAAAAAICAAAAEWFkZHJfV0hJVEVMSVNURURfBQAAAA1jYWxsZXJBZGRyZXNzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAACGlzQWRyZXNzAAAAAQAAAARhZGRyAwMDCQAAAAAAAAIJAAExAAAAAQUAAAAEYWRkcgAAAAAAAAAAIwkAAAAAAAACCQABLwAAAAIFAAAABGFkZHIAAAAAAAAAAAICAAAAAjNQBwYJAAAAAAAAAgkAAS8AAAACBQAAAARhZGRyAAAAAAAAAAACAgAAAAIzTgYJAAAAAAAAAgkAAS8AAAACBQAAAARhZGRyAAAAAAAAAAACAgAAAAIzTQEAAAAMY291bnRQYXJ0aWVzAAAAAgAAAAthY2N1bXVsYXRvcgAAAARhZGRyAwkAAGYAAAACCQABMQAAAAEFAAAABGFkZHIAAAAAAAAAAAAJAABkAAAAAgUAAAALYWNjdW11bGF0b3IAAAAAAAAAAAEJAABkAAAAAgUAAAALYWNjdW11bGF0b3IAAAAAAAAAAAABAAAAFGNoZWNrSWZQZW5kaW5nVG9TaWduAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDADCQAAAAAAAAIFAAAAAWECAAAAB1BFTkRJTkcGBwcBAAAADmdldFZhbHVlU3RyaW5nAAAAAQAAAARqc29uCQABLwAAAAIJAAEwAAAAAgUAAAAEanNvbgAAAAAAAAAAAQkBAAAABXZhbHVlAAAAAQkABLMAAAACCQABMAAAAAIFAAAABGpzb24AAAAAAAAAAAECAAAAASIBAAAACGdldFZhbHVlAAAAAgAAAARqc29uAAAAA2tleQQAAAAIa2V5SW5kZXgJAQAAAAV2YWx1ZQAAAAEJAASzAAAAAgUAAAAEanNvbgkAASwAAAACCQABLAAAAAICAAAAASIFAAAAA2tleQIAAAACIjoEAAAABGRhdGEJAAEwAAAAAgUAAAAEanNvbgkAAGQAAAACCQAAZAAAAAIFAAAACGtleUluZGV4CQABMQAAAAEFAAAAA2tleQAAAAAAAAAAAwQAAAAJanNvblZhbHVlCQEAAAAOZ2V0VmFsdWVTdHJpbmcAAAABBQAAAARkYXRhBQAAAAlqc29uVmFsdWUBAAAAEmdldEpzb25CZWZvcmVWYWx1ZQAAAAIAAAAEanNvbgAAAANrZXkEAAAACGtleUluZGV4CQEAAAAFdmFsdWUAAAABCQAEswAAAAIFAAAABGpzb24JAAEsAAAAAgkAASwAAAACAgAAAAEiBQAAAANrZXkCAAAAAiI6BAAAAARkYXRhCQABLwAAAAIFAAAABGpzb24JAABkAAAAAgkAAGQAAAACBQAAAAhrZXlJbmRleAkAATEAAAABBQAAAANrZXkAAAAAAAAAAAMFAAAABGRhdGEBAAAAEWdldEpzb25BZnRlclZhbHVlAAAAAgAAAARqc29uAAAAA2tleQQAAAAIa2V5SW5kZXgJAQAAAAV2YWx1ZQAAAAEJAASzAAAAAgUAAAAEanNvbgkAASwAAAACCQABLAAAAAICAAAAASIFAAAAA2tleQIAAAACIjoEAAAABGRhdGEJAQAAAAl0YWtlUmlnaHQAAAACBQAAAARqc29uCQAAZQAAAAIJAAExAAAAAQUAAAAEanNvbgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACBQAAAAhrZXlJbmRleAkAATEAAAABBQAAAANrZXkAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAIFAAAABGRhdGEBAAAACGFzU3RyaW5nAAAAAQAAAAJidgQAAAAHJG1hdGNoMAUAAAACYnYDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAADYnYwBQAAAAckbWF0Y2gwBQAAAANidjAJAAACAAAAAQIAAAAkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkAAAABgAAAAZpbnZva2UBAAAAEWZpbGVDZXJ0aWZpY2F0aW9uAAAABQAAAARoYXNoAAAABXRpdGxlAAAABHV1aWQAAAAEZGF0YQAAAAxzaWduZXJQdWJLZXkEAAAAAmlkCQEAAAAHZXh0cmFjdAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAQAAAAKZW50cnlFeGlzdAkBAAAACmNoZWNrRW50cnkAAAACBQAAAARoYXNoBQAAAAR1dWlkBAAAAAl1dWlkRXhpc3QJAQAAAAljaGVja1VVSUQAAAABBQAAAAR1dWlkBAAAAAxjYWxsZXJJc0RhcHAJAAAAAAAAAgUAAAAEdGhpcwgFAAAABmludm9rZQAAAAZjYWxsZXIEAAAADWNhbGxlckFkZHJlc3MDBQAAAAxjYWxsZXJJc0RhcHAJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAAxzaWduZXJQdWJLZXkJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzBAAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQEAAAASY2hlY2tJZldoaXRlTGlzdGVkAAAAAQUAAAANY2FsbGVyQWRkcmVzcwMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAABE5PTkUJAAACAAAAAQIAAAAYVGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0AwkBAAAAAiE9AAAAAgUAAAAJdXVpZEV4aXN0AgAAAAROT05FCQAAAgAAAAECAAAAF1RoaXMgdXVpZCBhbHJlYWR5IGV4aXN0AwkBAAAAAiE9AAAAAgkAATEAAAABBQAAAAR1dWlkAAAAAAAAAAAkCQAAAgAAAAECAAAAHVV1aWQgc2hvdWxkIGJlIDM2IGNoYXJhY3RlcnMuAwkBAAAAAiE9AAAAAgkAATEAAAABBQAAAARoYXNoAAAAAAAAAABACQAAAgAAAAECAAAAHUhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMuAwkAAGYAAAACCQABMQAAAAEFAAAABXRpdGxlAAAAAAAAAABACQAAAgAAAAECAAAAJVRpdGxlIGlzIHRvbyBsb25nLCA2NCBjaGFyYWN0ZXJzIG1heC4DCQAAZgAAAAIFAAAAFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0AAAAAAAAAAAAJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAR1dWlkCQACWAAAAAEFAAAAAmlkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAABGhhc2gFAAAABHV1aWQJAAJYAAAAAQUAAAACaWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAFdGl0bGUFAAAABHV1aWQJAAJYAAAAAQUAAAACaWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgIAAAARYWRkcl9XSElURUxJU1RFRF8FAAAADWNhbGxlckFkZHJlc3MJAABlAAAAAgUAAAAWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIZGF0YV9mY18JAAJYAAAAAQUAAAACaWQCAAAAAV8FAAAADWNhbGxlckFkZHJlc3MFAAAABGRhdGEFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAAFAAAADWFjY2VwdGVkVG9rZW4FAAAAA25pbAMJAQAAAAEhAAAAAQUAAAAMY2FsbGVySXNEYXBwBAAAAAdwYXltZW50CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAZpbnZva2UAAAAHcGF5bWVudAQAAAAGYW1vdW50CQEAAAAHZXh0cmFjdAAAAAEIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAAOcGF5bWVudEFzc2V0SWQDCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkBAAAAB2V4dHJhY3QAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAAAgAAAAECAAAAIFdhdmVzIGlzIG5vdCBhY2NlcHRlZCBhcyBwYXltZW50BAAAAAxjdXJyZW50UHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD3N0b3JhZ2VWZXJpZmllcgkAASwAAAACAgAAABJjZXJ0aWZpY2F0aW9uX2ZlZV8JAAJYAAAAAQkBAAAAB2V4dHJhY3QAAAABBQAAAA5wYXltZW50QXNzZXRJZAMJAQAAAAIhPQAAAAIFAAAADWFjY2VwdGVkVG9rZW4FAAAADnBheW1lbnRBc3NldElkCQAAAgAAAAECAAAAKFRoaXMgdG9rZW4gaXMgbm90IGFjY2VwdGVkIGF0IHRoZSBtb21lbnQDAwkBAAAAAiE9AAAAAgUAAAAGYW1vdW50BQAAAAxjdXJyZW50UHJpY2UJAABnAAAAAgAAAAAAAAAAAAUAAAAWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQcJAAACAAAAAQIAAAASVGhlIHByaWNlIGlzIHdyb25nCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAEdXVpZAkAAlgAAAABBQAAAAJpZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAARoYXNoBQAAAAR1dWlkCQACWAAAAAEFAAAAAmlkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAABXRpdGxlBQAAAAR1dWlkCQACWAAAAAEFAAAAAmlkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhkYXRhX2ZjXwkAAlgAAAABBQAAAAJpZAIAAAABXwUAAAANY2FsbGVyQWRkcmVzcwUAAAAEZGF0YQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAEYmFuawUAAAAGYW1vdW50CAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAeWW91IGFyZSBub3QgYWxsb3dlZCB0byBkbyB0aGF0AAAABmludm9rZQEAAAATcmV2b2tlQ2VydGlmaWNhdGlvbgAAAAIAAAAPY2VydGlmaWNhdGlvbklkAAAADHNpZ25lclB1YktleQQAAAACaWQJAQAAAAdleHRyYWN0AAAAAQgFAAAABmludm9rZQAAAA10cmFuc2FjdGlvbklkBAAAAAxjYWxsZXJJc0RhcHAJAAAAAAAAAgUAAAAEdGhpcwgFAAAABmludm9rZQAAAAZjYWxsZXIEAAAADWNhbGxlckFkZHJlc3MDBQAAAAxjYWxsZXJJc0RhcHAJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAAxzaWduZXJQdWJLZXkJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAplbnRyeUV4aXN0BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGRhdGFfZmNfBQAAAA9jZXJ0aWZpY2F0aW9uSWQCAAAAAV8FAAAADWNhbGxlckFkZHJlc3MDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAETk9ORQQAAAAJaXNSZXZva2VkBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgIAAAAKU1RBVFVTX0ZDXwUAAAAPY2VydGlmaWNhdGlvbklkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAABE5PTkUEAAAAFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0JAQAAABJjaGVja0lmV2hpdGVMaXN0ZWQAAAABBQAAAA1jYWxsZXJBZGRyZXNzBAAAAAduZXdKc29uCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQEAAAAJZHJvcFJpZ2h0AAAAAgUAAAAKZW50cnlFeGlzdAAAAAAAAAAAAQIAAAATLCJzdGF0dXMiOiJSRVZPS0VEXwkAAlgAAAABBQAAAAJpZAIAAAACIn0DCQEAAAACIT0AAAACBQAAAAlpc1Jldm9rZWQCAAAABE5PTkUJAAACAAAAAQIAAAAtVGhpcyBjZXJ0aWZpY2F0aW9uIGhhdmUgYWxyZWFkeSBiZWVuIHJldm9rZWQuAwkAAAAAAAACBQAAAAplbnRyeUV4aXN0AgAAAAROT05FCQAAAgAAAAECAAAAM1lvdSBjYW5ub3QgY2hhbmdlIHRoZSBzdGF0dXMgb2YgdGhpcyBjZXJ0aWZpY2F0aW9uLgMJAABmAAAAAgUAAAAWY2FsbGVySXNXaGl0ZUxpc3RlZE51bQAAAAAAAAAAAAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACAgAAABFhZGRyX1dISVRFTElTVEVEXwUAAAANY2FsbGVyQWRkcmVzcwkAAGUAAAACBQAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAAAAAAAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAICAAAAClNUQVRVU19GQ18FAAAAD2NlcnRpZmljYXRpb25JZAkAASwAAAACAgAAAAhSRVZPS0VEXwkAAlgAAAABBQAAAAJpZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIZGF0YV9mY18FAAAAD2NlcnRpZmljYXRpb25JZAIAAAABXwUAAAANY2FsbGVyQWRkcmVzcwUAAAAHbmV3SnNvbgUAAAADbmlsAwkBAAAAASEAAAABBQAAAAxjYWxsZXJJc0RhcHAEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAABmludm9rZQAAAAdwYXltZW50BAAAAAZhbW91bnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAB3BheW1lbnQAAAAGYW1vdW50BAAAAA5wYXltZW50QXNzZXRJZAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQEAAAAHZXh0cmFjdAAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAgV2F2ZXMgaXMgbm90IGFjY2VwdGVkIGFzIHBheW1lbnQEAAAADGN1cnJlbnRQcmljZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPc3RvcmFnZVZlcmlmaWVyCQABLAAAAAICAAAAEmNlcnRpZmljYXRpb25fZmVlXwkAAlgAAAABCQEAAAAHZXh0cmFjdAAAAAEFAAAADnBheW1lbnRBc3NldElkAwkBAAAAAiE9AAAAAgUAAAANYWNjZXB0ZWRUb2tlbgUAAAAOcGF5bWVudEFzc2V0SWQJAAACAAAAAQIAAAAoVGhpcyB0b2tlbiBpcyBub3QgYWNjZXB0ZWQgYXQgdGhlIG1vbWVudAMDCQEAAAACIT0AAAACBQAAAAZhbW91bnQFAAAADGN1cnJlbnRQcmljZQkAAGcAAAACAAAAAAAAAAAABQAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtBwkAAAIAAAABAgAAABJUaGUgcHJpY2UgaXMgd3JvbmcJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAICAAAAClNUQVRVU19GQ18FAAAAD2NlcnRpZmljYXRpb25JZAkAASwAAAACAgAAAAhSRVZPS0VEXwkAAlgAAAABBQAAAAJpZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIZGF0YV9mY18FAAAAD2NlcnRpZmljYXRpb25JZAIAAAABXwUAAAANY2FsbGVyQWRkcmVzcwUAAAAHbmV3SnNvbgUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAEYmFuawUAAAAGYW1vdW50CAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAeWW91IGFyZSBub3QgYWxsb3dlZCB0byBkbyB0aGF0AAAABmludm9rZQEAAAASZW1haWxDZXJ0aWZpY2F0aW9uAAAABQAAAAZkb21haW4AAAAFdGl0bGUAAAAEdXVpZAAAAARkYXRhAAAADHNpZ25lclB1YktleQQAAAACaWQJAQAAAAdleHRyYWN0AAAAAQgFAAAABmludm9rZQAAAA10cmFuc2FjdGlvbklkBAAAAAplbnRyeUV4aXN0CQEAAAAPY2hlY2tFbnRyeUVtYWlsAAAAAgUAAAAGZG9tYWluBQAAAAR1dWlkBAAAAAl1dWlkRXhpc3QJAQAAAAljaGVja1VVSUQAAAABBQAAAAR1dWlkBAAAAAxjYWxsZXJJc0RhcHAJAAAAAAAAAgUAAAAEdGhpcwgFAAAABmludm9rZQAAAAZjYWxsZXIEAAAADWNhbGxlckFkZHJlc3MDBQAAAAxjYWxsZXJJc0RhcHAJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAAxzaWduZXJQdWJLZXkJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzBAAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQEAAAASY2hlY2tJZldoaXRlTGlzdGVkAAAAAQUAAAANY2FsbGVyQWRkcmVzcwMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAABE5PTkUJAAACAAAAAQIAAAAYVGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0AwkBAAAAAiE9AAAAAgUAAAAJdXVpZEV4aXN0AgAAAAROT05FCQAAAgAAAAECAAAAF1RoaXMgdXVpZCBhbHJlYWR5IGV4aXN0AwkAAGYAAAACCQABMQAAAAEFAAAABHV1aWQAAAAAAAAAACQJAAACAAAAAQIAAAAkVXVpZCBpcyB0b28gbG9uZywgMzYgY2hhcmFjdGVycyBtYXguAwkAAGYAAAACCQABMQAAAAEFAAAABmRvbWFpbgAAAAAAAAAAQAkAAAIAAAABAgAAACZEb21haW4gaXMgdG9vIGxvbmcsIDY0IGNoYXJhY3RlcnMgbWF4LgMJAABmAAAAAgkAATEAAAABBQAAAAV0aXRsZQAAAAAAAAAAQAkAAAIAAAABAgAAACVUaXRsZSBpcyB0b28gbG9uZywgNjQgY2hhcmFjdGVycyBtYXguAwkAAGYAAAACBQAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAAAAAAAAAAACQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAEdXVpZAkAAlgAAAABBQAAAAJpZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAABHV1aWQCAAAAAUAFAAAABmRvbWFpbgkAAlgAAAABBQAAAAJpZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAV0aXRsZQUAAAAEdXVpZAkAAlgAAAABBQAAAAJpZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACAgAAABFhZGRyX1dISVRFTElTVEVEXwUAAAANY2FsbGVyQWRkcmVzcwkAAGUAAAACBQAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAAAAAAAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhkYXRhX2VjXwkAAlgAAAABBQAAAAJpZAIAAAABXwUAAAANY2FsbGVyQWRkcmVzcwUAAAAEZGF0YQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAANY2FsbGVyQWRkcmVzcwAAAAAAAAAAAAUAAAANYWNjZXB0ZWRUb2tlbgUAAAADbmlsAwkBAAAAASEAAAABBQAAAAxjYWxsZXJJc0RhcHAEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAABmludm9rZQAAAAdwYXltZW50BAAAAAZhbW91bnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAB3BheW1lbnQAAAAGYW1vdW50BAAAAA5wYXltZW50QXNzZXRJZAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQEAAAAHZXh0cmFjdAAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAgV2F2ZXMgaXMgbm90IGFjY2VwdGVkIGFzIHBheW1lbnQEAAAADGN1cnJlbnRQcmljZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPc3RvcmFnZVZlcmlmaWVyCQABLAAAAAICAAAAEmNlcnRpZmljYXRpb25fZmVlXwkAAlgAAAABCQEAAAAHZXh0cmFjdAAAAAEFAAAADnBheW1lbnRBc3NldElkAwkBAAAAAiE9AAAAAgUAAAANYWNjZXB0ZWRUb2tlbgUAAAAOcGF5bWVudEFzc2V0SWQJAAACAAAAAQIAAAAoVGhpcyB0b2tlbiBpcyBub3QgYWNjZXB0ZWQgYXQgdGhlIG1vbWVudAMDCQEAAAACIT0AAAACBQAAAAZhbW91bnQFAAAADGN1cnJlbnRQcmljZQkAAGcAAAACAAAAAAAAAAAABQAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtBwkAAAIAAAABAgAAABJUaGUgcHJpY2UgaXMgd3JvbmcJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAR1dWlkCQACWAAAAAEFAAAAAmlkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEdXVpZAIAAAABQAUAAAAGZG9tYWluCQACWAAAAAEFAAAAAmlkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAABXRpdGxlBQAAAAR1dWlkCQACWAAAAAEFAAAAAmlkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhkYXRhX2VjXwkAAlgAAAABBQAAAAJpZAIAAAABXwUAAAANY2FsbGVyQWRkcmVzcwUAAAAEZGF0YQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAEYmFuawUAAAAGYW1vdW50CAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAeWW91IGFyZSBub3QgYWxsb3dlZCB0byBkbyB0aGF0AAAABmludm9rZQEAAAAPY3JlYXRlQWdyZWVtZW50AAAABgAAAARoYXNoAAAABXRpdGxlAAAAD3N0cmluZ2lmaWVkSlNPTgAAAAxjb3VudGVyUGFydHMAAAAMc2lnbmVyUHViS2V5AAAABHV1aWQEAAAAAmlkCQEAAAAHZXh0cmFjdAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAQAAAAKZW50cnlFeGlzdAkBAAAACmNoZWNrRW50cnkAAAACBQAAAARoYXNoBQAAAAR1dWlkBAAAAAl1dWlkRXhpc3QJAQAAAAljaGVja1VVSUQAAAABBQAAAAR1dWlkBAAAAAxjYWxsZXJJc0RhcHAJAAAAAAAAAgUAAAAEdGhpcwgFAAAABmludm9rZQAAAAZjYWxsZXIEAAAADWNhbGxlckFkZHJlc3MDBQAAAAxjYWxsZXJJc0RhcHAJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAAxzaWduZXJQdWJLZXkJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzBAAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQEAAAASY2hlY2tJZldoaXRlTGlzdGVkAAAAAQUAAAANY2FsbGVyQWRkcmVzcwQAAAAESlNPTgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQEAAAASZ2V0SnNvbkJlZm9yZVZhbHVlAAAAAgUAAAAPc3RyaW5naWZpZWRKU09OAgAAAAdjcmVhdG9yAgAAAAEiBQAAAA1jYWxsZXJBZGRyZXNzAgAAAAEiCQEAAAARZ2V0SnNvbkFmdGVyVmFsdWUAAAACBQAAAA9zdHJpbmdpZmllZEpTT04CAAAAB2NyZWF0b3IEAAAADmFkZHJlc3Nlc0FycmF5CQAEtQAAAAIFAAAADGNvdW50ZXJQYXJ0cwIAAAABLAQAAAAOdG90YWxBZGRyZXNzZXMJAAGQAAAAAQUAAAAOYWRkcmVzc2VzQXJyYXkEAAAAD2dsb2JhbERhdGFUaXRsZQkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAFdGl0bGUFAAAABHV1aWQJAAJYAAAAAQUAAAACaWQEAAAADmdsb2JhbERhdGFIYXNoCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAARoYXNoBQAAAAR1dWlkCQACWAAAAAEFAAAAAmlkBAAAAA5nbG9iYWxEYXRhSnNvbgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGRhdGFfTUFfCQACWAAAAAEFAAAAAmlkAgAAAAFfBQAAAA1jYWxsZXJBZGRyZXNzBQAAAARKU09OBAAAAA9nbG9iYWxEYXRhT3duZXIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgUAAAANY2FsbGVyQWRkcmVzcwIAAAAEX01BXwkAAlgAAAABBQAAAAJpZAkAASwAAAACAgAAAAdTSUdORURfCQACWAAAAAEFAAAAAmlkBAAAAA9kYXRhV2hpdGVMaXN0ZWQJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAICAAAAEWFkZHJfV0hJVEVMSVNURURfBQAAAA1jYWxsZXJBZGRyZXNzCQAAZQAAAAIFAAAAFmNhbGxlcklzV2hpdGVMaXN0ZWROdW0JAABkAAAAAgUAAAAOdG90YWxBZGRyZXNzZXMAAAAAAAAAAAEDCQEAAAACIT0AAAACBQAAAAplbnRyeUV4aXN0AgAAAAROT05FCQAAAgAAAAECAAAAGFRoaXMgZW50cnkgYWxyZWFkeSBleGlzdAMJAQAAAAIhPQAAAAIFAAAACXV1aWRFeGlzdAIAAAAETk9ORQkAAAIAAAABAgAAABdUaGlzIHV1aWQgYWxyZWFkeSBleGlzdAMJAABmAAAAAgkAATEAAAABBQAAAAR1dWlkAAAAAAAAAAAkCQAAAgAAAAECAAAAJFV1aWQgaXMgdG9vIGxvbmcsIDM2IGNoYXJhY3RlcnMgbWF4LgMJAABmAAAAAgkAATEAAAABBQAAAARoYXNoAAAAAAAAAABACQAAAgAAAAECAAAAKk1lc3NhZ2UtaWQgaXMgdG9vIGxvbmcsIDY0IGNoYXJhY3RlcnMgbWF4LgMJAABmAAAAAgkAATEAAAABBQAAAAV0aXRsZQAAAAAAAAAAQAkAAAIAAAABAgAAACVUaXRsZSBpcyB0b28gbG9uZywgNjQgY2hhcmFjdGVycyBtYXguAwkAAGYAAAACBQAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtAAAAAAAAAAAAAwkAAGYAAAACCQAAZAAAAAIFAAAADnRvdGFsQWRkcmVzc2VzAAAAAAAAAAABBQAAABZjYWxsZXJJc1doaXRlTGlzdGVkTnVtCQAAAgAAAAECAAAAKllvdSBkb24ndCBoYXZlIGVub3VnaCBjZXJ0aWZpY2F0aW9uIGNyZWRpdAMJAAAAAAAAAgUAAAAOdG90YWxBZGRyZXNzZXMAAAAAAAAAAAYJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIFAAAAD2dsb2JhbERhdGFUaXRsZQkABEwAAAACBQAAAA5nbG9iYWxEYXRhSGFzaAkABEwAAAACBQAAAA5nbG9iYWxEYXRhSnNvbgkABEwAAAACBQAAAA9nbG9iYWxEYXRhT3duZXIJAARMAAAAAgUAAAAPZGF0YVdoaXRlTGlzdGVkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAAZEAAAACBQAAAA5hZGRyZXNzZXNBcnJheQAAAAAAAAAAAAIAAAAEX01BXwkAAlgAAAABBQAAAAJpZAIAAAAHUEVORElORwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAOYWRkcmVzc2VzQXJyYXkAAAAAAAAAAAECAAAABF9NQV8JAAJYAAAAAQUAAAACaWQCAAAAB1BFTkRJTkcJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABkQAAAAIFAAAADmFkZHJlc3Nlc0FycmF5AAAAAAAAAAACAgAAAARfTUFfCQACWAAAAAEFAAAAAmlkAgAAAAdQRU5ESU5HCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAAZEAAAACBQAAAA5hZGRyZXNzZXNBcnJheQAAAAAAAAAAAwIAAAAEX01BXwkAAlgAAAABBQAAAAJpZAIAAAAHUEVORElORwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAOYWRkcmVzc2VzQXJyYXkAAAAAAAAAAAQCAAAABF9NQV8JAAJYAAAAAQUAAAACaWQCAAAAB1BFTkRJTkcJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABkQAAAAIFAAAADmFkZHJlc3Nlc0FycmF5AAAAAAAAAAAFAgAAAARfTUFfCQACWAAAAAEFAAAAAmlkAgAAAAdQRU5ESU5HBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAAABQAAAA1hY2NlcHRlZFRva2VuCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQkAAZEAAAACBQAAAA5hZGRyZXNzZXNBcnJheQAAAAAAAAAAAAAAAAAAAAAAAAUAAAANYWNjZXB0ZWRUb2tlbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEJAAGRAAAAAgUAAAAOYWRkcmVzc2VzQXJyYXkAAAAAAAAAAAEAAAAAAAAAAAAFAAAADWFjY2VwdGVkVG9rZW4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQABkQAAAAIFAAAADmFkZHJlc3Nlc0FycmF5AAAAAAAAAAACAAAAAAAAAAAABQAAAA1hY2NlcHRlZFRva2VuCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQkAAZEAAAACBQAAAA5hZGRyZXNzZXNBcnJheQAAAAAAAAAAAwAAAAAAAAAAAAUAAAANYWNjZXB0ZWRUb2tlbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEJAAGRAAAAAgUAAAAOYWRkcmVzc2VzQXJyYXkAAAAAAAAAAAQAAAAAAAAAAAAFAAAADWFjY2VwdGVkVG9rZW4JAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQABkQAAAAIFAAAADmFkZHJlc3Nlc0FycmF5AAAAAAAAAAAFAAAAAAAAAAAABQAAAA1hY2NlcHRlZFRva2VuBQAAAANuaWwDCQAAAAAAAAIFAAAADnRvdGFsQWRk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", "height": 1404220, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BmgZXYK1BSEmyubpSzjB4Ly3JaAgP7nc139QWK9GKpF3 Next: none Diff:
OldNewDifferences
99
1010 let usdnID = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
1111
12+func checkEntry (prefix,uuid) = match getString(this, (prefix + uuid)) {
13+ case a: String =>
14+ a
15+ case _ =>
16+ "NONE"
17+}
18+
19+
20+func checkEntryEmail (uuid,domain) = match getString(this, ((uuid + "@") + domain)) {
21+ case a: String =>
22+ a
23+ case _ =>
24+ "NONE"
25+}
26+
27+
28+func checkUUID (uuid) = match getString(this, uuid) {
29+ case a: String =>
30+ a
31+ case _ =>
32+ "NONE"
33+}
34+
35+
36+func checkIfWhiteListed (callerAddress) = match getInteger(this, ("addr_WHITELISTED_" + callerAddress)) {
37+ case a: Int =>
38+ a
39+ case _ =>
40+ 0
41+}
42+
43+
44+func isAdress (addr) = if (if (if ((size(addr) == 35))
45+ then (take(addr, 2) == "3P")
46+ else false)
47+ then true
48+ else (take(addr, 2) == "3N"))
49+ then true
50+ else (take(addr, 2) == "3M")
51+
52+
53+func countParties (accumulator,addr) = if ((size(addr) > 0))
54+ then (accumulator + 1)
55+ else (accumulator + 0)
56+
57+
58+func checkIfPendingToSign (key) = match getString(this, key) {
59+ case a: String =>
60+ if ((a == "PENDING"))
61+ then true
62+ else false
63+ case _ =>
64+ false
65+}
66+
67+
68+func getValueString (json) = take(drop(json, 1), value(indexOf(drop(json, 1), "\"")))
69+
70+
71+func getValue (json,key) = {
72+ let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
73+ let data = drop(json, ((keyIndex + size(key)) + 3))
74+ let jsonValue = getValueString(data)
75+ jsonValue
76+ }
77+
78+
79+func getJsonBeforeValue (json,key) = {
80+ let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
81+ let data = take(json, ((keyIndex + size(key)) + 3))
82+ data
83+ }
84+
85+
86+func getJsonAfterValue (json,key) = {
87+ let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
88+ let data = takeRight(json, (size(json) - ((((keyIndex + size(key)) + 3) + 0) + 2)))
89+ data
90+ }
91+
92+
93+func asString (bv) = match bv {
94+ case bv0: String =>
95+ bv0
96+ case _ =>
97+ throw("Sponsored Public Key String expected")
98+}
99+
100+
101+@Callable(invoke)
102+func fileCertification (hash,title,uuid,data,signerPubKey) = {
103+ let id = extract(invoke.transactionId)
104+ let entryExist = checkEntry(hash, uuid)
105+ let uuidExist = checkUUID(uuid)
106+ let callerIsDapp = (this == invoke.caller)
107+ let callerAddress = if (callerIsDapp)
108+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
109+ else toBase58String(invoke.caller.bytes)
110+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
111+ if ((entryExist != "NONE"))
112+ then throw("This entry already exist")
113+ else if ((uuidExist != "NONE"))
114+ then throw("This uuid already exist")
115+ else if ((size(uuid) != 36))
116+ then throw("Uuid should be 36 characters.")
117+ else if ((size(hash) != 64))
118+ then throw("Hash should be 64 characters.")
119+ else if ((size(title) > 64))
120+ then throw("Title is too long, 64 characters max.")
121+ else if ((callerIsWhiteListedNum > 0))
122+ then ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry((hash + uuid), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), DataEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]))
123+ else if (!(callerIsDapp))
124+ then {
125+ let payment = extract(invoke.payment)
126+ let amount = extract(payment.amount)
127+ let paymentAssetId = if (isDefined(payment.assetId))
128+ then extract(payment.assetId)
129+ else throw("Waves is not accepted as payment")
130+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
131+ if ((acceptedToken != paymentAssetId))
132+ then throw("This token is not accepted at the moment")
133+ else if (if ((amount != currentPrice))
134+ then (0 >= callerIsWhiteListedNum)
135+ else false)
136+ then throw("The price is wrong")
137+ else ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry((hash + uuid), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]))
138+ }
139+ else throw("You are not allowed to do that")
140+ }
141+
142+
143+
144+@Callable(invoke)
145+func revokeCertification (certificationId,signerPubKey) = {
146+ let id = extract(invoke.transactionId)
147+ let callerIsDapp = (this == invoke.caller)
148+ let callerAddress = if (callerIsDapp)
149+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
150+ else toBase58String(invoke.caller.bytes)
151+ let entryExist = match getString(this, ((("data_fc_" + certificationId) + "_") + callerAddress)) {
152+ case a: String =>
153+ a
154+ case _ =>
155+ "NONE"
156+ }
157+ let isRevoked = match getString(this, ("STATUS_FC_" + certificationId)) {
158+ case a: String =>
159+ a
160+ case _ =>
161+ "NONE"
162+ }
163+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
164+ let newJson = (((dropRight(entryExist, 1) + ",\"status\":\"REVOKED_") + toBase58String(id)) + "\"}")
165+ if ((isRevoked != "NONE"))
166+ then throw("This certification have already been revoked.")
167+ else if ((entryExist == "NONE"))
168+ then throw("You cannot change the status of this certification.")
169+ else if ((callerIsWhiteListedNum > 0))
170+ then WriteSet([DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), DataEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), DataEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson)])
171+ else if (!(callerIsDapp))
172+ then {
173+ let payment = extract(invoke.payment)
174+ let amount = extract(payment.amount)
175+ let paymentAssetId = if (isDefined(payment.assetId))
176+ then extract(payment.assetId)
177+ else throw("Waves is not accepted as payment")
178+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
179+ if ((acceptedToken != paymentAssetId))
180+ then throw("This token is not accepted at the moment")
181+ else if (if ((amount != currentPrice))
182+ then (0 >= callerIsWhiteListedNum)
183+ else false)
184+ then throw("The price is wrong")
185+ else ScriptResult(WriteSet([DataEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), DataEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson)]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]))
186+ }
187+ else throw("You are not allowed to do that")
188+ }
189+
190+
191+
192+@Callable(invoke)
193+func emailCertification (domain,title,uuid,data,signerPubKey) = {
194+ let id = extract(invoke.transactionId)
195+ let entryExist = checkEntryEmail(domain, uuid)
196+ let uuidExist = checkUUID(uuid)
197+ let callerIsDapp = (this == invoke.caller)
198+ let callerAddress = if (callerIsDapp)
199+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
200+ else toBase58String(invoke.caller.bytes)
201+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
202+ if ((entryExist != "NONE"))
203+ then throw("This entry already exist")
204+ else if ((uuidExist != "NONE"))
205+ then throw("This uuid already exist")
206+ else if ((size(uuid) > 36))
207+ then throw("Uuid is too long, 36 characters max.")
208+ else if ((size(domain) > 64))
209+ then throw("Domain is too long, 64 characters max.")
210+ else if ((size(title) > 64))
211+ then throw("Title is too long, 64 characters max.")
212+ else if ((callerIsWhiteListedNum > 0))
213+ then ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry(((uuid + "@") + domain), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), DataEntry(((("data_ec_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]))
214+ else if (!(callerIsDapp))
215+ then {
216+ let payment = extract(invoke.payment)
217+ let amount = extract(payment.amount)
218+ let paymentAssetId = if (isDefined(payment.assetId))
219+ then extract(payment.assetId)
220+ else throw("Waves is not accepted as payment")
221+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
222+ if ((acceptedToken != paymentAssetId))
223+ then throw("This token is not accepted at the moment")
224+ else if (if ((amount != currentPrice))
225+ then (0 >= callerIsWhiteListedNum)
226+ else false)
227+ then throw("The price is wrong")
228+ else ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry(((uuid + "@") + domain), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(((("data_ec_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]))
229+ }
230+ else throw("You are not allowed to do that")
231+ }
232+
233+
234+
235+@Callable(invoke)
236+func createAgreement (hash,title,stringifiedJSON,counterParts,signerPubKey,uuid) = {
237+ let id = extract(invoke.transactionId)
238+ let entryExist = checkEntry(hash, uuid)
239+ let uuidExist = checkUUID(uuid)
240+ let callerIsDapp = (this == invoke.caller)
241+ let callerAddress = if (callerIsDapp)
242+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
243+ else toBase58String(invoke.caller.bytes)
244+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
245+ let JSON = ((((getJsonBeforeValue(stringifiedJSON, "creator") + "\"") + callerAddress) + "\"") + getJsonAfterValue(stringifiedJSON, "creator"))
246+ let addressesArray = split(counterParts, ",")
247+ let totalAddresses = size(addressesArray)
248+ let globalDataTitle = DataEntry((title + uuid), toBase58String(id))
249+ let globalDataHash = DataEntry((hash + uuid), toBase58String(id))
250+ let globalDataJson = DataEntry(((("data_MA_" + toBase58String(id)) + "_") + callerAddress), JSON)
251+ let globalDataOwner = DataEntry(((callerAddress + "_MA_") + toBase58String(id)), ("SIGNED_" + toBase58String(id)))
252+ let dataWhiteListed = DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - (totalAddresses + 1)))
253+ if ((entryExist != "NONE"))
254+ then throw("This entry already exist")
255+ else if ((uuidExist != "NONE"))
256+ then throw("This uuid already exist")
257+ else if ((size(uuid) > 36))
258+ then throw("Uuid is too long, 36 characters max.")
259+ else if ((size(hash) > 64))
260+ then throw("Message-id is too long, 64 characters max.")
261+ else if ((size(title) > 64))
262+ then throw("Title is too long, 64 characters max.")
263+ else if ((callerIsWhiteListedNum > 0))
264+ then if (((totalAddresses + 1) > callerIsWhiteListedNum))
265+ then throw("You don't have enough certification credit")
266+ else if ((totalAddresses == 6))
267+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[5] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[5]), 0, acceptedToken)]))
268+ else if ((totalAddresses == 5))
269+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken)]))
270+ else if ((totalAddresses == 4))
271+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken)]))
272+ else if ((totalAddresses == 3))
273+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken)]))
274+ else if ((totalAddresses == 2))
275+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken)]))
276+ else if ((totalAddresses == 1))
277+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken)]))
278+ else throw("Wrong number of participants")
279+ else if (!(callerIsDapp))
280+ then {
281+ let payment = extract(invoke.payment)
282+ let amount = if (isDefined(payment.amount))
283+ then extract(payment.amount)
284+ else 0
285+ let paymentAssetId = if (isDefined(payment.assetId))
286+ then extract(payment.assetId)
287+ else acceptedToken
288+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
289+ if (((currentPrice * (totalAddresses + 1)) > amount))
290+ then throw(("The price is wrong, it should be " + toString((currentPrice * (totalAddresses + 1)))))
291+ else if ((totalAddresses == 6))
292+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[5] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[5]), 0, acceptedToken)]))
293+ else if ((totalAddresses == 5))
294+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken)]))
295+ else if ((totalAddresses == 4))
296+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken)]))
297+ else if ((totalAddresses == 3))
298+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken)]))
299+ else if ((totalAddresses == 2))
300+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken)]))
301+ else if ((totalAddresses == 1))
302+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken)]))
303+ else throw(("Needs 1 to 6 recipient addresses, currently sent: " + toString(totalAddresses)))
304+ }
305+ else throw("You are not allowed to do that")
306+ }
307+
308+
309+
310+@Callable(invoke)
311+func signAgreement (hash,agreementId,signerPubKey) = {
312+ let payment = extract(invoke.payment)
313+ let amount = extract(payment.amount)
314+ let id = extract(invoke.transactionId)
315+ let callerIsDapp = (this == invoke.caller)
316+ let signer = if (callerIsDapp)
317+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
318+ else toBase58String(invoke.caller.bytes)
319+ let signingRequestExist = checkIfPendingToSign(((signer + "_MA_") + agreementId))
320+ if (!(signingRequestExist))
321+ then throw("Sorry there is no pending signature")
322+ else ScriptResult(WriteSet([DataEntry(((signer + "_MA_") + agreementId), ("SIGNED_" + toBase58String(id)))]), TransferSet([ScriptTransfer(addressFromStringValue(signer), 0, acceptedToken)]))
323+ }
324+
325+
326+
327+@Callable(invoke)
328+func usdnSignCredits () = {
329+ let payment = extract(invoke.payment)
330+ let callerAddress = toBase58String(invoke.caller.bytes)
331+ let tokenId = extract(payment.assetId)
332+ let amount = extract(payment.amount)
333+ let numberOfCredits = ((amount * 2) / 1000000)
334+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
335+ if ((toBase58String(tokenId) != usdnID))
336+ then throw("Only USDN can be exchanged")
337+ else if (if (((amount % 1000000) != 0))
338+ then ((amount % 1000000) != 500000)
339+ else false)
340+ then throw(((("You can only exchange multiple of 0.5, you sent:" + dropRight(toString(amount), 6)) + ".") + takeRight(toString(amount), 6)))
341+ else ScriptResult(WriteSet([DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum + numberOfCredits))]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, tokenId)]))
342+ }
343+
12344
13345 @Verifier(tx)
14-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
346+func verifier () = match tx {
347+ case inv: InvokeScriptTransaction =>
348+ if (if (if ((inv.function == "fileCertification"))
349+ then true
350+ else (inv.function == "emailCertification"))
351+ then true
352+ else (inv.function == "createAgreement"))
353+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
354+ else if ((inv.function == "signAgreement"))
355+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[2])))
356+ else if ((inv.function == "revokeCertification"))
357+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[1])))
358+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
359+ case _ =>
360+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
361+}
15362
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let storageVerifier = extract(addressFromString("3PAjrTqYLgFG24kRwiyU34noumz4pz2kXPK"))
55
66 let bank = "3PFacsvuU9sn2ZstaLCWKWn48yT1vfARRRU"
77
88 let acceptedToken = base58'9sQutD5HnRvjM1uui5cVC4w9xkMPAfYEV8ymug3Mon2Y'
99
1010 let usdnID = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
1111
12+func checkEntry (prefix,uuid) = match getString(this, (prefix + uuid)) {
13+ case a: String =>
14+ a
15+ case _ =>
16+ "NONE"
17+}
18+
19+
20+func checkEntryEmail (uuid,domain) = match getString(this, ((uuid + "@") + domain)) {
21+ case a: String =>
22+ a
23+ case _ =>
24+ "NONE"
25+}
26+
27+
28+func checkUUID (uuid) = match getString(this, uuid) {
29+ case a: String =>
30+ a
31+ case _ =>
32+ "NONE"
33+}
34+
35+
36+func checkIfWhiteListed (callerAddress) = match getInteger(this, ("addr_WHITELISTED_" + callerAddress)) {
37+ case a: Int =>
38+ a
39+ case _ =>
40+ 0
41+}
42+
43+
44+func isAdress (addr) = if (if (if ((size(addr) == 35))
45+ then (take(addr, 2) == "3P")
46+ else false)
47+ then true
48+ else (take(addr, 2) == "3N"))
49+ then true
50+ else (take(addr, 2) == "3M")
51+
52+
53+func countParties (accumulator,addr) = if ((size(addr) > 0))
54+ then (accumulator + 1)
55+ else (accumulator + 0)
56+
57+
58+func checkIfPendingToSign (key) = match getString(this, key) {
59+ case a: String =>
60+ if ((a == "PENDING"))
61+ then true
62+ else false
63+ case _ =>
64+ false
65+}
66+
67+
68+func getValueString (json) = take(drop(json, 1), value(indexOf(drop(json, 1), "\"")))
69+
70+
71+func getValue (json,key) = {
72+ let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
73+ let data = drop(json, ((keyIndex + size(key)) + 3))
74+ let jsonValue = getValueString(data)
75+ jsonValue
76+ }
77+
78+
79+func getJsonBeforeValue (json,key) = {
80+ let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
81+ let data = take(json, ((keyIndex + size(key)) + 3))
82+ data
83+ }
84+
85+
86+func getJsonAfterValue (json,key) = {
87+ let keyIndex = value(indexOf(json, (("\"" + key) + "\":")))
88+ let data = takeRight(json, (size(json) - ((((keyIndex + size(key)) + 3) + 0) + 2)))
89+ data
90+ }
91+
92+
93+func asString (bv) = match bv {
94+ case bv0: String =>
95+ bv0
96+ case _ =>
97+ throw("Sponsored Public Key String expected")
98+}
99+
100+
101+@Callable(invoke)
102+func fileCertification (hash,title,uuid,data,signerPubKey) = {
103+ let id = extract(invoke.transactionId)
104+ let entryExist = checkEntry(hash, uuid)
105+ let uuidExist = checkUUID(uuid)
106+ let callerIsDapp = (this == invoke.caller)
107+ let callerAddress = if (callerIsDapp)
108+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
109+ else toBase58String(invoke.caller.bytes)
110+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
111+ if ((entryExist != "NONE"))
112+ then throw("This entry already exist")
113+ else if ((uuidExist != "NONE"))
114+ then throw("This uuid already exist")
115+ else if ((size(uuid) != 36))
116+ then throw("Uuid should be 36 characters.")
117+ else if ((size(hash) != 64))
118+ then throw("Hash should be 64 characters.")
119+ else if ((size(title) > 64))
120+ then throw("Title is too long, 64 characters max.")
121+ else if ((callerIsWhiteListedNum > 0))
122+ then ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry((hash + uuid), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), DataEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]))
123+ else if (!(callerIsDapp))
124+ then {
125+ let payment = extract(invoke.payment)
126+ let amount = extract(payment.amount)
127+ let paymentAssetId = if (isDefined(payment.assetId))
128+ then extract(payment.assetId)
129+ else throw("Waves is not accepted as payment")
130+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
131+ if ((acceptedToken != paymentAssetId))
132+ then throw("This token is not accepted at the moment")
133+ else if (if ((amount != currentPrice))
134+ then (0 >= callerIsWhiteListedNum)
135+ else false)
136+ then throw("The price is wrong")
137+ else ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry((hash + uuid), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(((("data_fc_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]))
138+ }
139+ else throw("You are not allowed to do that")
140+ }
141+
142+
143+
144+@Callable(invoke)
145+func revokeCertification (certificationId,signerPubKey) = {
146+ let id = extract(invoke.transactionId)
147+ let callerIsDapp = (this == invoke.caller)
148+ let callerAddress = if (callerIsDapp)
149+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
150+ else toBase58String(invoke.caller.bytes)
151+ let entryExist = match getString(this, ((("data_fc_" + certificationId) + "_") + callerAddress)) {
152+ case a: String =>
153+ a
154+ case _ =>
155+ "NONE"
156+ }
157+ let isRevoked = match getString(this, ("STATUS_FC_" + certificationId)) {
158+ case a: String =>
159+ a
160+ case _ =>
161+ "NONE"
162+ }
163+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
164+ let newJson = (((dropRight(entryExist, 1) + ",\"status\":\"REVOKED_") + toBase58String(id)) + "\"}")
165+ if ((isRevoked != "NONE"))
166+ then throw("This certification have already been revoked.")
167+ else if ((entryExist == "NONE"))
168+ then throw("You cannot change the status of this certification.")
169+ else if ((callerIsWhiteListedNum > 0))
170+ then WriteSet([DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), DataEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), DataEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson)])
171+ else if (!(callerIsDapp))
172+ then {
173+ let payment = extract(invoke.payment)
174+ let amount = extract(payment.amount)
175+ let paymentAssetId = if (isDefined(payment.assetId))
176+ then extract(payment.assetId)
177+ else throw("Waves is not accepted as payment")
178+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
179+ if ((acceptedToken != paymentAssetId))
180+ then throw("This token is not accepted at the moment")
181+ else if (if ((amount != currentPrice))
182+ then (0 >= callerIsWhiteListedNum)
183+ else false)
184+ then throw("The price is wrong")
185+ else ScriptResult(WriteSet([DataEntry(("STATUS_FC_" + certificationId), ("REVOKED_" + toBase58String(id))), DataEntry(((("data_fc_" + certificationId) + "_") + callerAddress), newJson)]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]))
186+ }
187+ else throw("You are not allowed to do that")
188+ }
189+
190+
191+
192+@Callable(invoke)
193+func emailCertification (domain,title,uuid,data,signerPubKey) = {
194+ let id = extract(invoke.transactionId)
195+ let entryExist = checkEntryEmail(domain, uuid)
196+ let uuidExist = checkUUID(uuid)
197+ let callerIsDapp = (this == invoke.caller)
198+ let callerAddress = if (callerIsDapp)
199+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
200+ else toBase58String(invoke.caller.bytes)
201+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
202+ if ((entryExist != "NONE"))
203+ then throw("This entry already exist")
204+ else if ((uuidExist != "NONE"))
205+ then throw("This uuid already exist")
206+ else if ((size(uuid) > 36))
207+ then throw("Uuid is too long, 36 characters max.")
208+ else if ((size(domain) > 64))
209+ then throw("Domain is too long, 64 characters max.")
210+ else if ((size(title) > 64))
211+ then throw("Title is too long, 64 characters max.")
212+ else if ((callerIsWhiteListedNum > 0))
213+ then ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry(((uuid + "@") + domain), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - 1)), DataEntry(((("data_ec_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken)]))
214+ else if (!(callerIsDapp))
215+ then {
216+ let payment = extract(invoke.payment)
217+ let amount = extract(payment.amount)
218+ let paymentAssetId = if (isDefined(payment.assetId))
219+ then extract(payment.assetId)
220+ else throw("Waves is not accepted as payment")
221+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
222+ if ((acceptedToken != paymentAssetId))
223+ then throw("This token is not accepted at the moment")
224+ else if (if ((amount != currentPrice))
225+ then (0 >= callerIsWhiteListedNum)
226+ else false)
227+ then throw("The price is wrong")
228+ else ScriptResult(WriteSet([DataEntry(uuid, toBase58String(id)), DataEntry(((uuid + "@") + domain), toBase58String(id)), DataEntry((title + uuid), toBase58String(id)), DataEntry(((("data_ec_" + toBase58String(id)) + "_") + callerAddress), data)]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, payment.assetId)]))
229+ }
230+ else throw("You are not allowed to do that")
231+ }
232+
233+
234+
235+@Callable(invoke)
236+func createAgreement (hash,title,stringifiedJSON,counterParts,signerPubKey,uuid) = {
237+ let id = extract(invoke.transactionId)
238+ let entryExist = checkEntry(hash, uuid)
239+ let uuidExist = checkUUID(uuid)
240+ let callerIsDapp = (this == invoke.caller)
241+ let callerAddress = if (callerIsDapp)
242+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
243+ else toBase58String(invoke.caller.bytes)
244+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
245+ let JSON = ((((getJsonBeforeValue(stringifiedJSON, "creator") + "\"") + callerAddress) + "\"") + getJsonAfterValue(stringifiedJSON, "creator"))
246+ let addressesArray = split(counterParts, ",")
247+ let totalAddresses = size(addressesArray)
248+ let globalDataTitle = DataEntry((title + uuid), toBase58String(id))
249+ let globalDataHash = DataEntry((hash + uuid), toBase58String(id))
250+ let globalDataJson = DataEntry(((("data_MA_" + toBase58String(id)) + "_") + callerAddress), JSON)
251+ let globalDataOwner = DataEntry(((callerAddress + "_MA_") + toBase58String(id)), ("SIGNED_" + toBase58String(id)))
252+ let dataWhiteListed = DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum - (totalAddresses + 1)))
253+ if ((entryExist != "NONE"))
254+ then throw("This entry already exist")
255+ else if ((uuidExist != "NONE"))
256+ then throw("This uuid already exist")
257+ else if ((size(uuid) > 36))
258+ then throw("Uuid is too long, 36 characters max.")
259+ else if ((size(hash) > 64))
260+ then throw("Message-id is too long, 64 characters max.")
261+ else if ((size(title) > 64))
262+ then throw("Title is too long, 64 characters max.")
263+ else if ((callerIsWhiteListedNum > 0))
264+ then if (((totalAddresses + 1) > callerIsWhiteListedNum))
265+ then throw("You don't have enough certification credit")
266+ else if ((totalAddresses == 6))
267+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[5] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[5]), 0, acceptedToken)]))
268+ else if ((totalAddresses == 5))
269+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken)]))
270+ else if ((totalAddresses == 4))
271+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken)]))
272+ else if ((totalAddresses == 3))
273+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken)]))
274+ else if ((totalAddresses == 2))
275+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken)]))
276+ else if ((totalAddresses == 1))
277+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, dataWhiteListed, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(callerAddress), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken)]))
278+ else throw("Wrong number of participants")
279+ else if (!(callerIsDapp))
280+ then {
281+ let payment = extract(invoke.payment)
282+ let amount = if (isDefined(payment.amount))
283+ then extract(payment.amount)
284+ else 0
285+ let paymentAssetId = if (isDefined(payment.assetId))
286+ then extract(payment.assetId)
287+ else acceptedToken
288+ let currentPrice = getIntegerValue(storageVerifier, ("certification_fee_" + toBase58String(extract(paymentAssetId))))
289+ if (((currentPrice * (totalAddresses + 1)) > amount))
290+ then throw(("The price is wrong, it should be " + toString((currentPrice * (totalAddresses + 1)))))
291+ else if ((totalAddresses == 6))
292+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[5] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[5]), 0, acceptedToken)]))
293+ else if ((totalAddresses == 5))
294+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[4] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[4]), 0, acceptedToken)]))
295+ else if ((totalAddresses == 4))
296+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[3] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[3]), 0, acceptedToken)]))
297+ else if ((totalAddresses == 3))
298+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[2] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[2]), 0, acceptedToken)]))
299+ else if ((totalAddresses == 2))
300+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING"), DataEntry(((addressesArray[1] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[1]), 0, acceptedToken)]))
301+ else if ((totalAddresses == 1))
302+ then ScriptResult(WriteSet([globalDataTitle, globalDataHash, globalDataJson, globalDataOwner, DataEntry(((addressesArray[0] + "_MA_") + toBase58String(id)), "PENDING")]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, acceptedToken), ScriptTransfer(addressFromStringValue(addressesArray[0]), 0, acceptedToken)]))
303+ else throw(("Needs 1 to 6 recipient addresses, currently sent: " + toString(totalAddresses)))
304+ }
305+ else throw("You are not allowed to do that")
306+ }
307+
308+
309+
310+@Callable(invoke)
311+func signAgreement (hash,agreementId,signerPubKey) = {
312+ let payment = extract(invoke.payment)
313+ let amount = extract(payment.amount)
314+ let id = extract(invoke.transactionId)
315+ let callerIsDapp = (this == invoke.caller)
316+ let signer = if (callerIsDapp)
317+ then toString(addressFromPublicKey(fromBase58String(signerPubKey)))
318+ else toBase58String(invoke.caller.bytes)
319+ let signingRequestExist = checkIfPendingToSign(((signer + "_MA_") + agreementId))
320+ if (!(signingRequestExist))
321+ then throw("Sorry there is no pending signature")
322+ else ScriptResult(WriteSet([DataEntry(((signer + "_MA_") + agreementId), ("SIGNED_" + toBase58String(id)))]), TransferSet([ScriptTransfer(addressFromStringValue(signer), 0, acceptedToken)]))
323+ }
324+
325+
326+
327+@Callable(invoke)
328+func usdnSignCredits () = {
329+ let payment = extract(invoke.payment)
330+ let callerAddress = toBase58String(invoke.caller.bytes)
331+ let tokenId = extract(payment.assetId)
332+ let amount = extract(payment.amount)
333+ let numberOfCredits = ((amount * 2) / 1000000)
334+ let callerIsWhiteListedNum = checkIfWhiteListed(callerAddress)
335+ if ((toBase58String(tokenId) != usdnID))
336+ then throw("Only USDN can be exchanged")
337+ else if (if (((amount % 1000000) != 0))
338+ then ((amount % 1000000) != 500000)
339+ else false)
340+ then throw(((("You can only exchange multiple of 0.5, you sent:" + dropRight(toString(amount), 6)) + ".") + takeRight(toString(amount), 6)))
341+ else ScriptResult(WriteSet([DataEntry(("addr_WHITELISTED_" + callerAddress), (callerIsWhiteListedNum + numberOfCredits))]), TransferSet([ScriptTransfer(addressFromStringValue(bank), amount, tokenId)]))
342+ }
343+
12344
13345 @Verifier(tx)
14-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
346+func verifier () = match tx {
347+ case inv: InvokeScriptTransaction =>
348+ if (if (if ((inv.function == "fileCertification"))
349+ then true
350+ else (inv.function == "emailCertification"))
351+ then true
352+ else (inv.function == "createAgreement"))
353+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
354+ else if ((inv.function == "signAgreement"))
355+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[2])))
356+ else if ((inv.function == "revokeCertification"))
357+ then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[1])))
358+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
359+ case _ =>
360+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
361+}
15362

github/deemru/w8io/026f985 
47.97 ms