tx · 2mHmW6wr4PV41KCMQqpWPYiyLedB9iGfZuMcBkUW6hoy

3PHpaXvHpdthSBwXzjJiNnAes6dqzgr9BcU:  -0.01400000 Waves

2023.05.10 14:43 [3637207] smart account 3PHpaXvHpdthSBwXzjJiNnAes6dqzgr9BcU > SELF 0.00000000 Waves

{ "type": 13, "id": "2mHmW6wr4PV41KCMQqpWPYiyLedB9iGfZuMcBkUW6hoy", "fee": 1400000, "feeAssetId": null, "timestamp": 1683719048710, "version": 2, "chainId": 87, "sender": "3PHpaXvHpdthSBwXzjJiNnAes6dqzgr9BcU", "senderPublicKey": "rtorwpe32pLWq5ZZJobchM1AJJcZ31hipQ5SW7i6xff", "proofs": [ "36q9AGUsqaqjTpogzUfoXY4ECVF7hXpfvb3TTKVokx6UR4kXhQKDUFWbHzutqaXdKQAUJSGDiL1fVhPGsTz7JFbm" ], "script": "base64:AAIFAAAAAAAAABUIAhIFCgMBAQgSAwoBARIAEgMKAQEAAAAgAAAAAANTRVACAAAAAl9fAAAAAAtrZXlSZWZlcnJhbAkABLkAAAACCQAETAAAAAICAAAAAiVzCQAETAAAAAICAAAACHJlZmVycmFsBQAAAANuaWwFAAAAA1NFUAAAAAAMa2V5V3hBc3NldElkCQAEuQAAAAIJAARMAAAAAgIAAAACJXMJAARMAAAAAgIAAAAJd3hBc3NldElkBQAAAANuaWwFAAAAA1NFUAEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAACAAAAFCVzX19tYW5hZ2VyUHVibGljS2V5AQAAABZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAAAAAIAAAAXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MAAAAAFUlkeENmZ0NsYWltU3RhcnRCbG9jawAAAAAAAAAAAQAAAAAYSWR4Q2ZnQ2xhaW1WZXN0aW5nUGVyaW9kAAAAAAAAAAACAAAAABJJZHhDZmdDbGFpbUFzc2V0SWQAAAAAAAAAAAMAAAAAFElkeENmZ0NsYWltQXNzZXRNdWx0AAAAAAAAAAAEAAAAABVJZHhDZmdDbGFpbUFzc2V0T3duZXIAAAAAAAAAAAUAAAAAG0lkeENmZ0NsYWltQXNzZXRUb3RhbEFtb3VudAAAAAAAAAAABgAAAAAbSWR4VG90YWxzVG90YWxDbGFpbWVkQW1vdW50AAAAAAAAAAABAAAAABhJZHhUb3RhbHNSZW1haW5pbmdBbW91bnQAAAAAAAAAAAIAAAAAGklkeFRvdGFsc0xhc3RDbGFpbWVkSGVpZ2h0AAAAAAAAAAADAQAAAAh0aHJvd0VycgAAAAEAAAADbXNnCQAAAgAAAAEJAAS5AAAAAgkABEwAAAACAgAAAA9tYXJrZXRpbmcucmlkZToJAARMAAAAAgUAAAADbXNnBQAAAANuaWwCAAAAASABAAAAD2dldFN0cmluZ09yRmFpbAAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQiAAAAAQUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgIAAAAPbWFuZGF0b3J5IHRoaXMuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAASZm9ybWF0Q29uZmlnU3RyaW5nAAAABgAAAA9jbGFpbVN0YXJ0QmxvY2sAAAANdmVzdGluZ1BlcmlvZAAAAA1hc3NldElkQmFzZTU4AAAACWFzc2V0TXVsdAAAAAphc3NldE93bmVyAAAADWFzc2V0VG90YWxBbXQJAAS5AAAAAgkABEwAAAACAgAAAA0lZCVkJXMlZCVzJWQlCQAETAAAAAIFAAAAD2NsYWltU3RhcnRCbG9jawkABEwAAAACBQAAAA12ZXN0aW5nUGVyaW9kCQAETAAAAAIFAAAADWFzc2V0SWRCYXNlNTgJAARMAAAAAgUAAAAJYXNzZXRNdWx0CQAETAAAAAIFAAAACmFzc2V0T3duZXIJAARMAAAAAgUAAAANYXNzZXRUb3RhbEFtdAUAAAADbmlsBQAAAANTRVABAAAADGZvcm1hdENvbmZpZwAAAAYAAAAPY2xhaW1TdGFydEJsb2NrAAAADXZlc3RpbmdQZXJpb2QAAAANYXNzZXRJZEJhc2U1OAAAAAlhc3NldE11bHQAAAAPY2xhaW1Bc3NldE93bmVyAAAAFWNsYWltQXNzZXRUb3RhbEFtb3VudAkBAAAAEmZvcm1hdENvbmZpZ1N0cmluZwAAAAYJAAGkAAAAAQUAAAAPY2xhaW1TdGFydEJsb2NrCQABpAAAAAEFAAAADXZlc3RpbmdQZXJpb2QFAAAADWFzc2V0SWRCYXNlNTgJAAGkAAAAAQUAAAAJYXNzZXRNdWx0BQAAAA9jbGFpbUFzc2V0T3duZXIJAAGkAAAAAQUAAAAVY2xhaW1Bc3NldFRvdGFsQW1vdW50AQAAABJmb3JtYXRUb3RhbHNTdHJpbmcAAAADAAAAEnRvdGFsQ2xhaW1lZEFtb3VudAAAABdyZW1haW5pbmdBbW91bnRGb3JDbGFpbQAAABFsYXN0Q2xhaW1lZEhlaWdodAkABLkAAAACCQAETAAAAAICAAAABiVkJWQlZAkABEwAAAACBQAAABJ0b3RhbENsYWltZWRBbW91bnQJAARMAAAAAgUAAAAXcmVtYWluaW5nQW1vdW50Rm9yQ2xhaW0JAARMAAAAAgUAAAARbGFzdENsYWltZWRIZWlnaHQFAAAAA25pbAUAAAADU0VQAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAABAAAABJjbGFpbWVkQXNzZXRBbW91bnQAAAAOY2xhaW1pbmdCbG9ja3MAAAAUZmlyc3RDYWx1bGF0aW9uQmxvY2sAAAATbGFzdENhbHVsYXRpb25CbG9jawkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAABmhlaWdodAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAAGkAAAAAQUAAAASY2xhaW1lZEFzc2V0QW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAOY2xhaW1pbmdCbG9ja3MJAARMAAAAAgkAAaQAAAABBQAAABRmaXJzdENhbHVsYXRpb25CbG9jawkABEwAAAACCQABpAAAAAEFAAAAE2xhc3RDYWx1bGF0aW9uQmxvY2sFAAAAA25pbAUAAAADU0VQAQAAAAlrZXlDb25maWcAAAAAAgAAAAolc19fY29uZmlnAQAAAAlrZXlUb3RhbHMAAAAAAgAAAAolc19fdG90YWxzAAAAABJrZXlBbW91bnRVbmNsYWltZWQJAAS5AAAAAgkABEwAAAACAgAAAAIlcwkABEwAAAACAgAAAA9hbW91bnRVbmNsYWltZWQFAAAAA25pbAUAAAADU0VQAQAAABlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAAAAAwAAAAR0eXBlAAAAC3VzZXJBZGRyZXNzAAAABnR4SWQ1OAkABLkAAAACCQAETAAAAAICAAAAESVzJXMlcyVzX19oaXN0b3J5CQAETAAAAAIFAAAABHR5cGUJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgUAAAAGdHhJZDU4BQAAAANuaWwFAAAAA1NFUAEAAAAPcmVhZENvbmZpZ0FycmF5AAAAAAkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAACWtleUNvbmZpZwAAAAAFAAAAA1NFUAEAAAAPcmVhZFRvdGFsc0FycmF5AAAAAAkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAACWtleVRvdGFscwAAAAAFAAAAA1NFUAEAAAAcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAAAAAEAAAAByRtYXRjaDAJAAQiAAAAAQkBAAAAFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAAXMFAAAABHRoaXMBAAAAC1RvdGFsc0VudHJ5AAAABAAAAANrZXkAAAAJb3JpZ0FycmF5AAAACmNsYWltZWRBbXQAAAAUbmV3TGFzdENsYWltZWRIZWlnaHQEAAAAEnRvdGFsQ2xhaW1lZEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACW9yaWdBcnJheQUAAAAbSWR4VG90YWxzVG90YWxDbGFpbWVkQW1vdW50BAAAAA9yZW1haW5pbmdBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAGElkeFRvdGFsc1JlbWFpbmluZ0Ftb3VudAQAAAARbGFzdENsYWltZWRIZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAlvcmlnQXJyYXkFAAAAGklkeFRvdGFsc0xhc3RDbGFpbWVkSGVpZ2h0BAAAABVuZXdUb3RhbENsYWltZWRBbW91bnQJAABkAAAAAgUAAAASdG90YWxDbGFpbWVkQW1vdW50BQAAAApjbGFpbWVkQW10BAAAABJuZXdSZW1haW5pbmdBbW91bnQJAABlAAAAAgUAAAAPcmVtYWluaW5nQW1vdW50BQAAAApjbGFpbWVkQW10AwkAAGYAAAACAAAAAAAAAAAABQAAABJuZXdSZW1haW5pbmdBbW91bnQJAAACAAAAAQIAAAAMaW52YWxpZCBtYXRoCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkJAQAAABJmb3JtYXRUb3RhbHNTdHJpbmcAAAADCQABpAAAAAEFAAAAFW5ld1RvdGFsQ2xhaW1lZEFtb3VudAkAAaQAAAABBQAAABJuZXdSZW1haW5pbmdBbW91bnQJAAGkAAAAAQUAAAAUbmV3TGFzdENsYWltZWRIZWlnaHQBAAAAGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABgAAAAt1c2VyQWRkcmVzcwAAABJjbGFpbWVkQXNzZXRBbW91bnQAAAAOY2xhaW1pbmdCbG9ja3MAAAAVZmlyc3RDYWxjdWxhdGlvbkJsb2NrAAAAFGxhc3RDYWxjdWxhdGlvbkJsb2NrAAAABHR4SWQJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAAAAAwIAAAAFY2xhaW0FAAAAC3VzZXJBZGRyZXNzCQACWAAAAAEFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAABAUAAAASY2xhaW1lZEFzc2V0QW1vdW50BQAAAA5jbGFpbWluZ0Jsb2NrcwUAAAAVZmlyc3RDYWxjdWxhdGlvbkJsb2NrBQAAABRsYXN0Q2FsY3VsYXRpb25CbG9jawEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAAE21hbmFnZXJWYXVsdEFkZHJlc3MJAQAAABxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAAAAAQAAAAHJG1hdGNoMAkABB0AAAACBQAAABNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAFzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BQAAAAR1bml0CQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAttdXN0TWFuYWdlcgAAAAEAAAABaQQAAAACcGQJAQAAAAh0aHJvd0VycgAAAAECAAAAEXBlcm1pc3Npb24gZGVuaWVkBAAAAAckbWF0Y2gwCQEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAnBrBQAAAAckbWF0Y2gwAwkAAAAAAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAAAnBrBgUAAAACcGQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQDCQAAAAAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwYFAAAAAnBkCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAtjbGFpbUNvbW1vbgAAAAIAAAABaQAAAAZhbW91bnQEAAAACGNmZ0FycmF5CQEAAAAPcmVhZENvbmZpZ0FycmF5AAAAAAQAAAATY2ZnQ2xhaW1TdGFydEhlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABVJZHhDZmdDbGFpbVN0YXJ0QmxvY2sEAAAAEGNmZ0NsYWltRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAYSWR4Q2ZnQ2xhaW1WZXN0aW5nUGVyaW9kBAAAAAtjZmdDbGFpbUVuZAkAAGQAAAACBQAAABNjZmdDbGFpbVN0YXJ0SGVpZ2h0BQAAABBjZmdDbGFpbUR1cmF0aW9uBAAAAA9jZmdDbGFpbUFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAASSWR4Q2ZnQ2xhaW1Bc3NldElkBAAAABJjZmdDbGFpbUFzc2V0T3duZXIJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ0NsYWltQXNzZXRPd25lcgQAAAAYY2ZnQ2xhaW1Bc3NldFRvdGFsQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAG0lkeENmZ0NsYWltQXNzZXRUb3RhbEFtb3VudAQAAAAPb3JpZ1RvdGFsc0FycmF5CQEAAAAPcmVhZFRvdGFsc0FycmF5AAAAAAQAAAASdG90YWxDbGFpbWVkQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPb3JpZ1RvdGFsc0FycmF5BQAAABtJZHhUb3RhbHNUb3RhbENsYWltZWRBbW91bnQEAAAAFHRvdGFsUmVtYWluaW5nQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPb3JpZ1RvdGFsc0FycmF5BQAAABhJZHhUb3RhbHNSZW1haW5pbmdBbW91bnQEAAAAEWxhc3RDbGFpbWVkSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPb3JpZ1RvdGFsc0FycmF5BQAAABpJZHhUb3RhbHNMYXN0Q2xhaW1lZEhlaWdodAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAASY2ZnQ2xhaW1Bc3NldE93bmVyCQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAMJAABmAAAAAgUAAAATY2ZnQ2xhaW1TdGFydEhlaWdodAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgIAAAAYV2FpdCBjbGFpbSBzdGFydCBibG9jazogCQABpAAAAAEFAAAAE2NmZ0NsYWltU3RhcnRIZWlnaHQEAAAAE2xhc3RDYWx1bGF0aW9uQmxvY2sDCQAAZgAAAAIFAAAABmhlaWdodAUAAAALY2ZnQ2xhaW1FbmQFAAAAC2NmZ0NsYWltRW5kBQAAAAZoZWlnaHQEAAAAFGZpcnN0Q2FsdWxhdGlvbkJsb2NrAwkAAAAAAAACBQAAABFsYXN0Q2xhaW1lZEhlaWdodAAAAAAAAAAAAAUAAAATY2ZnQ2xhaW1TdGFydEhlaWdodAUAAAARbGFzdENsYWltZWRIZWlnaHQEAAAADmNsYWltaW5nQmxvY2tzCQAAZQAAAAIFAAAAE2xhc3RDYWx1bGF0aW9uQmxvY2sFAAAAFGZpcnN0Q2FsdWxhdGlvbkJsb2NrBAAAAA9hbW91bnRBdmFpbGFibGUJAABrAAAAAwUAAAAYY2ZnQ2xhaW1Bc3NldFRvdGFsQW1vdW50BQAAAA5jbGFpbWluZ0Jsb2NrcwUAAAAQY2ZnQ2xhaW1EdXJhdGlvbgQAAAAPYW1vdW50VW5jbGFpbWVkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEmtleUFtb3VudFVuY2xhaW1lZAAAAAAAAAAAAAQAAAAUYW1vdW50QXZhaWxhYmxlVG90YWwJAABkAAAAAgUAAAAPYW1vdW50QXZhaWxhYmxlBQAAAA9hbW91bnRVbmNsYWltZWQEAAAADWFtb3VudFRvQ2xhaW0DAwkAAGcAAAACAAAAAAAAAAAABQAAAAZhbW91bnQGCQAAZwAAAAIFAAAABmFtb3VudAUAAAAUYW1vdW50QXZhaWxhYmxlVG90YWwFAAAAFGFtb3VudEF2YWlsYWJsZVRvdGFsBQAAAAZhbW91bnQEAAAAEmFtb3VudFVuY2xhaW1lZE5ldwkAAGUAAAACBQAAABRhbW91bnRBdmFpbGFibGVUb3RhbAUAAAANYW1vdW50VG9DbGFpbQkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrZXlBbW91bnRVbmNsYWltZWQFAAAAEmFtb3VudFVuY2xhaW1lZE5ldwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABJjZmdDbGFpbUFzc2V0T3duZXIFAAAADWFtb3VudFRvQ2xhaW0FAAAAD2NmZ0NsYWltQXNzZXRJZAkABEwAAAACCQEAAAALVG90YWxzRW50cnkAAAAECQEAAAAJa2V5VG90YWxzAAAAAAkBAAAAD3JlYWRUb3RhbHNBcnJheQAAAAAFAAAADWFtb3VudFRvQ2xhaW0FAAAAE2xhc3RDYWx1bGF0aW9uQmxvY2sJAARMAAAAAgkBAAAAGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABgkABCUAAAABBQAAABJjZmdDbGFpbUFzc2V0T3duZXIFAAAADWFtb3VudFRvQ2xhaW0FAAAADmNsYWltaW5nQmxvY2tzBQAAABRmaXJzdENhbHVsYXRpb25CbG9jawUAAAATbGFzdENhbHVsYXRpb25CbG9jawgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsBQAAAA1hbW91bnRUb0NsYWltAAAABAAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAMAAAAPY2xhaW1TdGFydEJsb2NrAAAAE3Zlc3RpbmdQZXJpb2RCbG9ja3MAAAASYmVuZWZpY2lhcnlBZGRyZXNzBAAAAAp2ZXN0aW5nRW5kCQAAZAAAAAIFAAAAD2NsYWltU3RhcnRCbG9jawUAAAATdmVzdGluZ1BlcmlvZEJsb2NrcwMJAQAAAAlpc0RlZmluZWQAAAABCQAEIgAAAAEJAQAAAAlrZXlDb25maWcAAAAACQAAAgAAAAECAAAAE2FscmVhZHkgaW5pdGlhbGl6ZWQDCQEAAAACIT0A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", "height": 3637207, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6oV1s1suMBzpPtEZwmBoZkR7Ncggo2A58KjQUUsJbn7y Next: none Diff:
OldNewDifferences
1010 func keyManagerPublicKey () = "%s__managerPublicKey"
1111
1212
13-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
13+func keyManagerVaultAddress () = "%s__managerVaultAddress"
1414
1515
1616 let IdxCfgClaimStartBlock = 1
6666 func readTotalsArray () = split(getStringOrFail(keyTotals()), SEP)
6767
6868
69+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
70+ case s: String =>
71+ addressFromStringValue(s)
72+ case _ =>
73+ this
74+}
75+
76+
6977 func TotalsEntry (key,origArray,claimedAmt,newLastClaimedHeight) = {
7078 let totalClaimedAmount = parseIntValue(origArray[IdxTotalsTotalClaimedAmount])
7179 let remainingAmount = parseIntValue(origArray[IdxTotalsRemainingAmount])
8189 func ClaimOperationHistoryEntry (userAddress,claimedAssetAmount,claimingBlocks,firstCalculationBlock,lastCalculationBlock,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(claimedAssetAmount, claimingBlocks, firstCalculationBlock, lastCalculationBlock))
8290
8391
84-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
85- case s: String =>
86- fromBase58String(s)
87- case _: Unit =>
88- unit
89- case _ =>
90- throw("Match error")
91-}
92-
93-
94-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
95- case s: String =>
96- fromBase58String(s)
97- case _: Unit =>
98- unit
99- case _ =>
100- throw("Match error")
101-}
92+func managerPublicKeyOrUnit () = {
93+ let managerVaultAddress = getManagerVaultAddressOrThis()
94+ match getString(managerVaultAddress, keyManagerPublicKey()) {
95+ case s: String =>
96+ fromBase58String(s)
97+ case _: Unit =>
98+ unit
99+ case _ =>
100+ throw("Match error")
101+ }
102+ }
102103
103104
104105 func mustManager (i) = {
204205 }
205206
206207
207-
208-@Callable(i)
209-func setManager (pendingManagerPublicKey) = {
210- let checkCaller = mustManager(i)
211- if ((checkCaller == checkCaller))
212- then {
213- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
214- if ((checkManagerPublicKey == checkManagerPublicKey))
215- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
216- else throw("Strict value is not equal to itself.")
217- }
218- else throw("Strict value is not equal to itself.")
219- }
220-
221-
222-
223-@Callable(i)
224-func confirmManager () = {
225- let pm = pendingManagerPublicKeyOrUnit()
226- let hasPM = if (isDefined(pm))
227- then true
228- else throwErr("no pending manager")
229- if ((hasPM == hasPM))
230- then {
231- let checkPM = if ((i.callerPublicKey == value(pm)))
232- then true
233- else throwErr("you are not pending manager")
234- if ((checkPM == checkPM))
235- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
236- else throw("Strict value is not equal to itself.")
237- }
238- else throw("Strict value is not equal to itself.")
239- }
240-
241-
242208 @Verifier(tx)
243209 func verify () = {
244210 let targetPublicKey = match managerPublicKeyOrUnit() {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let keyReferral = makeString(["%s", "referral"], SEP)
77
88 let keyWxAssetId = makeString(["%s", "wxAssetId"], SEP)
99
1010 func keyManagerPublicKey () = "%s__managerPublicKey"
1111
1212
13-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
13+func keyManagerVaultAddress () = "%s__managerVaultAddress"
1414
1515
1616 let IdxCfgClaimStartBlock = 1
1717
1818 let IdxCfgClaimVestingPeriod = 2
1919
2020 let IdxCfgClaimAssetId = 3
2121
2222 let IdxCfgClaimAssetMult = 4
2323
2424 let IdxCfgClaimAssetOwner = 5
2525
2626 let IdxCfgClaimAssetTotalAmount = 6
2727
2828 let IdxTotalsTotalClaimedAmount = 1
2929
3030 let IdxTotalsRemainingAmount = 2
3131
3232 let IdxTotalsLastClaimedHeight = 3
3333
3434 func throwErr (msg) = throw(makeString(["marketing.ride:", msg], " "))
3535
3636
3737 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
3838
3939
4040 func formatConfigString (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,assetOwner,assetTotalAmt) = makeString(["%d%d%s%d%s%d%", claimStartBlock, vestingPeriod, assetIdBase58, assetMult, assetOwner, assetTotalAmt], SEP)
4141
4242
4343 func formatConfig (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,claimAssetOwner,claimAssetTotalAmount) = formatConfigString(toString(claimStartBlock), toString(vestingPeriod), assetIdBase58, toString(assetMult), claimAssetOwner, toString(claimAssetTotalAmount))
4444
4545
4646 func formatTotalsString (totalClaimedAmount,remainingAmountForClaim,lastClaimedHeight) = makeString(["%d%d%d", totalClaimedAmount, remainingAmountForClaim, lastClaimedHeight], SEP)
4747
4848
4949 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)
5050
5151
5252 func keyConfig () = "%s__config"
5353
5454
5555 func keyTotals () = "%s__totals"
5656
5757
5858 let keyAmountUnclaimed = makeString(["%s", "amountUnclaimed"], SEP)
5959
6060 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
6161
6262
6363 func readConfigArray () = split(getStringOrFail(keyConfig()), SEP)
6464
6565
6666 func readTotalsArray () = split(getStringOrFail(keyTotals()), SEP)
6767
6868
69+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
70+ case s: String =>
71+ addressFromStringValue(s)
72+ case _ =>
73+ this
74+}
75+
76+
6977 func TotalsEntry (key,origArray,claimedAmt,newLastClaimedHeight) = {
7078 let totalClaimedAmount = parseIntValue(origArray[IdxTotalsTotalClaimedAmount])
7179 let remainingAmount = parseIntValue(origArray[IdxTotalsRemainingAmount])
7280 let lastClaimedHeight = parseIntValue(origArray[IdxTotalsLastClaimedHeight])
7381 let newTotalClaimedAmount = (totalClaimedAmount + claimedAmt)
7482 let newRemainingAmount = (remainingAmount - claimedAmt)
7583 if ((0 > newRemainingAmount))
7684 then throw("invalid math")
7785 else StringEntry(key, formatTotalsString(toString(newTotalClaimedAmount), toString(newRemainingAmount), toString(newLastClaimedHeight)))
7886 }
7987
8088
8189 func ClaimOperationHistoryEntry (userAddress,claimedAssetAmount,claimingBlocks,firstCalculationBlock,lastCalculationBlock,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(claimedAssetAmount, claimingBlocks, firstCalculationBlock, lastCalculationBlock))
8290
8391
84-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
85- case s: String =>
86- fromBase58String(s)
87- case _: Unit =>
88- unit
89- case _ =>
90- throw("Match error")
91-}
92-
93-
94-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
95- case s: String =>
96- fromBase58String(s)
97- case _: Unit =>
98- unit
99- case _ =>
100- throw("Match error")
101-}
92+func managerPublicKeyOrUnit () = {
93+ let managerVaultAddress = getManagerVaultAddressOrThis()
94+ match getString(managerVaultAddress, keyManagerPublicKey()) {
95+ case s: String =>
96+ fromBase58String(s)
97+ case _: Unit =>
98+ unit
99+ case _ =>
100+ throw("Match error")
101+ }
102+ }
102103
103104
104105 func mustManager (i) = {
105106 let pd = throwErr("permission denied")
106107 match managerPublicKeyOrUnit() {
107108 case pk: ByteVector =>
108109 if ((i.callerPublicKey == pk))
109110 then true
110111 else pd
111112 case _: Unit =>
112113 if ((i.caller == this))
113114 then true
114115 else pd
115116 case _ =>
116117 throw("Match error")
117118 }
118119 }
119120
120121
121122 func claimCommon (i,amount) = {
122123 let cfgArray = readConfigArray()
123124 let cfgClaimStartHeight = parseIntValue(cfgArray[IdxCfgClaimStartBlock])
124125 let cfgClaimDuration = parseIntValue(cfgArray[IdxCfgClaimVestingPeriod])
125126 let cfgClaimEnd = (cfgClaimStartHeight + cfgClaimDuration)
126127 let cfgClaimAssetId = fromBase58String(cfgArray[IdxCfgClaimAssetId])
127128 let cfgClaimAssetOwner = addressFromStringValue(cfgArray[IdxCfgClaimAssetOwner])
128129 let cfgClaimAssetTotalAmount = parseIntValue(cfgArray[IdxCfgClaimAssetTotalAmount])
129130 let origTotalsArray = readTotalsArray()
130131 let totalClaimedAmount = parseIntValue(origTotalsArray[IdxTotalsTotalClaimedAmount])
131132 let totalRemainingAmount = parseIntValue(origTotalsArray[IdxTotalsRemainingAmount])
132133 let lastClaimedHeight = parseIntValue(origTotalsArray[IdxTotalsLastClaimedHeight])
133134 if ((i.caller != cfgClaimAssetOwner))
134135 then throw("permissions denied")
135136 else if ((cfgClaimStartHeight > height))
136137 then throw(("Wait claim start block: " + toString(cfgClaimStartHeight)))
137138 else {
138139 let lastCalulationBlock = if ((height > cfgClaimEnd))
139140 then cfgClaimEnd
140141 else height
141142 let firstCalulationBlock = if ((lastClaimedHeight == 0))
142143 then cfgClaimStartHeight
143144 else lastClaimedHeight
144145 let claimingBlocks = (lastCalulationBlock - firstCalulationBlock)
145146 let amountAvailable = fraction(cfgClaimAssetTotalAmount, claimingBlocks, cfgClaimDuration)
146147 let amountUnclaimed = valueOrElse(getInteger(this, keyAmountUnclaimed), 0)
147148 let amountAvailableTotal = (amountAvailable + amountUnclaimed)
148149 let amountToClaim = if (if ((0 >= amount))
149150 then true
150151 else (amount >= amountAvailableTotal))
151152 then amountAvailableTotal
152153 else amount
153154 let amountUnclaimedNew = (amountAvailableTotal - amountToClaim)
154155 $Tuple2([IntegerEntry(keyAmountUnclaimed, amountUnclaimedNew), ScriptTransfer(cfgClaimAssetOwner, amountToClaim, cfgClaimAssetId), TotalsEntry(keyTotals(), readTotalsArray(), amountToClaim, lastCalulationBlock), ClaimOperationHistoryEntry(toString(cfgClaimAssetOwner), amountToClaim, claimingBlocks, firstCalulationBlock, lastCalulationBlock, i.transactionId)], amountToClaim)
155156 }
156157 }
157158
158159
159160 @Callable(i)
160161 func constructor (claimStartBlock,vestingPeriodBlocks,beneficiaryAddress) = {
161162 let vestingEnd = (claimStartBlock + vestingPeriodBlocks)
162163 if (isDefined(getString(keyConfig())))
163164 then throw("already initialized")
164165 else if ((size(i.payments) != 1))
165166 then throw("exactly 1 payment must be attached")
166167 else if ((i.callerPublicKey != base58'2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq'))
167168 then throw("not authorized")
168169 else {
169170 let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed")
170171 let pmt = value(i.payments[0])
171172 let claimAssetId = value(pmt.assetId)
172173 let claimAssetInfo = valueOrErrorMessage(assetInfo(claimAssetId), "fail to load ido asset info")
173174 let claimAssetId58 = toBase58String(claimAssetId)
174175 let claimAssetMult = pow(10, 0, claimAssetInfo.decimals, 0, 0, DOWN)
175176 let claimAssetAmount = pmt.amount
176177 [StringEntry(keyConfig(), formatConfig(claimStartBlock, vestingPeriodBlocks, claimAssetId58, claimAssetMult, toString(beneficiaryAddressParsed), claimAssetAmount)), StringEntry(keyTotals(), formatTotalsString("0", toString(claimAssetAmount), "0"))]
177178 }
178179 }
179180
180181
181182
182183 @Callable(i)
183184 func claimAmount (amount) = claimCommon(i, amount)
184185
185186
186187
187188 @Callable(i)
188189 func claim () = claimCommon(i, -1)
189190
190191
191192
192193 @Callable(i)
193194 func withdrawReferralReward (wxAmount) = {
194195 let referralContractAddress = value(getString(keyReferral))
195196 let mustReferral = if ((toString(i.caller) == referralContractAddress))
196197 then true
197198 else throwErr("permission denied")
198199 if ((mustReferral == mustReferral))
199200 then {
200201 let wxAssetId = fromBase58String(value(getString(keyWxAssetId)))
201202 $Tuple2([ScriptTransfer(i.caller, wxAmount, wxAssetId), ClaimOperationHistoryEntry(referralContractAddress, wxAmount, 0, 0, 0, i.transactionId)], unit)
202203 }
203204 else throw("Strict value is not equal to itself.")
204205 }
205206
206207
207-
208-@Callable(i)
209-func setManager (pendingManagerPublicKey) = {
210- let checkCaller = mustManager(i)
211- if ((checkCaller == checkCaller))
212- then {
213- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
214- if ((checkManagerPublicKey == checkManagerPublicKey))
215- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
216- else throw("Strict value is not equal to itself.")
217- }
218- else throw("Strict value is not equal to itself.")
219- }
220-
221-
222-
223-@Callable(i)
224-func confirmManager () = {
225- let pm = pendingManagerPublicKeyOrUnit()
226- let hasPM = if (isDefined(pm))
227- then true
228- else throwErr("no pending manager")
229- if ((hasPM == hasPM))
230- then {
231- let checkPM = if ((i.callerPublicKey == value(pm)))
232- then true
233- else throwErr("you are not pending manager")
234- if ((checkPM == checkPM))
235- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
236- else throw("Strict value is not equal to itself.")
237- }
238- else throw("Strict value is not equal to itself.")
239- }
240-
241-
242208 @Verifier(tx)
243209 func verify () = {
244210 let targetPublicKey = match managerPublicKeyOrUnit() {
245211 case pk: ByteVector =>
246212 pk
247213 case _: Unit =>
248214 tx.senderPublicKey
249215 case _ =>
250216 throw("Match error")
251217 }
252218 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
253219 }
254220

github/deemru/w8io/3ef1775 
59.79 ms