tx · BFzx49t152TxbUarQ1Ygo85cBgSh1P7y8CuD6MEbXTAN 3ND9uQikdMjKiF3ezqBfa5sKKqp5rJ3ekCB: -0.01400000 Waves 2019.10.04 14:24 [704912] smart account 3ND9uQikdMjKiF3ezqBfa5sKKqp5rJ3ekCB > SELF 0.00000000 Waves
{ "type": 13, "id": "BFzx49t152TxbUarQ1Ygo85cBgSh1P7y8CuD6MEbXTAN", "fee": 1400000, "feeAssetId": null, "timestamp": 1570188307796, "version": 1, "sender": "3ND9uQikdMjKiF3ezqBfa5sKKqp5rJ3ekCB", "senderPublicKey": "Asd7Ne84RczS6Fag55bmJp4iRZEzpcib9qUmwUu8N7n1", "proofs": [ "3m4A7ep9ZMvWZSNnbxZgKt8W4M6HiZHrgPcJnTJ6W5MYmGyG8NzidA6aLaSKs96eL47HiZEBJ1xXvGioBahEBiPa" ], "script": "base64:AAIDAAAAAAAAAAAAAAAmAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADGdldEJvb2xCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQcBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAAAAAAAD0xJU1RTUExJVFNZTUJPTAIAAAABXwAAAAAPUEVSQ0VOVEFDQ1VSQUNZAAAAAAAAACcQAAAAAAdXQVZFTEVUAAAAAAAF9eEAAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAAA5Cb25kQXNzZXRJZEtleQIAAAANYm9uZF9hc3NldF9pZAAAAAATTmV1dHJpbm9Db250cmFjdEtleQIAAAARbmV1dHJpbm9fY29udHJhY3QAAAAACkJhbGFuY2VLZXkCAAAAC3JwZF9iYWxhbmNlAAAAAAxTeW5jSW5kZXhLZXkCAAAADnJwZF9zeW5jX2luZGV4AAAAAAlQcm9maXRLZXkCAAAACnJwZF9wcm9maXQAAAAAEUJhbGFuY2VIaXN0b3J5S2V5AgAAAA9iYWxhbmNlX2hpc3RvcnkAAAAADElzQ2xhaW1lZEtleQIAAAAKaXNfY2xhaW1lZAEAAAAYZ2V0VXNlckJhbGFuY2VIaXN0b3J5S2V5AAAAAQAAAAVvd25lcgkAASwAAAACCQABLAAAAAIFAAAAEUJhbGFuY2VIaXN0b3J5S2V5AgAAAAFfBQAAAAVvd25lcgEAAAARZ2V0VXNlckJhbGFuY2VLZXkAAAACAAAABW93bmVyAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAKQmFsYW5jZUtleQIAAAABXwUAAAAHYXNzZXRJZAIAAAABXwUAAAAFb3duZXIBAAAAGGdldFVzZXJCYWxhbmNlS2V5QnlDb3VudAAAAAMAAAAFb3duZXIAAAAFY291bnQAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAABW93bmVyBQAAAAdhc3NldElkAgAAAAFfCQABpAAAAAEFAAAABWNvdW50AQAAAA9nZXRJc0NsYWltZWRLZXkAAAACAAAABW93bmVyAAAABWNvdW50CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADElzQ2xhaW1lZEtleQIAAAABXwUAAAAFb3duZXICAAAAAV8JAAGkAAAAAQUAAAAFY291bnQBAAAAFWdldENvbnRyYWN0QmFsYW5jZUtleQAAAAEAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIFAAAACkJhbGFuY2VLZXkCAAAAAV8FAAAAB2Fzc2V0SWQBAAAAHWdldFNuYXBzaG90Q29udHJhY3RCYWxhbmNlS2V5AAAAAgAAAAVjb3VudAAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAACkJhbGFuY2VLZXkCAAAAAV8FAAAAB2Fzc2V0SWQCAAAAAV8JAAGkAAAAAQUAAAAFY291bnQBAAAADGdldFByb2ZpdEtleQAAAAEAAAAFY291bnQJAAEsAAAAAgkAASwAAAACBQAAAAlQcm9maXRLZXkCAAAAAV8JAAGkAAAAAQUAAAAFY291bnQAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAE05ldXRyaW5vQ29udHJhY3RLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASTmV1dHJpbm9Bc3NldElkS2V5AAAAAAtib25kQXNzZXRJZAkAAlkAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAOQm9uZEFzc2V0SWRLZXkAAAAACXN5bmNJbmRleAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAADFN5bmNJbmRleEtleQEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQAAAAdhc3NldElkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAAHYXNzZXRJZAEAAAAaZ2V0U25hcHNob3RDb250cmFjdEJhbGFuY2UAAAACAAAABWNvdW50AAAAB2Fzc2V0SWQJAQAAABhnZXROdW1iZXJCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAdZ2V0U25hcHNob3RDb250cmFjdEJhbGFuY2VLZXkAAAACBQAAAAVjb3VudAUAAAAHYXNzZXRJZAEAAAAJZ2V0UHJvZml0AAAAAQAAAAVjb3VudAkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAAxnZXRQcm9maXRLZXkAAAABBQAAAAVjb3VudAEAAAAOZ2V0VXNlckJhbGFuY2UAAAACAAAABW93bmVyAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAABW93bmVyBQAAAAdhc3NldElkAQAAABVnZXRVc2VyQmFsYW5jZUJ5Q291bnQAAAADAAAABW93bmVyAAAABWNvdW50AAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABhnZXRVc2VyQmFsYW5jZUtleUJ5Q291bnQAAAADBQAAAAVvd25lcgUAAAAFY291bnQFAAAAB2Fzc2V0SWQBAAAAFWdldFVzZXJCYWxhbmNlSGlzdG9yeQAAAAEAAAAFb3duZXIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABhnZXRVc2VyQmFsYW5jZUhpc3RvcnlLZXkAAAABBQAAAAVvd25lcgEAAAAJaXNDbGFpbWVkAAAAAgAAAAVvd25lcgAAAAVjb3VudAkBAAAADGdldEJvb2xCeUtleQAAAAEJAQAAAA9nZXRJc0NsYWltZWRLZXkAAAACBQAAAAVvd25lcgUAAAAFY291bnQBAAAAEWdldEhpc3RvcnlFbGVtZW50AAAAAQAAAAVjb3VudAkAASwAAAACCQABpAAAAAEFAAAABWNvdW50BQAAAA9MSVNUU1BMSVRTWU1CT0wBAAAAEWFkZEJhbGFuY2VIaXN0b3J5AAAAAgAAAAdoaXN0b3J5AAAAB2VsZW1lbnQJAAEsAAAAAgUAAAAHaGlzdG9yeQUAAAAHZWxlbWVudAEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQAAAAZhbW91bnQJAABpAAAAAgUAAAAGYW1vdW50BQAAAAdXQVZFTEVUAQAAABVjb252ZXJ0Qm9uZFRvTmV1dHJpbm8AAAABAAAABmFtb3VudAkAAGgAAAACBQAAAAZhbW91bnQFAAAAB1dBVkVMRVQAAAADAAAAAWkBAAAADGxvY2tOZXV0cmlubwAAAAAEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50AwMJAQAAAAIhPQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAC2JvbmRBc3NldElkBwkAAAIAAAABAgAAAB1jYW4gdXNlIG5ldXRyaW5vIG9yIGJvbmQgb25seQQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADWFzc2V0SWRTdHJpbmcJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAdiYWxhbmNlCQAAZAAAAAIJAQAAAA5nZXRVc2VyQmFsYW5jZQAAAAIFAAAAB2FjY291bnQFAAAADWFzc2V0SWRTdHJpbmcIBQAAAANwbXQAAAAGYW1vdW50BAAAAA1oaXN0b3J5U3RyaW5nCQEAAAAVZ2V0VXNlckJhbGFuY2VIaXN0b3J5AAAAAQUAAAAHYWNjb3VudAQAAAAHaGlzdG9yeQkABLUAAAACBQAAAA1oaXN0b3J5U3RyaW5nBQAAAA9MSVNUU1BMSVRTWU1CT0wEAAAABWluZGV4CQAAZQAAAAIJAAGQAAAAAQUAAAAHaGlzdG9yeQAAAAAAAAAAAgQAAAAKbmV3SGlzdG9yeQMDCQEAAAACIT0AAAACBQAAAA1oaXN0b3J5U3RyaW5nAgAAAAAJAAAAAAAAAgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAB2hpc3RvcnkFAAAABWluZGV4BQAAAAlzeW5jSW5kZXgHBQAAAA1oaXN0b3J5U3RyaW5nCQEAAAARYWRkQmFsYW5jZUhpc3RvcnkAAAACBQAAAA1oaXN0b3J5U3RyaW5nCQEAAAARZ2V0SGlzdG9yeUVsZW1lbnQAAAABBQAAAAlzeW5jSW5kZXgJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAA1hc3NldElkU3RyaW5nCQAAZAAAAAIJAQAAABJnZXRDb250cmFjdEJhbGFuY2UAAAABBQAAAA1hc3NldElkU3RyaW5nCAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwUAAAAHYmFsYW5jZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAGGdldFVzZXJCYWxhbmNlS2V5QnlDb3VudAAAAAMFAAAAB2FjY291bnQFAAAACXN5bmNJbmRleAUAAAANYXNzZXRJZFN0cmluZwUAAAAHYmFsYW5jZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAGGdldFVzZXJCYWxhbmNlSGlzdG9yeUtleQAAAAEFAAAAB2FjY291bnQFAAAACm5ld0hpc3RvcnkFAAAAA25pbAAAAAFpAQAAAA51bmxvY2tOZXV0cmlubwAAAAIAAAAMdW5sb2NrQW1vdW50AAAADWFzc2V0SWRTdHJpbmcEAAAAB2FjY291bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAdhc3NldElkCQACWQAAAAEFAAAADWFzc2V0SWRTdHJpbmcEAAAAB2JhbGFuY2UJAABlAAAAAgkBAAAADmdldFVzZXJCYWxhbmNlAAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwUAAAAMdW5sb2NrQW1vdW50AwkAAGYAAAACAAAAAAAAAAAABQAAAAdiYWxhbmNlCQAAAgAAAAECAAAADmludmFsaWQgYW1vdW50AwMJAQAAAAIhPQAAAAIFAAAAB2Fzc2V0SWQFAAAAD25ldXRyaW5vQXNzZXRJZAkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAUAAAALYm9uZEFzc2V0SWQHCQAAAgAAAAECAAAAHWNhbiB1c2UgbmV1dHJpbm8gb3IgYm9uZCBvbmx5BAAAAA1oaXN0b3J5U3RyaW5nCQEAAAAVZ2V0VXNlckJhbGFuY2VIaXN0b3J5AAAAAQUAAAAHYWNjb3VudAQAAAAHaGlzdG9yeQkABLUAAAACBQAAAA1oaXN0b3J5U3RyaW5nBQAAAA9MSVNUU1BMSVRTWU1CT0wEAAAABWluZGV4CQAAZQAAAAIJAAGQAAAAAQUAAAAHaGlzdG9yeQAAAAAAAAAAAgQAAAAKbmV3SGlzdG9yeQMDCQEAAAACIT0AAAACBQAAAA1oaXN0b3J5U3RyaW5nAgAAAAAJAAAAAAAAAgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAB2hpc3RvcnkFAAAABWluZGV4BQAAAAlzeW5jSW5kZXgHBQAAAA1oaXN0b3J5U3RyaW5nCQEAAAARYWRkQmFsYW5jZUhpc3RvcnkAAAACBQAAAA1oaXN0b3J5U3RyaW5nCQEAAAARZ2V0SGlzdG9yeUVsZW1lbnQAAAABBQAAAAlzeW5jSW5kZXgJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAApCYWxhbmNlS2V5CQAAZQAAAAIJAQAAABJnZXRDb250cmFjdEJhbGFuY2UAAAABBQAAAA1hc3NldElkU3RyaW5nBQAAAAx1bmxvY2tBbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAAB2FjY291bnQFAAAADWFzc2V0SWRTdHJpbmcFAAAAB2JhbGFuY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRVc2VyQmFsYW5jZUtleUJ5Q291bnQAAAADBQAAAAdhY2NvdW50BQAAAAlzeW5jSW5kZXgFAAAADWFzc2V0SWRTdHJpbmcFAAAAB2JhbGFuY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABhnZXRVc2VyQmFsYW5jZUhpc3RvcnlLZXkAAAABBQAAAAdhY2NvdW50BQAAAApuZXdIaXN0b3J5BQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdhY2NvdW50BQAAAAx1bmxvY2tBbW91bnQFAAAAD25ldXRyaW5vQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAgAAAA9wcm9maXRTeW5jSW5kZXgAAAAMaGlzdG9yeUluZGV4BAAAAAdhY2NvdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAANaGlzdG9yeVN0cmluZwkBAAAAFWdldFVzZXJCYWxhbmNlSGlzdG9yeQAAAAEFAAAAB2FjY291bnQEAAAAB2hpc3RvcnkJAAS1AAAAAgUAAAANaGlzdG9yeVN0cmluZwUAAAAPTElTVFNQTElUU1lNQk9MBAAAAApsb2NrQWN0dWFsCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAHaGlzdG9yeQUAAAAMaGlzdG9yeUluZGV4AwkBAAAACWlzQ2xhaW1lZAAAAAIFAAAAB2FjY291bnQFAAAAD3Byb2ZpdFN5bmNJbmRleAkAAAIAAAABCQABLAAAAAICAAAAHWFjY291bnQgaXMgY2xhaW1lZCBycGRfY291bnQ6CQABpAAAAAEFAAAAD3Byb2ZpdFN5bmNJbmRleAMDCQAAZgAAAAIFAAAAD3Byb2ZpdFN5bmNJbmRleAUAAAAKbG9ja0FjdHVhbAYDCQAAZgAAAAIJAAGQAAAAAQUAAAAHaGlzdG9yeQkAAGQAAAACBQAAAAxoaXN0b3J5SW5kZXgAAAAAAAAAAAIJAABmAAAAAgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAB2hpc3RvcnkJAABkAAAAAgUAAAAMaGlzdG9yeUluZGV4AAAAAAAAAAABBQAAAA9wcm9maXRTeW5jSW5kZXgHCQAAAgAAAAECAAAAFWludmFsaWQgaGlzdG9yeSBpbmRleAQAAAAVbmV1dHJpbm9Bc3NldElkU3RyaW5nCQACWAAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAQAAAARYm9uZEFzc2V0SWRTdHJpbmcJAAJYAAAAAQUAAAALYm9uZEFzc2V0SWQEAAAAB2JhbGFuY2UJAABkAAAAAgkBAAAAFWdldFVzZXJCYWxhbmNlQnlDb3VudAAAAAMFAAAAB2FjY291bnQFAAAACmxvY2tBY3R1YWwFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlubwAAAAEJAQAAABVnZXRVc2VyQmFsYW5jZUJ5Q291bnQAAAADBQAAAAdhY2NvdW50BQAAAApsb2NrQWN0dWFsBQAAABFib25kQXNzZXRJZFN0cmluZwQAAAAMc2hhcmVQZXJjZW50CQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAAAdiYWxhbmNlBQAAAA9QRVJDRU5UQUNDVVJBQ1kAAAAAAAAAAGQJAABkAAAAAgkBAAAAGmdldFNuYXBzaG90Q29udHJhY3RCYWxhbmNlAAAAAgUAAAAPcHJvZml0U3luY0luZGV4BQAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcJAQAAABVjb252ZXJ0Qm9uZFRvTmV1dHJpbm8AAAABCQEAAAAaZ2V0U25hcHNob3RDb250cmFjdEJhbGFuY2UAAAACBQAAAA9wcm9maXRTeW5jSW5kZXgFAAAAEWJvbmRBc3NldElkU3RyaW5nBAAAAAZwcm9maXQJAABpAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAADHNoYXJlUGVyY2VudAkBAAAACWdldFByb2ZpdAAAAAEFAAAAD3Byb2ZpdFN5bmNJbmRleAAAAAAAAAAAZAUAAAAPUEVSQ0VOVEFDQ1VSQUNZCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAD2dldElzQ2xhaW1lZEtleQAAAAIFAAAAB2FjY291bnQFAAAAD3Byb2ZpdFN5bmNJbmRleAYFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FjY291bnQFAAAABnByb2ZpdAUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwAAAAAULjCHw==", "chainId": 84, "height": 704912, "spentComplexity": 0 } View: original | compacted Prev: none Next: E1YT4dtWrgomznF8CwkBqrAwaKzdbsSNzXqhfgmdzfhn Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 3 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func getNumberByKey (key) = match getInteger(this, key) { | |
5 | + | case a: Int => | |
6 | + | a | |
7 | + | case _ => | |
8 | + | 0 | |
9 | + | } | |
10 | + | ||
11 | + | ||
12 | + | func getStringByKey (key) = match getString(this, key) { | |
13 | + | case a: String => | |
14 | + | a | |
15 | + | case _ => | |
16 | + | "" | |
17 | + | } | |
18 | + | ||
19 | + | ||
20 | + | func getBoolByKey (key) = match getBoolean(this, key) { | |
21 | + | case a: Boolean => | |
22 | + | a | |
23 | + | case _ => | |
24 | + | false | |
25 | + | } | |
26 | + | ||
27 | + | ||
28 | + | func getNumberByAddressAndKey (address,key) = match getInteger(addressFromStringValue(address), key) { | |
29 | + | case a: Int => | |
30 | + | a | |
31 | + | case _ => | |
32 | + | 0 | |
33 | + | } | |
34 | + | ||
35 | + | ||
36 | + | func getStringByAddressAndKey (address,key) = match getString(addressFromStringValue(address), key) { | |
37 | + | case a: String => | |
38 | + | a | |
39 | + | case _ => | |
40 | + | "" | |
41 | + | } | |
42 | + | ||
43 | + | ||
44 | + | let LISTSPLITSYMBOL = "_" | |
45 | + | ||
46 | + | let PERCENTACCURACY = 10000 | |
47 | + | ||
48 | + | let WAVELET = 100000000 | |
49 | + | ||
50 | + | let NeutrinoAssetIdKey = "neutrino_asset_id" | |
51 | + | ||
52 | + | let BondAssetIdKey = "bond_asset_id" | |
53 | + | ||
54 | + | let NeutrinoContractKey = "neutrino_contract" | |
55 | + | ||
56 | + | let BalanceKey = "rpd_balance" | |
57 | + | ||
58 | + | let SyncIndexKey = "rpd_sync_index" | |
59 | + | ||
60 | + | let ProfitKey = "rpd_profit" | |
61 | + | ||
62 | + | let BalanceHistoryKey = "balance_history" | |
63 | + | ||
64 | + | let IsClaimedKey = "is_claimed" | |
65 | + | ||
66 | + | func getUserBalanceHistoryKey (owner) = ((BalanceHistoryKey + "_") + owner) | |
67 | + | ||
68 | + | ||
69 | + | func getUserBalanceKey (owner,assetId) = ((((BalanceKey + "_") + assetId) + "_") + owner) | |
70 | + | ||
71 | + | ||
72 | + | func getUserBalanceKeyByCount (owner,count,assetId) = ((getUserBalanceKey(owner, assetId) + "_") + toString(count)) | |
73 | + | ||
74 | + | ||
75 | + | func getIsClaimedKey (owner,count) = ((((IsClaimedKey + "_") + owner) + "_") + toString(count)) | |
76 | + | ||
77 | + | ||
78 | + | func getContractBalanceKey (assetId) = ((BalanceKey + "_") + assetId) | |
79 | + | ||
80 | + | ||
81 | + | func getSnapshotContractBalanceKey (count,assetId) = ((((BalanceKey + "_") + assetId) + "_") + toString(count)) | |
82 | + | ||
83 | + | ||
84 | + | func getProfitKey (count) = ((ProfitKey + "_") + toString(count)) | |
85 | + | ||
86 | + | ||
87 | + | let neutrinoContract = getStringByKey(NeutrinoContractKey) | |
88 | + | ||
89 | + | let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey)) | |
90 | + | ||
91 | + | let bondAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, BondAssetIdKey)) | |
92 | + | ||
93 | + | let syncIndex = getNumberByAddressAndKey(neutrinoContract, SyncIndexKey) | |
94 | + | ||
95 | + | func getContractBalance (assetId) = getNumberByKey(getContractBalanceKey(assetId)) | |
96 | + | ||
97 | + | ||
98 | + | func getSnapshotContractBalance (count,assetId) = getNumberByAddressAndKey(neutrinoContract, getSnapshotContractBalanceKey(count, assetId)) | |
99 | + | ||
100 | + | ||
101 | + | func getProfit (count) = getNumberByAddressAndKey(neutrinoContract, getProfitKey(count)) | |
102 | + | ||
103 | + | ||
104 | + | func getUserBalance (owner,assetId) = getNumberByKey(getUserBalanceKey(owner, assetId)) | |
105 | + | ||
106 | + | ||
107 | + | func getUserBalanceByCount (owner,count,assetId) = getNumberByKey(getUserBalanceKeyByCount(owner, count, assetId)) | |
108 | + | ||
109 | + | ||
110 | + | func getUserBalanceHistory (owner) = getStringByKey(getUserBalanceHistoryKey(owner)) | |
111 | + | ||
112 | + | ||
113 | + | func isClaimed (owner,count) = getBoolByKey(getIsClaimedKey(owner, count)) | |
114 | + | ||
115 | + | ||
116 | + | func getHistoryElement (count) = (toString(count) + LISTSPLITSYMBOL) | |
117 | + | ||
118 | + | ||
119 | + | func addBalanceHistory (history,element) = (history + element) | |
120 | + | ||
121 | + | ||
122 | + | func convertNeutrinoToBond (amount) = (amount / WAVELET) | |
123 | + | ||
124 | + | ||
125 | + | func convertBondToNeutrino (amount) = (amount * WAVELET) | |
126 | + | ||
127 | + | ||
128 | + | @Callable(i) | |
129 | + | func lockNeutrino () = { | |
130 | + | let pmt = extract(i.payment) | |
131 | + | if (if ((pmt.assetId != neutrinoAssetId)) | |
132 | + | then (pmt.assetId != bondAssetId) | |
133 | + | else false) | |
134 | + | then throw("can use neutrino or bond only") | |
135 | + | else { | |
136 | + | let account = toString(i.caller) | |
137 | + | let assetIdString = toBase58String(value(pmt.assetId)) | |
138 | + | let balance = (getUserBalance(account, assetIdString) + pmt.amount) | |
139 | + | let historyString = getUserBalanceHistory(account) | |
140 | + | let history = split(historyString, LISTSPLITSYMBOL) | |
141 | + | let index = (size(history) - 2) | |
142 | + | let newHistory = if (if ((historyString != "")) | |
143 | + | then (parseIntValue(history[index]) == syncIndex) | |
144 | + | else false) | |
145 | + | then historyString | |
146 | + | else addBalanceHistory(historyString, getHistoryElement(syncIndex)) | |
147 | + | WriteSet([DataEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) + pmt.amount)), DataEntry(getUserBalanceKey(account, assetIdString), balance), DataEntry(getUserBalanceKeyByCount(account, syncIndex, assetIdString), balance), DataEntry(getUserBalanceHistoryKey(account), newHistory)]) | |
148 | + | } | |
149 | + | } | |
150 | + | ||
151 | + | ||
152 | + | ||
153 | + | @Callable(i) | |
154 | + | func unlockNeutrino (unlockAmount,assetIdString) = { | |
155 | + | let account = toString(i.caller) | |
156 | + | let assetId = fromBase58String(assetIdString) | |
157 | + | let balance = (getUserBalance(account, assetIdString) - unlockAmount) | |
158 | + | if ((0 > balance)) | |
159 | + | then throw("invalid amount") | |
160 | + | else if (if ((assetId != neutrinoAssetId)) | |
161 | + | then (assetId != bondAssetId) | |
162 | + | else false) | |
163 | + | then throw("can use neutrino or bond only") | |
164 | + | else { | |
165 | + | let historyString = getUserBalanceHistory(account) | |
166 | + | let history = split(historyString, LISTSPLITSYMBOL) | |
167 | + | let index = (size(history) - 2) | |
168 | + | let newHistory = if (if ((historyString != "")) | |
169 | + | then (parseIntValue(history[index]) == syncIndex) | |
170 | + | else false) | |
171 | + | then historyString | |
172 | + | else addBalanceHistory(historyString, getHistoryElement(syncIndex)) | |
173 | + | ScriptResult(WriteSet([DataEntry(BalanceKey, (getContractBalance(assetIdString) - unlockAmount)), DataEntry(getUserBalanceKey(account, assetIdString), balance), DataEntry(getUserBalanceKeyByCount(account, syncIndex, assetIdString), balance), DataEntry(getUserBalanceHistoryKey(account), newHistory)]), TransferSet([ScriptTransfer(addressFromStringValue(account), unlockAmount, neutrinoAssetId)])) | |
174 | + | } | |
175 | + | } | |
176 | + | ||
177 | + | ||
178 | + | ||
179 | + | @Callable(i) | |
180 | + | func withdraw (profitSyncIndex,historyIndex) = { | |
181 | + | let account = toString(i.caller) | |
182 | + | let historyString = getUserBalanceHistory(account) | |
183 | + | let history = split(historyString, LISTSPLITSYMBOL) | |
184 | + | let lockActual = parseIntValue(history[historyIndex]) | |
185 | + | if (isClaimed(account, profitSyncIndex)) | |
186 | + | then throw(("account is claimed rpd_count:" + toString(profitSyncIndex))) | |
187 | + | else if (if ((profitSyncIndex > lockActual)) | |
188 | + | then true | |
189 | + | else if ((size(history) > (historyIndex + 2))) | |
190 | + | then (parseIntValue(history[(historyIndex + 1)]) > profitSyncIndex) | |
191 | + | else false) | |
192 | + | then throw("invalid history index") | |
193 | + | else { | |
194 | + | let neutrinoAssetIdString = toBase58String(neutrinoAssetId) | |
195 | + | let bondAssetIdString = toBase58String(bondAssetId) | |
196 | + | let balance = (getUserBalanceByCount(account, lockActual, neutrinoAssetIdString) + convertBondToNeutrino(getUserBalanceByCount(account, lockActual, bondAssetIdString))) | |
197 | + | let sharePercent = (((balance * PERCENTACCURACY) * 100) / (getSnapshotContractBalance(profitSyncIndex, neutrinoAssetIdString) + convertBondToNeutrino(getSnapshotContractBalance(profitSyncIndex, bondAssetIdString)))) | |
198 | + | let profit = (((sharePercent * getProfit(profitSyncIndex)) / 100) / PERCENTACCURACY) | |
199 | + | ScriptResult(WriteSet([DataEntry(getIsClaimedKey(account, profitSyncIndex), true)]), TransferSet([ScriptTransfer(addressFromStringValue(account), profit, neutrinoAssetId)])) | |
200 | + | } | |
201 | + | } | |
202 | + | ||
203 | + |
github/deemru/w8io/169f3d6 19.41 ms ◑![]()