2022.03.24 18:44 [3043379] smart account 3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ > SELF 0.00000000 Waves
{ "type": 13, "id": "AyBu18r4ReSDqVf2fzZ9bauZGLXyWNZpvvVu2kwFETfo", "fee": 14000000, "feeAssetId": null, "timestamp": 1648138362949, "version": 1, "sender": "3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ", "senderPublicKey": "6E2n1DAd4jnydbL7hMWLtjfW6VKrAGnFrNzfddAUnWq7", "proofs": [ "43eaEwUXBtQikHLURFzMeNwJYaFqfibkNsQt326BZMRwcNLZhHks3tVkx9GSkYvma74Ljsg2qFP6eh7WKaSGqx5J", "UHTxqjWfsjVk3kw8nxdagdfmmJSPrQ9UJWierkwuzYcWxoADjv7pHfKPUkqnAmStg4wGFyF2MBEhWSBRKTuKTGq", "5jJJkNJF4JEvVQ8WH7tRQ4B2MdvLs6eAfpcHRgFCPpzjthNmWVKyrC5Y1vFe9BmE61vMoCBfkCULC6fFkq5ZSgAN", "44n7SBoN4ztjH135DyuxTMtweAnqkDLtsnuo9Q5marQVLEog5dcR8VV523UZRJNqHXYbDXz4MRVYoDLSZBZF4wK7" ], "script": "base64:AAIFAAAAAAAAAB4IAhIECgIIARIAEgQKAggBEgASBAoCAQgSBAoCAQgAAAAjAAAAAAtyZXZpc2lvbk51bQIAAAAoNDQzYzY0ZGQ1MDU2YjViZTIzYjcwMDIyNDY5OTI5NWU3MzNlMDQ1MgEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkAAAAAAAAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AgAAAAABAAAADGdldEJvb2xCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQcBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAHYWRkcmVzcwUAAAADa2V5AAAAAAAAAAAAAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQIAAAAAAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAABNOZXV0cmlub0NvbnRyYWN0S2V5AgAAABFuZXV0cmlub19jb250cmFjdAAAAAAKQmFsYW5jZUtleQIAAAALcnBkX2JhbGFuY2UAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAAOTnNidEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAACUFkbWluc0tleQIAAAAGYWRtaW5zAAAAAAhVU0ROVFlQRQIAAAAEVVNETgAAAAAITlNCVFRZUEUCAAAABE5TQlQBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgAAAAVvd25lcgAAAAdhc3NldElkCQAEuQAAAAIJAARMAAAAAgUAAAAKQmFsYW5jZUtleQkABEwAAAACBQAAAAdhc3NldElkCQAETAAAAAIFAAAABW93bmVyBQAAAANuaWwCAAAAAV8BAAAAFWdldENvbnRyYWN0QmFsYW5jZUtleQAAAAEAAAAHYXNzZXRJZAkAASwAAAACCQABLAAAAAIFAAAACkJhbGFuY2VLZXkCAAAAAV8FAAAAB2Fzc2V0SWQBAAAAFGdldEV4cGlyZVByb3Bvc2FsS2V5AAAAAQAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgIAAAAPcHJvcG9zYWxfZXhwaXJlAgAAAAFfBQAAAARoYXNoAQAAABNnZXRPd25lclByb3Bvc2FsS2V5AAAAAQAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgIAAAAOcHJvcG9zYWxfb3duZXICAAAAAV8FAAAABGhhc2gBAAAAF2dldEFyZ3VtZW50c1Byb3Bvc2FsS2V5AAAAAQAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgIAAAAScHJvcG9zYWxfYXJndW1lbnRzAgAAAAFfBQAAAARoYXNoAQAAAApnZXRWb3RlS2V5AAAAAgAAAAVvd25lcgAAAARoYXNoCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADXByb3Bvc2FsX3ZvdGUCAAAAAV8FAAAABW93bmVyAgAAAAFfBQAAAARoYXNoAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAQAAAAlqc29uQXJyYXkJAAS1AAAAAgUAAAAJanNvbkFycmF5AgAAAAEsAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABNOZXV0cmlub0NvbnRyYWN0S2V5AAAAAA9jb250cm9sQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABJDb250cm9sQ29udHJhY3RLZXkAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAASTmV1dHJpbm9Bc3NldElkS2V5AAAAAA5uc2J0QXNzZXRJZFN0cgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAADk5zYnRBc3NldElkS2V5AAAAAAtuc2J0QXNzZXRJZAkAAlkAAAABBQAAAA5uc2J0QXNzZXRJZFN0cgEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQAAAAdhc3NldElkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAAHYXNzZXRJZAEAAAAOZ2V0VXNlckJhbGFuY2UAAAACAAAABW93bmVyAAAAB2Fzc2V0SWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABFnZXRVc2VyQmFsYW5jZUtleQAAAAIFAAAABW93bmVyBQAAAAdhc3NldElkAQAAABNnZXRSZXdhcmRzQ29uZmlnS2V5AAAAAwAAAAVvd25lcgAAAAVzaGFyZQAAAAhyZWNlaXZlcgkABLkAAAACCQAETAAAAAICAAAADXN0YWtpbmdjb25maWcJAARMAAAAAgUAAAAFb3duZXIJAARMAAAAAgkAAaQAAAABBQAAAAVzaGFyZQkABEwAAAACBQAAAAhyZWNlaXZlcgUAAAADbmlsAgAAAAFfAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEAAAAFb3duZXIJAAEsAAAAAgIAAAAWc3Rha2luZ2NvbmZpZ19jdXJyZW50XwUAAAAFb3duZXIBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIAAAAJY29uZmlnS2V5AAAAB2lzU3RhcnQJAAEsAAAAAgUAAAAJY29uZmlnS2V5AwUAAAAHaXNTdGFydAIAAAAGX3N0YXJ0AgAAAARfZW5kAQAAABtnZXRSZXdhcmRDb25maWdJbml0aWFsU2hhcmUAAAABAAAABW93bmVyCQABLAAAAAIFAAAABW93bmVyAgAAAA1faW5pdGlhbFNoYXJlAQAAABpnZXRWYWxpZFN0YWtpbmdBc3NldE9yRmFpbAAAAAIAAAALc3Rha2luZ1R5cGUAAAAHYXNzZXRJZAMDCQAAAAAAAAIFAAAAC3N0YWtpbmdUeXBlBQAAAAhVU0ROVFlQRQkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAUAAAAPbmV1dHJpbm9Bc3NldElkBwkAAAIAAAABAgAAABFjYW4gdXNlIFVTRE4gb25seQMDCQAAAAAAAAIFAAAAC3N0YWtpbmdUeXBlBQAAAAhOU0JUVFlQRQkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAUAAAALbnNidEFzc2V0SWQHCQAAAgAAAAECAAAAEWNhbiB1c2UgTlNCVCBvbmx5AwMJAQAAAAIhPQAAAAIFAAAAC3N0YWtpbmdUeXBlBQAAAAhVU0ROVFlQRQkBAAAAAiE9AAAAAgUAAAALc3Rha2luZ1R5cGUFAAAACE5TQlRUWVBFBwkAAAIAAAABCQABLAAAAAICAAAAGXVuc3VwcG9ydGVkIHN0YWtpbmcgdHlwZSAFAAAAC3N0YWtpbmdUeXBlBQAAAAdhc3NldElkAQAAABRpbnRlcm5hbExvY2tOZXV0cmlubwAAAAQAAAALc3Rha2luZ1R5cGUAAAABaQAAAAhyZWNlaXZlcgAAAAVzaGFyZQQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAdhc3NldElkCQEAAAAaZ2V0VmFsaWRTdGFraW5nQXNzZXRPckZhaWwAAAACBQAAAAtzdGFraW5nVHlwZQkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABCYAAAABBQAAAAhyZWNlaXZlcgkAAAIAAAABCQABLAAAAAICAAAAF0ludmFsaWQgYWRkcmVzcyBmb3JtYXQgBQAAAAhyZWNlaXZlcgMJAABmAAAAAgUAAAAFc2hhcmUAAAAAAAAAAGQJAAACAAAAAQIAAAAwc3Rha2luZyByZXdhcmRzIHNoYXJlIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiAxMDAlAwkAAGYAAAACAAAAAAAAAAABBQAAAAVzaGFyZQkAAAIAAAABAgAAAC1zdGFraW5nIHJld2FyZHMgc2hhcmUgY2Fubm90IGJlIGxvd2VyIHRoYW4gMSUEAAAAB2FjY291bnQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA1hc3NldElkU3RyaW5nCQACWAAAAAEFAAAAB2Fzc2V0SWQEAAAADWN1cnJlbnRDb25maWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEFAAAAB2FjY291bnQEAAAAC2NvcnJlY3REYXRhAwkBAAAAAiE9AAAAAgUAAAANY3VycmVudENvbmZpZwIAAAAABAAAABFjdXJyZW50Q29uZmlnRGF0YQkABLUAAAACBQAAAA1jdXJyZW50Q29uZmlnAgAAAAFfBAAAAAljdXJyU2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABFjdXJyZW50Q29uZmlnRGF0YQAAAAAAAAAAAgQAAAAMY3VyclJlY2VpdmVyCQABkQAAAAIFAAAAEWN1cnJlbnRDb25maWdEYXRhAAAAAAAAAAADBAAAABdub3RNaWdyYXRlZEluaXRpYWxTaGFyZQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAG2dldFJld2FyZENvbmZpZ0luaXRpYWxTaGFyZQAAAAEFAAAAB2FjY291bnQEAAAAEmFjdHVhbEluaXRpYWxTaGFyZQMJAAAAAAAAAgUAAAAXbm90TWlncmF0ZWRJbml0aWFsU2hhcmUAAAAAAAAAAAAFAAAACWN1cnJTaGFyZQUAAAAXbm90TWlncmF0ZWRJbml0aWFsU2hhcmUEAAAACG5ld1NoYXJlAwMJAABmAAAAAgUAAAASYWN0dWFsSW5pdGlhbFNoYXJlBQAAAAVzaGFyZQYJAQAAAAIhPQAAAAIFAAAADGN1cnJSZWNlaXZlcgUAAAAIcmVjZWl2ZXIFAAAAEmFjdHVhbEluaXRpYWxTaGFyZQUAAAAFc2hhcmUJAARMAAAAAgkAAaQAAAABBQAAABJhY3R1YWxJbml0aWFsU2hhcmUJAARMAAAAAgkAAaQAAAABBQAAAAhuZXdTaGFyZQkABEwAAAACBQAAAAxjdXJyUmVjZWl2ZXIFAAAAA25pbAkABEwAAAACCQABpAAAAAEFAAAABXNoYXJlCQAETAAAAAIJAAGkAAAAAQUAAAAFc2hhcmUJAARMAAAAAgUAAAAIcmVjZWl2ZXIFAAAAA25pbAQAAAATY29ycmVjdEluaXRpYWxTaGFyZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAAABAAAAAxjb3JyZWN0U2hhcmUJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAtjb3JyZWN0RGF0YQAAAAAAAAAAAQQAAAAPY29ycmVjdFJlY2VpdmVyCQABkQAAAAIFAAAAC2NvcnJlY3REYXRhAAAAAAAAAAACBAAAABBuZXdDdXJyZW50Q29uZmlnCQEAAAATZ2V0UmV3YXJkc0NvbmZpZ0tleQAAAAMFAAAAB2FjY291bnQFAAAADGNvcnJlY3RTaGFyZQUAAAAPY29ycmVjdFJlY2VpdmVyBAAAAAtpc05ld0NvbmZpZwkBAAAAASEAAAABCQAAAAAAAAIFAAAADWN1cnJlbnRDb25maWcFAAAAEG5ld0N1cnJlbnRDb25maWcEAAAAA2VuZAMFAAAAC2lzTmV3Q29uZmlnBQAAAAZoZWlnaHQAAAAAAAAAAAAEAAAABXN0YXJ0AwUAAAALaXNOZXdDb25maWcFAAAABmhlaWdodAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIFAAAAEG5ld0N1cnJlbnRDb25maWcGCQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVnZXRDb250cmFjdEJhbGFuY2VLZXkAAAABBQAAAA1hc3NldElkU3RyaW5nCQAAZAAAAAIJAQAAABJnZXRDb250cmFjdEJhbGFuY2UAAAABBQAAAA1hc3NldElkU3RyaW5nCAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEWdldFVzZXJCYWxhbmNlS2V5AAAAAgUAAAAHYWNjb3VudAUAAAANYXNzZXRJZFN0cmluZwkAAGQAAAACCQEAAAAOZ2V0VXNlckJhbGFuY2UAAAACBQAAAAdhY2NvdW50BQAAAA1hc3NldElkU3RyaW5nCAUAAAADcG10AAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGGdldFJld2FyZHNDb25maWdTdGFydEtleQAAAAIFAAAADWN1cnJlbnRDb25maWcHBQAAAANlbmQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhnZXRSZXdhcmRzQ29uZmlnU3RhcnRLZXkAAAACBQAAABBuZXdDdXJyZW50Q29uZmlnBgUAAAAFc3RhcnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtnZXRSZXdhcmRDb25maWdJbml0aWFsU2hhcmUAAAABBQAAAAdhY2NvdW50BQAAABNjb3JyZWN0SW5pdGlhbFNoYXJlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABpnZXRDdXJyZW50UmV3YXJkc0NvbmZpZ0tleQAAAAEFAAAAB2FjY291bnQFAAAAEG5ld0N1cnJlbnRDb25maWcFAAAAA25pbAUAAAAEdW5pdAEAAAAOaW50ZXJuYWxVbmxvY2sAAAAEAAAAC3N0YWtpbmdUeXBlAAAAAWkAAAAMdW5sb2NrQW1vdW50AAAADGFzc2V0SWRQYXJhbQQAAAAHYWNjb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAB2Fzc2V0SWQJAQAAABpnZXRWYWxpZFN0YWtpbmdBc3NldE9yRmFpbAAAAAIFAAAAC3N0YWtpbmdUeXBlCQACWQAAAAEFAAAADGFzc2V0SWRQYXJhbQQAAAANYXNzZXRJZFN0cmluZwkAAlgAAAABBQAAAAdhc3NldElkBAAAAAdiYWxhbmNlCQAAZQAAAAIJAQAAAA5nZXRVc2VyQmFsYW5jZQAAAAIFAAAAB2FjY291bnQFAAAADWFzc2V0SWRTdHJpbmcFAAAADHVubG9ja0Ftb3VudAMJAABmAAAAAgAAAAAAAAAAAAUAAAAHYmFsYW5jZQkAAAIAAAABAgAAAA5pbnZhbGlkIGFtb3VudAkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAVZ2V0Q29udHJhY3RCYWxhbmNlS2V5AAAAAQUAAAANYXNzZXRJZFN0cmluZwkAAGUAAAACCQEAAAASZ2V0Q29udHJhY3RCYWxhbmNlAAAAAQUAAAANYXNzZXRJZFN0cmluZwUAAAAMdW5sb2NrQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARZ2V0VXNlckJhbGFuY2VLZXkAAAACBQAAAAdhY2NvdW50BQAAAA1hc3NldElkU3RyaW5nBQAAAAdiYWxhbmNlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAB2FjY291bnQFAAAADHVubG9ja0Ftb3VudAUAAAAHYXNzZXRJZAUAAAADbmlsBQAAAAR1bml0AAAABgAAAAFpAQAAAA5sb2NrTmV1dHJpbm9TUAAAAAIAAAAIcmVjZWl2ZXIAAAAFc2hhcmUJAQAAABRpbnRlcm5hbExvY2tOZXV0cmlubwAAAAQFAAAACFVTRE5UWVBFBQAAAAFpBQAAAAhyZWNlaXZlcgUAAAAFc2hhcmUAAAABaQEAAAAMbG9ja05ldXRyaW5vAAAAAAkBAAAAFGludGVybmFsTG9ja05ldXRyaW5vAAAABAUAAAAIVVNETlRZUEUFAAAAAWkJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAABkAAAAAWkBAAAACmxvY2tOc2J0U1AAAAACAAAACHJlY2VpdmVyAAAABXNoYXJlCQAAAgAAAAECAAAAWm5zYnQgc3Rha2luZyBoYXMgYmVlbiBtb3ZlIHRvIGEgbmV3IGNvbnRyYWN0LCBwbGVhc2UgY2hlY2sgTmV1dHJpbm8gd2ViIHNpdGUgZm9yIG1vcmUgaW5mbwAAAAFpAQAAAAhsb2NrTnNidAAAAAAJAAACAAAAAQIAAABabnNidCBzdGFraW5nIGhhcyBiZWVuIG1vdmUgdG8gYSBuZXcgY29udHJhY3QsIHBsZWFzZSBjaGVjayBOZXV0cmlubyB3ZWIgc2l0ZSBmb3IgbW9yZSBpbmZvAAAAAWkBAAAADnVubG9ja05ldXRyaW5vAAAAAgAAAAx1bmxvY2tBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBAAAADmludGVybmFsVW5sb2NrAAAABAUAAAAIVVNETlRZUEUFAAAAAWkFAAAADHVubG9ja0Ftb3VudAUAAAANYXNzZXRJZFN0cmluZwAAAAFpAQAAAAp1bmxvY2tOc2J0AAAAAgAAAAx1bmxvY2tBbW91bnQAAAANYXNzZXRJZFN0cmluZwkBAAAADmludGVybmFsVW5sb2NrAAAABAUAAAAITlNCVFRZUEUFAAAAAWkFAAAADHVubG9ja0Ftb3VudAUAAAANYXNzZXRJZFN0cmluZwAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAEHB1YktleUFkbWluc0xpc3QJAARMAAAAAgIAAAAsR0pkTFNhTGl2NUs3eHVlamFjOG1jUmNIb3lvM2RQckVTcnZrdEczYTZNQVIJAARMAAAAAgIAAAAsRldWZmZZcjJBTG1ITWVqWm0zV3FlTHo2U2R5bTNnTEZHdEpuNEtUd3lVNXgJAARMAAAAAgIAAAAsM1doMkxhV2NiNWdnN0sycFBjVzNFcDZFQXVSQnpZa0FncmRwdDQzalRERmEJAARMAAAAAgIAAAAsNVdSWEZTandjVGJOZktjSnM4WnFYbVNTV1lzU1ZKVXRNdk1xWmo1aEg0TmMFAAAAA25pbAQAAAAFY291bnQJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAwkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAMAAAAAAAAAAAIAAAAAAAAAAAAJAABnAAAAAgUAAAAFY291bnQAAAAAAAAAAANgqmYt", "chainId": 87, "height": 3043379, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7m8MQgHw6JgtTgnDYEZ4fJYZEDKCq6VJDKtaoPDC9jEx Next: 9D7ND3SSUw91TuNBU2KH3As5eUqQMaGYLk6exhBTKi18 Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let revisionNum = "443c64dd5056b5be23b700224699295e733e0452" | |
5 | + | ||
4 | 6 | func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0) | |
5 | 7 | ||
6 | 8 | ||
166 | 168 | ||
167 | 169 | ||
168 | 170 | @Callable(i) | |
169 | - | func lockNsbtSP (receiver,share) = | |
171 | + | func lockNsbtSP (receiver,share) = throw("nsbt staking has been move to a new contract, please check Neutrino web site for more info") | |
170 | 172 | ||
171 | 173 | ||
172 | 174 | ||
173 | 175 | @Callable(i) | |
174 | - | func lockNsbt () = | |
176 | + | func lockNsbt () = throw("nsbt staking has been move to a new contract, please check Neutrino web site for more info") | |
175 | 177 | ||
176 | 178 | ||
177 | 179 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let revisionNum = "443c64dd5056b5be23b700224699295e733e0452" | |
5 | + | ||
4 | 6 | func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0) | |
5 | 7 | ||
6 | 8 | ||
7 | 9 | func getStringByKey (key) = valueOrElse(getString(this, key), "") | |
8 | 10 | ||
9 | 11 | ||
10 | 12 | func getBoolByKey (key) = valueOrElse(getBoolean(this, key), false) | |
11 | 13 | ||
12 | 14 | ||
13 | 15 | func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(addressFromStringValue(address), key), 0) | |
14 | 16 | ||
15 | 17 | ||
16 | 18 | func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "") | |
17 | 19 | ||
18 | 20 | ||
19 | 21 | let NeutrinoAssetIdKey = "neutrino_asset_id" | |
20 | 22 | ||
21 | 23 | let NeutrinoContractKey = "neutrino_contract" | |
22 | 24 | ||
23 | 25 | let BalanceKey = "rpd_balance" | |
24 | 26 | ||
25 | 27 | let ControlContractKey = "control_contract" | |
26 | 28 | ||
27 | 29 | let NsbtAssetIdKey = "bond_asset_id" | |
28 | 30 | ||
29 | 31 | let AdminsKey = "admins" | |
30 | 32 | ||
31 | 33 | let USDNTYPE = "USDN" | |
32 | 34 | ||
33 | 35 | let NSBTTYPE = "NSBT" | |
34 | 36 | ||
35 | 37 | func getUserBalanceKey (owner,assetId) = makeString([BalanceKey, assetId, owner], "_") | |
36 | 38 | ||
37 | 39 | ||
38 | 40 | func getContractBalanceKey (assetId) = ((BalanceKey + "_") + assetId) | |
39 | 41 | ||
40 | 42 | ||
41 | 43 | func getExpireProposalKey (hash) = (("proposal_expire" + "_") + hash) | |
42 | 44 | ||
43 | 45 | ||
44 | 46 | func getOwnerProposalKey (hash) = (("proposal_owner" + "_") + hash) | |
45 | 47 | ||
46 | 48 | ||
47 | 49 | func getArgumentsProposalKey (hash) = (("proposal_arguments" + "_") + hash) | |
48 | 50 | ||
49 | 51 | ||
50 | 52 | func getVoteKey (owner,hash) = (((("proposal_vote" + "_") + owner) + "_") + hash) | |
51 | 53 | ||
52 | 54 | ||
53 | 55 | func convertJsonArrayToList (jsonArray) = split(jsonArray, ",") | |
54 | 56 | ||
55 | 57 | ||
56 | 58 | let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey)) | |
57 | 59 | ||
58 | 60 | let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey)) | |
59 | 61 | ||
60 | 62 | let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey)) | |
61 | 63 | ||
62 | 64 | let nsbtAssetIdStr = getStringByAddressAndKey(neutrinoContract, NsbtAssetIdKey) | |
63 | 65 | ||
64 | 66 | let nsbtAssetId = fromBase58String(nsbtAssetIdStr) | |
65 | 67 | ||
66 | 68 | func getContractBalance (assetId) = getNumberByKey(getContractBalanceKey(assetId)) | |
67 | 69 | ||
68 | 70 | ||
69 | 71 | func getUserBalance (owner,assetId) = getNumberByKey(getUserBalanceKey(owner, assetId)) | |
70 | 72 | ||
71 | 73 | ||
72 | 74 | func getRewardsConfigKey (owner,share,receiver) = makeString(["stakingconfig", owner, toString(share), receiver], "_") | |
73 | 75 | ||
74 | 76 | ||
75 | 77 | func getCurrentRewardsConfigKey (owner) = ("stakingconfig_current_" + owner) | |
76 | 78 | ||
77 | 79 | ||
78 | 80 | func getRewardsConfigStartKey (configKey,isStart) = (configKey + (if (isStart) | |
79 | 81 | then "_start" | |
80 | 82 | else "_end")) | |
81 | 83 | ||
82 | 84 | ||
83 | 85 | func getRewardConfigInitialShare (owner) = (owner + "_initialShare") | |
84 | 86 | ||
85 | 87 | ||
86 | 88 | func getValidStakingAssetOrFail (stakingType,assetId) = if (if ((stakingType == USDNTYPE)) | |
87 | 89 | then (assetId != neutrinoAssetId) | |
88 | 90 | else false) | |
89 | 91 | then throw("can use USDN only") | |
90 | 92 | else if (if ((stakingType == NSBTTYPE)) | |
91 | 93 | then (assetId != nsbtAssetId) | |
92 | 94 | else false) | |
93 | 95 | then throw("can use NSBT only") | |
94 | 96 | else if (if ((stakingType != USDNTYPE)) | |
95 | 97 | then (stakingType != NSBTTYPE) | |
96 | 98 | else false) | |
97 | 99 | then throw(("unsupported staking type " + stakingType)) | |
98 | 100 | else assetId | |
99 | 101 | ||
100 | 102 | ||
101 | 103 | func internalLockNeutrino (stakingType,i,receiver,share) = { | |
102 | 104 | let pmt = value(i.payments[0]) | |
103 | 105 | let assetId = getValidStakingAssetOrFail(stakingType, value(pmt.assetId)) | |
104 | 106 | if (!(isDefined(addressFromString(receiver)))) | |
105 | 107 | then throw(("Invalid address format " + receiver)) | |
106 | 108 | else if ((share > 100)) | |
107 | 109 | then throw("staking rewards share cannot be higher than 100%") | |
108 | 110 | else if ((1 > share)) | |
109 | 111 | then throw("staking rewards share cannot be lower than 1%") | |
110 | 112 | else { | |
111 | 113 | let account = toString(i.caller) | |
112 | 114 | let assetIdString = toBase58String(assetId) | |
113 | 115 | let currentConfig = getStringByKey(getCurrentRewardsConfigKey(account)) | |
114 | 116 | let correctData = if ((currentConfig != "")) | |
115 | 117 | then { | |
116 | 118 | let currentConfigData = split(currentConfig, "_") | |
117 | 119 | let currShare = parseIntValue(currentConfigData[2]) | |
118 | 120 | let currReceiver = currentConfigData[3] | |
119 | 121 | let notMigratedInitialShare = getNumberByKey(getRewardConfigInitialShare(account)) | |
120 | 122 | let actualInitialShare = if ((notMigratedInitialShare == 0)) | |
121 | 123 | then currShare | |
122 | 124 | else notMigratedInitialShare | |
123 | 125 | let newShare = if (if ((actualInitialShare > share)) | |
124 | 126 | then true | |
125 | 127 | else (currReceiver != receiver)) | |
126 | 128 | then actualInitialShare | |
127 | 129 | else share | |
128 | 130 | [toString(actualInitialShare), toString(newShare), currReceiver] | |
129 | 131 | } | |
130 | 132 | else [toString(share), toString(share), receiver] | |
131 | 133 | let correctInitialShare = parseIntValue(correctData[0]) | |
132 | 134 | let correctShare = parseIntValue(correctData[1]) | |
133 | 135 | let correctReceiver = correctData[2] | |
134 | 136 | let newCurrentConfig = getRewardsConfigKey(account, correctShare, correctReceiver) | |
135 | 137 | let isNewConfig = !((currentConfig == newCurrentConfig)) | |
136 | 138 | let end = if (isNewConfig) | |
137 | 139 | then height | |
138 | 140 | else 0 | |
139 | 141 | let start = if (isNewConfig) | |
140 | 142 | then height | |
141 | 143 | else getNumberByKey(getRewardsConfigStartKey(newCurrentConfig, true)) | |
142 | 144 | $Tuple2([IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) + pmt.amount)), IntegerEntry(getUserBalanceKey(account, assetIdString), (getUserBalance(account, assetIdString) + pmt.amount)), IntegerEntry(getRewardsConfigStartKey(currentConfig, false), end), IntegerEntry(getRewardsConfigStartKey(newCurrentConfig, true), start), IntegerEntry(getRewardConfigInitialShare(account), correctInitialShare), StringEntry(getCurrentRewardsConfigKey(account), newCurrentConfig)], unit) | |
143 | 145 | } | |
144 | 146 | } | |
145 | 147 | ||
146 | 148 | ||
147 | 149 | func internalUnlock (stakingType,i,unlockAmount,assetIdParam) = { | |
148 | 150 | let account = toString(i.caller) | |
149 | 151 | let assetId = getValidStakingAssetOrFail(stakingType, fromBase58String(assetIdParam)) | |
150 | 152 | let assetIdString = toBase58String(assetId) | |
151 | 153 | let balance = (getUserBalance(account, assetIdString) - unlockAmount) | |
152 | 154 | if ((0 > balance)) | |
153 | 155 | then throw("invalid amount") | |
154 | 156 | else $Tuple2([IntegerEntry(getContractBalanceKey(assetIdString), (getContractBalance(assetIdString) - unlockAmount)), IntegerEntry(getUserBalanceKey(account, assetIdString), balance), ScriptTransfer(addressFromStringValue(account), unlockAmount, assetId)], unit) | |
155 | 157 | } | |
156 | 158 | ||
157 | 159 | ||
158 | 160 | @Callable(i) | |
159 | 161 | func lockNeutrinoSP (receiver,share) = internalLockNeutrino(USDNTYPE, i, receiver, share) | |
160 | 162 | ||
161 | 163 | ||
162 | 164 | ||
163 | 165 | @Callable(i) | |
164 | 166 | func lockNeutrino () = internalLockNeutrino(USDNTYPE, i, toString(i.caller), 100) | |
165 | 167 | ||
166 | 168 | ||
167 | 169 | ||
168 | 170 | @Callable(i) | |
169 | - | func lockNsbtSP (receiver,share) = | |
171 | + | func lockNsbtSP (receiver,share) = throw("nsbt staking has been move to a new contract, please check Neutrino web site for more info") | |
170 | 172 | ||
171 | 173 | ||
172 | 174 | ||
173 | 175 | @Callable(i) | |
174 | - | func lockNsbt () = | |
176 | + | func lockNsbt () = throw("nsbt staking has been move to a new contract, please check Neutrino web site for more info") | |
175 | 177 | ||
176 | 178 | ||
177 | 179 | ||
178 | 180 | @Callable(i) | |
179 | 181 | func unlockNeutrino (unlockAmount,assetIdString) = internalUnlock(USDNTYPE, i, unlockAmount, assetIdString) | |
180 | 182 | ||
181 | 183 | ||
182 | 184 | ||
183 | 185 | @Callable(i) | |
184 | 186 | func unlockNsbt (unlockAmount,assetIdString) = internalUnlock(NSBTTYPE, i, unlockAmount, assetIdString) | |
185 | 187 | ||
186 | 188 | ||
187 | 189 | @Verifier(tx) | |
188 | 190 | func verify () = { | |
189 | 191 | let pubKeyAdminsList = ["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"] | |
190 | 192 | let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0]))) | |
191 | 193 | then 1 | |
192 | 194 | else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1]))) | |
193 | 195 | then 1 | |
194 | 196 | else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2]))) | |
195 | 197 | then 1 | |
196 | 198 | else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3]))) | |
197 | 199 | then 2 | |
198 | 200 | else 0)) | |
199 | 201 | (count >= 3) | |
200 | 202 | } | |
201 | 203 |
github/deemru/w8io/786bc32 46.68 ms ◑