tx · A8Aivn7jzzU9iVjB5qUCaKRneen6iw6nJw42HmAsxv9q 3N2oBybmcHXrHF9RrT2fYg3Y6ncf8YaU1RW: -0.01000000 Waves 2022.05.03 14:53 [2035478] smart account 3N2oBybmcHXrHF9RrT2fYg3Y6ncf8YaU1RW > SELF 0.00000000 Waves
{ "type": 13, "id": "A8Aivn7jzzU9iVjB5qUCaKRneen6iw6nJw42HmAsxv9q", "fee": 1000000, "feeAssetId": null, "timestamp": 1651578887641, "version": 2, "chainId": 84, "sender": "3N2oBybmcHXrHF9RrT2fYg3Y6ncf8YaU1RW", "senderPublicKey": "6kWuddP3Pz4t6CwZzDGxckh8yLE7yM236o5GciWzTjEE", "proofs": [ "3TyrtGdhDFbQAsfwsq3oicnB47K6tzvG7FBxFpGaaSRQuvX9R7r12d29BBV31LD7rzhp9pnMLDHtsgrugGMD3v8r" ], "script": "base64:AAIFAAAAAAAAACUIAhIDCgEIEgQKAggBEgMKAQgSABIDCgEIEgMKAQgSAwoBCBIAAAAAFAAAAAADU0VQAgAAAAJfXwEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAACAAAAFCVzX19tYW5hZ2VyUHVibGljS2V5AQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAACAAAAGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEAAAAHa2V5VXNlcgAAAAEAAAAHYWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAAAiVzCQAETAAAAAIFAAAAB2FkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAAAprZXlSZXZva2VkAAAAAQAAAAdhZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAACJXMJAARMAAAAAgIAAAAHcmV2b2tlZAkABEwAAAACBQAAAAdhZGRyZXNzBQAAAANuaWwFAAAAA1NFUAEAAAAYa2V5VW5jbGFpbWVkQmVmb3JlUmV2b2tlAAAAAQAAAAdhZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAACJXMJAARMAAAAAgIAAAAVdW5jbGFpbWVkQmVmb3JlUmV2b2tlCQAETAAAAAIFAAAAB2FkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABNrZXlVc2VyVmVzdGluZ1N0YXJ0AAAAAQAAAAdhZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAACJXMJAARMAAAAAgIAAAAMdmVzdGluZ1N0YXJ0CQAETAAAAAIFAAAAB2FkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABFrZXlVc2VyVmVzdGluZ0VuZAAAAAEAAAAHYWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAAAiVzCQAETAAAAAICAAAACnZlc3RpbmdFbmQJAARMAAAAAgUAAAAHYWRkcmVzcwUAAAADbmlsBQAAAANTRVABAAAAFWtleVVzZXJBbW91bnRQZXJCbG9jawAAAAEAAAAHYWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAAAiVzCQAETAAAAAICAAAADmFtb3VudFBlckJsb2NrCQAETAAAAAIFAAAAB2FkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAAAxrZXlXeEFzc2V0SWQAAAAACQAEuQAAAAIJAARMAAAAAgIAAAACJXMJAARMAAAAAgIAAAAJd3hBc3NldElkBQAAAANuaWwFAAAAA1NFUAEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAAByRtYXRjaDAJAAQiAAAAAQkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAUAAAAEdW5pdAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAAAckbWF0Y2gwCQAEIgAAAAEJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAFzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BQAAAAR1bml0CQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAttdXN0TWFuYWdlcgAAAAEAAAABaQQAAAACcGQJAAACAAAAAQIAAAARUGVybWlzc2lvbiBkZW5pZWQEAAAAByRtYXRjaDAJAQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACcGsFAAAAByRtYXRjaDADCQAAAAAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAACcGsGBQAAAAJwZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzBgUAAAACcGQJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IBAAAACnZhbHVlVXNlclMAAAAEAAAAC3RvdGFsQW1vdW50AAAAD3JlbWFpbmluZ0Ftb3VudAAAAA9jbGFpbWVkV1hBbW91bnQAAAARbGFzdENsYWltZWRIZWlnaHQJAAS5AAAAAgkABEwAAAACAgAAAAolZCVkJWQlZCVkCQAETAAAAAIFAAAAC3RvdGFsQW1vdW50CQAETAAAAAIFAAAAD3JlbWFpbmluZ0Ftb3VudAkABEwAAAACAgAAAAEwCQAETAAAAAIFAAAAD2NsYWltZWRXWEFtb3VudAkABEwAAAACBQAAABFsYXN0Q2xhaW1lZEhlaWdodAUAAAADbmlsBQAAAANTRVABAAAACXZhbHVlVXNlcgAAAAQAAAALdG90YWxBbW91bnQAAAAPcmVtYWluaW5nQW1vdW50AAAAD2NsYWltZWRXWEFtb3VudAAAABFsYXN0Q2xhaW1lZEhlaWdodAkBAAAACnZhbHVlVXNlclMAAAAECQABpAAAAAEFAAAAC3RvdGFsQW1vdW50CQABpAAAAAEFAAAAD3JlbWFpbmluZ0Ftb3VudAkAAaQAAAABBQAAAA9jbGFpbWVkV1hBbW91bnQJAAGkAAAAAQUAAAARbGFzdENsYWltZWRIZWlnaHQBAAAAEmdldFVzZXJUb3RhbEFtb3VudAAAAAEAAAAHYWRkcmVzcwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIJAAS1AAAAAgkBAAAABXZhbHVlAAAAAQkABCIAAAABCQEAAAAHa2V5VXNlcgAAAAEFAAAAB2FkZHJlc3MFAAAAA1NFUAAAAAAAAAAAAQEAAAAWZ2V0VXNlclJlbWFpbmluZ0Ftb3VudAAAAAEAAAAHYWRkcmVzcwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIJAAS1AAAAAgkBAAAABXZhbHVlAAAAAQkABCIAAAABCQEAAAAHa2V5VXNlcgAAAAEFAAAAB2FkZHJlc3MFAAAAA1NFUAAAAAAAAAAAAgEAAAAUZ2V0VXNlckNsYWltZWRBbW91bnQAAAABAAAAB2FkZHJlc3MJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACCQAEtQAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQiAAAAAQkBAAAAB2tleVVzZXIAAAABBQAAAAdhZGRyZXNzBQAAAANTRVAAAAAAAAAAAAMBAAAAGGdldFVzZXJMYXN0Q2xhaW1lZEhlaWdodAAAAAEAAAAHYWRkcmVzcwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIJAAS1AAAAAgkBAAAABXZhbHVlAAAAAQkABCIAAAABCQEAAAAHa2V5VXNlcgAAAAEFAAAAB2FkZHJlc3MFAAAAA1NFUAAAAAAAAAAABQEAAAATYXZhaWxhYmxlVG9DbGFpbU5vdwAAAAEAAAAHYWRkcmVzcwQAAAAKbGFzdEhlaWdodAkBAAAAGGdldFVzZXJMYXN0Q2xhaW1lZEhlaWdodAAAAAEFAAAAB2FkZHJlc3MDCQAAZwAAAAIFAAAACmxhc3RIZWlnaHQFAAAABmhlaWdodAAAAAAAAAAAAAQAAAADZW5kCQEAAAAFdmFsdWUAAAABCQAEHwAAAAEJAQAAABFrZXlVc2VyVmVzdGluZ0VuZAAAAAEFAAAAB2FkZHJlc3MEAAAAB2N1cnJlbnQDCQAAZgAAAAIFAAAABmhlaWdodAUAAAADZW5kBQAAAANlbmQFAAAABmhlaWdodAQAAAAPdW5jbGFpbWVkUGVyaW9kCQAAZQAAAAIFAAAAB2N1cnJlbnQFAAAACmxhc3RIZWlnaHQJAABoAAAAAgkBAAAABXZhbHVlAAAAAQkABB8AAAABCQEAAAAVa2V5VXNlckFtb3VudFBlckJsb2NrAAAAAQUAAAAHYWRkcmVzcwUAAAAPdW5jbGFpbWVkUGVyaW9kAAAACAAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAEAAAAJd3hBc3NldElkBAAAAAVjaGVjawkBAAAAC211c3RNYW5hZ2VyAAAAAQUAAAABaQMJAAAAAAAAAgUAAAAFY2hlY2sFAAAABWNoZWNrCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlXeEFzc2V0SWQAAAAABQAAAAl3eEFzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAQY3JlYXRlRGVwb3NpdEZvcgAAAAIAAAAHYWRkcmVzcwAAAANsZW4EAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAZoZWlnaHQFAAAAA2xlbgQAAAAGY2hlY2tzCQAETAAAAAIJAQAAAAttdXN0TWFuYWdlcgAAAAEFAAAAAWkJAARMAAAAAgMJAABmAAAAAgUAAAAJZW5kSGVpZ2h0BQAAAAZoZWlnaHQGCQAAAgAAAAECAAAAImVuZEhlaWdodCBtdXN0IGJlIG1vcmUgdGhhbiBoZWlnaHQJAARMAAAAAgMJAAAAAAAAAgkABCIAAAABCQEAAAAHa2V5VXNlcgAAAAEFAAAAB2FkZHJlc3MFAAAABHVuaXQGCQAAAgAAAAECAAAAH2RlcG9zaXQgZm9yIHVzZXIgYWxyZWFkeSBleGlzdHMJAARMAAAAAgMJAAAAAAAAAgkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkCQEAAAAFdmFsdWUAAAABCQAEIgAAAAEJAQAAAAxrZXlXeEFzc2V0SWQAAAAABgkAAAIAAAABAgAAABphdHRhY2hlZCBwYXltZW50IGlzIG5vdCBXWAUAAAADbmlsAwkAAAAAAAACBQAAAAZjaGVja3MFAAAABmNoZWNrcwQAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAACnZlc3RpbmdMZW4JAABlAAAAAgUAAAAJZW5kSGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleVVzZXIAAAABBQAAAAdhZGRyZXNzCQEAAAAJdmFsdWVVc2VyAAAABAUAAAAGYW1vdW50BQAAAAZhbW91bnQAAAAAAAAAAAAFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAE2tleVVzZXJWZXN0aW5nU3RhcnQAAAABBQAAAAdhZGRyZXNzBQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFrZXlVc2VyVmVzdGluZ0VuZAAAAAEFAAAAB2FkZHJlc3MFAAAACWVuZEhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFWtleVVzZXJBbW91bnRQZXJCbG9jawAAAAEFAAAAB2FkZHJlc3MJAABpAAAAAgUAAAAGYW1vdW50BQAAAAp2ZXN0aW5nTGVuBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAEHJldm9rZURlcG9zaXRGb3IAAAABAAAAB2FkZHJlc3MEAAAABmNoZWNrcwkABEwAAAACCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpCQAETAAAAAIDCQEAAAACIT0AAAACCQAEIgAAAAEJAQAAAAdrZXlVc2VyAAAAAQUAAAAHYWRkcmVzcwUAAAAEdW5pdAYJAAACAAAAAQIAAAAeZGVwb3NpdCBmb3IgdXNlciBpcyBub3QgZXhpc3RzBQAAAANuaWwDCQAAAAAAAAIFAAAABmNoZWNrcwUAAAAGY2hlY2tzCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAKa2V5UmV2b2tlZAAAAAEFAAAAB2FkZHJlc3MGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYa2V5VW5jbGFpbWVkQmVmb3JlUmV2b2tlAAAAAQUAAAAHYWRkcmVzcwkBAAAAE2F2YWlsYWJsZVRvQ2xhaW1Ob3cAAAABBQAAAAdhZGRyZXNzBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABWNsYWltAAAAAAQAAAAEYWRkcggFAAAAAWkAAAAGY2FsbGVyBAAAAAdhZGRyU3RyCQAEJQAAAAEFAAAABGFkZHIEAAAAAnd4CQACWQAAAAEJAQAAAAV2YWx1ZQAAAAEJAAQiAAAAAQkBAAAADGtleVd4QXNzZXRJZAAAAAAEAAAADWlzUmV2b2tlZFVzZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQgAAAAAQkBAAAACmtleVJldm9rZWQAAAABBQAAAAdhZGRyU3RyBwQAAAAVdW5jbGFpbWVkQmVmb3JlUmV2b2tlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABhrZXlVbmNsYWltZWRCZWZvcmVSZXZva2UAAAABBQAAAAdhZGRyU3RyAAAAAAAAAAAAAwMFAAAADWlzUmV2b2tlZFVzZXIJAABmAAAAAgUAAAAVdW5jbGFpbWVkQmVmb3JlUmV2b2tlAAAAAAAAAAAABwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAARhZGRyBQAAABV1bmNsYWltZWRCZWZvcmVSZXZva2UFAAAAAnd4CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAYa2V5VW5jbGFpbWVkQmVmb3JlUmV2b2tlAAAAAQUAAAAHYWRkclN0cgAAAAAAAAAAAAUAAAADbmlsBAAAAAt0b3RhbEFtb3VudAkBAAAAEmdldFVzZXJUb3RhbEFtb3VudAAAAAEFAAAAB2FkZHJTdHIEAAAAD3JlbWFpbmluZ0Ftb3VudAkBAAAAFmdldFVzZXJSZW1haW5pbmdBbW91bnQAAAABBQAAAAdhZGRyU3RyBAAAAA9jbGFpbWVkV1hBbW91bnQJAQAAABRnZXRVc2VyQ2xhaW1lZEFtb3VudAAAAAEFAAAAB2FkZHJTdHIEAAAAEWxhc3RDbGFpbWVkSGVpZ2h0CQEAAAAYZ2V0VXNlckxhc3RDbGFpbWVkSGVpZ2h0AAAAAQUAAAAHYWRkclN0cgQAAAAGYW1vdW50CQEAAAATYXZhaWxhYmxlVG9DbGFpbU5vdwAAAAEFAAAAB2FkZHJTdHIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAEYWRkcgUAAAAGYW1vdW50BQAAAAJ3eAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAHa2V5VXNlcgAAAAEFAAAAB2FkZHJTdHIJAQAAAAl2YWx1ZVVzZXIAAAAEBQAAAAt0b3RhbEFtb3VudAkAAGUAAAACBQAAAA9yZW1haW5pbmdBbW91bnQFAAAABmFtb3VudAkAAGQAAAACBQAAAA9jbGFpbWVkV1hBbW91bnQFAAAABmFtb3VudAUAAAAGaGVpZ2h0BQAAAANuaWwAAAABaQEAAAANY2xhaW1SRUFET05MWQAAAAEAAAAHYWRkcmVzcwQAAAAGYW1vdW50CQEAAAATYXZhaWxhYmxlVG9DbGFpbU5vdwAAAAEFAAAAB2FkZHJlc3MJAAUUAAAAAgUAAAADbmlsBQAAAAZhbW91bnQAAAABaQEAAAAFc3RhdHMAAAABAAAAB2FkZHJlc3MJAAUUAAAAAgUAAAADbmlsCQAETAAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAAE2tleVVzZXJWZXN0aW5nU3RhcnQAAAABBQAAAAdhZGRyZXNzCQAETAAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQfAAAAAQkBAAAAEWtleVVzZXJWZXN0aW5nRW5kAAAAAQUAAAAHYWRkcmVzcwkABEwAAAACCQEAAAASZ2V0VXNlclRvdGFsQW1vdW50AAAAAQUAAAAHYWRkcmVzcwkABEwAAAACCQEAAAAUZ2V0VXNlckNsYWltZWRBbW91bnQAAAABBQAAAAdhZGRyZXNzCQAETAAAAAIJAQAAABZnZXRVc2VyUmVtYWluaW5nQW1vdW50AAAAAQUAAAAHYWRkcmVzcwkABEwAAAACCQEAAAATYXZhaWxhYmxlVG9DbGFpbU5vdwAAAAEFAAAAB2FkZHJlc3MFAAAAA25pbAAAAAFpAQAAAApzZXRNYW5hZ2VyAAAAAQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQAAAALY2hlY2tDYWxsZXIJAQAAAAttdXN0TWFuYWdlcgAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgQAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQACWQAAAAEFAAAAF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAAAAAACBQAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkFAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAABQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAOY29uZmlybU1hbmFnZXIAAAAABAAAAAJwbQkBAAAAHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAQAAAAFaGFzUE0DCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAACcG0GCQAAAgAAAAECAAAAEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAAAAAAAAgUAAAAFaGFzUE0FAAAABWhhc1BNBAAAAAdjaGVja1BNAwkAAAAAAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAQAAAAV2YWx1ZQAAAAEFAAAAAnBtBgkAAAIAAAABAgAAABtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAAAAAAIFAAAAB2NoZWNrUE0FAAAAB2NoZWNrUE0JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAACQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEFAAAAAnBtCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAAFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAPdGFyZ2V0UHVibGljS2V5BAAAAAckbWF0Y2gwCQEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAnBrBQAAAAckbWF0Y2gwBQAAAAJwawMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAD3RhcmdldFB1YmxpY0tleVqHuwQ=", "height": 2035478, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 5 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let SEP = "__" | |
5 | + | ||
6 | + | func keyManagerPublicKey () = "%s__managerPublicKey" | |
7 | + | ||
8 | + | ||
9 | + | func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey" | |
10 | + | ||
11 | + | ||
12 | + | func keyUser (address) = makeString(["%s", address], SEP) | |
13 | + | ||
14 | + | ||
15 | + | func keyRevoked (address) = makeString(["%s", "revoked", address], SEP) | |
16 | + | ||
17 | + | ||
18 | + | func keyUnclaimedBeforeRevoke (address) = makeString(["%s", "unclaimedBeforeRevoke", address], SEP) | |
19 | + | ||
20 | + | ||
21 | + | func keyUserVestingStart (address) = makeString(["%s", "vestingStart", address], SEP) | |
22 | + | ||
23 | + | ||
24 | + | func keyUserVestingEnd (address) = makeString(["%s", "vestingEnd", address], SEP) | |
25 | + | ||
26 | + | ||
27 | + | func keyUserAmountPerBlock (address) = makeString(["%s", "amountPerBlock", address], SEP) | |
28 | + | ||
29 | + | ||
30 | + | func keyWxAssetId () = makeString(["%s", "wxAssetId"], SEP) | |
31 | + | ||
32 | + | ||
33 | + | func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) { | |
34 | + | case s: String => | |
35 | + | fromBase58String(s) | |
36 | + | case _: Unit => | |
37 | + | unit | |
38 | + | case _ => | |
39 | + | throw("Match error") | |
40 | + | } | |
41 | + | ||
42 | + | ||
43 | + | func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) { | |
44 | + | case s: String => | |
45 | + | fromBase58String(s) | |
46 | + | case _: Unit => | |
47 | + | unit | |
48 | + | case _ => | |
49 | + | throw("Match error") | |
50 | + | } | |
51 | + | ||
52 | + | ||
53 | + | func mustManager (i) = { | |
54 | + | let pd = throw("Permission denied") | |
55 | + | match managerPublicKeyOrUnit() { | |
56 | + | case pk: ByteVector => | |
57 | + | if ((i.callerPublicKey == pk)) | |
58 | + | then true | |
59 | + | else pd | |
60 | + | case _: Unit => | |
61 | + | if ((i.caller == this)) | |
62 | + | then true | |
63 | + | else pd | |
64 | + | case _ => | |
65 | + | throw("Match error") | |
66 | + | } | |
67 | + | } | |
68 | + | ||
69 | + | ||
70 | + | func valueUserS (totalAmount,remainingAmount,claimedWXAmount,lastClaimedHeight) = makeString(["%d%d%d%d%d", totalAmount, remainingAmount, "0", claimedWXAmount, lastClaimedHeight], SEP) | |
71 | + | ||
72 | + | ||
73 | + | func valueUser (totalAmount,remainingAmount,claimedWXAmount,lastClaimedHeight) = valueUserS(toString(totalAmount), toString(remainingAmount), toString(claimedWXAmount), toString(lastClaimedHeight)) | |
74 | + | ||
75 | + | ||
76 | + | func getUserTotalAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[1]) | |
77 | + | ||
78 | + | ||
79 | + | func getUserRemainingAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[2]) | |
80 | + | ||
81 | + | ||
82 | + | func getUserClaimedAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[3]) | |
83 | + | ||
84 | + | ||
85 | + | func getUserLastClaimedHeight (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[5]) | |
86 | + | ||
87 | + | ||
88 | + | func availableToClaimNow (address) = { | |
89 | + | let lastHeight = getUserLastClaimedHeight(address) | |
90 | + | if ((lastHeight >= height)) | |
91 | + | then 0 | |
92 | + | else { | |
93 | + | let end = value(getInteger(keyUserVestingEnd(address))) | |
94 | + | let current = if ((height > end)) | |
95 | + | then end | |
96 | + | else height | |
97 | + | let unclaimedPeriod = (current - lastHeight) | |
98 | + | (value(getInteger(keyUserAmountPerBlock(address))) * unclaimedPeriod) | |
99 | + | } | |
100 | + | } | |
101 | + | ||
102 | + | ||
103 | + | @Callable(i) | |
104 | + | func constructor (wxAssetId) = { | |
105 | + | let check = mustManager(i) | |
106 | + | if ((check == check)) | |
107 | + | then [StringEntry(keyWxAssetId(), wxAssetId)] | |
108 | + | else throw("Strict value is not equal to itself.") | |
109 | + | } | |
110 | + | ||
111 | + | ||
112 | + | ||
113 | + | @Callable(i) | |
114 | + | func createDepositFor (address,len) = { | |
115 | + | let endHeight = (height + len) | |
116 | + | let checks = [mustManager(i), if ((endHeight > height)) | |
117 | + | then true | |
118 | + | else throw("endHeight must be more than height"), if ((getString(keyUser(address)) == unit)) | |
119 | + | then true | |
120 | + | else throw("deposit for user already exists"), if ((toBase58String(value(i.payments[0].assetId)) == value(getString(keyWxAssetId())))) | |
121 | + | then true | |
122 | + | else throw("attached payment is not WX")] | |
123 | + | if ((checks == checks)) | |
124 | + | then { | |
125 | + | let amount = i.payments[0].amount | |
126 | + | let vestingLen = (endHeight - height) | |
127 | + | [StringEntry(keyUser(address), valueUser(amount, amount, 0, height)), IntegerEntry(keyUserVestingStart(address), height), IntegerEntry(keyUserVestingEnd(address), endHeight), IntegerEntry(keyUserAmountPerBlock(address), (amount / vestingLen))] | |
128 | + | } | |
129 | + | else throw("Strict value is not equal to itself.") | |
130 | + | } | |
131 | + | ||
132 | + | ||
133 | + | ||
134 | + | @Callable(i) | |
135 | + | func revokeDepositFor (address) = { | |
136 | + | let checks = [mustManager(i), if ((getString(keyUser(address)) != unit)) | |
137 | + | then true | |
138 | + | else throw("deposit for user is not exists")] | |
139 | + | if ((checks == checks)) | |
140 | + | then [BooleanEntry(keyRevoked(address), true), IntegerEntry(keyUnclaimedBeforeRevoke(address), availableToClaimNow(address))] | |
141 | + | else throw("Strict value is not equal to itself.") | |
142 | + | } | |
143 | + | ||
144 | + | ||
145 | + | ||
146 | + | @Callable(i) | |
147 | + | func claim () = { | |
148 | + | let addr = i.caller | |
149 | + | let addrStr = toString(addr) | |
150 | + | let wx = fromBase58String(value(getString(keyWxAssetId()))) | |
151 | + | let isRevokedUser = valueOrElse(getBoolean(keyRevoked(addrStr)), false) | |
152 | + | let unclaimedBeforeRevoke = valueOrElse(getInteger(keyUnclaimedBeforeRevoke(addrStr)), 0) | |
153 | + | if (if (isRevokedUser) | |
154 | + | then (unclaimedBeforeRevoke > 0) | |
155 | + | else false) | |
156 | + | then [ScriptTransfer(addr, unclaimedBeforeRevoke, wx), IntegerEntry(keyUnclaimedBeforeRevoke(addrStr), 0)] | |
157 | + | else { | |
158 | + | let totalAmount = getUserTotalAmount(addrStr) | |
159 | + | let remainingAmount = getUserRemainingAmount(addrStr) | |
160 | + | let claimedWXAmount = getUserClaimedAmount(addrStr) | |
161 | + | let lastClaimedHeight = getUserLastClaimedHeight(addrStr) | |
162 | + | let amount = availableToClaimNow(addrStr) | |
163 | + | [ScriptTransfer(addr, amount, wx), StringEntry(keyUser(addrStr), valueUser(totalAmount, (remainingAmount - amount), (claimedWXAmount + amount), height))] | |
164 | + | } | |
165 | + | } | |
166 | + | ||
167 | + | ||
168 | + | ||
169 | + | @Callable(i) | |
170 | + | func claimREADONLY (address) = { | |
171 | + | let amount = availableToClaimNow(address) | |
172 | + | $Tuple2(nil, amount) | |
173 | + | } | |
174 | + | ||
175 | + | ||
176 | + | ||
177 | + | @Callable(i) | |
178 | + | func stats (address) = $Tuple2(nil, [value(getInteger(keyUserVestingStart(address))), value(getInteger(keyUserVestingEnd(address))), getUserTotalAmount(address), getUserClaimedAmount(address), getUserRemainingAmount(address), availableToClaimNow(address)]) | |
179 | + | ||
180 | + | ||
181 | + | ||
182 | + | @Callable(i) | |
183 | + | func setManager (pendingManagerPublicKey) = { | |
184 | + | let checkCaller = mustManager(i) | |
185 | + | if ((checkCaller == checkCaller)) | |
186 | + | then { | |
187 | + | let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey) | |
188 | + | if ((checkManagerPublicKey == checkManagerPublicKey)) | |
189 | + | then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)] | |
190 | + | else throw("Strict value is not equal to itself.") | |
191 | + | } | |
192 | + | else throw("Strict value is not equal to itself.") | |
193 | + | } | |
194 | + | ||
195 | + | ||
196 | + | ||
197 | + | @Callable(i) | |
198 | + | func confirmManager () = { | |
199 | + | let pm = pendingManagerPublicKeyOrUnit() | |
200 | + | let hasPM = if (isDefined(pm)) | |
201 | + | then true | |
202 | + | else throw("No pending manager") | |
203 | + | if ((hasPM == hasPM)) | |
204 | + | then { | |
205 | + | let checkPM = if ((i.callerPublicKey == value(pm))) | |
206 | + | then true | |
207 | + | else throw("You are not pending manager") | |
208 | + | if ((checkPM == checkPM)) | |
209 | + | then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())] | |
210 | + | else throw("Strict value is not equal to itself.") | |
211 | + | } | |
212 | + | else throw("Strict value is not equal to itself.") | |
213 | + | } | |
214 | + | ||
215 | + | ||
216 | + | @Verifier(tx) | |
217 | + | func verify () = { | |
218 | + | let targetPublicKey = match managerPublicKeyOrUnit() { | |
219 | + | case pk: ByteVector => | |
220 | + | pk | |
221 | + | case _: Unit => | |
222 | + | tx.senderPublicKey | |
223 | + | case _ => | |
224 | + | throw("Match error") | |
225 | + | } | |
226 | + | sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey) | |
227 | + | } | |
228 | + |
github/deemru/w8io/169f3d6 27.14 ms ◑