tx · 9ZdiNFNBApYFd83si241H2Wm4DHytKQReiZzbsio9Ra7

3MzQVx1rYXSB757dQFrZ6jaU4Tp5v2sLatn:  -0.01000000 Waves

2019.07.08 15:28 [576628] smart account 3MzQVx1rYXSB757dQFrZ6jaU4Tp5v2sLatn > SELF 0.00000000 Waves

{ "type": 13, "id": "9ZdiNFNBApYFd83si241H2Wm4DHytKQReiZzbsio9Ra7", "fee": 1000000, "feeAssetId": null, "timestamp": 1562588896743, "version": 1, "sender": "3MzQVx1rYXSB757dQFrZ6jaU4Tp5v2sLatn", "senderPublicKey": "5th9aCnLWp6ZmUCSEtMPvn6w8BSR7ExcjEtVA8g4Ri5g", "proofs": [ "4qcQfnvm4JrXFUDr6JnFUSQgu3mcw9Wp2YSaCE9bSZi8Ev8BXUXSr2YYuKjoxDd4hTwAGxWHN65zfcRDFNc2yMFQ" ], "script": "base64:AAIDAAAAAAAAAAAAAAAGAQAAABBnZXRTdHJpbmdGcm9tS2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAA3N0cgUAAAAHJG1hdGNoMAUAAAADc3RyCQAAAgAAAAECAAAAGk5vIHN0cmluZyBmb3VuZCBmb3IgZW50cnkhAQAAABdnZXRTdHJpbmdGcm9tS2V5T3JFbXB0eQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAANzdHIFAAAAByRtYXRjaDAFAAAAA3N0cgIAAAAAAQAAAA1nZXRJbnRGcm9tS2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAW4FAAAAByRtYXRjaDAFAAAAAW4AAAAAAAAAAAABAAAAEmNoYW5uZWxJc0luaXRpYXRlZAAAAAAEAAAADGZpcnN0QWRkcmVzcwkBAAAAEGdldFN0cmluZ0Zyb21LZXkAAAABAgAAAAxmaXJzdEFkZHJlc3MEAAAADXNlY29uZEFkZHJlc3MJAQAAABBnZXRTdHJpbmdGcm9tS2V5AAAAAQIAAAANc2Vjb25kQWRkcmVzcwQAAAAQZmlyc3RDb3VudGVyUGFydAkBAAAAEGdldFN0cmluZ0Zyb21LZXkAAAABCQABLAAAAAIFAAAADGZpcnN0QWRkcmVzcwIAAAAMX2NvdW50ZXJwYXJ0BAAAABFzZWNvbmRDb3VudGVycGFydAkBAAAAEGdldFN0cmluZ0Zyb21LZXkAAAABCQABLAAAAAIFAAAADXNlY29uZEFkZHJlc3MCAAAADF9jb3VudGVycGFydAkAAGYAAAACCQEAAAANZ2V0SW50RnJvbUtleQAAAAECAAAADnRpbWVsb2NrUGVyaW9kAAAAAAAAAAAAAQAAABBjbG9zaW5nSW5pdGlhdGVkAAAAAAQAAAAJaW5pdGlhdG9yCQEAAAAQZ2V0U3RyaW5nRnJvbUtleQAAAAECAAAAFGNsb3NpbmdfaW5pdGlhdGVkX2J5CQEAAAACIT0AAAACBQAAAAlpbml0aWF0b3ICAAAAAAEAAAATY2hlY2tJZlZhbGlkQWNjb3VudAAAAAEAAAAGc2VuZGVyBAAAAAxmaXJzdEFkZHJlc3MJAQAAABBnZXRTdHJpbmdGcm9tS2V5AAAAAQIAAAAMZmlyc3RBZGRyZXNzBAAAAA1zZWNvbmRBZGRyZXNzCQEAAAAQZ2V0U3RyaW5nRnJvbUtleQAAAAECAAAADXNlY29uZEFkZHJlc3MDAwkBAAAAAiE9AAAAAgUAAAAMZmlyc3RBZGRyZXNzBQAAAAZzZW5kZXIJAQAAAAIhPQAAAAIFAAAADXNlY29uZEFkZHJlc3MFAAAABnNlbmRlcgcHBgAAAAYAAAABaQEAAAANY2xhaW1DaGVhdGluZwAAAAYAAAAKcmVjaXBpZW50QQAAABBhbW91bnRSZWNpcGllbnRBAAAACnJlY2lwaWVudEIAAAAQYW1vdW50UmVjaXBpZW50QgAAAAl0aW1lc3RhbXAAAAAJc2lnbmF0dXJlBAAAAAZzZW5kZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAALdmFsaWRTZW5kZXIJAQAAABNjaGVja0lmVmFsaWRBY2NvdW50AAAAAQUAAAAGc2VuZGVyBAAAAA5vcmlnaW5hbFN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAApyZWNpcGllbnRBCQABpAAAAAEFAAAAEGFtb3VudFJlY2lwaWVudEEFAAAACnJlY2lwaWVudEIJAAGkAAAAAQUAAAAQYW1vdW50UmVjaXBpZW50QgkAAaQAAAABBQAAAAl0aW1lc3RhbXAEAAAAC2NvdW50ZXJQYXJ0CQEAAAAQZ2V0U3RyaW5nRnJvbUtleQAAAAEJAAEsAAAAAgUAAAAGc2VuZGVyAgAAAAxfY291bnRlcnBhcnQEAAAAE3NpZ25lZEJ5Q291bnRlcnBhcnQJAAH0AAAAAwkAAZsAAAABBQAAAA5vcmlnaW5hbFN0cmluZwkAAlkAAAABBQAAAAlzaWduYXR1cmUJAAJZAAAAAQUAAAALY291bnRlclBhcnQEAAAADG5vdEluaXRpYXRvcgkBAAAAAiE9AAAAAgUAAAAGc2VuZGVyCQEAAAAQZ2V0U3RyaW5nRnJvbUtleQAAAAECAAAAFGNsb3NpbmdfaW5pdGlhdGVkX2J5BAAAAAxvbGRUaW1lc3RhbXAJAQAAAA1nZXRJbnRGcm9tS2V5AAAAAQIAAAAJdGltZXN0YW1wBAAAABJpc0Nsb3NpbmdJbml0aWF0ZWQJAQAAABBjbG9zaW5nSW5pdGlhdGVkAAAAAAMFAAAAEmlzQ2xvc2luZ0luaXRpYXRlZAMDAwMFAAAADG5vdEluaXRpYXRvcgUAAAALdmFsaWRTZW5kZXIHBQAAABNzaWduZWRCeUNvdW50ZXJwYXJ0BwkAAGYAAAACBQAAAAl0aW1lc3RhbXAFAAAADG9sZFRpbWVzdGFtcAcJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCQAAZAAAAAIFAAAAEGFtb3VudFJlY2lwaWVudEEFAAAAEGFtb3VudFJlY2lwaWVudEIFAAAABHVuaXQFAAAAA25pbAkAAAIAAAABAgAAACdXcm9uZyBzaWduYXR1cmUgb3IgdGltZXN0YW1wIG5vdCBuZXdlciEJAAACAAAAAQIAAAAlQ2xvc2luZyBvZiBjaGFubmVsIG5vdCBpbml0aWF0ZWQgeWV0IQAAAAFpAQAAAAxjb25maXJtQ2xvc2UAAAAABAAAAAZzZW5kZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAALdmFsaWRTZW5kZXIJAQAAABNjaGVja0lmVmFsaWRBY2NvdW50AAAAAQUAAAAGc2VuZGVyBAAAAAlpbml0aWF0b3IJAAQdAAAAAgUAAAAEdGhpcwIAAAAUY2xvc2luZ19pbml0aWF0ZWRfYnkEAAAAEmlzQ2xvc2luZ0luaXRpYXRlZAkBAAAAEGNsb3NpbmdJbml0aWF0ZWQAAAAAAwUAAAASaXNDbG9zaW5nSW5pdGlhdGVkAwMJAQAAAAIhPQAAAAIFAAAABnNlbmRlcgUAAAAJaW5pdGlhdG9yBQAAAAt2YWxpZFNlbmRlcgcEAAAADGZpcnN0QWRkcmVzcwkBAAAAEGdldFN0cmluZ0Zyb21LZXkAAAABAgAAAAxmaXJzdEFkZHJlc3MEAAAADXNlY29uZEFkZHJlc3MJAQAAABBnZXRTdHJpbmdGcm9tS2V5AAAAAQIAAAANc2Vjb25kQWRkcmVzcwQAAAASZmlyc3RBZGRyZXNzQW1vdW50CQEAAAANZ2V0SW50RnJvbUtleQAAAAEFAAAADGZpcnN0QWRkcmVzcwQAAAATc2Vjb25kQWRkcmVzc0Ftb3VudAkBAAAADWdldEludEZyb21LZXkAAAABBQAAAA1zZWNvbmRBZGRyZXNzCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABBQAAAAxmaXJzdEFkZHJlc3MFAAAAEmZpcnN0QWRkcmVzc0Ftb3VudAUAAAAEdW5pdAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAANc2Vjb25kQWRkcmVzcwUAAAATc2Vjb25kQWRkcmVzc0Ftb3VudAUAAAAEdW5pdAUAAAADbmlsCQAAAgAAAAECAAAAMUluaXRpYXRvciBjYW4gbm90IGNvbmZpcm0gY2xvc2luZyBvZiB0aGUgY2hhbm5lbCEJAAACAAAAAQIAAAAlQ2xvc2luZyBvZiBjaGFubmVsIG5vdCBpbml0aWF0ZWQgeWV0IQAAAAFpAQAAABJjbG9zZUFmdGVyVGltZWxvY2sAAAAABAAAAAZzZW5kZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAALdmFsaWRTZW5kZXIJAQAAABNjaGVja0lmVmFsaWRBY2NvdW50AAAAAQUAAAAGc2VuZGVyBAAAAAh0aW1lbG9jawkBAAAADWdldEludEZyb21LZXkAAAABAgAAAAh0aW1lbG9jawQAAAASaXNDbG9zaW5nSW5pdGlhdGVkCQEAAAAQY2xvc2luZ0luaXRpYXRlZAAAAAADBQAAABJpc0Nsb3NpbmdJbml0aWF0ZWQDAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAACHRpbWVsb2NrBQAAAAt2YWxpZFNlbmRlcgcEAAAADGZpcnN0QWRkcmVzcwkBAAAAEGdldFN0cmluZ0Zyb21LZXkAAAABAgAAAAxmaXJzdEFkZHJlc3MEAAAADXNlY29uZEFkZHJlc3MJAQAAABBnZXRTdHJpbmdGcm9tS2V5AAAAAQIAAAANc2Vjb25kQWRkcmVzcwQAAAASZmlyc3RBZGRyZXNzQW1vdW50CQEAAAANZ2V0SW50RnJvbUtleQAAAAEFAAAADGZpcnN0QWRkcmVzcwQAAAATc2Vjb25kQWRkcmVzc0Ftb3VudAkBAAAADWdldEludEZyb21LZXkAAAABBQAAAA1zZWNvbmRBZGRyZXNzCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABBQAAAAxmaXJzdEFkZHJlc3MFAAAAEmZpcnN0QWRkcmVzc0Ftb3VudAUAAAAEdW5pdAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAANc2Vjb25kQWRkcmVzcwUAAAATc2Vjb25kQWRkcmVzc0Ftb3VudAUAAAAEdW5pdAUAAAADbmlsCQAAAgAAAAECAAAAFVRpbWVsb2NrIHN0aWxsIHZhbGlkIQkAAAIAAAABAgAAACVDbG9zaW5nIG9mIGNoYW5uZWwgbm90IGluaXRpYXRlZCB5ZXQhAAAAAWkBAAAADmluaXRpYWxDbG9zaW5nAAAABgAAAApyZWNpcGllbnRBAAAAEGFtb3VudFJlY2lwaWVudEEAAAAKcmVjaXBpZW50QgAAABBhbW91bnRSZWNpcGllbnRCAAAACXRpbWVzdGFtcAAAAAlzaWduYXR1cmUEAAAAEGNsb3NpbmdJbml0aWF0b3IJAQAAABdnZXRTdHJpbmdGcm9tS2V5T3JFbXB0eQAAAAECAAAAFGNsb3NpbmdfaW5pdGlhdGVkX2J5BAAAABdjbG9zaW5nQWxyZWFkeUluaXRpYXRlZAkBAAAAAiE9AAAAAgUAAAAQY2xvc2luZ0luaXRpYXRvcgIAAAAABAAAAAtpc0luaXRpYXRlZAkBAAAAEmNoYW5uZWxJc0luaXRpYXRlZAAAAAAEAAAABnNlbmRlcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAt2YWxpZFNlbmRlcgkBAAAAE2NoZWNrSWZWYWxpZEFjY291bnQAAAABBQAAAAZzZW5kZXIEAAAAD3JlY2lwaWVudEFWYWxpZAkBAAAAE2NoZWNrSWZWYWxpZEFjY291bnQAAAABBQAAAApyZWNpcGllbnRBBAAAAA9yZWNpcGllbnRCVmFsaWQJAQAAABNjaGVja0lmVmFsaWRBY2NvdW50AAAAAQUAAAAKcmVjaXBpZW50QgQAAAAPdmFsaWRSZWNpcGllbnRzAwUAAAAPcmVjaXBpZW50QVZhbGlkBgUAAAAPcmVjaXBpZW50QlZhbGlkBAAAAA5vcmlnaW5hbFN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAApyZWNpcGllbnRBCQABpAAAAAEFAAAAEGFtb3VudFJlY2lwaWVudEEFAAAACnJlY2lwaWVudEIJAAGkAAAAAQUAAAAQYW1vdW50UmVjaXBpZW50QgkAAaQAAAABBQAAAAl0aW1lc3RhbXAEAAAAC2NvdW50ZXJQYXJ0CQEAAAAQZ2V0U3RyaW5nRnJvbUtleQAAAAEJAAEsAAAAAgUAAAAGc2VuZGVyAgAAAAxfY291bnRlcnBhcnQEAAAAE3NpZ25lZEJ5Q291bnRlcnBhcnQJAAH0AAAAAwkAAZsAAAABBQAAAA5vcmlnaW5hbFN0cmluZwkAAlkAAAABBQAAAAlzaWduYXR1cmUJAAJZAAAAAQUAAAALY291bnRlclBhcnQEAAAADnRpbWVsb2NrUGVyaW9kCQEAAAANZ2V0SW50RnJvbUtleQAAAAECAAAADnRpbWVsb2NrUGVyaW9kAwkBAAAAASEAAAABBQAAABdjbG9zaW5nQWxyZWFkeUluaXRpYXRlZAMFAAAAC2lzSW5pdGlhdGVkAwUAAAALdmFsaWRTZW5kZXIDBQAAAA92YWxpZFJlY2lwaWVudHMDBQAAABNzaWduZWRCeUNvdW50ZXJwYXJ0CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAApyZWNpcGllbnRBBQAAABBhbW91bnRSZWNpcGllbnRBCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAApyZWNpcGllbnRCBQAAABBhbW91bnRSZWNpcGllbnRCCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAABRjbG9zaW5nX2luaXRpYXRlZF9ieQUAAAAGc2VuZGVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAAl0aW1lc3RhbXAFAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAIdGltZWxvY2sJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAA50aW1lbG9ja1BlcmlvZAUAAAADbmlsCQAAAgAAAAECAAAAEFdyb25nIHNpZ25hdHVyZSEJAAACAAAAAQIAAAASVW52YWxpZCByZWNpcGllbnRzCQAAAgAAAAECAAAAIFNlbmRlciBvZiB0cmFuc2FjdGlvbiBub3QgdmFsaWQhCQAAAgAAAAECAAAAF0NoYW5ubmVsIG5vdCBpbml0aWF0ZWQhCQAAAgAAAAEJAAEsAAAAAgIAAAAeQ2xvc2luZyBhbHJlYWR5IGluaXRpYXRlZCBieTogBQAAABBjbG9zaW5nSW5pdGlhdG9yAAAAAWkBAAAABGZ1bmQAAAAABAAAAAtpc0luaXRpYXRlZAkBAAAAEmNoYW5uZWxJc0luaXRpYXRlZAAAAAAEAAAABnNlbmRlcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAt2YWxpZFNlbmRlcgkBAAAAE2NoZWNrSWZWYWxpZEFjY291bnQAAAABBQAAAAZzZW5kZXIEAAAAB3BheW1lbnQEAAAAByRtYXRjaDAIBQAAAAFpAAAAB3BheW1lbnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAD0F0dGFjaGVkUGF5bWVudAQAAAABcAUAAAAHJG1hdGNoMAUAAAABcAkAAAIAAAABAgAAABRObyBQYXltZW50IGF0dGFjaGVkIQQAAAAOcGF5bWVudEluQXNzZXQJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBAAAAAlhbW91bnRLZXkJAAEsAAAAAgUAAAAGc2VuZGVyAgAAAAdfYW1vdW50BAAAAA1jdXJyZW50QW1vdW50CQEAAAANZ2V0SW50RnJvbUtleQAAAAEFAAAACWFtb3VudEtleQMFAAAAC2lzSW5pdGlhdGVkAwUAAAALdmFsaWRTZW5kZXIDCQEAAAABIQAAAAEFAAAADnBheW1lbnRJbkFzc2V0AwkBAAAAAiE9AAAAAgUAAAANY3VycmVudEFtb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAAChVc2VyIGhhcyBhbHJlYWR5IGZ1bmRlZCBwYXltZW50IGNoYW5uZWwhCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAlhbW91bnRLZXkIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAADbmlsCQAAAgAAAAECAAAAFkZ1bmRpbmcgaW4gV2F2ZXMgb25seSEJAAACAAAAAQkAASwAAAACAgAAACVXcm9uZyBhY2NvdW50IHRyaWVzIHRvIGZ1bmQgY2hhbm5lbDogBQAAAAZzZW5kZXIJAAACAAAAAQIAAAAXQ2hhbm5uZWwgbm90IGluaXRpYXRlZCEAAAABaQEAAAAEaW5pdAAAAAMAAAAOZmlyc3RQdWJsaWNLZXkAAAAPc2Vjb25kUHVibGljS2V5AAAADnRpbWVsb2NrUGVyaW9kBAAAAAxjYWxsZWRCeVNlbGYJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzBAAAAAxmaXJzdEFkZHJlc3MJAAJYAAAAAQgJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAOZmlyc3RQdWJsaWNLZXkAAAAFYnl0ZXMEAAAADXNlY29uZEFkZHJlc3MJAAJYAAAAAQgJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAPc2Vjb25kUHVibGljS2V5AAAABWJ5dGVzBAAAABNjdXJyZW50Rmlyc3RBZGRyZXNzCQEAAAAXZ2V0U3RyaW5nRnJvbUtleU9yRW1wdHkAAAABCQABLAAAAAIFAAAADGZpcnN0QWRkcmVzcwIAAAAMX2NvdW50ZXJwYXJ0BAAAABRjdXJyZW50U2Vjb25kQWRkcmVzcwkBAAAAF2dldFN0cmluZ0Zyb21LZXlPckVtcHR5AAAAAQkAASwAAAACBQAAAA1zZWNvbmRBZGRyZXNzAgAAAAxfY291bnRlcnBhcnQDBQAAAAxjYWxsZWRCeVNlbGYDAwkBAAAAAiE9AAAAAgUAAAATY3VycmVudEZpcnN0QWRkcmVzcwIAAAAABgkBAAAAAiE9AAAAAgUAAAAUY3VycmVudFNlY29uZEFkZHJlc3MCAAAAAAkAAAIAAAABAgAAABtDb250cmFjdCBhbHJlYWR5IGluaXRpYXRlZCEJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAADGZpcnN0QWRkcmVzcwUAAAAMZmlyc3RBZGRyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAA1zZWNvbmRBZGRyZXNzBQAAAA1zZWNvbmRBZGRyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADGZpcnN0QWRkcmVzcwIAAAAMX2NvdW50ZXJwYXJ0BQAAAA9zZWNvbmRQdWJsaWNLZXkJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANc2Vjb25kQWRkcmVzcwIAAAAMX2NvdW50ZXJwYXJ0BQAAAA5maXJzdFB1YmxpY0tleQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAOdGltZWxvY2tQZXJpb2QFAAAADnRpbWVsb2NrUGVyaW9kBQAAAANuaWwJAAACAAAAAQIAAAA0SW5pdCBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYnkgY29udHJhY3QgaXRzZWxmIQAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQAAAACdHgFAAAAByRtYXRjaDADAwMJAAAAAAAAAggFAAAAAnR4AAAABGRBcHAFAAAABHRoaXMJAAAAAAAAAggFAAAAAnR4AAAACGZ1bmN0aW9uAgAAAARpbml0BwkAAAAAAAACCAUAAAACdHgAAAADZmVlAAAAAAAADbugBwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkHB6189AQ=", "chainId": 84, "height": 576628, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+func getStringFromKey (key) = match getString(this, key) {
5+ case str: String =>
6+ str
7+ case _ =>
8+ throw("No string found for entry!")
9+}
10+
11+
12+func getStringFromKeyOrEmpty (key) = match getString(this, key) {
13+ case str: String =>
14+ str
15+ case _ =>
16+ ""
17+}
18+
19+
20+func getIntFromKey (key) = match getInteger(this, key) {
21+ case n: Int =>
22+ n
23+ case _ =>
24+ 0
25+}
26+
27+
28+func channelIsInitiated () = {
29+ let firstAddress = getStringFromKey("firstAddress")
30+ let secondAddress = getStringFromKey("secondAddress")
31+ let firstCounterPart = getStringFromKey((firstAddress + "_counterpart"))
32+ let secondCounterpart = getStringFromKey((secondAddress + "_counterpart"))
33+ (getIntFromKey("timelockPeriod") > 0)
34+ }
35+
36+
37+func closingInitiated () = {
38+ let initiator = getStringFromKey("closing_initiated_by")
39+ (initiator != "")
40+ }
41+
42+
43+func checkIfValidAccount (sender) = {
44+ let firstAddress = getStringFromKey("firstAddress")
45+ let secondAddress = getStringFromKey("secondAddress")
46+ if (if ((firstAddress != sender))
47+ then (secondAddress != sender)
48+ else false)
49+ then false
50+ else true
51+ }
52+
53+
54+@Callable(i)
55+func claimCheating (recipientA,amountRecipientA,recipientB,amountRecipientB,timestamp,signature) = {
56+ let sender = toBase58String(i.caller.bytes)
57+ let validSender = checkIfValidAccount(sender)
58+ let originalString = ((((recipientA + toString(amountRecipientA)) + recipientB) + toString(amountRecipientB)) + toString(timestamp))
59+ let counterPart = getStringFromKey((sender + "_counterpart"))
60+ let signedByCounterpart = sigVerify(toBytes(originalString), fromBase58String(signature), fromBase58String(counterPart))
61+ let notInitiator = (sender != getStringFromKey("closing_initiated_by"))
62+ let oldTimestamp = getIntFromKey("timestamp")
63+ let isClosingInitiated = closingInitiated()
64+ if (isClosingInitiated)
65+ then if (if (if (if (notInitiator)
66+ then validSender
67+ else false)
68+ then signedByCounterpart
69+ else false)
70+ then (timestamp > oldTimestamp)
71+ else false)
72+ then TransferSet([ScriptTransfer(i.caller, (amountRecipientA + amountRecipientB), unit)])
73+ else throw("Wrong signature or timestamp not newer!")
74+ else throw("Closing of channel not initiated yet!")
75+ }
76+
77+
78+
79+@Callable(i)
80+func confirmClose () = {
81+ let sender = toBase58String(i.caller.bytes)
82+ let validSender = checkIfValidAccount(sender)
83+ let initiator = getString(this, "closing_initiated_by")
84+ let isClosingInitiated = closingInitiated()
85+ if (isClosingInitiated)
86+ then if (if ((sender != initiator))
87+ then validSender
88+ else false)
89+ then {
90+ let firstAddress = getStringFromKey("firstAddress")
91+ let secondAddress = getStringFromKey("secondAddress")
92+ let firstAddressAmount = getIntFromKey(firstAddress)
93+ let secondAddressAmount = getIntFromKey(secondAddress)
94+ TransferSet([ScriptTransfer(Address(fromBase58String(firstAddress)), firstAddressAmount, unit), ScriptTransfer(Address(fromBase58String(secondAddress)), secondAddressAmount, unit)])
95+ }
96+ else throw("Initiator can not confirm closing of the channel!")
97+ else throw("Closing of channel not initiated yet!")
98+ }
99+
100+
101+
102+@Callable(i)
103+func closeAfterTimelock () = {
104+ let sender = toBase58String(i.caller.bytes)
105+ let validSender = checkIfValidAccount(sender)
106+ let timelock = getIntFromKey("timelock")
107+ let isClosingInitiated = closingInitiated()
108+ if (isClosingInitiated)
109+ then if (if ((height > timelock))
110+ then validSender
111+ else false)
112+ then {
113+ let firstAddress = getStringFromKey("firstAddress")
114+ let secondAddress = getStringFromKey("secondAddress")
115+ let firstAddressAmount = getIntFromKey(firstAddress)
116+ let secondAddressAmount = getIntFromKey(secondAddress)
117+ TransferSet([ScriptTransfer(Address(fromBase58String(firstAddress)), firstAddressAmount, unit), ScriptTransfer(Address(fromBase58String(secondAddress)), secondAddressAmount, unit)])
118+ }
119+ else throw("Timelock still valid!")
120+ else throw("Closing of channel not initiated yet!")
121+ }
122+
123+
124+
125+@Callable(i)
126+func initialClosing (recipientA,amountRecipientA,recipientB,amountRecipientB,timestamp,signature) = {
127+ let closingInitiator = getStringFromKeyOrEmpty("closing_initiated_by")
128+ let closingAlreadyInitiated = (closingInitiator != "")
129+ let isInitiated = channelIsInitiated()
130+ let sender = toBase58String(i.caller.bytes)
131+ let validSender = checkIfValidAccount(sender)
132+ let recipientAValid = checkIfValidAccount(recipientA)
133+ let recipientBValid = checkIfValidAccount(recipientB)
134+ let validRecipients = if (recipientAValid)
135+ then true
136+ else recipientBValid
137+ let originalString = ((((recipientA + toString(amountRecipientA)) + recipientB) + toString(amountRecipientB)) + toString(timestamp))
138+ let counterPart = getStringFromKey((sender + "_counterpart"))
139+ let signedByCounterpart = sigVerify(toBytes(originalString), fromBase58String(signature), fromBase58String(counterPart))
140+ let timelockPeriod = getIntFromKey("timelockPeriod")
141+ if (!(closingAlreadyInitiated))
142+ then if (isInitiated)
143+ then if (validSender)
144+ then if (validRecipients)
145+ then if (signedByCounterpart)
146+ then WriteSet([DataEntry(recipientA, amountRecipientA), DataEntry(recipientB, amountRecipientB), DataEntry("closing_initiated_by", sender), DataEntry("timestamp", timestamp), DataEntry("timelock", (height + timelockPeriod))])
147+ else throw("Wrong signature!")
148+ else throw("Unvalid recipients")
149+ else throw("Sender of transaction not valid!")
150+ else throw("Channnel not initiated!")
151+ else throw(("Closing already initiated by: " + closingInitiator))
152+ }
153+
154+
155+
156+@Callable(i)
157+func fund () = {
158+ let isInitiated = channelIsInitiated()
159+ let sender = toBase58String(i.caller.bytes)
160+ let validSender = checkIfValidAccount(sender)
161+ let payment = match i.payment {
162+ case p: AttachedPayment =>
163+ p
164+ case _ =>
165+ throw("No Payment attached!")
166+ }
167+ let paymentInAsset = isDefined(payment.assetId)
168+ let amountKey = (sender + "_amount")
169+ let currentAmount = getIntFromKey(amountKey)
170+ if (isInitiated)
171+ then if (validSender)
172+ then if (!(paymentInAsset))
173+ then if ((currentAmount != 0))
174+ then throw("User has already funded payment channel!")
175+ else WriteSet([DataEntry(amountKey, payment.amount)])
176+ else throw("Funding in Waves only!")
177+ else throw(("Wrong account tries to fund channel: " + sender))
178+ else throw("Channnel not initiated!")
179+ }
180+
181+
182+
183+@Callable(i)
184+func init (firstPublicKey,secondPublicKey,timelockPeriod) = {
185+ let calledBySelf = (i.caller == this)
186+ let firstAddress = toBase58String(addressFromPublicKey(fromBase58String(firstPublicKey)).bytes)
187+ let secondAddress = toBase58String(addressFromPublicKey(fromBase58String(secondPublicKey)).bytes)
188+ let currentFirstAddress = getStringFromKeyOrEmpty((firstAddress + "_counterpart"))
189+ let currentSecondAddress = getStringFromKeyOrEmpty((secondAddress + "_counterpart"))
190+ if (calledBySelf)
191+ then if (if ((currentFirstAddress != ""))
192+ then true
193+ else (currentSecondAddress != ""))
194+ then throw("Contract already initiated!")
195+ else WriteSet([DataEntry("firstAddress", firstAddress), DataEntry("secondAddress", secondAddress), DataEntry((firstAddress + "_counterpart"), secondPublicKey), DataEntry((secondAddress + "_counterpart"), firstPublicKey), DataEntry("timelockPeriod", timelockPeriod)])
196+ else throw("Init function can only be called by contract itself!")
197+ }
198+
199+
200+@Verifier(tx)
201+func verify () = match tx {
202+ case tx: InvokeScriptTransaction =>
203+ if (if (if ((tx.dApp == this))
204+ then (tx.function == "init")
205+ else false)
206+ then (tx.fee == 900000)
207+ else false)
208+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
209+ else false
210+ case _ =>
211+ false
212+}
213+

github/deemru/w8io/169f3d6 
25.37 ms