tx · 39L7vRpEnkpyAA1xv8pGHHy7DTU1APVc1EKpBt43Et9c

3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh:  -0.02600000 Waves

2023.10.11 18:21 [2794122] smart account 3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh > SELF 0.00000000 Waves

{ "type": 13, "id": "39L7vRpEnkpyAA1xv8pGHHy7DTU1APVc1EKpBt43Et9c", "fee": 2600000, "feeAssetId": null, "timestamp": 1697037677547, "version": 2, "chainId": 84, "sender": "3NAfzeA3URU6oCV6HvtAiNwqGXsTs87ZpHh", "senderPublicKey": "HiTi1JT7GQRqLNxg4yZhD1mV42y1Mv2AYvRx92JQRbwX", "proofs": [ "366TRzLAXub2KVTjYRPypuGpmeQtZ1QJUqzvDZUhahCDQRt5wKRGXHzK2vykiBm7S46bNxati5pZGYZhdBmj5yG8" ], "script": "base64:BgJgCAISBAoCAQQSBQoDCAEBEgUKAwgBARIDCgEIEgMKAQgSBAoCCAESBQoDCAEIEgUKAwgBCBIFCgMIAQgSBgoECAEICBIAEgMKAQESAwoBARIECgIBARIDCgEBEgQKAgEBeQAGRVVMRVI4ANaJz4EBAAVNVUxUNgDAhD0ABk1VTFRYNgkAtgIBAMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg4CQC2AgEAgMLXLwAHTVVMVFgxMAkAtgIBAIDIr6AlAAZNVUxUMTIAgKCUpY0dAAdNVUxUWDE2CQC2AgEAgICE/qbe4REABk1VTFQxOAkAtgIBAICAkLu61q3wDQADU0VQAgJfXwAHTElTVFNFUAIBOgARREVGQVVMVFNXQVBGRUVOMlcAiCcAEURFRkFVTFRTV0FQRkVFVzJOAKCcAQALQlJQUk9URUNURUQAoI0GAAdXQVZFU0lECQDZBAECBVdBVkVTAAlEQVlNSUxMSVMAgLiZKQANREVGQVVMVFBFUklPRAkAaAIAoAsADgESa2V5TmV1dHJpbm9Bc3NldElkAAIRbmV1dHJpbm9fYXNzZXRfaWQBDmtleU5zYnRBc3NldElkAAINYm9uZF9hc3NldF9pZAEOa2V5U3VyZkFzc2V0SWQAAg1zdXJmX2Fzc2V0X2lkARNrZXlTd2FwQW1vdW50QVBhcmFtAAIYJXMlc19fY29uZmlnX19zd2FwQVBhcmFtARNrZXlTd2FwQW1vdW50QlBhcmFtAAIYJXMlc19fY29uZmlnX19zd2FwQlBhcmFtARdrZXlVc2RuU3dhcEFtb3VudEFQYXJhbQACHCVzJXNfX2NvbmZpZ19fdXNkblN3YXBBUGFyYW0BF2tleVVzZG5Td2FwQW1vdW50QlBhcmFtAAIcJXMlc19fY29uZmlnX191c2RuU3dhcEJQYXJhbQETa2V5TnNidExvY2tDb250cmFjdAACFCVzX19uc2J0TG9ja0NvbnRyYWN0AQ9rZXlNYXRoQ29udHJhY3QAAhAlc19fbWF0aENvbnRyYWN0AQ9iYXNrZXRBc3NldHNLZXkAAholcyVzX19jb21tb25fX2Jhc2tldEFzc2V0cwEKYmFza2V0REtleQACFSVzJXNfX2NvbW1vbl9fYmFza2V0RAEKYmFza2V0QktleQACFSVzJXNfX2NvbW1vbl9fYmFza2V0QgESYmFza2V0TG9nYkRlbHRhS2V5AAIdJXMlc19fY29tbW9uX19iYXNrZXRMb2diRGVsdGEBFmJhc2tldFdlaWdodEJ5QXNzZXRLZXkBB2Fzc2V0SWQJAKwCAgIfJXMlcyVzX19jb21tb25fX3dlaWdodEJ5QXNzZXRfXwUHYXNzZXRJZAEIa2V5UHJpY2UAAgVwcmljZQEPa2V5UHJpY2VCeUFzc2V0AQdhc3NldElkCQCsAgICHiVzJXMlc19fY29tbW9uX19wcmljZUJ5QXNzZXRfXwUHYXNzZXRJZAEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgULdXNlckFkZHJlc3MJAMwIAgIFc3RhcnQFA25pbAUDU0VQAQtrZXlIYWxmTGlmZQACDCVzX19oYWxmTGlmZQEQa2V5TWluTG9ja0Ftb3VudAACESVzX19taW5Mb2NrQW1vdW50ARNrZXlWcFBlcmlvZER1cmF0aW9uAAkAuQkCCQDMCAICBCVzJXMJAMwIAgICdnAJAMwIAgIOcGVyaW9kRHVyYXRpb24FA25pbAUDU0VQARVrZXlNaW5XYXZlc0Zvck5zYnRCdXkAAhJtaW5fd2F2ZXNfbnNidF9idXkBDmtleU1pbk5zYnRTZWxsAAINbWluX25zYnRfc2VsbAEXa2V5U3RhdHNEZXBvc2l0QW10QnlEYXkBCXRpbWVzdGFtcAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgVzdGF0cwkAzAgCAg9kZXBvc2l0QW10QnlEYXkJAMwIAgkApAMBBQl0aW1lc3RhbXAFA25pbAUDU0VQARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBDHRvU3RhcnRPZkRheQEJdGltZXN0YW1wCQBoAgkAaQIFCXRpbWVzdGFtcAUJREFZTUlMTElTBQlEQVlNSUxMSVMBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAENZ2V0Qm9vbE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckVsc2UDB2FkZHJlc3MDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUHYWRkcmVzcwUDa2V5BQpkZWZhdWx0VmFsAQxnZXRTdHJPckVsc2UDB2FkZHJlc3MDa2V5CmRlZmF1bHRWYWwJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUHYWRkcmVzcwUDa2V5BQpkZWZhdWx0VmFsARZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAgZhbW91bnQFcHJpY2UJAGsDBQZhbW91bnQFBU1VTFQ4BQVwcmljZQERY29udmVydFRva2VuVG9Vc2QCBmFtb3VudAVwcmljZQkAawMFBmFtb3VudAUFcHJpY2UFBU1VTFQ4AQlhc0FueUxpc3QBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCUxpc3RbQW55XQQKdmFsQW55TGlzdAUHJG1hdGNoMAUKdmFsQW55TGlzdAkAAgECG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBCGFzU3RyaW5nAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnZhbFN0cgUHJG1hdGNoMAUGdmFsU3RyCQACAQIYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAQxhc1R1cGxlMkludHMBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEAXYFByRtYXRjaDAFAXYJAAIBAh1mYWlsIHRvIGNhc3QgaW50byBUdXBsZTIgaW50cwESYXNTd2FwUGFyYW1zU1RSVUNUAQN2YWwEByRtYXRjaDAFA3ZhbAMJAAECBQckbWF0Y2gwAiMoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50KQQGc3RydWN0BQckbWF0Y2gwBQZzdHJ1Y3QJAAIBAiJmYWlsIHRvIGNhc3QgaW50byBTd2FwUGFyYW1zU1RSVUNUARZhc1dpdGhkcmF3UmVzdWx0U1RSVUNUAQN2YWwEByRtYXRjaDAFA3ZhbAMDCQABAgUHJG1hdGNoMAIxKEludCwgVW5pdCwgSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgU3RyaW5nKQYJAAECBQckbWF0Y2gwAjcoSW50LCBCeXRlVmVjdG9yLCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50LCBTdHJpbmcpBAZzdHJ1Y3QFByRtYXRjaDAFBnN0cnVjdAkAAgECIGZhaWwgdG8gY2FzdCBpbnRvIFdpdGhkcmF3UmVzdWx0AQt0b1RpbWVzdGFtcAEFc3RhcnQDCQBmAgAABQVzdGFydAD///////////8BBAckbWF0Y2gwCQDtBwEFBXN0YXJ0AwkAAQIFByRtYXRjaDACCUJsb2NrSW5mbwQFYmxvY2sFByRtYXRjaDAIBQVibG9jawl0aW1lc3RhbXAA////////////AQEFdG9YMTgCB29yaWdWYWwNb3JpZ1NjYWxlTXVsdAkAvAIDCQC2AgEFB29yaWdWYWwFBk1VTFQxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQdmcm9tWDE4AgN2YWwPcmVzdWx0U2NhbGVNdWx0CQCgAwEJALwCAwUDdmFsCQC2AgEFD3Jlc3VsdFNjYWxlTXVsdAUGTVVMVDE4AA9uTWV0cmljSWR4UHJpY2UAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlAAEAHG5NZXRyaWNJZHhXYXZlc0xvY2tlZEJhbGFuY2UAAgARbk1ldHJpY0lkeFJlc2VydmUAAwAXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4ABAAUbk1ldHJpY0lkeFVzZG5TdXBwbHkABQARbk1ldHJpY0lkeFN1cnBsdXMABgAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50AAcADG5NZXRyaWNJZHhCUgAIABRuTWV0cmljSWR4TnNidFN1cHBseQAJABduTWV0cmljSWR4TWF4TnNidFN1cHBseQAKABRuTWV0cmljSWR4U3VyZlN1cHBseQALABJuTWV0cmljVXNkblVzZHRQZWcADAAWbk1ldHJpY0N1cnJlbnRQcmljZUFkagANABFuTWV0cmljQmFza2V0SW5mbwAOABRuTWV0cmljV2VpZ2h0ZWRQcmljZQAPABduTWV0cmljVG90YWxSZXNlcnZlc1VzZAAQABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAEAGElkeENvbnRyb2xDZmdBdWN0aW9uRGFwcAACABRJZHhDb250cm9sQ2ZnUnBkRGFwcAADABVJZHhDb250cm9sQ2ZnTWF0aERhcHAABAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAFABVJZHhDb250cm9sQ2ZnUmVzdERhcHAABgAdSWR4Q29udHJvbENmZ05vZGVSZWdpc3RyeURhcHAABwAcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAAIABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAkAHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAACgAgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAACwAMYkZ1bmNJZHhTdXJmAAAADWJGdW5jSWR4V2F2ZXMAAQAMYkZ1bmNJZHhVc2RuAAIAFGJGdW5jSWR4UmVzZXJ2ZVN0YXJ0AAMAE2JGdW5jSWR4U3VwcGx5U3RhcnQABAAPYkZ1bmNJZHhCUlN0YXJ0AAUAEmJGdW5jSWR4UmVzZXJ2ZUVuZAAGABFiRnVuY0lkeFN1cHBseUVuZAAHAA1iRnVuY0lkeEJSRW5kAAgADGJGdW5jSWR4UmVzdAAJABJiRnVuY0lkeFdhdmVzUHJpY2UACgERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAA9hdWN0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAE2xpcXVpZGF0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAtycGRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFFElkeENvbnRyb2xDZmdScGREYXBwABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAATc3VyZlN0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFCmNvbnRyb2xDZmcFHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAAF2duc2J0Q29udHJvbGxlckNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkBD2dldFN0cmluZ09yRmFpbAIFEG5ldXRyaW5vQ29udHJhY3QJARJrZXlOZXV0cmlub0Fzc2V0SWQAAA9uZXV0cmlub0Fzc2V0SWQJANkEAQUVbmV1dHJpbm9Bc3NldElkU3RyaW5nAA5uc2J0QXNzZXRJZFN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUQbmV1dHJpbm9Db250cmFjdAkBDmtleU5zYnRBc3NldElkAAALbnNidEFzc2V0SWQJANkEAQUObnNidEFzc2V0SWRTdHIADnN1cmZBc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9hdWN0aW9uQ29udHJhY3QJAQ5rZXlTdXJmQXNzZXRJZAAAC3N1cmZBc3NldElkCQDZBAEFDnN1cmZBc3NldElkU3RyARNyZWFkVXNkbkluY29tZUJ5RGF5AwpzdGFraW5nQWNjE3N0YXJ0T2ZEYXlUaW1lc3RhbXAIeHRuUHJpY2UEC2FtdEJ5RGF5S0VZCQEXa2V5U3RhdHNEZXBvc2l0QW10QnlEYXkBBRNzdGFydE9mRGF5VGltZXN0YW1wBAlpbmNvbWVTdHIJAQxnZXRTdHJPckVsc2UDBQpzdGFraW5nQWNjBQthbXRCeURheUtFWQJaJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wBAtpbmNvbWVBcnJheQkAtQkCBQlpbmNvbWVTdHIFA1NFUAQPc3VwcG9ydGVkQXNzZXRzCQC1CQIJAQxnZXRTdHJPckVsc2UDBRNzdXJmU3Rha2luZ0NvbnRyYWN0CQEYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAIAAgFfCgELaW5jb21lQWRkZXICA2FjYwFpBAdhc3NldElkCQCRAwIFD3N1cHBvcnRlZEFzc2V0cwUBaQQGaW5jb21lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULaW5jb21lQXJyYXkJAGQCBQFpAAEDCQAAAgUHYXNzZXRJZAUVbmV1dHJpbm9Bc3NldElkU3RyaW5nCQBkAgUDYWNjBQZpbmNvbWUEA3ByNgkBBXZhbHVlAQkAmggCBQ9jb250cm9sQ29udHJhY3QJAQ9rZXlQcmljZUJ5QXNzZXQBBQdhc3NldElkBA1hc3NldEluVXNkQW10CQBrAwUGaW5jb21lBQNwcjYFBU1VTFQ4CQBkAgUDYWNjCQBrAwUNYXNzZXRJblVzZEFtdAUFTVVMVDYFCHh0blByaWNlCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELaW5jb21lQWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBF2NhbGNVc2RuSW5jb21lRm9yUGVyaW9kAgpzdGFraW5nQWNjBGRheXMED25ldXRyaW5vTWV0cmljcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwEDmN1cnJTdGFydE9mRGF5CQEMdG9TdGFydE9mRGF5AQgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDnN0YXJ0VGltZXN0YW1wCQBlAgUOY3VyclN0YXJ0T2ZEYXkJAGgCBQlEQVlNSUxMSVMJAGQCBQRkYXlzAAEEDGVuZFRpbWVzdGFtcAkAZQIFDmN1cnJTdGFydE9mRGF5BQlEQVlNSUxMSVMECHh0blByaWNlCQEFYXNJbnQBCQCRAwIFD25ldXRyaW5vTWV0cmljcwUUbk1ldHJpY1dlaWdodGVkUHJpY2UED3N0YXJ0VXNkbkFtdFRNUAkBE3JlYWRVc2RuSW5jb21lQnlEYXkDBQpzdGFraW5nQWNjBQ5zdGFydFRpbWVzdGFtcAUIeHRuUHJpY2UECmVuZFVzZG5BbXQJARNyZWFkVXNkbkluY29tZUJ5RGF5AwUKc3Rha2luZ0FjYwUMZW5kVGltZXN0YW1wBQh4dG5QcmljZQQMc3RhcnRVc2RuQW10AwkAAAIFD3N0YXJ0VXNkbkFtdFRNUAAABQplbmRVc2RuQW10BQ9zdGFydFVzZG5BbXRUTVAJAGUCBQplbmRVc2RuQW10BQxzdGFydFVzZG5BbXQBB2NhbGNBcHIECnN0YWtpbmdBY2MMcGVyaW9kSW5EYXlzD2luY29tZUZvclBlcmlvZBlzdGFraW5nQXNzZXRQcmljZVRvVXNkblg2BAt0b3RhbFN0YWtlZAkBDGdldEludE9yRWxzZQMFCnN0YWtpbmdBY2MCHiVzJXNfX3N0YXRzX19hY3RpdmVUb3RhbExvY2tlZAABBBF0b3RhbFN0YWtlZEluVXNkbgkAawMFC3RvdGFsU3Rha2VkBRlzdGFraW5nQXNzZXRQcmljZVRvVXNkblg2BQVNVUxUNgMJAGYCAAAFD2luY29tZUZvclBlcmlvZAAACQBrAwkAaAIFD2luY29tZUZvclBlcmlvZAUFTVVMVDYA7QIJAGgCBRF0b3RhbFN0YWtlZEluVXNkbgUMcGVyaW9kSW5EYXlzARBzd2FwSW5mb0ludGVybmFsBBV1c2VyQWRkcmVzc1N0ck9yRW1wdHkIYW1vdW50SW4MYXNzZXRJZFN0ckluFGFzc2V0SWRTdHJPdXRPckVtcHR5BA9uZXV0cmlub01ldHJpY3MJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBAVwcmljZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFD25NZXRyaWNJZHhQcmljZQQPc3dhcFBhcmFtc1R1cGxlCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIAAAUDbmlsBQNuaWwEEmxpbWl0TWF4VG9rZW5JblVzZAgFD3N3YXBQYXJhbXNUdXBsZQJfMQQOYmxja3MyTG10UmVzZXQIBQ9zd2FwUGFyYW1zVHVwbGUCXzMEDGxpbWl0TWF4VXNkbggFD3N3YXBQYXJhbXNUdXBsZQJfNwQHYXNzZXRJZAkA2QQBBQxhc3NldElkU3RySW4EDGJhc2tldEFzc2V0cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBRBuZXV0cmlub0NvbnRyYWN0CQEPYmFza2V0QXNzZXRzS2V5AAIFV0FWRVMECHN3YXBUeXBlAwkBCGNvbnRhaW5zAgUMYmFza2V0QXNzZXRzBQxhc3NldElkU3RySW4CC291dE5ldXRyaW5vAwkAAAIFB2Fzc2V0SWQFD25ldXRyaW5vQXNzZXRJZAIIb3V0TXVsdGkJAAIBCQCsAgICE0Nhbid0IHN3YXAgYXNzZXRJZD0FDGFzc2V0SWRTdHJJbgQNd2l0aGRyYXdUdXBsZQkBFmFzV2l0aGRyYXdSZXN1bHRTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCHWNhbGNXaXRoZHJhd1Jlc3VsdFNZU1JFQURPTkxZCQDMCAIFCHN3YXBUeXBlCQDMCAIFCGFtb3VudEluCQDMCAIFBXByaWNlCQDMCAIFDGFzc2V0SWRTdHJJbgkAzAgCBRRhc3NldElkU3RyT3V0T3JFbXB0eQUDbmlsBQNuaWwED291dE5ldXRyaW5vSW5mbwkAuQkCCQDMCAIFFW5ldXRyaW5vQXNzZXRJZFN0cmluZwkAzAgCCQCkAwEIBQ13aXRoZHJhd1R1cGxlAl84CQDMCAIJAKQDAQgFDXdpdGhkcmF3VHVwbGUCXzEJAMwIAgkApAMBCAUNd2l0aGRyYXdUdXBsZQJfNgkAzAgCAgcxMDAwMDAwBQNuaWwFB0xJU1RTRVAEDndpdGhkcmF3QmFza2V0AwkAAAIFCHN3YXBUeXBlAgtvdXROZXV0cmlubwUPb3V0TmV1dHJpbm9JbmZvCAUNd2l0aGRyYXdUdXBsZQJfOQkAlAoCBQNuaWwJALoJAgkAzAgCAgglZCVkJWQlcwkAzAgCCQCkAwEFDmJsY2tzMkxtdFJlc2V0CQDMCAIJAKQDAQUSbGltaXRNYXhUb2tlbkluVXNkCQDMCAIJAKQDAQUMbGltaXRNYXhVc2RuCQDMCAIFDndpdGhkcmF3QmFza2V0BQNuaWwFA1NFUBABaQEYcmV2ZXJzZVN3YXBMaW1pdFJFQURPTkxZAgNsaW0KaXNPdXRNdWx0aQQCQlIJAQVhc0ludAEJAJEDAgkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwFDG5NZXRyaWNJZHhCUgQFZ05zYnQDCQBnAgAABQNsaW0AAAQIYVBhcmFtWDgJALYCAQkBDGdldEludE9yRmFpbAIFDG1hdGhDb250cmFjdAMFCmlzT3V0TXVsdGkJARdrZXlVc2RuU3dhcEFtb3VudEFQYXJhbQAJARNrZXlTd2FwQW1vdW50QVBhcmFtAAQJYlBhcmFtWDE2CQC2AgEJAQxnZXRJbnRPckZhaWwCBQxtYXRoQ29udHJhY3QDBQppc091dE11bHRpCQEXa2V5VXNkblN3YXBBbW91bnRCUGFyYW0ACQETa2V5U3dhcEFtb3VudEJQYXJhbQAECWxpbURpdkFYOAMFCmlzT3V0TXVsdGkJALwCAwkAvAIDCQC2AgEFA2xpbQUHTVVMVFgxMAUIYVBhcmFtWDgFBk1VTFRYNgkAtgIBBQJCUgkAvAIDCQC2AgEFA2xpbQUHTVVMVFgxMAUIYVBhcmFtWDgEB3JldkJYMTYJALwCAwUHTVVMVFgxNgUHTVVMVFgxNgUJYlBhcmFtWDE2CQCgAwEJAHYGBQlsaW1EaXZBWDgACAUHcmV2QlgxNgAQAAYFB0NFSUxJTkcJAJQKAgUDbmlsBQVnTnNidAFpARFnbnNidEluZm9JTlRFUk5BTAMVdXNlckFkZHJlc3NTdHJPckVtcHR5G2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybxthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8EEXVzZXJBZGRyZXNzT3JUaGlzAwkBAiE9AgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUEdGhpcwQMY3VycmVudFByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ9jb250cm9sQ29udHJhY3QJAQhrZXlQcmljZQAEDWduc2J0RGF0YVByZXYJAQlhc0FueUxpc3QBCQD8BwQFE25zYnRTdGFraW5nQ29udHJhY3QCFm5zYnRTdGFraW5nU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIAAAUDbmlsBQNuaWwEEWduc2J0RnJvbU5zYnRQcmV2CQEFYXNJbnQBCQCRAwIFDWduc2J0RGF0YVByZXYAAwQJZ25zYnREYXRhCQEJYXNBbnlMaXN0AQkA/AcEBRdnbnNidENvbnRyb2xsZXJDb250cmFjdAIUZ25zYnRJbmZvU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIFG2FkZGl0aW9uYWxOc2J0VG9TdGFrZU9yWmVybwkAzAgCBRthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8FA25pbAUDbmlsBAhuc2J0RGF0YQkBCWFzQW55TGlzdAEJAJEDAgUJZ25zYnREYXRhAAIEEGduc2J0QW10RnJvbU5zYnQJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAgQRZ25zYnRGcm9tTnNidERpZmYJAGUCBRBnbnNidEFtdEZyb21Oc2J0BRFnbnNidEZyb21Oc2J0UHJldgQRZ25zYnRGcm9tU3VyZkRpZmYJAQVhc0ludAEJAPwHBAUTc3VyZlN0YWtpbmdDb250cmFjdAIYZ25zYnRGcm9tU3VyZlNZU1JFQURPTkxZCQDMCAIFG2FkZGl0aW9uYWxTdXJmVG9TdGFrZU9yWmVybwUDbmlsBQNuaWwECWdOc2J0RGlmZgkAZAIFEWduc2J0RnJvbU5zYnREaWZmBRFnbnNidEZyb21TdXJmRGlmZgQPc3dhcFBhcmFtc1R1cGxlCQESYXNTd2FwUGFyYW1zU1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ahtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAMwIAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5CQDMCAIAAAUDbmlsBQNuaWwEEGxpbWl0TWF4VG9rZW5Vc2QIBQ9zd2FwUGFyYW1zVHVwbGUCXzEEDmJsY2tzMkxtdFJlc2V0CAUPc3dhcFBhcmFtc1R1cGxlAl8zBAhnbnNidEFtdAgFD3N3YXBQYXJhbXNUdXBsZQJfNAQNZ25zYnRBbXRUb3RhbAgFD3N3YXBQYXJhbXNUdXBsZQJfNQQMbGltaXRNYXhVc2RuCAUPc3dhcFBhcmFtc1R1cGxlAl83BBJzd2FwUGFyYW1zVHVwbGVORVcJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgUJZ05zYnREaWZmBQNuaWwFA25pbAQTbGltaXRNYXhUb2tlblVzZE5FVwgFEnN3YXBQYXJhbXNUdXBsZU5FVwJfMQQRYmxja3MyTG10UmVzZXRORVcIBRJzd2FwUGFyYW1zVHVwbGVORVcCXzMEC2duc2J0QW10TkVXCAUSc3dhcFBhcmFtc1R1cGxlTkVXAl80BBBnbnNidEFtdFRvdGFsTkVXCAUSc3dhcFBhcmFtc1R1cGxlTkVXAl81BA9saW1pdE1heFVzZG5ORVcIBRJzd2FwUGFyYW1zVHVwbGVORVcCXzcEC25zYnRCYWxhbmNlAwkBAiE9AgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAPAHAgURdXNlckFkZHJlc3NPclRoaXMFC25zYnRBc3NldElkAAAEC3N1cmZCYWxhbmNlAwkBAiE9AgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAPAHAgURdXNlckFkZHJlc3NPclRoaXMFC3N1cmZBc3NldElkAAAED25zYnRCYWxhbmNlRGlmZgMJAGcCBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8AAAUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvBBFuc2J0VW5zdGFraW5nRGF0YQkBCWFzQW55TGlzdAEJAPwHBAUTbnNidFN0YWtpbmdDb250cmFjdAIYbnNidFVuc3Rha2luZ1NZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCCQBoAgD///////////8BBRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8FA25pbAUDbmlsBBFuc2J0UmVjZWl2ZUFtb3VudAkBBWFzSW50AQkAkQMCBRFuc2J0VW5zdGFraW5nRGF0YQACBAZyZXN1bHQJAQEtAQURbnNidFJlY2VpdmVBbW91bnQFBnJlc3VsdAQObnNidEJhbGFuY2VOZXcJAGUCBQtuc2J0QmFsYW5jZQUPbnNidEJhbGFuY2VEaWZmBA5zdXJmQmFsYW5jZU5ldwkAZQIFC3N1cmZCYWxhbmNlBRthZGRpdGlvbmFsU3VyZlRvU3Rha2VPclplcm8ECWduc2J0VXNlcgkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEAAAQKZ25zYnRUb3RhbAkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEAAQQIc3VyZkRhdGEJAQlhc0FueUxpc3QBCQCRAwIFCWduc2J0RGF0YQADBBRnbnNidFN1cmZUb3RhbE1hdHVyZQkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEABgQSZ25zYnRTdXJmVG90YWxUZWVuCQEFYXNJbnQBCQCRAwIFCWduc2J0RGF0YQAHBBFnbnNidFN1cmZUb3RhbEtpZAkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEACAQTZ25zYnRTdXJmVXNlck1hdHVyZQkBBWFzSW50AQkAkQMCBQlnbnNidERhdGEACQQRZ25zYnRTdXJmVXNlclRlZW4JAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAoEEGduc2J0U3VyZlVzZXJLaWQJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAsEE2duc2J0QW10RnJvbVN1cmZNYXgJAGQCCQBkAgUTZ25zYnRTdXJmVXNlck1hdHVyZQURZ25zYnRTdXJmVXNlclRlZW4FEGduc2J0U3VyZlVzZXJLaWQEE2duc2J0QW10RnJvbU5zYnRORVcJAGQCBRBnbnNidEFtdEZyb21Oc2J0BRFnbnNidEZyb21Oc2J0RGlmZgQTZ25zYnRBbXRGcm9tU3VyZk5FVwkAZAIFE2duc2J0QW10RnJvbVN1cmZNYXgFEWduc2J0RnJvbVN1cmZEaWZmBBJnbnNidEZyb21Oc2J0VG90YWwJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAwQVZ25zYnRGcm9tTnNidFRvdGFsTkVXCQBkAgUSZ25zYnRGcm9tTnNidFRvdGFsBRFnbnNidEZyb21Oc2J0RGlmZgQVZ25zYnRGcm9tU3VyZlRvdGFsTkVXCQBkAgkAZAIJAGQCBRRnbnNidFN1cmZUb3RhbE1hdHVyZQUSZ25zYnRTdXJmVG90YWxUZWVuBRFnbnNidFN1cmZUb3RhbEtpZAURZ25zYnRGcm9tU3VyZkRpZmYEC3ZvdGluZ1Bvd2VyCQBkAgUQZ25zYnRBbXRGcm9tTnNidAUTZ25zYnRTdXJmVXNlck1hdHVyZQQOdm90aW5nUG93ZXJOZXcJAGQCBRNnbnNidEFtdEZyb21Oc2J0TkVXBRNnbnNidFN1cmZVc2VyTWF0dXJlBA52b3RpbmdQb3dlck1heAkAZAIFEGduc2J0QW10RnJvbU5zYnQFE2duc2J0QW10RnJvbVN1cmZNYXgEEXZvdGluZ1Bvd2VyTWF4TmV3CQBkAgkAZAIFE2duc2J0QW10RnJvbU5zYnRORVcFE2duc2J0QW10RnJvbVN1cmZNYXgFEWduc2J0RnJvbVN1cmZEaWZmBAJXMgkBDGdldEludE9yRWxzZQMFE3N1cmZTdGFraW5nQ29udHJhY3QJARNrZXlWcFBlcmlvZER1cmF0aW9uAAUNREVGQVVMVFBFUklPRAQGcGVyaW9kCQBpAgUGaGVpZ2h0BQJXMgQOdm90aW5nUG93ZXJFdGEDCQECIT0CBRBnbnNidFN1cmZVc2VyS2lkAAAJAGgCCQBkAgUGcGVyaW9kAAIFAlcyAwkBAiE9AgURZ25zYnRTdXJmVXNlclRlZW4AAAkAaAIJAGQCBQZwZXJpb2QAAQUCVzIFBmhlaWdodAQRdm90aW5nUG93ZXJFdGFOZXcDCQECIT0CBRFnbnNidEZyb21TdXJmRGlmZgAACQBoAgkAZAIFBnBlcmlvZAACBQJXMgUOdm90aW5nUG93ZXJFdGEJAJQKAgUDbmlsCQDMCAIAAAkAzAgCBQtuc2J0QmFsYW5jZQkAzAgCBQtzdXJmQmFsYW5jZQkAzAgCBQ5uc2J0QmFsYW5jZU5ldwkAzAgCBQ5zdXJmQmFsYW5jZU5ldwkAzAgCBRBnbnNidEFtdEZyb21Oc2J0CQDMCAIFE2duc2J0U3VyZlVzZXJNYXR1cmUJAMwIAgUTZ25zYnRBbXRGcm9tTnNidE5FVwkAzAgCBRNnbnNidEFtdEZyb21TdXJmTkVXCQDMCAIFEmduc2J0RnJvbU5zYnRUb3RhbAkAzAgCBRRnbnNidFN1cmZUb3RhbE1hdHVyZQkAzAgCBRVnbnNidEZyb21Oc2J0VG90YWxORVcJAMwIAgUVZ25zYnRGcm9tU3VyZlRvdGFsTkVXCQDMCAIFDGxpbWl0TWF4VXNkbgkAzAgCBRBsaW1pdE1heFRva2VuVXNkCQDMCAIFD2xpbWl0TWF4VXNkbk5FVwkAzAgCBRNsaW1pdE1heFRva2VuVXNkTkVXCQDMCAIFDmJsY2tzMkxtdFJlc2V0CQDMCAIFEWJsY2tzMkxtdFJlc2V0TkVXCQDMCAIFC3ZvdGluZ1Bvd2VyCQDMCAIFDnZvdGluZ1Bvd2VyTmV3CQDMCAIFDnZvdGluZ1Bvd2VyTWF4CQDMCAIFEXZvdGluZ1Bvd2VyTWF4TmV3CQDMCAIFDnZvdGluZ1Bvd2VyRXRhCQDMCAIFEXZvdGluZ1Bvd2VyRXRhTmV3BQNuaWwBaQERZ25zYnRJbmZvUkVBRE9OTFkDFXVzZXJBZGRyZXNzU3RyT3JFbXB0eRthZGRpdGlvbmFsTnNidFRvU3Rha2VPclplcm8bYWRkaXRpb25hbFN1cmZUb1N0YWtlT3JaZXJvBA1nbnNidEluZm9EQVRBCQEJYXNBbnlMaXN0AQkA/AcEBQR0aGlzAhFnbnNidEluZm9JTlRFUk5BTAkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkJAMwIAgUbYWRkaXRpb25hbE5zYnRUb1N0YWtlT3JaZXJvCQDMCAIFG2FkZGl0aW9uYWxTdXJmVG9TdGFrZU9yWmVybwUDbmlsBQNuaWwJAJQKAgUDbmlsCQC5CQIJAMwIAgIwJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAEJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAAgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQADCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAQJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEABQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAGCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAcJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEACAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAJCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAAoJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEACwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAMCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBAA0JAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEADgkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAPCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABAJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAEQkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQASCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABMJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAFAkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAVCQDMCAIJAKQDAQkBBWFzSW50AQkAkQMCBQ1nbnNidEluZm9EQVRBABYJAMwIAgkApAMBCQEFYXNJbnQBCQCRAwIFDWduc2J0SW5mb0RBVEEAFwkAzAgCCQCkAwEJAQVhc0ludAEJAJEDAgUNZ25zYnRJbmZvREFUQQAYBQNuaWwFA1NFUAFpARZnbnNidEVmZmVjdGl2ZVJFQURPTkxZARV1c2VyQWRkcmVzc1N0ck9yRW1wdHkECWduc2J0RGF0YQkBCWFzQW55TGlzdAEJAPwHBAUXZ25zYnRDb250cm9sbGVyQ29udHJhY3QCFGduc2J0SW5mb1NZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAQIbnNidERhdGEJAQlhc0FueUxpc3QBCQCRAwIFCWduc2J0RGF0YQACBAx1c2VyRnJvbU5zYnQJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAgQNdG90YWxGcm9tTnNidAkBBWFzSW50AQkAkQMCBQhuc2J0RGF0YQADBBJ1c2VyTWF0dXJlRnJvbVN1cmYJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAkEE3RvdGFsTWF0dXJlRnJvbVN1cmYJAQVhc0ludAEJAJEDAgUJZ25zYnREYXRhAAYJAJQKAgUDbmlsCQC5CQIJAMwIAgIEJWQlZAkAzAgCCQCkAwEJAGQCBQ10b3RhbEZyb21Oc2J0BRN0b3RhbE1hdHVyZUZyb21TdXJmCQDMCAIJAKQDAQkAZAIFDHVzZXJGcm9tTnNidAUSdXNlck1hdHVyZUZyb21TdXJmBQNuaWwFA1NFUAFpARJyZXdhcmRJbmZvUkVBRE9OTFkBFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQLcmV3YXJkc0RhdGEJAQlhc0FueUxpc3QBCQD8BwQFF2duc2J0Q29udHJvbGxlckNvbnRyYWN0AhdnbnNidFJld2FyZHNTWVNSRUFET05MWQkAzAgCBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkFA25pbAUDbmlsBAt1c2RuUmV3YXJkcwkBCGFzU3RyaW5nAQkA/AcEBQtycGRDb250cmFjdAIYdW5jbGFpbWVkUmV3YXJkc1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQUDbmlsBQNuaWwJAJQKAgUDbmlsCQC6CQIJAMwIAgIGJXMlcyVzCQDMCAIJAQhhc1N0cmluZwEJAJEDAgULcmV3YXJkc0RhdGEAAAkAzAgCCQEIYXNTdHJpbmcBCQCRAwIFC3Jld2FyZHNEYXRhAAEJAMwIAgULdXNkblJld2FyZHMFA25pbAUDU0VQAWkBEW1lcmdlTnNidFJFQURPTkxZAhR1c2VyQWRkcmVzc01hbmRhdG9yeQluZXdBbW91bnQECG5zYnREYXRhCQEJYXNBbnlMaXN0AQkA/AcEBRNuc2J0U3Rha2luZ0NvbnRyYWN0AhZuc2J0U3Rha2luZ1NZU1JFQURPTkxZCQDMCAIFFHVzZXJBZGRyZXNzTWFuZGF0b3J5CQDMCAIFCW5ld0Ftb3VudAUDbmlsBQNuaWwEB2Ftb3VudDAJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAAQLc3RhcnRIZWlnaHQDCQBnAgAABQdhbW91bnQwAP///////////wEJAQVhc0ludAEJAJEDAgUIbnNidERhdGEAAgQOc3RhcnRUaW1lc3RhbXAJAQt0b1RpbWVzdGFtcAEFC3N0YXJ0SGVpZ2h0BA5zdGFydEhlaWdodE5ldwMJAGcCAAAFCW5ld0Ftb3VudAULc3RhcnRIZWlnaHQDCQBnAgAABQdhbW91bnQwBQZoZWlnaHQECGhhbGZMaWZlCQEMZ2V0SW50T3JGYWlsAgUTbnNidFN0YWtpbmdDb250cmFjdAkBC2tleUhhbGZMaWZlAAkBBWFzSW50AQkA/AcEBQxtYXRoQ29udHJhY3QCE21lcmdlU3Rha2VzUkVBRE9OTFkJAMwIAgUHYW1vdW50MAkAzAgCBQtzdGFydEhlaWdodAkAzAgCBQluZXdBbW91bnQJAMwIAgUGaGVpZ2h0CQDMCAIFCGhhbGZMaWZlBQNuaWwFA25pbAQRc3RhcnRUaW1lc3RhbXBOZXcJAQt0b1RpbWVzdGFtcAEFDnN0YXJ0SGVpZ2h0TmV3CQCUCgIFA25pbAkAuQkCCQDMCAICCCVkJWQlZCVkCQDMCAIJAKQDAQULc3RhcnRIZWlnaHQJAMwIAgkApAMBBQ5zdGFydFRpbWVzdGFtcAkAzAgCCQCkAwEFDnN0YXJ0SGVpZ2h0TmV3CQDMCAIJAKQDAQURc3RhcnRUaW1lc3RhbXBOZXcFA25pbAUDU0VQAWkBG3N3YXBMaW1pdENhbGN1bGF0b3JSRUFET05MWQMRdXNlckFkZHJlc3NTdHJPcHQLbGltaXRXYW50ZWQKYXNzZXRJZFN0cgQMZ05zYnRDdXJyZW50AwkAAAIFEXVzZXJBZGRyZXNzU3RyT3B0AgAAAAkBBWFzSW50AQgJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD8BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBRF1c2VyQWRkcmVzc1N0ck9wdAkAzAgCAAAFA25pbAUDbmlsAl80BAVwcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2NvbnRyb2xDb250cmFjdAkBD2tleVByaWNlQnlBc3NldAEFCmFzc2V0SWRTdHIJAKwCAgITTm8gcHJpY2UgZm9yIGFzc2V0IAUKYXNzZXRJZFN0cgQKaXNPdXRNdWx0aQkAAAIFCmFzc2V0SWRTdHIFFW5ldXRyaW5vQXNzZXRJZFN0cmluZwQPbGltaXRXYW50ZWRVc2RuAwUKaXNPdXRNdWx0aQULbGltaXRXYW50ZWQJARFjb252ZXJ0VG9rZW5Ub1VzZAIFC2xpbWl0V2FudGVkBQVwcmljZQQLZ05zYnROZWVkZWQJAQVhc0ludAEJAPwHBAUEdGhpcwIYcmV2ZXJzZVN3YXBMaW1pdFJFQURPTkxZCQDMCAIFD2xpbWl0V2FudGVkVXNkbgkAzAgCBQppc091dE11bHRpBQNuaWwFA25pbAQKZ05zYnREZWx0YQkAZQIFC2dOc2J0TmVlZGVkBQxnTnNidEN1cnJlbnQJAJQKAgUDbmlsCQC5CQIJAMwIAgIEJXMlcwkAzAgCCQCkAwEFDGdOc2J0Q3VycmVudAkAzAgCCQCkAwEFCmdOc2J0RGVsdGEFA25pbAUDU0VQAWkBEHN3YXBJbmZvUkVBRE9OTFkDFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQZhbW91bnQKYXNzZXRJZFN0cgQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBQxtYXRoQ29udHJhY3QCGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAQFcHJpY2UJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzBQ9uTWV0cmljSWR4UHJpY2UED3N3YXBQYXJhbXNUdXBsZQkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAPwHBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQkAzAgCAAAFA25pbAUDbmlsBBJsaW1pdE1heFRva2VuSW5Vc2QIBQ9zd2FwUGFyYW1zVHVwbGUCXzEEDmJsY2tzMkxtdFJlc2V0CAUPc3dhcFBhcmFtc1R1cGxlAl8zBAxsaW1pdE1heFVzZG4IBQ9zd2FwUGFyYW1zVHVwbGUCXzcEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQMYmFza2V0QXNzZXRzCQELdmFsdWVPckVsc2UCCQCdCAIFEG5ldXRyaW5vQ29udHJhY3QJAQ9iYXNrZXRBc3NldHNLZXkAAgVXQVZFUwQIc3dhcFR5cGUDCQEIY29udGFpbnMCBQxiYXNrZXRBc3NldHMFCmFzc2V0SWRTdHICC291dE5ldXRyaW5vAwkAAAIFB2Fzc2V0SWQFD25ldXRyaW5vQXNzZXRJZAIIb3V0TXVsdGkJAAIBCQCsAgICE0Nhbid0IHN3YXAgYXNzZXRJZD0FCmFzc2V0SWRTdHIEDXdpdGhkcmF3VHVwbGUJARZhc1dpdGhkcmF3UmVzdWx0U1RSVUNUAQkA/AcEBRBuZXV0cmlub0NvbnRyYWN0Ah1jYWxjV2l0aGRyYXdSZXN1bHRTWVNSRUFET05MWQkAzAgCBQhzd2FwVHlwZQkAzAgCBQZhbW91bnQJAMwIAgUFcHJpY2UJAMwIAgUKYXNzZXRJZFN0cgkAzAgCAgAFA25pbAUDbmlsBAxvdXROZXRBbW91bnQIBQ13aXRoZHJhd1R1cGxlAl8xBApvdXRTdXJmQW10CAUNd2l0aGRyYXdUdXBsZQJfMwQPaW5BbXRUb1N1cmZQYXJ0CAUNd2l0aGRyYXdUdXBsZQJfNAQMb3V0RmVlQW1vdW50CAUNd2l0aGRyYXdUdXBsZQJfNgQLb3V0QW10R3Jvc3MIBQ13aXRoZHJhd1R1cGxlAl83BA13aXRoZHJhd1ByaWNlCAUNd2l0aGRyYXdUdXBsZQJfOAkAlAoCBQNuaWwJALkJAgkAzAgCAhAlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUMb3V0TmV0QW1vdW50CQDMCAIJAKQDAQUKb3V0U3VyZkFtdAkAzAgCCQCkAwEFDG91dEZlZUFtb3VudAkAzAgCCQCkAwEFDXdpdGhkcmF3UHJpY2UJAMwIAgkApAMBBQ5ibGNrczJMbXRSZXNldAkAzAgCCQCkAwEFEmxpbWl0TWF4VG9rZW5JblVzZAkAzAgCCQCkAwEFDGxpbWl0TWF4VXNkbgkAzAgCCQCkAwEFD2luQW10VG9TdXJmUGFydAUDbmlsBQNTRVABaQESc3dhcEluZm9WMlJFQURPTkxZAxV1c2VyQWRkcmVzc1N0ck9yRW1wdHkGYW1vdW50CmFzc2V0SWRTdHIJARBzd2FwSW5mb0ludGVybmFsBAUVdXNlckFkZHJlc3NTdHJPckVtcHR5BQZhbW91bnQFCmFzc2V0SWRTdHICAAFpARJzd2FwSW5mb1YzUkVBRE9OTFkEFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQhhbW91bnRJbgxhc3NldElkU3RySW4UYXNzZXRJZFN0ck91dE9yRW1wdHkJARBzd2FwSW5mb0ludGVybmFsBAUVdXNlckFkZHJlc3NTdHJPckVtcHR5BQhhbW91bnRJbgUMYXNzZXRJZFN0ckluBRRhc3NldElkU3RyT3V0T3JFbXB0eQFpARJiYXNrZXRJbmZvUkVBRE9OTFkABA9uZXV0cmlub01ldHJpY3MJAQlhc0FueUxpc3QBCQD8BwQFDG1hdGhDb250cmFjdAIaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFA25pbAUDbmlsBApiYXNrZXRJbmZvCQEIYXNTdHJpbmcBCQCRAwIFD25ldXRyaW5vTWV0cmljcwURbk1ldHJpY0Jhc2tldEluZm8EBmJhc2tldAkAvAkCBQpiYXNrZXRJbmZvAgFfCgEGbW9kaWZ5AgNhY2MEaXRlbQQFcGFydHMJALUJAgUEaXRlbQUHTElTVFNFUAQHYXNzZXRJZAkAkQMCBQVwYXJ0cwAABAVkbG9nNgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEG5ldXRyaW5vQ29udHJhY3QJARJiYXNrZXRMb2diRGVsdGFLZXkAAh5sb2coYiwgZGVsdGEpIGtleSBpcyB1bmRlZmluZWQEAkQ2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQbmV1dHJpbm9Db250cmFjdAkBCmJhc2tldERLZXkAAhJEIGtleSBpcyB1bmRlZmluZWQEAmI2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQbmV1dHJpbm9Db250cmFjdAkBCmJhc2tldEJLZXkAAhJiIGtleSBpcyB1bmRlZmluZWQEAnc2CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQbmV1dHJpbm9Db250cmFjdAkBFmJhc2tldFdlaWdodEJ5QXNzZXRLZXkBBQdhc3NldElkCQCsAgIJAKwCAgIYVGFyZ2V0IHdlaWdodCBmb3IgYXNzZXQgBQdhc3NldElkAg0gaXMgdW5kZWZpbmVkBAJwNgkAZAIJAGUCBQVkbG9nNgUCdzYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwYXJ0cwABBAFkCQBlAgUCRDYJAGwGBQJiNgAGBQJwNgAGAAYFBkhBTEZVUAkAzQgCBQNhY2MJALkJAgkAzQgCCQDNCAIFBXBhcnRzCQCkAwEFAnc2CQCkAwEFAWQFB0xJU1RTRVAEAWIKAAIkbAUGYmFza2V0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQZtb2RpZnkCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgUDbmlsCQCsAgICBCVzX18JALoJAgUBYgIBXwFpARZ1c2RuU3Rha2luZ0FwclJFQURPTkxZAQRkYXlzBAd0bXBEYXlzAAEED25ldXRyaW5vTWV0cmljcwkBCWFzQW55TGlzdAEJAPwHBAUMbWF0aENvbnRyYWN0AhpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUDbmlsBQNuaWwEDGN1cnJlbnRQcmljZQkBBWFzSW50AQkAkQMCBQ9uZXV0cmlub01ldHJpY3MFD25NZXRyaWNJZHhQcmljZQQLd2F2ZXNJbmNvbWUJAGgCAAAFBU1VTFQ4BA9pbmNvbWVGb3JQZXJpb2QJAGsDBQt3YXZlc0luY29tZQUMY3VycmVudFByaWNlBQVNVUxUOAQDYXByCQEHY2FsY0FwcgQFC3JwZENvbnRyYWN0BQd0bXBEYXlzBQ9pbmNvbWVGb3JQZXJpb2QFBU1VTFQ2CQCUCgIFA25pbAkArAICAgQlZF9fCQCkAwEFA2FwcgFpARZzdXJmU3Rha2luZ0FwclJFQURPTkxZAQRkYXlzBAd0bXBEYXlzAAMED2luY29tZUZvclBlcmlvZAkBF2NhbGNVc2RuSW5jb21lRm9yUGVyaW9kAgUTc3VyZlN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwQRc3VyZlByaWNlVG9Vc2RuWDYAgKMFBANhcHIJAQdjYWxjQXByBAUTc3VyZlN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwUPaW5jb21lRm9yUGVyaW9kBRFzdXJmUHJpY2VUb1VzZG5YNgkAlAoCBQNuaWwJAKwCAgIEJWRfXwkApAMBBQNhcHIBaQEYc3VyZlN0YWtpbmdBcHJWMlJFQURPTkxZAgRkYXlzD3N1cmZVc2RuUHJpY2VYNgQHdG1wRGF5cwADBA9pbmNvbWVGb3JQZXJpb2QJARdjYWxjVXNkbkluY29tZUZvclBlcmlvZAIFE3N1cmZTdGFraW5nQ29udHJhY3QFB3RtcERheXMEA2FwcgkBB2NhbGNBcHIEBRNzdXJmU3Rha2luZ0NvbnRyYWN0BQd0bXBEYXlzBQ9pbmNvbWVGb3JQZXJpb2QFD3N1cmZVc2RuUHJpY2VYNgkAlAoCBQNuaWwJAKwCAgIEJWRfXwkApAMBBQNhcHIBaQEWbnNidFN0YWtpbmdBcHJSRUFET05MWQEEZGF5cwQHdG1wRGF5cwADBBFuc2J0UHJpY2VUb1VzZG5YNgCApOgDBA9pbmNvbWVGb3JQZXJpb2QJARdjYWxjVXNkbkluY29tZUZvclBlcmlvZAIFE25zYnRTdGFraW5nQ29udHJhY3QFB3RtcERheXMEA2FwcgkBB2NhbGNBcHIEBRNuc2J0U3Rha2luZ0NvbnRyYWN0BQd0bXBEYXlzBQ9pbmNvbWVGb3JQZXJpb2QFEW5zYnRQcmljZVRvVXNkblg2CQCUCgIFA25pbAkArAICAgQlZF9fCQCkAwEFA2FwcgFpARhuc2J0U3Rha2luZ0FwclYyUkVBRE9OTFkCBGRheXMPbnNidFVzZG5QcmljZVg2BAd0bXBEYXlzAAMED2luY29tZUZvclBlcmlvZAkBF2NhbGNVc2RuSW5jb21lRm9yUGVyaW9kAgUTbnNidFN0YWtpbmdDb250cmFjdAUHdG1wRGF5cwQDYXByCQEHY2FsY0FwcgQFE25zYnRTdGFraW5nQ29udHJhY3QFB3RtcERheXMFD2luY29tZUZvclBlcmlvZAUPbnNidFVzZG5QcmljZVg2CQCUCgIFA25pbAkArAICAgQlZF9fCQCkAwEFA2FwcgB2x38d", "height": 2794122, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EBkWvwwQdkNq78iCATwVkzhcvtS36DC1wxGaPXPTYLxQ Next: 7Yyo6yw3XPJBEFL1XRQYXtdVLBQayGQ3SaR8LSvicRs8 Diff:
OldNewDifferences
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)
324- let supportedAssets = split(getStrOrElse(mathContract, keySupportedRewardAssets(), ""), "_")
324+ let supportedAssets = split(getStrOrElse(surfStakingContract, keySupportedRewardAssets(), ""), "_")
325325 func incomeAdder (acc,i) = {
326326 let assetId = supportedAssets[i]
327327 let income = parseIntValue(incomeArray[(i + 1)])
425425 then addressFromStringValue(userAddressStrOrEmpty)
426426 else this
427427 let currentPrice = getIntegerValue(controlContract, keyPrice())
428- let gnsbtFromNsbtDiff = additionalNsbtToStakeOrZero
428+ let gnsbtDataPrev = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
429+ let gnsbtFromNsbtPrev = asInt(gnsbtDataPrev[3])
430+ let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
431+ let nsbtData = asAnyList(gnsbtData[2])
432+ let gnsbtAmtFromNsbt = asInt(nsbtData[2])
433+ let gnsbtFromNsbtDiff = (gnsbtAmtFromNsbt - gnsbtFromNsbtPrev)
429434 let gnsbtFromSurfDiff = asInt(invoke(surfStakingContract, "gnsbtFromSurfSYSREADONLY", [additionalSurfToStakeOrZero], nil))
430435 let gNsbtDiff = (gnsbtFromNsbtDiff + gnsbtFromSurfDiff)
431436 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
456461 }
457462 let nsbtBalanceNew = (nsbtBalance - nsbtBalanceDiff)
458463 let surfBalanceNew = (surfBalance - additionalSurfToStakeOrZero)
459- let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
460464 let gnsbtUser = asInt(gnsbtData[0])
461465 let gnsbtTotal = asInt(gnsbtData[1])
462- let nsbtData = asAnyList(gnsbtData[2])
463466 let surfData = asAnyList(gnsbtData[3])
464467 let gnsbtSurfTotalMature = asInt(gnsbtData[6])
465468 let gnsbtSurfTotalTeen = asInt(gnsbtData[7])
468471 let gnsbtSurfUserTeen = asInt(gnsbtData[10])
469472 let gnsbtSurfUserKid = asInt(gnsbtData[11])
470473 let gnsbtAmtFromSurfMax = ((gnsbtSurfUserMature + gnsbtSurfUserTeen) + gnsbtSurfUserKid)
471- let gnsbtAmtFromNsbt = asInt(nsbtData[2])
472474 let gnsbtAmtFromNsbtNEW = (gnsbtAmtFromNsbt + gnsbtFromNsbtDiff)
473475 let gnsbtAmtFromSurfNEW = (gnsbtAmtFromSurfMax + gnsbtFromSurfDiff)
474476 let gnsbtFromNsbtTotal = asInt(nsbtData[3])
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)
324- let supportedAssets = split(getStrOrElse(mathContract, keySupportedRewardAssets(), ""), "_")
324+ let supportedAssets = split(getStrOrElse(surfStakingContract, 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))
390390 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
394394 else withdrawTuple._9
395395 $Tuple2(nil, makeString_2C(["%d%d%d%s", toString(blcks2LmtReset), toString(limitMaxTokenInUsd), toString(limitMaxUsdn), withdrawBasket], SEP))
396396 }
397397
398398
399399 @Callable(i)
400400 func reverseSwapLimitREADONLY (lim,isOutMulti) = {
401401 let BR = asInt(asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))[nMetricIdxBR])
402402 let gNsbt = if ((0 >= lim))
403403 then 0
404404 else {
405405 let aParamX8 = toBigInt(getIntOrFail(mathContract, if (isOutMulti)
406406 then keyUsdnSwapAmountAParam()
407407 else keySwapAmountAParam()))
408408 let bParamX16 = toBigInt(getIntOrFail(mathContract, if (isOutMulti)
409409 then keyUsdnSwapAmountBParam()
410410 else keySwapAmountBParam()))
411411 let limDivAX8 = if (isOutMulti)
412412 then fraction(fraction(toBigInt(lim), MULTX10, aParamX8), MULTX6, toBigInt(BR))
413413 else fraction(toBigInt(lim), MULTX10, aParamX8)
414414 let revBX16 = fraction(MULTX16, MULTX16, bParamX16)
415415 toInt(pow(limDivAX8, 8, revBX16, 16, 6, CEILING))
416416 }
417417 $Tuple2(nil, gNsbt)
418418 }
419419
420420
421421
422422 @Callable(i)
423423 func gnsbtInfoINTERNAL (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
424424 let userAddressOrThis = if ((userAddressStrOrEmpty != ""))
425425 then addressFromStringValue(userAddressStrOrEmpty)
426426 else this
427427 let currentPrice = getIntegerValue(controlContract, keyPrice())
428- let gnsbtFromNsbtDiff = additionalNsbtToStakeOrZero
428+ let gnsbtDataPrev = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
429+ let gnsbtFromNsbtPrev = asInt(gnsbtDataPrev[3])
430+ let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
431+ let nsbtData = asAnyList(gnsbtData[2])
432+ let gnsbtAmtFromNsbt = asInt(nsbtData[2])
433+ let gnsbtFromNsbtDiff = (gnsbtAmtFromNsbt - gnsbtFromNsbtPrev)
429434 let gnsbtFromSurfDiff = asInt(invoke(surfStakingContract, "gnsbtFromSurfSYSREADONLY", [additionalSurfToStakeOrZero], nil))
430435 let gNsbtDiff = (gnsbtFromNsbtDiff + gnsbtFromSurfDiff)
431436 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
432437 let limitMaxTokenUsd = swapParamsTuple._1
433438 let blcks2LmtReset = swapParamsTuple._3
434439 let gnsbtAmt = swapParamsTuple._4
435440 let gnsbtAmtTotal = swapParamsTuple._5
436441 let limitMaxUsdn = swapParamsTuple._7
437442 let swapParamsTupleNEW = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, gNsbtDiff], nil))
438443 let limitMaxTokenUsdNEW = swapParamsTupleNEW._1
439444 let blcks2LmtResetNEW = swapParamsTupleNEW._3
440445 let gnsbtAmtNEW = swapParamsTupleNEW._4
441446 let gnsbtAmtTotalNEW = swapParamsTupleNEW._5
442447 let limitMaxUsdnNEW = swapParamsTupleNEW._7
443448 let nsbtBalance = if ((userAddressStrOrEmpty != ""))
444449 then assetBalance(userAddressOrThis, nsbtAssetId)
445450 else 0
446451 let surfBalance = if ((userAddressStrOrEmpty != ""))
447452 then assetBalance(userAddressOrThis, surfAssetId)
448453 else 0
449454 let nsbtBalanceDiff = if ((additionalNsbtToStakeOrZero >= 0))
450455 then additionalNsbtToStakeOrZero
451456 else {
452457 let nsbtUnstakingData = asAnyList(invoke(nsbtStakingContract, "nsbtUnstakingSYSREADONLY", [userAddressStrOrEmpty, (-1 * additionalNsbtToStakeOrZero)], nil))
453458 let nsbtReceiveAmount = asInt(nsbtUnstakingData[2])
454459 let result = -(nsbtReceiveAmount)
455460 result
456461 }
457462 let nsbtBalanceNew = (nsbtBalance - nsbtBalanceDiff)
458463 let surfBalanceNew = (surfBalance - additionalSurfToStakeOrZero)
459- let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
460464 let gnsbtUser = asInt(gnsbtData[0])
461465 let gnsbtTotal = asInt(gnsbtData[1])
462- let nsbtData = asAnyList(gnsbtData[2])
463466 let surfData = asAnyList(gnsbtData[3])
464467 let gnsbtSurfTotalMature = asInt(gnsbtData[6])
465468 let gnsbtSurfTotalTeen = asInt(gnsbtData[7])
466469 let gnsbtSurfTotalKid = asInt(gnsbtData[8])
467470 let gnsbtSurfUserMature = asInt(gnsbtData[9])
468471 let gnsbtSurfUserTeen = asInt(gnsbtData[10])
469472 let gnsbtSurfUserKid = asInt(gnsbtData[11])
470473 let gnsbtAmtFromSurfMax = ((gnsbtSurfUserMature + gnsbtSurfUserTeen) + gnsbtSurfUserKid)
471- let gnsbtAmtFromNsbt = asInt(nsbtData[2])
472474 let gnsbtAmtFromNsbtNEW = (gnsbtAmtFromNsbt + gnsbtFromNsbtDiff)
473475 let gnsbtAmtFromSurfNEW = (gnsbtAmtFromSurfMax + gnsbtFromSurfDiff)
474476 let gnsbtFromNsbtTotal = asInt(nsbtData[3])
475477 let gnsbtFromNsbtTotalNEW = (gnsbtFromNsbtTotal + gnsbtFromNsbtDiff)
476478 let gnsbtFromSurfTotalNEW = (((gnsbtSurfTotalMature + gnsbtSurfTotalTeen) + gnsbtSurfTotalKid) + gnsbtFromSurfDiff)
477479 let votingPower = (gnsbtAmtFromNsbt + gnsbtSurfUserMature)
478480 let votingPowerNew = (gnsbtAmtFromNsbtNEW + gnsbtSurfUserMature)
479481 let votingPowerMax = (gnsbtAmtFromNsbt + gnsbtAmtFromSurfMax)
480482 let votingPowerMaxNew = ((gnsbtAmtFromNsbtNEW + gnsbtAmtFromSurfMax) + gnsbtFromSurfDiff)
481483 let W2 = getIntOrElse(surfStakingContract, keyVpPeriodDuration(), DEFAULTPERIOD)
482484 let period = (height / W2)
483485 let votingPowerEta = if ((gnsbtSurfUserKid != 0))
484486 then ((period + 2) * W2)
485487 else if ((gnsbtSurfUserTeen != 0))
486488 then ((period + 1) * W2)
487489 else height
488490 let votingPowerEtaNew = if ((gnsbtFromSurfDiff != 0))
489491 then ((period + 2) * W2)
490492 else votingPowerEta
491493 $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])
492494 }
493495
494496
495497
496498 @Callable(i)
497499 func gnsbtInfoREADONLY (userAddressStrOrEmpty,additionalNsbtToStakeOrZero,additionalSurfToStakeOrZero) = {
498500 let gnsbtInfoDATA = asAnyList(invoke(this, "gnsbtInfoINTERNAL", [userAddressStrOrEmpty, additionalNsbtToStakeOrZero, additionalSurfToStakeOrZero], nil))
499501 $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))
500502 }
501503
502504
503505
504506 @Callable(i)
505507 func gnsbtEffectiveREADONLY (userAddressStrOrEmpty) = {
506508 let gnsbtData = asAnyList(invoke(gnsbtControllerContract, "gnsbtInfoSYSREADONLY", [userAddressStrOrEmpty, 0, 0], nil))
507509 let nsbtData = asAnyList(gnsbtData[2])
508510 let userFromNsbt = asInt(nsbtData[2])
509511 let totalFromNsbt = asInt(nsbtData[3])
510512 let userMatureFromSurf = asInt(gnsbtData[9])
511513 let totalMatureFromSurf = asInt(gnsbtData[6])
512514 $Tuple2(nil, makeString(["%d%d", toString((totalFromNsbt + totalMatureFromSurf)), toString((userFromNsbt + userMatureFromSurf))], SEP))
513515 }
514516
515517
516518
517519 @Callable(i)
518520 func rewardInfoREADONLY (userAddressStrOrEmpty) = {
519521 let rewardsData = asAnyList(invoke(gnsbtControllerContract, "gnsbtRewardsSYSREADONLY", [userAddressStrOrEmpty], nil))
520522 let usdnRewards = asString(invoke(rpdContract, "unclaimedRewardsREADONLY", [userAddressStrOrEmpty], nil))
521523 $Tuple2(nil, makeString_2C(["%s%s%s", asString(rewardsData[0]), asString(rewardsData[1]), usdnRewards], SEP))
522524 }
523525
524526
525527
526528 @Callable(i)
527529 func mergeNsbtREADONLY (userAddressMandatory,newAmount) = {
528530 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressMandatory, newAmount], nil))
529531 let amount0 = asInt(nsbtData[0])
530532 let startHeight = if ((0 >= amount0))
531533 then -1
532534 else asInt(nsbtData[2])
533535 let startTimestamp = toTimestamp(startHeight)
534536 let startHeightNew = if ((0 >= newAmount))
535537 then startHeight
536538 else if ((0 >= amount0))
537539 then height
538540 else {
539541 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
540542 asInt(invoke(mathContract, "mergeStakesREADONLY", [amount0, startHeight, newAmount, height, halfLife], nil))
541543 }
542544 let startTimestampNew = toTimestamp(startHeightNew)
543545 $Tuple2(nil, makeString(["%d%d%d%d", toString(startHeight), toString(startTimestamp), toString(startHeightNew), toString(startTimestampNew)], SEP))
544546 }
545547
546548
547549
548550 @Callable(i)
549551 func swapLimitCalculatorREADONLY (userAddressStrOpt,limitWanted,assetIdStr) = {
550552 let gNsbtCurrent = if ((userAddressStrOpt == ""))
551553 then 0
552554 else asInt(asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))._4)
553555 let price = valueOrErrorMessage(getInteger(controlContract, keyPriceByAsset(assetIdStr)), ("No price for asset " + assetIdStr))
554556 let isOutMulti = (assetIdStr == neutrinoAssetIdString)
555557 let limitWantedUsdn = if (isOutMulti)
556558 then limitWanted
557559 else convertTokenToUsd(limitWanted, price)
558560 let gNsbtNeeded = asInt(invoke(this, "reverseSwapLimitREADONLY", [limitWantedUsdn, isOutMulti], nil))
559561 let gNsbtDelta = (gNsbtNeeded - gNsbtCurrent)
560562 $Tuple2(nil, makeString(["%s%s", toString(gNsbtCurrent), toString(gNsbtDelta)], SEP))
561563 }
562564
563565
564566
565567 @Callable(i)
566568 func swapInfoREADONLY (userAddressStrOrEmpty,amount,assetIdStr) = {
567569 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
568570 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
569571 let swapParamsTuple = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOrEmpty, 0], nil))
570572 let limitMaxTokenInUsd = swapParamsTuple._1
571573 let blcks2LmtReset = swapParamsTuple._3
572574 let limitMaxUsdn = swapParamsTuple._7
573575 let assetId = fromBase58String(assetIdStr)
574576 let basketAssets = valueOrElse(getString(neutrinoContract, basketAssetsKey()), "WAVES")
575577 let swapType = if (contains(basketAssets, assetIdStr))
576578 then "outNeutrino"
577579 else if ((assetId == neutrinoAssetId))
578580 then "outMulti"
579581 else throw(("Can't swap assetId=" + assetIdStr))
580582 let withdrawTuple = asWithdrawResultSTRUCT(invoke(neutrinoContract, "calcWithdrawResultSYSREADONLY", [swapType, amount, price, assetIdStr, ""], nil))
581583 let outNetAmount = withdrawTuple._1
582584 let outSurfAmt = withdrawTuple._3
583585 let inAmtToSurfPart = withdrawTuple._4
584586 let outFeeAmount = withdrawTuple._6
585587 let outAmtGross = withdrawTuple._7
586588 let withdrawPrice = withdrawTuple._8
587589 $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))
588590 }
589591
590592
591593
592594 @Callable(i)
593595 func swapInfoV2READONLY (userAddressStrOrEmpty,amount,assetIdStr) = swapInfoInternal(userAddressStrOrEmpty, amount, assetIdStr, "")
594596
595597
596598
597599 @Callable(i)
598600 func swapInfoV3READONLY (userAddressStrOrEmpty,amountIn,assetIdStrIn,assetIdStrOutOrEmpty) = swapInfoInternal(userAddressStrOrEmpty, amountIn, assetIdStrIn, assetIdStrOutOrEmpty)
599601
600602
601603
602604 @Callable(i)
603605 func basketInfoREADONLY () = {
604606 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
605607 let basketInfo = asString(neutrinoMetrics[nMetricBasketInfo])
606608 let basket = split_4C(basketInfo, "_")
607609 func modify (acc,item) = {
608610 let parts = split(item, LISTSEP)
609611 let assetId = parts[0]
610612 let dlog6 = valueOrErrorMessage(getInteger(neutrinoContract, basketLogbDeltaKey()), "log(b, delta) key is undefined")
611613 let D6 = valueOrErrorMessage(getInteger(neutrinoContract, basketDKey()), "D key is undefined")
612614 let b6 = valueOrErrorMessage(getInteger(neutrinoContract, basketBKey()), "b key is undefined")
613615 let w6 = valueOrErrorMessage(getInteger(neutrinoContract, basketWeightByAssetKey(assetId)), (("Target weight for asset " + assetId) + " is undefined"))
614616 let p6 = ((dlog6 - w6) + parseIntValue(parts[1]))
615617 let d = (D6 - pow(b6, 6, p6, 6, 6, HALFUP))
616618 (acc :+ makeString(((parts :+ toString(w6)) :+ toString(d)), LISTSEP))
617619 }
618620
619621 let b = {
620622 let $l = basket
621623 let $s = size($l)
622624 let $acc0 = nil
623625 func $f0_1 ($a,$i) = if (($i >= $s))
624626 then $a
625627 else modify($a, $l[$i])
626628
627629 func $f0_2 ($a,$i) = if (($i >= $s))
628630 then $a
629631 else throw("List size exceeds 10")
630632
631633 $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)
632634 }
633635 $Tuple2(nil, ("%s__" + makeString_2C(b, "_")))
634636 }
635637
636638
637639
638640 @Callable(i)
639641 func usdnStakingAprREADONLY (days) = {
640642 let tmpDays = 1
641643 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
642644 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
643645 let wavesIncome = (0 * MULT8)
644646 let incomeForPeriod = fraction(wavesIncome, currentPrice, MULT8)
645647 let apr = calcApr(rpdContract, tmpDays, incomeForPeriod, MULT6)
646648 $Tuple2(nil, ("%d__" + toString(apr)))
647649 }
648650
649651
650652
651653 @Callable(i)
652654 func surfStakingAprREADONLY (days) = {
653655 let tmpDays = 3
654656 let incomeForPeriod = calcUsdnIncomeForPeriod(surfStakingContract, tmpDays)
655657 let surfPriceToUsdnX6 = 86400
656658 let apr = calcApr(surfStakingContract, tmpDays, incomeForPeriod, surfPriceToUsdnX6)
657659 $Tuple2(nil, ("%d__" + toString(apr)))
658660 }
659661
660662
661663
662664 @Callable(i)
663665 func surfStakingAprV2READONLY (days,surfUsdnPriceX6) = {
664666 let tmpDays = 3
665667 let incomeForPeriod = calcUsdnIncomeForPeriod(surfStakingContract, tmpDays)
666668 let apr = calcApr(surfStakingContract, tmpDays, incomeForPeriod, surfUsdnPriceX6)
667669 $Tuple2(nil, ("%d__" + toString(apr)))
668670 }
669671
670672
671673
672674 @Callable(i)
673675 func nsbtStakingAprREADONLY (days) = {
674676 let tmpDays = 3
675677 let nsbtPriceToUsdnX6 = 8000000
676678 let incomeForPeriod = calcUsdnIncomeForPeriod(nsbtStakingContract, tmpDays)
677679 let apr = calcApr(nsbtStakingContract, tmpDays, incomeForPeriod, nsbtPriceToUsdnX6)
678680 $Tuple2(nil, ("%d__" + toString(apr)))
679681 }
680682
681683
682684
683685 @Callable(i)
684686 func nsbtStakingAprV2READONLY (days,nsbtUsdnPriceX6) = {
685687 let tmpDays = 3
686688 let incomeForPeriod = calcUsdnIncomeForPeriod(nsbtStakingContract, tmpDays)
687689 let apr = calcApr(nsbtStakingContract, tmpDays, incomeForPeriod, nsbtUsdnPriceX6)
688690 $Tuple2(nil, ("%d__" + toString(apr)))
689691 }
690692
691693

github/deemru/w8io/873ac7e 
63.79 ms