2023.03.02 10:55 [3537633] smart account 3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP > SELF 0.00000000 Waves

{ "type": 13, "id": "8tfCXyHzAqtZCd9UaJBN6rvv4J77hYNsBzjDwiTVSErb", "fee": 1900000, "feeAssetId": null, "timestamp": 1677743670755, "version": 1, "sender": "3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP", "senderPublicKey": "GqXuX2WHNr3WUqTaeH2YCySFY45NAJoE9RmY9bEWkzh", "proofs": [ "", "4bqb7EfxMumfv6PhAA5m1Hydah2vuDvkrroESGcjHXHUntaxPfCZ8wtFbPLLvtbCrRe9J6c2SaaxtHkbYCPCJWMK", "", "4ML77U6QLP2icsPWf3a33QWLvneFzH24WNxEo6xV7Fo3oZNrqYnU21Cp8CWsJn6BZFZHsfCBcZVuwMAPuKeiJL9o" ], "script": "base64:BgInCAISEAoOCAgICAgICAgICAgICAgSAwoBCBIMCgoBAgECAQIBAgECLwALcmV2aXNpb25OdW0CKDk0ZGZjZjNmYTkyMmQzMTkxOWZmNzRkZWRlNGJmZTdiYjgzNDc4MzIAA1NFUAICX18AGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAKACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAALABdJZHhDb250cm9sQ2ZnUmVzdFYyRGFwcAAMABtJZHhDb250cm9sQ2ZnR292ZXJuYW5jZURhcHAADQAcSWR4Q29udHJvbENmZ1BlZ1Byb3ZpZGVyRGFwcAAOARBrZXlDb250cm9sQ29uZmlnAAIRJXNfX2NvbnRyb2xDb25maWcBDmRhdGFDb250cm9sQ2ZnDhBuZXV0cmlub0NvbnRyYWN0D2F1Y3Rpb25Db250cmFjdAtycGRDb250cmFjdAxtYXRoQ29udHJhY3QTbGlxdWlkYXRpb25Db250cmFjdAxyZXN0Q29udHJhY3QUbm9kZVJlZ2lzdHJ5Q29udHJhY3QTbnNidFN0YWtpbmdDb250cmFjdBBtZWRpYXRvckNvbnRyYWN0E3N1cmZTdGFraW5nQ29udHJhY3QXZ25zYnRDb250cm9sbGVyQ29udHJhY3QOcmVzdFYyQ29udHJhY3QSZ292ZXJuYW5jZUNvbnRyYWN0DGRvcmFDb250cmFjdAkAuQkCCQDMCAICHCVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMJAMwIAgUQbmV1dHJpbm9Db250cmFjdAkAzAgCBQ9hdWN0aW9uQ29udHJhY3QJAMwIAgULcnBkQ29udHJhY3QJAMwIAgUMbWF0aENvbnRyYWN0CQDMCAIFE2xpcXVpZGF0aW9uQ29udHJhY3QJAMwIAgUMcmVzdENvbnRyYWN0CQDMCAIFFG5vZGVSZWdpc3RyeUNvbnRyYWN0CQDMCAIFE25zYnRTdGFraW5nQ29udHJhY3QJAMwIAgUQbWVkaWF0b3JDb250cmFjdAkAzAgCBRNzdXJmU3Rha2luZ0NvbnRyYWN0CQDMCAIFF2duc2J0Q29udHJvbGxlckNvbnRyYWN0CQDMCAIFDnJlc3RWMkNvbnRyYWN0CQDMCAIFEmdvdmVybmFuY2VDb250cmFjdAkAzAgCBQxkb3JhQ29udHJhY3QFA25pbAUDU0VQARZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAgZhbW91bnQFcHJpY2UJAGsDCQBrAwUGYW1vdW50BQVwcmljZQDAhD0AwIQ9AIDC1y8BGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQIHYWRkcmVzcwNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUHYWRkcmVzcwUDa2V5AAABGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQIHYWRkcmVzcwNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5AgABFmNvbnZlcnRKc29uQXJyYXlUb0xpc3QBCWpzb25BcnJheQkAtQkCBQlqc29uQXJyYXkCASwABXByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCBXByaWNlAAAACnByaWNlSW5kZXgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwILcHJpY2VfaW5kZXgAAAAJaXNCbG9ja2VkCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMCCmlzX2Jsb2NrZWQHABJwZXJjZW50UHJpY2VPZmZzZXQABwANcHViS2V5T3JhY2xlcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAgdvcmFjbGVzAgAAEXB1YktleU9yYWNsZXNMaXN0CQEWY29udmVydEpzb25BcnJheVRvTGlzdAEFDXB1YktleU9yYWNsZXMAD25ldXRyaW5vQWRkcmVzcwkBB0FkZHJlc3MBARoBV3AEYqZHm+mtVmiUy++FjDCCICiaCBSWsgASbGlxdWlkYXRpb25BZGRyZXNzCQEHQWRkcmVzcwEBGgFXGupJy/oKfsoIfyjVn5WODHtptak4kR9IAA1uZXV0cmlub0Fzc2V0ASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAHd3hJZFN0cgIsQXRxdjU5RVl6akZHdWl0S1ZuTVJrNkg4RnVram9WM2t0UG9yYkV5czI1b24ABHd4SWQJANkEAQUHd3hJZFN0cgAPY29udHJvbENvbnRyYWN0BQR0aGlzAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgACmNvbnRyb2xDZmcJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJARBrZXlDb250cm9sQ29uZmlnAAUDU0VQABJnb3Zlcm5hbmNlQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRtJZHhDb250cm9sQ2ZnR292ZXJuYW5jZURhcHAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9uZXV0cmlub0FkZHJlc3MCFWJhbGFuY2VfbG9ja19uZXV0cmlubwAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPbmV1dHJpbm9BZGRyZXNzAhJiYWxhbmNlX2xvY2tfd2F2ZXMAAAAHcmVzZXJ2ZQkAZQIICQDvBwEFD25ldXRyaW5vQWRkcmVzcwdyZWd1bGFyBRJ3YXZlc0xvY2tlZEJhbGFuY2UADm5ldXRyaW5vU3VwcGx5CQBlAgkAZQIJAGQCBRVuZXV0cmlub0xvY2tlZEJhbGFuY2UICQEFdmFsdWUBCQDsBwEFDW5ldXRyaW5vQXNzZXQIcXVhbnRpdHkJAPAHAgUPbmV1dHJpbm9BZGRyZXNzBQ1uZXV0cmlub0Fzc2V0CQDwBwIFEmxpcXVpZGF0aW9uQWRkcmVzcwUNbmV1dHJpbm9Bc3NldAAHZGVmaWNpdAkAZQIFDm5ldXRyaW5vU3VwcGx5CQEWY29udmVydFdhdmVzVG9OZXV0cmlubwIFB3Jlc2VydmUFBXByaWNlARFmaW5kUHJpY2VzSW5SYW5nZQEGcHJpY2VzBA9taW5QZXJjZW50Qm91bmQAWgQPbWF4UGVyY2VudEJvdW5kAG4EAnAwCQCRAwIFBnByaWNlcwAABAZjaGVjazADCQBnAgAACQCRAwIFBnByaWNlcwAACQDMCAIAAAUDbmlsBANwMDEJAGkCCQBoAgkAkQMCBQZwcmljZXMAAQBkBQJwMAQDcDAyCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAIAZAUCcDAEA3AwMwkAaQIJAGgCCQCRAwIFBnByaWNlcwADAGQFAnAwBANwMDQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMAQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AwMQkAZgIFA3AwMQUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAEJAMwIAgAABQNuaWwJAMwIAgAABQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMDIJAGYCBQNwMDIFD21pblBlcmNlbnRCb3VuZAcJAMwIAgACBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AwMwkAZgIFA3AwMwUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAMFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AwNAkAZgIFA3AwNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzBAZjaGVjazEDCQBnAgkAkAMBBQZjaGVjazAAAwUGY2hlY2swBAJwMQkAkQMCBQZwcmljZXMAAQMJAGcCAAAFAnAxCQDMCAIAAQUDbmlsBANwMTAJAGkCCQBoAgkAkQMCBQZwcmljZXMAAABkBQJwMQQDcDEyCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAIAZAUCcDEEA3AxMwkAaQIJAGgCCQCRAwIFBnByaWNlcwADAGQFAnAxBANwMTQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMQQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AxMAkAZgIFA3AxMAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAAJAMwIAgABBQNuaWwJAMwIAgABBQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMTIJAGYCBQNwMTIFD21pblBlcmNlbnRCb3VuZAcJAMwIAgACBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AxMwkAZgIFA3AxMwUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAMFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AxNAkAZgIFA3AxNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzBAZjaGVjazIDCQBnAgkAkAMBBQZjaGVjazEAAwUGY2hlY2sxBAJwMgkAkQMCBQZwcmljZXMAAgMJAGcCAAAFAnAyCQDMCAIAAgUDbmlsBANwMjAJAGkCCQBoAgkAkQMCBQZwcmljZXMAAABkBQJwMgQDcDIxCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAEAZAUCcDIEA3AyMwkAaQIJAGgCCQCRAwIFBnByaWNlcwADAGQFAnAyBANwMjQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMgQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AyMAkAZgIFA3AyMAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAAJAMwIAgACBQNuaWwJAMwIAgACBQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMjEJAGYCBQNwMjEFD21pblBlcmNlbnRCb3VuZAcJAMwIAgABBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AyMwkAZgIFA3AyMwUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAMFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AyNAkAZgIFA3AyNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzBAZjaGVjazMDCQBnAgkAkAMBBQZjaGVjazIAAwUGY2hlY2syBAJwMwkAkQMCBQZwcmljZXMAAwMJAGcCAAAFAnAzCQDMCAIAAwUDbmlsBANwMzAJAGkCCQBoAgkAkQMCBQZwcmljZXMAAABkBQJwMwQDcDMxCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAEAZAUCcDMEA3AzMgkAaQIJAGgCCQCRAwIFBnByaWNlcwACAGQFAnAzBANwMzQJAGkCCQBoAgkAkQMCBQZwcmljZXMABABkBQJwMwQGYXJyYXkxAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AzMAkAZgIFA3AzMAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAAJAMwIAgADBQNuaWwJAMwIAgADBQNuaWwEBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwMzEJAGYCBQNwMzEFD21pblBlcmNlbnRCb3VuZAcJAMwIAgABBQZhcnJheTEFBmFycmF5MQQGYXJyYXkzAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AzMgkAZgIFA3AzMgUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAIFBmFycmF5MgUGYXJyYXkyAwMJAGYCBQ9tYXhQZXJjZW50Qm91bmQFA3AzNAkAZgIFA3AzNAUPbWluUGVyY2VudEJvdW5kBwkAzAgCAAQFBmFycmF5MwUGYXJyYXkzAwkAZwIJAJADAQUGY2hlY2szAAMFBmNoZWNrMwQCcDQJAJEDAgUGcHJpY2VzAAQDCQBnAgAABQJwNAkAzAgCAAQFA25pbAQDcDQwCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAAAZAUCcDQEA3A0MQkAaQIJAGgCCQCRAwIFBnByaWNlcwABAGQFAnA0BANwNDIJAGkCCQBoAgkAkQMCBQZwcmljZXMAAgBkBQJwNAQDcDQzCQBpAgkAaAIJAJEDAgUGcHJpY2VzAAMAZAUCcDQEBmFycmF5MQMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwNDAJAGYCBQNwNDAFD21pblBlcmNlbnRCb3VuZAcJAMwIAgAACQDMCAIABAUDbmlsCQDMCAIABAUDbmlsBAZhcnJheTIDAwkAZgIFD21heFBlcmNlbnRCb3VuZAUDcDQxCQBmAgUDcDQxBQ9taW5QZXJjZW50Qm91bmQHCQDMCAIAAQUGYXJyYXkxBQZhcnJheTEEBmFycmF5MwMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwNDIJAGYCBQNwNDIFD21pblBlcmNlbnRCb3VuZAcJAMwIAgACBQZhcnJheTIFBmFycmF5MgMDCQBmAgUPbWF4UGVyY2VudEJvdW5kBQNwNDMJAGYCBQNwNDMFD21pblBlcmNlbnRCb3VuZAcJAMwIAgADBQZhcnJheTMFBmFycmF5MwESZm9ybWF0dGluZ1ByaWNlTXNnAQVwcmljZQkAmwMBCQCsAgIJAKwCAgkArAICCQCsAgICE1dBVkVTTkVVVFJJTk9QUkVGSVgCAV8JAKQDAQUGaGVpZ2h0AgFfCQCkAwEFBXByaWNlAQpQcmljZUVudHJ5AwhuZXdQcmljZQphc3NldElkU3RyDW5ld1ByaWNlSW5kZXgECWhlaWdodFN0cgkApAMBBQZoZWlnaHQEEG5ld1ByaWNlSW5kZXhTdHIJAKQDAQUNbmV3UHJpY2VJbmRleAQPcHJpY2VCeUFzc2V0S0VZCQC5CQIJAMwIAgIcJXMlcyVzX19jb21tb25fX3ByaWNlQnlBc3NldAkAzAgCBQphc3NldElkU3RyBQNuaWwFA1NFUAQQcHJpY2VCeUhlaWdodEtFWQkAuQkCCQDMCAICHyVzJXMlcyVkX19jb21tb25fX3ByaWNlQnlIZWlnaHQJAMwIAgUKYXNzZXRJZFN0cgkAzAgCBQloZWlnaHRTdHIFA25pbAUDU0VQBA9wcmljZUJ5SW5kZXhLRVkJALkJAgkAzAgCAh4lcyVzJXMlZF9fY29tbW9uX19wcmljZUJ5SW5kZXgJAMwIAgUKYXNzZXRJZFN0cgkAzAgCBRBuZXdQcmljZUluZGV4U3RyBQNuaWwFA1NFUAkAzAgCCQEMSW50ZWdlckVudHJ5AgUPcHJpY2VCeUFzc2V0S0VZBQhuZXdQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPcHJpY2VCeUluZGV4S0VZBQhuZXdQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUQcHJpY2VCeUhlaWdodEtFWQUIbmV3UHJpY2UFA25pbAEUZmluYWxpemVXeFVzZE9uY2hhaW4BD3dhdmVzVXNkUHJpY2VYNgQOZG9yYUFkZHJlc3NTdHICIzNQS2tvaktkZDZCQnpUZjFSWGJRVmZVRHJhTkZYWEhLelFGBAtkb3JhQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOZG9yYUFkZHJlc3NTdHIEDXh0blVzZFByaWNlWDYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQtkb3JhQWRkcmVzcwIWJXMlc19fcHJpY2VfX1VTRE4tVVNEVAIkRE9SQSBkb2Vzbid0IGNvbnRhaW4gVVNETi9VU0RUIHByaWNlBAV4dG5JZAUNbmV1dHJpbm9Bc3NldAQIeHRuSWRTdHIJANgEAQUFeHRuSWQEFXd4X1d4V2F2ZXNfQWRkcmVzc1N0cgIjM1BGemFIMmdocHdBTkhGZ2pldmE4M04xeXh6RXJFTHgyZWgEEnd4X1d4V2F2ZXNfQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUVd3hfV3hXYXZlc19BZGRyZXNzU3RyBBF3eF9XeFdhdmVzX1dlaWdodADQhgMEEnd4X1d4V2F2ZXNfV0FWRVN4OAgJAO8HAQUSd3hfV3hXYXZlc19BZGRyZXNzB3JlZ3VsYXIED3d4X1d4V2F2ZXNfV1h4OAkA8AcCBRJ3eF9XeFdhdmVzX0FkZHJlc3MFBHd4SWQEF3d4X1d4V2F2ZXNfV3hVc2RQcmljZVg2CQBrAwUSd3hfV3hXYXZlc19XQVZFU3g4BQ93YXZlc1VzZFByaWNlWDYFD3d4X1d4V2F2ZXNfV1h4OAQTd3hfV3hYdG5fQWRkcmVzc1N0cgIjM1BDRU5wRUtlOGF0d0VMWjdvQ1NtY2RFZmNSdUtUclV4OTkEEHd4X1d4WHRuX0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFE3d4X1d4WHRuX0FkZHJlc3NTdHIED3d4X1d4WHRuX1dlaWdodADQhgMEDnd4X1d4WHRuX1hUTng2CQDwBwIFEHd4X1d4WHRuX0FkZHJlc3MFBXh0bklkBA13eF9XeFh0bl9XWHg4CQDwBwIFEHd4X1d4WHRuX0FkZHJlc3MFBHd4SWQEFXd4X1d4WHRuX1d4VXNkUHJpY2VYNgkAawMJAGgCBQ53eF9XeFh0bl9YVE54NgBkBQ14dG5Vc2RQcmljZVg2BQ13eF9XeFh0bl9XWHg4BBVzd29wX1d4WHRuX0FkZHJlc3NTdHICIzNQS2k0RzNWWDJrNDJaU21OTnJtdmdkREg3SnpSYVVoWTdSBAxzd29wUmVzdERhcHAJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQNTZqTlF6RUNYbnJXcG5iYlNKS3c3RW9vbzZma1VhTVBwBBFzd29wX1d4WHRuX1dlaWdodACIJwQXc3dvcF9XeFh0bl9XeFh0blByaWNlWDYKAAFACQD8BwQFDHN3b3BSZXN0RGFwcAIRY2FsY0dldEFtb3VudENQTU0JAMwIAgUVc3dvcF9XeFh0bl9BZGRyZXNzU3RyCQDMCAICIzNQODhxazFLekYxQktqRDdmQzdMak5WQUtNNGV6ZmY1V0U2CQDMCAIFB3d4SWRTdHIJAMwIAgCAwtcvBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEF3N3b3BfV3hYdG5fV3hVc2RQcmljZVg2CQBrAwUXc3dvcF9XeFh0bl9XeFh0blByaWNlWDYFDXh0blVzZFByaWNlWDYAwIQ9BAFXCQBkAgkAZAIFEXd4X1d4V2F2ZXNfV2VpZ2h0BQ93eF9XeFh0bl9XZWlnaHQFEXN3b3BfV3hYdG5fV2VpZ2h0BAx3eFVzZFByaWNlWDYJAGQCCQBkAgkAawMFF3d4X1d4V2F2ZXNfV3hVc2RQcmljZVg2BRF3eF9XeFdhdmVzX1dlaWdodAUBVwkAawMFFXd4X1d4WHRuX1d4VXNkUHJpY2VYNgUPd3hfV3hYdG5fV2VpZ2h0BQFXCQBrAwUXc3dvcF9XeFh0bl9XeFVzZFByaWNlWDYFEXN3b3BfV3hYdG5fV2VpZ2h0BQFXBAVkZWJ1ZwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg54dG5Vc2RQcmljZVg2PQkApAMBBQ14dG5Vc2RQcmljZVg2Ahkgd3hfV3hXYXZlc19XeFVzZFByaWNlWDY9CQCkAwEFF3d4X1d4V2F2ZXNfV3hVc2RQcmljZVg2Ahcgd3hfV3hYdG5fV3hVc2RQcmljZVg2PQkApAMBBRV3eF9XeFh0bl9XeFVzZFByaWNlWDYCGSBzd29wX1d4WHRuX1d4VXNkUHJpY2VYNj0JAKQDAQUXc3dvcF9XeFh0bl9XeFVzZFByaWNlWDYJAJQKAgUMd3hVc2RQcmljZVg2BQVkZWJ1ZwMBaQENY29uc3RydWN0b3JWMQ4QbmV1dHJpbm9Db250cmFjdA9hdWN0aW9uQ29udHJhY3QLcnBkQ29udHJhY3QMbWF0aENvbnRyYWN0E2xpcXVpZGF0aW9uQ29udHJhY3QMcmVzdENvbnRyYWN0FG5vZGVSZWdpc3RyeUNvbnRyYWN0E25zYnRTdGFraW5nQ29udHJhY3QQbWVkaWF0b3JDb250cmFjdBNzdXJmU3Rha2luZ0NvbnRyYWN0F2duc2J0Q29udHJvbGxlckNvbnRyYWN0DnJlc3RWMkNvbnRyYWN0EmdvdmVybmFuY2VDb250cmFjdAxkb3JhQ29udHJhY3QDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleUNvbnRyb2xDb25maWcACQEOZGF0YUNvbnRyb2xDZmcOBRBuZXV0cmlub0NvbnRyYWN0BQ9hdWN0aW9uQ29udHJhY3QFC3JwZENvbnRyYWN0BQxtYXRoQ29udHJhY3QFE2xpcXVpZGF0aW9uQ29udHJhY3QFDHJlc3RDb250cmFjdAUUbm9kZVJlZ2lzdHJ5Q29udHJhY3QFE25zYnRTdGFraW5nQ29udHJhY3QFEG1lZGlhdG9yQ29udHJhY3QFE3N1cmZTdGFraW5nQ29udHJhY3QFF2duc2J0Q29udHJvbGxlckNvbnRyYWN0BQ5yZXN0VjJDb250cmFjdAUSZ292ZXJuYW5jZUNvbnRyYWN0BQxkb3JhQ29udHJhY3QFA25pbAFpARVjYWxsRW1lcmdlbmN5U2h1dGRvd24BBnJlYXNvbgQaQXV0b0VtZXJnZW5jeU9yYWNsZUFkZHJlc3MCIzNQN2loRlZ4Qk5iSEsyMzdUTmRQeFQxeEhFdThwSGV4WFRyBA1jYWxsZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMDCQECIT0CBRpBdXRvRW1lcmdlbmN5T3JhY2xlQWRkcmVzcwUNY2FsbGVyQWRkcmVzcwkBAiE9AgkApQgBBRJnb3Zlcm5hbmNlQ29udHJhY3QFDWNhbGxlckFkZHJlc3MHCQACAQI9Y2FsbGVyIG11c3QgYmUgb25lIGFuIGVtZXJnZW5jeSBvcmFjbGUgb3IgR292ZXJuYW5jZSBjb250cmFjdAkAzAgCCQEMQm9vbGVhbkVudHJ5AgIKaXNfYmxvY2tlZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgIRaXNfYmxvY2tlZF9jYWxsZXIFDWNhbGxlckFkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgIRaXNfYmxvY2tlZF9yZWFzb24FBnJlYXNvbgUDbmlsAWkBFGZpbmFsaXplQ3VycmVudFByaWNlCgZwcmljZTEFc2lnbjEGcHJpY2UyBXNpZ24yBnByaWNlMwVzaWduMwZwcmljZTQFc2lnbjQGcHJpY2U1BXNpZ241AwUJaXNCbG9ja2VkCQACAQJaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwkBAiE9AgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgICBnByaWNlXwkApAMBBQZoZWlnaHQAAAAACQACAQIPd2FpdCBuZXh0IGJsb2NrAwkBAiE9AgkAkQMCBRFwdWJLZXlPcmFjbGVzTGlzdAkAagIFBmhlaWdodAAFCQDYBAEIBQFpD2NhbGxlclB1YmxpY0tleQkAAgEJAKwCAgkArAICCQCsAgICGk91dCBvZiB0dXJuIGZpbmFsaXphdGlvbjogCQCkAwEFBmhlaWdodAIdIGJsb2NrIHNob3VsZCBiZSBmaW5hbGl6ZSBieSAJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QJAGoCBQZoZWlnaHQABQQGcHJpY2VzCQDMCAIDCQDEEwMJARJmb3JtYXR0aW5nUHJpY2VNc2cBBQZwcmljZTEFBXNpZ24xCQDZBAEJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QAAAUGcHJpY2UxAAAJAMwIAgMJAMQTAwkBEmZvcm1hdHRpbmdQcmljZU1zZwEFBnByaWNlMgUFc2lnbjIJANkEAQkAkQMCBRFwdWJLZXlPcmFjbGVzTGlzdAABBQZwcmljZTIAAAkAzAgCAwkAxBMDCQESZm9ybWF0dGluZ1ByaWNlTXNnAQUGcHJpY2UzBQVzaWduMwkA2QQBCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0AAIFBnByaWNlMwAACQDMCAIDCQDEEwMJARJmb3JtYXR0aW5nUHJpY2VNc2cBBQZwcmljZTQFBXNpZ240CQDZBAEJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QAAwUGcHJpY2U0AAAJAMwIAgMJAMQTAwkBEmZvcm1hdHRpbmdQcmljZU1zZwEFBnByaWNlNQUFc2lnbjUJANkEAQkAkQMCBRFwdWJLZXlPcmFjbGVzTGlzdAAEBQZwcmljZTUAAAUDbmlsBA56ZXJvUHJpY2VDb3VudAMJAAACCQCRAwIFBnByaWNlcwAAAAAAAQkAZAIAAAMJAAACCQCRAwIFBnByaWNlcwABAAAAAQkAZAIAAAMJAAACCQCRAwIFBnByaWNlcwACAAAAAQkAZAIAAAMJAAACCQCRAwIFBnByaWNlcwADAAAAAQkAZAIAAAMJAAACCQCRAwIFBnByaWNlcwAEAAAAAQAAAwkAZwIFDnplcm9QcmljZUNvdW50AAMJAAIBAiAzIHByaWNlcyBvciBtb3JlIGFyZSBlcXVhbHMgdG8gMAQNcHJpY2VzSW5SYW5nZQkBEWZpbmRQcmljZXNJblJhbmdlAQUGcHJpY2VzBBNwcmljZVByb3ZpZGluZ0NvdW50CQCQAwEFDXByaWNlc0luUmFuZ2UDCQBmAgADBRNwcmljZVByb3ZpZGluZ0NvdW50CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgI6Q291bGQgbm90IGZpbmFsaXplIHByaWNlIGJlY2F1c2Ugb2YgYmlnIHZhcmlhdGlvbjogaGVpZ2h0PQkApAMBBQZoZWlnaHQCAQoJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QAAAIBPQkApAMBCQCRAwIFBnByaWNlcwAAAgEKCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0AAECAT0JAKQDAQkAkQMCBQZwcmljZXMAAQIBCgkAkQMCBRFwdWJLZXlPcmFjbGVzTGlzdAACAgE9CQCkAwEJAJEDAgUGcHJpY2VzAAICAQoJAJEDAgURcHViS2V5T3JhY2xlc0xpc3QAAwIBPQkApAMBCQCRAwIFBnByaWNlcwADAgEKCQCRAwIFEXB1YktleU9yYWNsZXNMaXN0AAQCAT0JAKQDAQkAkQMCBQZwcmljZXMABAQEc3VtMQkAZAIJAGQCCQCRAwIFBnByaWNlcwkAkQMCBQ1wcmljZXNJblJhbmdlAAAJAJEDAgUGcHJpY2VzCQCRAwIFDXByaWNlc0luUmFuZ2UAAQkAkQMCBQZwcmljZXMJAJEDAgUNcHJpY2VzSW5SYW5nZQACBARzdW0yAwkAZwIFE3ByaWNlUHJvdmlkaW5nQ291bnQABAkAZAIFBHN1bTEJAJEDAgUGcHJpY2VzCQCRAwIFDXByaWNlc0luUmFuZ2UAAwUEc3VtMQQIcHJpY2VTdW0DCQBnAgUTcHJpY2VQcm92aWRpbmdDb3VudAAFCQBkAgUEc3VtMgkAkQMCBQZwcmljZXMJAJEDAgUNcHJpY2VzSW5SYW5nZQAEBQRzdW0yAwkAZwIFE3ByaWNlUHJvdmlkaW5nQ291bnQABgkAAgECHkludmFsaWQgcHJpY2VzSW5SYW5nZSBjcmVhdGlvbgQIbmV3UHJpY2UJAGkCBQhwcmljZVN1bQUTcHJpY2VQcm92aWRpbmdDb3VudAQKd3hVc2RUdXBsZQkBFGZpbmFsaXplV3hVc2RPbmNoYWluAQUIbmV3UHJpY2UEDW5ld1d4VXNkUHJpY2UIBQp3eFVzZFR1cGxlAl8xBAd3eERlYnVnCAUKd3hVc2RUdXBsZQJfMgMDCQBnAgUIbmV3UHJpY2UJAGQCBQVwcmljZQkAaQIJAGgCBQVwcmljZQUScGVyY2VudFByaWNlT2Zmc2V0AGQGCQBnAgkAZQIFBXByaWNlCQBpAgkAaAIFBXByaWNlBRJwZXJjZW50UHJpY2VPZmZzZXQAZAUIbmV3UHJpY2UEBnJlYXNvbgI/YXV0b21hdGljIGVtZXJnZW5jeSBzaHV0ZG93biBiZWNhdXNlIG9mIGxhcmdlIHByaWNlIHZhcmlhYmlsaXR5CQDMCAIJAQxCb29sZWFuRW50cnkCAgppc19ibG9ja2VkBgkAzAgCCQELU3RyaW5nRW50cnkCAhFpc19ibG9ja2VkX2NhbGxlcgkApQgBBQR0aGlzCQDMCAIJAQtTdHJpbmdFbnRyeQICEWlzX2Jsb2NrZWRfcmVhc29uBQZyZWFzb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAhFibGFja19zd2FybV9wcmljZQIBXwkApAMBBQZoZWlnaHQFCG5ld1ByaWNlBQNuaWwEDW5ld1ByaWNlSW5kZXgJAGQCBQpwcmljZUluZGV4AAEJAM0IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQICBXByaWNlBQhuZXdQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAgZwcmljZV8JAKQDAQUGaGVpZ2h0BQhuZXdQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAgxwcmljZV9pbmRleF8JAKQDAQUNbmV3UHJpY2VJbmRleAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCAgtwcmljZV9pbmRleAUNbmV3UHJpY2VJbmRleAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAg5pbmRleEJ5SGVpZ2h0XwkApAMBBQZoZWlnaHQFDW5ld1ByaWNlSW5kZXgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgINcHJpY2VCeUluZGV4XwkApAMBBQ1uZXdQcmljZUluZGV4BQhuZXdQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAghkZWZpY2l0XwkApAMBBQZoZWlnaHQFB2RlZmljaXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPbmV1dHJpbm9TdXBwbHlfCQCkAwEFBmhlaWdodAUObmV1dHJpbm9TdXBwbHkJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIQZGVmaWNpdF9wZXJjZW50XwkApAMBBQZoZWlnaHQDCQECIT0CBQ5uZXV0cmlub1N1cHBseQAACQBpAgkAaAIFB2RlZmljaXQAZAUObmV1dHJpbm9TdXBwbHkAAAUDbmlsCQEKUHJpY2VFbnRyeQMFCG5ld1ByaWNlAgVXQVZFUwUNbmV3UHJpY2VJbmRleAkBClByaWNlRW50cnkDBQ1uZXdXeFVzZFByaWNlBQd3eElkU3RyBQ1uZXdQcmljZUluZGV4CQELU3RyaW5nRW50cnkCAg9kZWJ1Z193eFVzZENhbGMFB3d4RGVidWcBAnR4AQZ2ZXJpZnkABBNwdWJLZXlBZG1pbnNMaXN0U3RyCQC5CQIJAMwIAgIsR0pkTFNhTGl2NUs3eHVlamFjOG1jUmNIb3lvM2RQckVTcnZrdEczYTZNQVIJAMwIAgIsRVl3Wm1VUmQ1S0thUVJCanNWYTZnOERQaXNGb1M2U292Ukp0RmlMNWdNSFUJAMwIAgIsRHRtQWZ1RGRDckhLOHNwZEFlQVl6cTZNc1plZ2VEOWduc3JwdVRSa0NiVkEJAMwIAgIsNVdSWEZTandjVGJOZktjSnM4WnFYbVNTV1lzU1ZKVXRNdk1xWmo1aEg0TmMFA25pbAUDU0VQBBBwdWJLZXlBZG1pbnNMaXN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPY29udHJvbENvbnRyYWN0Agwlc19fbXVsdGlzaWcFE3B1YktleUFkbWluc0xpc3RTdHIFA1NFUAQFY291bnQJAGQCCQBkAgkAZAIDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAAAAAEAAAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEJANkEAQkAkQMCBRBwdWJLZXlBZG1pbnNMaXN0AAEAAQAAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAgkA2QQBCQCRAwIFEHB1YktleUFkbWluc0xpc3QAAgABAAADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwADCQDZBAEJAJEDAgUQcHViS2V5QWRtaW5zTGlzdAADAAIAAAkAZwIFBWNvdW50AAMYonnn", "chainId": 87, "height": 3537633, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 52aBVp65DXHa3B9Dbdtwcwqnqg5UUNqWfdZzm94jbY3G Next: 2KJKPe3LSnJXEhPZyBvTH3EG14sJs5UCWCNH7p2Vcsne Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "c556dd7e5f6e83db072aec698b7b12b2b942a395"
4+let revisionNum = "94dfcf3fa922d31919ff74dede4bfe7bb8347832"
55
66 let SEP = "__"
77
3131
3232 let IdxControlCfgGovernanceDapp = 13
3333
34+let IdxControlCfgPegProviderDapp = 14
35+
3436 func keyControlConfig () = "%s__controlConfig"
3537
3638
37-func dataControlCfg (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract) = makeString(["%s%s%s%s%s%s%s%s%s%s%s%s%s", neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract], SEP)
39+func dataControlCfg (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract,doraContract) = makeString(["%s%s%s%s%s%s%s%s%s%s%s%s%s%s", neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract, doraContract], SEP)
3840
3941
4042 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 1000000), 1000000, 100000000)
6769
6870 let neutrinoAsset = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
6971
72+let wxIdStr = "Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on"
73+
74+let wxId = fromBase58String(wxIdStr)
75+
7076 let controlContract = this
7177
7278 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
7581 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
7682
7783
78-let controlCfg = split(getStringOrFail(this, keyControlConfig()), SEP)
84+let controlCfg = split_4C(getStringOrFail(this, keyControlConfig()), SEP)
7985
8086 let governanceContract = getContractAddressOrFail(controlCfg, IdxControlCfgGovernanceDapp)
8187
259265 func formattingPriceMsg (price) = toBytes((((("WAVESNEUTRINOPREFIX" + "_") + toString(height)) + "_") + toString(price)))
260266
261267
268+func PriceEntry (newPrice,assetIdStr,newPriceIndex) = {
269+ let heightStr = toString(height)
270+ let newPriceIndexStr = toString(newPriceIndex)
271+ let priceByAssetKEY = makeString(["%s%s%s__common__priceByAsset", assetIdStr], SEP)
272+ let priceByHeightKEY = makeString(["%s%s%s%d__common__priceByHeight", assetIdStr, heightStr], SEP)
273+ let priceByIndexKEY = makeString(["%s%s%s%d__common__priceByIndex", assetIdStr, newPriceIndexStr], SEP)
274+[IntegerEntry(priceByAssetKEY, newPrice), IntegerEntry(priceByIndexKEY, newPrice), IntegerEntry(priceByHeightKEY, newPrice)]
275+ }
276+
277+
278+func finalizeWxUsdOnchain (wavesUsdPriceX6) = {
279+ let doraAddressStr = "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF"
280+ let doraAddress = addressFromStringValue(doraAddressStr)
281+ let xtnUsdPriceX6 = valueOrErrorMessage(getInteger(doraAddress, "%s%s__price__USDN-USDT"), "DORA doesn't contain USDN/USDT price")
282+ let xtnId = neutrinoAsset
283+ let xtnIdStr = toBase58String(xtnId)
284+ let wx_WxWaves_AddressStr = "3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh"
285+ let wx_WxWaves_Address = addressFromStringValue(wx_WxWaves_AddressStr)
286+ let wx_WxWaves_Weight = 50000
287+ let wx_WxWaves_WAVESx8 = wavesBalance(wx_WxWaves_Address).regular
288+ let wx_WxWaves_WXx8 = assetBalance(wx_WxWaves_Address, wxId)
289+ let wx_WxWaves_WxUsdPriceX6 = fraction(wx_WxWaves_WAVESx8, wavesUsdPriceX6, wx_WxWaves_WXx8)
290+ let wx_WxXtn_AddressStr = "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99"
291+ let wx_WxXtn_Address = addressFromStringValue(wx_WxXtn_AddressStr)
292+ let wx_WxXtn_Weight = 50000
293+ let wx_WxXtn_XTNx6 = assetBalance(wx_WxXtn_Address, xtnId)
294+ let wx_WxXtn_WXx8 = assetBalance(wx_WxXtn_Address, wxId)
295+ let wx_WxXtn_WxUsdPriceX6 = fraction((wx_WxXtn_XTNx6 * 100), xtnUsdPriceX6, wx_WxXtn_WXx8)
296+ let swop_WxXtn_AddressStr = "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R"
297+ let swopRestDapp = addressFromStringValue("3P56jNQzECXnrWpnbbSJKw7Eooo6fkUaMPp")
298+ let swop_WxXtn_Weight = 5000
299+ let swop_WxXtn_WxXtnPriceX6 = {
300+ let @ = invoke(swopRestDapp, "calcGetAmountCPMM", [swop_WxXtn_AddressStr, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", wxIdStr, 100000000], nil)
301+ if ($isInstanceOf(@, "Int"))
302+ then @
303+ else throw(($getType(@) + " couldn't be cast to Int"))
304+ }
305+ let swop_WxXtn_WxUsdPriceX6 = fraction(swop_WxXtn_WxXtnPriceX6, xtnUsdPriceX6, 1000000)
306+ let W = ((wx_WxWaves_Weight + wx_WxXtn_Weight) + swop_WxXtn_Weight)
307+ let wxUsdPriceX6 = ((fraction(wx_WxWaves_WxUsdPriceX6, wx_WxWaves_Weight, W) + fraction(wx_WxXtn_WxUsdPriceX6, wx_WxXtn_Weight, W)) + fraction(swop_WxXtn_WxUsdPriceX6, swop_WxXtn_Weight, W))
308+ let debug = ((((((("xtnUsdPriceX6=" + toString(xtnUsdPriceX6)) + " wx_WxWaves_WxUsdPriceX6=") + toString(wx_WxWaves_WxUsdPriceX6)) + " wx_WxXtn_WxUsdPriceX6=") + toString(wx_WxXtn_WxUsdPriceX6)) + " swop_WxXtn_WxUsdPriceX6=") + toString(swop_WxXtn_WxUsdPriceX6))
309+ $Tuple2(wxUsdPriceX6, debug)
310+ }
311+
312+
262313 @Callable(i)
263-func constructor (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract) = if ((i.caller != this))
314+func constructorV1 (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract,doraContract) = if ((i.caller != this))
264315 then throw("permissions denied")
265- else [StringEntry(keyControlConfig(), dataControlCfg(neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract))]
316+ else [StringEntry(keyControlConfig(), dataControlCfg(neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract, doraContract))]
266317
267318
268319
333384 then throw("Invalid pricesInRange creation")
334385 else {
335386 let newPrice = (priceSum / priceProvidingCount)
387+ let wxUsdTuple = finalizeWxUsdOnchain(newPrice)
388+ let newWxUsdPrice = wxUsdTuple._1
389+ let wxDebug = wxUsdTuple._2
336390 if (if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
337391 then true
338392 else ((price - ((price * percentPriceOffset) / 100)) >= newPrice))
342396 }
343397 else {
344398 let newPriceIndex = (priceIndex + 1)
345-[IntegerEntry("price", newPrice), IntegerEntry(("price_" + toString(height)), newPrice), IntegerEntry("price_index", newPriceIndex), IntegerEntry(("price_index_" + toString(newPriceIndex)), height), IntegerEntry(("deficit_" + toString(height)), deficit), IntegerEntry(("neutrinoSupply_" + toString(height)), neutrinoSupply), IntegerEntry(("deficit_percent_" + toString(height)), if ((neutrinoSupply != 0))
399+ ((([IntegerEntry("price", newPrice), IntegerEntry(("price_" + toString(height)), newPrice), IntegerEntry(("price_index_" + toString(newPriceIndex)), height), IntegerEntry("price_index", newPriceIndex), IntegerEntry(("indexByHeight_" + toString(height)), newPriceIndex), IntegerEntry(("priceByIndex_" + toString(newPriceIndex)), newPrice), IntegerEntry(("deficit_" + toString(height)), deficit), IntegerEntry(("neutrinoSupply_" + toString(height)), neutrinoSupply), IntegerEntry(("deficit_percent_" + toString(height)), if ((neutrinoSupply != 0))
346400 then ((deficit * 100) / neutrinoSupply)
347- else 0)]
401+ else 0)] ++ PriceEntry(newPrice, "WAVES", newPriceIndex)) ++ PriceEntry(newWxUsdPrice, wxIdStr, newPriceIndex)) :+ StringEntry("debug_wxUsdCalc", wxDebug))
348402 }
349403 }
350404 }
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "c556dd7e5f6e83db072aec698b7b12b2b942a395"
4+let revisionNum = "94dfcf3fa922d31919ff74dede4bfe7bb8347832"
55
66 let SEP = "__"
77
88 let IdxControlCfgNeutrinoDapp = 1
99
1010 let IdxControlCfgAuctionDapp = 2
1111
1212 let IdxControlCfgRpdDapp = 3
1313
1414 let IdxControlCfgMathDapp = 4
1515
1616 let IdxControlCfgLiquidationDapp = 5
1717
1818 let IdxControlCfgRestDapp = 6
1919
2020 let IdxControlCfgNodeRegistryDapp = 7
2121
2222 let IdxControlCfgNsbtStakingDapp = 8
2323
2424 let IdxControlCfgMediatorDapp = 9
2525
2626 let IdxControlCfgSurfStakingDapp = 10
2727
2828 let IdxControlCfgGnsbtControllerDapp = 11
2929
3030 let IdxControlCfgRestV2Dapp = 12
3131
3232 let IdxControlCfgGovernanceDapp = 13
3333
34+let IdxControlCfgPegProviderDapp = 14
35+
3436 func keyControlConfig () = "%s__controlConfig"
3537
3638
37-func dataControlCfg (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract) = makeString(["%s%s%s%s%s%s%s%s%s%s%s%s%s", neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract], SEP)
39+func dataControlCfg (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract,doraContract) = makeString(["%s%s%s%s%s%s%s%s%s%s%s%s%s%s", neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract, doraContract], SEP)
3840
3941
4042 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 1000000), 1000000, 100000000)
4143
4244
4345 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(addressFromStringValue(address), key), 0)
4446
4547
4648 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
4749
4850
4951 func convertJsonArrayToList (jsonArray) = split(jsonArray, ",")
5052
5153
5254 let price = valueOrElse(getInteger(this, "price"), 0)
5355
5456 let priceIndex = valueOrElse(getInteger(this, "price_index"), 0)
5557
5658 let isBlocked = valueOrElse(getBoolean(this, "is_blocked"), false)
5759
5860 let percentPriceOffset = 7
5961
6062 let pubKeyOracles = valueOrElse(getString(this, "oracles"), "")
6163
6264 let pubKeyOraclesList = convertJsonArrayToList(pubKeyOracles)
6365
6466 let neutrinoAddress = Address(base58'3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo')
6567
6668 let liquidationAddress = Address(base58'3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7')
6769
6870 let neutrinoAsset = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
6971
72+let wxIdStr = "Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on"
73+
74+let wxId = fromBase58String(wxIdStr)
75+
7076 let controlContract = this
7177
7278 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
7379
7480
7581 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
7682
7783
78-let controlCfg = split(getStringOrFail(this, keyControlConfig()), SEP)
84+let controlCfg = split_4C(getStringOrFail(this, keyControlConfig()), SEP)
7985
8086 let governanceContract = getContractAddressOrFail(controlCfg, IdxControlCfgGovernanceDapp)
8187
8288 let neutrinoLockedBalance = valueOrElse(getInteger(neutrinoAddress, "balance_lock_neutrino"), 0)
8389
8490 let wavesLockedBalance = valueOrElse(getInteger(neutrinoAddress, "balance_lock_waves"), 0)
8591
8692 let reserve = (wavesBalance(neutrinoAddress).regular - wavesLockedBalance)
8793
8894 let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAsset)).quantity) - assetBalance(neutrinoAddress, neutrinoAsset)) - assetBalance(liquidationAddress, neutrinoAsset))
8995
9096 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, price))
9197
9298 func findPricesInRange (prices) = {
9399 let minPercentBound = 90
94100 let maxPercentBound = 110
95101 let p0 = prices[0]
96102 let check0 = if ((0 >= prices[0]))
97103 then [0]
98104 else {
99105 let p01 = ((prices[1] * 100) / p0)
100106 let p02 = ((prices[2] * 100) / p0)
101107 let p03 = ((prices[3] * 100) / p0)
102108 let p04 = ((prices[4] * 100) / p0)
103109 let array1 = if (if ((maxPercentBound > p01))
104110 then (p01 > minPercentBound)
105111 else false)
106112 then [1, 0]
107113 else [0]
108114 let array2 = if (if ((maxPercentBound > p02))
109115 then (p02 > minPercentBound)
110116 else false)
111117 then 2 :: array1
112118 else array1
113119 let array3 = if (if ((maxPercentBound > p03))
114120 then (p03 > minPercentBound)
115121 else false)
116122 then 3 :: array2
117123 else array2
118124 if (if ((maxPercentBound > p04))
119125 then (p04 > minPercentBound)
120126 else false)
121127 then 4 :: array3
122128 else array3
123129 }
124130 let check1 = if ((size(check0) >= 3))
125131 then check0
126132 else {
127133 let p1 = prices[1]
128134 if ((0 >= p1))
129135 then [1]
130136 else {
131137 let p10 = ((prices[0] * 100) / p1)
132138 let p12 = ((prices[2] * 100) / p1)
133139 let p13 = ((prices[3] * 100) / p1)
134140 let p14 = ((prices[4] * 100) / p1)
135141 let array1 = if (if ((maxPercentBound > p10))
136142 then (p10 > minPercentBound)
137143 else false)
138144 then [0, 1]
139145 else [1]
140146 let array2 = if (if ((maxPercentBound > p12))
141147 then (p12 > minPercentBound)
142148 else false)
143149 then 2 :: array1
144150 else array1
145151 let array3 = if (if ((maxPercentBound > p13))
146152 then (p13 > minPercentBound)
147153 else false)
148154 then 3 :: array2
149155 else array2
150156 if (if ((maxPercentBound > p14))
151157 then (p14 > minPercentBound)
152158 else false)
153159 then 4 :: array3
154160 else array3
155161 }
156162 }
157163 let check2 = if ((size(check1) >= 3))
158164 then check1
159165 else {
160166 let p2 = prices[2]
161167 if ((0 >= p2))
162168 then [2]
163169 else {
164170 let p20 = ((prices[0] * 100) / p2)
165171 let p21 = ((prices[1] * 100) / p2)
166172 let p23 = ((prices[3] * 100) / p2)
167173 let p24 = ((prices[4] * 100) / p2)
168174 let array1 = if (if ((maxPercentBound > p20))
169175 then (p20 > minPercentBound)
170176 else false)
171177 then [0, 2]
172178 else [2]
173179 let array2 = if (if ((maxPercentBound > p21))
174180 then (p21 > minPercentBound)
175181 else false)
176182 then 1 :: array1
177183 else array1
178184 let array3 = if (if ((maxPercentBound > p23))
179185 then (p23 > minPercentBound)
180186 else false)
181187 then 3 :: array2
182188 else array2
183189 if (if ((maxPercentBound > p24))
184190 then (p24 > minPercentBound)
185191 else false)
186192 then 4 :: array3
187193 else array3
188194 }
189195 }
190196 let check3 = if ((size(check2) >= 3))
191197 then check2
192198 else {
193199 let p3 = prices[3]
194200 if ((0 >= p3))
195201 then [3]
196202 else {
197203 let p30 = ((prices[0] * 100) / p3)
198204 let p31 = ((prices[1] * 100) / p3)
199205 let p32 = ((prices[2] * 100) / p3)
200206 let p34 = ((prices[4] * 100) / p3)
201207 let array1 = if (if ((maxPercentBound > p30))
202208 then (p30 > minPercentBound)
203209 else false)
204210 then [0, 3]
205211 else [3]
206212 let array2 = if (if ((maxPercentBound > p31))
207213 then (p31 > minPercentBound)
208214 else false)
209215 then 1 :: array1
210216 else array1
211217 let array3 = if (if ((maxPercentBound > p32))
212218 then (p32 > minPercentBound)
213219 else false)
214220 then 2 :: array2
215221 else array2
216222 if (if ((maxPercentBound > p34))
217223 then (p34 > minPercentBound)
218224 else false)
219225 then 4 :: array3
220226 else array3
221227 }
222228 }
223229 if ((size(check3) >= 3))
224230 then check3
225231 else {
226232 let p4 = prices[4]
227233 if ((0 >= p4))
228234 then [4]
229235 else {
230236 let p40 = ((prices[0] * 100) / p4)
231237 let p41 = ((prices[1] * 100) / p4)
232238 let p42 = ((prices[2] * 100) / p4)
233239 let p43 = ((prices[3] * 100) / p4)
234240 let array1 = if (if ((maxPercentBound > p40))
235241 then (p40 > minPercentBound)
236242 else false)
237243 then [0, 4]
238244 else [4]
239245 let array2 = if (if ((maxPercentBound > p41))
240246 then (p41 > minPercentBound)
241247 else false)
242248 then 1 :: array1
243249 else array1
244250 let array3 = if (if ((maxPercentBound > p42))
245251 then (p42 > minPercentBound)
246252 else false)
247253 then 2 :: array2
248254 else array2
249255 if (if ((maxPercentBound > p43))
250256 then (p43 > minPercentBound)
251257 else false)
252258 then 3 :: array3
253259 else array3
254260 }
255261 }
256262 }
257263
258264
259265 func formattingPriceMsg (price) = toBytes((((("WAVESNEUTRINOPREFIX" + "_") + toString(height)) + "_") + toString(price)))
260266
261267
268+func PriceEntry (newPrice,assetIdStr,newPriceIndex) = {
269+ let heightStr = toString(height)
270+ let newPriceIndexStr = toString(newPriceIndex)
271+ let priceByAssetKEY = makeString(["%s%s%s__common__priceByAsset", assetIdStr], SEP)
272+ let priceByHeightKEY = makeString(["%s%s%s%d__common__priceByHeight", assetIdStr, heightStr], SEP)
273+ let priceByIndexKEY = makeString(["%s%s%s%d__common__priceByIndex", assetIdStr, newPriceIndexStr], SEP)
274+[IntegerEntry(priceByAssetKEY, newPrice), IntegerEntry(priceByIndexKEY, newPrice), IntegerEntry(priceByHeightKEY, newPrice)]
275+ }
276+
277+
278+func finalizeWxUsdOnchain (wavesUsdPriceX6) = {
279+ let doraAddressStr = "3PKkojKdd6BBzTf1RXbQVfUDraNFXXHKzQF"
280+ let doraAddress = addressFromStringValue(doraAddressStr)
281+ let xtnUsdPriceX6 = valueOrErrorMessage(getInteger(doraAddress, "%s%s__price__USDN-USDT"), "DORA doesn't contain USDN/USDT price")
282+ let xtnId = neutrinoAsset
283+ let xtnIdStr = toBase58String(xtnId)
284+ let wx_WxWaves_AddressStr = "3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh"
285+ let wx_WxWaves_Address = addressFromStringValue(wx_WxWaves_AddressStr)
286+ let wx_WxWaves_Weight = 50000
287+ let wx_WxWaves_WAVESx8 = wavesBalance(wx_WxWaves_Address).regular
288+ let wx_WxWaves_WXx8 = assetBalance(wx_WxWaves_Address, wxId)
289+ let wx_WxWaves_WxUsdPriceX6 = fraction(wx_WxWaves_WAVESx8, wavesUsdPriceX6, wx_WxWaves_WXx8)
290+ let wx_WxXtn_AddressStr = "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99"
291+ let wx_WxXtn_Address = addressFromStringValue(wx_WxXtn_AddressStr)
292+ let wx_WxXtn_Weight = 50000
293+ let wx_WxXtn_XTNx6 = assetBalance(wx_WxXtn_Address, xtnId)
294+ let wx_WxXtn_WXx8 = assetBalance(wx_WxXtn_Address, wxId)
295+ let wx_WxXtn_WxUsdPriceX6 = fraction((wx_WxXtn_XTNx6 * 100), xtnUsdPriceX6, wx_WxXtn_WXx8)
296+ let swop_WxXtn_AddressStr = "3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R"
297+ let swopRestDapp = addressFromStringValue("3P56jNQzECXnrWpnbbSJKw7Eooo6fkUaMPp")
298+ let swop_WxXtn_Weight = 5000
299+ let swop_WxXtn_WxXtnPriceX6 = {
300+ let @ = invoke(swopRestDapp, "calcGetAmountCPMM", [swop_WxXtn_AddressStr, "3P88qk1KzF1BKjD7fC7LjNVAKM4ezff5WE6", wxIdStr, 100000000], nil)
301+ if ($isInstanceOf(@, "Int"))
302+ then @
303+ else throw(($getType(@) + " couldn't be cast to Int"))
304+ }
305+ let swop_WxXtn_WxUsdPriceX6 = fraction(swop_WxXtn_WxXtnPriceX6, xtnUsdPriceX6, 1000000)
306+ let W = ((wx_WxWaves_Weight + wx_WxXtn_Weight) + swop_WxXtn_Weight)
307+ let wxUsdPriceX6 = ((fraction(wx_WxWaves_WxUsdPriceX6, wx_WxWaves_Weight, W) + fraction(wx_WxXtn_WxUsdPriceX6, wx_WxXtn_Weight, W)) + fraction(swop_WxXtn_WxUsdPriceX6, swop_WxXtn_Weight, W))
308+ let debug = ((((((("xtnUsdPriceX6=" + toString(xtnUsdPriceX6)) + " wx_WxWaves_WxUsdPriceX6=") + toString(wx_WxWaves_WxUsdPriceX6)) + " wx_WxXtn_WxUsdPriceX6=") + toString(wx_WxXtn_WxUsdPriceX6)) + " swop_WxXtn_WxUsdPriceX6=") + toString(swop_WxXtn_WxUsdPriceX6))
309+ $Tuple2(wxUsdPriceX6, debug)
310+ }
311+
312+
262313 @Callable(i)
263-func constructor (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract) = if ((i.caller != this))
314+func constructorV1 (neutrinoContract,auctionContract,rpdContract,mathContract,liquidationContract,restContract,nodeRegistryContract,nsbtStakingContract,mediatorContract,surfStakingContract,gnsbtControllerContract,restV2Contract,governanceContract,doraContract) = if ((i.caller != this))
264315 then throw("permissions denied")
265- else [StringEntry(keyControlConfig(), dataControlCfg(neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract))]
316+ else [StringEntry(keyControlConfig(), dataControlCfg(neutrinoContract, auctionContract, rpdContract, mathContract, liquidationContract, restContract, nodeRegistryContract, nsbtStakingContract, mediatorContract, surfStakingContract, gnsbtControllerContract, restV2Contract, governanceContract, doraContract))]
266317
267318
268319
269320 @Callable(i)
270321 func callEmergencyShutdown (reason) = {
271322 let AutoEmergencyOracleAddress = "3P7ihFVxBNbHK237TNdPxT1xHEu8pHexXTr"
272323 let callerAddress = toString(i.caller)
273324 if (if ((AutoEmergencyOracleAddress != callerAddress))
274325 then (toString(governanceContract) != callerAddress)
275326 else false)
276327 then throw("caller must be one an emergency oracle or Governance contract")
277328 else [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", callerAddress), StringEntry("is_blocked_reason", reason)]
278329 }
279330
280331
281332
282333 @Callable(i)
283334 func finalizeCurrentPrice (price1,sign1,price2,sign2,price3,sign3,price4,sign4,price5,sign5) = if (isBlocked)
284335 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
285336 else if ((valueOrElse(getInteger(this, ("price_" + toString(height))), 0) != 0))
286337 then throw("wait next block")
287338 else if ((pubKeyOraclesList[(height % 5)] != toBase58String(i.callerPublicKey)))
288339 then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % 5)]))
289340 else {
290341 let prices = [if (sigVerify_8Kb(formattingPriceMsg(price1), sign1, fromBase58String(pubKeyOraclesList[0])))
291342 then price1
292343 else 0, if (sigVerify_8Kb(formattingPriceMsg(price2), sign2, fromBase58String(pubKeyOraclesList[1])))
293344 then price2
294345 else 0, if (sigVerify_8Kb(formattingPriceMsg(price3), sign3, fromBase58String(pubKeyOraclesList[2])))
295346 then price3
296347 else 0, if (sigVerify_8Kb(formattingPriceMsg(price4), sign4, fromBase58String(pubKeyOraclesList[3])))
297348 then price4
298349 else 0, if (sigVerify_8Kb(formattingPriceMsg(price5), sign5, fromBase58String(pubKeyOraclesList[4])))
299350 then price5
300351 else 0]
301352 let zeroPriceCount = if ((prices[0] == 0))
302353 then 1
303354 else (0 + (if ((prices[1] == 0))
304355 then 1
305356 else (0 + (if ((prices[2] == 0))
306357 then 1
307358 else (0 + (if ((prices[3] == 0))
308359 then 1
309360 else (0 + (if ((prices[4] == 0))
310361 then 1
311362 else 0))))))))
312363 if ((zeroPriceCount >= 3))
313364 then throw("3 prices or more are equals to 0")
314365 else {
315366 let pricesInRange = findPricesInRange(prices)
316367 let priceProvidingCount = size(pricesInRange)
317368 if ((3 > priceProvidingCount))
318369 then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + "
319370 ") + pubKeyOraclesList[0]) + "=") + toString(prices[0])) + "
320371 ") + pubKeyOraclesList[1]) + "=") + toString(prices[1])) + "
321372 ") + pubKeyOraclesList[2]) + "=") + toString(prices[2])) + "
322373 ") + pubKeyOraclesList[3]) + "=") + toString(prices[3])) + "
323374 ") + pubKeyOraclesList[4]) + "=") + toString(prices[4])))
324375 else {
325376 let sum1 = ((prices[pricesInRange[0]] + prices[pricesInRange[1]]) + prices[pricesInRange[2]])
326377 let sum2 = if ((priceProvidingCount >= 4))
327378 then (sum1 + prices[pricesInRange[3]])
328379 else sum1
329380 let priceSum = if ((priceProvidingCount >= 5))
330381 then (sum2 + prices[pricesInRange[4]])
331382 else sum2
332383 if ((priceProvidingCount >= 6))
333384 then throw("Invalid pricesInRange creation")
334385 else {
335386 let newPrice = (priceSum / priceProvidingCount)
387+ let wxUsdTuple = finalizeWxUsdOnchain(newPrice)
388+ let newWxUsdPrice = wxUsdTuple._1
389+ let wxDebug = wxUsdTuple._2
336390 if (if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
337391 then true
338392 else ((price - ((price * percentPriceOffset) / 100)) >= newPrice))
339393 then {
340394 let reason = "automatic emergency shutdown because of large price variability"
341395 [BooleanEntry("is_blocked", true), StringEntry("is_blocked_caller", toString(this)), StringEntry("is_blocked_reason", reason), IntegerEntry((("black_swarm_price" + "_") + toString(height)), newPrice)]
342396 }
343397 else {
344398 let newPriceIndex = (priceIndex + 1)
345-[IntegerEntry("price", newPrice), IntegerEntry(("price_" + toString(height)), newPrice), IntegerEntry("price_index", newPriceIndex), IntegerEntry(("price_index_" + toString(newPriceIndex)), height), IntegerEntry(("deficit_" + toString(height)), deficit), IntegerEntry(("neutrinoSupply_" + toString(height)), neutrinoSupply), IntegerEntry(("deficit_percent_" + toString(height)), if ((neutrinoSupply != 0))
399+ ((([IntegerEntry("price", newPrice), IntegerEntry(("price_" + toString(height)), newPrice), IntegerEntry(("price_index_" + toString(newPriceIndex)), height), IntegerEntry("price_index", newPriceIndex), IntegerEntry(("indexByHeight_" + toString(height)), newPriceIndex), IntegerEntry(("priceByIndex_" + toString(newPriceIndex)), newPrice), IntegerEntry(("deficit_" + toString(height)), deficit), IntegerEntry(("neutrinoSupply_" + toString(height)), neutrinoSupply), IntegerEntry(("deficit_percent_" + toString(height)), if ((neutrinoSupply != 0))
346400 then ((deficit * 100) / neutrinoSupply)
347- else 0)]
401+ else 0)] ++ PriceEntry(newPrice, "WAVES", newPriceIndex)) ++ PriceEntry(newWxUsdPrice, wxIdStr, newPriceIndex)) :+ StringEntry("debug_wxUsdCalc", wxDebug))
348402 }
349403 }
350404 }
351405 }
352406 }
353407
354408
355409 @Verifier(tx)
356410 func verify () = {
357411 let pubKeyAdminsListStr = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
358412 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
359413 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
360414 then 1
361415 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
362416 then 1
363417 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
364418 then 1
365419 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
366420 then 2
367421 else 0))
368422 (count >= 3)
369423 }
370424

github/deemru/w8io/786bc32 
56.32 ms