tx · FqCyvpppz29Jz1RRhDknrvmM7QhkV9XL3QrKsLd1D4bT

3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh:  -0.02600000 Waves

2023.08.30 14:08 [2733350] smart account 3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh > SELF 0.00000000 Waves

{ "type": 13, "id": "FqCyvpppz29Jz1RRhDknrvmM7QhkV9XL3QrKsLd1D4bT", "fee": 2600000, "feeAssetId": null, "timestamp": 1693393718548, "version": 2, "chainId": 84, "sender": "3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh", "senderPublicKey": "HiTi1JT7GQRqLNxg4yZhD1mV42y1Mv2AYvRx92JQRbwX", "proofs": [ "5WR79YPV53bXsGexbXG8Vny2hyasjwJNy3X2mWhFdrDJwAaiD17tq2dCXW1BJdMPHHHtXT5WCdL11xYdSRR9P4WR" ], "script": "base64:BgJgCAISBAoCAQQSBQoDCAEBEgUKAwgBARIDCgEIEgMKAQgSBAoCCAESBQoDCAEIEgUKAwgBCBIFCgMIAQgSBgoECAEICBIAEgMKAQESAwoBARIECgIBARIDCgEBEgQKAgEBeQAGRVVMRVI4ANaJz4EBAAVNVUxUNgDAhD0ABk1VTFRYNgkAtgIBAMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg4CQC2AgEAgMLXLwAHTVVMVFgxMAkAtgIBAIDIr6AlAAZNVUxUMTIAgKCUpY0dAAdNVUxUWDE2CQC2AgEAgICE/qbe4REABk1VTFQxOAkAtgIBAICAkLu61q3wDQADU0VQAgJfXwAHTElTVFNFUAIBOgARREVGQVVMVFNXQVBGRUVOMlcAiCcAEURFRkFVTFRTV0FQRkVFVzJOAKCcAQALQlJQUk9URUNURUQAoI0GAAdXQVZFU0lECQDZBAECBVdBVkVTAAlEQVlNSUxMSVMAgLiZKQANREVGQVVMVFBFUklPRAkAaAIAoAsADgESa2V5TmV1dHJpbm9Bc3NldElkAAIRbmV1dHJpbm9fYXNzZXRfaWQBDmtleU5zYnRBc3NldElkAAINYm9uZF9hc3NldF9pZAEOa2V5U3VyZkFzc2V0SWQAAg1zdXJmX2Fzc2V0X2lkARNrZXlTd2FwQW1vdW50QVBhcmFtAAIYJXMlc19fY29uZmlnX19zd2FwQVBhcmFtARNrZXlTd2FwQW1vdW50QlBhcmFtAAIYJXMlc19fY29uZmlnX19zd2FwQlBhcmFtARdrZXlVc2RuU3dhcEFtb3VudEFQYXJhbQACHCVzJXNfX2NvbmZpZ19fdXNkblN3YXBBUGFyYW0BF2tleVVzZG5Td2FwQW1vdW50QlBhcmFtAAIcJXMlc19fY29uZmlnX191c2RuU3dhcEJQYXJhbQETa2V5TnNidExvY2tDb250cmFjdAACFCVzX19uc2J0TG9ja0NvbnRyYWN0AQ9rZXlNYXRoQ29udHJhY3QAAhAlc19fbWF0aENvbnRyYWN0AQ9iYXNrZXRBc3NldHNLZXkAAholcyVzX19jb21tb25fX2Jhc2tldEFzc2V0cwEKYmFza2V0REtleQACFSVzJXNfX2NvbW1vbl9fYmFza2V0RAEKYmFza2V0QktleQACFSVzJXNfX2NvbW1vbl9fYmFza2V0QgESYmFza2V0TG9nYkRlbHRhS2V5AAIdJXMlc19fY29tbW9uX19iYXNrZXRMb2diRGVsdGEBFmJhc2tldFdlaWdodEJ5QXNzZXRLZXkBB2Fzc2V0SWQJAKwCAgIfJXMlcyVzX19jb21tb25fX3dlaWdodEJ5QXNzZXRfXwUHYXNzZXRJZAEIa2V5UHJpY2UAAgVwcmljZQEPa2V5UHJpY2VCeUFzc2V0AQdhc3NldElkCQCsAgICHiVzJXMlc19fY29tbW9uX19wcmljZUJ5QXNzZXRfXwUHYXNzZXRJZAEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgIFc3RhcnQFA25pbAUDU0VQAQtrZXlIYWxmTGlmZQACDCVzX19oYWxmTGlmZQEQa2V5TWluTG9ja0Ftb3VudAACESVzX19taW5Mb2NrQW1vdW50ARNrZXlWcFBlcmlvZER1cmF0aW9uAAkAuQkCCQDMCAICBCVzJXMJAMwIAgICdnAJAMwIAgIOcGVyaW9kRHVyYXRpb24FA25pbAUDU0VQARVrZXlNaW5XYXZlc0Zvck5zYnRCdXkAAhJtaW5fd2F2ZXNfbnNidF9idXkBDmtleU1pbk5zYnRTZWxsAAINbWluX25zYnRfc2VsbAEXa2V5U3RhdHNEZXBvc2l0QW10QnlEYXkBCXRpbWVzdGFtcAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgVzdGF0cwkAzAgCAg9kZXBvc2l0QW10QnlEYXkJAMwIAgkApAMBBQl0aW1lc3RhbXAFA25pbAUDU0VQARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBDHRvU3RhcnRPZkRheQEJdGltZXN0YW1wCQBoAgkAaQIFCXRpbWVzdGFtcAUJREFZTUlMTElTBQlEQVlNSUxMSVMBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAENZ2V0Qm9vbE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UDB2FkZHJlc3MDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUHYWRkcmVzcwUDa2V5BQpkZWZhdWx0VmFsAQxnZXRTdHJPckVsc2UDB2FkZHJlc3MDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5BQpkZWZhdWx0VmFsARZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAgZhbW91bnQFcHJpY2UJAGsDBQZhbW91bnQFBU1VTFQ4BQVwcmljZQERY29udmVydFRva2VuVG9Vc2QCBmFtb3VudAVwcmljZQkAawMFBmFtb3VudAUFcHJpY2UFBU1VTFQ4AQlhc0FueUxpc3QBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCUxpc3RbQW55XQQKdmFsQW55TGlzdAUHJG1hdGNoMAUKdmFsQW55TGlzdAkAAgECG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCGFzU3RyaW5nAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnZhbFN0cgUHJG1hdGNoMAUGdmFsU3RyCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQxhc1R1cGxlMkludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEAXYFByRtYXRjaDAFAXYJAAIBAh1mYWlsIHRvIGNhc3QgaW50byBUdXBsZTIgaW50cwESYXNTd2FwUGFyYW1zU1RSVUNUAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAiMoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50KQQGc3RydWN0BQckbWF0Y2gwBQZzdHJ1Y3QJAAIBAiJmYWlsIHRvIGNhc3QgaW50byBTd2FwUGFyYW1zU1RSVUNUARZhc1dpdGhkcmF3UmVzdWx0U1RSVUNUAQN2YWwEByRtYXRjaDAFA3ZhbAMDCQABAgUHJG1hdGNoMAIxKEludCwgVW5pdCwgSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgU3RyaW5nKQYJAAECBQckbWF0Y2gwAjcoSW50LCBCeXRlVmVjdG9yLCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50LCBTdHJpbmcpBAZzdHJ1Y3QFByRtYXRjaDAFBnN0cnVjdAkAAgECIGZhaWwgdG8gY2FzdCBpbnRvIFdpdGhkcmF3UmVzdWx0AQt0b1RpbWVzdGFtcAEFc3RhcnQDCQBmAgAABQVzdGFydAD///////////8BBAckbWF0Y2gwCQDtBwEFBXN0YXJ0AwkAAQIFByRtYXRjaDACCUJsb2NrSW5mbwQFYmxvY2sFByRtYXRjaDAIBQVibG9jawl0aW1lc3RhbXAA////////////AQEFdG9YMTgCB29yaWdWYWwNb3JpZ1NjYWxlTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFBk1VTFQxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQdmcm9tWDE4AgN2YWwPcmVzdWx0U2NhbGVNdWx0CQCgAwEJALwCAwUDdmFsCQC2AgEFD3Jlc3VsdFNjYWxlTXVsdAUGTVVMVDE4AA9uTWV0cmljSWR4UHJpY2UAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlAAEAHG5NZXRyaWNJZHhXYXZlc0xvY2tlZEJhbGFuY2UAAgARbk1ldHJpY0lkeFJlc2VydmUAAwAXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4ABAAUbk1ldHJpY0lkeFVzZG5TdXBwbHkABQARbk1ldHJpY0lkeFN1cnBsdXMABgAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50AAcADG5NZXRyaWNJZHhCUgAIABRuTWV0cmljSWR4TnNidFN1cHBseQAJABduTWV0cmljSWR4TWF4TnNidFN1cHBseQAKABRuTWV0cmljSWR4U3VyZlN1cHBseQALABJuTWV0cmljVXNkblVzZHRQZWcADAAWbk1ldHJpY0N1cnJlbnRQcmljZUFkagANABFuTWV0cmljQmFza2V0SW5mbwAOABRuTWV0cmljV2VpZ2h0ZWRQcmljZQAPABduTWV0cmljVG90YWxSZXNlcnZlc1VzZAAQABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAEAGElkeENvbnRyb2xDZmdBdWN0aW9uRGFwcAACABRJZHhDb250cm9sQ2ZnUnBkRGFwcAADABVJZHhDb250cm9sQ2ZnTWF0aERhcHAABAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAFABVJZHhDb250cm9sQ2ZnUmVzdERhcHAABgAdSWR4Q29udHJvbENmZ05vZGVSZWdpc3RyeURhcHAABwAcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAAIABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAkAHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAACgAgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAACwAMYkZ1bmNJZHhTdXJmAAAADWJGdW5jSWR4V2F2ZXMAAQAMYkZ1bmNJZHhVc2RuAAIAFGJGdW5jSWR4UmVzZXJ2ZVN0YXJ0AAMAE2JGdW5jSWR4U3VwcGx5U3RhcnQABAAPYkZ1bmNJZHhCUlN0YXJ0AAUAEmJGdW5jSWR4UmVzZXJ2ZUVuZAAGABFiRnVuY0lkeFN1cHBseUVuZAAHAA1iRnVuY0lkeEJSRW5kAAgADGJGdW5jSWR4UmVzdAAJABJiRnVuY0lkeFdhdmVzUHJpY2UACgERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAA9hdWN0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAE2xpcXVpZGF0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAtycGRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFFElkeENvbnRyb2xDZmdScGREYXBwABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAATc3VyZlN0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAAF2duc2J0Q29udHJvbGxlckNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBD2dldFN0cmluZ09yRmFpbAIFEG5ldXRyaW5vQ29udHJhY3QJARJrZXlOZXV0cmlub0Fzc2V0SWQAAA9uZXV0cmlub0Fzc2V0SWQJANkEAQUVbmV1dHJpbm9Bc3NldElkU3RyaW5nAA5uc2J0QXNzZXRJZFN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUQbmV1dHJpbm9Db250cmFjdAkBDmtleU5zYnRBc3NldElkAAALbnNidEFzc2V0SWQJANkEAQUObnNidEFzc2V0SWRTdHIADnN1cmZBc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9hdWN0aW9uQ29udHJhY3QJAQ5rZXlTdXJmQXNzZXRJZAAAC3N1cmZBc3NldElkCQDZBAEFDnN1cmZBc3NldElkU3RyARNyZWFkVXNkbkluY29tZUJ5RGF5AwpzdGFraW5nQWNjE3N0YXJ0T2ZEYXlUaW1lc3RhbXAIeHRuUHJpY2UEC2FtdEJ5RGF5S0VZCQEXa2V5U3RhdHNEZXBvc2l0QW10QnlEYXkBBRNzdGFydE9mRGF5VGltZXN0YW1wBAlpbmNvbWVTdHIJAQxnZXRTdHJPckVsc2UDBQpzdGFraW5nQWNjBQthbXRCeURheUtFWQJaJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wBAtpbmNvbWVBcnJheQkAtQkCBQlpbmNvbWVTdHIFA1NFUAQPc3VwcG9ydGVkQXNzZXRzCQC1CQIJAQxnZXRTdHJPckVsc2UDBQxtYXRoQ29udHJhY3QJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAgACAV8KAQtpbmNvbWVBZGRlcgIDYWNjAWkEB2Fzc2V0SWQJAJEDAgUPc3VwcG9ydGVkQXNzZXRzBQFpBAZpbmNvbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtpbmNvbWVBcnJheQkAZAIFAWkAAQMJAAACBQdhc3NldElkBRVuZXV0cmlub0Fzc2V0SWRTdHJpbmcJAGQCBQNhY2MFBmluY29tZQQDcHI2CQEFdmFsdWUBCQCaCAIFD2NvbnRyb2xDb250cmFjdAkBD2tleVByaWNlQnlBc3NldAEFB2Fzc2V0SWQEDWFzc2V0SW5Vc2RBbXQJAGsDBQZpbmNvbWUFA3ByNgUFTVVMVDgJAGQCBQNhY2MJAGsDBQ1hc3NldEluVXNkQW10BQVNVUxUNgUIeHRuUHJpY2UKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtpbmNvbWVBZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEXY2FsY1VzZG5JbmNvbWVGb3JQZXJpb2QCCnN0YWtpbmdBY2MEZGF5cwQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAQOY3VyclN0YXJ0T2ZEYXkJAQx0b1N0YXJ0T2ZEYXkBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQOc3RhcnRUaW1lc3RhbXAJAGUCBQ5jdXJyU3RhcnRPZkRheQkAaAIFCURBWU1JTExJUwkAZAIFBGRheXMAAQQMZW5kVGltZXN0YW1wCQBlAgUOY3VyclN0YXJ0T2ZEYXkFCURBWU1JTExJUwQIeHRuUHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRRuTWV0cmljV2VpZ2h0ZWRQcmljZQQPc3RhcnRVc2RuQW10VE1QCQETcmVhZFVzZG5JbmNvbWVCeURheQMFCnN0YWtpbmdBY2MFDnN0YXJ0VGltZXN0YW1wBQh4dG5QcmljZQQKZW5kVXNkbkFtdAkBE3JlYWRVc2RuSW5jb21lQnlEYXkDBQpzdGFraW5nQWNjBQxlbmRUaW1lc3RhbXAFCHh0blByaWNlBAxzdGFydFVzZG5BbXQDCQAAAgUPc3RhcnRVc2RuQW10VE1QAAAFCmVuZFVzZG5BbXQFD3N0YXJ0VXNkbkFtdFRNUAkAZQIFCmVuZFVzZG5BbXQFDHN0YXJ0VXNkbkFtdAEHY2FsY0FwcgQKc3Rha2luZ0FjYwxwZXJpb2RJbkRheXMPaW5jb21lRm9yUGVyaW9kGXN0YWtpbmdBc3NldFByaWNlVG9Vc2RuWDYEC3RvdGFsU3Rha2VkCQEMZ2V0SW50T3JFbHNlAwUKc3Rha2luZ0FjYwIeJXMlc19fc3RhdHNfX2FjdGl2ZVRvdGFsTG9ja2VkAAEEEXRvdGFsU3Rha2VkSW5Vc2RuCQBrAwULdG90YWxTdGFrZWQFGXN0YWtpbmdBc3NldFByaWNlVG9Vc2RuWDYFBU1VTFQ2AwkAZgIAAAUPaW5jb21lRm9yUGVyaW9kAAAJAGsDCQBoAgUPaW5jb21lRm9yUGVyaW9kBQVNVUxUNgDtAgkAaAIFEXRvdGFsU3Rha2VkSW5Vc2RuBQxwZXJpb2RJbkRheXMBEHN3YXBJbmZvSW50ZXJuYWwEFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQhhbW91bnRJbgxhc3NldElkU3RySW4UYXNzZXRJZFN0ck91dE9yRW1wdHkED25ldXRyaW5vTWV0cmljcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwEBXByaWNlCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUPbk1ldHJpY0lkeFByaWNlBA9zd2FwUGFyYW1zVHVwbGUJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgAABQNuaWwFA25pbAQSbGltaXRNYXhUb2tlbkluVXNkCAUPc3dhcFBhcmFtc1R1cGxlAl8xBA5ibGNrczJMbXRSZXNldAgFD3N3YXBQYXJhbXNUdXBsZQJfMwQMbGltaXRNYXhVc2RuCAUPc3dhcFBhcmFtc1R1cGxlAl83BAdhc3NldElkCQDZBAEFDGFzc2V0SWRTdHJJbgQMYmFza2V0QXNzZXRzCQELdmFsdWVPckVsc2UCCQCdCAIFEG5ldXRyaW5vQ29udHJhY3QJAQ9iYXNrZXRBc3NldHNLZXkAAgVXQVZFUwQIc3dhcFR5cGUDCQEIY29udGFpbnMCBQxiYXNrZXRBc3NldHMFDGFzc2V0SWRTdHJJbgILb3V0TmV1dHJpbm8DCQAAAgUHYXNzZXRJZAUPbmV1dHJpbm9Bc3NldElkAghvdXRNdWx0aQkAAgEJAKwCAgITQ2FuJ3Qgc3dhcCBhc3NldElkPQUMYXNzZXRJZFN0ckluBA13aXRoZHJhd1R1cGxlCQEWYXNXaXRoZHJhd1Jlc3VsdFNUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIdY2FsY1dpdGhkcmF3UmVzdWx0U1lTUkVBRE9OTFkJAMwIAgUIc3dhcFR5cGUJAMwIAgUIYW1vdW50SW4JAMwIAgUFcHJpY2UJAMwIAgUMYXNzZXRJZFN0ckluBQNuaWwFA25pbAQPb3V0TmV1dHJpbm9JbmZvCQC5CQIJAMwIAgUVbmV1dHJpbm9Bc3NldElkU3RyaW5nCQDMCAIJAKQDAQgFDXdpdGhkcmF3VHVwbGUCXzgJAMwIAgkApAMBCAUNd2l0aGRyYXdUdXBsZQJfMQkAzAgCCQCkAwEIBQ13aXRoZHJhd1R1cGxlAl82CQDMCAICBzEwMDAwMDAFA25pbAUHTElTVFNFUAQOd2l0aGRyYXdCYXNrZXQDCQAAAgUIc3dhcFR5cGUCC291dE5ldXRyaW5vBQ9vdXROZXV0cmlub0luZm8DCQAAAgUUYXNzZXRJZFN0ck91dE9yRW1wdHkCAAgFDXdpdGhkcmF3VHVwbGUCXzkCH1dBVkVTOjM4MDAwMDAwOjEyMzQ1Njo0Mjo1MDAwMDAJAJQKAgUDbmlsCQC6CQIJAMwIAgIIJWQlZCVkJXMJAMwIAgkApAMBBQ5ibGNrczJMbXRSZXNldAkAzAgCCQCkAwEFEmxpbWl0TWF4VG9rZW5JblVzZAkAzAgCCQCkAwEFDGxpbWl0TWF4VXNkbgkAzAgCBQ53aXRoZHJhd0Jhc2tldAUDbmlsBQNTRVAQAWkBGHJldmVyc2VTd2FwTGltaXRSRUFET05MWQIDbGltCmlzT3V0TXVsdGkEAkJSCQEFYXNJbnQBCQCRAwIJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBQxuTWV0cmljSWR4QlIEBWdOc2J0AwkAZwIAAAUDbGltAAAECGFQYXJhbVg4CQC2AgEJAQxnZXRJbnRPckZhaWwCBQxtYXRoQ29udHJhY3QDBQppc091dE11bHRpCQEXa2V5VXNkblN3YXBBbW91bnRBUGFyYW0ACQETa2V5U3dhcEFtb3VudEFQYXJhbQAECWJQYXJhbVgxNgkAtgIBCQEMZ2V0SW50T3JGYWlsAgUMbWF0aENvbnRyYWN0AwUKaXNPdXRNdWx0aQkBF2tleVVzZG5Td2FwQW1vdW50QlBhcmFtAAkBE2tleVN3YXBBbW91bnRCUGFyYW0ABAlsaW1EaXZBWDgDBQppc091dE11bHRpCQC8AgMJALwCAwkAtgIBBQNsaW0FB01VTFRYMTAFCGFQYXJhbVg4BQZNVUxUWDYJALYCAQUCQlIJALwCAwkAtgIBBQNsaW0FB01VTFRYMTAFCGFQYXJhbVg4BAdyZXZCWDE2CQC8AgMFB01VTFRYMTYFB01VTFRYMTYFCWJQYXJhbVgxNgkAoAMBCQB2BgUJbGltRGl2QVg4AAgFB3JldkJYMTYAEAAGBQdDRUlMSU5HCQCUCgIFA25pbAUFZ05zYnQBaQERZ25zYnRJbmZvSU5URVJOQUwDFXVzZXJBZGRyZXNzU3RyT3JFbXB0eRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8bYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBBF1c2VyQWRkcmVzc09yVGhpcwMJAQIhPQIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQIACQERQGV4dHJOYXRpdmUoMTA2MikBBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkFBHRoaXMEDGN1cnJlbnRQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPY29udHJvbENvbnRyYWN0CQEIa2V5UHJpY2UABBFnbnNidEZyb21Oc2J0RGlmZgUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvBBFnbnNidEZyb21TdXJmRGlmZgkBBWFzSW50AQkA/AcEBRNzdXJmU3Rha2luZ0NvbnRyYWN0AhhnbnNidEZyb21TdXJmU1lTUkVBRE9OTFkJAMwIAgUbYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBQNuaWwFA25pbAQJZ05zYnREaWZmCQBkAgURZ25zYnRGcm9tTnNidERpZmYFEWduc2J0RnJvbVN1cmZEaWZmBA9zd2FwUGFyYW1zVHVwbGUJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgAABQNuaWwFA25pbAQQbGltaXRNYXhUb2tlblVzZAgFD3N3YXBQYXJhbXNUdXBsZQJfMQQOYmxja3MyTG10UmVzZXQIBQ9zd2FwUGFyYW1zVHVwbGUCXzMECGduc2J0QW10CAUPc3dhcFBhcmFtc1R1cGxlAl80BA1nbnNidEFtdFRvdGFsCAUPc3dhcFBhcmFtc1R1cGxlAl81BAxsaW1pdE1heFVzZG4IBQ9zd2FwUGFyYW1zVHVwbGUCXzcEEnN3YXBQYXJhbXNUdXBsZU5FVwkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCBQlnTnNidERpZmYFA25pbAUDbmlsBBNsaW1pdE1heFRva2VuVXNkTkVXCAUSc3dhcFBhcmFtc1R1cGxlTkVXAl8xBBFibGNrczJMbXRSZXNldE5FVwgFEnN3YXBQYXJhbXNUdXBsZU5FVwJfMwQLZ25zYnRBbXRORVcIBRJzd2FwUGFyYW1zVHVwbGVORVcCXzQEEGduc2J0QW10VG90YWxORVcIBRJzd2FwUGFyYW1zVHVwbGVORVcCXzUED2xpbWl0TWF4VXNkbk5FVwgFEnN3YXBQYXJhbXNUdXBsZU5FVwJfNwQLbnNidEJhbGFuY2UDCQECIT0CBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkCAAkA8AcCBRF1c2VyQWRkcmVzc09yVGhpcwULbnNidEFzc2V0SWQAAAQLc3VyZkJhbGFuY2UDCQECIT0CBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkCAAkA8AcCBRF1c2VyQWRkcmVzc09yVGhpcwULc3VyZkFzc2V0SWQAAAQPbnNidEJhbGFuY2VEaWZmAwkAZwIFG2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybwAABRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8EEW5zYnRVbnN0YWtpbmdEYXRhCQEJYXNBbnlMaXN0AQkA/AcEBRNuc2J0U3Rha2luZ0NvbnRyYWN0Ahhuc2J0VW5zdGFraW5nU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIJAGgCAP///////////wEFG2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybwUDbmlsBQNuaWwEEW5zYnRSZWNlaXZlQW1vdW50CQEFYXNJbnQBCQCRAwIFEW5zYnRVbnN0YWtpbmdEYXRhAAIEBnJlc3VsdAkBAS0BBRFuc2J0UmVjZWl2ZUFtb3VudAUGcmVzdWx0BA5uc2J0QmFsYW5jZU5ldwkAZQIFC25zYnRCYWxhbmNlBQ9uc2J0QmFsYW5jZURpZmYEDnN1cmZCYWxhbmNlTmV3CQBlAgULc3VyZkJhbGFuY2UFG2FkZGl0aW9uYWxTdXJmVG9TdGFrZU9yWmVybwQJZ25zYnREYXRhCQEJYXNBbnlMaXN0AQkA/AcEBRdnbnNidENvbnRyb2xsZXJDb250cmFjdAIUZ25zYnRJbmZvU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIFG2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybwkAzAgCBRthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8FA25pbAUDbmlsBAlnbnNidFVzZXIJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAAECmduc2J0VG90YWwJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAEECG5zYnREYXRhCQEJYXNBbnlMaXN0AQkAkQMCBQlnbnNidERhdGEAAgQIc3VyZkRhdGEJAQlhc0FueUxpc3QBCQCRAwIFCWduc2J0RGF0YQADBBRnbnNidFN1cmZUb3RhbE1hdHVyZQkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEABgQSZ25zYnRTdXJmVG90YWxUZWVuCQEFYXNJbnQBCQCRAwIFCWduc2J0RGF0YQAHBBFnbnNidFN1cmZUb3RhbEtpZAkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEACAQTZ25zYnRTdXJmVXNlck1hdHVyZQkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEACQQRZ25zYnRTdXJmVXNlclRlZW4JAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAoEEGduc2J0U3VyZlVzZXJLaWQJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAsEE2duc2J0QW10RnJvbVN1cmZNYXgJAGQCCQBkAgUTZ25zYnRTdXJmVXNlck1hdHVyZQURZ25zYnRTdXJmVXNlclRlZW4FEGduc2J0U3VyZlVzZXJLaWQEEGduc2J0QW10RnJvbU5zYnQJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAgQTZ25zYnRBbXRGcm9tTnNidE5FVwkAZAIFEGduc2J0QW10RnJvbU5zYnQFEWduc2J0RnJvbU5zYnREaWZmBBNnbnNidEFtdEZyb21TdXJmTkVXCQBkAgUTZ25zYnRBbXRGcm9tU3VyZk1heAURZ25zYnRGcm9tU3VyZkRpZmYEEmduc2J0RnJvbU5zYnRUb3RhbAkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQADBBVnbnNidEZyb21Oc2J0VG90YWxORVcJAGQCBRJnbnNidEZyb21Oc2J0VG90YWwFEWduc2J0RnJvbU5zYnREaWZmBBVnbnNidEZyb21TdXJmVG90YWxORVcJAGQCCQBkAgkAZAIFFGduc2J0U3VyZlRvdGFsTWF0dXJlBRJnbnNidFN1cmZUb3RhbFRlZW4FEWduc2J0U3VyZlRvdGFsS2lkBRFnbnNidEZyb21TdXJmRGlmZgQLdm90aW5nUG93ZXIJAGQCBRBnbnNidEFtdEZyb21Oc2J0BRNnbnNidFN1cmZVc2VyTWF0dXJlBA52b3RpbmdQb3dlck5ldwkAZAIFE2duc2J0QW10RnJvbU5zYnRORVcFE2duc2J0U3VyZlVzZXJNYXR1cmUEDnZvdGluZ1Bvd2VyTWF4CQBkAgUQZ25zYnRBbXRGcm9tTnNidAUTZ25zYnRBbXRGcm9tU3VyZk1heAQRdm90aW5nUG93ZXJNYXhOZXcJAGQCCQBkAgUTZ25zYnRBbXRGcm9tTnNidE5FVwUTZ25zYnRBbXRGcm9tU3VyZk1heAURZ25zYnRGcm9tU3VyZkRpZmYEAlcyCQEMZ2V0SW50T3JFbHNlAwUTc3VyZlN0YWtpbmdDb250cmFjdAkBE2tleVZwUGVyaW9kRHVyYXRpb24ABQ1ERUZBVUxUUEVSSU9EBAZwZXJpb2QJAGkCBQZoZWlnaHQFAlcyBA52b3RpbmdQb3dlckV0YQMJAQIhPQIFEGduc2J0U3VyZlVzZXJLaWQAAAkAaAIJAGQCBQZwZXJpb2QAAgUCVzIDCQECIT0CBRFnbnNidFN1cmZVc2VyVGVlbgAACQBoAgkAZAIFBnBlcmlvZAABBQJXMgUGaGVpZ2h0BBF2b3RpbmdQb3dlckV0YU5ldwMJAQIhPQIFEWduc2J0RnJvbVN1cmZEaWZmAAAJAGgCCQBkAgUGcGVyaW9kAAIFAlcyBQ52b3RpbmdQb3dlckV0YQkAlAoCBQNuaWwJAMwIAgAACQDMCAIFC25zYnRCYWxhbmNlCQDMCAIFC3N1cmZCYWxhbmNlCQDMCAIFDm5zYnRCYWxhbmNlTmV3CQDMCAIFDnN1cmZCYWxhbmNlTmV3CQDMCAIFEGduc2J0QW10RnJvbU5zYnQJAMwIAgUTZ25zYnRTdXJmVXNlck1hdHVyZQkAzAgCBRNnbnNidEFtdEZyb21Oc2J0TkVXCQDMCAIFE2duc2J0QW10RnJvbVN1cmZORVcJAMwIAgUSZ25zYnRGcm9tTnNidFRvdGFsCQDMCAIFFGduc2J0U3VyZlRvdGFsTWF0dXJlCQDMCAIFFWduc2J0RnJvbU5zYnRUb3RhbE5FVwkAzAgCBRVnbnNidEZyb21TdXJmVG90YWxORVcJAMwIAgUMbGltaXRNYXhVc2RuCQDMCAIFEGxpbWl0TWF4VG9rZW5Vc2QJAMwIAgUPbGltaXRNYXhVc2RuTkVXCQDMCAIFE2xpbWl0TWF4VG9rZW5Vc2RORVcJAMwIAgUOYmxja3MyTG10UmVzZXQJAMwIAgURYmxja3MyTG10UmVzZXRORVcJAMwIAgULdm90aW5nUG93ZXIJAMwIAgUOdm90aW5nUG93ZXJOZXcJAMwIAgUOdm90aW5nUG93ZXJNYXgJAMwIAgURdm90aW5nUG93ZXJNYXhOZXcJAMwIAgUOdm90aW5nUG93ZXJFdGEJAMwIAgURdm90aW5nUG93ZXJFdGFOZXcFA25pbAFpARFnbnNidEluZm9SRUFET05MWQMVdXNlckFkZHJlc3NTdHJPckVtcHR5G2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybxthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8EDWduc2J0SW5mb0RBVEEJAQlhc0FueUxpc3QBCQD8BwQFBHRoaXMCEWduc2J0SW5mb0lOVEVSTkFMCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8JAMwIAgUbYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBQNuaWwFA25pbAkAlAoCBQNuaWwJALkJAgkAzAgCAjAlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAAQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQACCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAMJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEABAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAFCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAYJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEABwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAICQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAkJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEACgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQALCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAwJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEADQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAOCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAA8JAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAEAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQARCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABIJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAEwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAUCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABUJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAFgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAXCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABgFA25pbAUDU0VQAWkBFmduc2J0RWZmZWN0aXZlUkVBRE9OTFkBFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQJZ25zYnREYXRhCQEJYXNBbnlMaXN0AQkA/AcEBRdnbnNidENvbnRyb2xsZXJDb250cmFjdAIUZ25zYnRJbmZvU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsBAhuc2J0RGF0YQkBCWFzQW55TGlzdAEJAJEDAgUJZ25zYnREYXRhAAIEDHVzZXJGcm9tTnNidAkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQACBA10b3RhbEZyb21Oc2J0CQEFYXNJbnQBCQCRAwIFCG5zYnREYXRhAAMEEnVzZXJNYXR1cmVGcm9tU3VyZgkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEACQQTdG90YWxNYXR1cmVGcm9tU3VyZgkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEABgkAlAoCBQNuaWwJALkJAgkAzAgCAgQlZCVkCQDMCAIJAKQDAQkAZAIFDXRvdGFsRnJvbU5zYnQFE3RvdGFsTWF0dXJlRnJvbVN1cmYJAMwIAgkApAMBCQBkAgUMdXNlckZyb21Oc2J0BRJ1c2VyTWF0dXJlRnJvbVN1cmYFA25pbAUDU0VQAWkBEnJld2FyZEluZm9SRUFET05MWQEVdXNlckFkZHJlc3NTdHJPckVtcHR5BAtyZXdhcmRzRGF0YQkBCWFzQW55TGlzdAEJAPwHBAUXZ25zYnRDb250cm9sbGVyQ29udHJhY3QCF2duc2J0UmV3YXJkc1NZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUDbmlsBQNuaWwEC3VzZG5SZXdhcmRzCQEIYXNTdHJpbmcBCQD8BwQFC3JwZENvbnRyYWN0Ahh1bmNsYWltZWRSZXdhcmRzUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5BQNuaWwFA25pbAkAlAoCBQNuaWwJALoJAgkAzAgCAgYlcyVzJXMJAMwIAgkBCGFzU3RyaW5nAQkAkQMCBQtyZXdhcmRzRGF0YQAACQDMCAIJAQhhc1N0cmluZwEJAJEDAgULcmV3YXJkc0RhdGEAAQkAzAgCBQt1c2RuUmV3YXJkcwUDbmlsBQNTRVABaQERbWVyZ2VOc2J0UkVBRE9OTFkCFHVzZXJBZGRyZXNzTWFuZGF0b3J5CW5ld0Ftb3VudAQIbnNidERhdGEJAQlhc0FueUxpc3QBCQD8BwQFE25zYnRTdGFraW5nQ29udHJhY3QCFm5zYnRTdGFraW5nU1lTUkVBRE9OTFkJAMwIAgUUdXNlckFkZHJlc3NNYW5kYXRvcnkJAMwIAgUJbmV3QW1vdW50BQNuaWwFA25pbAQHYW1vdW50MAkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQAABAtzdGFydEhlaWdodAMJAGcCAAAFB2Ftb3VudDAA////////////AQkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQACBA5zdGFydFRpbWVzdGFtcAkBC3RvVGltZXN0YW1wAQULc3RhcnRIZWlnaHQEDnN0YXJ0SGVpZ2h0TmV3AwkAZwIAAAUJbmV3QW1vdW50BQtzdGFydEhlaWdodAMJAGcCAAAFB2Ftb3VudDAFBmhlaWdodAQIaGFsZkxpZmUJAQxnZXRJbnRPckZhaWwCBRNuc2J0U3Rha2luZ0NvbnRyYWN0CQELa2V5SGFsZkxpZmUACQEFYXNJbnQBCQD8BwQFDG1hdGhDb250cmFjdAITbWVyZ2VTdGFrZXNSRUFET05MWQkAzAgCBQdhbW91bnQwCQDMCAIFC3N0YXJ0SGVpZ2h0CQDMCAIFCW5ld0Ftb3VudAkAzAgCBQZoZWlnaHQJAMwIAgUIaGFsZkxpZmUFA25pbAUDbmlsBBFzdGFydFRpbWVzdGFtcE5ldwkBC3RvVGltZXN0YW1wAQUOc3RhcnRIZWlnaHROZXcJAJQKAgUDbmlsCQC5CQIJAMwIAgIIJWQlZCVkJWQJAMwIAgkApAMBBQtzdGFydEhlaWdodAkAzAgCCQCkAwEFDnN0YXJ0VGltZXN0YW1wCQDMCAIJAKQDAQUOc3RhcnRIZWlnaHROZXcJAMwIAgkApAMBBRFzdGFydFRpbWVzdGFtcE5ldwUDbmlsBQNTRVABaQEbc3dhcExpbWl0Q2FsY3VsYXRvclJFQURPTkxZAxF1c2VyQWRkcmVzc1N0ck9wdAtsaW1pdFdhbnRlZAphc3NldElkU3RyBAxnTnNidEN1cnJlbnQDCQAAAgURdXNlckFkZHJlc3NTdHJPcHQCAAAACQEFYXNJbnQBCAkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFEXVzZXJBZGRyZXNzU3RyT3B0CQDMCAIAAAUDbmlsBQNuaWwCXzQEBXByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUPY29udHJvbENvbnRyYWN0CQEPa2V5UHJpY2VCeUFzc2V0AQUKYXNzZXRJZFN0cgkArAICAhNObyBwcmljZSBmb3IgYXNzZXQgBQphc3NldElkU3RyBAppc091dE11bHRpCQAAAgUKYXNzZXRJZFN0cgUVbmV1dHJpbm9Bc3NldElkU3RyaW5nBA9saW1pdFdhbnRlZFVzZG4DBQppc091dE11bHRpBQtsaW1pdFdhbnRlZAkBEWNvbnZlcnRUb2tlblRvVXNkAgULbGltaXRXYW50ZWQFBXByaWNlBAtnTnNidE5lZWRlZAkBBWFzSW50AQkA/AcEBQR0aGlzAhhyZXZlcnNlU3dhcExpbWl0UkVBRE9OTFkJAMwIAgUPbGltaXRXYW50ZWRVc2RuCQDMCAIFCmlzT3V0TXVsdGkFA25pbAUDbmlsBApnTnNidERlbHRhCQBlAgULZ05zYnROZWVkZWQFDGdOc2J0Q3VycmVudAkAlAoCBQNuaWwJALkJAgkAzAgCAgQlcyVzCQDMCAIJAKQDAQUMZ05zYnRDdXJyZW50CQDMCAIJAKQDAQUKZ05zYnREZWx0YQUDbmlsBQNTRVABaQEQc3dhcEluZm9SRUFET05MWQMVdXNlckFkZHJlc3NTdHJPckVtcHR5BmFtb3VudAphc3NldElkU3RyBA9uZXV0cmlub01ldHJpY3MJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBAVwcmljZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFD25NZXRyaWNJZHhQcmljZQQPc3dhcFBhcmFtc1R1cGxlCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIAAAUDbmlsBQNuaWwEEmxpbWl0TWF4VG9rZW5JblVzZAgFD3N3YXBQYXJhbXNUdXBsZQJfMQQOYmxja3MyTG10UmVzZXQIBQ9zd2FwUGFyYW1zVHVwbGUCXzMEDGxpbWl0TWF4VXNkbggFD3N3YXBQYXJhbXNUdXBsZQJfNwQHYXNzZXRJZAkA2QQBBQphc3NldElkU3RyBAxiYXNrZXRBc3NldHMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUQbmV1dHJpbm9Db250cmFjdAkBD2Jhc2tldEFzc2V0c0tleQACBVdBVkVTBAhzd2FwVHlwZQMJAQhjb250YWlucwIFDGJhc2tldEFzc2V0cwUKYXNzZXRJZFN0cgILb3V0TmV1dHJpbm8DCQAAAgUHYXNzZXRJZAUPbmV1dHJpbm9Bc3NldElkAghvdXRNdWx0aQkAAgEJAKwCAgITQ2FuJ3Qgc3dhcCBhc3NldElkPQUKYXNzZXRJZFN0cgQNd2l0aGRyYXdUdXBsZQkBFmFzV2l0aGRyYXdSZXN1bHRTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCHWNhbGNXaXRoZHJhd1Jlc3VsdFNZU1JFQURPTkxZCQDMCAIFCHN3YXBUeXBlCQDMCAIFBmFtb3VudAkAzAgCBQVwcmljZQkAzAgCBQphc3NldElkU3RyBQNuaWwFA25pbAQMb3V0TmV0QW1vdW50CAUNd2l0aGRyYXdUdXBsZQJfMQQKb3V0U3VyZkFtdAgFDXdpdGhkcmF3VHVwbGUCXzMED2luQW10VG9TdXJmUGFydAgFDXdpdGhkcmF3VHVwbGUCXzQEDG91dEZlZUFtb3VudAgFDXdpdGhkcmF3VHVwbGUCXzYEC291dEFtdEdyb3NzCAUNd2l0aGRyYXdUdXBsZQJfNwQNd2l0aGRyYXdQcmljZQgFDXdpdGhkcmF3VHVwbGUCXzgJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDG91dE5ldEFtb3VudAkAzAgCCQCkAwEFCm91dFN1cmZBbXQJAMwIAgkApAMBBQxvdXRGZWVBbW91bnQJAMwIAgkApAMBBQ13aXRoZHJhd1ByaWNlCQDMCAIJAKQDAQUOYmxja3MyTG10UmVzZXQJAMwIAgkApAMBBRJsaW1pdE1heFRva2VuSW5Vc2QJAMwIAgkApAMBBQxsaW1pdE1heFVzZG4JAMwIAgkApAMBBQ9pbkFtdFRvU3VyZlBhcnQFA25pbAUDU0VQAWkBEnN3YXBJbmZvVjJSRUFET05MWQMVdXNlckFkZHJlc3NTdHJPckVtcHR5BmFtb3VudAphc3NldElkU3RyCQEQc3dhcEluZm9JbnRlcm5hbAQFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUGYW1vdW50BQphc3NldElkU3RyAgABaQESc3dhcEluZm9WM1JFQURPTkxZBBV1c2VyQWRkcmVzc1N0ck9yRW1wdHkIYW1vdW50SW4MYXNzZXRJZFN0ckluFGFzc2V0SWRTdHJPdXRPckVtcHR5CQEQc3dhcEluZm9JbnRlcm5hbAQFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUIYW1vdW50SW4FDGFzc2V0SWRTdHJJbgUUYXNzZXRJZFN0ck91dE9yRW1wdHkBaQESYmFza2V0SW5mb1JFQURPTkxZAAQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAQKYmFza2V0SW5mbwkBCGFzU3RyaW5nAQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFEW5NZXRyaWNCYXNrZXRJbmZvBAZiYXNrZXQJALwJAgUKYmFza2V0SW5mbwIBXwoBBm1vZGlmeQIDYWNjBGl0ZW0EBXBhcnRzCQC1CQIFBGl0ZW0FB0xJU1RTRVAEB2Fzc2V0SWQJAJEDAgUFcGFydHMAAAQFZGxvZzYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRBuZXV0cmlub0NvbnRyYWN0CQESYmFza2V0TG9nYkRlbHRhS2V5AAIebG9nKGIsIGRlbHRhKSBrZXkgaXMgdW5kZWZpbmVkBAJENgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEG5ldXRyaW5vQ29udHJhY3QJAQpiYXNrZXRES2V5AAISRCBrZXkgaXMgdW5kZWZpbmVkBAJiNgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEG5ldXRyaW5vQ29udHJhY3QJAQpiYXNrZXRCS2V5AAISYiBrZXkgaXMgdW5kZWZpbmVkBAJ3NgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEG5ldXRyaW5vQ29udHJhY3QJARZiYXNrZXRXZWlnaHRCeUFzc2V0S2V5AQUHYXNzZXRJZAkArAICCQCsAgICGFRhcmdldCB3ZWlnaHQgZm9yIGFzc2V0IAUHYXNzZXRJZAINIGlzIHVuZGVmaW5lZAQCcDYJAGQCCQBlAgUFZGxvZzYFAnc2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQQBZAkAZQIFAkQ2CQBsBgUCYjYABgUCcDYABgAGBQZIQUxGVVAJAM0IAgUDYWNjCQC5CQIJAM0IAgkAzQgCBQVwYXJ0cwkApAMBBQJ3NgkApAMBBQFkBQdMSVNUU0VQBAFiCgACJGwFBmJhc2tldAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEGbW9kaWZ5AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIFA25pbAkArAICAgQlc19fCQC6CQIFAWICAV8BaQEWdXNkblN0YWtpbmdBcHJSRUFET05MWQEEZGF5cwQHdG1wRGF5cwABBA9uZXV0cmlub01ldHJpY3MJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBAxjdXJyZW50UHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBQ9uTWV0cmljSWR4UHJpY2UEC3dhdmVzSW5jb21lCQBoAgAABQVNVUxUOAQPaW5jb21lRm9yUGVyaW9kCQBrAwULd2F2ZXNJbmNvbWUFDGN1cnJlbnRQcmljZQUFTVVMVDgEA2FwcgkBB2NhbGNBcHIEBQtycGRDb250cmFjdAUHdG1wRGF5cwUPaW5jb21lRm9yUGVyaW9kBQVNVUxUNgkAlAoCBQNuaWwJAKwCAgIEJWRfXwkApAMBBQNhcHIBaQEWc3VyZlN0YWtpbmdBcHJSRUFET05MWQEEZGF5cwQHdG1wRGF5cwADBA9pbmNvbWVGb3JQZXJpb2QJARdjYWxjVXNkbkluY29tZUZvclBlcmlvZAIFE3N1cmZTdGFraW5nQ29udHJhY3QFB3RtcERheXMEEXN1cmZQcmljZVRvVXNkblg2AICjBQQDYXByCQEHY2FsY0FwcgQFE3N1cmZTdGFraW5nQ29udHJhY3QFB3RtcERheXMFD2luY29tZUZvclBlcmlvZAURc3VyZlByaWNlVG9Vc2RuWDYJAJQKAgUDbmlsCQCsAgICBCVkX18JAKQDAQUDYXByAWkBGHN1cmZTdGFraW5nQXByVjJSRUFET05MWQIEZGF5cw9zdXJmVXNkblByaWNlWDYEB3RtcERheXMAAwQPaW5jb21lRm9yUGVyaW9kCQEXY2FsY1VzZG5JbmNvbWVGb3JQZXJpb2QCBRNzdXJmU3Rha2luZ0NvbnRyYWN0BQd0bXBEYXlzBANhcHIJAQdjYWxjQXByBAUTc3VyZlN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwUPaW5jb21lRm9yUGVyaW9kBQ9zdXJmVXNkblByaWNlWDYJAJQKAgUDbmlsCQCsAgICBCVkX18JAKQDAQUDYXByAWkBFm5zYnRTdGFraW5nQXByUkVBRE9OTFkBBGRheXMEB3RtcERheXMAAwQRbnNidFByaWNlVG9Vc2RuWDYAgKToAwQPaW5jb21lRm9yUGVyaW9kCQEXY2FsY1VzZG5JbmNvbWVGb3JQZXJpb2QCBRNuc2J0U3Rha2luZ0NvbnRyYWN0BQd0bXBEYXlzBANhcHIJAQdjYWxjQXByBAUTbnNidFN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwUPaW5jb21lRm9yUGVyaW9kBRFuc2J0UHJpY2VUb1VzZG5YNgkAlAoCBQNuaWwJAKwCAgIEJWRfXwkApAMBBQNhcHIBaQEYbnNidFN0YWtpbmdBcHJWMlJFQURPTkxZAgRkYXlzD25zYnRVc2RuUHJpY2VYNgQHdG1wRGF5cwADBA9pbmNvbWVGb3JQZXJpb2QJARdjYWxjVXNkbkluY29tZUZvclBlcmlvZAIFE25zYnRTdGFraW5nQ29udHJhY3QFB3RtcERheXMEA2FwcgkBB2NhbGNBcHIEBRNuc2J0U3Rha2luZ0NvbnRyYWN0BQd0bXBEYXlzBQ9pbmNvbWVGb3JQZXJpb2QFD25zYnRVc2RuUHJpY2VYNgkAlAoCBQNuaWwJAKwCAgIEJWRfXwkApAMBBQNhcHIAv9J/bA==", "height": 2733350, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8UGmJcQbat5wTS2V2pzWZ15nkj41TRop36L4PRgNy3RJ Next: EBkWvwwQdkNq78iCATwVkzhcvtS36DC1wxGaPXPTYLxQ Diff:
OldNewDifferences
387387 else if ((assetId == neutrinoAssetId))
388388 then "outMulti"
389389 else throw(("Can't swap assetId=" + assetIdStrIn))
390- let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amountIn, price, assetIdStrIn, assetIdStrOutOrEmpty], nil))
390+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amountIn, price, assetIdStrIn], nil))
391391 let outNeutrinoInfo = makeString([neutrinoAssetIdString, toString(withdrawTuple._8), toString(withdrawTuple._1), toString(withdrawTuple._6), "1000000"], LISTSEP)
392392 let withdrawBasket = if ((swapType == "outNeutrino"))
393393 then outNeutrinoInfo
579579 else if ((assetId == neutrinoAssetId))
580580 then "outMulti"
581581 else throw(("Can't swap assetId=" + assetIdStr))
582- let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr, ""], nil))
582+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr], nil))
583583 let outNetAmount = withdrawTuple._1
584584 let outSurfAmt = withdrawTuple._3
585585 let inAmtToSurfPart = withdrawTuple._4
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let EULER8 = 271828182
55
66 let MULT6 = 1000000
77
88 let MULTX6 = toBigInt(1000000)
99
1010 let MULT8 = 100000000
1111
1212 let MULTX8 = toBigInt(100000000)
1313
1414 let MULTX10 = toBigInt(10000000000)
1515
1616 let MULT12 = 1000000000000
1717
1818 let MULTX16 = toBigInt(10000000000000000)
1919
2020 let MULT18 = toBigInt(1000000000000000000)
2121
2222 let SEP = "__"
2323
2424 let LISTSEP = ":"
2525
2626 let DEFAULTSWAPFEEN2W = 5000
2727
2828 let DEFAULTSWAPFEEW2N = 20000
2929
3030 let BRPROTECTED = 100000
3131
3232 let WAVESID = fromBase58String("WAVES")
3333
3434 let DAYMILLIS = 86400000
3535
3636 let DEFAULTPERIOD = (1440 * 14)
3737
3838 func keyNeutrinoAssetId () = "neutrino_asset_id"
3939
4040
4141 func keyNsbtAssetId () = "bond_asset_id"
4242
4343
4444 func keySurfAssetId () = "surf_asset_id"
4545
4646
4747 func keySwapAmountAParam () = "%s%s__config__swapAParam"
4848
4949
5050 func keySwapAmountBParam () = "%s%s__config__swapBParam"
5151
5252
5353 func keyUsdnSwapAmountAParam () = "%s%s__config__usdnSwapAParam"
5454
5555
5656 func keyUsdnSwapAmountBParam () = "%s%s__config__usdnSwapBParam"
5757
5858
5959 func keyNsbtLockContract () = "%s__nsbtLockContract"
6060
6161
6262 func keyMathContract () = "%s__mathContract"
6363
6464
6565 func basketAssetsKey () = "%s%s__common__basketAssets"
6666
6767
6868 func basketDKey () = "%s%s__common__basketD"
6969
7070
7171 func basketBKey () = "%s%s__common__basketB"
7272
7373
7474 func basketLogbDeltaKey () = "%s%s__common__basketLogbDelta"
7575
7676
7777 func basketWeightByAssetKey (assetId) = ("%s%s%s__common__weightByAsset__" + assetId)
7878
7979
8080 func keyPrice () = "price"
8181
8282
8383 func keyPriceByAsset (assetId) = ("%s%s%s__common__priceByAsset__" + assetId)
8484
8585
8686 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
8787
8888
8989 func keyHalfLife () = "%s__halfLife"
9090
9191
9292 func keyMinLockAmount () = "%s__minLockAmount"
9393
9494
9595 func keyVpPeriodDuration () = makeString(["%s%s", "vp", "periodDuration"], SEP)
9696
9797
9898 func keyMinWavesForNsbtBuy () = "min_waves_nsbt_buy"
9999
100100
101101 func keyMinNsbtSell () = "min_nsbt_sell"
102102
103103
104104 func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], SEP)
105105
106106
107107 func keySupportedRewardAssets () = "supportedRewardAssets"
108108
109109
110110 func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
111111
112112
113113 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
114114
115115
116116 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
117117
118118
119119 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
120120
121121
122122 func getIntOrElse (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
123123
124124
125125 func getStrOrElse (address,key,defaultVal) = valueOrElse(getString(address, key), defaultVal)
126126
127127
128128 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
129129
130130
131131 func convertTokenToUsd (amount,price) = fraction(amount, price, MULT8)
132132
133133
134134 func asAnyList (val) = match val {
135135 case valAnyList: List[Any] =>
136136 valAnyList
137137 case _ =>
138138 throw("fail to cast into List[Any]")
139139 }
140140
141141
142142 func asInt (val) = match val {
143143 case valInt: Int =>
144144 valInt
145145 case _ =>
146146 throw("fail to cast into Int")
147147 }
148148
149149
150150 func asString (val) = match val {
151151 case valStr: String =>
152152 valStr
153153 case _ =>
154154 throw("fail to cast into String")
155155 }
156156
157157
158158 func asTuple2Ints (val) = match val {
159159 case v: (Int, Int) =>
160160 v
161161 case _ =>
162162 throw("fail to cast into Tuple2 ints")
163163 }
164164
165165
166166 func asSwapParamsSTRUCT (val) = match val {
167167 case struct: (Int, Int, Int, Int, Int, Int, Int) =>
168168 struct
169169 case _ =>
170170 throw("fail to cast into SwapParamsSTRUCT")
171171 }
172172
173173
174174 func asWithdrawResultSTRUCT (val) = match val {
175175 case struct: (Int, Unit, Int, Int, Int, Int, Int, Int, String)|(Int, ByteVector, Int, Int, Int, Int, Int, Int, String) =>
176176 struct
177177 case _ =>
178178 throw("fail to cast into WithdrawResult")
179179 }
180180
181181
182182 func toTimestamp (start) = if ((0 > start))
183183 then -1
184184 else match blockInfoByHeight(start) {
185185 case block: BlockInfo =>
186186 block.timestamp
187187 case _ =>
188188 -1
189189 }
190190
191191
192192 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
193193
194194
195195 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
196196
197197
198198 let nMetricIdxPrice = 0
199199
200200 let nMetricIdxUsdnLockedBalance = 1
201201
202202 let nMetricIdxWavesLockedBalance = 2
203203
204204 let nMetricIdxReserve = 3
205205
206206 let nMetricIdxReserveInUsdn = 4
207207
208208 let nMetricIdxUsdnSupply = 5
209209
210210 let nMetricIdxSurplus = 6
211211
212212 let nMetricIdxSurplusPercent = 7
213213
214214 let nMetricIdxBR = 8
215215
216216 let nMetricIdxNsbtSupply = 9
217217
218218 let nMetricIdxMaxNsbtSupply = 10
219219
220220 let nMetricIdxSurfSupply = 11
221221
222222 let nMetricUsdnUsdtPeg = 12
223223
224224 let nMetricCurrentPriceAdj = 13
225225
226226 let nMetricBasketInfo = 14
227227
228228 let nMetricWeightedPrice = 15
229229
230230 let nMetricTotalReservesUsd = 16
231231
232232 let IdxControlCfgNeutrinoDapp = 1
233233
234234 let IdxControlCfgAuctionDapp = 2
235235
236236 let IdxControlCfgRpdDapp = 3
237237
238238 let IdxControlCfgMathDapp = 4
239239
240240 let IdxControlCfgLiquidationDapp = 5
241241
242242 let IdxControlCfgRestDapp = 6
243243
244244 let IdxControlCfgNodeRegistryDapp = 7
245245
246246 let IdxControlCfgNsbtStakingDapp = 8
247247
248248 let IdxControlCfgMediatorDapp = 9
249249
250250 let IdxControlCfgSurfStakingDapp = 10
251251
252252 let IdxControlCfgGnsbtControllerDapp = 11
253253
254254 let bFuncIdxSurf = 0
255255
256256 let bFuncIdxWaves = 1
257257
258258 let bFuncIdxUsdn = 2
259259
260260 let bFuncIdxReserveStart = 3
261261
262262 let bFuncIdxSupplyStart = 4
263263
264264 let bFuncIdxBRStart = 5
265265
266266 let bFuncIdxReserveEnd = 6
267267
268268 let bFuncIdxSupplyEnd = 7
269269
270270 let bFuncIdxBREnd = 8
271271
272272 let bFuncIdxRest = 9
273273
274274 let bFuncIdxWavesPrice = 10
275275
276276 func keyControlAddress () = "%s%s__config__controlAddress"
277277
278278
279279 func keyControlCfg () = "%s__controlConfig"
280280
281281
282282 func readControlCfgOrFail (control) = split_4C(getStringOrFail(control, keyControlCfg()), SEP)
283283
284284
285285 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
286286
287287
288288 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
289289
290290 let controlCfg = readControlCfgOrFail(controlContract)
291291
292292 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
293293
294294 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
295295
296296 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
297297
298298 let liquidationContract = getContractAddressOrFail(controlCfg, IdxControlCfgLiquidationDapp)
299299
300300 let rpdContract = getContractAddressOrFail(controlCfg, IdxControlCfgRpdDapp)
301301
302302 let nsbtStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgNsbtStakingDapp)
303303
304304 let surfStakingContract = getContractAddressOrFail(controlCfg, IdxControlCfgSurfStakingDapp)
305305
306306 let gnsbtControllerContract = getContractAddressOrFail(controlCfg, IdxControlCfgGnsbtControllerDapp)
307307
308308 let neutrinoAssetIdString = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
309309
310310 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
311311
312312 let nsbtAssetIdStr = getStringValue(neutrinoContract, keyNsbtAssetId())
313313
314314 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
315315
316316 let surfAssetIdStr = getStringValue(auctionContract, keySurfAssetId())
317317
318318 let surfAssetId = fromBase58String(surfAssetIdStr)
319319
320320 func readUsdnIncomeByDay (stakingAcc,startOfDayTimestamp,xtnPrice) = {
321321 let amtByDayKEY = keyStatsDepositAmtByDay(startOfDayTimestamp)
322322 let incomeStr = getStrOrElse(stakingAcc, amtByDayKEY, "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
323323 let incomeArray = split(incomeStr, SEP)
324324 let supportedAssets = split(getStrOrElse(mathContract, keySupportedRewardAssets(), ""), "_")
325325 func incomeAdder (acc,i) = {
326326 let assetId = supportedAssets[i]
327327 let income = parseIntValue(incomeArray[(i + 1)])
328328 if ((assetId == neutrinoAssetIdString))
329329 then (acc + income)
330330 else {
331331 let pr6 = value(getInteger(controlContract, keyPriceByAsset(assetId)))
332332 let assetInUsdAmt = fraction(income, pr6, MULT8)
333333 (acc + fraction(assetInUsdAmt, MULT6, xtnPrice))
334334 }
335335 }
336336
337337 let $l = [0, 1, 2]
338338 let $s = size($l)
339339 let $acc0 = 0
340340 func $f0_1 ($a,$i) = if (($i >= $s))
341341 then $a
342342 else incomeAdder($a, $l[$i])
343343
344344 func $f0_2 ($a,$i) = if (($i >= $s))
345345 then $a
346346 else throw("List size exceeds 10")
347347
348348 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
349349 }
350350
351351
352352 func calcUsdnIncomeForPeriod (stakingAcc,days) = {
353353 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
354354 let currStartOfDay = toStartOfDay(lastBlock.timestamp)
355355 let startTimestamp = (currStartOfDay - (DAYMILLIS * (days + 1)))
356356 let endTimestamp = (currStartOfDay - DAYMILLIS)
357357 let xtnPrice = asInt(neutrinoMetrics[nMetricWeightedPrice])
358358 let startUsdnAmtTMP = readUsdnIncomeByDay(stakingAcc, startTimestamp, xtnPrice)
359359 let endUsdnAmt = readUsdnIncomeByDay(stakingAcc, endTimestamp, xtnPrice)
360360 let startUsdnAmt = if ((startUsdnAmtTMP == 0))
361361 then endUsdnAmt
362362 else startUsdnAmtTMP
363363 (endUsdnAmt - startUsdnAmt)
364364 }
365365
366366
367367 func calcApr (stakingAcc,periodInDays,incomeForPeriod,stakingAssetPriceToUsdnX6) = {
368368 let totalStaked = getIntOrElse(stakingAcc, "%s%s__stats__activeTotalLocked", 1)
369369 let totalStakedInUsdn = fraction(totalStaked, stakingAssetPriceToUsdnX6, MULT6)
370370 if ((0 > incomeForPeriod))
371371 then 0
372372 else fraction((incomeForPeriod * MULT6), 365, (totalStakedInUsdn * periodInDays))
373373 }
374374
375375
376376 func swapInfoInternal (userAddressStrOrEmpty,amountIn,assetIdStrIn,assetIdStrOutOrEmpty) = {
377377 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
378378 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
379379 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
380380 let limitMaxTokenInUsd = swapParamsTuple._1
381381 let blcks2LmtReset = swapParamsTuple._3
382382 let limitMaxUsdn = swapParamsTuple._7
383383 let assetId = fromBase58String(assetIdStrIn)
384384 let basketAssets = valueOrElse(getString(neutrinoContract, basketAssetsKey()), "WAVES")
385385 let swapType = if (contains(basketAssets, assetIdStrIn))
386386 then "outNeutrino"
387387 else if ((assetId == neutrinoAssetId))
388388 then "outMulti"
389389 else throw(("Can't swap assetId=" + assetIdStrIn))
390- let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amountIn, price, assetIdStrIn, assetIdStrOutOrEmpty], nil))
390+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amountIn, price, assetIdStrIn], nil))
391391 let outNeutrinoInfo = makeString([neutrinoAssetIdString, toString(withdrawTuple._8), toString(withdrawTuple._1), toString(withdrawTuple._6), "1000000"], LISTSEP)
392392 let withdrawBasket = if ((swapType == "outNeutrino"))
393393 then outNeutrinoInfo
394394 else if ((assetIdStrOutOrEmpty == ""))
395395 then withdrawTuple._9
396396 else "WAVES:38000000:123456:42:500000"
397397 $Tuple2(nil, makeString_2C(["%d%d%d%s", toString(blcks2LmtReset), toString(limitMaxTokenInUsd), toString(limitMaxUsdn), withdrawBasket], SEP))
398398 }
399399
400400
401401 @Callable(i)
402402 func reverseSwapLimitREADONLY (lim,isOutMulti) = {
403403 let BR = asInt(asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))[nMetricIdxBR])
404404 let gNsbt = if ((0 >= lim))
405405 then 0
406406 else {
407407 let aParamX8 = toBigInt(getIntOrFail(mathContract, if (isOutMulti)
408408 then keyUsdnSwapAmountAParam()
409409 else keySwapAmountAParam()))
410410 let bParamX16 = toBigInt(getIntOrFail(mathContract, if (isOutMulti)
411411 then keyUsdnSwapAmountBParam()
412412 else keySwapAmountBParam()))
413413 let limDivAX8 = if (isOutMulti)
414414 then fraction(fraction(toBigInt(lim), MULTX10, aParamX8), MULTX6, toBigInt(BR))
415415 else fraction(toBigInt(lim), MULTX10, aParamX8)
416416 let revBX16 = fraction(MULTX16, MULTX16, bParamX16)
417417 toInt(pow(limDivAX8, 8, revBX16, 16, 6, CEILING))
418418 }
419419 $Tuple2(nil, gNsbt)
420420 }
421421
422422
423423
424424 @Callable(i)
425425 func gnsbtInfoINTERNAL (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
426426 let userAddressOrThis = if ((userAddressStrOrEmpty != ""))
427427 then addressFromStringValue(userAddressStrOrEmpty)
428428 else this
429429 let currentPrice = getIntegerValue(controlContract, keyPrice())
430430 let gnsbtFromNsbtDiff = additionalNsbtToStakeOrZero
431431 let gnsbtFromSurfDiff = asInt(invoke(surfStakingContract, "gnsbtFromSurfSYSREADONLY", [additionalSurfToStakeOrZero], nil))
432432 let gNsbtDiff = (gnsbtFromNsbtDiff + gnsbtFromSurfDiff)
433433 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
434434 let limitMaxTokenUsd = swapParamsTuple._1
435435 let blcks2LmtReset = swapParamsTuple._3
436436 let gnsbtAmt = swapParamsTuple._4
437437 let gnsbtAmtTotal = swapParamsTuple._5
438438 let limitMaxUsdn = swapParamsTuple._7
439439 let swapParamsTupleNEW = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, gNsbtDiff], nil))
440440 let limitMaxTokenUsdNEW = swapParamsTupleNEW._1
441441 let blcks2LmtResetNEW = swapParamsTupleNEW._3
442442 let gnsbtAmtNEW = swapParamsTupleNEW._4
443443 let gnsbtAmtTotalNEW = swapParamsTupleNEW._5
444444 let limitMaxUsdnNEW = swapParamsTupleNEW._7
445445 let nsbtBalance = if ((userAddressStrOrEmpty != ""))
446446 then assetBalance(userAddressOrThis, nsbtAssetId)
447447 else 0
448448 let surfBalance = if ((userAddressStrOrEmpty != ""))
449449 then assetBalance(userAddressOrThis, surfAssetId)
450450 else 0
451451 let nsbtBalanceDiff = if ((additionalNsbtToStakeOrZero >= 0))
452452 then additionalNsbtToStakeOrZero
453453 else {
454454 let nsbtUnstakingData = asAnyList(invoke(nsbtStakingContract, "nsbtUnstakingSYSREADONLY", [userAddressStrOrEmpty, (-1 * additionalNsbtToStakeOrZero)], nil))
455455 let nsbtReceiveAmount = asInt(nsbtUnstakingData[2])
456456 let result = -(nsbtReceiveAmount)
457457 result
458458 }
459459 let nsbtBalanceNew = (nsbtBalance - nsbtBalanceDiff)
460460 let surfBalanceNew = (surfBalance - additionalSurfToStakeOrZero)
461461 let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
462462 let gnsbtUser = asInt(gnsbtData[0])
463463 let gnsbtTotal = asInt(gnsbtData[1])
464464 let nsbtData = asAnyList(gnsbtData[2])
465465 let surfData = asAnyList(gnsbtData[3])
466466 let gnsbtSurfTotalMature = asInt(gnsbtData[6])
467467 let gnsbtSurfTotalTeen = asInt(gnsbtData[7])
468468 let gnsbtSurfTotalKid = asInt(gnsbtData[8])
469469 let gnsbtSurfUserMature = asInt(gnsbtData[9])
470470 let gnsbtSurfUserTeen = asInt(gnsbtData[10])
471471 let gnsbtSurfUserKid = asInt(gnsbtData[11])
472472 let gnsbtAmtFromSurfMax = ((gnsbtSurfUserMature + gnsbtSurfUserTeen) + gnsbtSurfUserKid)
473473 let gnsbtAmtFromNsbt = asInt(nsbtData[2])
474474 let gnsbtAmtFromNsbtNEW = (gnsbtAmtFromNsbt + gnsbtFromNsbtDiff)
475475 let gnsbtAmtFromSurfNEW = (gnsbtAmtFromSurfMax + gnsbtFromSurfDiff)
476476 let gnsbtFromNsbtTotal = asInt(nsbtData[3])
477477 let gnsbtFromNsbtTotalNEW = (gnsbtFromNsbtTotal + gnsbtFromNsbtDiff)
478478 let gnsbtFromSurfTotalNEW = (((gnsbtSurfTotalMature + gnsbtSurfTotalTeen) + gnsbtSurfTotalKid) + gnsbtFromSurfDiff)
479479 let votingPower = (gnsbtAmtFromNsbt + gnsbtSurfUserMature)
480480 let votingPowerNew = (gnsbtAmtFromNsbtNEW + gnsbtSurfUserMature)
481481 let votingPowerMax = (gnsbtAmtFromNsbt + gnsbtAmtFromSurfMax)
482482 let votingPowerMaxNew = ((gnsbtAmtFromNsbtNEW + gnsbtAmtFromSurfMax) + gnsbtFromSurfDiff)
483483 let W2 = getIntOrElse(surfStakingContract, keyVpPeriodDuration(), DEFAULTPERIOD)
484484 let period = (height / W2)
485485 let votingPowerEta = if ((gnsbtSurfUserKid != 0))
486486 then ((period + 2) * W2)
487487 else if ((gnsbtSurfUserTeen != 0))
488488 then ((period + 1) * W2)
489489 else height
490490 let votingPowerEtaNew = if ((gnsbtFromSurfDiff != 0))
491491 then ((period + 2) * W2)
492492 else votingPowerEta
493493 $Tuple2(nil, [0, nsbtBalance, surfBalance, nsbtBalanceNew, surfBalanceNew, gnsbtAmtFromNsbt, gnsbtSurfUserMature, gnsbtAmtFromNsbtNEW, gnsbtAmtFromSurfNEW, gnsbtFromNsbtTotal, gnsbtSurfTotalMature, gnsbtFromNsbtTotalNEW, gnsbtFromSurfTotalNEW, limitMaxUsdn, limitMaxTokenUsd, limitMaxUsdnNEW, limitMaxTokenUsdNEW, blcks2LmtReset, blcks2LmtResetNEW, votingPower, votingPowerNew, votingPowerMax, votingPowerMaxNew, votingPowerEta, votingPowerEtaNew])
494494 }
495495
496496
497497
498498 @Callable(i)
499499 func gnsbtInfoREADONLY (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
500500 let gnsbtInfoDATA = asAnyList(invoke(this, "gnsbtInfoINTERNAL", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
501501 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", toString(asInt(gnsbtInfoDATA[1])), toString(asInt(gnsbtInfoDATA[2])), toString(asInt(gnsbtInfoDATA[3])), toString(asInt(gnsbtInfoDATA[4])), toString(asInt(gnsbtInfoDATA[5])), toString(asInt(gnsbtInfoDATA[6])), toString(asInt(gnsbtInfoDATA[7])), toString(asInt(gnsbtInfoDATA[8])), toString(asInt(gnsbtInfoDATA[9])), toString(asInt(gnsbtInfoDATA[10])), toString(asInt(gnsbtInfoDATA[11])), toString(asInt(gnsbtInfoDATA[12])), toString(asInt(gnsbtInfoDATA[13])), toString(asInt(gnsbtInfoDATA[14])), toString(asInt(gnsbtInfoDATA[15])), toString(asInt(gnsbtInfoDATA[16])), toString(asInt(gnsbtInfoDATA[17])), toString(asInt(gnsbtInfoDATA[18])), toString(asInt(gnsbtInfoDATA[19])), toString(asInt(gnsbtInfoDATA[20])), toString(asInt(gnsbtInfoDATA[21])), toString(asInt(gnsbtInfoDATA[22])), toString(asInt(gnsbtInfoDATA[23])), toString(asInt(gnsbtInfoDATA[24]))], SEP))
502502 }
503503
504504
505505
506506 @Callable(i)
507507 func gnsbtEffectiveREADONLY (userAddressStrOrEmpty) = {
508508 let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, 0, 0], nil))
509509 let nsbtData = asAnyList(gnsbtData[2])
510510 let userFromNsbt = asInt(nsbtData[2])
511511 let totalFromNsbt = asInt(nsbtData[3])
512512 let userMatureFromSurf = asInt(gnsbtData[9])
513513 let totalMatureFromSurf = asInt(gnsbtData[6])
514514 $Tuple2(nil, makeString(["%d%d", toString((totalFromNsbt + totalMatureFromSurf)), toString((userFromNsbt + userMatureFromSurf))], SEP))
515515 }
516516
517517
518518
519519 @Callable(i)
520520 func rewardInfoREADONLY (userAddressStrOrEmpty) = {
521521 let rewardsData = asAnyList(invoke(gnsbtControllerContract, "gnsbtRewardsSYSREADONLY", [userAddressStrOrEmpty], nil))
522522 let usdnRewards = asString(invoke(rpdContract, "unclaimedRewardsREADONLY", [userAddressStrOrEmpty], nil))
523523 $Tuple2(nil, makeString_2C(["%s%s%s", asString(rewardsData[0]), asString(rewardsData[1]), usdnRewards], SEP))
524524 }
525525
526526
527527
528528 @Callable(i)
529529 func mergeNsbtREADONLY (userAddressMandatory,newAmount) = {
530530 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressMandatory, newAmount], nil))
531531 let amount0 = asInt(nsbtData[0])
532532 let startHeight = if ((0 >= amount0))
533533 then -1
534534 else asInt(nsbtData[2])
535535 let startTimestamp = toTimestamp(startHeight)
536536 let startHeightNew = if ((0 >= newAmount))
537537 then startHeight
538538 else if ((0 >= amount0))
539539 then height
540540 else {
541541 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
542542 asInt(invoke(mathContract, "mergeStakesREADONLY", [amount0, startHeight, newAmount, height, halfLife], nil))
543543 }
544544 let startTimestampNew = toTimestamp(startHeightNew)
545545 $Tuple2(nil, makeString(["%d%d%d%d", toString(startHeight), toString(startTimestamp), toString(startHeightNew), toString(startTimestampNew)], SEP))
546546 }
547547
548548
549549
550550 @Callable(i)
551551 func swapLimitCalculatorREADONLY (userAddressStrOpt,limitWanted,assetIdStr) = {
552552 let gNsbtCurrent = if ((userAddressStrOpt == ""))
553553 then 0
554554 else asInt(asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))._4)
555555 let price = valueOrErrorMessage(getInteger(controlContract, keyPriceByAsset(assetIdStr)), ("No price for asset " + assetIdStr))
556556 let isOutMulti = (assetIdStr == neutrinoAssetIdString)
557557 let limitWantedUsdn = if (isOutMulti)
558558 then limitWanted
559559 else convertTokenToUsd(limitWanted, price)
560560 let gNsbtNeeded = asInt(invoke(this, "reverseSwapLimitREADONLY", [limitWantedUsdn, isOutMulti], nil))
561561 let gNsbtDelta = (gNsbtNeeded - gNsbtCurrent)
562562 $Tuple2(nil, makeString(["%s%s", toString(gNsbtCurrent), toString(gNsbtDelta)], SEP))
563563 }
564564
565565
566566
567567 @Callable(i)
568568 func swapInfoREADONLY (userAddressStrOrEmpty,amount,assetIdStr) = {
569569 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
570570 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
571571 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
572572 let limitMaxTokenInUsd = swapParamsTuple._1
573573 let blcks2LmtReset = swapParamsTuple._3
574574 let limitMaxUsdn = swapParamsTuple._7
575575 let assetId = fromBase58String(assetIdStr)
576576 let basketAssets = valueOrElse(getString(neutrinoContract, basketAssetsKey()), "WAVES")
577577 let swapType = if (contains(basketAssets, assetIdStr))
578578 then "outNeutrino"
579579 else if ((assetId == neutrinoAssetId))
580580 then "outMulti"
581581 else throw(("Can't swap assetId=" + assetIdStr))
582- let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr, ""], nil))
582+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr], nil))
583583 let outNetAmount = withdrawTuple._1
584584 let outSurfAmt = withdrawTuple._3
585585 let inAmtToSurfPart = withdrawTuple._4
586586 let outFeeAmount = withdrawTuple._6
587587 let outAmtGross = withdrawTuple._7
588588 let withdrawPrice = withdrawTuple._8
589589 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(outNetAmount), toString(outSurfAmt), toString(outFeeAmount), toString(withdrawPrice), toString(blcks2LmtReset), toString(limitMaxTokenInUsd), toString(limitMaxUsdn), toString(inAmtToSurfPart)], SEP))
590590 }
591591
592592
593593
594594 @Callable(i)
595595 func swapInfoV2READONLY (userAddressStrOrEmpty,amount,assetIdStr) = swapInfoInternal(userAddressStrOrEmpty, amount, assetIdStr, "")
596596
597597
598598
599599 @Callable(i)
600600 func swapInfoV3READONLY (userAddressStrOrEmpty,amountIn,assetIdStrIn,assetIdStrOutOrEmpty) = swapInfoInternal(userAddressStrOrEmpty, amountIn, assetIdStrIn, assetIdStrOutOrEmpty)
601601
602602
603603
604604 @Callable(i)
605605 func basketInfoREADONLY () = {
606606 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
607607 let basketInfo = asString(neutrinoMetrics[nMetricBasketInfo])
608608 let basket = split_4C(basketInfo, "_")
609609 func modify (acc,item) = {
610610 let parts = split(item, LISTSEP)
611611 let assetId = parts[0]
612612 let dlog6 = valueOrErrorMessage(getInteger(neutrinoContract, basketLogbDeltaKey()), "log(b, delta) key is undefined")
613613 let D6 = valueOrErrorMessage(getInteger(neutrinoContract, basketDKey()), "D key is undefined")
614614 let b6 = valueOrErrorMessage(getInteger(neutrinoContract, basketBKey()), "b key is undefined")
615615 let w6 = valueOrErrorMessage(getInteger(neutrinoContract, basketWeightByAssetKey(assetId)), (("Target weight for asset " + assetId) + " is undefined"))
616616 let p6 = ((dlog6 - w6) + parseIntValue(parts[1]))
617617 let d = (D6 - pow(b6, 6, p6, 6, 6, HALFUP))
618618 (acc :+ makeString(((parts :+ toString(w6)) :+ toString(d)), LISTSEP))
619619 }
620620
621621 let b = {
622622 let $l = basket
623623 let $s = size($l)
624624 let $acc0 = nil
625625 func $f0_1 ($a,$i) = if (($i >= $s))
626626 then $a
627627 else modify($a, $l[$i])
628628
629629 func $f0_2 ($a,$i) = if (($i >= $s))
630630 then $a
631631 else throw("List size exceeds 10")
632632
633633 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
634634 }
635635 $Tuple2(nil, ("%s__" + makeString_2C(b, "_")))
636636 }
637637
638638
639639
640640 @Callable(i)
641641 func usdnStakingAprREADONLY (days) = {
642642 let tmpDays = 1
643643 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
644644 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
645645 let wavesIncome = (0 * MULT8)
646646 let incomeForPeriod = fraction(wavesIncome, currentPrice, MULT8)
647647 let apr = calcApr(rpdContract, tmpDays, incomeForPeriod, MULT6)
648648 $Tuple2(nil, ("%d__" + toString(apr)))
649649 }
650650
651651
652652
653653 @Callable(i)
654654 func surfStakingAprREADONLY (days) = {
655655 let tmpDays = 3
656656 let incomeForPeriod = calcUsdnIncomeForPeriod(surfStakingContract, tmpDays)
657657 let surfPriceToUsdnX6 = 86400
658658 let apr = calcApr(surfStakingContract, tmpDays, incomeForPeriod, surfPriceToUsdnX6)
659659 $Tuple2(nil, ("%d__" + toString(apr)))
660660 }
661661
662662
663663
664664 @Callable(i)
665665 func surfStakingAprV2READONLY (days,surfUsdnPriceX6) = {
666666 let tmpDays = 3
667667 let incomeForPeriod = calcUsdnIncomeForPeriod(surfStakingContract, tmpDays)
668668 let apr = calcApr(surfStakingContract, tmpDays, incomeForPeriod, surfUsdnPriceX6)
669669 $Tuple2(nil, ("%d__" + toString(apr)))
670670 }
671671
672672
673673
674674 @Callable(i)
675675 func nsbtStakingAprREADONLY (days) = {
676676 let tmpDays = 3
677677 let nsbtPriceToUsdnX6 = 8000000
678678 let incomeForPeriod = calcUsdnIncomeForPeriod(nsbtStakingContract, tmpDays)
679679 let apr = calcApr(nsbtStakingContract, tmpDays, incomeForPeriod, nsbtPriceToUsdnX6)
680680 $Tuple2(nil, ("%d__" + toString(apr)))
681681 }
682682
683683
684684
685685 @Callable(i)
686686 func nsbtStakingAprV2READONLY (days,nsbtUsdnPriceX6) = {
687687 let tmpDays = 3
688688 let incomeForPeriod = calcUsdnIncomeForPeriod(nsbtStakingContract, tmpDays)
689689 let apr = calcApr(nsbtStakingContract, tmpDays, incomeForPeriod, nsbtUsdnPriceX6)
690690 $Tuple2(nil, ("%d__" + toString(apr)))
691691 }
692692
693693

github/deemru/w8io/873ac7e 
106.50 ms