tx · 4TDYjx3XqNmAYWkdn8K3jhNEaS13y7cmirkAmPKwqxBS

3PDt4YQURTeERKPzaFWAcaVZZTaU8HfFYgL:  -0.01000000 Waves

2023.05.10 15:33 [3637256] smart account 3PDt4YQURTeERKPzaFWAcaVZZTaU8HfFYgL > SELF 0.00000000 Waves

{ "type": 13, "id": "4TDYjx3XqNmAYWkdn8K3jhNEaS13y7cmirkAmPKwqxBS", "fee": 1000000, "feeAssetId": null, "timestamp": 1683722000904, "version": 2, "chainId": 87, "sender": "3PDt4YQURTeERKPzaFWAcaVZZTaU8HfFYgL", "senderPublicKey": "CQNYQYz3JduEy7feaysKpLjfAwyVEbSmuvy7makYNfCZ", "proofs": [ "2w99bfKMEWqvULWWvf4cpKXWxQ6LfnecCcUYraXwbviM37qyrsJvMPeHQFjzgGL3yTspg5JJDWFWAKUypLMXrSUR" ], "script": "base64:BgILCAISBQoDAQEIEgAcAANTRVACAl9fARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQAVSWR4Q2ZnQ2xhaW1TdGFydEJsb2NrAAEAGElkeENmZ0NsYWltVmVzdGluZ1BlcmlvZAACABJJZHhDZmdDbGFpbUFzc2V0SWQAAwAUSWR4Q2ZnQ2xhaW1Bc3NldE11bHQABAAVSWR4Q2ZnQ2xhaW1Bc3NldE93bmVyAAUAG0lkeENmZ0NsYWltQXNzZXRUb3RhbEFtb3VudAAGABtJZHhUb3RhbHNUb3RhbENsYWltZWRBbW91bnQAAQAYSWR4VG90YWxzUmVtYWluaW5nQW1vdW50AAIAGklkeFRvdGFsc0xhc3RDbGFpbWVkSGVpZ2h0AAMBD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAESZm9ybWF0Q29uZmlnU3RyaW5nBg9jbGFpbVN0YXJ0QmxvY2sNdmVzdGluZ1BlcmlvZA1hc3NldElkQmFzZTU4CWFzc2V0TXVsdAphc3NldE93bmVyDWFzc2V0VG90YWxBbXQJALkJAgkAzAgCAg0lZCVkJXMlZCVzJWQlCQDMCAIFD2NsYWltU3RhcnRCbG9jawkAzAgCBQ12ZXN0aW5nUGVyaW9kCQDMCAIFDWFzc2V0SWRCYXNlNTgJAMwIAgUJYXNzZXRNdWx0CQDMCAIFCmFzc2V0T3duZXIJAMwIAgUNYXNzZXRUb3RhbEFtdAUDbmlsBQNTRVABDGZvcm1hdENvbmZpZwYPY2xhaW1TdGFydEJsb2NrDXZlc3RpbmdQZXJpb2QNYXNzZXRJZEJhc2U1OAlhc3NldE11bHQPY2xhaW1Bc3NldE93bmVyFWNsYWltQXNzZXRUb3RhbEFtb3VudAkBEmZvcm1hdENvbmZpZ1N0cmluZwYJAKQDAQUPY2xhaW1TdGFydEJsb2NrCQCkAwEFDXZlc3RpbmdQZXJpb2QFDWFzc2V0SWRCYXNlNTgJAKQDAQUJYXNzZXRNdWx0BQ9jbGFpbUFzc2V0T3duZXIJAKQDAQUVY2xhaW1Bc3NldFRvdGFsQW1vdW50ARJmb3JtYXRUb3RhbHNTdHJpbmcDEnRvdGFsQ2xhaW1lZEFtb3VudBdyZW1haW5pbmdBbW91bnRGb3JDbGFpbRFsYXN0Q2xhaW1lZEhlaWdodAkAuQkCCQDMCAICBiVkJWQlZAkAzAgCBRJ0b3RhbENsYWltZWRBbW91bnQJAMwIAgUXcmVtYWluaW5nQW1vdW50Rm9yQ2xhaW0JAMwIAgURbGFzdENsYWltZWRIZWlnaHQFA25pbAUDU0VQARNmb3JtYXRIaXN0b3J5UmVjb3JkBBJjbGFpbWVkQXNzZXRBbW91bnQOY2xhaW1pbmdCbG9ja3MUZmlyc3RDYWx1bGF0aW9uQmxvY2sTbGFzdENhbHVsYXRpb25CbG9jawkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUSY2xhaW1lZEFzc2V0QW1vdW50CQDMCAIJAKQDAQUOY2xhaW1pbmdCbG9ja3MJAMwIAgkApAMBBRRmaXJzdENhbHVsYXRpb25CbG9jawkAzAgCCQCkAwEFE2xhc3RDYWx1bGF0aW9uQmxvY2sFA25pbAUDU0VQAQlrZXlDb25maWcAAgolc19fY29uZmlnAQlrZXlUb3RhbHMAAgolc19fdG90YWxzARlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAwR0eXBlC3VzZXJBZGRyZXNzBnR4SWQ1OAkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUGdHhJZDU4BQNuaWwFA1NFUAEPcmVhZENvbmZpZ0FycmF5AAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAQkBCWtleUNvbmZpZwAFA1NFUAEPcmVhZFRvdGFsc0FycmF5AAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAQkBCWtleVRvdGFscwAFA1NFUAELVG90YWxzRW50cnkEA2tleQlvcmlnQXJyYXkKY2xhaW1lZEFtdBRuZXdMYXN0Q2xhaW1lZEhlaWdodAQSdG90YWxDbGFpbWVkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJb3JpZ0FycmF5BRtJZHhUb3RhbHNUb3RhbENsYWltZWRBbW91bnQED3JlbWFpbmluZ0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCW9yaWdBcnJheQUYSWR4VG90YWxzUmVtYWluaW5nQW1vdW50BBFsYXN0Q2xhaW1lZEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCW9yaWdBcnJheQUaSWR4VG90YWxzTGFzdENsYWltZWRIZWlnaHQEFW5ld1RvdGFsQ2xhaW1lZEFtb3VudAkAZAIFEnRvdGFsQ2xhaW1lZEFtb3VudAUKY2xhaW1lZEFtdAQSbmV3UmVtYWluaW5nQW1vdW50CQBlAgUPcmVtYWluaW5nQW1vdW50BQpjbGFpbWVkQW10AwkAZgIAAAUSbmV3UmVtYWluaW5nQW1vdW50CQACAQIMaW52YWxpZCBtYXRoCQELU3RyaW5nRW50cnkCBQNrZXkJARJmb3JtYXRUb3RhbHNTdHJpbmcDCQCkAwEFFW5ld1RvdGFsQ2xhaW1lZEFtb3VudAkApAMBBRJuZXdSZW1haW5pbmdBbW91bnQJAKQDAQUUbmV3TGFzdENsYWltZWRIZWlnaHQBGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5Bgt1c2VyQWRkcmVzcxJjbGFpbWVkQXNzZXRBbW91bnQOY2xhaW1pbmdCbG9ja3MVZmlyc3RDYWxjdWxhdGlvbkJsb2NrFGxhc3RDYWxjdWxhdGlvbkJsb2NrBHR4SWQJAQtTdHJpbmdFbnRyeQIJARlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAwIFY2xhaW0FC3VzZXJBZGRyZXNzCQDYBAEFBHR4SWQJARNmb3JtYXRIaXN0b3J5UmVjb3JkBAUSY2xhaW1lZEFzc2V0QW1vdW50BQ5jbGFpbWluZ0Jsb2NrcwUVZmlyc3RDYWxjdWxhdGlvbkJsb2NrBRRsYXN0Q2FsY3VsYXRpb25CbG9jawEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAKIIAQkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBcwUEdGhpcwEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEE21hbmFnZXJWYXVsdEFkZHJlc3MJARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAnQgCBRNtYW5hZ2VyVmF1bHRBZGRyZXNzCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQlpc01hbmFnZXIBAWkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQMJAQlpc01hbmFnZXIBBQFpBgkAAgECEXBlcm1pc3Npb24gZGVuaWVkAgFpAQtjb25zdHJ1Y3RvcgMPY2xhaW1TdGFydEJsb2NrE3Zlc3RpbmdQZXJpb2RCbG9ja3MSYmVuZWZpY2lhcnlBZGRyZXNzBAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIECnZlc3RpbmdFbmQJAGQCBQ9jbGFpbVN0YXJ0QmxvY2sFE3Zlc3RpbmdQZXJpb2RCbG9ja3MDCQEJaXNEZWZpbmVkAQkAoggBCQEJa2V5Q29uZmlnAAkAAgECE2FscmVhZHkgaW5pdGlhbGl6ZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBBhiZW5lZmljaWFyeUFkZHJlc3NQYXJzZWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBRJiZW5lZmljaWFyeUFkZHJlc3MCIEludmFsaWQgYmVuZWZpY2lhckFkZHJlc3MgcGFzc2VkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQMY2xhaW1Bc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEDmNsYWltQXNzZXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUMY2xhaW1Bc3NldElkAhtmYWlsIHRvIGxvYWQgaWRvIGFzc2V0IGluZm8EDmNsYWltQXNzZXRJZDU4CQDYBAEFDGNsYWltQXNzZXRJZAQOY2xhaW1Bc3NldE11bHQJAGwGAAoAAAgFDmNsYWltQXNzZXRJbmZvCGRlY2ltYWxzAAAAAAUERE9XTgQQY2xhaW1Bc3NldEFtb3VudAgFA3BtdAZhbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCWtleUNvbmZpZwAJAQxmb3JtYXRDb25maWcGBQ9jbGFpbVN0YXJ0QmxvY2sFE3Zlc3RpbmdQZXJpb2RCbG9ja3MFDmNsYWltQXNzZXRJZDU4BQ5jbGFpbUFzc2V0TXVsdAkApQgBBRhiZW5lZmljaWFyeUFkZHJlc3NQYXJzZWQFEGNsYWltQXNzZXRBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCWtleVRvdGFscwAJARJmb3JtYXRUb3RhbHNTdHJpbmcDAgEwCQCkAwEFEGNsYWltQXNzZXRBbW91bnQCATAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQAECGNmZ0FycmF5CQEPcmVhZENvbmZpZ0FycmF5AAQTY2ZnQ2xhaW1TdGFydEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGNmZ0FycmF5BRVJZHhDZmdDbGFpbVN0YXJ0QmxvY2sEEGNmZ0NsYWltRHVyYXRpb24JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjZmdBcnJheQUYSWR4Q2ZnQ2xhaW1WZXN0aW5nUGVyaW9kBAtjZmdDbGFpbUVuZAkAZAIFE2NmZ0NsYWltU3RhcnRIZWlnaHQFEGNmZ0NsYWltRHVyYXRpb24EEWNmZ0NsYWltQXNzZXRJZDU4CQCRAwIFCGNmZ0FycmF5BRJJZHhDZmdDbGFpbUFzc2V0SWQEEmNmZ0NsYWltQXNzZXRPd25lcgkAkQMCBQhjZmdBcnJheQUVSWR4Q2ZnQ2xhaW1Bc3NldE93bmVyBBhjZmdDbGFpbUFzc2V0VG90YWxBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjZmdBcnJheQUbSWR4Q2ZnQ2xhaW1Bc3NldFRvdGFsQW1vdW50BAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBA11c2VyQWRkcmVzczU4CQClCAEFC3VzZXJBZGRyZXNzBA9vcmlnVG90YWxzQXJyYXkJAQ9yZWFkVG90YWxzQXJyYXkABBJ0b3RhbENsYWltZWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ9vcmlnVG90YWxzQXJyYXkFG0lkeFRvdGFsc1RvdGFsQ2xhaW1lZEFtb3VudAQUdG90YWxSZW1haW5pbmdBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ9vcmlnVG90YWxzQXJyYXkFGElkeFRvdGFsc1JlbWFpbmluZ0Ftb3VudAQRbGFzdENsYWltZWRIZWlnaHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ9vcmlnVG90YWxzQXJyYXkFGklkeFRvdGFsc0xhc3RDbGFpbWVkSGVpZ2h0AwkBAiE9AgUNdXNlckFkZHJlc3M1OAUSY2ZnQ2xhaW1Bc3NldE93bmVyCQACAQIScGVybWlzc2lvbnMgZGVuaWVkAwkAZgIFE2NmZ0NsYWltU3RhcnRIZWlnaHQFBmhlaWdodAkAAgEJAKwCAgIYV2FpdCBjbGFpbSBzdGFydCBibG9jazogCQCkAwEFE2NmZ0NsYWltU3RhcnRIZWlnaHQEE2xhc3RDYWx1bGF0aW9uQmxvY2sDCQBmAgUGaGVpZ2h0BQtjZmdDbGFpbUVuZAULY2ZnQ2xhaW1FbmQFBmhlaWdodAQUZmlyc3RDYWx1bGF0aW9uQmxvY2sDCQAAAgURbGFzdENsYWltZWRIZWlnaHQAAAUTY2ZnQ2xhaW1TdGFydEhlaWdodAURbGFzdENsYWltZWRIZWlnaHQEDmNsYWltaW5nQmxvY2tzCQBlAgUTbGFzdENhbHVsYXRpb25CbG9jawUUZmlyc3RDYWx1bGF0aW9uQmxvY2sEE2NsYWltaW5nQXNzZXRBbW91bnQJAGsDBRhjZmdDbGFpbUFzc2V0VG90YWxBbW91bnQFDmNsYWltaW5nQmxvY2tzBRBjZmdDbGFpbUR1cmF0aW9uCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBRNjbGFpbWluZ0Fzc2V0QW1vdW50CQDZBAEFEWNmZ0NsYWltQXNzZXRJZDU4CQDMCAIJAQtUb3RhbHNFbnRyeQQJAQlrZXlUb3RhbHMACQEPcmVhZFRvdGFsc0FycmF5AAUTY2xhaW1pbmdBc3NldEFtb3VudAUTbGFzdENhbHVsYXRpb25CbG9jawkAzAgCCQEaQ2xhaW1PcGVyYXRpb25IaXN0b3J5RW50cnkGBQ11c2VyQWRkcmVzczU4BRNjbGFpbWluZ0Fzc2V0QW1vdW50BQ5jbGFpbWluZ0Jsb2NrcwUUZmlyc3RDYWx1bGF0aW9uQmxvY2sFE2xhc3RDYWx1bGF0aW9uQmxvY2sIBQFpDXRyYW5zYWN0aW9uSWQFA25pbAECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tlecmIKqY=", "height": 3637256, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AVDDe8Xhr2fjowTyu9x8U6keCdAbVKszMjxQH4c6ymm1 Next: none Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
5+
6+func keyManagerVaultAddress () = "%s__managerVaultAddress"
7+
8+
9+func keyManagerPublicKey () = "%s__managerPublicKey"
10+
511
612 let IdxCfgClaimStartBlock = 1
713
6672 func ClaimOperationHistoryEntry (userAddress,claimedAssetAmount,claimingBlocks,firstCalculationBlock,lastCalculationBlock,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(claimedAssetAmount, claimingBlocks, firstCalculationBlock, lastCalculationBlock))
6773
6874
75+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
76+ case s: String =>
77+ addressFromStringValue(s)
78+ case _ =>
79+ this
80+}
81+
82+
83+func managerPublicKeyOrUnit () = {
84+ let managerVaultAddress = getManagerVaultAddressOrThis()
85+ match getString(managerVaultAddress, keyManagerPublicKey()) {
86+ case s: String =>
87+ fromBase58String(s)
88+ case _: Unit =>
89+ unit
90+ case _ =>
91+ throw("Match error")
92+ }
93+ }
94+
95+
96+func isManager (i) = match managerPublicKeyOrUnit() {
97+ case pk: ByteVector =>
98+ (i.callerPublicKey == pk)
99+ case _: Unit =>
100+ (i.caller == this)
101+ case _ =>
102+ throw("Match error")
103+}
104+
105+
106+func mustManager (i) = if (isManager(i))
107+ then true
108+ else throw("permission denied")
109+
110+
69111 @Callable(i)
70112 func constructor (claimStartBlock,vestingPeriodBlocks,beneficiaryAddress) = {
71- let vestingEnd = (claimStartBlock + vestingPeriodBlocks)
72- if (isDefined(getString(keyConfig())))
73- then throw("already initialized")
74- else if ((size(i.payments) != 1))
75- then throw("exactly 1 payment must be attached")
76- else if ((i.callerPublicKey != base58'2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq'))
77- then throw("not authorized")
78- else {
79- let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed")
80- let pmt = value(i.payments[0])
81- let claimAssetId = value(pmt.assetId)
82- let claimAssetInfo = valueOrErrorMessage(assetInfo(claimAssetId), "fail to load ido asset info")
83- let claimAssetId58 = toBase58String(claimAssetId)
84- let claimAssetMult = pow(10, 0, claimAssetInfo.decimals, 0, 0, DOWN)
85- let claimAssetAmount = pmt.amount
113+ let checkCaller = mustManager(i)
114+ if ((checkCaller == checkCaller))
115+ then {
116+ let vestingEnd = (claimStartBlock + vestingPeriodBlocks)
117+ if (isDefined(getString(keyConfig())))
118+ then throw("already initialized")
119+ else if ((size(i.payments) != 1))
120+ then throw("exactly 1 payment must be attached")
121+ else {
122+ let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed")
123+ let pmt = value(i.payments[0])
124+ let claimAssetId = value(pmt.assetId)
125+ let claimAssetInfo = valueOrErrorMessage(assetInfo(claimAssetId), "fail to load ido asset info")
126+ let claimAssetId58 = toBase58String(claimAssetId)
127+ let claimAssetMult = pow(10, 0, claimAssetInfo.decimals, 0, 0, DOWN)
128+ let claimAssetAmount = pmt.amount
86129 [StringEntry(keyConfig(), formatConfig(claimStartBlock, vestingPeriodBlocks, claimAssetId58, claimAssetMult, toString(beneficiaryAddressParsed), claimAssetAmount)), StringEntry(keyTotals(), formatTotalsString("0", toString(claimAssetAmount), "0"))]
87- }
130+ }
131+ }
132+ else throw("Strict value is not equal to itself.")
88133 }
89134
90135
123168
124169
125170 @Verifier(tx)
126-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String("2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq"))
171+func verify () = {
172+ let targetPublicKey = match managerPublicKeyOrUnit() {
173+ case pk: ByteVector =>
174+ pk
175+ case _: Unit =>
176+ tx.senderPublicKey
177+ case _ =>
178+ throw("Match error")
179+ }
180+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
181+ }
127182
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
5+
6+func keyManagerVaultAddress () = "%s__managerVaultAddress"
7+
8+
9+func keyManagerPublicKey () = "%s__managerPublicKey"
10+
511
612 let IdxCfgClaimStartBlock = 1
713
814 let IdxCfgClaimVestingPeriod = 2
915
1016 let IdxCfgClaimAssetId = 3
1117
1218 let IdxCfgClaimAssetMult = 4
1319
1420 let IdxCfgClaimAssetOwner = 5
1521
1622 let IdxCfgClaimAssetTotalAmount = 6
1723
1824 let IdxTotalsTotalClaimedAmount = 1
1925
2026 let IdxTotalsRemainingAmount = 2
2127
2228 let IdxTotalsLastClaimedHeight = 3
2329
2430 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
2531
2632
2733 func formatConfigString (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,assetOwner,assetTotalAmt) = makeString(["%d%d%s%d%s%d%", claimStartBlock, vestingPeriod, assetIdBase58, assetMult, assetOwner, assetTotalAmt], SEP)
2834
2935
3036 func formatConfig (claimStartBlock,vestingPeriod,assetIdBase58,assetMult,claimAssetOwner,claimAssetTotalAmount) = formatConfigString(toString(claimStartBlock), toString(vestingPeriod), assetIdBase58, toString(assetMult), claimAssetOwner, toString(claimAssetTotalAmount))
3137
3238
3339 func formatTotalsString (totalClaimedAmount,remainingAmountForClaim,lastClaimedHeight) = makeString(["%d%d%d", totalClaimedAmount, remainingAmountForClaim, lastClaimedHeight], SEP)
3440
3541
3642 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)
3743
3844
3945 func keyConfig () = "%s__config"
4046
4147
4248 func keyTotals () = "%s__totals"
4349
4450
4551 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
4652
4753
4854 func readConfigArray () = split(getStringOrFail(keyConfig()), SEP)
4955
5056
5157 func readTotalsArray () = split(getStringOrFail(keyTotals()), SEP)
5258
5359
5460 func TotalsEntry (key,origArray,claimedAmt,newLastClaimedHeight) = {
5561 let totalClaimedAmount = parseIntValue(origArray[IdxTotalsTotalClaimedAmount])
5662 let remainingAmount = parseIntValue(origArray[IdxTotalsRemainingAmount])
5763 let lastClaimedHeight = parseIntValue(origArray[IdxTotalsLastClaimedHeight])
5864 let newTotalClaimedAmount = (totalClaimedAmount + claimedAmt)
5965 let newRemainingAmount = (remainingAmount - claimedAmt)
6066 if ((0 > newRemainingAmount))
6167 then throw("invalid math")
6268 else StringEntry(key, formatTotalsString(toString(newTotalClaimedAmount), toString(newRemainingAmount), toString(newLastClaimedHeight)))
6369 }
6470
6571
6672 func ClaimOperationHistoryEntry (userAddress,claimedAssetAmount,claimingBlocks,firstCalculationBlock,lastCalculationBlock,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(claimedAssetAmount, claimingBlocks, firstCalculationBlock, lastCalculationBlock))
6773
6874
75+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
76+ case s: String =>
77+ addressFromStringValue(s)
78+ case _ =>
79+ this
80+}
81+
82+
83+func managerPublicKeyOrUnit () = {
84+ let managerVaultAddress = getManagerVaultAddressOrThis()
85+ match getString(managerVaultAddress, keyManagerPublicKey()) {
86+ case s: String =>
87+ fromBase58String(s)
88+ case _: Unit =>
89+ unit
90+ case _ =>
91+ throw("Match error")
92+ }
93+ }
94+
95+
96+func isManager (i) = match managerPublicKeyOrUnit() {
97+ case pk: ByteVector =>
98+ (i.callerPublicKey == pk)
99+ case _: Unit =>
100+ (i.caller == this)
101+ case _ =>
102+ throw("Match error")
103+}
104+
105+
106+func mustManager (i) = if (isManager(i))
107+ then true
108+ else throw("permission denied")
109+
110+
69111 @Callable(i)
70112 func constructor (claimStartBlock,vestingPeriodBlocks,beneficiaryAddress) = {
71- let vestingEnd = (claimStartBlock + vestingPeriodBlocks)
72- if (isDefined(getString(keyConfig())))
73- then throw("already initialized")
74- else if ((size(i.payments) != 1))
75- then throw("exactly 1 payment must be attached")
76- else if ((i.callerPublicKey != base58'2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq'))
77- then throw("not authorized")
78- else {
79- let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed")
80- let pmt = value(i.payments[0])
81- let claimAssetId = value(pmt.assetId)
82- let claimAssetInfo = valueOrErrorMessage(assetInfo(claimAssetId), "fail to load ido asset info")
83- let claimAssetId58 = toBase58String(claimAssetId)
84- let claimAssetMult = pow(10, 0, claimAssetInfo.decimals, 0, 0, DOWN)
85- let claimAssetAmount = pmt.amount
113+ let checkCaller = mustManager(i)
114+ if ((checkCaller == checkCaller))
115+ then {
116+ let vestingEnd = (claimStartBlock + vestingPeriodBlocks)
117+ if (isDefined(getString(keyConfig())))
118+ then throw("already initialized")
119+ else if ((size(i.payments) != 1))
120+ then throw("exactly 1 payment must be attached")
121+ else {
122+ let beneficiaryAddressParsed = valueOrErrorMessage(addressFromString(beneficiaryAddress), "Invalid beneficiarAddress passed")
123+ let pmt = value(i.payments[0])
124+ let claimAssetId = value(pmt.assetId)
125+ let claimAssetInfo = valueOrErrorMessage(assetInfo(claimAssetId), "fail to load ido asset info")
126+ let claimAssetId58 = toBase58String(claimAssetId)
127+ let claimAssetMult = pow(10, 0, claimAssetInfo.decimals, 0, 0, DOWN)
128+ let claimAssetAmount = pmt.amount
86129 [StringEntry(keyConfig(), formatConfig(claimStartBlock, vestingPeriodBlocks, claimAssetId58, claimAssetMult, toString(beneficiaryAddressParsed), claimAssetAmount)), StringEntry(keyTotals(), formatTotalsString("0", toString(claimAssetAmount), "0"))]
87- }
130+ }
131+ }
132+ else throw("Strict value is not equal to itself.")
88133 }
89134
90135
91136
92137 @Callable(i)
93138 func claim () = {
94139 let cfgArray = readConfigArray()
95140 let cfgClaimStartHeight = parseIntValue(cfgArray[IdxCfgClaimStartBlock])
96141 let cfgClaimDuration = parseIntValue(cfgArray[IdxCfgClaimVestingPeriod])
97142 let cfgClaimEnd = (cfgClaimStartHeight + cfgClaimDuration)
98143 let cfgClaimAssetId58 = cfgArray[IdxCfgClaimAssetId]
99144 let cfgClaimAssetOwner = cfgArray[IdxCfgClaimAssetOwner]
100145 let cfgClaimAssetTotalAmount = parseIntValue(cfgArray[IdxCfgClaimAssetTotalAmount])
101146 let userAddress = i.caller
102147 let userAddress58 = toString(userAddress)
103148 let origTotalsArray = readTotalsArray()
104149 let totalClaimedAmount = parseIntValue(origTotalsArray[IdxTotalsTotalClaimedAmount])
105150 let totalRemainingAmount = parseIntValue(origTotalsArray[IdxTotalsRemainingAmount])
106151 let lastClaimedHeight = parseIntValue(origTotalsArray[IdxTotalsLastClaimedHeight])
107152 if ((userAddress58 != cfgClaimAssetOwner))
108153 then throw("permissions denied")
109154 else if ((cfgClaimStartHeight > height))
110155 then throw(("Wait claim start block: " + toString(cfgClaimStartHeight)))
111156 else {
112157 let lastCalulationBlock = if ((height > cfgClaimEnd))
113158 then cfgClaimEnd
114159 else height
115160 let firstCalulationBlock = if ((lastClaimedHeight == 0))
116161 then cfgClaimStartHeight
117162 else lastClaimedHeight
118163 let claimingBlocks = (lastCalulationBlock - firstCalulationBlock)
119164 let claimingAssetAmount = fraction(cfgClaimAssetTotalAmount, claimingBlocks, cfgClaimDuration)
120165 [ScriptTransfer(userAddress, claimingAssetAmount, fromBase58String(cfgClaimAssetId58)), TotalsEntry(keyTotals(), readTotalsArray(), claimingAssetAmount, lastCalulationBlock), ClaimOperationHistoryEntry(userAddress58, claimingAssetAmount, claimingBlocks, firstCalulationBlock, lastCalulationBlock, i.transactionId)]
121166 }
122167 }
123168
124169
125170 @Verifier(tx)
126-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String("2Cbd8ozG7A1RyRNC3nNnZgHu7Ru4K3JCfpyPkhqr9zxq"))
171+func verify () = {
172+ let targetPublicKey = match managerPublicKeyOrUnit() {
173+ case pk: ByteVector =>
174+ pk
175+ case _: Unit =>
176+ tx.senderPublicKey
177+ case _ =>
178+ throw("Match error")
179+ }
180+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
181+ }
127182

github/deemru/w8io/3ef1775 
37.39 ms