tx · EUufYq4Z6LiepzM6iCUpjhpinnk2LPoLa9HACoMNLhHK

3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua:  -0.01400000 Waves

2021.03.19 16:51 [1444704] smart account 3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua > SELF 0.00000000 Waves

{ "type": 13, "id": "EUufYq4Z6LiepzM6iCUpjhpinnk2LPoLa9HACoMNLhHK", "fee": 1400000, "feeAssetId": null, "timestamp": 1616161905807, "version": 2, "chainId": 84, "sender": "3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua", "senderPublicKey": "CTyHhnVTxf16Z4CmGGneAK8WB5g2QyT4MB8kUn8vPPcu", "proofs": [ "2TJwqaGKSs3XDSLqtrmTLwfJo6MiH6byNgCg6N3z5fn1Ctjj5m5e1Moqsg3AEWFMmE1piXqaFgCYPtVpy5oQu9mR" ], "script": "base64:AAIEAAAAAAAAAA0IAhIAEgMKAQgSABIAAAAAGgAAAAAJc2VwYXJhdG9yAgAAAANfX18AAAAAGmhhcmRjb3JlZE1heGltdW1EZXBvc2l0RmVlAAAAAAAAAABkAAAAABFoYXJkY29yZWREYXBwTmFtZQIAAAAGRk9LT0ZGAAAAABhoYXJkY29yZWRBc3NldElkRm9yV2F2ZXMCAAAABVdBVkVTAAAAAA9rZXlBc3NldFRvU3Rha2UJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAADl9Bc3NldFRvU3Rha2VfAAAAABRrZXlBc3NldHNUb1N0YWtlTGlzdAkAASwAAAACBQAAABFoYXJkY29yZWREYXBwTmFtZQIAAAASX0Fzc2V0c1RvU3Rha2VMaXN0AAAAABRrZXlEZWZhdWx0RGVwb3NpdEZlZQkAASwAAAACBQAAABFoYXJkY29yZWREYXBwTmFtZQIAAAASX0RlZmF1bHREZXBvc2l0RmVlAAAAABJrZXlTdWZmaXhJc0VuYWJsZWQCAAAACl9pc0VuYWJsZWQAAAAAEmtleVN1ZmZpeE1pbkFtb3VudAIAAAAOX21pbmltdW1BbW91bnQAAAAAFGtleVN1ZmZpeEFmdGVySGVpZ2h0AgAAAB1fYWxsb3dTdGFraW5nQWZ0ZXJCbG9ja0hlaWdodAAAAAATa2V5U3VmZml4QmxvY2tEZWxheQIAAAAfX0Jsb2Nrc0RlbGF5QWZ0ZXJEZXBvc2l0VG9TdGFrZQAAAAAWa2V5U3VmZml4RW5hYmxlU3BlY0ZlZQIAAAAZX2VuYWJsZVNwZWNpZmljRGVwb3NpdEZlZQAAAAAQa2V5U3VmZml4U3BlY0ZlZQIAAAATX3NwZWNpZmljRGVwb3NpdEZlZQAAAAALa2V5VHJlYXN1cnkJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAACl9UcmVhc3VyeV8AAAAAEmtleVNldHRpbmdzQWRkcmVzcwkAASwAAAACBQAAABFoYXJkY29yZWREYXBwTmFtZQIAAAAQX1NldHRpbmdzQWRkcmVzcwAAAAAIa2V5Tm9uY2UJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAABl9Ob25jZQAAAAAQa2V5U3Rha2luZ0Ftb3VudAkAASwAAAACBQAAABFoYXJkY29yZWREYXBwTmFtZQIAAAAPX1N0YWtpbmdBbW91bnRfAAAAABhrZXlJc3N1ZWRTdGFraW5nQ29udHJhY3QJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAAEV9Jc3N1ZWRTQ29udHJhY3RfAAAAABhrZXlCdXJuZWRTdGFraW5nQ29udHJhY3QJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAAEV9CdXJuZWRTQ29udHJhY3RfAAAAABJrZXlBVFNDb250cmFjdE5hbWUJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAACUNvbnRyYWN0MQEAAAASZ2V0U2V0dGluZ3NBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAEmtleVNldHRpbmdzQWRkcmVzcwEAAAAGaXNTZWxmAAAAAQAAAAZjYWxsZXIDCQAAAAAAAAIFAAAABHRoaXMFAAAABmNhbGxlcgYJAAAAAAAAAgUAAAAGY2FsbGVyCQEAAAASZ2V0U2V0dGluZ3NBZGRyZXNzAAAAAAEAAAAOY2FsY0RlcG9zaXRGZWUAAAACAAAAD2RlcG9zaXRlZEFtb3VudAAAAAdmZWVQZXJjBAAAAANmZWUJAABpAAAAAgkAAGgAAAACBQAAAA9kZXBvc2l0ZWRBbW91bnQFAAAAB2ZlZVBlcmMAAAAAAAAAJxADCQAAZgAAAAIAAAAAAAAAAAEFAAAAA2ZlZQAAAAAAAAAAAQUAAAADZmVlAQAAABZnZXRBc3NldERlcG9zaXRGZWVQZXJjAAAAAQAAAAphc3NldElkU3RyBAAAAA9zZXR0aW5nc0FkZHJlc3MJAQAAABJnZXRTZXR0aW5nc0FkZHJlc3MAAAAABAAAAAlrZXlPcmlnaW4JAAEsAAAAAgUAAAAPa2V5QXNzZXRUb1N0YWtlBQAAAAphc3NldElkU3RyBAAAABRpc1NwZWNpZmljRmVlRW5hYmxlZAkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAPc2V0dGluZ3NBZGRyZXNzCQABLAAAAAIFAAAACWtleU9yaWdpbgUAAAAWa2V5U3VmZml4RW5hYmxlU3BlY0ZlZQMJAAAAAAAAAgUAAAAUaXNTcGVjaWZpY0ZlZUVuYWJsZWQGBAAAAAtzcGVjaWZpY0ZlZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPc2V0dGluZ3NBZGRyZXNzCQABLAAAAAIFAAAACWtleU9yaWdpbgUAAAAQa2V5U3VmZml4U3BlY0ZlZQMJAABmAAAAAgUAAAALc3BlY2lmaWNGZWUFAAAAGmhhcmRjb3JlZE1heGltdW1EZXBvc2l0RmVlBQAAABpoYXJkY29yZWRNYXhpbXVtRGVwb3NpdEZlZQMJAABmAAAAAgAAAAAAAAAAAAUAAAALc3BlY2lmaWNGZWUAAAAAAAAAAAAFAAAAC3NwZWNpZmljRmVlBAAAABFkZWZhdWx0RGVwb3NpdEZlZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPc2V0dGluZ3NBZGRyZXNzBQAAABRrZXlEZWZhdWx0RGVwb3NpdEZlZQMJAABmAAAAAgUAAAARZGVmYXVsdERlcG9zaXRGZWUFAAAAGmhhcmRjb3JlZE1heGltdW1EZXBvc2l0RmVlBQAAABpoYXJkY29yZWRNYXhpbXVtRGVwb3NpdEZlZQMJAABmAAAAAgAAAAAAAAAAAAUAAAARZGVmYXVsdERlcG9zaXRGZWUAAAAAAAAAAAAFAAAAEWRlZmF1bHREZXBvc2l0RmVlAQAAABBnZXRJbnRlZ2VyT3JaZXJvAAAAAQAAAAdrZXlOYW1lBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAB2tleU5hbWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAFaXNJbnQFAAAAByRtYXRjaDAFAAAABWlzSW50AAAAAAAAAAAAAQAAAAtnZXROZXdOb25jZQAAAAAEAAAACWluY3JOb25jZQkAAGQAAAACCQEAAAAQZ2V0SW50ZWdlck9yWmVybwAAAAEFAAAACGtleU5vbmNlAAAAAAAAAAABCQAETAAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAASwAAAACCQABpAAAAAEFAAAACWluY3JOb25jZQkAAaQAAAABBQAAAAZoZWlnaHQJAARMAAAAAgUAAAAJaW5jck5vbmNlBQAAAANuaWwAAAAEAAAAAWkBAAAABGluaXQAAAAACQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAECAAAADlRyZWFzdXJ5LVdBVkVTCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAECAAAAP2RBcHBfTG9ja2FibGVBc3NldF9HbzZGUVpIZVp6cWVBbjd3cmN5d0E2WndzVkZHV1lCS3g3amdub0NNSkp0WQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABAgAAABNkQXBwX0xvY2thYmxlQXNzZXRzCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAECAAAAF2RBcHBfTG9ja2FibGVBc3NldHNMaXN0CQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAECAAAAFWdvdmVybm9yQ3JlYXRpb25QcmljZQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABAgAAABFrZXlMb2NrYWJsZUFzc2V0cwUAAAADbmlsAAAAAWkBAAAAFXVwZGF0ZVNldHRpbmdzQWRkcmVzcwAAAAEAAAAKbmV3QWRkcmVzcwMJAQAAAAIhPQAAAAIFAAAABHRoaXMIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAAA1BY2Nlc3MgZGVuaWVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAEmtleVNldHRpbmdzQWRkcmVzcwUAAAAKbmV3QWRkcmVzcwUAAAADbmlsAAAAAWkBAAAAE2RlcG9zaXRBc3NldFRvU3Rha2UAAAAAAwkBAAAAAiE9AAAAAgkBAAAABmlzU2VsZgAAAAEIBQAAAAFpAAAABmNhbGxlcgcJAAACAAAAAQIAAAAXZEFwcCBjYW4ndCBhY3QgZm9yIHNlbGYDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAKk5vdCBhIHZhbGlkIGFtb3VudCBvZiBwYXltZW50cyAocmVxdWlyZSAxKQQAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAACmFzc2V0SWRTdHIEAAAAByRtYXRjaDAICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAB2lzQXNzZXQFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAAHaXNBc3NldAUAAAAYaGFyZGNvcmVkQXNzZXRJZEZvcldhdmVzBAAAAAlrZXlPcmlnaW4JAAEsAAAAAgUAAAAPa2V5QXNzZXRUb1N0YWtlBQAAAAphc3NldElkU3RyBAAAAA5zZXR0aW5nQWRkcmVzcwkBAAAAEmdldFNldHRpbmdzQWRkcmVzcwAAAAAEAAAACWlzRW5hYmxlZAkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAOc2V0dGluZ0FkZHJlc3MJAAEsAAAAAgUAAAAJa2V5T3JpZ2luBQAAABJrZXlTdWZmaXhJc0VuYWJsZWQEAAAADW1pbmltdW1BbW91bnQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAADnNldHRpbmdBZGRyZXNzCQABLAAAAAIFAAAACWtleU9yaWdpbgUAAAASa2V5U3VmZml4TWluQW1vdW50AwkBAAAAAiE9AAAAAgUAAAAJaXNFbmFibGVkBgkAAAIAAAABAgAAAAhEaXNhYmxlZAMJAABmAAAAAgUAAAANbWluaW11bUFtb3VudAUAAAAGYW1vdW50CQAAAgAAAAECAAAAFEJlbG93IG1pbmltdW0gYW1vdW50BAAAAApkZXBvc2l0RmVlCQEAAAAOY2FsY0RlcG9zaXRGZWUAAAACBQAAAAZhbW91bnQJAQAAABZnZXRBc3NldERlcG9zaXRGZWVQZXJjAAAAAQUAAAAKYXNzZXRJZFN0cgQAAAAFbm9uY2UJAQAAAAtnZXROZXdOb25jZQAAAAAEAAAAD0FUU0NvbnRyYWN0RGVzYwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAGkAAAAAQUAAAAGaGVpZ2h0BQAAAAlzZXBhcmF0b3IJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwUAAAAJc2VwYXJhdG9yBQAAAAphc3NldElkU3RyBQAAAAlzZXBhcmF0b3IJAAGkAAAAAQUAAAAGYW1vdW50BQAAAAlzZXBhcmF0b3IJAAGkAAAAAQUAAAAKZGVwb3NpdEZlZQQAAAALQVRTQ29udHJhY3QJAARDAAAABwUAAAASa2V5QVRTQ29udHJhY3ROYW1lBQAAAA9BVFNDb250cmFjdERlc2MAAAAAAAAAAAEAAAAAAAAAAAAHBQAAAAR1bml0CQABkQAAAAIFAAAABW5vbmNlAAAAAAAAAAAABAAAAA1BVFNDb250cmFjdElkCQAEOAAAAAEFAAAAC0FUU0NvbnRyYWN0BAAAABBuZXdTdGFraW5nQW1vdW50CQAAZAAAAAIJAQAAABBnZXRJbnRlZ2VyT3JaZXJvAAAAAQkAASwAAAACBQAAABBrZXlTdGFraW5nQW1vdW50BQAAAAphc3NldElkU3RyBQAAAAZhbW91bnQEAAAAD25ld0lzc3VlZEFtb3VudAkAAGQAAAACCQEAAAAQZ2V0SW50ZWdlck9yWmVybwAAAAEJAAEsAAAAAgUAAAAYa2V5SXNzdWVkU3Rha2luZ0NvbnRyYWN0BQAAAAphc3NldElkU3RyAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAhrZXlOb25jZQkAAZEAAAACBQAAAAVub25jZQAAAAAAAAAAAQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAABBrZXlTdGFraW5nQW1vdW50BQAAAAphc3NldElkU3RyBQAAABBuZXdTdGFraW5nQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAAGGtleUlzc3VlZFN0YWtpbmdDb250cmFjdAUAAAAKYXNzZXRJZFN0cgUAAAAPbmV3SXNzdWVkQW1vdW50CQAETAAAAAIFAAAAC0FUU0NvbnRyYWN0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcggFAAAAC0FUU0NvbnRyYWN0AAAACHF1YW50aXR5BQAAAA1BVFNDb250cmFjdElkBQAAAANuaWwAAAABaQEAAAAUd2l0aGRyYXdBc3NldFRvU3Rha2UAAAAAAwkBAAAAAiE9AAAAAgkBAAAABmlzU2VsZgAAAAEIBQAAAAFpAAAABmNhbGxlcgcJAAACAAAAAQIAAAAXZEFwcCBjYW4ndCBhY3QgZm9yIHNlbGYDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAKk5vdCBhIHZhbGlkIGFtb3VudCBvZiBwYXltZW50cyAocmVxdWlyZSAxKQQAAAAKY29udHJhY3RJZAQAAAAHJG1hdGNoMAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAAEaXNCVgUAAAAHJG1hdGNoMAUAAAAEaXNCVgkAAAIAAAABAgAAAB9Db250cmFjdCBpcyBhbiBBc3NldCwgbm90IFdhdmVzBAAAAA9jb250cmFjdERldGFpbHMEAAAAByRtYXRjaDAJAAPsAAAAAQUAAAAKY29udHJhY3RJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFQXNzZXQEAAAAB2lzQXNzZXQFAAAAByRtYXRjaDAFAAAAB2lzQXNzZXQJAAACAAAAAQIAAAAkQ29udHJhY3Qgc2hvdWxkIGJlIGFuIGV4aXN0aW5nIEFzc2V0AwMDAwMJAQAAAAIhPQAAAAIIBQAAAA9jb250cmFjdERldGFpbHMAAAAGaXNzdWVyBQAAAAR0aGlzBgkBAAAAAiE9AAAAAggFAAAAD2NvbnRyYWN0RGV0YWlscwAAAAhkZWNpbWFscwAAAAAAAAAAAAYJAQAAAAIhPQAAAAIIBQAAAA9jb250cmFjdERldGFpbHMAAAAIcXVhbnRpdHkAAAAAAAAAAAEGCQEAAAACIT0AAAACCAUAAAAPY29udHJhY3REZXRhaWxzAAAACnJlaXNzdWFibGUHBgkBAAAAAiE9AAAAAggFAAAAD2NvbnRyYWN0RGV0YWlscwAAAARuYW1lBQAAABJrZXlBVFNDb250cmFjdE5hbWUJAAACAAAAAQIAAAASQ29ycnVwdGVkIENvbnRyYWN0BAAAAAxjb250cmFjdEluZm8JAAS1AAAAAggFAAAAD2NvbnRyYWN0RGV0YWlscwAAAAtkZXNjcmlwdGlvbgUAAAAJc2VwYXJhdG9yBAAAABNzdGFydGluZ0Jsb2NrSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMY29udHJhY3RJbmZvAAAAAAAAAAAABAAAAA1zdGFrZXJBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAADGNvbnRyYWN0SW5mbwAAAAAAAAAAAQQAAAAHQVRTSW5mbwQAAAAHJG1hdGNoMAkAA+wAAAABCQACWQAAAAEJAAGRAAAAAgUAAAAMY29udHJhY3RJbmZvAAAAAAAAAAACAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVBc3NldAQAAAAHaXNBc3NldAUAAAAHJG1hdGNoMAUAAAAHaXNBc3NldAkAAAIAAAABAgAAABtBVFMgQ29udHJhY3Qgbm90IHJlY29nbml6ZWQEAAAADWFtb3VudFRvU3Rha2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxjb250cmFjdEluZm8AAAAAAAAAAAMEAAAACGZlZVRvUGF5CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMY29udHJhY3RJbmZvAAAAAAAAAAAEBAAAAA5hbW91bnRUb1JldHVybgkAAGUAAAACBQAAAA1hbW91bnRUb1N0YWtlBQAAAAhmZWVUb1BheQMJAABmAAAAAgUAAAATc3RhcnRpbmdCbG9ja0hlaWdodAUAAAAGaGVpZ2h0CQAAAgAAAAECAAAAHXN0YXJ0aW5nQmxvY2tIZWlnaHQgY29ycnVwdGVkAwMJAABmAAAAAgAAAAAAAAAAAQUAAAANYW1vdW50VG9TdGFrZQYJAABmAAAAAgUAAAANYW1vdW50VG9TdGFrZQgFAAAAB0FUU0luZm8AAAAIcXVhbnRpdHkJAAACAAAAAQIAAAAXYW1vdW50VG9TdGFrZSBjb3JydXB0ZWQDAwkAAGYAAAACAAAAAAAAAAABBQAAAAhmZWVUb1BheQYJAABmAAAAAgUAAAAIZmVlVG9QYXkFAAAADWFtb3VudFRvU3Rha2UJAAACAAAAAQIAAAASZmVlVG9QYXkgY29ycnVwdGVkAwMJAABmAAAAAgAAAAAAAAAAAQUAAAAOYW1vdW50VG9SZXR1cm4GCQAAZgAAAAIFAAAADmFtb3VudFRvUmV0dXJuCAUAAAAHQVRTSW5mbwAAAAhxdWFudGl0eQkAAAIAAAABAgAAABhhbW91bnRUb1JldHVybiBjb3JydXB0ZWQDCQAAZgAAAAIFAAAADmFtb3VudFRvUmV0dXJuCQAD8AAAAAIFAAAABHRoaXMIBQAAAAdBVFNJbmZvAAAAAmlkCQAAAgAAAAECAAAAE0FUUyBiYWxhbmNlIHRvbyBsb3cEAAAACEFUU0lkU3RyCQACWAAAAAEIBQAAAAdBVFNJbmZvAAAAAmlkBAAAABBuZXdTdGFraW5nQW1vdW50CQAAZQAAAAIJAQAAABBnZXRJbnRlZ2VyT3JaZXJvAAAAAQkAASwAAAACBQAAABBrZXlTdGFraW5nQW1vdW50BQAAAAhBVFNJZFN0cgUAAAANYW1vdW50VG9TdGFrZQQAAAAPbmV3QnVybmVkQW1vdW50CQAAZAAAAAIJAQAAABBnZXRJbnRlZ2VyT3JaZXJvAAAAAQkAASwAAAACBQAAABhrZXlCdXJuZWRTdGFraW5nQ29udHJhY3QFAAAACEFUU0lkU3RyAAAAAAAAAAABBAAAAAtuZXdUcmVhc3VyeQkAAGQAAAACCQEAAAAQZ2V0SW50ZWdlck9yWmVybwAAAAEJAAEsAAAAAgUAAAALa2V5VHJlYXN1cnkFAAAACEFUU0lkU3RyBQAAAAhmZWVUb1BheQkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAACmNvbnRyYWN0SWQAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAQa2V5U3Rha2luZ0Ftb3VudAUAAAAIQVRTSWRTdHIFAAAAEG5ld1N0YWtpbmdBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAYa2V5QnVybmVkU3Rha2luZ0NvbnRyYWN0BQAAAAhBVFNJZFN0cgUAAAAPbmV3QnVybmVkQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAAC2tleVRyZWFzdXJ5BQAAAAhBVFNJZFN0cgUAAAALbmV3VHJlYXN1cnkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5hbW91bnRUb1JldHVybggFAAAAB0FUU0luZm8AAAACaWQFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5JAauOw==", "height": 1444704, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3Upz3xLyevVjbFJujuDCmkkhTe6KW5ZCeyA6hg82VZ3V Next: 6CiJjNEkVb8e1VD9MCuAmNnaCuQW3rpN3p4YoXxSpFwi Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let separator = "___"
5+
6+let hardcoredMaximumDepositFee = 100
7+
8+let hardcoredDappName = "FOKOFF"
9+
10+let hardcoredAssetIdForWaves = "WAVES"
11+
12+let keyAssetToStake = (hardcoredDappName + "_AssetToStake_")
13+
14+let keyAssetsToStakeList = (hardcoredDappName + "_AssetsToStakeList")
15+
16+let keyDefaultDepositFee = (hardcoredDappName + "_DefaultDepositFee")
17+
18+let keySuffixIsEnabled = "_isEnabled"
19+
20+let keySuffixMinAmount = "_minimumAmount"
21+
22+let keySuffixAfterHeight = "_allowStakingAfterBlockHeight"
23+
24+let keySuffixBlockDelay = "_BlocksDelayAfterDepositToStake"
25+
26+let keySuffixEnableSpecFee = "_enableSpecificDepositFee"
27+
28+let keySuffixSpecFee = "_specificDepositFee"
29+
30+let keyTreasury = (hardcoredDappName + "_Treasury_")
31+
32+let keySettingsAddress = (hardcoredDappName + "_SettingsAddress")
33+
34+let keyNonce = (hardcoredDappName + "_Nonce")
35+
36+let keyStakingAmount = (hardcoredDappName + "_StakingAmount_")
37+
38+let keyIssuedStakingContract = (hardcoredDappName + "_IssuedSContract_")
39+
40+let keyBurnedStakingContract = (hardcoredDappName + "_BurnedSContract_")
41+
42+let keyATSContractName = (hardcoredDappName + "Contract1")
43+
44+func getSettingsAddress () = Address(fromBase58String(getStringValue(this, keySettingsAddress)))
45+
46+
47+func isSelf (caller) = if ((this == caller))
48+ then true
49+ else (caller == getSettingsAddress())
50+
51+
52+func calcDepositFee (depositedAmount,feePerc) = {
53+ let fee = ((depositedAmount * feePerc) / 10000)
54+ if ((1 > fee))
55+ then 1
56+ else fee
57+ }
58+
59+
60+func getAssetDepositFeePerc (assetIdStr) = {
61+ let settingsAddress = getSettingsAddress()
62+ let keyOrigin = (keyAssetToStake + assetIdStr)
63+ let isSpecificFeeEnabled = getBooleanValue(settingsAddress, (keyOrigin + keySuffixEnableSpecFee))
64+ if ((isSpecificFeeEnabled == true))
65+ then {
66+ let specificFee = getIntegerValue(settingsAddress, (keyOrigin + keySuffixSpecFee))
67+ if ((specificFee > hardcoredMaximumDepositFee))
68+ then hardcoredMaximumDepositFee
69+ else if ((0 > specificFee))
70+ then 0
71+ else specificFee
72+ }
73+ else {
74+ let defaultDepositFee = getIntegerValue(settingsAddress, keyDefaultDepositFee)
75+ if ((defaultDepositFee > hardcoredMaximumDepositFee))
76+ then hardcoredMaximumDepositFee
77+ else if ((0 > defaultDepositFee))
78+ then 0
79+ else defaultDepositFee
80+ }
81+ }
82+
83+
84+func getIntegerOrZero (keyName) = match getInteger(this, keyName) {
85+ case isInt: Int =>
86+ isInt
87+ case _ =>
88+ 0
89+}
90+
91+
92+func getNewNonce () = {
93+ let incrNonce = (getIntegerOrZero(keyNonce) + 1)
94+[parseIntValue((toString(incrNonce) + toString(height))), incrNonce]
95+ }
496
597
698 @Callable(i)
7-func call () = {
8- let asset = Issue("Asset", "", 1, 0, true, unit, 0)
9- let assetId = calculateAssetId(asset)
10-[BinaryEntry("bin", base58''), BooleanEntry("bool", true), IntegerEntry("int", 1), StringEntry("str", ""), DeleteEntry("str"), asset, Reissue(assetId, 1, false), Burn(assetId, 1), ScriptTransfer(i.caller, 1, assetId)]
11- }
99+func init () = [DeleteEntry("Treasury-WAVES"), DeleteEntry("dApp_LockableAsset_Go6FQZHeZzqeAn7wrcywA6ZwsVFGWYBKx7jgnoCMJJtY"), DeleteEntry("dApp_LockableAssets"), DeleteEntry("dApp_LockableAssetsList"), DeleteEntry("governorCreationPrice"), DeleteEntry("keyLockableAssets")]
100+
101+
102+
103+@Callable(i)
104+func updateSettingsAddress (newAddress) = if ((this != i.caller))
105+ then throw("Access denied")
106+ else [StringEntry(keySettingsAddress, newAddress)]
107+
108+
109+
110+@Callable(i)
111+func depositAssetToStake () = if ((isSelf(i.caller) != false))
112+ then throw("dApp can't act for self")
113+ else if ((size(i.payments) != 1))
114+ then throw("Not a valid amount of payments (require 1)")
115+ else {
116+ let amount = i.payments[0].amount
117+ let assetIdStr = match i.payments[0].assetId {
118+ case isAsset: ByteVector =>
119+ toBase58String(isAsset)
120+ case _ =>
121+ hardcoredAssetIdForWaves
122+ }
123+ let keyOrigin = (keyAssetToStake + assetIdStr)
124+ let settingAddress = getSettingsAddress()
125+ let isEnabled = getBooleanValue(settingAddress, (keyOrigin + keySuffixIsEnabled))
126+ let minimumAmount = getIntegerValue(settingAddress, (keyOrigin + keySuffixMinAmount))
127+ if ((isEnabled != true))
128+ then throw("Disabled")
129+ else if ((minimumAmount > amount))
130+ then throw("Below minimum amount")
131+ else {
132+ let depositFee = calcDepositFee(amount, getAssetDepositFeePerc(assetIdStr))
133+ let nonce = getNewNonce()
134+ let ATSContractDesc = ((((((((toString(height) + separator) + toBase58String(i.caller.bytes)) + separator) + assetIdStr) + separator) + toString(amount)) + separator) + toString(depositFee))
135+ let ATSContract = Issue(keyATSContractName, ATSContractDesc, 1, 0, false, unit, nonce[0])
136+ let ATSContractId = calculateAssetId(ATSContract)
137+ let newStakingAmount = (getIntegerOrZero((keyStakingAmount + assetIdStr)) + amount)
138+ let newIssuedAmount = (getIntegerOrZero((keyIssuedStakingContract + assetIdStr)) + 1)
139+[IntegerEntry(keyNonce, nonce[1]), IntegerEntry((keyStakingAmount + assetIdStr), newStakingAmount), IntegerEntry((keyIssuedStakingContract + assetIdStr), newIssuedAmount), ATSContract, ScriptTransfer(i.caller, ATSContract.quantity, ATSContractId)]
140+ }
141+ }
142+
143+
144+
145+@Callable(i)
146+func withdrawAssetToStake () = if ((isSelf(i.caller) != false))
147+ then throw("dApp can't act for self")
148+ else if ((size(i.payments) != 1))
149+ then throw("Not a valid amount of payments (require 1)")
150+ else {
151+ let contractId = match i.payments[0].assetId {
152+ case isBV: ByteVector =>
153+ isBV
154+ case _ =>
155+ throw("Contract is an Asset, not Waves")
156+ }
157+ let contractDetails = match assetInfo(contractId) {
158+ case isAsset: Asset =>
159+ isAsset
160+ case _ =>
161+ throw("Contract should be an existing Asset")
162+ }
163+ if (if (if (if (if ((contractDetails.issuer != this))
164+ then true
165+ else (contractDetails.decimals != 0))
166+ then true
167+ else (contractDetails.quantity != 1))
168+ then true
169+ else (contractDetails.reissuable != false))
170+ then true
171+ else (contractDetails.name != keyATSContractName))
172+ then throw("Corrupted Contract")
173+ else {
174+ let contractInfo = split(contractDetails.description, separator)
175+ let startingBlockHeight = parseIntValue(contractInfo[0])
176+ let stakerAddress = addressFromStringValue(contractInfo[1])
177+ let ATSInfo = match assetInfo(fromBase58String(contractInfo[2])) {
178+ case isAsset: Asset =>
179+ isAsset
180+ case _ =>
181+ throw("ATS Contract not recognized")
182+ }
183+ let amountToStake = parseIntValue(contractInfo[3])
184+ let feeToPay = parseIntValue(contractInfo[4])
185+ let amountToReturn = (amountToStake - feeToPay)
186+ if ((startingBlockHeight > height))
187+ then throw("startingBlockHeight corrupted")
188+ else if (if ((1 > amountToStake))
189+ then true
190+ else (amountToStake > ATSInfo.quantity))
191+ then throw("amountToStake corrupted")
192+ else if (if ((1 > feeToPay))
193+ then true
194+ else (feeToPay > amountToStake))
195+ then throw("feeToPay corrupted")
196+ else if (if ((1 > amountToReturn))
197+ then true
198+ else (amountToReturn > ATSInfo.quantity))
199+ then throw("amountToReturn corrupted")
200+ else if ((amountToReturn > assetBalance(this, ATSInfo.id)))
201+ then throw("ATS balance too low")
202+ else {
203+ let ATSIdStr = toBase58String(ATSInfo.id)
204+ let newStakingAmount = (getIntegerOrZero((keyStakingAmount + ATSIdStr)) - amountToStake)
205+ let newBurnedAmount = (getIntegerOrZero((keyBurnedStakingContract + ATSIdStr)) + 1)
206+ let newTreasury = (getIntegerOrZero((keyTreasury + ATSIdStr)) + feeToPay)
207+[Burn(contractId, 1), IntegerEntry((keyStakingAmount + ATSIdStr), newStakingAmount), IntegerEntry((keyBurnedStakingContract + ATSIdStr), newBurnedAmount), IntegerEntry((keyTreasury + ATSIdStr), newTreasury), ScriptTransfer(i.caller, amountToReturn, ATSInfo.id)]
208+ }
209+ }
210+ }
12211
13212
14213 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let separator = "___"
5+
6+let hardcoredMaximumDepositFee = 100
7+
8+let hardcoredDappName = "FOKOFF"
9+
10+let hardcoredAssetIdForWaves = "WAVES"
11+
12+let keyAssetToStake = (hardcoredDappName + "_AssetToStake_")
13+
14+let keyAssetsToStakeList = (hardcoredDappName + "_AssetsToStakeList")
15+
16+let keyDefaultDepositFee = (hardcoredDappName + "_DefaultDepositFee")
17+
18+let keySuffixIsEnabled = "_isEnabled"
19+
20+let keySuffixMinAmount = "_minimumAmount"
21+
22+let keySuffixAfterHeight = "_allowStakingAfterBlockHeight"
23+
24+let keySuffixBlockDelay = "_BlocksDelayAfterDepositToStake"
25+
26+let keySuffixEnableSpecFee = "_enableSpecificDepositFee"
27+
28+let keySuffixSpecFee = "_specificDepositFee"
29+
30+let keyTreasury = (hardcoredDappName + "_Treasury_")
31+
32+let keySettingsAddress = (hardcoredDappName + "_SettingsAddress")
33+
34+let keyNonce = (hardcoredDappName + "_Nonce")
35+
36+let keyStakingAmount = (hardcoredDappName + "_StakingAmount_")
37+
38+let keyIssuedStakingContract = (hardcoredDappName + "_IssuedSContract_")
39+
40+let keyBurnedStakingContract = (hardcoredDappName + "_BurnedSContract_")
41+
42+let keyATSContractName = (hardcoredDappName + "Contract1")
43+
44+func getSettingsAddress () = Address(fromBase58String(getStringValue(this, keySettingsAddress)))
45+
46+
47+func isSelf (caller) = if ((this == caller))
48+ then true
49+ else (caller == getSettingsAddress())
50+
51+
52+func calcDepositFee (depositedAmount,feePerc) = {
53+ let fee = ((depositedAmount * feePerc) / 10000)
54+ if ((1 > fee))
55+ then 1
56+ else fee
57+ }
58+
59+
60+func getAssetDepositFeePerc (assetIdStr) = {
61+ let settingsAddress = getSettingsAddress()
62+ let keyOrigin = (keyAssetToStake + assetIdStr)
63+ let isSpecificFeeEnabled = getBooleanValue(settingsAddress, (keyOrigin + keySuffixEnableSpecFee))
64+ if ((isSpecificFeeEnabled == true))
65+ then {
66+ let specificFee = getIntegerValue(settingsAddress, (keyOrigin + keySuffixSpecFee))
67+ if ((specificFee > hardcoredMaximumDepositFee))
68+ then hardcoredMaximumDepositFee
69+ else if ((0 > specificFee))
70+ then 0
71+ else specificFee
72+ }
73+ else {
74+ let defaultDepositFee = getIntegerValue(settingsAddress, keyDefaultDepositFee)
75+ if ((defaultDepositFee > hardcoredMaximumDepositFee))
76+ then hardcoredMaximumDepositFee
77+ else if ((0 > defaultDepositFee))
78+ then 0
79+ else defaultDepositFee
80+ }
81+ }
82+
83+
84+func getIntegerOrZero (keyName) = match getInteger(this, keyName) {
85+ case isInt: Int =>
86+ isInt
87+ case _ =>
88+ 0
89+}
90+
91+
92+func getNewNonce () = {
93+ let incrNonce = (getIntegerOrZero(keyNonce) + 1)
94+[parseIntValue((toString(incrNonce) + toString(height))), incrNonce]
95+ }
496
597
698 @Callable(i)
7-func call () = {
8- let asset = Issue("Asset", "", 1, 0, true, unit, 0)
9- let assetId = calculateAssetId(asset)
10-[BinaryEntry("bin", base58''), BooleanEntry("bool", true), IntegerEntry("int", 1), StringEntry("str", ""), DeleteEntry("str"), asset, Reissue(assetId, 1, false), Burn(assetId, 1), ScriptTransfer(i.caller, 1, assetId)]
11- }
99+func init () = [DeleteEntry("Treasury-WAVES"), DeleteEntry("dApp_LockableAsset_Go6FQZHeZzqeAn7wrcywA6ZwsVFGWYBKx7jgnoCMJJtY"), DeleteEntry("dApp_LockableAssets"), DeleteEntry("dApp_LockableAssetsList"), DeleteEntry("governorCreationPrice"), DeleteEntry("keyLockableAssets")]
100+
101+
102+
103+@Callable(i)
104+func updateSettingsAddress (newAddress) = if ((this != i.caller))
105+ then throw("Access denied")
106+ else [StringEntry(keySettingsAddress, newAddress)]
107+
108+
109+
110+@Callable(i)
111+func depositAssetToStake () = if ((isSelf(i.caller) != false))
112+ then throw("dApp can't act for self")
113+ else if ((size(i.payments) != 1))
114+ then throw("Not a valid amount of payments (require 1)")
115+ else {
116+ let amount = i.payments[0].amount
117+ let assetIdStr = match i.payments[0].assetId {
118+ case isAsset: ByteVector =>
119+ toBase58String(isAsset)
120+ case _ =>
121+ hardcoredAssetIdForWaves
122+ }
123+ let keyOrigin = (keyAssetToStake + assetIdStr)
124+ let settingAddress = getSettingsAddress()
125+ let isEnabled = getBooleanValue(settingAddress, (keyOrigin + keySuffixIsEnabled))
126+ let minimumAmount = getIntegerValue(settingAddress, (keyOrigin + keySuffixMinAmount))
127+ if ((isEnabled != true))
128+ then throw("Disabled")
129+ else if ((minimumAmount > amount))
130+ then throw("Below minimum amount")
131+ else {
132+ let depositFee = calcDepositFee(amount, getAssetDepositFeePerc(assetIdStr))
133+ let nonce = getNewNonce()
134+ let ATSContractDesc = ((((((((toString(height) + separator) + toBase58String(i.caller.bytes)) + separator) + assetIdStr) + separator) + toString(amount)) + separator) + toString(depositFee))
135+ let ATSContract = Issue(keyATSContractName, ATSContractDesc, 1, 0, false, unit, nonce[0])
136+ let ATSContractId = calculateAssetId(ATSContract)
137+ let newStakingAmount = (getIntegerOrZero((keyStakingAmount + assetIdStr)) + amount)
138+ let newIssuedAmount = (getIntegerOrZero((keyIssuedStakingContract + assetIdStr)) + 1)
139+[IntegerEntry(keyNonce, nonce[1]), IntegerEntry((keyStakingAmount + assetIdStr), newStakingAmount), IntegerEntry((keyIssuedStakingContract + assetIdStr), newIssuedAmount), ATSContract, ScriptTransfer(i.caller, ATSContract.quantity, ATSContractId)]
140+ }
141+ }
142+
143+
144+
145+@Callable(i)
146+func withdrawAssetToStake () = if ((isSelf(i.caller) != false))
147+ then throw("dApp can't act for self")
148+ else if ((size(i.payments) != 1))
149+ then throw("Not a valid amount of payments (require 1)")
150+ else {
151+ let contractId = match i.payments[0].assetId {
152+ case isBV: ByteVector =>
153+ isBV
154+ case _ =>
155+ throw("Contract is an Asset, not Waves")
156+ }
157+ let contractDetails = match assetInfo(contractId) {
158+ case isAsset: Asset =>
159+ isAsset
160+ case _ =>
161+ throw("Contract should be an existing Asset")
162+ }
163+ if (if (if (if (if ((contractDetails.issuer != this))
164+ then true
165+ else (contractDetails.decimals != 0))
166+ then true
167+ else (contractDetails.quantity != 1))
168+ then true
169+ else (contractDetails.reissuable != false))
170+ then true
171+ else (contractDetails.name != keyATSContractName))
172+ then throw("Corrupted Contract")
173+ else {
174+ let contractInfo = split(contractDetails.description, separator)
175+ let startingBlockHeight = parseIntValue(contractInfo[0])
176+ let stakerAddress = addressFromStringValue(contractInfo[1])
177+ let ATSInfo = match assetInfo(fromBase58String(contractInfo[2])) {
178+ case isAsset: Asset =>
179+ isAsset
180+ case _ =>
181+ throw("ATS Contract not recognized")
182+ }
183+ let amountToStake = parseIntValue(contractInfo[3])
184+ let feeToPay = parseIntValue(contractInfo[4])
185+ let amountToReturn = (amountToStake - feeToPay)
186+ if ((startingBlockHeight > height))
187+ then throw("startingBlockHeight corrupted")
188+ else if (if ((1 > amountToStake))
189+ then true
190+ else (amountToStake > ATSInfo.quantity))
191+ then throw("amountToStake corrupted")
192+ else if (if ((1 > feeToPay))
193+ then true
194+ else (feeToPay > amountToStake))
195+ then throw("feeToPay corrupted")
196+ else if (if ((1 > amountToReturn))
197+ then true
198+ else (amountToReturn > ATSInfo.quantity))
199+ then throw("amountToReturn corrupted")
200+ else if ((amountToReturn > assetBalance(this, ATSInfo.id)))
201+ then throw("ATS balance too low")
202+ else {
203+ let ATSIdStr = toBase58String(ATSInfo.id)
204+ let newStakingAmount = (getIntegerOrZero((keyStakingAmount + ATSIdStr)) - amountToStake)
205+ let newBurnedAmount = (getIntegerOrZero((keyBurnedStakingContract + ATSIdStr)) + 1)
206+ let newTreasury = (getIntegerOrZero((keyTreasury + ATSIdStr)) + feeToPay)
207+[Burn(contractId, 1), IntegerEntry((keyStakingAmount + ATSIdStr), newStakingAmount), IntegerEntry((keyBurnedStakingContract + ATSIdStr), newBurnedAmount), IntegerEntry((keyTreasury + ATSIdStr), newTreasury), ScriptTransfer(i.caller, amountToReturn, ATSInfo.id)]
208+ }
209+ }
210+ }
12211
13212
14213 @Verifier(tx)
15214 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
16215

github/deemru/w8io/3ef1775 
46.18 ms