tx · 5s3GhKTTrHxDhaSRzxDtkSrN7LvTeiwxTtxqK9rRqfG5

3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi:  -0.04000000 Waves

2022.07.20 15:53 [2148105] smart account 3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi > SELF 0.00000000 Waves

{ "type": 13, "id": "5s3GhKTTrHxDhaSRzxDtkSrN7LvTeiwxTtxqK9rRqfG5", "fee": 4000000, "feeAssetId": null, "timestamp": 1658321591631, "version": 1, "sender": "3N7LYefWk1WhvCsY5A9nTq244SbVPmhCypi", "senderPublicKey": "4qGVXRFATZNzo2RZZ5UYHXojGyJgSRBwtgJcCU8rJe5A", "proofs": [ "i1gPyHjgrtx2TFxFtEEYALgQKGR4e5AghmFZJK7bNFbb1gwLabfexfSzrZg6M37f4deqd5LvKpQMHq4yadHMAuP", "2AxD3XMPjw4nmjx35SbktPPvwQjcoBweTuvctJbyvXQAL1jPBSr3qShd3nmQPnhNitoQEzbYJoMvBspdLmW8WJv6", "5CPCsvipiydU1EUbmBi9tabarxKEB39rCMAU8kmZzfGmrz1gBfWHMdu7jJ6BiPgtUJcUyigMGiR8VLjWz99tYVzi" ], "script": "base64:AAIFAAAAAAAAADkIAhIFCgMICAESAwoBARIHCgUBAQEBARIDCgEBEgQKAgECEgMKAQESABIFCgMBAQESBwoFAQEBAQEAAABDAAAAAAtyZXZpc2lvbk51bQIAAAAAAAAAAAlNVUxUU0NBTEUAAAAAAAAAAAgAAAAAB1NDQUxFMTYAAAAAAAAAABAAAAAAA1NFUAIAAAACX18AAAAABUhBTEY4AAAAAAAC+vCAAAAAAAhFVUxFUlgxNgkAATYAAAABAABgkqET2NV0AAAAAARUV09YCQABNgAAAAEAAAAAAAAAAAIAAAAABU1VTFQ2AAAAAAAAD0JAAAAAAAZNVUxUWDYJAAE2AAAAAQAAAAAAAA9CQAAAAAAFTVVMVDgAAAAAAAX14QAAAAAABk1VTFRYOAkAATYAAAABAAAAAAAF9eEAAAAAAAdNVUxUWDEwCQABNgAAAAEAAAAAAlQL5AAAAAAAB01VTFRYMTYJAAE2AAAAAQAAI4byb8EAAAAAAAAHV0FWRVNJRAkAAlkAAAABAgAAAAVXQVZFUwAAAAALa1Jlc3VsdElkeEEAAAAAAAAAAAAAAAAAD2tSZXN1bHRJZHhQYXVsQgAAAAAAAAAAAQAAAAAZa1Jlc3VsdElkeFdSZXNlcnZlc0luVXNkbgAAAAAAAAAAAgAAAAAQa1Jlc3VsdElkeE11bHRCUgAAAAAAAAAAAwAAAAATa1Jlc3VsdElkeE11bHRQb3dlcgAAAAAAAAAABAAAAAAba1Jlc3VsdElkeE11bHRFeHBJblBvd2VyU3RyAAAAAAAAAAAFAAAAABJrUmVzdWx0SWR4TXVsdEtTdHIAAAAAAAAAAAYAAAAAD25NZXRyaWNJZHhQcmljZQAAAAAAAAAAAAAAAAAbbk1ldHJpY0lkeFVzZG5Mb2NrZWRCYWxhbmNlAAAAAAAAAAABAAAAABxuTWV0cmljSWR4V2F2ZXNMb2NrZWRCYWxhbmNlAAAAAAAAAAACAAAAABFuTWV0cmljSWR4UmVzZXJ2ZQAAAAAAAAAAAwAAAAAXbk1ldHJpY0lkeFJlc2VydmVJblVzZG4AAAAAAAAAAAQAAAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5AAAAAAAAAAAFAAAAABFuTWV0cmljSWR4U3VycGx1cwAAAAAAAAAABgAAAAAYbk1ldHJpY0lkeFN1cnBsdXNQZXJjZW50AAAAAAAAAAAHAAAAAAxuTWV0cmljSWR4QlIAAAAAAAAAAAgAAAAAFG5NZXRyaWNJZHhOc2J0U3VwcGx5AAAAAAAAAAAJAAAAABduTWV0cmljSWR4TWF4TnNidFN1cHBseQAAAAAAAAAACgAAAAAUbk1ldHJpY0lkeFN1cmZTdXBwbHkAAAAAAAAAAAsBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAACAAAAHSVzJXNfX2NvbmZpZ19fbmV1dHJpbm9BZGRyZXNzAQAAABNrZXlTd2FwQW1vdW50QVBhcmFtAAAAAAIAAAAYJXMlc19fY29uZmlnX19zd2FwQVBhcmFtAQAAABNrZXlTd2FwQW1vdW50QlBhcmFtAAAAAAIAAAAYJXMlc19fY29uZmlnX19zd2FwQlBhcmFtAQAAABJrZXlOZXV0cmlub0Fzc2V0SWQAAAAAAgAAABFuZXV0cmlub19hc3NldF9pZAEAAAAda2V5TGlxdWlkYXRpb25Db250cmFjdEFkZHJlc3MAAAAAAgAAABRsaXF1aWRhdGlvbl9jb250cmFjdAEAAAASa2V5QXVjdGlvbkNvbnRyYWN0AAAAAAIAAAAQYXVjdGlvbl9jb250cmFjdAEAAAARa2V5Q29udG9sQ29udHJhY3QAAAAAAgAAABBjb250cm9sX2NvbnRyYWN0AQAAAA5rZXlOc2J0QXNzZXRJZAAAAAACAAAADWJvbmRfYXNzZXRfaWQBAAAADmtleVN1cmZBc3NldElkAAAAAAIAAAANc3VyZl9hc3NldF9pZAEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAADWJhbGFuY2VfbG9ja18BAAAAFWtleVdhdmVzTG9ja2VkQmFsYW5jZQAAAAAJAAEsAAAAAgkBAAAAEGtleUJhbGFuY2VMb2NrZWQAAAAAAgAAAAV3YXZlcwEAAAAYa2V5TmV1dHJpbm9Mb2NrZWRCYWxhbmNlAAAAAAkAASwAAAACCQEAAAAQa2V5QmFsYW5jZUxvY2tlZAAAAAACAAAACG5ldXRyaW5vAQAAABFzd2Fwc1RpbWVmcmFtZUtFWQAAAAACAAAAD3N3YXBzX3RpbWVmcmFtZQEAAAAaa2V5VXNlckxhc3RRdWlja1N3YXBIZWlnaHQAAAABAAAAC3Vz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Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAAGdmFsU3RyBQAAAAckbWF0Y2gwBQAAAAZ2YWxTdHIJAAACAAAAAQIAAAAYZmFpbCB0byBjYXN0IGludG8gU3RyaW5nAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAEmtleU5ldXRyaW5vQWRkcmVzcwAAAAAAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABFrZXlDb250b2xDb250cmFjdAAAAAAAAAAAD2F1Y3Rpb25Db250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABJrZXlBdWN0aW9uQ29udHJhY3QAAAAAAAAAABNsaXF1aWRhdGlvbkNvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAHWtleUxpcXVpZGF0aW9uQ29udHJhY3RBZGRyZXNzAAAAAAAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAASa2V5TmV1dHJpbm9Bc3NldElkAAAAAAAAAAALbnNidEFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAADmtleU5zYnRBc3NldElkAAAAAAAAAAALc3VyZkFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAAOa2V5U3VyZkFzc2V0SWQAAAAAAAAACQAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAMAAAAPbmV1dHJpbm9BZGRyZXNzAAAAD25zYnRMb2NrQWRkcmVzcwAAABBzd2FwQW1vdW50QVBhcmFtAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAADm5vdCBhdXRob3JpemVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlOZXV0cmlub0FkZHJlc3MAAAAABQAAAA9uZXV0cmlub0FkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABNrZXlTd2FwQW1vdW50QVBhcmFtAAAAAAUAAAAQc3dhcEFtb3VudEFQYXJhbQUAAAADbmlsAAAAAWkBAAAAFWNhbGNTd2FwTGltaXRSRUFET05MWQAAAAEAAAALZ05zYnRBbW91bnQEAAAAC2xpbWl0UGFyYW1BCQABNgAAAAEJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzCQEAAAATa2V5U3dhcEFtb3VudEFQYXJhbQAAAAAEAAAAC2xpbWl0UGFyYW1CCQABNgAAAAEJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzCQEAAAATa2V5U3dhcEFtb3VudEJQYXJhbQAAAAAEAAAAEmdOc2J0QW1vdW50U2NhbGUxNgkBAAAABXRvWDE2AAAAAgUAAAALZ05zYnRBbW91bnQFAAAABU1VTFQ2BAAAAAxsaW1pdFBvd1BhcnQJAAB2AAAABgUAAAASZ05zYnRBbW91bnRTY2FsZTE2AAAAAAAAAAAQBQAAAAtsaW1pdFBhcmFtQgAAAAAAAAAAEAAAAAAAAAAACAUAAAAHQ0VJTElORwQAAAAFbGltaXQJAAE8AAAAAwUAAAALbGltaXRQYXJhbUEFAAAADGxpbWl0UG93UGFydAUAAAAHTVVMVFgxMAkABRQAAAACBQAAAANuaWwJAAGgAAAAAQUAAAAFbGltaXQAAAABaQEAAAASY2FsY3VsYXRlS1JFQURPTkxZAAAABQAAAAR3UmF3AAAABHVSYXcAAAAFcHJpY2UAAAAEbVJhdwAAAARzUmF3BAAAAANFWFAJAAE2AAAAAQAAAAAAACl6SQQAAAAIRVhQU0NBTEUAAAAAAAAAAAYEAAAAAWEJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAPYXVjdGlvbkNvbnRyYWN0AgAAABBuc2J0Q3VydmVQYXJhbV9hAAAAAAAAAAADBAAAAAVwYXVsQgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA9hdWN0aW9uQ29udHJhY3QCAAAAEG5zYnRDdXJ2ZVBhcmFtX2IJAABpAAAAAgkAAGgAAAACAAAAAAAAAAADBQAAAAVNVUxUNgAAAAAAAAAACgQAAAAPd1Jlc2VydmVzSW5Vc2RuCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAABHdSYXcFAAAABXByaWNlBAAAAAZtdWx0QlIJAABrAAAAAwUAAAAPd1Jlc2VydmVzSW5Vc2RuBQAAAAVNVUxUOAUAAAAEdVJhdwMJAABmAAAAAgUAAAAGbXVsdEJSAAAAAAJ8fffQCQAAAgAAAAECAAAAKUJSID4gMTA2NzguNTY0ODE2JSB3aWxsIG92ZXJmbG93IGV4cG9uZW50BAAAAAltdWx0UG93ZXIJAABoAAAAAgUAAAABYQkAAGUAAAACBQAAAAZtdWx0QlIFAAAABU1VTFQ4BAAAAA5tdWx0RXhwSW5Qb3dlcgkAAHYAAAAGBQAAAANFWFAFAAAACEVYUFNDQUxFCQABNgAAAAEFAAAACW11bHRQb3dlcgUAAAAJTVVMVFNDQUxFBQAAAAdTQ0FMRTE2BQAAAARET1dOBAAAAAVtdWx0SwkAATwAAAADCQABNgAAAAEFAAAABXBhdWxCBQAAAA5tdWx0RXhwSW5Qb3dlcgUAAAAGTVVMVFg2CQAFFAAAAAIFAAAAA25pbAkABEwAAAACBQAAAAFhCQAETAAAAAIFAAAABXBhdWxCCQAETAAAAAIFAAAAD3dSZXNlcnZlc0luVXNkbgkABEwAAAACBQAAAAZtdWx0QlIJAARMAAAAAgUAAAAJbXVsdFBvd2VyCQAETAAAAAIJAAGmAAAAAQUAAAAObXVsdEV4cEluUG93ZXIJAARMAAAAAgkAAaYAAAABBQAAAAVtdWx0SwUAAAADbmlsAAAAAWkBAAAAFWN1cnZlRnVuY3Rpb25SRUFET05MWQAAAAEAAAALd2F2ZXNQYXlSYXcEAAAAD25ldXRyaW5vTWV0cmljcwkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAAaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkFAAAAA25pbAUAAAADbmlsBAAAAAVwcmljZQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAD25NZXRyaWNJZHhQcmljZQQAAAAEd1JhdwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAEW5NZXRyaWNJZHhSZXNlcnZlBAAAAAR1UmF3CQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAD25ldXRyaW5vTWV0cmljcwUAAAAUbk1ldHJpY0lkeFVzZG5TdXBwbHkEAAAABHNSYXcJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABRuTWV0cmljSWR4TnNidFN1cHBseQQAAAAEbVJhdwkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAF25NZXRyaWNJZHhNYXhOc2J0U3VwcGx5BAAAAAprQ2FsY0FycmF5CQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAAAR0aGlzAgAAABJjYWxjdWxhdGVLUkVBRE9OTFkJAARMAAAAAgUAAAAEd1JhdwkABEwAAAACBQAAAAR1UmF3CQAETAAAAAIFAAAABXByaWNlCQAETAAAAAIFAAAABG1SYXcJAARMAAAAAgUAAAAEc1JhdwUAAAADbmlsBQAAAANuaWwEAAAABW11bHRLCQABpwAAAAEJAQAAAAhhc1N0cmluZwAAAAEJAAGRAAAAAgUAAAAKa0NhbGNBcnJheQUAAAASa1Jlc3VsdElkeE11bHRLU3RyBAAAAAd1c2RuUGF5CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAC3dhdmVzUGF5UmF3BQAAAAVwcmljZQQAAAAQYmlnTWF4TnNidFN1cHBseQkAATYAAAABBQAAAARtUmF3BAAAAA1iaWdOc2J0U3VwcGx5CQABNgAAAAEJAABlAAAAAgUAAAAEbVJhdwUAAAAEc1Jh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AAAAFG5NZXRyaWNJZHhVc2RuU3VwcGx5BQAAAA9uc2J0U3VwcGx5REVMVEEEAAAABHNSYXcJAABkAAAAAgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAA9uZXV0cmlub01ldHJpY3MFAAAAFG5NZXRyaWNJZHhOc2J0U3VwcGx5BQAAAA9uc2J0U3VwcGx5REVMVEEEAAAABG1SYXcJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAPbmV1dHJpbm9NZXRyaWNzBQAAABduTWV0cmljSWR4TWF4TnNidFN1cHBseQQAAAAKa0NhbGNBcnJheQkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAASY2FsY3VsYXRlS1JFQURPTkxZCQAETAAAAAIFAAAABHdSYXcJAARMAAAAAgUAAAAEdVJhdwkABEwAAAACBQAAAAVwcmljZQkABEwAAAACBQAAAARtUmF3CQAETAAAAAIFAAAABHNSYXcFAAAAA25pbAUAAAADbmlsBAAAAAhtdWx0S1gxNgkAAacAAAABCQEAAAAIYXNTdHJpbmcAAAABCQABkQAAAAIFAAAACmtDYWxjQXJyYXkFAAAAEmtSZXN1bHRJZHhNdWx0S1N0cgQAAAAMbXVsdFN0ZXAxWDE2CQABPAAAAAMJAAE2AAAAAQUAAAAEbVJhdwUAAAAHTVVMVFgxNgkAATYAAAABCQAAZQAAAAIFAAAABG1SYXcFAAAABHNSYXcEAAAADG11bHRTdGVwMlgxNgkAATwAAAADBQAAAAxtdWx0U3RlcDFYMTYFAAAADG11bHRTdGVwMVgxNgUAAAAHTVVMVFgxNgQAAAAVbXVsdE5zYnQydXNkblByaWNlWDE2CQABPAAAAAMFAAAACG11bHRLWDE2BQAAAAxtdWx0U3RlcDJYMTYFAAAAB01VTFRYMTYEAAAADm5zYnQydXNkblByaWNlCQABoAAAAAEJAAE8AAAAAwUAAAAVbXVsdE5zYnQydXNkblByaWNlWDE2CQABNgAAAAEFAAAABU1VTFQ2BQAAAAdNVUxUWDE2BAAAAA9uc2J0MndhdmVzUHJpY2UJAABrAAAAAwUAAAAObnNidDJ1c2RuUHJpY2UFAAAABU1VTFQ2BQAAAAVwcmljZQkABRQAAAACBQAAAANuaWwJAARMAAAAAgUAAAAObnNidDJ1c2RuUHJpY2UJAARMAAAAAgUAAAAPbnNidDJ3YXZlc1ByaWNlBQAAAANuaWwAAAABaQEAAAAaY2FsY05ldXRpbm9NZXRyaWNzUkVBRE9OTFkAAAAABAAAAAxjdXJyZW50UHJpY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAkBAAAACGtleVByaWNlAAAAAAQAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhrZXlOZXV0cmlub0xvY2tlZEJhbGFuY2UAAAAAAAAAAAAAAAAABAAAABJ3YXZlc0xvY2tlZEJhbGFuY2UJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAFWtleVdhdmVzTG9ja2VkQmFsYW5jZQAAAAAAAAAAAAAAAAAEAAAAB3Jlc2VydmUJAABlAAAAAggJAAPvAAAAAQUAAAAQbmV1dHJpbm9Db250cmFjdAAAAAdyZWd1bGFyBQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UEAAAADnJlc2VydmVzSW5Vc2RuCQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQQAAAAObmV1dHJpbm9TdXBwbHkJAABlAAAAAgkAAGUAAAACCQAAZAAAAAIFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQgJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQUAAAAPbmV1dHJpbm9Bc3NldElkAAAACHF1YW50aXR5CQAD8AAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAD25ldXRyaW5vQXNzZXRJZAkAA/AAAAACBQAAABNsaXF1aWRhdGlvbkNvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQEAAAAB3N1cnBsdXMJAABlAAAAAgUAAAAOcmVzZXJ2ZXNJblVzZG4FAAAADm5ldXRyaW5vU3VwcGx5BAAAAAdkZWZpY2l0CQAAZQAAAAIFAAAADm5ldXRyaW5vU3Vw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", "chainId": 84, "height": 2148105, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 57xZ5sAwE2oMQRkdo2E2Y75mBvQgL8uRdSo1AY2Jh8Ha Next: 32RbsB3sDm6igTDkyjU39FDcKzFmod5wWwbeKKdns4D4 Diff:
OldNewDifferences
239239
240240
241241 @Callable(i)
242-func surfFunctionREADONLY (amount,assetId) = {
243- let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
244- let price = asInt(neutrinoMetrics[nMetricIdxPrice])
245- let priceBig = toBigInt(price)
246- let reserve = asInt(neutrinoMetrics[nMetricIdxReserve])
247- let reserveBig = toBigInt(reserve)
248- let supply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
249- let supplyBig = toBigInt(supply)
250- let BR = asInt(neutrinoMetrics[nMetricIdxBR])
251- if ((BR >= MULT6))
252- then throw((("BR = " + toString(BR)) + ", cannot buy SURF"))
253- else {
254- let maxWavesPay = (fraction(supply, MULT8, price) - reserve)
255- let maxUsdnPay = (supply - fraction(reserve, price, MULT8))
256- let useAmount = if ((assetId == neutrinoAssetId))
257- then if ((amount > maxUsdnPay))
258- then maxUsdnPay
259- else amount
260- else if ((assetId == WAVESID))
261- then if ((amount > maxWavesPay))
262- then maxWavesPay
242+func surfFunctionREADONLY (amount,assetId) = if ((0 > amount))
243+ then throw("amount should be positive")
244+ else {
245+ let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
246+ let price = asInt(neutrinoMetrics[nMetricIdxPrice])
247+ let priceBig = toBigInt(price)
248+ let reserve = asInt(neutrinoMetrics[nMetricIdxReserve])
249+ let reserveBig = toBigInt(reserve)
250+ let supply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
251+ let supplyBig = toBigInt(supply)
252+ let BR = asInt(neutrinoMetrics[nMetricIdxBR])
253+ if ((BR >= MULT6))
254+ then throw((("BR = " + toString(BR)) + ", cannot buy SURF"))
255+ else {
256+ let maxWavesPay = (fraction(supply, MULT8, price) - reserve)
257+ let maxUsdnPay = (supply - fraction(reserve, price, MULT8))
258+ let useAmount = if ((assetId == neutrinoAssetId))
259+ then if ((amount > maxUsdnPay))
260+ then maxUsdnPay
263261 else amount
264- else 0
265- let amountBig = toBigInt(useAmount)
266- if ((assetId == neutrinoAssetId))
267- then $Tuple2(nil, [toInt(fraction(fraction(amountBig, MULTX8, priceBig), (supplyBig - (amountBig / TWOX)), reserveBig)), 0, useAmount, reserve, supply, BR, reserve, (supply - useAmount), fraction(convertWavesToNeutrino(reserve, price), MULT6, (supply - useAmount)), (amount - useAmount), price])
268- else if ((assetId == WAVESID))
269- then $Tuple2(nil, [toInt(fraction(supplyBig, log(fraction((reserveBig + amountBig), MULTX16, reserveBig), 16, EULERX16, 16, 16, HALFUP), MULTX16)), useAmount, 0, reserve, supply, BR, (reserve + useAmount), supply, fraction(convertWavesToNeutrino((reserve + useAmount), price), MULT6, supply), (amount - useAmount), price])
270- else throw("Unsupported asset")
271- }
272- }
262+ else if ((assetId == WAVESID))
263+ then if ((amount > maxWavesPay))
264+ then maxWavesPay
265+ else amount
266+ else 0
267+ let amountBig = toBigInt(useAmount)
268+ if ((assetId == neutrinoAssetId))
269+ then $Tuple2(nil, [toInt(fraction(fraction(amountBig, MULTX8, priceBig), (supplyBig - (amountBig / TWOX)), reserveBig)), 0, useAmount, reserve, supply, BR, reserve, (supply - useAmount), fraction(convertWavesToNeutrino(reserve, price), MULT6, (supply - useAmount)), (amount - useAmount), price])
270+ else if ((assetId == WAVESID))
271+ then $Tuple2(nil, [toInt(fraction(supplyBig, log(fraction((reserveBig + amountBig), MULTX16, reserveBig), 16, EULERX16, 16, 16, HALFUP), MULTX16)), useAmount, 0, reserve, supply, BR, (reserve + useAmount), supply, fraction(convertWavesToNeutrino((reserve + useAmount), price), MULT6, supply), (amount - useAmount), price])
272+ else throw("Unsupported asset")
273+ }
274+ }
273275
274276
275277
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = ""
55
66 let MULTSCALE = 8
77
88 let SCALE16 = 16
99
1010 let SEP = "__"
1111
1212 let HALF8 = 50000000
1313
1414 let EULERX16 = toBigInt(27182818284590452)
1515
1616 let TWOX = toBigInt(2)
1717
1818 let MULT6 = 1000000
1919
2020 let MULTX6 = toBigInt(1000000)
2121
2222 let MULT8 = 100000000
2323
2424 let MULTX8 = toBigInt(100000000)
2525
2626 let MULTX10 = toBigInt(10000000000)
2727
2828 let MULTX16 = toBigInt(10000000000000000)
2929
3030 let WAVESID = fromBase58String("WAVES")
3131
3232 let kResultIdxA = 0
3333
3434 let kResultIdxPaulB = 1
3535
3636 let kResultIdxWReservesInUsdn = 2
3737
3838 let kResultIdxMultBR = 3
3939
4040 let kResultIdxMultPower = 4
4141
4242 let kResultIdxMultExpInPowerStr = 5
4343
4444 let kResultIdxMultKStr = 6
4545
4646 let nMetricIdxPrice = 0
4747
4848 let nMetricIdxUsdnLockedBalance = 1
4949
5050 let nMetricIdxWavesLockedBalance = 2
5151
5252 let nMetricIdxReserve = 3
5353
5454 let nMetricIdxReserveInUsdn = 4
5555
5656 let nMetricIdxUsdnSupply = 5
5757
5858 let nMetricIdxSurplus = 6
5959
6060 let nMetricIdxSurplusPercent = 7
6161
6262 let nMetricIdxBR = 8
6363
6464 let nMetricIdxNsbtSupply = 9
6565
6666 let nMetricIdxMaxNsbtSupply = 10
6767
6868 let nMetricIdxSurfSupply = 11
6969
7070 func keyNeutrinoAddress () = "%s%s__config__neutrinoAddress"
7171
7272
7373 func keySwapAmountAParam () = "%s%s__config__swapAParam"
7474
7575
7676 func keySwapAmountBParam () = "%s%s__config__swapBParam"
7777
7878
7979 func keyNeutrinoAssetId () = "neutrino_asset_id"
8080
8181
8282 func keyLiquidationContractAddress () = "liquidation_contract"
8383
8484
8585 func keyAuctionContract () = "auction_contract"
8686
8787
8888 func keyContolContract () = "control_contract"
8989
9090
9191 func keyNsbtAssetId () = "bond_asset_id"
9292
9393
9494 func keySurfAssetId () = "surf_asset_id"
9595
9696
9797 func keyBalanceLocked () = "balance_lock_"
9898
9999
100100 func keyWavesLockedBalance () = (keyBalanceLocked() + "waves")
101101
102102
103103 func keyNeutrinoLockedBalance () = (keyBalanceLocked() + "neutrino")
104104
105105
106106 func swapsTimeframeKEY () = "swaps_timeframe"
107107
108108
109109 func keyUserLastQuickSwapHeight (userAddress) = makeString(["%s%s", "userLastQuickSwapHeight", userAddress], SEP)
110110
111111
112112 func keyQuickSwapUserSpentInPeriod (userAddress) = makeString(["%s%s", "quickSwapUserSpentInPeriod", userAddress], SEP)
113113
114114
115115 func keyPrice () = "price"
116116
117117
118118 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
119119
120120
121121 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
122122
123123
124124 func getNumberByKey (address,key) = valueOrElse(getInteger(address, key), 0)
125125
126126
127127 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
128128
129129
130130 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
131131
132132
133133 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
134134
135135
136136 func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULTX16, toBigInt(origScaleMult))
137137
138138
139139 func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULTX16))
140140
141141
142142 func asAnyList (val) = match val {
143143 case valAnyLyst: List[Any] =>
144144 valAnyLyst
145145 case _ =>
146146 throw("fail to cast into List[Any]")
147147 }
148148
149149
150150 func asInt (val) = match val {
151151 case valInt: Int =>
152152 valInt
153153 case _ =>
154154 throw("fail to cast into Int")
155155 }
156156
157157
158158 func asString (val) = match val {
159159 case valStr: String =>
160160 valStr
161161 case _ =>
162162 throw("fail to cast into String")
163163 }
164164
165165
166166 let neutrinoContract = addressFromStringValue(getStringOrFail(this, keyNeutrinoAddress()))
167167
168168 let controlContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyContolContract()))
169169
170170 let auctionContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyAuctionContract()))
171171
172172 let liquidationContract = addressFromStringValue(getStringOrFail(neutrinoContract, keyLiquidationContractAddress()))
173173
174174 let neutrinoAssetId = fromBase58String(getStringOrFail(neutrinoContract, keyNeutrinoAssetId()))
175175
176176 let nsbtAssetId = fromBase58String(getStringValue(neutrinoContract, keyNsbtAssetId()))
177177
178178 let surfAssetId = fromBase58String(getStringValue(auctionContract, keySurfAssetId()))
179179
180180 @Callable(i)
181181 func constructor (neutrinoAddress,nsbtLockAddress,swapAmountAParam) = if ((i.caller != this))
182182 then throw("not authorized")
183183 else [StringEntry(keyNeutrinoAddress(), neutrinoAddress), IntegerEntry(keySwapAmountAParam(), swapAmountAParam)]
184184
185185
186186
187187 @Callable(i)
188188 func calcSwapLimitREADONLY (gNsbtAmount) = {
189189 let limitParamA = toBigInt(getIntOrFail(this, keySwapAmountAParam()))
190190 let limitParamB = toBigInt(getIntOrFail(this, keySwapAmountBParam()))
191191 let gNsbtAmountScale16 = toX16(gNsbtAmount, MULT6)
192192 let limitPowPart = pow(gNsbtAmountScale16, 16, limitParamB, 16, 8, CEILING)
193193 let limit = fraction(limitParamA, limitPowPart, MULTX10)
194194 $Tuple2(nil, toInt(limit))
195195 }
196196
197197
198198
199199 @Callable(i)
200200 func calculateKREADONLY (wRaw,uRaw,price,mRaw,sRaw) = {
201201 let EXP = toBigInt(2718281)
202202 let EXPSCALE = 6
203203 let a = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_a"), 3)
204204 let paulB = valueOrElse(getInteger(auctionContract, "nsbtCurveParam_b"), ((3 * MULT6) / 10))
205205 let wReservesInUsdn = convertWavesToNeutrino(wRaw, price)
206206 let multBR = fraction(wReservesInUsdn, MULT8, uRaw)
207207 if ((multBR > 10678564816))
208208 then throw("BR > 10678.564816% will overflow exponent")
209209 else {
210210 let multPower = (a * (multBR - MULT8))
211211 let multExpInPower = pow(EXP, EXPSCALE, toBigInt(multPower), MULTSCALE, SCALE16, DOWN)
212212 let multK = fraction(toBigInt(paulB), multExpInPower, MULTX6)
213213 $Tuple2(nil, [a, paulB, wReservesInUsdn, multBR, multPower, toString(multExpInPower), toString(multK)])
214214 }
215215 }
216216
217217
218218
219219 @Callable(i)
220220 func curveFunctionREADONLY (wavesPayRaw) = {
221221 let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
222222 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
223223 let wRaw = asInt(neutrinoMetrics[nMetricIdxReserve])
224224 let uRaw = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
225225 let sRaw = asInt(neutrinoMetrics[nMetricIdxNsbtSupply])
226226 let mRaw = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
227227 let kCalcArray = asAnyList(invoke(this, "calculateKREADONLY", [wRaw, uRaw, price, mRaw, sRaw], nil))
228228 let multK = parseBigIntValue(asString(kCalcArray[kResultIdxMultKStr]))
229229 let usdnPay = convertWavesToNeutrino(wavesPayRaw, price)
230230 let bigMaxNsbtSupply = toBigInt(mRaw)
231231 let bigNsbtSupply = toBigInt((mRaw - sRaw))
232232 let step1 = fraction(toBigInt(usdnPay), MULTX16, multK)
233233 let step2 = fraction(step1, bigNsbtSupply, bigMaxNsbtSupply)
234234 let step3 = toInt(fraction(bigNsbtSupply, bigMaxNsbtSupply, (step2 + bigMaxNsbtSupply)))
235235 let nsbtAmountRaw = ((mRaw - sRaw) - step3)
236236 $Tuple2(nil, [nsbtAmountRaw, usdnPay, wRaw, uRaw, mRaw, sRaw, asInt(kCalcArray[kResultIdxA]), asInt(kCalcArray[kResultIdxPaulB]), asInt(kCalcArray[kResultIdxWReservesInUsdn]), price, asInt(kCalcArray[kResultIdxMultBR]), asInt(kCalcArray[kResultIdxMultPower]), kCalcArray[kResultIdxMultExpInPowerStr], kCalcArray[kResultIdxMultKStr], toString(step1), toString(step2), step3])
237237 }
238238
239239
240240
241241 @Callable(i)
242-func surfFunctionREADONLY (amount,assetId) = {
243- let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
244- let price = asInt(neutrinoMetrics[nMetricIdxPrice])
245- let priceBig = toBigInt(price)
246- let reserve = asInt(neutrinoMetrics[nMetricIdxReserve])
247- let reserveBig = toBigInt(reserve)
248- let supply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
249- let supplyBig = toBigInt(supply)
250- let BR = asInt(neutrinoMetrics[nMetricIdxBR])
251- if ((BR >= MULT6))
252- then throw((("BR = " + toString(BR)) + ", cannot buy SURF"))
253- else {
254- let maxWavesPay = (fraction(supply, MULT8, price) - reserve)
255- let maxUsdnPay = (supply - fraction(reserve, price, MULT8))
256- let useAmount = if ((assetId == neutrinoAssetId))
257- then if ((amount > maxUsdnPay))
258- then maxUsdnPay
259- else amount
260- else if ((assetId == WAVESID))
261- then if ((amount > maxWavesPay))
262- then maxWavesPay
242+func surfFunctionREADONLY (amount,assetId) = if ((0 > amount))
243+ then throw("amount should be positive")
244+ else {
245+ let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
246+ let price = asInt(neutrinoMetrics[nMetricIdxPrice])
247+ let priceBig = toBigInt(price)
248+ let reserve = asInt(neutrinoMetrics[nMetricIdxReserve])
249+ let reserveBig = toBigInt(reserve)
250+ let supply = asInt(neutrinoMetrics[nMetricIdxUsdnSupply])
251+ let supplyBig = toBigInt(supply)
252+ let BR = asInt(neutrinoMetrics[nMetricIdxBR])
253+ if ((BR >= MULT6))
254+ then throw((("BR = " + toString(BR)) + ", cannot buy SURF"))
255+ else {
256+ let maxWavesPay = (fraction(supply, MULT8, price) - reserve)
257+ let maxUsdnPay = (supply - fraction(reserve, price, MULT8))
258+ let useAmount = if ((assetId == neutrinoAssetId))
259+ then if ((amount > maxUsdnPay))
260+ then maxUsdnPay
263261 else amount
264- else 0
265- let amountBig = toBigInt(useAmount)
266- if ((assetId == neutrinoAssetId))
267- then $Tuple2(nil, [toInt(fraction(fraction(amountBig, MULTX8, priceBig), (supplyBig - (amountBig / TWOX)), reserveBig)), 0, useAmount, reserve, supply, BR, reserve, (supply - useAmount), fraction(convertWavesToNeutrino(reserve, price), MULT6, (supply - useAmount)), (amount - useAmount), price])
268- else if ((assetId == WAVESID))
269- then $Tuple2(nil, [toInt(fraction(supplyBig, log(fraction((reserveBig + amountBig), MULTX16, reserveBig), 16, EULERX16, 16, 16, HALFUP), MULTX16)), useAmount, 0, reserve, supply, BR, (reserve + useAmount), supply, fraction(convertWavesToNeutrino((reserve + useAmount), price), MULT6, supply), (amount - useAmount), price])
270- else throw("Unsupported asset")
271- }
272- }
262+ else if ((assetId == WAVESID))
263+ then if ((amount > maxWavesPay))
264+ then maxWavesPay
265+ else amount
266+ else 0
267+ let amountBig = toBigInt(useAmount)
268+ if ((assetId == neutrinoAssetId))
269+ then $Tuple2(nil, [toInt(fraction(fraction(amountBig, MULTX8, priceBig), (supplyBig - (amountBig / TWOX)), reserveBig)), 0, useAmount, reserve, supply, BR, reserve, (supply - useAmount), fraction(convertWavesToNeutrino(reserve, price), MULT6, (supply - useAmount)), (amount - useAmount), price])
270+ else if ((assetId == WAVESID))
271+ then $Tuple2(nil, [toInt(fraction(supplyBig, log(fraction((reserveBig + amountBig), MULTX16, reserveBig), 16, EULERX16, 16, 16, HALFUP), MULTX16)), useAmount, 0, reserve, supply, BR, (reserve + useAmount), supply, fraction(convertWavesToNeutrino((reserve + useAmount), price), MULT6, supply), (amount - useAmount), price])
272+ else throw("Unsupported asset")
273+ }
274+ }
273275
274276
275277
276278 @Callable(i)
277279 func calcContractNsbtPriceSYSREADONLY (nsbtSupplyDELTA) = {
278280 let neutrinoMetrics = asAnyList(invoke(this, "calcNeutinoMetricsREADONLY", nil, nil))
279281 let price = asInt(neutrinoMetrics[nMetricIdxPrice])
280282 let wRaw = asInt(neutrinoMetrics[nMetricIdxReserve])
281283 let uRaw = (asInt(neutrinoMetrics[nMetricIdxUsdnSupply]) - nsbtSupplyDELTA)
282284 let sRaw = (asInt(neutrinoMetrics[nMetricIdxNsbtSupply]) + nsbtSupplyDELTA)
283285 let mRaw = asInt(neutrinoMetrics[nMetricIdxMaxNsbtSupply])
284286 let kCalcArray = asAnyList(invoke(this, "calculateKREADONLY", [wRaw, uRaw, price, mRaw, sRaw], nil))
285287 let multKX16 = parseBigIntValue(asString(kCalcArray[kResultIdxMultKStr]))
286288 let multStep1X16 = fraction(toBigInt(mRaw), MULTX16, toBigInt((mRaw - sRaw)))
287289 let multStep2X16 = fraction(multStep1X16, multStep1X16, MULTX16)
288290 let multNsbt2usdnPriceX16 = fraction(multKX16, multStep2X16, MULTX16)
289291 let nsbt2usdnPrice = toInt(fraction(multNsbt2usdnPriceX16, toBigInt(MULT6), MULTX16))
290292 let nsbt2wavesPrice = fraction(nsbt2usdnPrice, MULT6, price)
291293 $Tuple2(nil, [nsbt2usdnPrice, nsbt2wavesPrice])
292294 }
293295
294296
295297
296298 @Callable(i)
297299 func calcNeutinoMetricsREADONLY () = {
298300 let currentPrice = getIntegerValue(controlContract, keyPrice())
299301 let neutrinoLockedBalance = valueOrElse(getInteger(neutrinoContract, keyNeutrinoLockedBalance()), 0)
300302 let wavesLockedBalance = valueOrElse(getInteger(neutrinoContract, keyWavesLockedBalance()), 0)
301303 let reserve = (wavesBalance(neutrinoContract).regular - wavesLockedBalance)
302304 let reservesInUsdn = convertWavesToNeutrino(reserve, currentPrice)
303305 let neutrinoSupply = (((neutrinoLockedBalance + value(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
304306 let surplus = (reservesInUsdn - neutrinoSupply)
305307 let deficit = (neutrinoSupply - reservesInUsdn)
306308 let surplusPercent = if ((neutrinoSupply == 0))
307309 then 0
308310 else (fraction(surplus, MULT6, neutrinoSupply) * 100)
309311 let BR = if ((neutrinoSupply == 0))
310312 then 0
311313 else fraction(reservesInUsdn, MULT6, neutrinoSupply)
312314 let nsbtSupplyMAX = value(assetInfo(nsbtAssetId)).quantity
313315 let nsbtSupply = (nsbtSupplyMAX - assetBalance(auctionContract, nsbtAssetId))
314316 let surfSupply = value(assetInfo(surfAssetId)).quantity
315317 $Tuple2(nil, [currentPrice, neutrinoLockedBalance, wavesLockedBalance, reserve, reservesInUsdn, neutrinoSupply, surplus, surplusPercent, BR, nsbtSupply, nsbtSupplyMAX, surfSupply])
316318 }
317319
318320
319321
320322 @Callable(i)
321323 func getUnstakeComissionAmountREADONLY (amount,startHeight,halfLife) = $Tuple2(nil, fraction(amount, pow(2, 0, fraction(-((height - startHeight)), MULT8, halfLife), 8, 8, HALFUP), MULT8))
322324
323325
324326
325327 @Callable(i)
326328 func mergeStakesREADONLY (amount1,height1,amount2,height2,halfLife) = {
327329 let w = fraction(amount2, pow(2, 0, fraction((height2 - height1), MULT8, halfLife), 8, 8, HALFUP), MULT8)
328330 let v = fraction((amount1 + amount2), MULT8, (amount1 + w))
329331 $Tuple2(nil, (height1 + ((HALF8 - (halfLife * log(v, 8, 2, 0, 8, HALFUP))) / MULT8)))
330332 }
331333
332334
333335 @Verifier(tx)
334336 func verify () = {
335337 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
336338 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
337339 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
338340 then 1
339341 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
340342 then 1
341343 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
342344 then 1
343345 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
344346 then 2
345347 else 0))
346348 (count >= 3)
347349 }
348350

github/deemru/w8io/3ef1775 
73.74 ms