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:
OldNewDifferences
7373 then throw("already initialized")
7474 else if ((size(i.payments) != 1))
7575 then throw("exactly 1 payment must be attached")
76- else if (("3N4Aib5iubWiGMzdTh6wWiVDVbo32oeVUmH" != toString(i.caller)))
76+ else if ((i.callerPublicKey != base58'2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq'))
7777 then throw("not authorized")
7878 else {
7979 let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let IdxCfgClaimStartBlock = 1
77
88 let IdxCfgClaimVestingPeriod = 2
99
1010 let IdxCfgClaimAssetId = 3
1111
1212 let IdxCfgClaimAssetMult = 4
1313
1414 let IdxCfgClaimAssetOwner = 5
1515
1616 let IdxCfgClaimAssetTotalAmount = 6
1717
1818 let IdxTotalsTotalClaimedAmount = 1
1919
2020 let IdxTotalsRemainingAmount = 2
2121
2222 let IdxTotalsLastClaimedHeight = 3
2323
2424 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
2525
2626
2727 func formatConfigString (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,assetOwner,assetTotalAmt) = makeString(["%d%d%s%d%s%d%", claimStartBlock, vestingPeriod, assetIdBase58, assetMult, assetOwner, assetTotalAmt], SEP)
2828
2929
3030 func formatConfig (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,claimAssetOwner,claimAssetTotalAmount) = formatConfigString(toString(claimStartBlock), toString(vestingPeriod), assetIdBase58, toString(assetMult), claimAssetOwner, toString(claimAssetTotalAmount))
3131
3232
3333 func formatTotalsString (totalClaimedAmount,remainingAmountForClaim,lastClaimedHeight) = makeString(["%d%d%d", totalClaimedAmount, remainingAmountForClaim, lastClaimedHeight], SEP)
3434
3535
3636 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)
3737
3838
3939 func keyConfig () = "%s__config"
4040
4141
4242 func keyTotals () = "%s__totals"
4343
4444
4545 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
4646
4747
4848 func readConfigArray () = split(getStringOrFail(keyConfig()), SEP)
4949
5050
5151 func readTotalsArray () = split(getStringOrFail(keyTotals()), SEP)
5252
5353
5454 func TotalsEntry (key,origArray,claimedAmt,newLastClaimedHeight) = {
5555 let totalClaimedAmount = parseIntValue(origArray[IdxTotalsTotalClaimedAmount])
5656 let remainingAmount = parseIntValue(origArray[IdxTotalsRemainingAmount])
5757 let lastClaimedHeight = parseIntValue(origArray[IdxTotalsLastClaimedHeight])
5858 let newTotalClaimedAmount = (totalClaimedAmount + claimedAmt)
5959 let newRemainingAmount = (remainingAmount - claimedAmt)
6060 if ((0 > newRemainingAmount))
6161 then throw("invalid math")
6262 else StringEntry(key, formatTotalsString(toString(newTotalClaimedAmount), toString(newRemainingAmount), toString(newLastClaimedHeight)))
6363 }
6464
6565
6666 func ClaimOperationHistoryEntry (userAddress,claimedAssetAmount,claimingBlocks,firstCalculationBlock,lastCalculationBlock,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(claimedAssetAmount, claimingBlocks, firstCalculationBlock, lastCalculationBlock))
6767
6868
6969 @Callable(i)
7070 func constructor (claimStartBlock,vestingPeriodBlocks,beneficiaryAddress) = {
7171 let vestingEnd = (claimStartBlock + vestingPeriodBlocks)
7272 if (isDefined(getString(keyConfig())))
7373 then throw("already initialized")
7474 else if ((size(i.payments) != 1))
7575 then throw("exactly 1 payment must be attached")
76- else if (("3N4Aib5iubWiGMzdTh6wWiVDVbo32oeVUmH" != toString(i.caller)))
76+ else if ((i.callerPublicKey != base58'2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq'))
7777 then throw("not authorized")
7878 else {
7979 let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed")
8080 let pmt = value(i.payments[0])
8181 let claimAssetId = value(pmt.assetId)
8282 let claimAssetInfo = valueOrErrorMessage(assetInfo(claimAssetId), "fail to load ido asset info")
8383 let claimAssetId58 = toBase58String(claimAssetId)
8484 let claimAssetMult = pow(10, 0, claimAssetInfo.decimals, 0, 0, DOWN)
8585 let claimAssetAmount = pmt.amount
8686 [StringEntry(keyConfig(), formatConfig(claimStartBlock, vestingPeriodBlocks, claimAssetId58, claimAssetMult, toString(beneficiaryAddressParsed), claimAssetAmount)), StringEntry(keyTotals(), formatTotalsString("0", toString(claimAssetAmount), "0"))]
8787 }
8888 }
8989
9090
9191
9292 @Callable(i)
9393 func claim () = {
9494 let cfgArray = readConfigArray()
9595 let cfgClaimStartHeight = parseIntValue(cfgArray[IdxCfgClaimStartBlock])
9696 let cfgClaimDuration = parseIntValue(cfgArray[IdxCfgClaimVestingPeriod])
9797 let cfgClaimEnd = (cfgClaimStartHeight + cfgClaimDuration)
9898 let cfgClaimAssetId58 = cfgArray[IdxCfgClaimAssetId]
9999 let cfgClaimAssetOwner = cfgArray[IdxCfgClaimAssetOwner]
100100 let cfgClaimAssetTotalAmount = parseIntValue(cfgArray[IdxCfgClaimAssetTotalAmount])
101101 let userAddress = i.caller
102102 let userAddress58 = toString(userAddress)
103103 let origTotalsArray = readTotalsArray()
104104 let totalClaimedAmount = parseIntValue(origTotalsArray[IdxTotalsTotalClaimedAmount])
105105 let totalRemainingAmount = parseIntValue(origTotalsArray[IdxTotalsRemainingAmount])
106106 let lastClaimedHeight = parseIntValue(origTotalsArray[IdxTotalsLastClaimedHeight])
107107 if ((userAddress58 != cfgClaimAssetOwner))
108108 then throw("permissions denied")
109109 else if ((cfgClaimStartHeight > height))
110110 then throw(("Wait claim start block: " + toString(cfgClaimStartHeight)))
111111 else {
112112 let lastCalulationBlock = if ((height > cfgClaimEnd))
113113 then cfgClaimEnd
114114 else height
115115 let firstCalulationBlock = if ((lastClaimedHeight == 0))
116116 then cfgClaimStartHeight
117117 else lastClaimedHeight
118118 let claimingBlocks = (lastCalulationBlock - firstCalulationBlock)
119119 let claimingAssetAmount = fraction(cfgClaimAssetTotalAmount, claimingBlocks, cfgClaimDuration)
120120 [ScriptTransfer(userAddress, claimingAssetAmount, fromBase58String(cfgClaimAssetId58)), TotalsEntry(keyTotals(), readTotalsArray(), claimingAssetAmount, lastCalulationBlock), ClaimOperationHistoryEntry(userAddress58, claimingAssetAmount, claimingBlocks, firstCalulationBlock, lastCalulationBlock, i.transactionId)]
121121 }
122122 }
123123
124124
125125 @Verifier(tx)
126126 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String("2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq"))
127127

github/deemru/w8io/3ef1775 
42.02 ms