tx · U2m9xeZXQBMV52VnWe41xh6HBToSNKw5MxUNUP9sz8T

3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx:  -0.03700000 Waves

2023.06.07 10:37 [3677526] smart account 3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx > SELF 0.00000000 Waves

{ "type": 13, "id": "U2m9xeZXQBMV52VnWe41xh6HBToSNKw5MxUNUP9sz8T", "fee": 3700000, "feeAssetId": null, "timestamp": 1686123506165, "version": 2, "chainId": 87, "sender": "3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx", "senderPublicKey": "D1xuuBuw7GwsjUjftZe5rR5fK2XjzTYuNXqBBA9vYKKL", "proofs": [ "43E7ZiRgBEseozYuvEdjRLZjU3hB9fqU33NzryT4MWLCPr428qCQK6GKdkxzQ2TDWRNEuTkRLKLHjaaaiW5Qjwp4" ], "script": "base64:BgIjCAISBAoCCAgSAwoBCBIFCgMIAQESAwoBCBIDCgEIEgMKAQgaAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzABVrX25mdF9tYW5hZ2VyX2FkZHJlc3MCFWtfbmZ0X21hbmFnZXJfYWRkcmVzcwAUa19vcmFjbGVfcHVibGljX2tleXMCFGtfb3JhY2xlX3B1YmxpY19rZXlzAAhrX3N0cmVhbQIIa19zdHJlYW0AE2tfc3RyZWFtX2RhdGFfcHJpY2UCE2tfc3RyZWFtX2RhdGFfcHJpY2UAFGtfc3RyZWFtX2RhdGFfc3ByZWFkAhRrX3N0cmVhbV9kYXRhX3NwcmVhZAAXa19zdHJlYW1fZGF0YV90aW1lc3RhbXACF2tfc3RyZWFtX2RhdGFfdGltZXN0YW1wABNrX3N0cmVhbV9kYXRhX2Jsb2NrAhNrX3N0cmVhbV9kYXRhX2Jsb2NrAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQCG0Nvb3JkaW5hdG9yIGFkZHJlc3MgaW52YWxpZAEMYWRtaW5BZGRyZXNzAAkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBC2Nvb3JkaW5hdG9yAAUPa19hZG1pbl9hZGRyZXNzAhVBZG1pbiBhZGRyZXNzIG5vdCBzZXQBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIACgAKAAoACgAKAAoBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEUZ2V0U3RyZWFtU2V0dGluZ3NLZXkBA19pZAkBDnRvQ29tcG9zaXRlS2V5AgUIa19zdHJlYW0FA19pZAEGdG9MaXN0AgRfc3RyBF9zcHIDCQEJaXNEZWZpbmVkAQkAswkCBQRfc3RyBQRfc3ByCQC1CQIFBF9zdHIFBF9zcHIJAMwIAgUEX3N0cgUDbmlsARZ2ZXJpZnlPcmFjbGVQdWJsaWNLZXlzAQVfa2V5cwQEbGlzdAkBBnRvTGlzdAIFBV9rZXlzAgEsAwkAZgIJAJADAQUEbGlzdAAJCQACAQIQTWF4IDkgc2lnbmF0dXJlcwUFX2tleXMBDWxhc3RUaW1lc3RhbXAACAUJbGFzdEJsb2NrCXRpbWVzdGFtcAESZ2V0T3JhY2xlQWRkcmVzc2VzAAQGb3JhU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX29yYWNsZV9wdWJsaWNfa2V5cwMJAQlpc0RlZmluZWQBCQCzCQIFBm9yYVN0cgIBLAkAtQkCBQZvcmFTdHICASwJAMwIAgUGb3JhU3RyBQNuaWwBEWdldFN0cmVhbVNldHRpbmdzAQNfaWQEBF9rZXkJARRnZXRTdHJlYW1TZXR0aW5nc0tleQEFA19pZAQDc3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUEX2tleQkArAICAhNObyBzdHJlYW0gd2l0aCBpZDogBQNfaWQEBXBhcnRzCQC1CQIFA3N0cgIBLAkAlQoDCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwAACQCsAgICIEludmFsaWQgbWF4RGV2aWF0aW9uIGluIHN0cmVhbTogBQNfaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBXBhcnRzAAEJAKwCAgIiSW52YWxpZCB2YWxpZGl0eVBlcmlvZCBpbiBzdHJlYW06IAUDX2lkCQAAAgkAkQMCBQVwYXJ0cwACAgR0cnVlARFnZXRTdHJlYW1MYXN0RGF0YQEDX2lkBAlkYXRhUG9pbnQJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUTa19zdHJlYW1fZGF0YV9wcmljZQUDX2lkAwkBCWlzRGVmaW5lZAEFCWRhdGFQb2ludAkAlgoECQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRNrX3N0cmVhbV9kYXRhX3ByaWNlBQNfaWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFFGtfc3RyZWFtX2RhdGFfc3ByZWFkBQNfaWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFF2tfc3RyZWFtX2RhdGFfdGltZXN0YW1wBQNfaWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFE2tfc3RyZWFtX2RhdGFfYmxvY2sFA19pZAkAlgoEAAAAAAkBDWxhc3RUaW1lc3RhbXAABQZoZWlnaHQBFHVwZGF0ZVN0cmVhbVNldHRpbmdzBANfaWQNX21heERldmlhdGlvbg9fdmFsaWRpdHlQZXJpb2QIX3N0b3BwZWQECnN0cmVhbURhdGEJALkJAgkAzAgCCQCkAwEFDV9tYXhEZXZpYXRpb24JAMwIAgkApAMBBQ9fdmFsaWRpdHlQZXJpb2QJAMwIAgkApQMBBQhfc3RvcHBlZAUDbmlsAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRnZXRTdHJlYW1TZXR0aW5nc0tleQEFA19pZAUKc3RyZWFtRGF0YQUDbmlsBgFpAQppbml0aWFsaXplAgxfY29vcmRpbmF0b3IRX29yYWNsZVB1YmxpY0tleXMDAwkBC2luaXRpYWxpemVkAAYJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECFFVuYWJsZSB0byBpbml0aWFsaXplCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzCQClCAEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDF9jb29yZGluYXRvcgkAzAgCCQELU3RyaW5nRW50cnkCBRRrX29yYWNsZV9wdWJsaWNfa2V5cwkBFnZlcmlmeU9yYWNsZVB1YmxpY0tleXMBBRFfb3JhY2xlUHVibGljS2V5cwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYFA25pbAFpARNzZXRPcmFjbGVQdWJsaWNLZXlzARFfb3JhY2xlUHVibGljS2V5cwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIiSW52YWxpZCBzZXRPcmFjbGVQdWJsaWNLZXlzIHBhcmFtcwkAzAgCCQELU3RyaW5nRW50cnkCBRRrX29yYWNsZV9wdWJsaWNfa2V5cwkBFnZlcmlmeU9yYWNsZVB1YmxpY0tleXMBBRFfb3JhY2xlUHVibGljS2V5cwUDbmlsAWkBDGNyZWF0ZVN0cmVhbQMDX2lkDV9tYXhEZXZpYXRpb24PX3ZhbGlkaXR5UGVyaW9kAwMDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MABgkAZwIAAAUNX21heERldmlhdGlvbgYJAGcCAAAFD192YWxpZGl0eVBlcmlvZAkAAgECG0ludmFsaWQgY3JlYXRlU3RyZWFtIHBhcmFtcwkBFHVwZGF0ZVN0cmVhbVNldHRpbmdzBAUDX2lkBQ1fbWF4RGV2aWF0aW9uBQ9fdmFsaWRpdHlQZXJpb2QHAWkBBXBhdXNlAQNfaWQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIUSW52YWxpZCBwYXVzZSBwYXJhbXMECyR0MDQ3NDE0ODA5CQERZ2V0U3RyZWFtU2V0dGluZ3MBBQNfaWQEDG1heERldmlhdGlvbggFCyR0MDQ3NDE0ODA5Al8xBA52YWxpZGl0eVBlcmlvZAgFCyR0MDQ3NDE0ODA5Al8yBAdzdG9wcGVkCAULJHQwNDc0MTQ4MDkCXzMJARR1cGRhdGVTdHJlYW1TZXR0aW5ncwQFA19pZAUMbWF4RGV2aWF0aW9uBQ52YWxpZGl0eVBlcmlvZAYBaQEHdW5QYXVzZQEDX2lkAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECFkludmFsaWQgdW5QYXVzZSBwYXJhbXMECyR0MDUwOTQ1MTYyCQERZ2V0U3RyZWFtU2V0dGluZ3MBBQNfaWQEDG1heERldmlhdGlvbggFCyR0MDUwOTQ1MTYyAl8xBA52YWxpZGl0eVBlcmlvZAgFCyR0MDUwOTQ1MTYyAl8yBAdzdG9wcGVkCAULJHQwNTA5NDUxNjICXzMJARR1cGRhdGVTdHJlYW1TZXR0aW5ncwQFA19pZAUMbWF4RGV2aWF0aW9uBQ52YWxpZGl0eVBlcmlvZAcBaQEKdXBkYXRlRGF0YQEFX2RhdGEEBnVwZGF0ZQkAvAkCBQVfZGF0YQICX18EAmlkCQCRAwIFBnVwZGF0ZQAABAl0aW1lc3RhbXAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBnVwZGF0ZQABAhdJbnZhbGlkIGRhdGE6IHRpbWVzdGFtcAMJAAACBQl0aW1lc3RhbXAFCXRpbWVzdGFtcAQFcHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFBnVwZGF0ZQACAhNJbnZhbGlkIGRhdGE6IHByaWNlAwkAAAIFBXByaWNlBQVwcmljZQQGc3ByZWFkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQZ1cGRhdGUAAwIUSW52YWxpZCBkYXRhOiBzcHJlYWQDCQAAAgUGc3ByZWFkBQZzcHJlYWQECnNpZ25hdHVyZXMDCQEJaXNEZWZpbmVkAQkAswkCCQCRAwIFBnVwZGF0ZQAEAgE6CQC8CQIJAJEDAgUGdXBkYXRlAAQCAToJAMwIAgkAkQMCBQZ1cGRhdGUABAUDbmlsBAdtZXNzYWdlCQCbAwEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFAmlkAgEsCQCkAwEFCXRpbWVzdGFtcAIBLAkApAMBBQVwcmljZQIBLAkApAMBBQZzcHJlYWQEB29yYWNsZXMJARJnZXRPcmFjbGVBZGRyZXNzZXMACgEGaGFuZGxlAgRfYWNjDl9zaWduYXR1cmVEYXRhBAhzaWduZWRCeQkAtQkCBQ5fc2lnbmF0dXJlRGF0YQIBPQQGc2lnbmVyCQCRAwIFCHNpZ25lZEJ5AAAECXNpZ25hdHVyZQkAkQMCBQhzaWduZWRCeQABBA1pc1ZhbGlkU2lnbmVyCQEPY29udGFpbnNFbGVtZW50AgUHb3JhY2xlcwUGc2lnbmVyBBBpc1ZhbGlkU2lnbmF0dXJlCQD0AwMFB21lc3NhZ2UJANkEAQUJc2lnbmF0dXJlCQDZBAEFBnNpZ25lcgQGcmVzdWx0AwMFDWlzVmFsaWRTaWduZXIFEGlzVmFsaWRTaWduYXR1cmUHCQBkAgUEX2FjYwABBQRfYWNjBQZyZXN1bHQED3NpZ25hdHVyZXNDb3VudAoAAiRsBQpzaWduYXR1cmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQZoYW5kbGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBA9pc1F1b3J1bVJlYWNoZWQJAGYCBQ9zaWduYXR1cmVzQ291bnQJAGkCCQCQAwEFB29yYWNsZXMAAgQLJHQwNjUzMjY2MzIJARFnZXRTdHJlYW1TZXR0aW5ncwEFAmlkAwkAAAIFCyR0MDY1MzI2NjMyBQskdDA2NTMyNjYzMgQHc3RvcHBlZAgFCyR0MDY1MzI2NjMyAl8zBA52YWxpZGl0eVBlcmlvZAgFCyR0MDY1MzI2NjMyAl8yBAxtYXhEZXZpYXRpb24IBQskdDA2NTMyNjYzMgJfMQQDbm93CQENbGFzdFRpbWVzdGFtcAAEEGlzVmFsaWRUaW1lc3RhbXADCQBmAgUJdGltZXN0YW1wBQNub3cGCQBmAgUOdmFsaWRpdHlQZXJpb2QJAGUCBQNub3cFCXRpbWVzdGFtcAQLaU5vdFN0b3BwZWQJAQEhAQUHc3RvcHBlZAQLJHQwNjc4NDY5MTIJARFnZXRTdHJlYW1MYXN0RGF0YQEFAmlkBAlsYXN0UHJpY2UIBQskdDA2Nzg0NjkxMgJfMQQKbGFzdFNwcmVhZAgFCyR0MDY3ODQ2OTEyAl8yBBNzdHJlYW1MYXN0VGltZXN0YW1wCAULJHQwNjc4NDY5MTICXzMECmxhc3RIZWlnaHQIBQskdDA2Nzg0NjkxMgJfNAQEZGlmZgMJAAACBQlsYXN0UHJpY2UAAAAACQEDYWJzAQkBBGRpdmQCCQBlAgUFcHJpY2UFCWxhc3RQcmljZQUJbGFzdFByaWNlBAtpc1ZhbGlkRGlmZgkAZgIFDG1heERldmlhdGlvbgUEZGlmZgMDAwMFD2lzUXVvcnVtUmVhY2hlZAUQaXNWYWxpZFRpbWVzdGFtcAcFC2lOb3RTdG9wcGVkBwULaXNWYWxpZERpZmYHAwkAZgIFE3N0cmVhbUxhc3RUaW1lc3RhbXAFCXRpbWVzdGFtcAkAlAoCBQNuaWwJAJUKAwUJbGFzdFByaWNlBQpsYXN0U3ByZWFkBRNzdHJlYW1MYXN0VGltZXN0YW1wAwMDAwkBAiE9AgUFcHJpY2UFCWxhc3RQcmljZQYJAQIhPQIFBnNwcmVhZAUKbGFzdFNwcmVhZAYJAQIhPQIFCXRpbWVzdGFtcAUTc3RyZWFtTGFzdFRpbWVzdGFtcAYJAQIhPQIFCmxhc3RIZWlnaHQFBmhlaWdodAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRNrX3N0cmVhbV9kYXRhX3ByaWNlBQJpZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFFGtfc3RyZWFtX2RhdGFfc3ByZWFkBQJpZAUGc3ByZWFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRdrX3N0cmVhbV9kYXRhX3RpbWVzdGFtcAUCaWQFCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa19zdHJlYW1fZGF0YV9ibG9jawUCaWQFBmhlaWdodAUDbmlsCQCVCgMFBXByaWNlBQZzcHJlYWQFCXRpbWVzdGFtcAkAlAoCBQNuaWwJAJUKAwUFcHJpY2UFBnNwcmVhZAUJdGltZXN0YW1wBAdyZWFzb25zCQDMCAIDCQEBIQEFEGlzVmFsaWRUaW1lc3RhbXACEWludmFsaWQgdGltZXN0YW1wAgAJAMwIAgMJAQEhAQULaU5vdFN0b3BwZWQCB3N0b3BwZWQCAAkAzAgCAwkBASEBBQtpc1ZhbGlkRGlmZgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhlpbnZhbGlkIGRpZmYgKHRvbyBsYXJnZSkgCQCkAwEFCWxhc3RQcmljZQIEIHZzIAkApAMBBQVwcmljZQIGIGRldjogCQCkAwEFBGRpZmYCCSBtYXhEZXY6IAkApAMBBQxtYXhEZXZpYXRpb24CAAkAzAgCAwkBASEBBQ9pc1F1b3J1bVJlYWNoZWQCEnF1b3J1bSBub3QgcmVhY2hlZAIABQNuaWwEBnJlYXNvbgkAuQkCBQdyZWFzb25zAgIsIAkAAgEJAKwCAgIbSW52YWxpZCB1cGRhdGVEYXRlIHBhcmFtczogBQZyZWFzb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA5jb29yZGluYXRvclN0cgkAnQgCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwMJAQlpc0RlZmluZWQBBQ5jb29yZGluYXRvclN0cgQFYWRtaW4JAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUOY29vcmRpbmF0b3JTdHIFD2tfYWRtaW5fYWRkcmVzcwMJAQlpc0RlZmluZWQBBQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVhZG1pbgkArAICCQCsAgIJAKwCAgIHc3RhdHVzXwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAcJAAIBAi51bmFibGUgdG8gdmVyaWZ5OiBhZG1pbiBub3Qgc2V0IGluIGNvb3JkaW5hdG9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5fe4nTg==", "height": 3677526, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G95TS5L39EsUZyr82v9Eq65bgujSY4EdMQgexTTUUGnu Next: none 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))
8787 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)))
8888 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 {
131131 let $t047414809 = getStreamSettings(_id)
132132 let maxDeviation = $t047414809._1
133133 let validityPeriod = $t047414809._2
134134 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 {
144144 let $t050945162 = getStreamSettings(_id)
145145 let maxDeviation = $t050945162._1
146146 let validityPeriod = $t050945162._2
147147 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))
200200 let $t065326632 = getStreamSettings(id)
201201 if (($t065326632 == $t065326632))
202202 then {
203203 let stopped = $t065326632._3
204204 let validityPeriod = $t065326632._2
205205 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)
211211 let $t067846912 = getStreamLastData(id)
212212 let lastPrice = $t067846912._1
213213 let lastSpread = $t067846912._2
214214 let streamLastTimestamp = $t067846912._3
215215 let lastHeight = $t067846912._4
216216 let diff = if ((lastPrice == 0))
217217 then 0
218218 else abs(divd((price - lastPrice), lastPrice))
219219 let isValidDiff = (maxDeviation > diff)
220220 if (if (if (if (isQuorumReached)
221221 then isValidTimestamp
222222 else false)
223223 then iNotStopped
224224 else false)
225225 then isValidDiff
226226 else false)
227227 then if ((streamLastTimestamp > timestamp))
228228 then $Tuple2(nil, $Tuple3(lastPrice, lastSpread, streamLastTimestamp))
229229 else if (if (if (if ((price != lastPrice))
230230 then true
231231 else (spread != lastSpread))
232232 then true
233233 else (timestamp != streamLastTimestamp))
234234 then true
235235 else (lastHeight != height))
236236 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))
237237 else $Tuple2(nil, $Tuple3(price, spread, timestamp))
238238 else {
239239 let reasons = [if (!(isValidTimestamp))
240240 then "invalid timestamp"
241241 else "", if (!(iNotStopped))
242242 then "stopped"
243243 else "", if (!(isValidDiff))
244244 then ((((((("invalid diff (too large) " + toString(lastPrice)) + " vs ") + toString(price)) + " dev: ") + toString(diff)) + " maxDev: ") + toString(maxDeviation))
245245 else "", if (!(isQuorumReached))
246246 then "quorum not reached"
247247 else ""]
248248 let reason = makeString(reasons, ", ")
249249 throw(("Invalid updateDate params: " + reason))
250250 }
251251 }
252252 else throw("Strict value is not equal to itself.")
253253 }
254254 else throw("Strict value is not equal to itself.")
255255 }
256256 else throw("Strict value is not equal to itself.")
257257 }
258258 else throw("Strict value is not equal to itself.")
259259 }
260260
261261
262262 @Verifier(tx)
263263 func verify () = {
264264 let coordinatorStr = getString(this, k_coordinatorAddress)
265265 if (isDefined(coordinatorStr))
266266 then {
267267 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
268268 if (isDefined(admin))
269269 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
270270 else throw("unable to verify: admin not set in coordinator")
271271 }
272272 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
273273 }
274274

github/deemru/w8io/3ef1775 
45.11 ms