tx · 7Yubg4YdJ5yPF8iY3AmVWbuzWhsMMCRyn8MKkDJoKDWW

3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx:  -0.03700000 Waves

2023.06.06 19:34 [3676612] smart account 3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx > SELF 0.00000000 Waves

{ "type": 13, "id": "7Yubg4YdJ5yPF8iY3AmVWbuzWhsMMCRyn8MKkDJoKDWW", "fee": 3700000, "feeAssetId": null, "timestamp": 1686069304282, "version": 2, "chainId": 87, "sender": "3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx", "senderPublicKey": "D1xuuBuw7GwsjUjftZe5rR5fK2XjzTYuNXqBBA9vYKKL", "proofs": [ "dThxP5rzuAgwTsEH371dcpZ6zQWNvxuYZCvp3dvGeuBuv98RspxqyTNMR9VXEPoG9rz1o34HYg4dwqqZwcr7n93" ], "script": "base64:BgIjCAISBAoCCAgSAwoBCBIFCgMIAQESAwoBCBIDCgEIEgMKAQgaAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzABVrX25mdF9tYW5hZ2VyX2FkZHJlc3MCFWtfbmZ0X21hbmFnZXJfYWRkcmVzcwAUa19vcmFjbGVfcHVibGljX2tleXMCFGtfb3JhY2xlX3B1YmxpY19rZXlzAAhrX3N0cmVhbQIIa19zdHJlYW0AE2tfc3RyZWFtX2RhdGFfcHJpY2UCE2tfc3RyZWFtX2RhdGFfcHJpY2UAFGtfc3RyZWFtX2RhdGFfc3ByZWFkAhRrX3N0cmVhbV9kYXRhX3NwcmVhZAAXa19zdHJlYW1fZGF0YV90aW1lc3RhbXACF2tfc3RyZWFtX2RhdGFfdGltZXN0YW1wABNrX3N0cmVhbV9kYXRhX2Jsb2NrAhNrX3N0cmVhbV9kYXRhX2Jsb2NrAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQCG0Nvb3JkaW5hdG9yIGFkZHJlc3MgaW52YWxpZAEMYWRtaW5BZGRyZXNzAAkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBC2Nvb3JkaW5hdG9yAAUPa19hZG1pbl9hZGRyZXNzAhVBZG1pbiBhZGRyZXNzIG5vdCBzZXQBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIACgAKAAoACgAKAAoBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEUZ2V0U3RyZWFtU2V0dGluZ3NLZXkBA19pZAkBDnRvQ29tcG9zaXRlS2V5AgUIa19zdHJlYW0FA19pZAEGdG9MaXN0AgRfc3RyBF9zcHIDCQEJaXNEZWZpbmVkAQkAswkCBQRfc3RyBQRfc3ByCQC1CQIFBF9zdHIFBF9zcHIJAMwIAgUEX3N0cgUDbmlsARZ2ZXJpZnlPcmFjbGVQdWJsaWNLZXlzAQVfa2V5cwQEbGlzdAkBBnRvTGlzdAIFBV9rZXlzAgEsAwkAZgIJAJADAQUEbGlzdAAJCQACAQIQTWF4IDkgc2lnbmF0dXJlcwUFX2tleXMBDWxhc3RUaW1lc3RhbXAACAUJbGFzdEJsb2NrCXRpbWVzdGFtcAESZ2V0T3JhY2xlQWRkcmVzc2VzAAQGb3JhU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX29yYWNsZV9wdWJsaWNfa2V5cwMJAQlpc0RlZmluZWQBCQCzCQIFBm9yYVN0cgIBLAkAtQkCBQZvcmFTdHICASwJAMwIAgUGb3JhU3RyBQNuaWwBEWdldFN0cmVhbVNldHRpbmdzAQNfaWQEBF9rZXkJARRnZXRTdHJlYW1TZXR0aW5nc0tleQEFA19pZAQDc3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUEX2tleQkArAICAhNObyBzdHJlYW0gd2l0aCBpZDogBQNfaWQEBXBhcnRzCQC1CQIFA3N0cgIBLAkAlQoDCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwAACQCsAgICIEludmFsaWQgbWF4RGV2aWF0aW9uIGluIHN0cmVhbTogBQNfaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBXBhcnRzAAEJAKwCAgIiSW52YWxpZCB2YWxpZGl0eVBlcmlvZCBpbiBzdHJlYW06IAUDX2lkCQAAAgkAkQMCBQVwYXJ0cwACAgR0cnVlARFnZXRTdHJlYW1MYXN0RGF0YQEDX2lkBAlkYXRhUG9pbnQJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUTa19zdHJlYW1fZGF0YV9wcmljZQUDX2lkAwkBCWlzRGVmaW5lZAEFCWRhdGFQb2ludAkAlgoECQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRNrX3N0cmVhbV9kYXRhX3ByaWNlBQNfaWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFFGtfc3RyZWFtX2RhdGFfc3ByZWFkBQNfaWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFF2tfc3RyZWFtX2RhdGFfdGltZXN0YW1wBQNfaWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFE2tfc3RyZWFtX2RhdGFfYmxvY2sFA19pZAkAlgoEAAAAAAkBDWxhc3RUaW1lc3RhbXAABQZoZWlnaHQBFHVwZGF0ZVN0cmVhbVNldHRpbmdzBANfaWQNX21heERldmlhdGlvbg9fdmFsaWRpdHlQZXJpb2QIX3N0b3BwZWQECnN0cmVhbURhdGEJALkJAgkAzAgCCQCkAwEFDV9tYXhEZXZpYXRpb24JAMwIAgkApAMBBQ9fdmFsaWRpdHlQZXJpb2QJAMwIAgkApQMBBQhfc3RvcHBlZAUDbmlsAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRnZXRTdHJlYW1TZXR0aW5nc0tleQEFA19pZAUKc3RyZWFtRGF0YQUDbmlsBgFpAQppbml0aWFsaXplAgxfY29vcmRpbmF0b3IRX29yYWNsZVB1YmxpY0tleXMDAwkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFFVuYWJsZSB0byBpbml0aWFsaXplCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzCQClCAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDF9jb29yZGluYXRvcgkAzAgCCQELU3RyaW5nRW50cnkCBRRrX29yYWNsZV9wdWJsaWNfa2V5cwkBFnZlcmlmeU9yYWNsZVB1YmxpY0tleXMBBRFfb3JhY2xlUHVibGljS2V5cwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYFA25pbAFpARNzZXRPcmFjbGVQdWJsaWNLZXlzARFfb3JhY2xlUHVibGljS2V5cwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIiSW52YWxpZCBzZXRPcmFjbGVQdWJsaWNLZXlzIHBhcmFtcwkAzAgCCQELU3RyaW5nRW50cnkCBRRrX29yYWNsZV9wdWJsaWNfa2V5cwkBFnZlcmlmeU9yYWNsZVB1YmxpY0tleXMBBRFfb3JhY2xlUHVibGljS2V5cwUDbmlsAWkBDGNyZWF0ZVN0cmVhbQMDX2lkDV9tYXhEZXZpYXRpb24PX3ZhbGlkaXR5UGVyaW9kAwMDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MABgkAZwIAAAUNX21heERldmlhdGlvbgYJAGcCAAAFD192YWxpZGl0eVBlcmlvZAkAAgECG0ludmFsaWQgY3JlYXRlU3RyZWFtIHBhcmFtcwkBFHVwZGF0ZVN0cmVhbVNldHRpbmdzBAUDX2lkBQ1fbWF4RGV2aWF0aW9uBQ9fdmFsaWRpdHlQZXJpb2QHAWkBBXBhdXNlAQNfaWQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIUSW52YWxpZCBwYXVzZSBwYXJhbXMECyR0MDQ3NDE0ODA5CQERZ2V0U3RyZWFtU2V0dGluZ3MBBQNfaWQEDG1heERldmlhdGlvbggFCyR0MDQ3NDE0ODA5Al8xBA52YWxpZGl0eVBlcmlvZAgFCyR0MDQ3NDE0ODA5Al8yBAdzdG9wcGVkCAULJHQwNDc0MTQ4MDkCXzMJARR1cGRhdGVTdHJlYW1TZXR0aW5ncwQFA19pZAUMbWF4RGV2aWF0aW9uBQ52YWxpZGl0eVBlcmlvZAYBaQEHdW5QYXVzZQEDX2lkAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFkludmFsaWQgdW5QYXVzZSBwYXJhbXMECyR0MDUwOTQ1MTYyCQERZ2V0U3RyZWFtU2V0dGluZ3MBBQNfaWQEDG1heERldmlhdGlvbggFCyR0MDUwOTQ1MTYyAl8xBA52YWxpZGl0eVBlcmlvZAgFCyR0MDUwOTQ1MTYyAl8yBAdzdG9wcGVkCAULJHQwNTA5NDUxNjICXzMJARR1cGRhdGVTdHJlYW1TZXR0aW5ncwQFA19pZAUMbWF4RGV2aWF0aW9uBQ52YWxpZGl0eVBlcmlvZAcBaQEKdXBkYXRlRGF0YQEFX2RhdGEEBnVwZGF0ZQkAvAkCBQVfZGF0YQICX18EAmlkCQCRAwIFBnVwZGF0ZQAABAl0aW1lc3RhbXAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBnVwZGF0ZQABAhdJbnZhbGlkIGRhdGE6IHRpbWVzdGFtcAMJAAACBQl0aW1lc3RhbXAFCXRpbWVzdGFtcAQFcHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBnVwZGF0ZQACAhNJbnZhbGlkIGRhdGE6IHByaWNlAwkAAAIFBXByaWNlBQVwcmljZQQGc3ByZWFkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQZ1cGRhdGUAAwIUSW52YWxpZCBkYXRhOiBzcHJlYWQDCQAAAgUGc3ByZWFkBQZzcHJlYWQECnNpZ25hdHVyZXMDCQEJaXNEZWZpbmVkAQkAswkCCQCRAwIFBnVwZGF0ZQAEAgE6CQC8CQIJAJEDAgUGdXBkYXRlAAQCAToJAMwIAgkAkQMCBQZ1cGRhdGUABAUDbmlsBAdtZXNzYWdlCQCbAwEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFAmlkAgEsCQCkAwEFCXRpbWVzdGFtcAIBLAkApAMBBQVwcmljZQIBLAkApAMBBQZzcHJlYWQEB29yYWNsZXMJARJnZXRPcmFjbGVBZGRyZXNzZXMACgEGaGFuZGxlAgRfYWNjDl9zaWduYXR1cmVEYXRhBAhzaWduZWRCeQkAtQkCBQ5fc2lnbmF0dXJlRGF0YQIBPQQGc2lnbmVyCQCRAwIFCHNpZ25lZEJ5AAAECXNpZ25hdHVyZQkAkQMCBQhzaWduZWRCeQABBA1pc1ZhbGlkU2lnbmVyCQEPY29udGFpbnNFbGVtZW50AgUHb3JhY2xlcwUGc2lnbmVyBBBpc1ZhbGlkU2lnbmF0dXJlCQD0AwMFB21lc3NhZ2UJANkEAQUJc2lnbmF0dXJlCQDZBAEFBnNpZ25lcgQGcmVzdWx0AwMFDWlzVmFsaWRTaWduZXIFEGlzVmFsaWRTaWduYXR1cmUHCQBkAgUEX2FjYwABBQRfYWNjBQZyZXN1bHQED3NpZ25hdHVyZXNDb3VudAoAAiRsBQpzaWduYXR1cmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQZoYW5kbGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBA9pc1F1b3J1bVJlYWNoZWQJAGYCBQ9zaWduYXR1cmVzQ291bnQJAGkCCQCQAwEFB29yYWNsZXMAAgQLJHQwNjUzMjY2MzIJARFnZXRTdHJlYW1TZXR0aW5ncwEFAmlkAwkAAAIFCyR0MDY1MzI2NjMyBQskdDA2NTMyNjYzMgQHc3RvcHBlZAgFCyR0MDY1MzI2NjMyAl8zBA52YWxpZGl0eVBlcmlvZAgFCyR0MDY1MzI2NjMyAl8yBAxtYXhEZXZpYXRpb24IBQskdDA2NTMyNjYzMgJfMQQDbm93CQENbGFzdFRpbWVzdGFtcAAEEGlzVmFsaWRUaW1lc3RhbXADCQBmAgUJdGltZXN0YW1wBQNub3cGCQBmAgUOdmFsaWRpdHlQZXJpb2QJAGUCBQNub3cFCXRpbWVzdGFtcAQLaU5vdFN0b3BwZWQJAQEhAQUHc3RvcHBlZAQLJHQwNjc4NDY5MTIJARFnZXRTdHJlYW1MYXN0RGF0YQEFAmlkBAlsYXN0UHJpY2UIBQskdDA2Nzg0NjkxMgJfMQQKbGFzdFNwcmVhZAgFCyR0MDY3ODQ2OTEyAl8yBBNzdHJlYW1MYXN0VGltZXN0YW1wCAULJHQwNjc4NDY5MTICXzMECmxhc3RIZWlnaHQIBQskdDA2Nzg0NjkxMgJfNAQEZGlmZgMJAAACBQlsYXN0UHJpY2UAAAAACQEDYWJzAQkBBGRpdmQCCQBlAgUFcHJpY2UFCWxhc3RQcmljZQUJbGFzdFByaWNlBAtpc1ZhbGlkRGlmZgkAZgIFDG1heERldmlhdGlvbgUEZGlmZgMDAwMFD2lzUXVvcnVtUmVhY2hlZAUQaXNWYWxpZFRpbWVzdGFtcAcFC2lOb3RTdG9wcGVkBwULaXNWYWxpZERpZmYHAwkAZgIFE3N0cmVhbUxhc3RUaW1lc3RhbXAFCXRpbWVzdGFtcAkAlAoCBQNuaWwJAJUKAwUJbGFzdFByaWNlBQpsYXN0U3ByZWFkBRNzdHJlYW1MYXN0VGltZXN0YW1wAwMDAwkBAiE9AgUFcHJpY2UFCWxhc3RQcmljZQYJAQIhPQIFBnNwcmVhZAUKbGFzdFNwcmVhZAYJAQIhPQIFCXRpbWVzdGFtcAUTc3RyZWFtTGFzdFRpbWVzdGFtcAYJAQIhPQIFCmxhc3RIZWlnaHQFBmhlaWdodAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRNrX3N0cmVhbV9kYXRhX3ByaWNlBQJpZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFFGtfc3RyZWFtX2RhdGFfc3ByZWFkBQJpZAUGc3ByZWFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRdrX3N0cmVhbV9kYXRhX3RpbWVzdGFtcAUCaWQFCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa19zdHJlYW1fZGF0YV9ibG9jawUCaWQFBmhlaWdodAUDbmlsCQCVCgMFBXByaWNlBQZzcHJlYWQFCXRpbWVzdGFtcAkAlAoCBQNuaWwJAJUKAwUFcHJpY2UFBnNwcmVhZAUJdGltZXN0YW1wBAdyZWFzb25zCQDMCAIDCQEBIQEFEGlzVmFsaWRUaW1lc3RhbXACEWludmFsaWQgdGltZXN0YW1wAgAJAMwIAgMJAQEhAQULaU5vdFN0b3BwZWQCB3N0b3BwZWQCAAkAzAgCAwkBASEBBQtpc1ZhbGlkRGlmZgIYaW52YWxpZCBkaWZmICh0b28gbGFyZ2UpAgAJAMwIAgMJAQEhAQUPaXNRdW9ydW1SZWFjaGVkAhJxdW9ydW0gbm90IHJlYWNoZWQCAAUDbmlsBAZyZWFzb24JALkJAgUHcmVhc29ucwICLCAJAAIBCQCsAgICG0ludmFsaWQgdXBkYXRlRGF0ZSBwYXJhbXM6IAUGcmVhc29uCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQOY29vcmRpbmF0b3JTdHIJAJ0IAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MDCQEJaXNEZWZpbmVkAQUOY29vcmRpbmF0b3JTdHIEBWFkbWluCQCdCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEFDmNvb3JkaW5hdG9yU3RyBQ9rX2FkbWluX2FkZHJlc3MDCQEJaXNEZWZpbmVkAQUFYWRtaW4JAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUFYWRtaW4JAKwCAgkArAICCQCsAgICB3N0YXR1c18JAKUIAQUEdGhpcwIBXwkA2AQBCAUCdHgCaWQHCQACAQIudW5hYmxlIHRvIHZlcmlmeTogYWRtaW4gbm90IHNldCBpbiBjb29yZGluYXRvcgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleXfnTU4=", "height": 3676612, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HExUqr6N44G6WuEZCJSiyiFC39vWpjjMk2ibY9KYAARK Next: G95TS5L39EsUZyr82v9Eq65bgujSY4EdMQgexTTUUGnu Diff:
OldNewDifferences
8484 func getStreamLastData (_id) = {
8585 let dataPoint = getInteger(this, toCompositeKey(k_stream_data_price, _id))
8686 if (isDefined(dataPoint))
87- then $Tuple3(getIntegerValue(this, toCompositeKey(k_stream_data_price, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_spread, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_timestamp, _id)))
88- else $Tuple3(0, 0, lastTimestamp())
87+ then $Tuple4(getIntegerValue(this, toCompositeKey(k_stream_data_price, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_spread, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_timestamp, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_block, _id)))
88+ else $Tuple4(0, 0, lastTimestamp(), height)
8989 }
9090
9191
128128 func pause (_id) = if ((i.caller != adminAddress()))
129129 then throw("Invalid pause params")
130130 else {
131- let $t046624730 = getStreamSettings(_id)
132- let maxDeviation = $t046624730._1
133- let validityPeriod = $t046624730._2
134- let stopped = $t046624730._3
131+ let $t047414809 = getStreamSettings(_id)
132+ let maxDeviation = $t047414809._1
133+ let validityPeriod = $t047414809._2
134+ let stopped = $t047414809._3
135135 updateStreamSettings(_id, maxDeviation, validityPeriod, true)
136136 }
137137
141141 func unPause (_id) = if ((i.caller != adminAddress()))
142142 then throw("Invalid unPause params")
143143 else {
144- let $t050155083 = getStreamSettings(_id)
145- let maxDeviation = $t050155083._1
146- let validityPeriod = $t050155083._2
147- let stopped = $t050155083._3
144+ let $t050945162 = getStreamSettings(_id)
145+ let maxDeviation = $t050945162._1
146+ let validityPeriod = $t050945162._2
147+ let stopped = $t050945162._3
148148 updateStreamSettings(_id, maxDeviation, validityPeriod, false)
149149 }
150150
197197 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
198198 }
199199 let isQuorumReached = (signaturesCount > (size(oracles) / 2))
200- let $t064536553 = getStreamSettings(id)
201- if (($t064536553 == $t064536553))
200+ let $t065326632 = getStreamSettings(id)
201+ if (($t065326632 == $t065326632))
202202 then {
203- let stopped = $t064536553._3
204- let validityPeriod = $t064536553._2
205- let maxDeviation = $t064536553._1
203+ let stopped = $t065326632._3
204+ let validityPeriod = $t065326632._2
205+ let maxDeviation = $t065326632._1
206206 let now = lastTimestamp()
207207 let isValidTimestamp = if ((timestamp > now))
208208 then true
209209 else (validityPeriod > (now - timestamp))
210210 let iNotStopped = !(stopped)
211- let $t067056821 = getStreamLastData(id)
212- let lastPrice = $t067056821._1
213- let lastSpread = $t067056821._2
214- let streamLastTimestamp = $t067056821._3
211+ let $t067846912 = getStreamLastData(id)
212+ let lastPrice = $t067846912._1
213+ let lastSpread = $t067846912._2
214+ let streamLastTimestamp = $t067846912._3
215+ let lastHeight = $t067846912._4
215216 let diff = if ((lastPrice == 0))
216217 then 0
217218 else abs(divd((price - lastPrice), lastPrice))
225226 else false)
226227 then if ((streamLastTimestamp > timestamp))
227228 then $Tuple2(nil, $Tuple3(lastPrice, lastSpread, streamLastTimestamp))
228- else $Tuple2([IntegerEntry(toCompositeKey(k_stream_data_price, id), price), IntegerEntry(toCompositeKey(k_stream_data_spread, id), spread), IntegerEntry(toCompositeKey(k_stream_data_timestamp, id), timestamp), IntegerEntry(toCompositeKey(k_stream_data_block, id), height)], $Tuple3(price, spread, timestamp))
229+ else if (if (if (if ((price != lastPrice))
230+ then true
231+ else (spread != lastSpread))
232+ then true
233+ else (timestamp != streamLastTimestamp))
234+ then true
235+ else (lastHeight != height))
236+ then $Tuple2([IntegerEntry(toCompositeKey(k_stream_data_price, id), price), IntegerEntry(toCompositeKey(k_stream_data_spread, id), spread), IntegerEntry(toCompositeKey(k_stream_data_timestamp, id), timestamp), IntegerEntry(toCompositeKey(k_stream_data_block, id), height)], $Tuple3(price, spread, timestamp))
237+ else $Tuple2(nil, $Tuple3(price, spread, timestamp))
229238 else {
230239 let reasons = [if (!(isValidTimestamp))
231240 then "invalid timestamp"
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_initialized = "k_initialized"
55
66 let k_coordinatorAddress = "k_coordinatorAddress"
77
88 let k_admin_address = "k_admin_address"
99
1010 let k_nft_manager_address = "k_nft_manager_address"
1111
1212 let k_oracle_public_keys = "k_oracle_public_keys"
1313
1414 let k_stream = "k_stream"
1515
1616 let k_stream_data_price = "k_stream_data_price"
1717
1818 let k_stream_data_spread = "k_stream_data_spread"
1919
2020 let k_stream_data_timestamp = "k_stream_data_timestamp"
2121
2222 let k_stream_data_block = "k_stream_data_block"
2323
2424 func coordinator () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, k_coordinatorAddress), "Coordinator not set")), "Coordinator address invalid")
2525
2626
2727 func adminAddress () = addressFromString(valueOrErrorMessage(getString(coordinator(), k_admin_address), "Admin address not set"))
2828
2929
3030 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
3131
3232
3333 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
3434
3535 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
3636
3737
3838 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
3939
4040
4141 func abs (_x) = if ((_x > 0))
4242 then _x
4343 else -(_x)
4444
4545
4646 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
4747
4848
4949 func getStreamSettingsKey (_id) = toCompositeKey(k_stream, _id)
5050
5151
5252 func toList (_str,_spr) = if (isDefined(indexOf(_str, _spr)))
5353 then split(_str, _spr)
5454 else [_str]
5555
5656
5757 func verifyOraclePublicKeys (_keys) = {
5858 let list = toList(_keys, ",")
5959 if ((size(list) > 9))
6060 then throw("Max 9 signatures")
6161 else _keys
6262 }
6363
6464
6565 func lastTimestamp () = lastBlock.timestamp
6666
6767
6868 func getOracleAddresses () = {
6969 let oraStr = getStringValue(this, k_oracle_public_keys)
7070 if (isDefined(indexOf(oraStr, ",")))
7171 then split(oraStr, ",")
7272 else [oraStr]
7373 }
7474
7575
7676 func getStreamSettings (_id) = {
7777 let _key = getStreamSettingsKey(_id)
7878 let str = valueOrErrorMessage(getString(this, _key), ("No stream with id: " + _id))
7979 let parts = split(str, ",")
8080 $Tuple3(valueOrErrorMessage(parseInt(parts[0]), ("Invalid maxDeviation in stream: " + _id)), valueOrErrorMessage(parseInt(parts[1]), ("Invalid validityPeriod in stream: " + _id)), (parts[2] == "true"))
8181 }
8282
8383
8484 func getStreamLastData (_id) = {
8585 let dataPoint = getInteger(this, toCompositeKey(k_stream_data_price, _id))
8686 if (isDefined(dataPoint))
87- then $Tuple3(getIntegerValue(this, toCompositeKey(k_stream_data_price, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_spread, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_timestamp, _id)))
88- else $Tuple3(0, 0, lastTimestamp())
87+ then $Tuple4(getIntegerValue(this, toCompositeKey(k_stream_data_price, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_spread, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_timestamp, _id)), getIntegerValue(this, toCompositeKey(k_stream_data_block, _id)))
88+ else $Tuple4(0, 0, lastTimestamp(), height)
8989 }
9090
9191
9292 func updateStreamSettings (_id,_maxDeviation,_validityPeriod,_stopped) = {
9393 let streamData = makeString([toString(_maxDeviation), toString(_validityPeriod), toString(_stopped)], ",")
9494 [StringEntry(getStreamSettingsKey(_id), streamData)]
9595 }
9696
9797
9898 @Callable(i)
9999 func initialize (_coordinator,_oraclePublicKeys) = if (if (initialized())
100100 then true
101101 else (i.caller != this))
102102 then throw("Unable to initialize")
103103 else [StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator))), StringEntry(k_oracle_public_keys, verifyOraclePublicKeys(_oraclePublicKeys)), BooleanEntry(k_initialized, true)]
104104
105105
106106
107107 @Callable(i)
108108 func setOraclePublicKeys (_oraclePublicKeys) = if (if (!(initialized()))
109109 then true
110110 else (i.caller != adminAddress()))
111111 then throw("Invalid setOraclePublicKeys params")
112112 else [StringEntry(k_oracle_public_keys, verifyOraclePublicKeys(_oraclePublicKeys))]
113113
114114
115115
116116 @Callable(i)
117117 func createStream (_id,_maxDeviation,_validityPeriod) = if (if (if ((i.caller != adminAddress()))
118118 then true
119119 else (0 >= _maxDeviation))
120120 then true
121121 else (0 >= _validityPeriod))
122122 then throw("Invalid createStream params")
123123 else updateStreamSettings(_id, _maxDeviation, _validityPeriod, false)
124124
125125
126126
127127 @Callable(i)
128128 func pause (_id) = if ((i.caller != adminAddress()))
129129 then throw("Invalid pause params")
130130 else {
131- let $t046624730 = getStreamSettings(_id)
132- let maxDeviation = $t046624730._1
133- let validityPeriod = $t046624730._2
134- let stopped = $t046624730._3
131+ let $t047414809 = getStreamSettings(_id)
132+ let maxDeviation = $t047414809._1
133+ let validityPeriod = $t047414809._2
134+ let stopped = $t047414809._3
135135 updateStreamSettings(_id, maxDeviation, validityPeriod, true)
136136 }
137137
138138
139139
140140 @Callable(i)
141141 func unPause (_id) = if ((i.caller != adminAddress()))
142142 then throw("Invalid unPause params")
143143 else {
144- let $t050155083 = getStreamSettings(_id)
145- let maxDeviation = $t050155083._1
146- let validityPeriod = $t050155083._2
147- let stopped = $t050155083._3
144+ let $t050945162 = getStreamSettings(_id)
145+ let maxDeviation = $t050945162._1
146+ let validityPeriod = $t050945162._2
147+ let stopped = $t050945162._3
148148 updateStreamSettings(_id, maxDeviation, validityPeriod, false)
149149 }
150150
151151
152152
153153 @Callable(i)
154154 func updateData (_data) = {
155155 let update = split_4C(_data, "__")
156156 let id = update[0]
157157 let timestamp = valueOrErrorMessage(parseInt(update[1]), "Invalid data: timestamp")
158158 if ((timestamp == timestamp))
159159 then {
160160 let price = valueOrErrorMessage(parseInt(update[2]), "Invalid data: price")
161161 if ((price == price))
162162 then {
163163 let spread = valueOrErrorMessage(parseInt(update[3]), "Invalid data: spread")
164164 if ((spread == spread))
165165 then {
166166 let signatures = if (isDefined(indexOf(update[4], ":")))
167167 then split_4C(update[4], ":")
168168 else [update[4]]
169169 let message = toBytes(((((((id + ",") + toString(timestamp)) + ",") + toString(price)) + ",") + toString(spread)))
170170 let oracles = getOracleAddresses()
171171 func handle (_acc,_signatureData) = {
172172 let signedBy = split(_signatureData, "=")
173173 let signer = signedBy[0]
174174 let signature = signedBy[1]
175175 let isValidSigner = containsElement(oracles, signer)
176176 let isValidSignature = sigVerify(message, fromBase58String(signature), fromBase58String(signer))
177177 let result = if (if (isValidSigner)
178178 then isValidSignature
179179 else false)
180180 then (_acc + 1)
181181 else _acc
182182 result
183183 }
184184
185185 let signaturesCount = {
186186 let $l = signatures
187187 let $s = size($l)
188188 let $acc0 = 0
189189 func $f0_1 ($a,$i) = if (($i >= $s))
190190 then $a
191191 else handle($a, $l[$i])
192192
193193 func $f0_2 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else throw("List size exceeds 5")
196196
197197 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
198198 }
199199 let isQuorumReached = (signaturesCount > (size(oracles) / 2))
200- let $t064536553 = getStreamSettings(id)
201- if (($t064536553 == $t064536553))
200+ let $t065326632 = getStreamSettings(id)
201+ if (($t065326632 == $t065326632))
202202 then {
203- let stopped = $t064536553._3
204- let validityPeriod = $t064536553._2
205- let maxDeviation = $t064536553._1
203+ let stopped = $t065326632._3
204+ let validityPeriod = $t065326632._2
205+ let maxDeviation = $t065326632._1
206206 let now = lastTimestamp()
207207 let isValidTimestamp = if ((timestamp > now))
208208 then true
209209 else (validityPeriod > (now - timestamp))
210210 let iNotStopped = !(stopped)
211- let $t067056821 = getStreamLastData(id)
212- let lastPrice = $t067056821._1
213- let lastSpread = $t067056821._2
214- let streamLastTimestamp = $t067056821._3
211+ let $t067846912 = getStreamLastData(id)
212+ let lastPrice = $t067846912._1
213+ let lastSpread = $t067846912._2
214+ let streamLastTimestamp = $t067846912._3
215+ let lastHeight = $t067846912._4
215216 let diff = if ((lastPrice == 0))
216217 then 0
217218 else abs(divd((price - lastPrice), lastPrice))
218219 let isValidDiff = (maxDeviation > diff)
219220 if (if (if (if (isQuorumReached)
220221 then isValidTimestamp
221222 else false)
222223 then iNotStopped
223224 else false)
224225 then isValidDiff
225226 else false)
226227 then if ((streamLastTimestamp > timestamp))
227228 then $Tuple2(nil, $Tuple3(lastPrice, lastSpread, streamLastTimestamp))
228- else $Tuple2([IntegerEntry(toCompositeKey(k_stream_data_price, id), price), IntegerEntry(toCompositeKey(k_stream_data_spread, id), spread), IntegerEntry(toCompositeKey(k_stream_data_timestamp, id), timestamp), IntegerEntry(toCompositeKey(k_stream_data_block, id), height)], $Tuple3(price, spread, timestamp))
229+ else if (if (if (if ((price != lastPrice))
230+ then true
231+ else (spread != lastSpread))
232+ then true
233+ else (timestamp != streamLastTimestamp))
234+ then true
235+ else (lastHeight != height))
236+ then $Tuple2([IntegerEntry(toCompositeKey(k_stream_data_price, id), price), IntegerEntry(toCompositeKey(k_stream_data_spread, id), spread), IntegerEntry(toCompositeKey(k_stream_data_timestamp, id), timestamp), IntegerEntry(toCompositeKey(k_stream_data_block, id), height)], $Tuple3(price, spread, timestamp))
237+ else $Tuple2(nil, $Tuple3(price, spread, timestamp))
229238 else {
230239 let reasons = [if (!(isValidTimestamp))
231240 then "invalid timestamp"
232241 else "", if (!(iNotStopped))
233242 then "stopped"
234243 else "", if (!(isValidDiff))
235244 then "invalid diff (too large)"
236245 else "", if (!(isQuorumReached))
237246 then "quorum not reached"
238247 else ""]
239248 let reason = makeString(reasons, ", ")
240249 throw(("Invalid updateDate params: " + reason))
241250 }
242251 }
243252 else throw("Strict value is not equal to itself.")
244253 }
245254 else throw("Strict value is not equal to itself.")
246255 }
247256 else throw("Strict value is not equal to itself.")
248257 }
249258 else throw("Strict value is not equal to itself.")
250259 }
251260
252261
253262 @Verifier(tx)
254263 func verify () = {
255264 let coordinatorStr = getString(this, k_coordinatorAddress)
256265 if (isDefined(coordinatorStr))
257266 then {
258267 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
259268 if (isDefined(admin))
260269 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
261270 else throw("unable to verify: admin not set in coordinator")
262271 }
263272 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
264273 }
265274

github/deemru/w8io/3ef1775 
49.05 ms