tx · AVDDe8Xhr2fjowTyu9x8U6keCdAbVKszMjxQH4c6ymm1 3PDt4YQURTeERKPzaFWAcaVZZTaU8HfFYgL: -0.01400000 Waves 2022.03.28 13:32 [3048853] smart account 3PDt4YQURTeERKPzaFWAcaVZZTaU8HfFYgL > SELF 0.00000000 Waves
{ "type": 13, "id": "AVDDe8Xhr2fjowTyu9x8U6keCdAbVKszMjxQH4c6ymm1", "fee": 1400000, "feeAssetId": null, "timestamp": 1648463479571, "version": 1, "sender": "3PDt4YQURTeERKPzaFWAcaVZZTaU8HfFYgL", "senderPublicKey": "CQNYQYz3JduEy7feaysKpLjfAwyVEbSmuvy7makYNfCZ", "proofs": [ "2bhppUncT5EEDTdQXfxjw1kBdD7E68P55BN5atw8BQffjFJyS6UwoJHGtUyqeVYYRqzc8opBKYdaWAEGFr5SKUr1" ], "script": "base64:AAIFAAAAAAAAAAsIAhIFCgMBAQgSAAAAABYAAAAAA1NFUAIAAAACX18AAAAAFUlkeENmZ0NsYWltU3RhcnRCbG9jawAAAAAAAAAAAQAAAAAYSWR4Q2ZnQ2xhaW1WZXN0aW5nUGVyaW9kAAAAAAAAAAACAAAAABJJZHhDZmdDbGFpbUFzc2V0SWQAAAAAAAAAAAMAAAAAFElkeENmZ0NsYWltQXNzZXRNdWx0AAAAAAAAAAAEAAAAABVJZHhDZmdDbGFpbUFzc2V0T3duZXIAAAAAAAAAAAUAAAAAG0lkeENmZ0NsYWltQXNzZXRUb3RhbEFtb3VudAAAAAAAAAAABgAAAAAbSWR4VG90YWxzVG90YWxDbGFpbWVkQW1vdW50AAAAAAAAAAABAAAAABhJZHhUb3RhbHNSZW1haW5pbmdBbW91bnQAAAAAAAAAAAIAAAAAGklkeFRvdGFsc0xhc3RDbGFpbWVkSGVpZ2h0AAAAAAAAAAADAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEIgAAAAEFAAAAA2tleQkAASwAAAACCQABLAAAAAICAAAAD21hbmRhdG9yeSB0aGlzLgUAAAADa2V5AgAAAA8gaXMgbm90IGRlZmluZWQBAAAAEmZvcm1hdENvbmZpZ1N0cmluZwAAAAYAAAAPY2xhaW1TdGFydEJsb2NrAAAADXZlc3RpbmdQZXJpb2QAAAANYXNzZXRJZEJhc2U1OAAAAAlhc3NldE11bHQAAAAKYXNzZXRPd25lcgAAAA1hc3NldFRvdGFsQW10CQAEuQAAAAIJAARMAAAAAgIAAAANJWQlZCVzJWQlcyVkJQkABEwAAAACBQAAAA9jbGFpbVN0YXJ0QmxvY2sJAARMAAAAAgUAAAANdmVzdGluZ1BlcmlvZAkABEwAAAACBQAAAA1hc3NldElkQmFzZTU4CQAETAAAAAIFAAAACWFzc2V0TXVsdAkABEwAAAACBQAAAAphc3NldE93bmVyCQAETAAAAAIFAAAADWFzc2V0VG90YWxBbXQFAAAAA25pbAUAAAADU0VQAQAAAAxmb3JtYXRDb25maWcAAAAGAAAAD2NsYWltU3RhcnRCbG9jawAAAA12ZXN0aW5nUGVyaW9kAAAADWFzc2V0SWRCYXNlNTgAAAAJYXNzZXRNdWx0AAAAD2NsYWltQXNzZXRPd25lcgAAABVjbGFpbUFzc2V0VG90YWxBbW91bnQJAQAAABJmb3JtYXRDb25maWdTdHJpbmcAAAAGCQABpAAAAAEFAAAAD2NsYWltU3RhcnRCbG9jawkAAaQAAAABBQAAAA12ZXN0aW5nUGVyaW9kBQAAAA1hc3NldElkQmFzZTU4CQABpAAAAAEFAAAACWFzc2V0TXVsdAUAAAAPY2xhaW1Bc3NldE93bmVyCQABpAAAAAEFAAAAFWNsYWltQXNzZXRUb3RhbEFtb3VudAEAAAASZm9ybWF0VG90YWxzU3RyaW5nAAAAAwAAABJ0b3RhbENsYWltZWRBbW91bnQAAAAXcmVtYWluaW5nQW1vdW50Rm9yQ2xhaW0AAAARbGFzdENsYWltZWRIZWlnaHQJAAS5AAAAAgkABEwAAAACAgAAAAYlZCVkJWQJAARMAAAAAgUAAAASdG90YWxDbGFpbWVkQW1vdW50CQAETAAAAAIFAAAAF3JlbWFpbmluZ0Ftb3VudEZvckNsYWltCQAETAAAAAIFAAAAEWxhc3RDbGFpbWVkSGVpZ2h0BQAAAANuaWwFAAAAA1NFUAEAAAATZm9ybWF0SGlzdG9yeVJlY29yZAAAAAQAAAASY2xhaW1lZEFzc2V0QW1vdW50AAAADmNsYWltaW5nQmxvY2tzAAAAFGZpcnN0Q2FsdWxhdGlvbkJsb2NrAAAAE2xhc3RDYWx1bGF0aW9uQmxvY2sJAAS5AAAAAgkABEwAAAACAgAAAAwlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAAZoZWlnaHQJAARMAAAAAgkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQABpAAAAAEFAAAAEmNsYWltZWRBc3NldEFtb3VudAkABEwAAAACCQABpAAAAAEFAAAADmNsYWltaW5nQmxvY2tzCQAETAAAAAIJAAGkAAAAAQUAAAAUZmlyc3RDYWx1bGF0aW9uQmxvY2sJAARMAAAAAgkAAaQAAAABBQAAABNsYXN0Q2FsdWxhdGlvbkJsb2NrBQAAAANuaWwFAAAAA1NFUAEAAAAJa2V5Q29uZmlnAAAAAAIAAAAKJXNfX2NvbmZpZwEAAAAJa2V5VG90YWxzAAAAAAIAAAAKJXNfX3RvdGFscwEAAAAZa2V5T3BlcmF0aW9uSGlzdG9yeVJlY29yZAAAAAMAAAAEdHlwZQAAAAt1c2VyQWRkcmVzcwAAAAZ0eElkNTgJAAS5AAAAAgkABEwAAAACAgAAABElcyVzJXMlc19faGlzdG9yeQkABEwAAAACBQAAAAR0eXBlCQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzCQAETAAAAAIFAAAABnR4SWQ1OAUAAAADbmlsBQAAAANTRVABAAAAD3JlYWRDb25maWdBcnJheQAAAAAJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAAAlrZXlDb25maWcAAAAABQAAAANTRVABAAAAD3JlYWRUb3RhbHNBcnJheQAAAAAJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAAAlrZXlUb3RhbHMAAAAABQAAAANTRVABAAAAC1RvdGFsc0VudHJ5AAAABAAAAANrZXkAAAAJb3JpZ0FycmF5AAAACmNsYWltZWRBbXQAAAAUbmV3TGFzdENsYWltZWRIZWlnaHQEAAAAEnRvdGFsQ2xhaW1lZEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACW9yaWdBcnJheQUAAAAbSWR4VG90YWxzVG90YWxDbGFpbWVkQW1vdW50BAAAAA9yZW1haW5pbmdBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAGElkeFRvdGFsc1JlbWFpbmluZ0Ftb3VudAQAAAARbGFzdENsYWltZWRIZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAGklkeFRvdGFsc0xhc3RDbGFpbWVkSGVpZ2h0BAAAABVuZXdUb3RhbENsYWltZWRBbW91bnQJAABkAAAAAgUAAAASdG90YWxDbGFpbWVkQW1vdW50BQAAAApjbGFpbWVkQW10BAAAABJuZXdSZW1haW5pbmdBbW91bnQJAABlAAAAAgUAAAAPcmVtYWluaW5nQW1vdW50BQAAAApjbGFpbWVkQW10AwkAAGYAAAACAAAAAAAAAAAABQAAABJuZXdSZW1haW5pbmdBbW91bnQJAAACAAAAAQIAAAAMaW52YWxpZCBtYXRoCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkJAQAAABJmb3JtYXRUb3RhbHNTdHJpbmcAAAADCQABpAAAAAEFAAAAFW5ld1RvdGFsQ2xhaW1lZEFtb3VudAkAAaQAAAABBQAAABJuZXdSZW1haW5pbmdBbW91bnQJAAGkAAAAAQUAAAAUbmV3TGFzdENsYWltZWRIZWlnaHQBAAAAGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABgAAAAt1c2VyQWRkcmVzcwAAABJjbGFpbWVkQXNzZXRBbW91bnQAAAAOY2xhaW1pbmdCbG9ja3MAAAAVZmlyc3RDYWxjdWxhdGlvbkJsb2NrAAAAFGxhc3RDYWxjdWxhdGlvbkJsb2NrAAAABHR4SWQJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAAAAAwIAAAAFY2xhaW0FAAAAC3VzZXJBZGRyZXNzCQACWAAAAAEFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAABAUAAAASY2xhaW1lZEFzc2V0QW1vdW50BQAAAA5jbGFpbWluZ0Jsb2NrcwUAAAAVZmlyc3RDYWxjdWxhdGlvbkJsb2NrBQAAABRsYXN0Q2FsY3VsYXRpb25CbG9jawAAAAIAAAABaQEAAAALY29uc3RydWN0b3IAAAADAAAAD2NsYWltU3RhcnRCbG9jawAAABN2ZXN0aW5nUGVyaW9kQmxvY2tzAAAAEmJlbmVmaWNpYXJ5QWRkcmVzcwQAAAAKdmVzdGluZ0VuZAkAAGQAAAACBQAAAA9jbGFpbVN0YXJ0QmxvY2sFAAAAE3Zlc3RpbmdQZXJpb2RCbG9ja3MDCQEAAAAJaXNEZWZpbmVkAAAAAQkABCIAAAABCQEAAAAJa2V5Q29uZmlnAAAAAAkAAAIAAAABAgAAABNhbHJlYWR5IGluaXRpYWxpemVkAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAACJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5AQAAACAR1Dlkgl29dtOzRgop9D0lFCvy+QzEJWJZuGSd39X4egkAAAIAAAABAgAAAA5ub3QgYXV0aG9yaXplZAQAAAAYYmVuZWZpY2lhcnlBZGRyZXNzUGFyc2VkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAASYmVuZWZpY2lhcnlBZGRyZXNzAgAAACBJbnZhbGlkIGJlbmVmaWNpYXJBZGRyZXNzIHBhc3NlZAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAxjbGFpbUFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAOY2xhaW1Bc3NldEluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAxjbGFpbUFzc2V0SWQCAAAAG2ZhaWwgdG8gbG9hZCBpZG8gYXNzZXQgaW5mbwQAAAAOY2xhaW1Bc3NldElkNTgJAAJYAAAAAQUAAAAMY2xhaW1Bc3NldElkBAAAAA5jbGFpbUFzc2V0TXVsdAkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAACAUAAAAOY2xhaW1Bc3NldEluZm8AAAAIZGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04EAAAAEGNsYWltQXNzZXRBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlDb25maWcAAAAACQEAAAAMZm9ybWF0Q29uZmlnAAAABgUAAAAPY2xhaW1TdGFydEJsb2NrBQAAABN2ZXN0aW5nUGVyaW9kQmxvY2tzBQAAAA5jbGFpbUFzc2V0SWQ1OAUAAAAOY2xhaW1Bc3NldE11bHQJAAQlAAAAAQUAAAAYYmVuZWZpY2lhcnlBZGRyZXNzUGFyc2VkBQAAABBjbGFpbUFzc2V0QW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlUb3RhbHMAAAAACQEAAAASZm9ybWF0VG90YWxzU3RyaW5nAAAAAwIAAAABMAkAAaQAAAABBQAAABBjbGFpbUFzc2V0QW1vdW50AgAAAAEwBQAAAANuaWwAAAABaQEAAAAFY2xhaW0AAAAABAAAAAhjZmdBcnJheQkBAAAAD3JlYWRDb25maWdBcnJheQAAAAAEAAAAE2NmZ0NsYWltU3RhcnRIZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAVSWR4Q2ZnQ2xhaW1TdGFydEJsb2NrBAAAABBjZmdDbGFpbUR1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAGElkeENmZ0NsYWltVmVzdGluZ1BlcmlvZAQAAAALY2ZnQ2xhaW1FbmQJAABkAAAAAgUAAAATY2ZnQ2xhaW1TdGFydEhlaWdodAUAAAAQY2ZnQ2xhaW1EdXJhdGlvbgQAAAARY2ZnQ2xhaW1Bc3NldElkNTgJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEklkeENmZ0NsYWltQXNzZXRJZAQAAAASY2ZnQ2xhaW1Bc3NldE93bmVyCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhDZmdDbGFpbUFzc2V0T3duZXIEAAAAGGNmZ0NsYWltQXNzZXRUb3RhbEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABtJZHhDZmdDbGFpbUFzc2V0VG90YWxBbW91bnQEAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAAZjYWxsZXIEAAAADXVzZXJBZGRyZXNzNTgJAAQlAAAAAQUAAAALdXNlckFkZHJlc3MEAAAAD29yaWdUb3RhbHNBcnJheQkBAAAAD3JlYWRUb3RhbHNBcnJheQAAAAAEAAAAEnRvdGFsQ2xhaW1lZEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD29yaWdUb3RhbHNBcnJheQUAAAAbSWR4VG90YWxzVG90YWxDbGFpbWVkQW1vdW50BAAAABR0b3RhbFJlbWFpbmluZ0Ftb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD29yaWdUb3RhbHNBcnJheQUAAAAYSWR4VG90YWxzUmVtYWluaW5nQW1vdW50BAAAABFsYXN0Q2xhaW1lZEhlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD29yaWdUb3RhbHNBcnJheQUAAAAaSWR4VG90YWxzTGFzdENsYWltZWRIZWlnaHQDCQEAAAACIT0AAAACBQAAAA11c2VyQWRkcmVzczU4BQAAABJjZmdDbGFpbUFzc2V0T3duZXIJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkAwkAAGYAAAACBQAAABNjZmdDbGFpbVN0YXJ0SGVpZ2h0BQAAAAZoZWlnaHQJAAACAAAAAQkAASwAAAACAgAAABhXYWl0IGNsYWltIHN0YXJ0IGJsb2NrOiAJAAGkAAAAAQUAAAATY2ZnQ2xhaW1TdGFydEhlaWdodAQAAAATbGFzdENhbHVsYXRpb25CbG9jawMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtjZmdDbGFpbUVuZAUAAAALY2ZnQ2xhaW1FbmQFAAAABmhlaWdodAQAAAAUZmlyc3RDYWx1bGF0aW9uQmxvY2sDCQAAAAAAAAIFAAAAEWxhc3RDbGFpbWVkSGVpZ2h0AAAAAAAAAAAABQAAABNjZmdDbGFpbVN0YXJ0SGVpZ2h0BQAAABFsYXN0Q2xhaW1lZEhlaWdodAQAAAAOY2xhaW1pbmdCbG9ja3MJAABlAAAAAgUAAAATbGFzdENhbHVsYXRpb25CbG9jawUAAAAUZmlyc3RDYWx1bGF0aW9uQmxvY2sEAAAAE2NsYWltaW5nQXNzZXRBbW91bnQJAABrAAAAAwUAAAAYY2ZnQ2xhaW1Bc3NldFRvdGFsQW1vdW50BQAAAA5jbGFpbWluZ0Jsb2NrcwUAAAAQY2ZnQ2xhaW1EdXJhdGlvbgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAATY2xhaW1pbmdBc3NldEFtb3VudAkAAlkAAAABBQAAABFjZmdDbGFpbUFzc2V0SWQ1OAkABEwAAAACCQEAAAALVG90YWxzRW50cnkAAAAECQEAAAAJa2V5VG90YWxzAAAAAAkBAAAAD3JlYWRUb3RhbHNBcnJheQAAAAAFAAAAE2NsYWltaW5nQXNzZXRBbW91bnQFAAAAE2xhc3RDYWx1bGF0aW9uQmxvY2sJAARMAAAAAgkBAAAAGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABgUAAAANdXNlckFkZHJlc3M1OAUAAAATY2xhaW1pbmdBc3NldEFtb3VudAUAAAAOY2xhaW1pbmdCbG9ja3MFAAAAFGZpcnN0Q2FsdWxhdGlvbkJsb2NrBQAAABNsYXN0Q2FsdWxhdGlvbkJsb2NrCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABAgAAACwyQ2JkOG96RzdBMVJ5Uk5DM25OblpnSHU3UnU0SzNKQ2ZweVBraHFyOXp4cXkBb+A=", "chainId": 87, "height": 3048853, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ANVrEiHfVRb2qtB9qdW4dAgUCqH5T9JTTnKMVQoh2RRw Next: 4TDYjx3XqNmAYWkdn8K3jhNEaS13y7cmirkAmPKwqxBS Diff:
Old | New | Differences | |
---|---|---|---|
73 | 73 | then throw("already initialized") | |
74 | 74 | else if ((size(i.payments) != 1)) | |
75 | 75 | then throw("exactly 1 payment must be attached") | |
76 | - | else if (( | |
76 | + | else if ((i.callerPublicKey != base58'2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq')) | |
77 | 77 | then throw("not authorized") | |
78 | 78 | else { | |
79 | 79 | let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let SEP = "__" | |
5 | 5 | ||
6 | 6 | let IdxCfgClaimStartBlock = 1 | |
7 | 7 | ||
8 | 8 | let IdxCfgClaimVestingPeriod = 2 | |
9 | 9 | ||
10 | 10 | let IdxCfgClaimAssetId = 3 | |
11 | 11 | ||
12 | 12 | let IdxCfgClaimAssetMult = 4 | |
13 | 13 | ||
14 | 14 | let IdxCfgClaimAssetOwner = 5 | |
15 | 15 | ||
16 | 16 | let IdxCfgClaimAssetTotalAmount = 6 | |
17 | 17 | ||
18 | 18 | let IdxTotalsTotalClaimedAmount = 1 | |
19 | 19 | ||
20 | 20 | let IdxTotalsRemainingAmount = 2 | |
21 | 21 | ||
22 | 22 | let IdxTotalsLastClaimedHeight = 3 | |
23 | 23 | ||
24 | 24 | func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined")) | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func formatConfigString (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,assetOwner,assetTotalAmt) = makeString(["%d%d%s%d%s%d%", claimStartBlock, vestingPeriod, assetIdBase58, assetMult, assetOwner, assetTotalAmt], SEP) | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | func formatConfig (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,claimAssetOwner,claimAssetTotalAmount) = formatConfigString(toString(claimStartBlock), toString(vestingPeriod), assetIdBase58, toString(assetMult), claimAssetOwner, toString(claimAssetTotalAmount)) | |
31 | 31 | ||
32 | 32 | ||
33 | 33 | func formatTotalsString (totalClaimedAmount,remainingAmountForClaim,lastClaimedHeight) = makeString(["%d%d%d", totalClaimedAmount, remainingAmountForClaim, lastClaimedHeight], SEP) | |
34 | 34 | ||
35 | 35 | ||
36 | 36 | func formatHistoryRecord (claimedAssetAmount,claimingBlocks,firstCalulationBlock,lastCalulationBlock) = makeString(["%d%d%d%d%d%d", toString(height), toString(lastBlock.timestamp), toString(claimedAssetAmount), toString(claimingBlocks), toString(firstCalulationBlock), toString(lastCalulationBlock)], SEP) | |
37 | 37 | ||
38 | 38 | ||
39 | 39 | func keyConfig () = "%s__config" | |
40 | 40 | ||
41 | 41 | ||
42 | 42 | func keyTotals () = "%s__totals" | |
43 | 43 | ||
44 | 44 | ||
45 | 45 | func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP) | |
46 | 46 | ||
47 | 47 | ||
48 | 48 | func readConfigArray () = split(getStringOrFail(keyConfig()), SEP) | |
49 | 49 | ||
50 | 50 | ||
51 | 51 | func readTotalsArray () = split(getStringOrFail(keyTotals()), SEP) | |
52 | 52 | ||
53 | 53 | ||
54 | 54 | func TotalsEntry (key,origArray,claimedAmt,newLastClaimedHeight) = { | |
55 | 55 | let totalClaimedAmount = parseIntValue(origArray[IdxTotalsTotalClaimedAmount]) | |
56 | 56 | let remainingAmount = parseIntValue(origArray[IdxTotalsRemainingAmount]) | |
57 | 57 | let lastClaimedHeight = parseIntValue(origArray[IdxTotalsLastClaimedHeight]) | |
58 | 58 | let newTotalClaimedAmount = (totalClaimedAmount + claimedAmt) | |
59 | 59 | let newRemainingAmount = (remainingAmount - claimedAmt) | |
60 | 60 | if ((0 > newRemainingAmount)) | |
61 | 61 | then throw("invalid math") | |
62 | 62 | else StringEntry(key, formatTotalsString(toString(newTotalClaimedAmount), toString(newRemainingAmount), toString(newLastClaimedHeight))) | |
63 | 63 | } | |
64 | 64 | ||
65 | 65 | ||
66 | 66 | func ClaimOperationHistoryEntry (userAddress,claimedAssetAmount,claimingBlocks,firstCalculationBlock,lastCalculationBlock,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(claimedAssetAmount, claimingBlocks, firstCalculationBlock, lastCalculationBlock)) | |
67 | 67 | ||
68 | 68 | ||
69 | 69 | @Callable(i) | |
70 | 70 | func constructor (claimStartBlock,vestingPeriodBlocks,beneficiaryAddress) = { | |
71 | 71 | let vestingEnd = (claimStartBlock + vestingPeriodBlocks) | |
72 | 72 | if (isDefined(getString(keyConfig()))) | |
73 | 73 | then throw("already initialized") | |
74 | 74 | else if ((size(i.payments) != 1)) | |
75 | 75 | then throw("exactly 1 payment must be attached") | |
76 | - | else if (( | |
76 | + | else if ((i.callerPublicKey != base58'2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq')) | |
77 | 77 | then throw("not authorized") | |
78 | 78 | else { | |
79 | 79 | let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed") | |
80 | 80 | let pmt = value(i.payments[0]) | |
81 | 81 | let claimAssetId = value(pmt.assetId) | |
82 | 82 | let claimAssetInfo = valueOrErrorMessage(assetInfo(claimAssetId), "fail to load ido asset info") | |
83 | 83 | let claimAssetId58 = toBase58String(claimAssetId) | |
84 | 84 | let claimAssetMult = pow(10, 0, claimAssetInfo.decimals, 0, 0, DOWN) | |
85 | 85 | let claimAssetAmount = pmt.amount | |
86 | 86 | [StringEntry(keyConfig(), formatConfig(claimStartBlock, vestingPeriodBlocks, claimAssetId58, claimAssetMult, toString(beneficiaryAddressParsed), claimAssetAmount)), StringEntry(keyTotals(), formatTotalsString("0", toString(claimAssetAmount), "0"))] | |
87 | 87 | } | |
88 | 88 | } | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | ||
92 | 92 | @Callable(i) | |
93 | 93 | func claim () = { | |
94 | 94 | let cfgArray = readConfigArray() | |
95 | 95 | let cfgClaimStartHeight = parseIntValue(cfgArray[IdxCfgClaimStartBlock]) | |
96 | 96 | let cfgClaimDuration = parseIntValue(cfgArray[IdxCfgClaimVestingPeriod]) | |
97 | 97 | let cfgClaimEnd = (cfgClaimStartHeight + cfgClaimDuration) | |
98 | 98 | let cfgClaimAssetId58 = cfgArray[IdxCfgClaimAssetId] | |
99 | 99 | let cfgClaimAssetOwner = cfgArray[IdxCfgClaimAssetOwner] | |
100 | 100 | let cfgClaimAssetTotalAmount = parseIntValue(cfgArray[IdxCfgClaimAssetTotalAmount]) | |
101 | 101 | let userAddress = i.caller | |
102 | 102 | let userAddress58 = toString(userAddress) | |
103 | 103 | let origTotalsArray = readTotalsArray() | |
104 | 104 | let totalClaimedAmount = parseIntValue(origTotalsArray[IdxTotalsTotalClaimedAmount]) | |
105 | 105 | let totalRemainingAmount = parseIntValue(origTotalsArray[IdxTotalsRemainingAmount]) | |
106 | 106 | let lastClaimedHeight = parseIntValue(origTotalsArray[IdxTotalsLastClaimedHeight]) | |
107 | 107 | if ((userAddress58 != cfgClaimAssetOwner)) | |
108 | 108 | then throw("permissions denied") | |
109 | 109 | else if ((cfgClaimStartHeight > height)) | |
110 | 110 | then throw(("Wait claim start block: " + toString(cfgClaimStartHeight))) | |
111 | 111 | else { | |
112 | 112 | let lastCalulationBlock = if ((height > cfgClaimEnd)) | |
113 | 113 | then cfgClaimEnd | |
114 | 114 | else height | |
115 | 115 | let firstCalulationBlock = if ((lastClaimedHeight == 0)) | |
116 | 116 | then cfgClaimStartHeight | |
117 | 117 | else lastClaimedHeight | |
118 | 118 | let claimingBlocks = (lastCalulationBlock - firstCalulationBlock) | |
119 | 119 | let claimingAssetAmount = fraction(cfgClaimAssetTotalAmount, claimingBlocks, cfgClaimDuration) | |
120 | 120 | [ScriptTransfer(userAddress, claimingAssetAmount, fromBase58String(cfgClaimAssetId58)), TotalsEntry(keyTotals(), readTotalsArray(), claimingAssetAmount, lastCalulationBlock), ClaimOperationHistoryEntry(userAddress58, claimingAssetAmount, claimingBlocks, firstCalulationBlock, lastCalulationBlock, i.transactionId)] | |
121 | 121 | } | |
122 | 122 | } | |
123 | 123 | ||
124 | 124 | ||
125 | 125 | @Verifier(tx) | |
126 | 126 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String("2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq")) | |
127 | 127 |
github/deemru/w8io/3ef1775 42.02 ms ◑