tx · 3jGn9Qg3c76ABfCdDn3DHGHFAC4CrkEGRxYQZkXABGPQ

3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi:  -0.04000000 Waves

2022.07.04 17:02 [2125018] smart account 3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi > SELF 0.00000000 Waves

{ "type": 13, "id": "3jGn9Qg3c76ABfCdDn3DHGHFAC4CrkEGRxYQZkXABGPQ", "fee": 4000000, "feeAssetId": null, "timestamp": 1656943393400, "version": 1, "sender": "3Mxd5o7PwH76ZkN8zG4xwDLubEnbkaihKzi", "senderPublicKey": "BwVRZtTzoCigEsffCvQ9uo7WvkoBNNGVjX4nat5X5zyQ", "proofs": [ "8YRfSns7yBjLvVUfrDgXhYB7N7JUhZwQ1mY2SCoykcYi3r6r8eyNPvmKTxUEStUb8XHLExHvhAJs8EfLZhYQjjH" ], "script": "base64:AAIFAAAAAAAAADsIAhIFCgMICAgSABIDCgEIEgQKAggBEgMKAQESBAoCAQgSBgoEAQEBARIECgIBARIECgIBCBIAEgASAAAAAFkAAAAAC3JldmlzaW9uTnVtAgAAAAAAAAAABkVVTEVSOAAAAAAAEDPE1gAAAAAFTVVMVDYAAAAAAAAPQkAAAAAABk1VTFRYNgkAATYAAAABAAAAAAAAD0JAAAAAAAVNVUxUOAAAAAAABfXhAAAAAAAGTVVMVFg4CQABNgAAAAEAAAAAAAX14QAAAAAABk1VTFQxMgAAAADo1KUQAAAAAAAGTVVMVDE4CQABNgAAAAEADeC2s6dkAAAAAAAAA1NFUAIAAAACX18AAAAAB1dBVkVTSUQJAAJZAAAAAQIAAAAFV0FWRVMAAAAAD25NZXRyaWNJZHhQcmljZQAAAAAAAAAAAAAAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlAAAAAAAAAAABAAAAABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAAAAAACAAAAABFuTWV0cmljSWR4UmVzZXJ2ZQAAAAAAAAAAAwAAAAAXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4AAAAAAAAAAAQAAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5AAAAAAAAAAAFAAAAABFuTWV0cmljSWR4U3VycGx1cwAAAAAAAAAABgAAAAAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50AAAAAAAAAAAHAAAAAAxuTWV0cmljSWR4QlIAAAAAAAAAAAgAAAAAFG5NZXRyaWNJZHhOc2J0U3VwcGx5AAAAAAAAAAAJAAAAABduTWV0cmljSWR4TWF4TnNidFN1cHBseQAAAAAAAAAACgAAAAAUbk1ldHJpY0lkeFN1cmZTdXBwbHkAAAAAAAAAAAsAAAAADGJGdW5jSWR4U3VyZgAAAAAAAAAAAAAAAAANYkZ1bmNJZHhXYXZlcwAAAAAAAAAAAQAAAAAMYkZ1bmNJZHhVc2RuAAAAAAAAAAACAAAAABRiRnVuY0lkeFJlc2VydmVTdGFydAAAAAAAAAAAAwAAAAATYkZ1bmNJZHhTdXBwbHlTdGFydAAAAAAAAAAABAAAAAAPYkZ1bmNJZHhCUlN0YXJ0AAAAAAAAAAAFAAAAABJiRnVuY0lkeFJlc2VydmVFbmQAAAAAAAAAAAYAAAAAEWJGdW5jSWR4U3VwcGx5RW5kAAAAAAAAAAAHAAAAAA1iRnVuY0lkeEJSRW5kAAAAAAAAAAAIAAAAABFiRnVuY0lkeFJlc3RXYXZlcwAAAAAAAAAACQAAAAAQYkZ1bmNJZHhSZXN0VXNkbgAAAAAAAAAACgEAAAASa2V5TmV1dHJpbm9BZGRyZXNzAAAAAAIAAAAdJXMlc19fY29uZmlnX19uZXV0cmlub0FkZHJlc3MBAAAAEmtleU5ldXRyaW5vQXNzZXRJZAAAAAACAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAQAAAB1rZXlMaXF1aWRhdGlvbkNvbnRyYWN0QWRkcmVzcwAAAAACAAAAFGxpcXVpZGF0aW9uX2NvbnRyYWN0AQAAAA5rZXlSUERDb250cmFjdAAAAAACAAAADHJwZF9jb250cmFjdAEAAAASa2V5QXVjdGlvbkNvbnRyYWN0AAAAAAIAAAAQYXVjdGlvbl9jb250cmFjdAEAAAARa2V5Q29udG9sQ29udHJhY3QAAAAAAgAAABBjb250cm9sX2NvbnRyYWN0AQAAAA5rZXlOc2J0QXNzZXRJZAAAAAACAAAADWJvbmRfYXNzZXRfaWQBAAAADmtleVN1cmZBc3NldElkAAAAAAIAAAANc3VyZl9hc3NldF9pZAEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAADWJhbGFuY2VfbG9ja18BAAAAFWtleVdhdmVzTG9ja2VkQmFsYW5jZQAAAAAJAAEsAAAAAgkBAAAAEGtleUJhbGFuY2VMb2NrZWQAAAAAAgAAAAV3YXZlcwEAAAAYa2V5TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAAkAASwAAAACCQEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAACG5ldXRyaW5vAQAAABVrZXlNaW5XYXZlc1N3YXBBbW91bnQAAAAAAgAAABVtaW5fd2F2ZXNfc3dhcF9hbW91bnQBAAAAGGtleU1pbk5ldXRyaW5vU3dhcEFtb3VudAAAAAACAAAAGG1pbl9uZXV0cmlub19zd2FwX2Ftb3VudAEAAAASa2V5V2F2ZXNPdXRGZWVQYXJ0AAAAAAIAAAAVd2F2ZXNPdXRfc3dhcF9mZWVQYXJ0AQAAABVrZXlOZXV0cmlub091dEZlZVBhcnQAAAAAAgAAABhuZXV0cmlub091dF9zd2FwX2ZlZVBhcnQBAAAAE2tleU5zYnRMb2NrQ29udHJhY3QAAAAAAgAAABQlc19fbnNidExvY2tDb250cmFjdAEAAAAPa2V5TWF0aENvbnRyYWN0AAAAAAIAAAAQJXNfX21hdGhDb250cmFjdAEAAAAba2V5QmFsYW5jZVdhdmVzTG9ja0ludGVydmFsAAAAAAIAAAAbYmFsYW5jZV93YXZlc19sb2NrX2ludGVydmFsAQAAAB5rZXlCYWxhbmNlTmV1dHJpbm9Mb2NrSW50ZXJ2YWwAAAAAAgAAAB5iYWxhbmNlX25ldXRyaW5vX2xvY2tfaW50ZXJ2YWwBAAAACGtleVByaWNlAAAAAAIAAAAFcHJpY2UBAAAAFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sAAAABAAAAC3VzZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAICAAAAC3BhcmFtQnlVc2VyCQAETAAAAAIFAAAAC3VzZXJBZGRyZXNzCQAETAAAAAICAAAABXN0YXJ0BQAAAANuaWwFAAAAA1NFUAEAAAALa2V5SGFsZkxpZmUAAAAAAgAAAAwlc19faGFsZkxpZmUBAAAAEGtleU1pbkxvY2tBbW91bnQAAAAAAgAAABElc19fbWluTG9ja0Ftb3VudAEAAAAVa2V5TWluV2F2ZXNGb3JOc2J0QnV5AAAAAAIAAAASbWluX3dhdmVzX25zYnRfYnV5AQAAAA5rZXlNaW5Oc2J0U2VsbAAAAAACAAAADW1pbl9uc2J0X3NlbGwBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAS5AAAAAgkABEwAAAACAgAAAAptYW5kYXRvcnkgCQAETAAAAAIJAAQlAAAAAQUAAAAHYWRkcmVzcwkABEwAAAACAgAAAAEuCQAETAAAAAIFAAAAA2tleQkABEwAAAACAgAAAA8gaXMgbm90IGRlZmluZWQFAAAAA25pbAIAAAAAAQAAAAxnZXRJbnRP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Q29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAASa2V5TmV1dHJpbm9BZGRyZXNzAAAAAAAAAAAPY29udHJvbENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEWtleUNvbnRvbENvbnRyYWN0AAAAAAAAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAEmtleUF1Y3Rpb25Db250cmFjdAAAAAAAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAda2V5TGlxdWlkYXRpb25Db250cmFjdEFkZHJlc3MAAAAAAAAAAAtycGRDb250cmFjdAkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAA5rZXlSUERDb250cmFjdAAAAAAAAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAAA9rZXlNYXRoQ29udHJhY3QAAAAAAAAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAE2tleU5zYnRMb2NrQ29udHJhY3QAAAAAAAAAABVuZXV0cmlub0Fzc2V0SWRTdHJpbmcJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAASa2V5TmV1dHJpbm9Bc3NldElkAAAAAAAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAEFAAAAFW5ldXRyaW5vQXNzZXRJZFN0cmluZwAAAAAObnNidEFzc2V0SWRTdHIJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAA5rZXlOc2J0QXNzZXRJZAAAAAAAAAAAC25zYnRBc3NldElkCQACWQAAAAEFAAAADm5zYnRBc3NldElkU3RyAAAAAA5zdXJmQXNzZXRJZFN0cgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAAOa2V5U3VyZkFzc2V0SWQAAAAAAAAAAAtzdXJmQXNzZXRJZAkAAlkAAAABBQAAAA5zdXJmQXNzZXRJZFN0cgEAAAASbWluV2F2ZXNGb3JOc2J0QnV5AAAAAAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA9hdWN0aW9uQ29udHJhY3QCAAAAIG1pbldhdmVzQW1vdW50TnNidEJ1eVNZU1JFQURPTkxZBQAAAANuaWwFAAAAA25pbAEAAAAObWluTnNidEZvclNlbGwAAAAACQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAD2F1Y3Rpb25Db250cmFjdAIAAAAfbWluTnNidEFtb3VudEZvclNlbGxTWVNSRUFET05MWQUAAAADbmlsBQAAAANuaWwBAAAAEm1pbldhdmVzRm9yU3VyZkJ1eQAAAAAJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAPYXVjdGlvbkNvbnRyYWN0AgAAACBtaW5XYXZlc0Ftb3VudFN1cmZCdXlTWVNSRUFET05MWQUAAAADbmlsBQAAAANuaWwBAAAAEW1pblVzZG5Gb3JTdXJmQnV5AAAAAAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAA9hdWN0aW9uQ29udHJhY3QCAAAAH21pblVzZG5BbW91bnRTdXJmQnV5U1lTUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsAQAAABRwcml2YXRlTnNidFByaWNlUkVTVAAAAAAEAAAABnByaWNlcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAACBjYWxjQ29udHJhY3ROc2J0UHJpY2VTWVNSRUFET05MWQkABEwAAAACAAAAAAAAAAAABQAAAANuaWwFAAAAA25pbAQAAAAObnNidDJ1c2RuUHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAAABAAAAA9uc2J0MndhdmVzUHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAABCQAFFAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAA5uc2J0MnVzZG5QcmljZQUAAAAObnNidDJ1c2RuUHJpY2UJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAA9uc2J0MndhdmVzUHJpY2UFAAAAD25zYnQyd2F2ZXNQcmljZQAAAAwAAAABaQEAAAALY29uc3RydWN0b3IAAAADAAAAD25ldXRyaW5vQWRkcmVzcwAAAA9uc2J0TG9ja0FkZHJlc3MAAAALbWF0aEFkZHJlc3MDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAObm90IGF1dGhvcml6ZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAAFAAAAD25ldXRyaW5vQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATa2V5TnNidExvY2tDb250cmFjdAAAAAAFAAAAD25zYnRMb2NrQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5TWF0aENvbnRyYWN0AAAAAAUAAAALbWF0aEFkZHJlc3MFAAAAA25pbAAAAAFpAQAAABVuZXV0cmlub1N0YXRzUkVBRE9OTFkAAAAABAAAAA9uZXV0cmlub01ldHJpY3MJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsBAAAAAZwcmljZXMJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAgY2FsY0NvbnRyYWN0TnNidFByaWNlU1lTUkVBRE9OTFkJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAADGN1cnJlbnRQcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAD25NZXRyaWNJZHhQcmljZQQAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlBAAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlBAAAAA9yZXNlcnZlc0luV2F2ZXMJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABFuTWV0cmljSWR4UmVzZXJ2ZQQAAAAOcmVzZXJ2ZXNJblVzZG4JAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABduTWV0cmljSWR4UmVzZXJ2ZUluVXNkbgQAAAAObmV1dHJpbm9TdXBwbHkJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4VXNkblN1cHBseQQAAAAHc3VycGx1cwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhTdXJwbHVzBAAAAA5zdXJwbHVzUGVyY2VudAkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAGG5NZXRyaWNJZHhTdXJwbHVzUGVyY2VudAQAAAACQlIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAAAxuTWV0cmljSWR4QlIEAAAACm5zYnRTdXBwbHkJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4TnNidFN1cHBseQQAAAANbWF4TnNidFN1cHBseQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAF25NZXRyaWNJZHhNYXhOc2J0U3VwcGx5BAAAAA5uc2J0MnVzZG5QcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAAEAAAAD25zYnQyd2F2ZXNQcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAEEAAAAEG1pbldhdmVzNE5zYnRCdXkJAQAAABJtaW5XYXZlc0Zvck5zYnRCdXkAAAAABAAAAAttaW5Oc2J0c2VsbAkBAAAADm1pbk5zYnRGb3JTZWxsAAAAAAQAAAAObWluTnNidExvY2tBbXQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAAQa2V5TWluTG9ja0Ftb3VudAAAAAAEAAAAEG1pbldhdmVzNFN1cmZCdXkJAQAAABJtaW5XYXZlc0ZvclN1cmZCdXkAAAAABAAAAA9taW5Vc2RuNFN1cmZCdXkJAQAAABFtaW5Vc2RuRm9yU3VyZkJ1eQAAAAAEAAAAEG1heFdhdmVzMkJ1eVN1cmYJAABlAAAAAgkAAGsAAAADBQAAAA5uZXV0cmlub1N1cHBseQUAAAAFTVVMVDgFAAAADGN1cnJlbnRQcmljZQUAAAAPcmVzZXJ2ZXNJbldhdmVzBAAAAA9tYXhVc2RuMkJ1eVN1cmYJAABlAAAAAgUAAAAObmV1dHJpbm9TdXBwbHkFAAAADnJlc2VydmVzSW5Vc2RuBAAAAA9zdXJmUHJpY2VJblVzZG4JAABrAAAAAwUAAAAPcmVzZXJ2ZXNJbldhdmVzBQAAAAxjdXJyZW50UHJpY2UFAAAADm5ldXRyaW5vU3VwcGx5BAAAABBzdXJmUHJpY2VJbldhdmVzCQAAawAAAAMFAAAAD3Jlc2VydmVzSW5XYXZlcwAAAAAAAAAAAQUAAAAObmV1dHJpbm9TdXBwbHkJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAsJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABVuZXV0cmlub0xvY2tlZEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAA9yZXNlcnZlc0luV2F2ZXMJAARMAAAAAgkAAaQAAAABBQAAAA5yZXNlcnZlc0luVXNkbgkABEwAAAACCQABpAAAAAEFAAAADm5ldXRyaW5vU3VwcGx5CQAETAAAAAIJAAGkAAAAAQUAAAAHc3VycGx1cwkABEwAAAACCQABpAAAAAEFAAAADnN1cnBsdXNQZXJjZW50CQAETAAAAAIJAAGkAAAAAQUAAAACQlIJAARMAAAAAgkAAaQAAAABBQAAAApuc2J0U3VwcGx5CQAETAAAAAIJAAGkAAAAAQUAAAANbWF4TnNidFN1cHBseQkABEwAAAACCQABpAAAAAEFAAAADm5zYnQydXNkblByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAPbnNidDJ3YXZlc1ByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAQbWluV2F2ZXM0TnNidEJ1eQkABEwAAAACCQABpAAAAAEFAAAAC21pbk5zYnRzZWxsCQAETAAAAAIJAAGkAAAAAQUAAAAObWluTnNidExvY2tBbXQJAARMAAAAAgkAAaQAAAABBQAAABBtaW5XYXZlczRTdXJmQnV5CQAETAAAAAIJAAGkAAAAAQUAAAAPbWluVXNkbjRTdXJmQnV5CQAETAAAAAIJAAGkAAAAAQUAAAAQbWF4V2F2ZXMyQnV5U3VyZgkABEwAAAACCQABpAAAAAEFAAAAD21heFVzZG4yQnV5U3VyZgkABEwAAAACCQABpAAAAAEFAAAAD3N1cmZQcmljZUluVXNkbgkABEwAAAACCQABpAAAAAEFAAAAEHN1cmZQcmljZUluV2F2ZXMFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAAEHN3YXBJbmZvUkVBRE9OTFkAAAABAAAAEXVzZXJBZGRyZXNzU3RyT3B0BAAAAAxjdXJyZW50UHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAkBAAAACGtleVByaWNlAAAAAAQAAAAPbWluV2F2ZXNTd2FwQW10CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAVa2V5TWluV2F2ZXNTd2FwQW1vdW50AAAAAAQAAAAObWluVXNkblN3YXBBbXQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhrZXlNaW5OZXV0cmlub1N3YXBBbW91bnQAAAAABAAAAA13YXZlczJVc2RuRmVlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAASa2V5V2F2ZXNPdXRGZWVQYXJ0AAAAAAQAAAANdXNkbjJXYXZlc0ZlZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAFWtleU5ldXRyaW5vT3V0RmVlUGFydAAAAAAEAAAAFXVzZG5Td2FwRGVsYXlEdXJhdGlvbgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAHmtleUJhbGFuY2VOZXV0cmlub0xvY2tJbnRlcnZhbAAAAAAEAAAAFndhdmVzU3dhcERlbGF5RHVyYXRpb24JAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABtrZXlCYWxhbmNlV2F2ZXNMb2NrSW50ZXJ2YWwAAAAABAAAAA0kdDAxMDQyNjEwNTkwCQEAAAASYXNTd2FwUGFyYW1zU1RSVUNUAAAAAQkAA/wAAAAEBQAAABBuZXV0cmlub0NvbnRyYWN0AgAAABtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAARMAAAAAgUAAAARdXNlckFkZHJlc3NTdHJPcHQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAAEHN3YXBMaW1pdE1heFVzZG4IBQAAAA0kdDAxMDQyNjEwNTkwAAAAAl8xBAAAABJzd2FwTGltaXRTcGVudFVzZG4IBQAAAA0kdDAxMDQyNjEwNTkwAAAAAl8yBAAAAA5ibGNrczJMbXRSZXNldAgFAAAADSR0MDEwNDI2MTA1OTAAAAACXzMEAAAAEXN3YXBMaW1pdE1heFdhdmVzCQEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAIFAAAAEHN3YXBMaW1pdE1heFVzZG4FAAAADGN1cnJlbnRQcmljZQkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAABYlZCVkJWQlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAPbWluV2F2ZXNTd2FwQW10CQAETAAAAAIJAAGkAAAAAQUAAAAObWluVXNkblN3YXBBbXQJAARMAAAAAgkAAaQAAAABBQAAAA13YXZlczJVc2RuRmVlCQAETAAAAAIJAAGkAAAAAQUAAAANdXNkbjJXYXZlc0ZlZQkABEwAAAACCQABpAAAAAEFAAAAFXVzZG5Td2FwRGVsYXlEdXJhdGlvbgkABEwAAAACCQABpAAAAAEFAAAAFndhdmVzU3dhcERlbGF5RHVyYXRpb24JAARMAAAAAgkAAaQAAAABBQAAAA5ibGNrczJMbXRSZXNldAkABEwAAAACCQABpAAAAAEFAAAAEXN3YXBMaW1pdE1heFdhdmVzCQAETAAAAAIJAAGkAAAAAQUAAAAQc3dhcExpbWl0TWF4VXNkbgkABEwAAAACCQABpAAAAAEFAAAAEnN3YXBMaW1pdFNwZW50VXNkbgUAAAADbmlsBQAAAANTRVAAAAABaQEAAAARZ25zYnRJbmZvUkVBRE9OTFkAAAACAAAAEXVzZXJBZGRyZXNzU3RyT3B0AAAAC25zYnRBbXREaWZmBAAAAAxjdXJyZW50UHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAkBAAAACGtleVByaWNlAAAAAAQAAAANJHQwMTE1OTYxMTc3OQkBAAAAEmFzU3dhcFBhcmFtc1NUUlVDVAAAAAEJAAP8AAAABAUAAAAQbmV1dHJpbm9Db250cmFjdAIAAAAbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQAETAAAAAIFAAAAEXVzZXJBZGRyZXNzU3RyT3B0CQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAUAAAADbmlsBAAAAAxsaW1pdE1heFVzZG4IBQAAAA0kdDAxMTU5NjExNzc5AAAAAl8xBAAAAApsaW1pdFNwZW50CAUAAAANJHQwMTE1OTYxMTc3OQAAAAJfMgQAAAAOYmxja3MyTG10UmVzZXQIBQAAAA0kdDAxMTU5NjExNzc5AAAAAl8zBAAAAAhnbnNidEFtdAgFAAAADSR0MDExNTk2MTE3NzkAAAACXzQEAAAADWduc2J0QW10VG90YWwIBQAAAA0kdDAxMTU5NjExNzc5AAAAAl81BAAAAA0kdDAxMTc4MzExOTkxCQEAAAASYXNTd2FwUGFyYW1zU1RSVUNUAAAAAQkAA/wAAAAEBQAAABBuZXV0cmlub0NvbnRyYWN0AgAAABtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAARMAAAAAgUAAAARdXNlckFkZHJlc3NTdHJPcHQJAARMAAAAAgUAAAALbnNidEFtdERpZmYFAAAAA25pbAUAAAADbmlsBAAAAA9saW1pdE1heFVzZG5ORVcIBQAAAA0kdDAxMTc4MzExOTkxAAAAAl8xBAAAAA1saW1pdFNwZW50TkVXCAUAAAANJHQwMTE3ODMxMTk5MQAAAAJfMgQAAAARYmxja3MyTG10UmVzZXRORVcIBQAAAA0kdDAxMTc4MzExOTkxAAAAAl8zBAAAAAtnbnNidEFtdE5FVwgFAAAADSR0MDExNzgzMTE5OTEAAAACXzQEAAAAEGduc2J0QW10VG90YWxORVcIBQAAAA0kdDAxMTc4MzExOTkxAAAAAl81BAAAAA1saW1pdE1heFdhdmVzCQEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAIFAAAADGxpbWl0TWF4VXNkbgUAAAAMY3VycmVudFByaWNlBAAAABBsaW1pdE1heFdhdmVzTkVXCQEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAIFAAAAD2xpbWl0TWF4VXNkbk5FVwUAAAAMY3VycmVudFByaWNlBAAAAApnbnNidFNoYXJlAwkBAAAAAiE9AAAAAgUAAAANZ25zYnRBbXRUb3RhbAAAAAAAAAAAAAkAAGsAAAADCQAAaAAAAAIFAAAACGduc2J0QW10AAAAAAAAAABkBQAAAAZNVUxUMTIFAAAADWduc2J0QW10VG90YWwAAAAAAAAAAAAEAAAADWduc2J0U2hhcmVORVcDCQEAAAACIT0AAAACBQAAABBnbnNidEFtdFRvdGFsTkVXAAAAAAAAAAAACQAAawAAAAMJAABoAAAAAgUAAAALZ25zYnRBbXRORVcAAAAAAAAAAGQFAAAABk1VTFQxMgUAAAAQZ25zYnRBbXRUb3RhbE5FVwAAAAAAAAAAAAQAAAAKcmV3YXJkSW5mbwkBAAAACGFzU3RyaW5nAAAAAQkAA/wAAAAEBQAAABNuc2J0U3Rha2luZ0NvbnRyYWN0AgAAABh1bmNsYWltZWRSZXdhcmRzUkVBRE9OTFkJAARMAAAAAgUAAAARdXNlckFkZHJlc3NTdHJPcHQFAAAAA25pbAUAAAADbmlsBAAAAAduc2J0QW10BQAAAAhnbnNidEFtdAQAAAAKbnNidEFtdE5ldwUAAAALZ25zYnRBbXRORVcEAAAAEm5zYnRBbXRTdGFrZWRUb3RhbAUAAAANZ25zYnRBbXRUb3RhbAQAAAAVbnNidEFtdFN0YWtlZFRvdGFsTmV3BQAAABBnbnNidEFtdFRvdGFsTkVXBAAAAAhuc2J0RGF0YQkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAATbnNidFN0YWtpbmdDb250cmFjdAIAAAAWbnNidFN0YWtpbmdTWVNSRUFET05MWQkABEwAAAACBQAAABF1c2VyQWRkcmVzc1N0ck9wdAUAAAADbmlsBQAAAANuaWwEAAAAEmlzRW1wdHlOc2J0QmFsYW5jZQMJAAAAAAAAAgUAAAAIZ25zYnRBbXQAAAAAAAAAAAAJAAAAAAAAAgUAAAALZ25zYnRBbXRORVcAAAAAAAAAAAAHBAAAAAtzdGFydEhlaWdodAMFAAAAEmlzRW1wdHlOc2J0QmFsYW5jZQD//////////wkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAhuc2J0RGF0YQAAAAAAAAAAAgQAAAAOc3RhcnRUaW1lc3RhbXAJAQAAAAt0b1RpbWVzdGFtcAAAAAEFAAAAC3N0YXJ0SGVpZ2h0BAAAAAhoYWxmTGlmZQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAE25zYnRTdGFraW5nQ29udHJhY3QJAQAAAAtrZXlIYWxmTGlmZQAA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aWwAAAACBQAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAALa2V5SGFsZkxpZmUAAAAABAAAAAtzdGFydEhlaWdodAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAZoZWlnaHQEAAAAAWEJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAACFnZXRVbnN0YWtlQ29taXNzaW9uQW1vdW50UkVBRE9OTFkJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAAC3N0YXJ0SGVpZ2h0CQAETAAAAAIFAAAACGhhbGZMaWZlBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAABYQUAAAABYQkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAAIlZAkABEwAAAACCQABpAAAAAEFAAAAAWEFAAAAA25pbAUAAAADU0VQCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABFuZXV0cmlub1N0YXRlUkVTVAAAAAAEAAAAD25ldXRyaW5vTWV0cmljcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAABpjYWxjTmV1dGlub01ldHJpY3NSRUFET05MWQUAAAADbmlsBQAAAANuaWwEAAAADGN1cnJlbnRQcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAD25NZXRyaWNJZHhQcmljZQQAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlBAAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlBAAAAA9yZXNlcnZlc0luV2F2ZXMJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABFuTWV0cmljSWR4UmVzZXJ2ZQQAAAAOcmVzZXJ2ZXNJblVzZG4JAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABduTWV0cmljSWR4UmVzZXJ2ZUluVXNkbgQAAAAObmV1dHJpbm9TdXBwbHkJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4VXNkblN1cHBseQQAAAAHc3VycGx1cwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhTdXJwbHVzBAAAAA5zdXJwbHVzUGVyY2VudAkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAGG5NZXRyaWNJZHhTdXJwbHVzUGVyY2VudAQAAAACQlIJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAAAxuTWV0cmljSWR4QlIEAAAACm5zYnRTdXBwbHkJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4TnNidFN1cHBseQQAAAANbnNidFN1cHBseU1heAkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAF25NZXRyaWNJZHhNYXhOc2J0U3VwcGx5BAAAAApzdXJmU3VwcGx5CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAUbk1ldHJpY0lkeFN1cmZTdXBwbHkJAAACAAAAAQkABLkAAAACCQAETAAAAAICAAAAF3Jlc3VsdE5ldXRyaW5vU3RhdGVSRVNUCQAETAAAAAIJAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAPcmVzZXJ2ZXNJbldhdmVzCQAETAAAAAIJAAGkAAAAAQUAAAAOcmVzZXJ2ZXNJblVzZG4JAARMAAAAAgkAAaQAAAABBQAAAA5uZXV0cmlub1N1cHBseQkABEwAAAACCQABpAAAAAEFAAAAB3N1cnBsdXMJAARMAAAAAgkAAaQAAAABBQAAAA5zdXJwbHVzUGVyY2VudAkABEwAAAACCQABpAAAAAEFAAAAAkJSCQAETAAAAAIJAAGkAAAAAQUAAAAKbnNidFN1cHBseQkABEwAAAACCQABpAAAAAEFAAAADW5zYnRTdXBwbHlNYXgJAARMAAAAAgkAAaQAAAABBQAAAApzdXJmU3VwcGx5BQAAAANuaWwCAAAAAl9fAAAAAWkBAAAADW5zYnRQcmljZVJFU1QAAAAABAAAAAZwcmljZXMJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAgY2FsY0NvbnRyYWN0TnNidFByaWNlU1lTUkVBRE9OTFkJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAADm5zYnQydXNkblByaWNlCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAABnByaWNlcwAAAAAAAAAAAAQAAAAPbnNidDJ3YXZlc1ByaWNlCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAABnByaWNlcwAAAAAAAAAAAQQAAAAIcmVzdERhdGEJAAS5AAAAAgkABEwAAAACAgAAABJzdGFydE5zYnRQcmljZVJFU1QJAARMAAAAAgkAAaQAAAABBQAAAA5uc2J0MnVzZG5QcmljZQkABEwAAAACCQABpAAAAAEFAAAAD25zYnQyd2F2ZXNQcmljZQkABEwAAAACAgAAABBlbmROc2J0UHJpY2VSRVNUBQAAAANuaWwCAAAAAl9fCQAAAgAAAAEFAAAACHJlc3REYXRhAAAAAWkBAAAADXN1cmZQcmljZVJFU1QAAAAABAAAAA9uZXV0cmlub01ldHJpY3MJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsBAAAAAxjdXJyZW50UHJpY2UJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAAA9uTWV0cmljSWR4UHJpY2UEAAAAD3Jlc2VydmVzSW5XYXZlcwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhSZXNlcnZlBAAAAA5uZXV0cmlub1N1cHBseQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5BAAAAA9zdXJmUHJpY2VJblVzZG4JAABrAAAAAwUAAAAPcmVzZXJ2ZXNJbldhdmVzBQAAAAxjdXJyZW50UHJpY2UFAAAADm5ldXRyaW5vU3VwcGx5BAAAABBzdXJmUHJpY2VJbldhdmVzCQAAawAAAAMFAAAAD3Jlc2VydmVzSW5XYXZlcwAAAAAAAAAAAQUAAAAObmV1dHJpbm9TdXBwbHkEAAAACHJlc3REYXRhCQAEuQAAAAIJAARMAAAAAgIAAAASc3RhcnRTdXJmUHJpY2VSRVNUCQAETAAAAAIJAAGkAAAAAQUAAAAPc3VyZlByaWNlSW5Vc2RuCQAETAAAAAIJAAGkAAAAAQUAAAAQc3VyZlByaWNlSW5XYXZlcwkABEwAAAACAgAAABBlbmRTdXJmUHJpY2VSRVNUBQAAAANuaWwCAAAAAl9fCQAAAgAAAAEFAAAACHJlc3REYXRhAAAAAH8Ml4s=", "chainId": 84, "height": 2125018, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D7X1B6cdQbg4ZQu5aNV4rzaAQzHzUBjv2KP8J53dYwBp Next: DLJNxx1MhP32KXMiNhxTd6X1XbMdouvba2eMQzG7fP6d Diff:
OldNewDifferences
4242 let nMetricIdxNsbtSupply = 9
4343
4444 let nMetricIdxMaxNsbtSupply = 10
45+
46+let nMetricIdxSurfSupply = 11
4547
4648 let bFuncIdxSurf = 0
4749
304306 let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
305307 let usdnSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
306308 let wavesSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
307- let $t01039610560 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
308- let swapLimitMaxUsdn = $t01039610560._1
309- let swapLimitSpentUsdn = $t01039610560._2
310- let blcks2LmtReset = $t01039610560._3
309+ let $t01042610590 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
310+ let swapLimitMaxUsdn = $t01042610590._1
311+ let swapLimitSpentUsdn = $t01042610590._2
312+ let blcks2LmtReset = $t01042610590._3
311313 let swapLimitMaxWaves = convertNeutrinoToWaves(swapLimitMaxUsdn, currentPrice)
312314 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(minWavesSwapAmt), toString(minUsdnSwapAmt), toString(waves2UsdnFee), toString(usdn2WavesFee), toString(usdnSwapDelayDuration), toString(wavesSwapDelayDuration), toString(blcks2LmtReset), toString(swapLimitMaxWaves), toString(swapLimitMaxUsdn), toString(swapLimitSpentUsdn)], SEP))
313315 }
317319 @Callable(i)
318320 func gnsbtInfoREADONLY (userAddressStrOpt,nsbtAmtDiff) = {
319321 let currentPrice = getIntegerValue(controlContract, keyPrice())
320- let $t01156611749 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
321- let limitMaxUsdn = $t01156611749._1
322- let limitSpent = $t01156611749._2
323- let blcks2LmtReset = $t01156611749._3
324- let gnsbtAmt = $t01156611749._4
325- let gnsbtAmtTotal = $t01156611749._5
326- let $t01175311961 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
327- let limitMaxUsdnNEW = $t01175311961._1
328- let limitSpentNEW = $t01175311961._2
329- let blcks2LmtResetNEW = $t01175311961._3
330- let gnsbtAmtNEW = $t01175311961._4
331- let gnsbtAmtTotalNEW = $t01175311961._5
322+ let $t01159611779 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
323+ let limitMaxUsdn = $t01159611779._1
324+ let limitSpent = $t01159611779._2
325+ let blcks2LmtReset = $t01159611779._3
326+ let gnsbtAmt = $t01159611779._4
327+ let gnsbtAmtTotal = $t01159611779._5
328+ let $t01178311991 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
329+ let limitMaxUsdnNEW = $t01178311991._1
330+ let limitSpentNEW = $t01178311991._2
331+ let blcks2LmtResetNEW = $t01178311991._3
332+ let gnsbtAmtNEW = $t01178311991._4
333+ let gnsbtAmtTotalNEW = $t01178311991._5
332334 let limitMaxWaves = convertNeutrinoToWaves(limitMaxUsdn, currentPrice)
333335 let limitMaxWavesNEW = convertNeutrinoToWaves(limitMaxUsdnNEW, currentPrice)
334336 let gnsbtShare = if ((gnsbtAmtTotal != 0))
396398 let surfAmount = asInt(surfResult[bFuncIdxSurf])
397399 if ((0 >= surfAmount))
398400 then throw("surfAmount <= 0")
399- else $Tuple2(nil, makeString(["%d", toString(surfAmount)], SEP))
401+ else {
402+ let gNsbtAmount = (surfAmount / 60)
403+ $Tuple2(nil, makeString(["%d%d", toString(surfAmount), toString(gNsbtAmount)], SEP))
404+ }
400405 }
401406 }
402407
449454 let surplusPercent = asInt(neutrinoMetrics[nMetricIdxSurplusPercent])
450455 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
451456 let nsbtSupply = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
452- throw(makeString(["resultNeutrinoStateREST", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply)], "__"))
457+ let nsbtSupplyMax = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
458+ let surfSupply = asInt(neutrinoMetrics[nMetricIdxSurfSupply])
459+ throw(makeString(["resultNeutrinoStateREST", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply), toString(nsbtSupplyMax), toString(surfSupply)], "__"))
453460 }
454461
455462
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = ""
55
66 let EULER8 = 271828182
77
88 let MULT6 = 1000000
99
1010 let MULTX6 = toBigInt(1000000)
1111
1212 let MULT8 = 100000000
1313
1414 let MULTX8 = toBigInt(100000000)
1515
1616 let MULT12 = 1000000000000
1717
1818 let MULT18 = toBigInt(1000000000000000000)
1919
2020 let SEP = "__"
2121
2222 let WAVESID = fromBase58String("WAVES")
2323
2424 let nMetricIdxPrice = 0
2525
2626 let nMetricIdxUsdnLockedBalance = 1
2727
2828 let nMetricIdxWavesLockedBalance = 2
2929
3030 let nMetricIdxReserve = 3
3131
3232 let nMetricIdxReserveInUsdn = 4
3333
3434 let nMetricIdxUsdnSupply = 5
3535
3636 let nMetricIdxSurplus = 6
3737
3838 let nMetricIdxSurplusPercent = 7
3939
4040 let nMetricIdxBR = 8
4141
4242 let nMetricIdxNsbtSupply = 9
4343
4444 let nMetricIdxMaxNsbtSupply = 10
45+
46+let nMetricIdxSurfSupply = 11
4547
4648 let bFuncIdxSurf = 0
4749
4850 let bFuncIdxWaves = 1
4951
5052 let bFuncIdxUsdn = 2
5153
5254 let bFuncIdxReserveStart = 3
5355
5456 let bFuncIdxSupplyStart = 4
5557
5658 let bFuncIdxBRStart = 5
5759
5860 let bFuncIdxReserveEnd = 6
5961
6062 let bFuncIdxSupplyEnd = 7
6163
6264 let bFuncIdxBREnd = 8
6365
6466 let bFuncIdxRestWaves = 9
6567
6668 let bFuncIdxRestUsdn = 10
6769
6870 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
6971
7072
7173 func keyNeutrinoAssetId () = "neutrino_asset_id"
7274
7375
7476 func keyLiquidationContractAddress () = "liquidation_contract"
7577
7678
7779 func keyRPDContract () = "rpd_contract"
7880
7981
8082 func keyAuctionContract () = "auction_contract"
8183
8284
8385 func keyContolContract () = "control_contract"
8486
8587
8688 func keyNsbtAssetId () = "bond_asset_id"
8789
8890
8991 func keySurfAssetId () = "surf_asset_id"
9092
9193
9294 func keyBalanceLocked () = "balance_lock_"
9395
9496
9597 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
9698
9799
98100 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
99101
100102
101103 func keyMinWavesSwapAmount () = "min_waves_swap_amount"
102104
103105
104106 func keyMinNeutrinoSwapAmount () = "min_neutrino_swap_amount"
105107
106108
107109 func keyWavesOutFeePart () = "wavesOut_swap_feePart"
108110
109111
110112 func keyNeutrinoOutFeePart () = "neutrinoOut_swap_feePart"
111113
112114
113115 func keyNsbtLockContract () = "%s__nsbtLockContract"
114116
115117
116118 func keyMathContract () = "%s__mathContract"
117119
118120
119121 func keyBalanceWavesLockInterval () = "balance_waves_lock_interval"
120122
121123
122124 func keyBalanceNeutrinoLockInterval () = "balance_neutrino_lock_interval"
123125
124126
125127 func keyPrice () = "price"
126128
127129
128130 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", userAddress, "start"], SEP)
129131
130132
131133 func keyHalfLife () = "%s__halfLife"
132134
133135
134136 func keyMinLockAmount () = "%s__minLockAmount"
135137
136138
137139 func keyMinWavesForNsbtBuy () = "min_waves_nsbt_buy"
138140
139141
140142 func keyMinNsbtSell () = "min_nsbt_sell"
141143
142144
143145 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
144146
145147
146148 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
147149
148150
149151 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
150152
151153
152154 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
153155
154156
155157 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
156158
157159
158160 func asAnyList (val) = match val {
159161 case valAnyList: List[Any] =>
160162 valAnyList
161163 case _ =>
162164 throw("fail to cast into List[Any]")
163165 }
164166
165167
166168 func asInt (val) = match val {
167169 case valInt: Int =>
168170 valInt
169171 case _ =>
170172 throw("fail to cast into Int")
171173 }
172174
173175
174176 func asString (val) = match val {
175177 case valStr: String =>
176178 valStr
177179 case _ =>
178180 throw("fail to cast into String")
179181 }
180182
181183
182184 func asTuple2Ints (val) = match val {
183185 case v: (Int, Int) =>
184186 v
185187 case _ =>
186188 throw("fail to cast into Tuple2 ints")
187189 }
188190
189191
190192 func asSwapParamsSTRUCT (val) = match val {
191193 case struct: (Int, Int, Int, Int, Int) =>
192194 struct
193195 case _ =>
194196 throw("fail to cast into Int")
195197 }
196198
197199
198200 func toTimestamp (start) = if ((0 > start))
199201 then -1
200202 else match blockInfoByHeight(start) {
201203 case block: BlockInfo =>
202204 block.timestamp
203205 case _ =>
204206 -1
205207 }
206208
207209
208210 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
209211
210212
211213 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
212214
213215
214216 let neutrinoContract = addressFromStringValue(getStringOrFail(this, keyNeutrinoAddress()))
215217
216218 let controlContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyContolContract()))
217219
218220 let auctionContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyAuctionContract()))
219221
220222 let liquidationContract = getStringOrFail(neutrinoContract, keyLiquidationContractAddress())
221223
222224 let rpdContract = getStringOrFail(neutrinoContract, keyRPDContract())
223225
224226 let mathContract = addressFromStringValue(getStringOrFail(this, keyMathContract()))
225227
226228 let nsbtStakingContract = addressFromStringValue(getStringOrFail(this, keyNsbtLockContract()))
227229
228230 let neutrinoAssetIdString = getStringOrFail(neutrinoContract, keyNeutrinoAssetId())
229231
230232 let neutrinoAssetId = fromBase58String(neutrinoAssetIdString)
231233
232234 let nsbtAssetIdStr = getStringValue(neutrinoContract, keyNsbtAssetId())
233235
234236 let nsbtAssetId = fromBase58String(nsbtAssetIdStr)
235237
236238 let surfAssetIdStr = getStringValue(auctionContract, keySurfAssetId())
237239
238240 let surfAssetId = fromBase58String(surfAssetIdStr)
239241
240242 func minWavesForNsbtBuy () = asInt(invoke(auctionContract, "minWavesAmountNsbtBuySYSREADONLY", nil, nil))
241243
242244
243245 func minNsbtForSell () = asInt(invoke(auctionContract, "minNsbtAmountForSellSYSREADONLY", nil, nil))
244246
245247
246248 func minWavesForSurfBuy () = asInt(invoke(auctionContract, "minWavesAmountSurfBuySYSREADONLY", nil, nil))
247249
248250
249251 func minUsdnForSurfBuy () = asInt(invoke(auctionContract, "minUsdnAmountSurfBuySYSREADONLY", nil, nil))
250252
251253
252254 func privateNsbtPriceREST () = {
253255 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
254256 let nsbt2usdnPrice = asInt(prices[0])
255257 let nsbt2wavesPrice = asInt(prices[1])
256258 $Tuple2(IntegerEntry("nsbt2usdnPrice", nsbt2usdnPrice), IntegerEntry("nsbt2wavesPrice", nsbt2wavesPrice))
257259 }
258260
259261
260262 @Callable(i)
261263 func constructor (neutrinoAddress,nsbtLockAddress,mathAddress) = if ((i.caller != this))
262264 then throw("not authorized")
263265 else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), StringEntry(keyNsbtLockContract(), nsbtLockAddress), StringEntry(keyMathContract(), mathAddress)]
264266
265267
266268
267269 @Callable(i)
268270 func neutrinoStatsREADONLY () = {
269271 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
270272 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
271273 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
272274 let neutrinoLockedBalance = asInt(neutrinoMetrics[nMetricIdxUsdnLockedBalance])
273275 let wavesLockedBalance = asInt(neutrinoMetrics[nMetricIdxWavesLockedBalance])
274276 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
275277 let reservesInUsdn = asInt(neutrinoMetrics[nMetricIdxReserveInUsdn])
276278 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
277279 let surplus = asInt(neutrinoMetrics[nMetricIdxSurplus])
278280 let surplusPercent = asInt(neutrinoMetrics[nMetricIdxSurplusPercent])
279281 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
280282 let nsbtSupply = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
281283 let maxNsbtSupply = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
282284 let nsbt2usdnPrice = asInt(prices[0])
283285 let nsbt2wavesPrice = asInt(prices[1])
284286 let minWaves4NsbtBuy = minWavesForNsbtBuy()
285287 let minNsbtsell = minNsbtForSell()
286288 let minNsbtLockAmt = getIntOrFail(nsbtStakingContract, keyMinLockAmount())
287289 let minWaves4SurfBuy = minWavesForSurfBuy()
288290 let minUsdn4SurfBuy = minUsdnForSurfBuy()
289291 let maxWaves2BuySurf = (fraction(neutrinoSupply, MULT8, currentPrice) - reservesInWaves)
290292 let maxUsdn2BuySurf = (neutrinoSupply - reservesInUsdn)
291293 let surfPriceInUsdn = fraction(reservesInWaves, currentPrice, neutrinoSupply)
292294 let surfPriceInWaves = fraction(reservesInWaves, 1, neutrinoSupply)
293295 $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", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply), toString(maxNsbtSupply), toString(nsbt2usdnPrice), toString(nsbt2wavesPrice), toString(minWaves4NsbtBuy), toString(minNsbtsell), toString(minNsbtLockAmt), toString(minWaves4SurfBuy), toString(minUsdn4SurfBuy), toString(maxWaves2BuySurf), toString(maxUsdn2BuySurf), toString(surfPriceInUsdn), toString(surfPriceInWaves)], SEP))
294296 }
295297
296298
297299
298300 @Callable(i)
299301 func swapInfoREADONLY (userAddressStrOpt) = {
300302 let currentPrice = getIntegerValue(controlContract, keyPrice())
301303 let minWavesSwapAmt = getIntegerValue(neutrinoContract, keyMinWavesSwapAmount())
302304 let minUsdnSwapAmt = getIntegerValue(neutrinoContract, keyMinNeutrinoSwapAmount())
303305 let waves2UsdnFee = getIntegerValue(neutrinoContract, keyWavesOutFeePart())
304306 let usdn2WavesFee = getIntegerValue(neutrinoContract, keyNeutrinoOutFeePart())
305307 let usdnSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceNeutrinoLockInterval())
306308 let wavesSwapDelayDuration = getIntegerValue(neutrinoContract, keyBalanceWavesLockInterval())
307- let $t01039610560 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
308- let swapLimitMaxUsdn = $t01039610560._1
309- let swapLimitSpentUsdn = $t01039610560._2
310- let blcks2LmtReset = $t01039610560._3
309+ let $t01042610590 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
310+ let swapLimitMaxUsdn = $t01042610590._1
311+ let swapLimitSpentUsdn = $t01042610590._2
312+ let blcks2LmtReset = $t01042610590._3
311313 let swapLimitMaxWaves = convertNeutrinoToWaves(swapLimitMaxUsdn, currentPrice)
312314 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(currentPrice), toString(minWavesSwapAmt), toString(minUsdnSwapAmt), toString(waves2UsdnFee), toString(usdn2WavesFee), toString(usdnSwapDelayDuration), toString(wavesSwapDelayDuration), toString(blcks2LmtReset), toString(swapLimitMaxWaves), toString(swapLimitMaxUsdn), toString(swapLimitSpentUsdn)], SEP))
313315 }
314316
315317
316318
317319 @Callable(i)
318320 func gnsbtInfoREADONLY (userAddressStrOpt,nsbtAmtDiff) = {
319321 let currentPrice = getIntegerValue(controlContract, keyPrice())
320- let $t01156611749 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
321- let limitMaxUsdn = $t01156611749._1
322- let limitSpent = $t01156611749._2
323- let blcks2LmtReset = $t01156611749._3
324- let gnsbtAmt = $t01156611749._4
325- let gnsbtAmtTotal = $t01156611749._5
326- let $t01175311961 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
327- let limitMaxUsdnNEW = $t01175311961._1
328- let limitSpentNEW = $t01175311961._2
329- let blcks2LmtResetNEW = $t01175311961._3
330- let gnsbtAmtNEW = $t01175311961._4
331- let gnsbtAmtTotalNEW = $t01175311961._5
322+ let $t01159611779 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, 0], nil))
323+ let limitMaxUsdn = $t01159611779._1
324+ let limitSpent = $t01159611779._2
325+ let blcks2LmtReset = $t01159611779._3
326+ let gnsbtAmt = $t01159611779._4
327+ let gnsbtAmtTotal = $t01159611779._5
328+ let $t01178311991 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStrOpt, nsbtAmtDiff], nil))
329+ let limitMaxUsdnNEW = $t01178311991._1
330+ let limitSpentNEW = $t01178311991._2
331+ let blcks2LmtResetNEW = $t01178311991._3
332+ let gnsbtAmtNEW = $t01178311991._4
333+ let gnsbtAmtTotalNEW = $t01178311991._5
332334 let limitMaxWaves = convertNeutrinoToWaves(limitMaxUsdn, currentPrice)
333335 let limitMaxWavesNEW = convertNeutrinoToWaves(limitMaxUsdnNEW, currentPrice)
334336 let gnsbtShare = if ((gnsbtAmtTotal != 0))
335337 then fraction((gnsbtAmt * 100), MULT12, gnsbtAmtTotal)
336338 else 0
337339 let gnsbtShareNEW = if ((gnsbtAmtTotalNEW != 0))
338340 then fraction((gnsbtAmtNEW * 100), MULT12, gnsbtAmtTotalNEW)
339341 else 0
340342 let rewardInfo = asString(invoke(nsbtStakingContract, "unclaimedRewardsREADONLY", [userAddressStrOpt], nil))
341343 let nsbtAmt = gnsbtAmt
342344 let nsbtAmtNew = gnsbtAmtNEW
343345 let nsbtAmtStakedTotal = gnsbtAmtTotal
344346 let nsbtAmtStakedTotalNew = gnsbtAmtTotalNEW
345347 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddressStrOpt], nil))
346348 let isEmptyNsbtBalance = if ((gnsbtAmt == 0))
347349 then (gnsbtAmtNEW == 0)
348350 else false
349351 let startHeight = if (isEmptyNsbtBalance)
350352 then -1
351353 else asInt(nsbtData[2])
352354 let startTimestamp = toTimestamp(startHeight)
353355 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
354356 let startHeightNew = if (isEmptyNsbtBalance)
355357 then -1
356358 else asInt(invoke(mathContract, "mergeStakesREADONLY", [gnsbtAmt, startHeight, gnsbtAmtNEW, height, halfLife], nil))
357359 let startTimestampNew = toTimestamp(startHeightNew)
358360 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d%s%d%d%d%d%d%d%d%d", toString(gnsbtAmt), toString(gnsbtAmtNEW), toString(gnsbtShare), toString(gnsbtShareNEW), toString(limitMaxUsdn), toString(limitMaxWaves), toString(limitMaxUsdnNEW), toString(limitMaxWavesNEW), rewardInfo, toString(nsbtAmt), toString(nsbtAmtNew), toString(nsbtAmtStakedTotal), toString(nsbtAmtStakedTotalNew), toString(startHeight), toString(startTimestamp), toString(startHeightNew), toString(startTimestampNew)], SEP))
359361 }
360362
361363
362364
363365 @Callable(i)
364366 func buyNsbtREADONLY (wavesPay) = {
365367 let minWavesAmountNsbtBuy = minWavesForNsbtBuy()
366368 if ((minWavesAmountNsbtBuy > wavesPay))
367369 then throw((("min " + toString(minWavesAmountNsbtBuy)) + " waves expected"))
368370 else {
369371 let curveResult = asAnyList(invoke(mathContract, "curveFunctionREADONLY", [wavesPay], nil))
370372 if ((curveResult == curveResult))
371373 then {
372374 let nsbtAmount = asInt(curveResult[0])
373375 if ((0 >= nsbtAmount))
374376 then throw("nsbtAmount <= 0")
375377 else $Tuple2(nil, makeString(["%d", toString(nsbtAmount)], SEP))
376378 }
377379 else throw("Strict value is not equal to itself.")
378380 }
379381 }
380382
381383
382384
383385 @Callable(i)
384386 func buySurfREADONLY (amount,assetIdStr) = {
385387 let assetId = fromBase58String(assetIdStr)
386388 if (if ((assetId == WAVESID))
387389 then (minWavesForSurfBuy() > amount)
388390 else false)
389391 then throw((("min " + toString(minWavesForSurfBuy())) + " WAVES expected"))
390392 else if (if ((assetId == neutrinoAssetId))
391393 then (minUsdnForSurfBuy() > amount)
392394 else false)
393395 then throw((("min " + toString(minUsdnForSurfBuy())) + " USDN expected"))
394396 else {
395397 let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amount, assetId], nil))
396398 let surfAmount = asInt(surfResult[bFuncIdxSurf])
397399 if ((0 >= surfAmount))
398400 then throw("surfAmount <= 0")
399- else $Tuple2(nil, makeString(["%d", toString(surfAmount)], SEP))
401+ else {
402+ let gNsbtAmount = (surfAmount / 60)
403+ $Tuple2(nil, makeString(["%d%d", toString(surfAmount), toString(gNsbtAmount)], SEP))
404+ }
400405 }
401406 }
402407
403408
404409
405410 @Callable(i)
406411 func mergedStakeREADONLY (amount1,height1,amount2,height2) = {
407412 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
408413 let h = asInt(invoke(mathContract, "mergeStakesREADONLY", [amount1, height1, amount2, height2, halfLife], nil))
409414 if ((h == h))
410415 then $Tuple2(nil, makeString(["%d%d", toString((amount1 + amount2)), toString(h)], SEP))
411416 else throw("Strict value is not equal to itself.")
412417 }
413418
414419
415420
416421 @Callable(i)
417422 func unstakeComissionAmountByHeightREADONLY (amount,startHeight) = {
418423 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
419424 let a = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, startHeight, halfLife], nil))
420425 if ((a == a))
421426 then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
422427 else throw("Strict value is not equal to itself.")
423428 }
424429
425430
426431
427432 @Callable(i)
428433 func unstakeComissionAmountByUserREADONLY (amount,userAddress) = {
429434 let halfLife = getIntOrFail(nsbtStakingContract, keyHalfLife())
430435 let startHeight = valueOrElse(getInteger(nsbtStakingContract, keyLockParamStartBlock(userAddress)), height)
431436 let a = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, startHeight, halfLife], nil))
432437 if ((a == a))
433438 then $Tuple2(nil, makeString(["%d", toString(a)], SEP))
434439 else throw("Strict value is not equal to itself.")
435440 }
436441
437442
438443
439444 @Callable(i)
440445 func neutrinoStateREST () = {
441446 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
442447 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
443448 let neutrinoLockedBalance = asInt(neutrinoMetrics[nMetricIdxUsdnLockedBalance])
444449 let wavesLockedBalance = asInt(neutrinoMetrics[nMetricIdxWavesLockedBalance])
445450 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
446451 let reservesInUsdn = asInt(neutrinoMetrics[nMetricIdxReserveInUsdn])
447452 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
448453 let surplus = asInt(neutrinoMetrics[nMetricIdxSurplus])
449454 let surplusPercent = asInt(neutrinoMetrics[nMetricIdxSurplusPercent])
450455 let BR = asInt(neutrinoMetrics[nMetricIdxBR])
451456 let nsbtSupply = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
452- throw(makeString(["resultNeutrinoStateREST", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply)], "__"))
457+ let nsbtSupplyMax = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
458+ let surfSupply = asInt(neutrinoMetrics[nMetricIdxSurfSupply])
459+ throw(makeString(["resultNeutrinoStateREST", toString(currentPrice), toString(neutrinoLockedBalance), toString(wavesLockedBalance), toString(reservesInWaves), toString(reservesInUsdn), toString(neutrinoSupply), toString(surplus), toString(surplusPercent), toString(BR), toString(nsbtSupply), toString(nsbtSupplyMax), toString(surfSupply)], "__"))
453460 }
454461
455462
456463
457464 @Callable(i)
458465 func nsbtPriceREST () = {
459466 let prices = asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [0], nil))
460467 let nsbt2usdnPrice = asInt(prices[0])
461468 let nsbt2wavesPrice = asInt(prices[1])
462469 let restData = makeString(["startNsbtPriceREST", toString(nsbt2usdnPrice), toString(nsbt2wavesPrice), "endNsbtPriceREST"], "__")
463470 throw(restData)
464471 }
465472
466473
467474
468475 @Callable(i)
469476 func surfPriceREST () = {
470477 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
471478 let currentPrice = asInt(neutrinoMetrics[nMetricIdxPrice])
472479 let reservesInWaves = asInt(neutrinoMetrics[nMetricIdxReserve])
473480 let neutrinoSupply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
474481 let surfPriceInUsdn = fraction(reservesInWaves, currentPrice, neutrinoSupply)
475482 let surfPriceInWaves = fraction(reservesInWaves, 1, neutrinoSupply)
476483 let restData = makeString(["startSurfPriceREST", toString(surfPriceInUsdn), toString(surfPriceInWaves), "endSurfPriceREST"], "__")
477484 throw(restData)
478485 }
479486
480487

github/deemru/w8io/026f985 
77.21 ms