tx · HExUqr6N44G6WuEZCJSiyiFC39vWpjjMk2ibY9KYAARK

3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx:  -0.03700000 Waves

2023.06.06 10:00 [3676024] smart account 3PAwjFSzsxVsQMmXHtD5kSDRsvxMUoWKeEx > SELF 0.00000000 Waves

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

github/deemru/w8io/3ef1775 
38.33 ms