tx · EBkWvwwQdkNq78iCATwVkzhcvtS36DC1wxGaPXPTYLxQ

3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh:  -0.02600000 Waves

2023.08.31 15:40 [2734869] smart account 3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh > SELF 0.00000000 Waves

{ "type": 13, "id": "EBkWvwwQdkNq78iCATwVkzhcvtS36DC1wxGaPXPTYLxQ", "fee": 2600000, "feeAssetId": null, "timestamp": 1693485676352, "version": 2, "chainId": 84, "sender": "3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh", "senderPublicKey": "HiTi1JT7GQRqLNxg4yZhD1mV42y1Mv2AYvRx92JQRbwX", "proofs": [ "4CSdgQZkkNVmmdEk8P6cy5D99Ssik9g46k45hrEvotrtTewjeqHkWydvcPtZZJDBnce1GWxPUi3vaBhMTGzvTsN2" ], "script": "base64:BgJgCAISBAoCAQQSBQoDCAEBEgUKAwgBARIDCgEIEgMKAQgSBAoCCAESBQoDCAEIEgUKAwgBCBIFCgMIAQgSBgoECAEICBIAEgMKAQESAwoBARIECgIBARIDCgEBEgQKAgEBeQAGRVVMRVI4ANaJz4EBAAVNVUxUNgDAhD0ABk1VTFRYNgkAtgIBAMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg4CQC2AgEAgMLXLwAHTVVMVFgxMAkAtgIBAIDIr6AlAAZNVUxUMTIAgKCUpY0dAAdNVUxUWDE2CQC2AgEAgICE/qbe4REABk1VTFQxOAkAtgIBAICAkLu61q3wDQADU0VQAgJfXwAHTElTVFNFUAIBOgARREVGQVVMVFNXQVBGRUVOMlcAiCcAEURFRkFVTFRTV0FQRkVFVzJOAKCcAQALQlJQUk9URUNURUQAoI0GAAdXQVZFU0lECQDZBAECBVdBVkVTAAlEQVlNSUxMSVMAgLiZKQANREVGQVVMVFBFUklPRAkAaAIAoAsADgESa2V5TmV1dHJpbm9Bc3NldElkAAIRbmV1dHJpbm9fYXNzZXRfaWQBDmtleU5zYnRBc3NldElkAAINYm9uZF9hc3NldF9pZAEOa2V5U3VyZkFzc2V0SWQAAg1zdXJmX2Fzc2V0X2lkARNrZXlTd2FwQW1vdW50QVBhcmFtAAIYJXMlc19fY29uZmlnX19zd2FwQVBhcmFtARNrZXlTd2FwQW1vdW50QlBhcmFtAAIYJXMlc19fY29uZmlnX19zd2FwQlBhcmFtARdrZXlVc2RuU3dhcEFtb3VudEFQYXJhbQACHCVzJXNfX2NvbmZpZ19fdXNkblN3YXBBUGFyYW0BF2tleVVzZG5Td2FwQW1vdW50QlBhcmFtAAIcJXMlc19fY29uZmlnX191c2RuU3dhcEJQYXJhbQETa2V5TnNidExvY2tDb250cmFjdAACFCVzX19uc2J0TG9ja0NvbnRyYWN0AQ9rZXlNYXRoQ29udHJhY3QAAhAlc19fbWF0aENvbnRyYWN0AQ9iYXNrZXRBc3NldHNLZXkAAholcyVzX19jb21tb25fX2Jhc2tldEFzc2V0cwEKYmFza2V0REtleQACFSVzJXNfX2NvbW1vbl9fYmFza2V0RAEKYmFza2V0QktleQACFSVzJXNfX2NvbW1vbl9fYmFza2V0QgESYmFza2V0TG9nYkRlbHRhS2V5AAIdJXMlc19fY29tbW9uX19iYXNrZXRMb2diRGVsdGEBFmJhc2tldFdlaWdodEJ5QXNzZXRLZXkBB2Fzc2V0SWQJAKwCAgIfJXMlcyVzX19jb21tb25fX3dlaWdodEJ5QXNzZXRfXwUHYXNzZXRJZAEIa2V5UHJpY2UAAgVwcmljZQEPa2V5UHJpY2VCeUFzc2V0AQdhc3NldElkCQCsAgICHiVzJXMlc19fY29tbW9uX19wcmljZUJ5QXNzZXRfXwUHYXNzZXRJZAEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgIFc3RhcnQFA25pbAUDU0VQAQtrZXlIYWxmTGlmZQACDCVzX19oYWxmTGlmZQEQa2V5TWluTG9ja0Ftb3VudAACESVzX19taW5Mb2NrQW1vdW50ARNrZXlWcFBlcmlvZER1cmF0aW9uAAkAuQkCCQDMCAICBCVzJXMJAMwIAgICdnAJAMwIAgIOcGVyaW9kRHVyYXRpb24FA25pbAUDU0VQARVrZXlNaW5XYXZlc0Zvck5zYnRCdXkAAhJtaW5fd2F2ZXNfbnNidF9idXkBDmtleU1pbk5zYnRTZWxsAAINbWluX25zYnRfc2VsbAEXa2V5U3RhdHNEZXBvc2l0QW10QnlEYXkBCXRpbWVzdGFtcAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgVzdGF0cwkAzAgCAg9kZXBvc2l0QW10QnlEYXkJAMwIAgkApAMBBQl0aW1lc3RhbXAFA25pbAUDU0VQARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBDHRvU3RhcnRPZkRheQEJdGltZXN0YW1wCQBoAgkAaQIFCXRpbWVzdGFtcAUJREFZTUlMTElTBQlEQVlNSUxMSVMBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAENZ2V0Qm9vbE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UDB2FkZHJlc3MDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUHYWRkcmVzcwUDa2V5BQpkZWZhdWx0VmFsAQxnZXRTdHJPckVsc2UDB2FkZHJlc3MDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5BQpkZWZhdWx0VmFsARZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAgZhbW91bnQFcHJpY2UJAGsDBQZhbW91bnQFBU1VTFQ4BQVwcmljZQERY29udmVydFRva2VuVG9Vc2QCBmFtb3VudAVwcmljZQkAawMFBmFtb3VudAUFcHJpY2UFBU1VTFQ4AQlhc0FueUxpc3QBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCUxpc3RbQW55XQQKdmFsQW55TGlzdAUHJG1hdGNoMAUKdmFsQW55TGlzdAkAAgECG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCGFzU3RyaW5nAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnZhbFN0cgUHJG1hdGNoMAUGdmFsU3RyCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQxhc1R1cGxlMkludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEAXYFByRtYXRjaDAFAXYJAAIBAh1mYWlsIHRvIGNhc3QgaW50byBUdXBsZTIgaW50cwESYXNTd2FwUGFyYW1zU1RSVUNUAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAiMoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50KQQGc3RydWN0BQckbWF0Y2gwBQZzdHJ1Y3QJAAIBAiJmYWlsIHRvIGNhc3QgaW50byBTd2FwUGFyYW1zU1RSVUNUARZhc1dpdGhkcmF3UmVzdWx0U1RSVUNUAQN2YWwEByRtYXRjaDAFA3ZhbAMDCQABAgUHJG1hdGNoMAIxKEludCwgVW5pdCwgSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgU3RyaW5nKQYJAAECBQckbWF0Y2gwAjcoSW50LCBCeXRlVmVjdG9yLCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50LCBTdHJpbmcpBAZzdHJ1Y3QFByRtYXRjaDAFBnN0cnVjdAkAAgECIGZhaWwgdG8gY2FzdCBpbnRvIFdpdGhkcmF3UmVzdWx0AQt0b1RpbWVzdGFtcAEFc3RhcnQDCQBmAgAABQVzdGFydAD///////////8BBAckbWF0Y2gwCQDtBwEFBXN0YXJ0AwkAAQIFByRtYXRjaDACCUJsb2NrSW5mbwQFYmxvY2sFByRtYXRjaDAIBQVibG9jawl0aW1lc3RhbXAA////////////AQEFdG9YMTgCB29yaWdWYWwNb3JpZ1NjYWxlTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFBk1VTFQxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQdmcm9tWDE4AgN2YWwPcmVzdWx0U2NhbGVNdWx0CQCgAwEJALwCAwUDdmFsCQC2AgEFD3Jlc3VsdFNjYWxlTXVsdAUGTVVMVDE4AA9uTWV0cmljSWR4UHJpY2UAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlAAEAHG5NZXRyaWNJZHhXYXZlc0xvY2tlZEJhbGFuY2UAAgARbk1ldHJpY0lkeFJlc2VydmUAAwAXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4ABAAUbk1ldHJpY0lkeFVzZG5TdXBwbHkABQARbk1ldHJpY0lkeFN1cnBsdXMABgAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50AAcADG5NZXRyaWNJZHhCUgAIABRuTWV0cmljSWR4TnNidFN1cHBseQAJABduTWV0cmljSWR4TWF4TnNidFN1cHBseQAKABRuTWV0cmljSWR4U3VyZlN1cHBseQALABJuTWV0cmljVXNkblVzZHRQZWcADAAWbk1ldHJpY0N1cnJlbnRQcmljZUFkagANABFuTWV0cmljQmFza2V0SW5mbwAOABRuTWV0cmljV2VpZ2h0ZWRQcmljZQAPABduTWV0cmljVG90YWxSZXNlcnZlc1VzZAAQABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAEAGElkeENvbnRyb2xDZmdBdWN0aW9uRGFwcAACABRJZHhDb250cm9sQ2ZnUnBkRGFwcAADABVJZHhDb250cm9sQ2ZnTWF0aERhcHAABAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAFABVJZHhDb250cm9sQ2ZnUmVzdERhcHAABgAdSWR4Q29udHJvbENmZ05vZGVSZWdpc3RyeURhcHAABwAcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAAIABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAkAHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAACgAgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAACwAMYkZ1bmNJZHhTdXJmAAAADWJGdW5jSWR4V2F2ZXMAAQAMYkZ1bmNJZHhVc2RuAAIAFGJGdW5jSWR4UmVzZXJ2ZVN0YXJ0AAMAE2JGdW5jSWR4U3VwcGx5U3RhcnQABAAPYkZ1bmNJZHhCUlN0YXJ0AAUAEmJGdW5jSWR4UmVzZXJ2ZUVuZAAGABFiRnVuY0lkeFN1cHBseUVuZAAHAA1iRnVuY0lkeEJSRW5kAAgADGJGdW5jSWR4UmVzdAAJABJiRnVuY0lkeFdhdmVzUHJpY2UACgERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAA9hdWN0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAE2xpcXVpZGF0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAtycGRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFFElkeENvbnRyb2xDZmdScGREYXBwABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAATc3VyZlN0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAAF2duc2J0Q29udHJvbGxlckNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBD2dldFN0cmluZ09yRmFpbAIFEG5ldXRyaW5vQ29udHJhY3QJARJrZXlOZXV0cmlub0Fzc2V0SWQAAA9uZXV0cmlub0Fzc2V0SWQJANkEAQUVbmV1dHJpbm9Bc3NldElkU3RyaW5nAA5uc2J0QXNzZXRJZFN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUQbmV1dHJpbm9Db250cmFjdAkBDmtleU5zYnRBc3NldElkAAALbnNidEFzc2V0SWQJANkEAQUObnNidEFzc2V0SWRTdHIADnN1cmZBc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9hdWN0aW9uQ29udHJhY3QJAQ5rZXlTdXJmQXNzZXRJZAAAC3N1cmZBc3NldElkCQDZBAEFDnN1cmZBc3NldElkU3RyARNyZWFkVXNkbkluY29tZUJ5RGF5AwpzdGFraW5nQWNjE3N0YXJ0T2ZEYXlUaW1lc3RhbXAIeHRuUHJpY2UEC2FtdEJ5RGF5S0VZCQEXa2V5U3RhdHNEZXBvc2l0QW10QnlEYXkBBRNzdGFydE9mRGF5VGltZXN0YW1wBAlpbmNvbWVTdHIJAQxnZXRTdHJPckVsc2UDBQpzdGFraW5nQWNjBQthbXRCeURheUtFWQJaJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wBAtpbmNvbWVBcnJheQkAtQkCBQlpbmNvbWVTdHIFA1NFUAQPc3VwcG9ydGVkQXNzZXRzCQC1CQIJAQxnZXRTdHJPckVsc2UDBQxtYXRoQ29udHJhY3QJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAgACAV8KAQtpbmNvbWVBZGRlcgIDYWNjAWkEB2Fzc2V0SWQJAJEDAgUPc3VwcG9ydGVkQXNzZXRzBQFpBAZpbmNvbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtpbmNvbWVBcnJheQkAZAIFAWkAAQMJAAACBQdhc3NldElkBRVuZXV0cmlub0Fzc2V0SWRTdHJpbmcJAGQCBQNhY2MFBmluY29tZQQDcHI2CQEFdmFsdWUBCQCaCAIFD2NvbnRyb2xDb250cmFjdAkBD2tleVByaWNlQnlBc3NldAEFB2Fzc2V0SWQEDWFzc2V0SW5Vc2RBbXQJAGsDBQZpbmNvbWUFA3ByNgUFTVVMVDgJAGQCBQNhY2MJAGsDBQ1hc3NldEluVXNkQW10BQVNVUxUNgUIeHRuUHJpY2UKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtpbmNvbWVBZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEXY2FsY1VzZG5JbmNvbWVGb3JQZXJpb2QCCnN0YWtpbmdBY2MEZGF5cwQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAQOY3VyclN0YXJ0T2ZEYXkJAQx0b1N0YXJ0T2ZEYXkBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQOc3RhcnRUaW1lc3RhbXAJAGUCBQ5jdXJyU3RhcnRPZkRheQkAaAIFCURBWU1JTExJUwkAZAIFBGRheXMAAQQMZW5kVGltZXN0YW1wCQBlAgUOY3VyclN0YXJ0T2ZEYXkFCURBWU1JTExJUwQIeHRuUHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBRRuTWV0cmljV2VpZ2h0ZWRQcmljZQQPc3RhcnRVc2RuQW10VE1QCQETcmVhZFVzZG5JbmNvbWVCeURheQMFCnN0YWtpbmdBY2MFDnN0YXJ0VGltZXN0YW1wBQh4dG5QcmljZQQKZW5kVXNkbkFtdAkBE3JlYWRVc2RuSW5jb21lQnlEYXkDBQpzdGFraW5nQWNjBQxlbmRUaW1lc3RhbXAFCHh0blByaWNlBAxzdGFydFVzZG5BbXQDCQAAAgUPc3RhcnRVc2RuQW10VE1QAAAFCmVuZFVzZG5BbXQFD3N0YXJ0VXNkbkFtdFRNUAkAZQIFCmVuZFVzZG5BbXQFDHN0YXJ0VXNkbkFtdAEHY2FsY0FwcgQKc3Rha2luZ0FjYwxwZXJpb2RJbkRheXMPaW5jb21lRm9yUGVyaW9kGXN0YWtpbmdBc3NldFByaWNlVG9Vc2RuWDYEC3RvdGFsU3Rha2VkCQEMZ2V0SW50T3JFbHNlAwUKc3Rha2luZ0FjYwIeJXMlc19fc3RhdHNfX2FjdGl2ZVRvdGFsTG9ja2VkAAEEEXRvdGFsU3Rha2VkSW5Vc2RuCQBrAwULdG90YWxTdGFrZWQFGXN0YWtpbmdBc3NldFByaWNlVG9Vc2RuWDYFBU1VTFQ2AwkAZgIAAAUPaW5jb21lRm9yUGVyaW9kAAAJAGsDCQBoAgUPaW5jb21lRm9yUGVyaW9kBQVNVUxUNgDtAgkAaAIFEXRvdGFsU3Rha2VkSW5Vc2RuBQxwZXJpb2RJbkRheXMBEHN3YXBJbmZvSW50ZXJuYWwEFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQhhbW91bnRJbgxhc3NldElkU3RySW4UYXNzZXRJZFN0ck91dE9yRW1wdHkED25ldXRyaW5vTWV0cmljcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwEBXByaWNlCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUPbk1ldHJpY0lkeFByaWNlBA9zd2FwUGFyYW1zVHVwbGUJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgAABQNuaWwFA25pbAQSbGltaXRNYXhUb2tlbkluVXNkCAUPc3dhcFBhcmFtc1R1cGxlAl8xBA5ibGNrczJMbXRSZXNldAgFD3N3YXBQYXJhbXNUdXBsZQJfMwQMbGltaXRNYXhVc2RuCAUPc3dhcFBhcmFtc1R1cGxlAl83BAdhc3NldElkCQDZBAEFDGFzc2V0SWRTdHJJbgQMYmFza2V0QXNzZXRzCQELdmFsdWVPckVsc2UCCQCdCAIFEG5ldXRyaW5vQ29udHJhY3QJAQ9iYXNrZXRBc3NldHNLZXkAAgVXQVZFUwQIc3dhcFR5cGUDCQEIY29udGFpbnMCBQxiYXNrZXRBc3NldHMFDGFzc2V0SWRTdHJJbgILb3V0TmV1dHJpbm8DCQAAAgUHYXNzZXRJZAUPbmV1dHJpbm9Bc3NldElkAghvdXRNdWx0aQkAAgEJAKwCAgITQ2FuJ3Qgc3dhcCBhc3NldElkPQUMYXNzZXRJZFN0ckluBA13aXRoZHJhd1R1cGxlCQEWYXNXaXRoZHJhd1Jlc3VsdFNUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIdY2FsY1dpdGhkcmF3UmVzdWx0U1lTUkVBRE9OTFkJAMwIAgUIc3dhcFR5cGUJAMwIAgUIYW1vdW50SW4JAMwIAgUFcHJpY2UJAMwIAgUMYXNzZXRJZFN0ckluCQDMCAIFFGFzc2V0SWRTdHJPdXRPckVtcHR5BQNuaWwFA25pbAQPb3V0TmV1dHJpbm9JbmZvCQC5CQIJAMwIAgUVbmV1dHJpbm9Bc3NldElkU3RyaW5nCQDMCAIJAKQDAQgFDXdpdGhkcmF3VHVwbGUCXzgJAMwIAgkApAMBCAUNd2l0aGRyYXdUdXBsZQJfMQkAzAgCCQCkAwEIBQ13aXRoZHJhd1R1cGxlAl82CQDMCAICBzEwMDAwMDAFA25pbAUHTElTVFNFUAQOd2l0aGRyYXdCYXNrZXQDCQAAAgUIc3dhcFR5cGUCC291dE5ldXRyaW5vBQ9vdXROZXV0cmlub0luZm8IBQ13aXRoZHJhd1R1cGxlAl85CQCUCgIFA25pbAkAugkCCQDMCAICCCVkJWQlZCVzCQDMCAIJAKQDAQUOYmxja3MyTG10UmVzZXQJAMwIAgkApAMBBRJsaW1pdE1heFRva2VuSW5Vc2QJAMwIAgkApAMBBQxsaW1pdE1heFVzZG4JAMwIAgUOd2l0aGRyYXdCYXNrZXQFA25pbAUDU0VQEAFpARhyZXZlcnNlU3dhcExpbWl0UkVBRE9OTFkCA2xpbQppc091dE11bHRpBAJCUgkBBWFzSW50AQkAkQMCCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAUMbk1ldHJpY0lkeEJSBAVnTnNidAMJAGcCAAAFA2xpbQAABAhhUGFyYW1YOAkAtgIBCQEMZ2V0SW50T3JGYWlsAgUMbWF0aENvbnRyYWN0AwUKaXNPdXRNdWx0aQkBF2tleVVzZG5Td2FwQW1vdW50QVBhcmFtAAkBE2tleVN3YXBBbW91bnRBUGFyYW0ABAliUGFyYW1YMTYJALYCAQkBDGdldEludE9yRmFpbAIFDG1hdGhDb250cmFjdAMFCmlzT3V0TXVsdGkJARdrZXlVc2RuU3dhcEFtb3VudEJQYXJhbQAJARNrZXlTd2FwQW1vdW50QlBhcmFtAAQJbGltRGl2QVg4AwUKaXNPdXRNdWx0aQkAvAIDCQC8AgMJALYCAQUDbGltBQdNVUxUWDEwBQhhUGFyYW1YOAUGTVVMVFg2CQC2AgEFAkJSCQC8AgMJALYCAQUDbGltBQdNVUxUWDEwBQhhUGFyYW1YOAQHcmV2QlgxNgkAvAIDBQdNVUxUWDE2BQdNVUxUWDE2BQliUGFyYW1YMTYJAKADAQkAdgYFCWxpbURpdkFYOAAIBQdyZXZCWDE2ABAABgUHQ0VJTElORwkAlAoCBQNuaWwFBWdOc2J0AWkBEWduc2J0SW5mb0lOVEVSTkFMAxV1c2VyQWRkcmVzc1N0ck9yRW1wdHkbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvG2FkZGl0aW9uYWxTdXJmVG9TdGFrZU9yWmVybwQRdXNlckFkZHJlc3NPclRoaXMDCQECIT0CBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkCAAkBEUBleHRyTmF0aXZlKDEwNjIpAQUVdXNlckFkZHJlc3NTdHJPckVtcHR5BQR0aGlzBAxjdXJyZW50UHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD2NvbnRyb2xDb250cmFjdAkBCGtleVByaWNlAAQRZ25zYnRGcm9tTnNidERpZmYFG2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybwQRZ25zYnRGcm9tU3VyZkRpZmYJAQVhc0ludAEJAPwHBAUTc3VyZlN0YWtpbmdDb250cmFjdAIYZ25zYnRGcm9tU3VyZlNZU1JFQURPTkxZCQDMCAIFG2FkZGl0aW9uYWxTdXJmVG9TdGFrZU9yWmVybwUDbmlsBQNuaWwECWdOc2J0RGlmZgkAZAIFEWduc2J0RnJvbU5zYnREaWZmBRFnbnNidEZyb21TdXJmRGlmZgQPc3dhcFBhcmFtc1R1cGxlCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIAAAUDbmlsBQNuaWwEEGxpbWl0TWF4VG9rZW5Vc2QIBQ9zd2FwUGFyYW1zVHVwbGUCXzEEDmJsY2tzMkxtdFJlc2V0CAUPc3dhcFBhcmFtc1R1cGxlAl8zBAhnbnNidEFtdAgFD3N3YXBQYXJhbXNUdXBsZQJfNAQNZ25zYnRBbXRUb3RhbAgFD3N3YXBQYXJhbXNUdXBsZQJfNQQMbGltaXRNYXhVc2RuCAUPc3dhcFBhcmFtc1R1cGxlAl83BBJzd2FwUGFyYW1zVHVwbGVORVcJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgUJZ05zYnREaWZmBQNuaWwFA25pbAQTbGltaXRNYXhUb2tlblVzZE5FVwgFEnN3YXBQYXJhbXNUdXBsZU5FVwJfMQQRYmxja3MyTG10UmVzZXRORVcIBRJzd2FwUGFyYW1zVHVwbGVORVcCXzMEC2duc2J0QW10TkVXCAUSc3dhcFBhcmFtc1R1cGxlTkVXAl80BBBnbnNidEFtdFRvdGFsTkVXCAUSc3dhcFBhcmFtc1R1cGxlTkVXAl81BA9saW1pdE1heFVzZG5ORVcIBRJzd2FwUGFyYW1zVHVwbGVORVcCXzcEC25zYnRCYWxhbmNlAwkBAiE9AgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAPAHAgURdXNlckFkZHJlc3NPclRoaXMFC25zYnRBc3NldElkAAAEC3N1cmZCYWxhbmNlAwkBAiE9AgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAPAHAgURdXNlckFkZHJlc3NPclRoaXMFC3N1cmZBc3NldElkAAAED25zYnRCYWxhbmNlRGlmZgMJAGcCBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8AAAUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvBBFuc2J0VW5zdGFraW5nRGF0YQkBCWFzQW55TGlzdAEJAPwHBAUTbnNidFN0YWtpbmdDb250cmFjdAIYbnNidFVuc3Rha2luZ1NZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCCQBoAgD///////////8BBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8FA25pbAUDbmlsBBFuc2J0UmVjZWl2ZUFtb3VudAkBBWFzSW50AQkAkQMCBRFuc2J0VW5zdGFraW5nRGF0YQACBAZyZXN1bHQJAQEtAQURbnNidFJlY2VpdmVBbW91bnQFBnJlc3VsdAQObnNidEJhbGFuY2VOZXcJAGUCBQtuc2J0QmFsYW5jZQUPbnNidEJhbGFuY2VEaWZmBA5zdXJmQmFsYW5jZU5ldwkAZQIFC3N1cmZCYWxhbmNlBRthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8ECWduc2J0RGF0YQkBCWFzQW55TGlzdAEJAPwHBAUXZ25zYnRDb250cm9sbGVyQ29udHJhY3QCFGduc2J0SW5mb1NZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8JAMwIAgUbYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBQNuaWwFA25pbAQJZ25zYnRVc2VyCQEFYXNJbnQBCQCRAwIFCWduc2J0RGF0YQAABApnbnNidFRvdGFsCQEFYXNJbnQBCQCRAwIFCWduc2J0RGF0YQABBAhuc2J0RGF0YQkBCWFzQW55TGlzdAEJAJEDAgUJZ25zYnREYXRhAAIECHN1cmZEYXRhCQEJYXNBbnlMaXN0AQkAkQMCBQlnbnNidERhdGEAAwQUZ25zYnRTdXJmVG90YWxNYXR1cmUJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAYEEmduc2J0U3VyZlRvdGFsVGVlbgkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEABwQRZ25zYnRTdXJmVG90YWxLaWQJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAgEE2duc2J0U3VyZlVzZXJNYXR1cmUJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAkEEWduc2J0U3VyZlVzZXJUZWVuCQEFYXNJbnQBCQCRAwIFCWduc2J0RGF0YQAKBBBnbnNidFN1cmZVc2VyS2lkCQEFYXNJbnQBCQCRAwIFCWduc2J0RGF0YQALBBNnbnNidEFtdEZyb21TdXJmTWF4CQBkAgkAZAIFE2duc2J0U3VyZlVzZXJNYXR1cmUFEWduc2J0U3VyZlVzZXJUZWVuBRBnbnNidFN1cmZVc2VyS2lkBBBnbnNidEFtdEZyb21Oc2J0CQEFYXNJbnQBCQCRAwIFCG5zYnREYXRhAAIEE2duc2J0QW10RnJvbU5zYnRORVcJAGQCBRBnbnNidEFtdEZyb21Oc2J0BRFnbnNidEZyb21Oc2J0RGlmZgQTZ25zYnRBbXRGcm9tU3VyZk5FVwkAZAIFE2duc2J0QW10RnJvbVN1cmZNYXgFEWduc2J0RnJvbVN1cmZEaWZmBBJnbnNidEZyb21Oc2J0VG90YWwJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAwQVZ25zYnRGcm9tTnNidFRvdGFsTkVXCQBkAgUSZ25zYnRGcm9tTnNidFRvdGFsBRFnbnNidEZyb21Oc2J0RGlmZgQVZ25zYnRGcm9tU3VyZlRvdGFsTkVXCQBkAgkAZAIJAGQCBRRnbnNidFN1cmZUb3RhbE1hdHVyZQUSZ25zYnRTdXJmVG90YWxUZWVuBRFnbnNidFN1cmZUb3RhbEtpZAURZ25zYnRGcm9tU3VyZkRpZmYEC3ZvdGluZ1Bvd2VyCQBkAgUQZ25zYnRBbXRGcm9tTnNidAUTZ25zYnRTdXJmVXNlck1hdHVyZQQOdm90aW5nUG93ZXJOZXcJAGQCBRNnbnNidEFtdEZyb21Oc2J0TkVXBRNnbnNidFN1cmZVc2VyTWF0dXJlBA52b3RpbmdQb3dlck1heAkAZAIFEGduc2J0QW10RnJvbU5zYnQFE2duc2J0QW10RnJvbVN1cmZNYXgEEXZvdGluZ1Bvd2VyTWF4TmV3CQBkAgkAZAIFE2duc2J0QW10RnJvbU5zYnRORVcFE2duc2J0QW10RnJvbVN1cmZNYXgFEWduc2J0RnJvbVN1cmZEaWZmBAJXMgkBDGdldEludE9yRWxzZQMFE3N1cmZTdGFraW5nQ29udHJhY3QJARNrZXlWcFBlcmlvZER1cmF0aW9uAAUNREVGQVVMVFBFUklPRAQGcGVyaW9kCQBpAgUGaGVpZ2h0BQJXMgQOdm90aW5nUG93ZXJFdGEDCQECIT0CBRBnbnNidFN1cmZVc2VyS2lkAAAJAGgCCQBkAgUGcGVyaW9kAAIFAlcyAwkBAiE9AgURZ25zYnRTdXJmVXNlclRlZW4AAAkAaAIJAGQCBQZwZXJpb2QAAQUCVzIFBmhlaWdodAQRdm90aW5nUG93ZXJFdGFOZXcDCQECIT0CBRFnbnNidEZyb21TdXJmRGlmZgAACQBoAgkAZAIFBnBlcmlvZAACBQJXMgUOdm90aW5nUG93ZXJFdGEJAJQKAgUDbmlsCQDMCAIAAAkAzAgCBQtuc2J0QmFsYW5jZQkAzAgCBQtzdXJmQmFsYW5jZQkAzAgCBQ5uc2J0QmFsYW5jZU5ldwkAzAgCBQ5zdXJmQmFsYW5jZU5ldwkAzAgCBRBnbnNidEFtdEZyb21Oc2J0CQDMCAIFE2duc2J0U3VyZlVzZXJNYXR1cmUJAMwIAgUTZ25zYnRBbXRGcm9tTnNidE5FVwkAzAgCBRNnbnNidEFtdEZyb21TdXJmTkVXCQDMCAIFEmduc2J0RnJvbU5zYnRUb3RhbAkAzAgCBRRnbnNidFN1cmZUb3RhbE1hdHVyZQkAzAgCBRVnbnNidEZyb21Oc2J0VG90YWxORVcJAMwIAgUVZ25zYnRGcm9tU3VyZlRvdGFsTkVXCQDMCAIFDGxpbWl0TWF4VXNkbgkAzAgCBRBsaW1pdE1heFRva2VuVXNkCQDMCAIFD2xpbWl0TWF4VXNkbk5FVwkAzAgCBRNsaW1pdE1heFRva2VuVXNkTkVXCQDMCAIFDmJsY2tzMkxtdFJlc2V0CQDMCAIFEWJsY2tzMkxtdFJlc2V0TkVXCQDMCAIFC3ZvdGluZ1Bvd2VyCQDMCAIFDnZvdGluZ1Bvd2VyTmV3CQDMCAIFDnZvdGluZ1Bvd2VyTWF4CQDMCAIFEXZvdGluZ1Bvd2VyTWF4TmV3CQDMCAIFDnZvdGluZ1Bvd2VyRXRhCQDMCAIFEXZvdGluZ1Bvd2VyRXRhTmV3BQNuaWwBaQERZ25zYnRJbmZvUkVBRE9OTFkDFXVzZXJBZGRyZXNzU3RyT3JFbXB0eRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8bYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBA1nbnNidEluZm9EQVRBCQEJYXNBbnlMaXN0AQkA/AcEBQR0aGlzAhFnbnNidEluZm9JTlRFUk5BTAkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvCQDMCAIFG2FkZGl0aW9uYWxTdXJmVG9TdGFrZU9yWmVybwUDbmlsBQNuaWwJAJQKAgUDbmlsCQC5CQIJAMwIAgIwJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAEJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAAgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQADCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAQJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEABQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAGCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAcJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEACAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAJCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAoJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEACwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAMCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAA0JAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEADgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAPCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABAJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAEQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQASCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABMJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAFAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAVCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABYJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAFwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAYBQNuaWwFA1NFUAFpARZnbnNidEVmZmVjdGl2ZVJFQURPTkxZARV1c2VyQWRkcmVzc1N0ck9yRW1wdHkECWduc2J0RGF0YQkBCWFzQW55TGlzdAEJAPwHBAUXZ25zYnRDb250cm9sbGVyQ29udHJhY3QCFGduc2J0SW5mb1NZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAQIbnNidERhdGEJAQlhc0FueUxpc3QBCQCRAwIFCWduc2J0RGF0YQACBAx1c2VyRnJvbU5zYnQJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAgQNdG90YWxGcm9tTnNidAkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQADBBJ1c2VyTWF0dXJlRnJvbVN1cmYJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAkEE3RvdGFsTWF0dXJlRnJvbVN1cmYJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAYJAJQKAgUDbmlsCQC5CQIJAMwIAgIEJWQlZAkAzAgCCQCkAwEJAGQCBQ10b3RhbEZyb21Oc2J0BRN0b3RhbE1hdHVyZUZyb21TdXJmCQDMCAIJAKQDAQkAZAIFDHVzZXJGcm9tTnNidAUSdXNlck1hdHVyZUZyb21TdXJmBQNuaWwFA1NFUAFpARJyZXdhcmRJbmZvUkVBRE9OTFkBFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQLcmV3YXJkc0RhdGEJAQlhc0FueUxpc3QBCQD8BwQFF2duc2J0Q29udHJvbGxlckNvbnRyYWN0AhdnbnNidFJld2FyZHNTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkFA25pbAUDbmlsBAt1c2RuUmV3YXJkcwkBCGFzU3RyaW5nAQkA/AcEBQtycGRDb250cmFjdAIYdW5jbGFpbWVkUmV3YXJkc1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUDbmlsBQNuaWwJAJQKAgUDbmlsCQC6CQIJAMwIAgIGJXMlcyVzCQDMCAIJAQhhc1N0cmluZwEJAJEDAgULcmV3YXJkc0RhdGEAAAkAzAgCCQEIYXNTdHJpbmcBCQCRAwIFC3Jld2FyZHNEYXRhAAEJAMwIAgULdXNkblJld2FyZHMFA25pbAUDU0VQAWkBEW1lcmdlTnNidFJFQURPTkxZAhR1c2VyQWRkcmVzc01hbmRhdG9yeQluZXdBbW91bnQECG5zYnREYXRhCQEJYXNBbnlMaXN0AQkA/AcEBRNuc2J0U3Rha2luZ0NvbnRyYWN0AhZuc2J0U3Rha2luZ1NZU1JFQURPTkxZCQDMCAIFFHVzZXJBZGRyZXNzTWFuZGF0b3J5CQDMCAIFCW5ld0Ftb3VudAUDbmlsBQNuaWwEB2Ftb3VudDAJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAAQLc3RhcnRIZWlnaHQDCQBnAgAABQdhbW91bnQwAP///////////wEJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAgQOc3RhcnRUaW1lc3RhbXAJAQt0b1RpbWVzdGFtcAEFC3N0YXJ0SGVpZ2h0BA5zdGFydEhlaWdodE5ldwMJAGcCAAAFCW5ld0Ftb3VudAULc3RhcnRIZWlnaHQDCQBnAgAABQdhbW91bnQwBQZoZWlnaHQECGhhbGZMaWZlCQEMZ2V0SW50T3JGYWlsAgUTbnNidFN0YWtpbmdDb250cmFjdAkBC2tleUhhbGZMaWZlAAkBBWFzSW50AQkA/AcEBQxtYXRoQ29udHJhY3QCE21lcmdlU3Rha2VzUkVBRE9OTFkJAMwIAgUHYW1vdW50MAkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQluZXdBbW91bnQJAMwIAgUGaGVpZ2h0CQDMCAIFCGhhbGZMaWZlBQNuaWwFA25pbAQRc3RhcnRUaW1lc3RhbXBOZXcJAQt0b1RpbWVzdGFtcAEFDnN0YXJ0SGVpZ2h0TmV3CQCUCgIFA25pbAkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQULc3RhcnRIZWlnaHQJAMwIAgkApAMBBQ5zdGFydFRpbWVzdGFtcAkAzAgCCQCkAwEFDnN0YXJ0SGVpZ2h0TmV3CQDMCAIJAKQDAQURc3RhcnRUaW1lc3RhbXBOZXcFA25pbAUDU0VQAWkBG3N3YXBMaW1pdENhbGN1bGF0b3JSRUFET05MWQMRdXNlckFkZHJlc3NTdHJPcHQLbGltaXRXYW50ZWQKYXNzZXRJZFN0cgQMZ05zYnRDdXJyZW50AwkAAAIFEXVzZXJBZGRyZXNzU3RyT3B0AgAAAAkBBWFzSW50AQgJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBRF1c2VyQWRkcmVzc1N0ck9wdAkAzAgCAAAFA25pbAUDbmlsAl80BAVwcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2NvbnRyb2xDb250cmFjdAkBD2tleVByaWNlQnlBc3NldAEFCmFzc2V0SWRTdHIJAKwCAgITTm8gcHJpY2UgZm9yIGFzc2V0IAUKYXNzZXRJZFN0cgQKaXNPdXRNdWx0aQkAAAIFCmFzc2V0SWRTdHIFFW5ldXRyaW5vQXNzZXRJZFN0cmluZwQPbGltaXRXYW50ZWRVc2RuAwUKaXNPdXRNdWx0aQULbGltaXRXYW50ZWQJARFjb252ZXJ0VG9rZW5Ub1VzZAIFC2xpbWl0V2FudGVkBQVwcmljZQQLZ05zYnROZWVkZWQJAQVhc0ludAEJAPwHBAUEdGhpcwIYcmV2ZXJzZVN3YXBMaW1pdFJFQURPTkxZCQDMCAIFD2xpbWl0V2FudGVkVXNkbgkAzAgCBQppc091dE11bHRpBQNuaWwFA25pbAQKZ05zYnREZWx0YQkAZQIFC2dOc2J0TmVlZGVkBQxnTnNidEN1cnJlbnQJAJQKAgUDbmlsCQC5CQIJAMwIAgIEJXMlcwkAzAgCCQCkAwEFDGdOc2J0Q3VycmVudAkAzAgCCQCkAwEFCmdOc2J0RGVsdGEFA25pbAUDU0VQAWkBEHN3YXBJbmZvUkVBRE9OTFkDFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQZhbW91bnQKYXNzZXRJZFN0cgQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAQFcHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBQ9uTWV0cmljSWR4UHJpY2UED3N3YXBQYXJhbXNUdXBsZQkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCAAAFA25pbAUDbmlsBBJsaW1pdE1heFRva2VuSW5Vc2QIBQ9zd2FwUGFyYW1zVHVwbGUCXzEEDmJsY2tzMkxtdFJlc2V0CAUPc3dhcFBhcmFtc1R1cGxlAl8zBAxsaW1pdE1heFVzZG4IBQ9zd2FwUGFyYW1zVHVwbGUCXzcEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQMYmFza2V0QXNzZXRzCQELdmFsdWVPckVsc2UCCQCdCAIFEG5ldXRyaW5vQ29udHJhY3QJAQ9iYXNrZXRBc3NldHNLZXkAAgVXQVZFUwQIc3dhcFR5cGUDCQEIY29udGFpbnMCBQxiYXNrZXRBc3NldHMFCmFzc2V0SWRTdHICC291dE5ldXRyaW5vAwkAAAIFB2Fzc2V0SWQFD25ldXRyaW5vQXNzZXRJZAIIb3V0TXVsdGkJAAIBCQCsAgICE0Nhbid0IHN3YXAgYXNzZXRJZD0FCmFzc2V0SWRTdHIEDXdpdGhkcmF3VHVwbGUJARZhc1dpdGhkcmF3UmVzdWx0U1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ah1jYWxjV2l0aGRyYXdSZXN1bHRTWVNSRUFET05MWQkAzAgCBQhzd2FwVHlwZQkAzAgCBQZhbW91bnQJAMwIAgUFcHJpY2UJAMwIAgUKYXNzZXRJZFN0cgkAzAgCAgAFA25pbAUDbmlsBAxvdXROZXRBbW91bnQIBQ13aXRoZHJhd1R1cGxlAl8xBApvdXRTdXJmQW10CAUNd2l0aGRyYXdUdXBsZQJfMwQPaW5BbXRUb1N1cmZQYXJ0CAUNd2l0aGRyYXdUdXBsZQJfNAQMb3V0RmVlQW1vdW50CAUNd2l0aGRyYXdUdXBsZQJfNgQLb3V0QW10R3Jvc3MIBQ13aXRoZHJhd1R1cGxlAl83BA13aXRoZHJhd1ByaWNlCAUNd2l0aGRyYXdUdXBsZQJfOAkAlAoCBQNuaWwJALkJAgkAzAgCAhAlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUMb3V0TmV0QW1vdW50CQDMCAIJAKQDAQUKb3V0U3VyZkFtdAkAzAgCCQCkAwEFDG91dEZlZUFtb3VudAkAzAgCCQCkAwEFDXdpdGhkcmF3UHJpY2UJAMwIAgkApAMBBQ5ibGNrczJMbXRSZXNldAkAzAgCCQCkAwEFEmxpbWl0TWF4VG9rZW5JblVzZAkAzAgCCQCkAwEFDGxpbWl0TWF4VXNkbgkAzAgCCQCkAwEFD2luQW10VG9TdXJmUGFydAUDbmlsBQNTRVABaQESc3dhcEluZm9WMlJFQURPTkxZAxV1c2VyQWRkcmVzc1N0ck9yRW1wdHkGYW1vdW50CmFzc2V0SWRTdHIJARBzd2FwSW5mb0ludGVybmFsBAUVdXNlckFkZHJlc3NTdHJPckVtcHR5BQZhbW91bnQFCmFzc2V0SWRTdHICAAFpARJzd2FwSW5mb1YzUkVBRE9OTFkEFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQhhbW91bnRJbgxhc3NldElkU3RySW4UYXNzZXRJZFN0ck91dE9yRW1wdHkJARBzd2FwSW5mb0ludGVybmFsBAUVdXNlckFkZHJlc3NTdHJPckVtcHR5BQhhbW91bnRJbgUMYXNzZXRJZFN0ckluBRRhc3NldElkU3RyT3V0T3JFbXB0eQFpARJiYXNrZXRJbmZvUkVBRE9OTFkABA9uZXV0cmlub01ldHJpY3MJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBApiYXNrZXRJbmZvCQEIYXNTdHJpbmcBCQCRAwIFD25ldXRyaW5vTWV0cmljcwURbk1ldHJpY0Jhc2tldEluZm8EBmJhc2tldAkAvAkCBQpiYXNrZXRJbmZvAgFfCgEGbW9kaWZ5AgNhY2MEaXRlbQQFcGFydHMJALUJAgUEaXRlbQUHTElTVFNFUAQHYXNzZXRJZAkAkQMCBQVwYXJ0cwAABAVkbG9nNgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEG5ldXRyaW5vQ29udHJhY3QJARJiYXNrZXRMb2diRGVsdGFLZXkAAh5sb2coYiwgZGVsdGEpIGtleSBpcyB1bmRlZmluZWQEAkQ2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQbmV1dHJpbm9Db250cmFjdAkBCmJhc2tldERLZXkAAhJEIGtleSBpcyB1bmRlZmluZWQEAmI2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQbmV1dHJpbm9Db250cmFjdAkBCmJhc2tldEJLZXkAAhJiIGtleSBpcyB1bmRlZmluZWQEAnc2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQbmV1dHJpbm9Db250cmFjdAkBFmJhc2tldFdlaWdodEJ5QXNzZXRLZXkBBQdhc3NldElkCQCsAgIJAKwCAgIYVGFyZ2V0IHdlaWdodCBmb3IgYXNzZXQgBQdhc3NldElkAg0gaXMgdW5kZWZpbmVkBAJwNgkAZAIJAGUCBQVkbG9nNgUCdzYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwABBAFkCQBlAgUCRDYJAGwGBQJiNgAGBQJwNgAGAAYFBkhBTEZVUAkAzQgCBQNhY2MJALkJAgkAzQgCCQDNCAIFBXBhcnRzCQCkAwEFAnc2CQCkAwEFAWQFB0xJU1RTRVAEAWIKAAIkbAUGYmFza2V0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQZtb2RpZnkCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgUDbmlsCQCsAgICBCVzX18JALoJAgUBYgIBXwFpARZ1c2RuU3Rha2luZ0FwclJFQURPTkxZAQRkYXlzBAd0bXBEYXlzAAEED25ldXRyaW5vTWV0cmljcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwEDGN1cnJlbnRQcmljZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFD25NZXRyaWNJZHhQcmljZQQLd2F2ZXNJbmNvbWUJAGgCAAAFBU1VTFQ4BA9pbmNvbWVGb3JQZXJpb2QJAGsDBQt3YXZlc0luY29tZQUMY3VycmVudFByaWNlBQVNVUxUOAQDYXByCQEHY2FsY0FwcgQFC3JwZENvbnRyYWN0BQd0bXBEYXlzBQ9pbmNvbWVGb3JQZXJpb2QFBU1VTFQ2CQCUCgIFA25pbAkArAICAgQlZF9fCQCkAwEFA2FwcgFpARZzdXJmU3Rha2luZ0FwclJFQURPTkxZAQRkYXlzBAd0bXBEYXlzAAMED2luY29tZUZvclBlcmlvZAkBF2NhbGNVc2RuSW5jb21lRm9yUGVyaW9kAgUTc3VyZlN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwQRc3VyZlByaWNlVG9Vc2RuWDYAgKMFBANhcHIJAQdjYWxjQXByBAUTc3VyZlN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwUPaW5jb21lRm9yUGVyaW9kBRFzdXJmUHJpY2VUb1VzZG5YNgkAlAoCBQNuaWwJAKwCAgIEJWRfXwkApAMBBQNhcHIBaQEYc3VyZlN0YWtpbmdBcHJWMlJFQURPTkxZAgRkYXlzD3N1cmZVc2RuUHJpY2VYNgQHdG1wRGF5cwADBA9pbmNvbWVGb3JQZXJpb2QJARdjYWxjVXNkbkluY29tZUZvclBlcmlvZAIFE3N1cmZTdGFraW5nQ29udHJhY3QFB3RtcERheXMEA2FwcgkBB2NhbGNBcHIEBRNzdXJmU3Rha2luZ0NvbnRyYWN0BQd0bXBEYXlzBQ9pbmNvbWVGb3JQZXJpb2QFD3N1cmZVc2RuUHJpY2VYNgkAlAoCBQNuaWwJAKwCAgIEJWRfXwkApAMBBQNhcHIBaQEWbnNidFN0YWtpbmdBcHJSRUFET05MWQEEZGF5cwQHdG1wRGF5cwADBBFuc2J0UHJpY2VUb1VzZG5YNgCApOgDBA9pbmNvbWVGb3JQZXJpb2QJARdjYWxjVXNkbkluY29tZUZvclBlcmlvZAIFE25zYnRTdGFraW5nQ29udHJhY3QFB3RtcERheXMEA2FwcgkBB2NhbGNBcHIEBRNuc2J0U3Rha2luZ0NvbnRyYWN0BQd0bXBEYXlzBQ9pbmNvbWVGb3JQZXJpb2QFEW5zYnRQcmljZVRvVXNkblg2CQCUCgIFA25pbAkArAICAgQlZF9fCQCkAwEFA2FwcgFpARhuc2J0U3Rha2luZ0FwclYyUkVBRE9OTFkCBGRheXMPbnNidFVzZG5QcmljZVg2BAd0bXBEYXlzAAMED2luY29tZUZvclBlcmlvZAkBF2NhbGNVc2RuSW5jb21lRm9yUGVyaW9kAgUTbnNidFN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwQDYXByCQEHY2FsY0FwcgQFE25zYnRTdGFraW5nQ29udHJhY3QFB3RtcERheXMFD2luY29tZUZvclBlcmlvZAUPbnNidFVzZG5QcmljZVg2CQCUCgIFA25pbAkArAICAgQlZF9fCQCkAwEFA2FwcgBn6/+2", "height": 2734869, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FqCyvpppz29Jz1RRhDknrvmM7QhkV9XL3QrKsLd1D4bT Next: 39L7vRpEnkpyAA1xv8pGHHy7DTU1APVc1EKpBt43Et9c 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], nil))
390+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amountIn, price, assetIdStrIn, assetIdStrOutOrEmpty], 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
394- else if ((assetIdStrOutOrEmpty == ""))
395- then withdrawTuple._9
396- else "WAVES:38000000:123456:42:500000"
394+ else withdrawTuple._9
397395 $Tuple2(nil, makeString_2C(["%d%d%d%s", toString(blcks2LmtReset), toString(limitMaxTokenInUsd), toString(limitMaxUsdn), withdrawBasket], SEP))
398396 }
399397
579577 else if ((assetId == neutrinoAssetId))
580578 then "outMulti"
581579 else throw(("Can't swap assetId=" + assetIdStr))
582- let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr], nil))
580+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr, ""], nil))
583581 let outNetAmount = withdrawTuple._1
584582 let outSurfAmt = withdrawTuple._3
585583 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], nil))
390+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amountIn, price, assetIdStrIn, assetIdStrOutOrEmpty], 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
394- else if ((assetIdStrOutOrEmpty == ""))
395- then withdrawTuple._9
396- else "WAVES:38000000:123456:42:500000"
394+ else withdrawTuple._9
397395 $Tuple2(nil, makeString_2C(["%d%d%d%s", toString(blcks2LmtReset), toString(limitMaxTokenInUsd), toString(limitMaxUsdn), withdrawBasket], SEP))
398396 }
399397
400398
401399 @Callable(i)
402400 func reverseSwapLimitREADONLY (lim,isOutMulti) = {
403401 let BR = asInt(asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))[nMetricIdxBR])
404402 let gNsbt = if ((0 >= lim))
405403 then 0
406404 else {
407405 let aParamX8 = toBigInt(getIntOrFail(mathContract, if (isOutMulti)
408406 then keyUsdnSwapAmountAParam()
409407 else keySwapAmountAParam()))
410408 let bParamX16 = toBigInt(getIntOrFail(mathContract, if (isOutMulti)
411409 then keyUsdnSwapAmountBParam()
412410 else keySwapAmountBParam()))
413411 let limDivAX8 = if (isOutMulti)
414412 then fraction(fraction(toBigInt(lim), MULTX10, aParamX8), MULTX6, toBigInt(BR))
415413 else fraction(toBigInt(lim), MULTX10, aParamX8)
416414 let revBX16 = fraction(MULTX16, MULTX16, bParamX16)
417415 toInt(pow(limDivAX8, 8, revBX16, 16, 6, CEILING))
418416 }
419417 $Tuple2(nil, gNsbt)
420418 }
421419
422420
423421
424422 @Callable(i)
425423 func gnsbtInfoINTERNAL (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
426424 let userAddressOrThis = if ((userAddressStrOrEmpty != ""))
427425 then addressFromStringValue(userAddressStrOrEmpty)
428426 else this
429427 let currentPrice = getIntegerValue(controlContract, keyPrice())
430428 let gnsbtFromNsbtDiff = additionalNsbtToStakeOrZero
431429 let gnsbtFromSurfDiff = asInt(invoke(surfStakingContract, "gnsbtFromSurfSYSREADONLY", [additionalSurfToStakeOrZero], nil))
432430 let gNsbtDiff = (gnsbtFromNsbtDiff + gnsbtFromSurfDiff)
433431 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
434432 let limitMaxTokenUsd = swapParamsTuple._1
435433 let blcks2LmtReset = swapParamsTuple._3
436434 let gnsbtAmt = swapParamsTuple._4
437435 let gnsbtAmtTotal = swapParamsTuple._5
438436 let limitMaxUsdn = swapParamsTuple._7
439437 let swapParamsTupleNEW = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, gNsbtDiff], nil))
440438 let limitMaxTokenUsdNEW = swapParamsTupleNEW._1
441439 let blcks2LmtResetNEW = swapParamsTupleNEW._3
442440 let gnsbtAmtNEW = swapParamsTupleNEW._4
443441 let gnsbtAmtTotalNEW = swapParamsTupleNEW._5
444442 let limitMaxUsdnNEW = swapParamsTupleNEW._7
445443 let nsbtBalance = if ((userAddressStrOrEmpty != ""))
446444 then assetBalance(userAddressOrThis, nsbtAssetId)
447445 else 0
448446 let surfBalance = if ((userAddressStrOrEmpty != ""))
449447 then assetBalance(userAddressOrThis, surfAssetId)
450448 else 0
451449 let nsbtBalanceDiff = if ((additionalNsbtToStakeOrZero >= 0))
452450 then additionalNsbtToStakeOrZero
453451 else {
454452 let nsbtUnstakingData = asAnyList(invoke(nsbtStakingContract, "nsbtUnstakingSYSREADONLY", [userAddressStrOrEmpty, (-1 * additionalNsbtToStakeOrZero)], nil))
455453 let nsbtReceiveAmount = asInt(nsbtUnstakingData[2])
456454 let result = -(nsbtReceiveAmount)
457455 result
458456 }
459457 let nsbtBalanceNew = (nsbtBalance - nsbtBalanceDiff)
460458 let surfBalanceNew = (surfBalance - additionalSurfToStakeOrZero)
461459 let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
462460 let gnsbtUser = asInt(gnsbtData[0])
463461 let gnsbtTotal = asInt(gnsbtData[1])
464462 let nsbtData = asAnyList(gnsbtData[2])
465463 let surfData = asAnyList(gnsbtData[3])
466464 let gnsbtSurfTotalMature = asInt(gnsbtData[6])
467465 let gnsbtSurfTotalTeen = asInt(gnsbtData[7])
468466 let gnsbtSurfTotalKid = asInt(gnsbtData[8])
469467 let gnsbtSurfUserMature = asInt(gnsbtData[9])
470468 let gnsbtSurfUserTeen = asInt(gnsbtData[10])
471469 let gnsbtSurfUserKid = asInt(gnsbtData[11])
472470 let gnsbtAmtFromSurfMax = ((gnsbtSurfUserMature + gnsbtSurfUserTeen) + gnsbtSurfUserKid)
473471 let gnsbtAmtFromNsbt = asInt(nsbtData[2])
474472 let gnsbtAmtFromNsbtNEW = (gnsbtAmtFromNsbt + gnsbtFromNsbtDiff)
475473 let gnsbtAmtFromSurfNEW = (gnsbtAmtFromSurfMax + gnsbtFromSurfDiff)
476474 let gnsbtFromNsbtTotal = asInt(nsbtData[3])
477475 let gnsbtFromNsbtTotalNEW = (gnsbtFromNsbtTotal + gnsbtFromNsbtDiff)
478476 let gnsbtFromSurfTotalNEW = (((gnsbtSurfTotalMature + gnsbtSurfTotalTeen) + gnsbtSurfTotalKid) + gnsbtFromSurfDiff)
479477 let votingPower = (gnsbtAmtFromNsbt + gnsbtSurfUserMature)
480478 let votingPowerNew = (gnsbtAmtFromNsbtNEW + gnsbtSurfUserMature)
481479 let votingPowerMax = (gnsbtAmtFromNsbt + gnsbtAmtFromSurfMax)
482480 let votingPowerMaxNew = ((gnsbtAmtFromNsbtNEW + gnsbtAmtFromSurfMax) + gnsbtFromSurfDiff)
483481 let W2 = getIntOrElse(surfStakingContract, keyVpPeriodDuration(), DEFAULTPERIOD)
484482 let period = (height / W2)
485483 let votingPowerEta = if ((gnsbtSurfUserKid != 0))
486484 then ((period + 2) * W2)
487485 else if ((gnsbtSurfUserTeen != 0))
488486 then ((period + 1) * W2)
489487 else height
490488 let votingPowerEtaNew = if ((gnsbtFromSurfDiff != 0))
491489 then ((period + 2) * W2)
492490 else votingPowerEta
493491 $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])
494492 }
495493
496494
497495
498496 @Callable(i)
499497 func gnsbtInfoREADONLY (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
500498 let gnsbtInfoDATA = asAnyList(invoke(this, "gnsbtInfoINTERNAL", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
501499 $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))
502500 }
503501
504502
505503
506504 @Callable(i)
507505 func gnsbtEffectiveREADONLY (userAddressStrOrEmpty) = {
508506 let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, 0, 0], nil))
509507 let nsbtData = asAnyList(gnsbtData[2])
510508 let userFromNsbt = asInt(nsbtData[2])
511509 let totalFromNsbt = asInt(nsbtData[3])
512510 let userMatureFromSurf = asInt(gnsbtData[9])
513511 let totalMatureFromSurf = asInt(gnsbtData[6])
514512 $Tuple2(nil, makeString(["%d%d", toString((totalFromNsbt + totalMatureFromSurf)), toString((userFromNsbt + userMatureFromSurf))], SEP))
515513 }
516514
517515
518516
519517 @Callable(i)
520518 func rewardInfoREADONLY (userAddressStrOrEmpty) = {
521519 let rewardsData = asAnyList(invoke(gnsbtControllerContract, "gnsbtRewardsSYSREADONLY", [userAddressStrOrEmpty], nil))
522520 let usdnRewards = asString(invoke(rpdContract, "unclaimedRewardsREADONLY", [userAddressStrOrEmpty], nil))
523521 $Tuple2(nil, makeString_2C(["%s%s%s", asString(rewardsData[0]), asString(rewardsData[1]), usdnRewards], SEP))
524522 }
525523
526524
527525
528526 @Callable(i)
529527 func mergeNsbtREADONLY (userAddressMandatory,newAmount) = {
530528 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressMandatory, newAmount], nil))
531529 let amount0 = asInt(nsbtData[0])
532530 let startHeight = if ((0 >= amount0))
533531 then -1
534532 else asInt(nsbtData[2])
535533 let startTimestamp = toTimestamp(startHeight)
536534 let startHeightNew = if ((0 >= newAmount))
537535 then startHeight
538536 else if ((0 >= amount0))
539537 then height
540538 else {
541539 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
542540 asInt(invoke(mathContract, "mergeStakesREADONLY", [amount0, startHeight, newAmount, height, halfLife], nil))
543541 }
544542 let startTimestampNew = toTimestamp(startHeightNew)
545543 $Tuple2(nil, makeString(["%d%d%d%d", toString(startHeight), toString(startTimestamp), toString(startHeightNew), toString(startTimestampNew)], SEP))
546544 }
547545
548546
549547
550548 @Callable(i)
551549 func swapLimitCalculatorREADONLY (userAddressStrOpt,limitWanted,assetIdStr) = {
552550 let gNsbtCurrent = if ((userAddressStrOpt == ""))
553551 then 0
554552 else asInt(asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))._4)
555553 let price = valueOrErrorMessage(getInteger(controlContract, keyPriceByAsset(assetIdStr)), ("No price for asset " + assetIdStr))
556554 let isOutMulti = (assetIdStr == neutrinoAssetIdString)
557555 let limitWantedUsdn = if (isOutMulti)
558556 then limitWanted
559557 else convertTokenToUsd(limitWanted, price)
560558 let gNsbtNeeded = asInt(invoke(this, "reverseSwapLimitREADONLY", [limitWantedUsdn, isOutMulti], nil))
561559 let gNsbtDelta = (gNsbtNeeded - gNsbtCurrent)
562560 $Tuple2(nil, makeString(["%s%s", toString(gNsbtCurrent), toString(gNsbtDelta)], SEP))
563561 }
564562
565563
566564
567565 @Callable(i)
568566 func swapInfoREADONLY (userAddressStrOrEmpty,amount,assetIdStr) = {
569567 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
570568 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
571569 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
572570 let limitMaxTokenInUsd = swapParamsTuple._1
573571 let blcks2LmtReset = swapParamsTuple._3
574572 let limitMaxUsdn = swapParamsTuple._7
575573 let assetId = fromBase58String(assetIdStr)
576574 let basketAssets = valueOrElse(getString(neutrinoContract, basketAssetsKey()), "WAVES")
577575 let swapType = if (contains(basketAssets, assetIdStr))
578576 then "outNeutrino"
579577 else if ((assetId == neutrinoAssetId))
580578 then "outMulti"
581579 else throw(("Can't swap assetId=" + assetIdStr))
582- let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr], nil))
580+ let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr, ""], nil))
583581 let outNetAmount = withdrawTuple._1
584582 let outSurfAmt = withdrawTuple._3
585583 let inAmtToSurfPart = withdrawTuple._4
586584 let outFeeAmount = withdrawTuple._6
587585 let outAmtGross = withdrawTuple._7
588586 let withdrawPrice = withdrawTuple._8
589587 $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))
590588 }
591589
592590
593591
594592 @Callable(i)
595593 func swapInfoV2READONLY (userAddressStrOrEmpty,amount,assetIdStr) = swapInfoInternal(userAddressStrOrEmpty, amount, assetIdStr, "")
596594
597595
598596
599597 @Callable(i)
600598 func swapInfoV3READONLY (userAddressStrOrEmpty,amountIn,assetIdStrIn,assetIdStrOutOrEmpty) = swapInfoInternal(userAddressStrOrEmpty, amountIn, assetIdStrIn, assetIdStrOutOrEmpty)
601599
602600
603601
604602 @Callable(i)
605603 func basketInfoREADONLY () = {
606604 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
607605 let basketInfo = asString(neutrinoMetrics[nMetricBasketInfo])
608606 let basket = split_4C(basketInfo, "_")
609607 func modify (acc,item) = {
610608 let parts = split(item, LISTSEP)
611609 let assetId = parts[0]
612610 let dlog6 = valueOrErrorMessage(getInteger(neutrinoContract, basketLogbDeltaKey()), "log(b, delta) key is undefined")
613611 let D6 = valueOrErrorMessage(getInteger(neutrinoContract, basketDKey()), "D key is undefined")
614612 let b6 = valueOrErrorMessage(getInteger(neutrinoContract, basketBKey()), "b key is undefined")
615613 let w6 = valueOrErrorMessage(getInteger(neutrinoContract, basketWeightByAssetKey(assetId)), (("Target weight for asset " + assetId) + " is undefined"))
616614 let p6 = ((dlog6 - w6) + parseIntValue(parts[1]))
617615 let d = (D6 - pow(b6, 6, p6, 6, 6, HALFUP))
618616 (acc :+ makeString(((parts :+ toString(w6)) :+ toString(d)), LISTSEP))
619617 }
620618
621619 let b = {
622620 let $l = basket
623621 let $s = size($l)
624622 let $acc0 = nil
625623 func $f0_1 ($a,$i) = if (($i >= $s))
626624 then $a
627625 else modify($a, $l[$i])
628626
629627 func $f0_2 ($a,$i) = if (($i >= $s))
630628 then $a
631629 else throw("List size exceeds 10")
632630
633631 $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)
634632 }
635633 $Tuple2(nil, ("%s__" + makeString_2C(b, "_")))
636634 }
637635
638636
639637
640638 @Callable(i)
641639 func usdnStakingAprREADONLY (days) = {
642640 let tmpDays = 1
643641 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
644642 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
645643 let wavesIncome = (0 * MULT8)
646644 let incomeForPeriod = fraction(wavesIncome, currentPrice, MULT8)
647645 let apr = calcApr(rpdContract, tmpDays, incomeForPeriod, MULT6)
648646 $Tuple2(nil, ("%d__" + toString(apr)))
649647 }
650648
651649
652650
653651 @Callable(i)
654652 func surfStakingAprREADONLY (days) = {
655653 let tmpDays = 3
656654 let incomeForPeriod = calcUsdnIncomeForPeriod(surfStakingContract, tmpDays)
657655 let surfPriceToUsdnX6 = 86400
658656 let apr = calcApr(surfStakingContract, tmpDays, incomeForPeriod, surfPriceToUsdnX6)
659657 $Tuple2(nil, ("%d__" + toString(apr)))
660658 }
661659
662660
663661
664662 @Callable(i)
665663 func surfStakingAprV2READONLY (days,surfUsdnPriceX6) = {
666664 let tmpDays = 3
667665 let incomeForPeriod = calcUsdnIncomeForPeriod(surfStakingContract, tmpDays)
668666 let apr = calcApr(surfStakingContract, tmpDays, incomeForPeriod, surfUsdnPriceX6)
669667 $Tuple2(nil, ("%d__" + toString(apr)))
670668 }
671669
672670
673671
674672 @Callable(i)
675673 func nsbtStakingAprREADONLY (days) = {
676674 let tmpDays = 3
677675 let nsbtPriceToUsdnX6 = 8000000
678676 let incomeForPeriod = calcUsdnIncomeForPeriod(nsbtStakingContract, tmpDays)
679677 let apr = calcApr(nsbtStakingContract, tmpDays, incomeForPeriod, nsbtPriceToUsdnX6)
680678 $Tuple2(nil, ("%d__" + toString(apr)))
681679 }
682680
683681
684682
685683 @Callable(i)
686684 func nsbtStakingAprV2READONLY (days,nsbtUsdnPriceX6) = {
687685 let tmpDays = 3
688686 let incomeForPeriod = calcUsdnIncomeForPeriod(nsbtStakingContract, tmpDays)
689687 let apr = calcApr(nsbtStakingContract, tmpDays, incomeForPeriod, nsbtUsdnPriceX6)
690688 $Tuple2(nil, ("%d__" + toString(apr)))
691689 }
692690
693691

github/deemru/w8io/873ac7e 
84.59 ms