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:
Old | New | Differences | |
---|---|---|---|
27 | 27 | func maxClaimableStore (address) = (address + "_wavelets_max_claimable") | |
28 | 28 | ||
29 | 29 | ||
30 | + | func maxClaimableIsUSDStore (address) = (address + "_wavelets_max_claimable_is_usd") | |
31 | + | ||
32 | + | ||
30 | 33 | let sumStore = "wavelets_per_block_sum" | |
31 | 34 | ||
32 | 35 | let maxStore = "wavelets_per_block_max" | |
39 | 42 | ||
40 | 43 | let wavePrice = valueOrErrorMessage(getInteger(oracle, wavePriceStore), "WAVES price is not in the Oracle") | |
41 | 44 | ||
45 | + | func wavesToUSD (waves) = fraction(waves, wavePrice, 1000000) | |
46 | + | ||
47 | + | ||
48 | + | func usdToWaves (waves) = fraction(waves, 100000000, wavePrice) | |
49 | + | ||
50 | + | ||
42 | 51 | let oldSum = valueOrElse(getInteger(sumStore), 0) | |
43 | 52 | ||
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 | - | ||
52 | 53 | func availableNow (to) = { | |
53 | - | let perBlockStore = waveletsPerBlockStore(to) | |
54 | - | let perBlock = getInteger(perBlockStore) | |
54 | + | let perBlock = getInteger(waveletsPerBlockStore(to)) | |
55 | 55 | let total = if (!(isDefined(perBlock))) | |
56 | 56 | then 0 | |
57 | 57 | else { | |
59 | 59 | let blocks = (height - firstBlock) | |
60 | 60 | (value(perBlock) * blocks) | |
61 | 61 | } | |
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 | |
68 | 78 | } | |
69 | 79 | ||
70 | 80 | ||
71 | - | func setScheduleInternal (to,waveletsPerBlock,maxClaimable,sum) = if ((0 > waveletsPerBlock)) | |
81 | + | func setScheduleInternal (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD,sum) = if ((0 > waveletsPerBlock)) | |
72 | 82 | then throw("waveletsPerBlock should be >= 0") | |
73 | 83 | else { | |
74 | 84 | let perBlockStore = waveletsPerBlockStore(to) | |
80 | 90 | then throw("maximum exceeded") | |
81 | 91 | else { | |
82 | 92 | let maxClaimableStore1 = maxClaimableStore(to) | |
93 | + | let maxClaimableIsUSDStore1 = maxClaimableIsUSDStore(to) | |
83 | 94 | let maxClaimableEntry = if ((maxClaimable == 0)) | |
84 | 95 | then nil | |
85 | - | else if ((maxClaimable | |
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)] | |
88 | 99 | $Tuple2(([IntegerEntry(perBlockStore, waveletsPerBlock), IntegerEntry(heightStore1, height), IntegerEntry(claimed, -(availableNow(to))), IntegerEntry(sumStore, newSum)] ++ maxClaimableEntry), newSum) | |
89 | 100 | } | |
90 | 101 | } | |
93 | 104 | @Callable(i) | |
94 | 105 | func setScedule (to,waveletsPerBlock) = if ((i.caller != this)) | |
95 | 106 | then throw("denied") | |
96 | - | else setScheduleInternal(to, waveletsPerBlock, 0, oldSum) | |
107 | + | else setScheduleInternal(to, waveletsPerBlock, 0, false, oldSum) | |
97 | 108 | ||
98 | 109 | ||
99 | 110 | ||
100 | 111 | @Callable(i) | |
101 | - | func setSchedule (to,waveletsPerBlock,maxClaimable) = if ((i.caller != this)) | |
112 | + | func setSchedule (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD) = if ((i.caller != this)) | |
102 | 113 | then throw("denied") | |
103 | - | else setScheduleInternal(to, waveletsPerBlock, maxClaimable, oldSum) | |
114 | + | else setScheduleInternal(to, waveletsPerBlock, maxClaimable, isMaxClaimableUSD, oldSum) | |
104 | 115 | ||
105 | 116 | ||
106 | 117 | ||
118 | 129 | let to = valueOrErrorMessage(addressFromString(parts[0]), ("invalid address: " + parts[0])) | |
119 | 130 | let blockMaxParts = split(parts[1], ",") | |
120 | 131 | 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 | |
128 | 144 | let toStr = toString(to) | |
129 | 145 | if (isDefined(indexOf(addresses, toStr))) | |
130 | 146 | then throw(("dublicate: " + toStr)) | |
131 | 147 | else { | |
132 | - | let $ | |
133 | - | let newCmds = $ | |
134 | - | let newSum = $ | |
148 | + | let $t057155813 = setScheduleInternal(toStr, wavelets, maxClaimable, isMaxClaimableUSD, sum) | |
149 | + | let newCmds = $t057155813._1 | |
150 | + | let newSum = $t057155813._2 | |
135 | 151 | $Tuple3((cmds ++ newCmds), newSum, (addresses ++ [toStr])) | |
136 | 152 | } | |
137 | 153 | } | |
138 | 154 | } | |
139 | 155 | ||
140 | - | let $ | |
156 | + | let $t058815957 = { | |
141 | 157 | let $l = split(schedules, "|") | |
142 | 158 | let $s = size($l) | |
143 | 159 | let $acc0 = $Tuple3(nil, oldSum, nil) | |
151 | 167 | ||
152 | 168 | $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) | |
153 | 169 | } | |
154 | - | let cmds = $ | |
155 | - | let sum = $ | |
156 | - | let x_ = $ | |
170 | + | let cmds = $t058815957._1 | |
171 | + | let sum = $t058815957._2 | |
172 | + | let x_ = $t058815957._3 | |
157 | 173 | $Tuple2(cmds, sum) | |
158 | 174 | } | |
159 | 175 | ||
168 | 184 | then { | |
169 | 185 | let amount = availableNow(to) | |
170 | 186 | let payment = min([wavesBalance(this).available, amount]) | |
171 | - | if (( | |
187 | + | if ((0 >= payment)) | |
172 | 188 | then throw("nothing to claim") | |
173 | 189 | 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))] | |
176 | 196 | } | |
177 | 197 | } | |
178 | 198 | else throw("Strict value is not equal to itself.") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let configAddressStore = "config" | |
5 | 5 | ||
6 | 6 | let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "child: config address not found")), "invalid config address") | |
7 | 7 | ||
8 | 8 | let HEIGHT = height | |
9 | 9 | ||
10 | 10 | func opAllowedStore (op) = (("op_" + op) + "_allowed") | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | let votingResults = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result") | |
14 | 14 | ||
15 | 15 | func waveletsPerBlockStore (address) = (address + "_wavelets_per_block") | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func startHeightStore (address) = (address + "_start_height") | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func claimedStore (address) = (address + "wavelets_claimed") | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func claimedUSDStore (address) = (address + "_wavelets_claimed_usd") | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func maxClaimableStore (address) = (address + "_wavelets_max_claimable") | |
28 | 28 | ||
29 | 29 | ||
30 | + | func maxClaimableIsUSDStore (address) = (address + "_wavelets_max_claimable_is_usd") | |
31 | + | ||
32 | + | ||
30 | 33 | let sumStore = "wavelets_per_block_sum" | |
31 | 34 | ||
32 | 35 | let maxStore = "wavelets_per_block_max" | |
33 | 36 | ||
34 | 37 | let maximum = valueOrElse(getInteger(this, "wavelets_per_block_max"), 189950000) | |
35 | 38 | ||
36 | 39 | let oracle = valueOrErrorMessage(addressFromString(valueOrElse(getString("oracle"), "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF")), "invalid oracle address") | |
37 | 40 | ||
38 | 41 | let wavePriceStore = valueOrElse(getString("wave-price-key"), "%s%s__price__WAVES-USDT") | |
39 | 42 | ||
40 | 43 | let wavePrice = valueOrErrorMessage(getInteger(oracle, wavePriceStore), "WAVES price is not in the Oracle") | |
41 | 44 | ||
45 | + | func wavesToUSD (waves) = fraction(waves, wavePrice, 1000000) | |
46 | + | ||
47 | + | ||
48 | + | func usdToWaves (waves) = fraction(waves, 100000000, wavePrice) | |
49 | + | ||
50 | + | ||
42 | 51 | let oldSum = valueOrElse(getInteger(sumStore), 0) | |
43 | 52 | ||
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 | - | ||
52 | 53 | func availableNow (to) = { | |
53 | - | let perBlockStore = waveletsPerBlockStore(to) | |
54 | - | let perBlock = getInteger(perBlockStore) | |
54 | + | let perBlock = getInteger(waveletsPerBlockStore(to)) | |
55 | 55 | let total = if (!(isDefined(perBlock))) | |
56 | 56 | then 0 | |
57 | 57 | else { | |
58 | 58 | let firstBlock = value(getInteger(startHeightStore(to))) | |
59 | 59 | let blocks = (height - firstBlock) | |
60 | 60 | (value(perBlock) * blocks) | |
61 | 61 | } | |
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 | |
68 | 78 | } | |
69 | 79 | ||
70 | 80 | ||
71 | - | func setScheduleInternal (to,waveletsPerBlock,maxClaimable,sum) = if ((0 > waveletsPerBlock)) | |
81 | + | func setScheduleInternal (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD,sum) = if ((0 > waveletsPerBlock)) | |
72 | 82 | then throw("waveletsPerBlock should be >= 0") | |
73 | 83 | else { | |
74 | 84 | let perBlockStore = waveletsPerBlockStore(to) | |
75 | 85 | let oldPerBlock = valueOrElse(getInteger(perBlockStore), 0) | |
76 | 86 | let newSum = ((sum - oldPerBlock) + waveletsPerBlock) | |
77 | 87 | let heightStore1 = startHeightStore(to) | |
78 | 88 | let claimed = claimedStore(to) | |
79 | 89 | if ((newSum > maximum)) | |
80 | 90 | then throw("maximum exceeded") | |
81 | 91 | else { | |
82 | 92 | let maxClaimableStore1 = maxClaimableStore(to) | |
93 | + | let maxClaimableIsUSDStore1 = maxClaimableIsUSDStore(to) | |
83 | 94 | let maxClaimableEntry = if ((maxClaimable == 0)) | |
84 | 95 | then nil | |
85 | - | else if ((maxClaimable | |
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)] | |
88 | 99 | $Tuple2(([IntegerEntry(perBlockStore, waveletsPerBlock), IntegerEntry(heightStore1, height), IntegerEntry(claimed, -(availableNow(to))), IntegerEntry(sumStore, newSum)] ++ maxClaimableEntry), newSum) | |
89 | 100 | } | |
90 | 101 | } | |
91 | 102 | ||
92 | 103 | ||
93 | 104 | @Callable(i) | |
94 | 105 | func setScedule (to,waveletsPerBlock) = if ((i.caller != this)) | |
95 | 106 | then throw("denied") | |
96 | - | else setScheduleInternal(to, waveletsPerBlock, 0, oldSum) | |
107 | + | else setScheduleInternal(to, waveletsPerBlock, 0, false, oldSum) | |
97 | 108 | ||
98 | 109 | ||
99 | 110 | ||
100 | 111 | @Callable(i) | |
101 | - | func setSchedule (to,waveletsPerBlock,maxClaimable) = if ((i.caller != this)) | |
112 | + | func setSchedule (to,waveletsPerBlock,maxClaimable,isMaxClaimableUSD) = if ((i.caller != this)) | |
102 | 113 | then throw("denied") | |
103 | - | else setScheduleInternal(to, waveletsPerBlock, maxClaimable, oldSum) | |
114 | + | else setScheduleInternal(to, waveletsPerBlock, maxClaimable, isMaxClaimableUSD, oldSum) | |
104 | 115 | ||
105 | 116 | ||
106 | 117 | ||
107 | 118 | @Callable(i) | |
108 | 119 | func setMultiSchedule (schedules) = if ((i.caller != this)) | |
109 | 120 | then throw("denied") | |
110 | 121 | else { | |
111 | 122 | func fold (acc,schedule) = if ((schedule == "")) | |
112 | 123 | then throw("invalid schedules") | |
113 | 124 | else { | |
114 | 125 | let parts = split(schedule, "=") | |
115 | 126 | if ((size(parts) != 2)) | |
116 | 127 | then throw("invalid format: adr=waveletsPerBlock[,max]") | |
117 | 128 | else { | |
118 | 129 | let to = valueOrErrorMessage(addressFromString(parts[0]), ("invalid address: " + parts[0])) | |
119 | 130 | let blockMaxParts = split(parts[1], ",") | |
120 | 131 | 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 | |
128 | 144 | let toStr = toString(to) | |
129 | 145 | if (isDefined(indexOf(addresses, toStr))) | |
130 | 146 | then throw(("dublicate: " + toStr)) | |
131 | 147 | else { | |
132 | - | let $ | |
133 | - | let newCmds = $ | |
134 | - | let newSum = $ | |
148 | + | let $t057155813 = setScheduleInternal(toStr, wavelets, maxClaimable, isMaxClaimableUSD, sum) | |
149 | + | let newCmds = $t057155813._1 | |
150 | + | let newSum = $t057155813._2 | |
135 | 151 | $Tuple3((cmds ++ newCmds), newSum, (addresses ++ [toStr])) | |
136 | 152 | } | |
137 | 153 | } | |
138 | 154 | } | |
139 | 155 | ||
140 | - | let $ | |
156 | + | let $t058815957 = { | |
141 | 157 | let $l = split(schedules, "|") | |
142 | 158 | let $s = size($l) | |
143 | 159 | let $acc0 = $Tuple3(nil, oldSum, nil) | |
144 | 160 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
145 | 161 | then $a | |
146 | 162 | else fold($a, $l[$i]) | |
147 | 163 | ||
148 | 164 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
149 | 165 | then $a | |
150 | 166 | else throw("List size exceeds 20") | |
151 | 167 | ||
152 | 168 | $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) | |
153 | 169 | } | |
154 | - | let cmds = $ | |
155 | - | let sum = $ | |
156 | - | let x_ = $ | |
170 | + | let cmds = $t058815957._1 | |
171 | + | let sum = $t058815957._2 | |
172 | + | let x_ = $t058815957._3 | |
157 | 173 | $Tuple2(cmds, sum) | |
158 | 174 | } | |
159 | 175 | ||
160 | 176 | ||
161 | 177 | ||
162 | 178 | @Callable(i) | |
163 | 179 | func Claim () = { | |
164 | 180 | let toAdr = i.caller | |
165 | 181 | let to = toString(toAdr) | |
166 | 182 | let a = valueOrErrorMessage(getInteger(waveletsPerBlockStore(to)), "address not found") | |
167 | 183 | if ((a == a)) | |
168 | 184 | then { | |
169 | 185 | let amount = availableNow(to) | |
170 | 186 | let payment = min([wavesBalance(this).available, amount]) | |
171 | - | if (( | |
187 | + | if ((0 >= payment)) | |
172 | 188 | then throw("nothing to claim") | |
173 | 189 | 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))] | |
176 | 196 | } | |
177 | 197 | } | |
178 | 198 | else throw("Strict value is not equal to itself.") | |
179 | 199 | } | |
180 | 200 | ||
181 | 201 |
github/deemru/w8io/6500d08 42.49 ms ◑