tx · 7W7Lhxp1ZmDEneRwiMC4v4uNunyMbf9D65grj5kpoECo

3PRAEZqBjrUDaDvv45HGWPb94DhD6UuZfWg:  -0.00600000 Waves

2023.09.19 12:48 [3827896] smart account 3PRAEZqBjrUDaDvv45HGWPb94DhD6UuZfWg > SELF 0.00000000 Waves

{ "type": 13, "id": "7W7Lhxp1ZmDEneRwiMC4v4uNunyMbf9D65grj5kpoECo", "fee": 600000, "feeAssetId": null, "timestamp": 1695116892537, "version": 1, "sender": "3PRAEZqBjrUDaDvv45HGWPb94DhD6UuZfWg", "senderPublicKey": "DWfBoSph5SQ9fuKvBjSecymWnfmRnBFh9FYg2QEV6bwS", "proofs": [ "3MDTw1gtLRytpTScUhnmrafx42Z5eYxZ7aChboDZdtzFDP9L9cQh29zAPbzMv21dQAVQqjFMSVKPtHenDQMWTWbY" ], "script": "base64:BgIXCAISBAoCCAESBgoECAEBBBIDCgEIEgAWABJjb25maWdBZGRyZXNzU3RvcmUCBmNvbmZpZwANY29uZmlnQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBRJjb25maWdBZGRyZXNzU3RvcmUCH2NoaWxkOiBjb25maWcgYWRkcmVzcyBub3QgZm91bmQCFmludmFsaWQgY29uZmlnIGFkZHJlc3MABkhFSUdIVAUGaGVpZ2h0AQ5vcEFsbG93ZWRTdG9yZQECb3AJAKwCAgkArAICAgNvcF8FAm9wAghfYWxsb3dlZAANdm90aW5nUmVzdWx0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhZjb250cmFjdF92b3RpbmdfcmVzdWx0AhlubyBjb250cmFjdF92b3RpbmdfcmVzdWx0Ah5pbnZhbGlkIGNvbnRyYWN0X3ZvdGluZ19yZXN1bHQBFXdhdmVsZXRzUGVyQmxvY2tTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhNfd2F2ZWxldHNfcGVyX2Jsb2NrARBzdGFydEhlaWdodFN0b3JlAQdhZGRyZXNzCQCsAgIFB2FkZHJlc3MCDV9zdGFydF9oZWlnaHQBDGNsYWltZWRTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhB3YXZlbGV0c19jbGFpbWVkAQ9jbGFpbWVkVVNEU3RvcmUBB2FkZHJlc3MJAKwCAgUHYWRkcmVzcwIVX3dhdmVsZXRzX2NsYWltZWRfdXNkARFtYXhDbGFpbWFibGVTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAhdfd2F2ZWxldHNfbWF4X2NsYWltYWJsZQEWbWF4Q2xhaW1hYmxlSXNVU0RTdG9yZQEHYWRkcmVzcwkArAICBQdhZGRyZXNzAh5fd2F2ZWxldHNfbWF4X2NsYWltYWJsZV9pc191c2QACHN1bVN0b3JlAhZ3YXZlbGV0c19wZXJfYmxvY2tfc3VtAAhtYXhTdG9yZQIWd2F2ZWxldHNfcGVyX2Jsb2NrX21heAAHbWF4aW11bQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhZ3YXZlbGV0c19wZXJfYmxvY2tfbWF4ALDQyVoABm9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAQt2YWx1ZU9yRWxzZQIJAKIIAQIGb3JhY2xlAiMzUEtrb2pLZGQ2QkJ6VGYxUlhiUVZmVURyYU5GWFhIS3pRRgIWaW52YWxpZCBvcmFjbGUgYWRkcmVzcwAOd2F2ZVByaWNlU3RvcmUJAQt2YWx1ZU9yRWxzZQIJAKIIAQIOd2F2ZS1wcmljZS1rZXkCFyVzJXNfX3ByaWNlX19XQVZFUy1VU0RUAAl3YXZlUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQZvcmFjbGUFDndhdmVQcmljZVN0b3JlAiBXQVZFUyBwcmljZSBpcyBub3QgaW4gdGhlIE9yYWNsZQEKd2F2ZXNUb1VTRAEFd2F2ZXMJAGsDBQV3YXZlcwUJd2F2ZVByaWNlAMCEPQEKdXNkVG9XYXZlcwEFd2F2ZXMJAGsDBQV3YXZlcwCAwtcvBQl3YXZlUHJpY2UABm9sZFN1bQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQhzdW1TdG9yZQAAAQxhdmFpbGFibGVOb3cBAnRvBAhwZXJCbG9jawkAnwgBCQEVd2F2ZWxldHNQZXJCbG9ja1N0b3JlAQUCdG8EBXRvdGFsAwkBASEBCQEJaXNEZWZpbmVkAQUIcGVyQmxvY2sAAAQKZmlyc3RCbG9jawkBBXZhbHVlAQkAnwgBCQEQc3RhcnRIZWlnaHRTdG9yZQEFAnRvBAZibG9ja3MJAGUCBQZoZWlnaHQFCmZpcnN0QmxvY2sJAGgCCQEFdmFsdWUBBQhwZXJCbG9jawUGYmxvY2tzBAxjbGFpbWVkV0FWRVMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGNsYWltZWRTdG9yZQEFAnRvAAAECXJlc3RXYXZlcwkAZQIFBXRvdGFsBQxjbGFpbWVkV0FWRVMEDG1heENsYWltYWJsZQkAnwgBCQERbWF4Q2xhaW1hYmxlU3RvcmUBBQJ0bwMJAQlpc0RlZmluZWQBBQxtYXhDbGFpbWFibGUDCQELdmFsdWVPckVsc2UCCQCgCAEJARZtYXhDbGFpbWFibGVJc1VTRFN0b3JlAQUCdG8HBApjbGFpbWVkVVNECQELdmFsdWVPckVsc2UCCQCfCAEJAQ9jbGFpbWVkVVNEU3RvcmUBBQJ0bwkBCndhdmVzVG9VU0QBBQxjbGFpbWVkV0FWRVMEB3Jlc3RVU0QJAGUCCQEFdmFsdWUBBQxtYXhDbGFpbWFibGUFCmNsYWltZWRVU0QEDnJlc3RVc2RJbldhdmVzCQEKdXNkVG9XYXZlcwEFB3Jlc3RVU0QJAJcDAQkAzAgCBQ5yZXN0VXNkSW5XYXZlcwkAzAgCBQlyZXN0V2F2ZXMFA25pbAQFZ3JhbnQJAJcDAQkAzAgCBQV0b3RhbAkAzAgCCQEFdmFsdWUBBQxtYXhDbGFpbWFibGUFA25pbAkAZQIFBWdyYW50BQxjbGFpbWVkV0FWRVMFCXJlc3RXYXZlcwETc2V0U2NoZWR1bGVJbnRlcm5hbAUCdG8Qd2F2ZWxldHNQZXJCbG9jawxtYXhDbGFpbWFibGURaXNNYXhDbGFpbWFibGVVU0QDc3VtAwkAZgIAAAUQd2F2ZWxldHNQZXJCbG9jawkAAgECH3dhdmVsZXRzUGVyQmxvY2sgc2hvdWxkIGJlID49IDAEDXBlckJsb2NrU3RvcmUJARV3YXZlbGV0c1BlckJsb2NrU3RvcmUBBQJ0bwQLb2xkUGVyQmxvY2sJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNcGVyQmxvY2tTdG9yZQAABAZuZXdTdW0JAGQCCQBlAgUDc3VtBQtvbGRQZXJCbG9jawUQd2F2ZWxldHNQZXJCbG9jawQMaGVpZ2h0U3RvcmUxCQEQc3RhcnRIZWlnaHRTdG9yZQEFAnRvBAdjbGFpbWVkCQEMY2xhaW1lZFN0b3JlAQUCdG8DCQBmAgUGbmV3U3VtBQdtYXhpbXVtCQACAQIQbWF4aW11bSBleGNlZWRlZAQSbWF4Q2xhaW1hYmxlU3RvcmUxCQERbWF4Q2xhaW1hYmxlU3RvcmUBBQJ0bwQXbWF4Q2xhaW1hYmxlSXNVU0RTdG9yZTEJARZtYXhDbGFpbWFibGVJc1VTRFN0b3JlAQUCdG8EEW1heENsYWltYWJsZUVudHJ5AwkAAAIFDG1heENsYWltYWJsZQAABQNuaWwDCQBmAgAABQxtYXhDbGFpbWFibGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQUSbWF4Q2xhaW1hYmxlU3RvcmUxCQDMCAIJAQtEZWxldGVFbnRyeQEFF21heENsYWltYWJsZUlzVVNEU3RvcmUxBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIFEm1heENsYWltYWJsZVN0b3JlMQUMbWF4Q2xhaW1hYmxlCQDMCAIJAQxCb29sZWFuRW50cnkCBRdtYXhDbGFpbWFibGVJc1VTRFN0b3JlMQURaXNNYXhDbGFpbWFibGVVU0QFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDXBlckJsb2NrU3RvcmUFEHdhdmVsZXRzUGVyQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFDGhlaWdodFN0b3JlMQUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQdjbGFpbWVkCQEBLQEJAQxhdmFpbGFibGVOb3cBBQJ0bwkAzAgCCQEMSW50ZWdlckVudHJ5AgUIc3VtU3RvcmUFBm5ld1N1bQUDbmlsBRFtYXhDbGFpbWFibGVFbnRyeQUGbmV3U3VtBAFpAQpzZXRTY2VkdWxlAgJ0bxB3YXZlbGV0c1BlckJsb2NrAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIGZGVuaWVkCQETc2V0U2NoZWR1bGVJbnRlcm5hbAUFAnRvBRB3YXZlbGV0c1BlckJsb2NrAAAHBQZvbGRTdW0BaQELc2V0U2NoZWR1bGUEAnRvEHdhdmVsZXRzUGVyQmxvY2sMbWF4Q2xhaW1hYmxlEWlzTWF4Q2xhaW1hYmxlVVNEAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIGZGVuaWVkCQETc2V0U2NoZWR1bGVJbnRlcm5hbAUFAnRvBRB3YXZlbGV0c1BlckJsb2NrBQxtYXhDbGFpbWFibGUFEWlzTWF4Q2xhaW1hYmxlVVNEBQZvbGRTdW0BaQEQc2V0TXVsdGlTY2hlZHVsZQEJc2NoZWR1bGVzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIGZGVuaWVkCgEEZm9sZAIDYWNjCHNjaGVkdWxlAwkAAAIFCHNjaGVkdWxlAgAJAAIBAhFpbnZhbGlkIHNjaGVkdWxlcwQFcGFydHMJALUJAgUIc2NoZWR1bGUCAT0DCQECIT0CCQCQAwEFBXBhcnRzAAIJAAIBAippbnZhbGlkIGZvcm1hdDogYWRyPXdhdmVsZXRzUGVyQmxvY2tbLG1heF0EAnRvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQVwYXJ0cwAACQCsAgICEWludmFsaWQgYWRkcmVzczogCQCRAwIFBXBhcnRzAAAEDWJsb2NrTWF4UGFydHMJALUJAgkAkQMCBQVwYXJ0cwABAgEsBAh3YXZlbGV0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNYmxvY2tNYXhQYXJ0cwAACQCsAgICGWludmFsaWQgd2F2ZXRldHMgbnVtYmVyOiAJAJEDAgUNYmxvY2tNYXhQYXJ0cwAABAskdDA1MTY4NTUzNAMJAAACCQCQAwEFDWJsb2NrTWF4UGFydHMAAgQNbWF4QW5kVXNkUGFydAkAtQkCCQCRAwIFDWJsb2NrTWF4UGFydHMAAQIBJAkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1tYXhBbmRVc2RQYXJ0AAAJAKwCAgIUaW52YWxpZCBtYXggbnVtYmVyOiAJAJEDAgUNbWF4QW5kVXNkUGFydAAACQAAAgkAkAMBBQ1tYXhBbmRVc2RQYXJ0AAIJAJQKAgAABwQMbWF4Q2xhaW1hYmxlCAULJHQwNTE2ODU1MzQCXzEEEWlzTWF4Q2xhaW1hYmxlVVNECAULJHQwNTE2ODU1MzQCXzIECyR0MDU1NTI1NTg0BQNhY2MEBGNtZHMIBQskdDA1NTUyNTU4NAJfMQQDc3VtCAULJHQwNTU1MjU1ODQCXzIECWFkZHJlc3NlcwgFCyR0MDU1NTI1NTg0Al8zBAV0b1N0cgkApQgBBQJ0bwMJAQlpc0RlZmluZWQBCQDPCAIFCWFkZHJlc3NlcwUFdG9TdHIJAAIBCQCsAgICC2R1YmxpY2F0ZTogBQV0b1N0cgQLJHQwNTcxNTU4MTMJARNzZXRTY2hlZHVsZUludGVybmFsBQUFdG9TdHIFCHdhdmVsZXRzBQxtYXhDbGFpbWFibGUFEWlzTWF4Q2xhaW1hYmxlVVNEBQNzdW0EB25ld0NtZHMIBQskdDA1NzE1NTgxMwJfMQQGbmV3U3VtCAULJHQwNTcxNTU4MTMCXzIJAJUKAwkAzggCBQRjbWRzBQduZXdDbWRzBQZuZXdTdW0JAM4IAgUJYWRkcmVzc2VzCQDMCAIFBXRvU3RyBQNuaWwECyR0MDU4ODE1OTU3CgACJGwJALUJAgUJc2NoZWR1bGVzAgF8CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFBm9sZFN1bQUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQEBGNtZHMIBQskdDA1ODgxNTk1NwJfMQQDc3VtCAULJHQwNTg4MTU5NTcCXzIEAnhfCAULJHQwNTg4MTU5NTcCXzMJAJQKAgUEY21kcwUDc3VtAWkBBUNsYWltAAQFdG9BZHIIBQFpBmNhbGxlcgQCdG8JAKUIAQUFdG9BZHIEAWEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQEVd2F2ZWxldHNQZXJCbG9ja1N0b3JlAQUCdG8CEWFkZHJlc3Mgbm90IGZvdW5kAwkAAAIFAWEFAWEEBmFtb3VudAkBDGF2YWlsYWJsZU5vdwEFAnRvBAdwYXltZW50CQCXAwEJAMwIAggJAO8HAQUEdGhpcwlhdmFpbGFibGUJAMwIAgUGYW1vdW50BQNuaWwDCQBnAgAABQdwYXltZW50CQACAQIQbm90aGluZyB0byBjbGFpbQQNY2xhaW1lZFN0b3JlMQkBDGNsYWltZWRTdG9yZQEFAnRvBAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEFDWNsYWltZWRTdG9yZTEAAAQQY2xhaW1lZFVTRFN0b3JlMQkBD2NsYWltZWRVU0RTdG9yZQEFAnRvBApjbGFpbWVkVVNECQELdmFsdWVPckVsc2UCCQCfCAEFEGNsYWltZWRVU0RTdG9yZTEJAQp3YXZlc1RvVVNEAQUHY2xhaW1lZAQKcGF5bWVudFVTRAkBCndhdmVzVG9VU0QBBQdwYXltZW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBXRvQWRyBQdwYXltZW50BQR1bml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1jbGFpbWVkU3RvcmUxCQBkAgUHY2xhaW1lZAUHcGF5bWVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQY2xhaW1lZFVTRFN0b3JlMQkAZAIFCmNsYWltZWRVU0QFCnBheW1lbnRVU0QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgDxgs9u", "chainId": 87, "height": 3827896, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HsiWcTrammu6zv4bhqWu93fUje9qsiveb3jULbsBZUpE Next: DA3zoP5BzG6UaxYYQtqWdLZaQfRpDFJD9x3ocCjhRrvG Diff:
OldNewDifferences
2727 func maxClaimableStore (address) = (address + "_wavelets_max_claimable")
2828
2929
30+func maxClaimableIsUSDStore (address) = (address + "_wavelets_max_claimable_is_usd")
31+
32+
3033 let sumStore = "wavelets_per_block_sum"
3134
3235 let maxStore = "wavelets_per_block_max"
3942
4043 let wavePrice = valueOrErrorMessage(getInteger(oracle, wavePriceStore), "WAVES price is not in the Oracle")
4144
45+func wavesToUSD (waves) = fraction(waves, wavePrice, 1000000)
46+
47+
48+func usdToWaves (waves) = fraction(waves, 100000000, wavePrice)
49+
50+
4251 let oldSum = valueOrElse(getInteger(sumStore), 0)
4352
44-func writeInt (key,value) = if ((0 > value))
45- then throw(((("writing negative value " + toString(value)) + " for key ") + key))
46- else IntegerEntry(key, value)
47-
48-
49-func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
50-
51-
5253 func availableNow (to) = {
53- let perBlockStore = waveletsPerBlockStore(to)
54- let perBlock = getInteger(perBlockStore)
54+ let perBlock = getInteger(waveletsPerBlockStore(to))
5555 let total = if (!(isDefined(perBlock)))
5656 then 0
5757 else {
5959 let blocks = (height - firstBlock)
6060 (value(perBlock) * blocks)
6161 }
62- let grant = min([total, valueOrElse(getInteger(maxClaimableStore(to)), total)])
63- let claimed = valueOrElse(getInteger(claimedStore(to)), 0)
64- let result = (grant - claimed)
65- if ((0 > result))
66- then throw("negative availableNow")
67- else result
62+ let claimedWAVES = valueOrElse(getInteger(claimedStore(to)), 0)
63+ let restWaves = (total - claimedWAVES)
64+ let maxClaimable = getInteger(maxClaimableStore(to))
65+ if (isDefined(maxClaimable))
66+ then if (valueOrElse(getBoolean(maxClaimableIsUSDStore(to)), false))
67+ then {
68+ let claimedUSD = valueOrElse(getInteger(claimedUSDStore(to)), wavesToUSD(claimedWAVES))
69+ let restUSD = (value(maxClaimable) - claimedUSD)
70+ let restUsdInWaves = usdToWaves(restUSD)
71+ min([restUsdInWaves, restWaves])
72+ }
73+ else {
74+ let grant = min([total, value(maxClaimable)])
75+ (grant - claimedWAVES)
76+ }
77+ else restWaves
6878 }
6979
7080
71-func setScheduleInternal (to,waveletsPerBlock,maxClaimable,sum) = if ((0 > waveletsPerBlock))
81+func setScheduleInternal (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD,sum) = if ((0 > waveletsPerBlock))
7282 then throw("waveletsPerBlock should be >= 0")
7383 else {
7484 let perBlockStore = waveletsPerBlockStore(to)
8090 then throw("maximum exceeded")
8191 else {
8292 let maxClaimableStore1 = maxClaimableStore(to)
93+ let maxClaimableIsUSDStore1 = maxClaimableIsUSDStore(to)
8394 let maxClaimableEntry = if ((maxClaimable == 0))
8495 then nil
85- else if ((maxClaimable == -1))
86- then [DeleteEntry(maxClaimableStore1)]
87- else [IntegerEntry(maxClaimableStore1, maxClaimable)]
96+ else if ((0 > maxClaimable))
97+ then [DeleteEntry(maxClaimableStore1), DeleteEntry(maxClaimableIsUSDStore1)]
98+ else [IntegerEntry(maxClaimableStore1, maxClaimable), BooleanEntry(maxClaimableIsUSDStore1, isMaxClaimableUSD)]
8899 $Tuple2(([IntegerEntry(perBlockStore, waveletsPerBlock), IntegerEntry(heightStore1, height), IntegerEntry(claimed, -(availableNow(to))), IntegerEntry(sumStore, newSum)] ++ maxClaimableEntry), newSum)
89100 }
90101 }
93104 @Callable(i)
94105 func setScedule (to,waveletsPerBlock) = if ((i.caller != this))
95106 then throw("denied")
96- else setScheduleInternal(to, waveletsPerBlock, 0, oldSum)
107+ else setScheduleInternal(to, waveletsPerBlock, 0, false, oldSum)
97108
98109
99110
100111 @Callable(i)
101-func setSchedule (to,waveletsPerBlock,maxClaimable) = if ((i.caller != this))
112+func setSchedule (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD) = if ((i.caller != this))
102113 then throw("denied")
103- else setScheduleInternal(to, waveletsPerBlock, maxClaimable, oldSum)
114+ else setScheduleInternal(to, waveletsPerBlock, maxClaimable, isMaxClaimableUSD, oldSum)
104115
105116
106117
118129 let to = valueOrErrorMessage(addressFromString(parts[0]), ("invalid address: " + parts[0]))
119130 let blockMaxParts = split(parts[1], ",")
120131 let wavelets = valueOrErrorMessage(parseInt(blockMaxParts[0]), ("invalid wavetets number: " + blockMaxParts[0]))
121- let maxClaimable = if ((size(blockMaxParts) == 2))
122- then valueOrErrorMessage(parseInt(blockMaxParts[1]), ("invalid max number: " + blockMaxParts[1]))
123- else 0
124- let $t047304762 = acc
125- let cmds = $t047304762._1
126- let sum = $t047304762._2
127- let addresses = $t047304762._3
132+ let $t051685534 = if ((size(blockMaxParts) == 2))
133+ then {
134+ let maxAndUsdPart = split(blockMaxParts[1], "$")
135+ $Tuple2(valueOrErrorMessage(parseInt(maxAndUsdPart[0]), ("invalid max number: " + maxAndUsdPart[0])), (size(maxAndUsdPart) == 2))
136+ }
137+ else $Tuple2(0, false)
138+ let maxClaimable = $t051685534._1
139+ let isMaxClaimableUSD = $t051685534._2
140+ let $t055525584 = acc
141+ let cmds = $t055525584._1
142+ let sum = $t055525584._2
143+ let addresses = $t055525584._3
128144 let toStr = toString(to)
129145 if (isDefined(indexOf(addresses, toStr)))
130146 then throw(("dublicate: " + toStr))
131147 else {
132- let $t048934972 = setScheduleInternal(toStr, wavelets, maxClaimable, sum)
133- let newCmds = $t048934972._1
134- let newSum = $t048934972._2
148+ let $t057155813 = setScheduleInternal(toStr, wavelets, maxClaimable, isMaxClaimableUSD, sum)
149+ let newCmds = $t057155813._1
150+ let newSum = $t057155813._2
135151 $Tuple3((cmds ++ newCmds), newSum, (addresses ++ [toStr]))
136152 }
137153 }
138154 }
139155
140- let $t050405116 = {
156+ let $t058815957 = {
141157 let $l = split(schedules, "|")
142158 let $s = size($l)
143159 let $acc0 = $Tuple3(nil, oldSum, nil)
151167
152168 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
153169 }
154- let cmds = $t050405116._1
155- let sum = $t050405116._2
156- let x_ = $t050405116._3
170+ let cmds = $t058815957._1
171+ let sum = $t058815957._2
172+ let x_ = $t058815957._3
157173 $Tuple2(cmds, sum)
158174 }
159175
168184 then {
169185 let amount = availableNow(to)
170186 let payment = min([wavesBalance(this).available, amount])
171- if ((payment == 0))
187+ if ((0 >= payment))
172188 then throw("nothing to claim")
173189 else {
174- let paymentUSD = fraction(payment, wavePrice, 1000000)
175-[ScriptTransfer(toAdr, payment, unit), changeBy(claimedStore(to), payment), changeBy(claimedUSDStore(to), paymentUSD)]
190+ let claimedStore1 = claimedStore(to)
191+ let claimed = valueOrElse(getInteger(claimedStore1), 0)
192+ let claimedUSDStore1 = claimedUSDStore(to)
193+ let claimedUSD = valueOrElse(getInteger(claimedUSDStore1), wavesToUSD(claimed))
194+ let paymentUSD = wavesToUSD(payment)
195+[ScriptTransfer(toAdr, payment, unit), IntegerEntry(claimedStore1, (claimed + payment)), IntegerEntry(claimedUSDStore1, (claimedUSD + paymentUSD))]
176196 }
177197 }
178198 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let configAddressStore = "config"
55
66 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "child: config address not found")), "invalid config address")
77
88 let HEIGHT = height
99
1010 func opAllowedStore (op) = (("op_" + op) + "_allowed")
1111
1212
1313 let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result")
1414
1515 func waveletsPerBlockStore (address) = (address + "_wavelets_per_block")
1616
1717
1818 func startHeightStore (address) = (address + "_start_height")
1919
2020
2121 func claimedStore (address) = (address + "wavelets_claimed")
2222
2323
2424 func claimedUSDStore (address) = (address + "_wavelets_claimed_usd")
2525
2626
2727 func maxClaimableStore (address) = (address + "_wavelets_max_claimable")
2828
2929
30+func maxClaimableIsUSDStore (address) = (address + "_wavelets_max_claimable_is_usd")
31+
32+
3033 let sumStore = "wavelets_per_block_sum"
3134
3235 let maxStore = "wavelets_per_block_max"
3336
3437 let maximum = valueOrElse(getInteger(this, "wavelets_per_block_max"), 189950000)
3538
3639 let oracle = valueOrErrorMessage(addressFromString(valueOrElse(getString("oracle"), "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF")), "invalid oracle address")
3740
3841 let wavePriceStore = valueOrElse(getString("wave-price-key"), "%s%s__price__WAVES-USDT")
3942
4043 let wavePrice = valueOrErrorMessage(getInteger(oracle, wavePriceStore), "WAVES price is not in the Oracle")
4144
45+func wavesToUSD (waves) = fraction(waves, wavePrice, 1000000)
46+
47+
48+func usdToWaves (waves) = fraction(waves, 100000000, wavePrice)
49+
50+
4251 let oldSum = valueOrElse(getInteger(sumStore), 0)
4352
44-func writeInt (key,value) = if ((0 > value))
45- then throw(((("writing negative value " + toString(value)) + " for key ") + key))
46- else IntegerEntry(key, value)
47-
48-
49-func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
50-
51-
5253 func availableNow (to) = {
53- let perBlockStore = waveletsPerBlockStore(to)
54- let perBlock = getInteger(perBlockStore)
54+ let perBlock = getInteger(waveletsPerBlockStore(to))
5555 let total = if (!(isDefined(perBlock)))
5656 then 0
5757 else {
5858 let firstBlock = value(getInteger(startHeightStore(to)))
5959 let blocks = (height - firstBlock)
6060 (value(perBlock) * blocks)
6161 }
62- let grant = min([total, valueOrElse(getInteger(maxClaimableStore(to)), total)])
63- let claimed = valueOrElse(getInteger(claimedStore(to)), 0)
64- let result = (grant - claimed)
65- if ((0 > result))
66- then throw("negative availableNow")
67- else result
62+ let claimedWAVES = valueOrElse(getInteger(claimedStore(to)), 0)
63+ let restWaves = (total - claimedWAVES)
64+ let maxClaimable = getInteger(maxClaimableStore(to))
65+ if (isDefined(maxClaimable))
66+ then if (valueOrElse(getBoolean(maxClaimableIsUSDStore(to)), false))
67+ then {
68+ let claimedUSD = valueOrElse(getInteger(claimedUSDStore(to)), wavesToUSD(claimedWAVES))
69+ let restUSD = (value(maxClaimable) - claimedUSD)
70+ let restUsdInWaves = usdToWaves(restUSD)
71+ min([restUsdInWaves, restWaves])
72+ }
73+ else {
74+ let grant = min([total, value(maxClaimable)])
75+ (grant - claimedWAVES)
76+ }
77+ else restWaves
6878 }
6979
7080
71-func setScheduleInternal (to,waveletsPerBlock,maxClaimable,sum) = if ((0 > waveletsPerBlock))
81+func setScheduleInternal (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD,sum) = if ((0 > waveletsPerBlock))
7282 then throw("waveletsPerBlock should be >= 0")
7383 else {
7484 let perBlockStore = waveletsPerBlockStore(to)
7585 let oldPerBlock = valueOrElse(getInteger(perBlockStore), 0)
7686 let newSum = ((sum - oldPerBlock) + waveletsPerBlock)
7787 let heightStore1 = startHeightStore(to)
7888 let claimed = claimedStore(to)
7989 if ((newSum > maximum))
8090 then throw("maximum exceeded")
8191 else {
8292 let maxClaimableStore1 = maxClaimableStore(to)
93+ let maxClaimableIsUSDStore1 = maxClaimableIsUSDStore(to)
8394 let maxClaimableEntry = if ((maxClaimable == 0))
8495 then nil
85- else if ((maxClaimable == -1))
86- then [DeleteEntry(maxClaimableStore1)]
87- else [IntegerEntry(maxClaimableStore1, maxClaimable)]
96+ else if ((0 > maxClaimable))
97+ then [DeleteEntry(maxClaimableStore1), DeleteEntry(maxClaimableIsUSDStore1)]
98+ else [IntegerEntry(maxClaimableStore1, maxClaimable), BooleanEntry(maxClaimableIsUSDStore1, isMaxClaimableUSD)]
8899 $Tuple2(([IntegerEntry(perBlockStore, waveletsPerBlock), IntegerEntry(heightStore1, height), IntegerEntry(claimed, -(availableNow(to))), IntegerEntry(sumStore, newSum)] ++ maxClaimableEntry), newSum)
89100 }
90101 }
91102
92103
93104 @Callable(i)
94105 func setScedule (to,waveletsPerBlock) = if ((i.caller != this))
95106 then throw("denied")
96- else setScheduleInternal(to, waveletsPerBlock, 0, oldSum)
107+ else setScheduleInternal(to, waveletsPerBlock, 0, false, oldSum)
97108
98109
99110
100111 @Callable(i)
101-func setSchedule (to,waveletsPerBlock,maxClaimable) = if ((i.caller != this))
112+func setSchedule (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD) = if ((i.caller != this))
102113 then throw("denied")
103- else setScheduleInternal(to, waveletsPerBlock, maxClaimable, oldSum)
114+ else setScheduleInternal(to, waveletsPerBlock, maxClaimable, isMaxClaimableUSD, oldSum)
104115
105116
106117
107118 @Callable(i)
108119 func setMultiSchedule (schedules) = if ((i.caller != this))
109120 then throw("denied")
110121 else {
111122 func fold (acc,schedule) = if ((schedule == ""))
112123 then throw("invalid schedules")
113124 else {
114125 let parts = split(schedule, "=")
115126 if ((size(parts) != 2))
116127 then throw("invalid format: adr=waveletsPerBlock[,max]")
117128 else {
118129 let to = valueOrErrorMessage(addressFromString(parts[0]), ("invalid address: " + parts[0]))
119130 let blockMaxParts = split(parts[1], ",")
120131 let wavelets = valueOrErrorMessage(parseInt(blockMaxParts[0]), ("invalid wavetets number: " + blockMaxParts[0]))
121- let maxClaimable = if ((size(blockMaxParts) == 2))
122- then valueOrErrorMessage(parseInt(blockMaxParts[1]), ("invalid max number: " + blockMaxParts[1]))
123- else 0
124- let $t047304762 = acc
125- let cmds = $t047304762._1
126- let sum = $t047304762._2
127- let addresses = $t047304762._3
132+ let $t051685534 = if ((size(blockMaxParts) == 2))
133+ then {
134+ let maxAndUsdPart = split(blockMaxParts[1], "$")
135+ $Tuple2(valueOrErrorMessage(parseInt(maxAndUsdPart[0]), ("invalid max number: " + maxAndUsdPart[0])), (size(maxAndUsdPart) == 2))
136+ }
137+ else $Tuple2(0, false)
138+ let maxClaimable = $t051685534._1
139+ let isMaxClaimableUSD = $t051685534._2
140+ let $t055525584 = acc
141+ let cmds = $t055525584._1
142+ let sum = $t055525584._2
143+ let addresses = $t055525584._3
128144 let toStr = toString(to)
129145 if (isDefined(indexOf(addresses, toStr)))
130146 then throw(("dublicate: " + toStr))
131147 else {
132- let $t048934972 = setScheduleInternal(toStr, wavelets, maxClaimable, sum)
133- let newCmds = $t048934972._1
134- let newSum = $t048934972._2
148+ let $t057155813 = setScheduleInternal(toStr, wavelets, maxClaimable, isMaxClaimableUSD, sum)
149+ let newCmds = $t057155813._1
150+ let newSum = $t057155813._2
135151 $Tuple3((cmds ++ newCmds), newSum, (addresses ++ [toStr]))
136152 }
137153 }
138154 }
139155
140- let $t050405116 = {
156+ let $t058815957 = {
141157 let $l = split(schedules, "|")
142158 let $s = size($l)
143159 let $acc0 = $Tuple3(nil, oldSum, nil)
144160 func $f0_1 ($a,$i) = if (($i >= $s))
145161 then $a
146162 else fold($a, $l[$i])
147163
148164 func $f0_2 ($a,$i) = if (($i >= $s))
149165 then $a
150166 else throw("List size exceeds 20")
151167
152168 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
153169 }
154- let cmds = $t050405116._1
155- let sum = $t050405116._2
156- let x_ = $t050405116._3
170+ let cmds = $t058815957._1
171+ let sum = $t058815957._2
172+ let x_ = $t058815957._3
157173 $Tuple2(cmds, sum)
158174 }
159175
160176
161177
162178 @Callable(i)
163179 func Claim () = {
164180 let toAdr = i.caller
165181 let to = toString(toAdr)
166182 let a = valueOrErrorMessage(getInteger(waveletsPerBlockStore(to)), "address not found")
167183 if ((a == a))
168184 then {
169185 let amount = availableNow(to)
170186 let payment = min([wavesBalance(this).available, amount])
171- if ((payment == 0))
187+ if ((0 >= payment))
172188 then throw("nothing to claim")
173189 else {
174- let paymentUSD = fraction(payment, wavePrice, 1000000)
175-[ScriptTransfer(toAdr, payment, unit), changeBy(claimedStore(to), payment), changeBy(claimedUSDStore(to), paymentUSD)]
190+ let claimedStore1 = claimedStore(to)
191+ let claimed = valueOrElse(getInteger(claimedStore1), 0)
192+ let claimedUSDStore1 = claimedUSDStore(to)
193+ let claimedUSD = valueOrElse(getInteger(claimedUSDStore1), wavesToUSD(claimed))
194+ let paymentUSD = wavesToUSD(payment)
195+[ScriptTransfer(toAdr, payment, unit), IntegerEntry(claimedStore1, (claimed + payment)), IntegerEntry(claimedUSDStore1, (claimedUSD + paymentUSD))]
176196 }
177197 }
178198 else throw("Strict value is not equal to itself.")
179199 }
180200
181201

github/deemru/w8io/6500d08 
42.49 ms