tx · 3Mng8tXZefAVxfnYNekSVD4bHtZM8of6by7GTp2bwVYZ

3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd:  -0.04000000 Waves

2022.07.08 13:58 [2130636] smart account 3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd > SELF 0.00000000 Waves

{ "type": 13, "id": "3Mng8tXZefAVxfnYNekSVD4bHtZM8of6by7GTp2bwVYZ", "fee": 4000000, "feeAssetId": null, "timestamp": 1657277890858, "version": 1, "sender": "3N5NAftzfcw3gAt8nc35bNr9UdPTVgC81fd", "senderPublicKey": "CdnTmMHxT68Qa4MtHEnAiUhsdKTi2YkHPGn92ThinVNt", "proofs": [ "3HQ8iUNGjVfEQxVdEmbdwweNn2L394zxJo7ind7wdbkMNDSFzf6xXpVwxnYPRDrghaBcJ2yAVUhqMZKQoMBpLEcR", "29nko8oXY87BFbBErmFEBuPHTqvrehn3WJiU6UDKKWgtiuXCP3nHZ3w681FDF19hqz5WWvfvRb4yJwdziZMj4xmw", "3MDNdg4kVeJXWn1bUgYuxxCYDqgZJirxWNaNrsmgva8yTEnUCu12MC8uWxGgizTbERBH9Be1nvRfNyyrFFLKuAH3" ], "script": "base64:AAIFAAAAAAAAACcIAhIFCgMIAQESBAoCAQESABIAEgMKAQgSABIAEgASABIFCgMBAQQAAABaAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAWZ2V0Qm9vbEJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5BwEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkCAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkAAAAAAAAAAAABAAAACWFzQW55TGlzdAAAAAEAAAADdmFsBAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACUxpc3RbQW55XQQAAAAKdmFsQW55THlzdAUAAAAHJG1hdGNoMAUAAAAKdmFsQW55THlzdAkAAAIAAAABAgAAABtmYWlsIHRvIGNhc3QgaW50byBMaXN0W0FueV0BAAAACGFzU3RyaW5nAAAAAQAAAAN2YWwEAAAAByRtYXRjaDAFAAAAA3ZhbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZ2YWxTdHIFAAAAByRtYXRjaDAFAAAABnZhbFN0cgkAAAIAAAABAgAAABhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBAAAABWFzSW50AAAAAQAAAAN2YWwEAAAAByRtYXRjaDAFAAAAA3ZhbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAZ2YWxJbnQFAAAAByRtYXRjaDAFAAAABnZhbEludAkAAAIAAAABAgAAABVmYWlsIHRvIGNhc3QgaW50byBJbnQAAAAAA1NFUAIAAAACX18AAAAABU1VTFQ2AAAAAAAAD0JAAAAAAAVNVUxUOAAAAAAABfXhAAAAAAAHTVVMVFgxNgkAATYAAAABAAAjhvJvwQAAAAAAAAhDQU5DRUxFRAIAAAAIY2FuY2VsZWQAAAAAA05FVwIAAAADbmV3AAAAAAZGSUxMRUQCAAAABmZpbGxlZAAAAAAHV0FWRVNJRAkAAlkAAAABAgAAAAVXQVZFUwAAAAAPbk1ldHJpY0lkeFByaWNlAAAAAAAAAAAAAAAAABtuTWV0cmljSWR4VXNkbkxvY2tlZEJhbGFuY2UAAAAAAAAAAAEAAAAAHG5NZXRyaWNJZHhXYXZlc0xvY2tlZEJhbGFuY2UAAAAAAAAAAAIAAAAAEW5NZXRyaWNJZHhSZXNlcnZlAAAAAAAAAAADAAAAABduTWV0cmljSWR4UmVzZXJ2ZUluVXNkbgAAAAAAAAAABAAAAAAUbk1ldHJpY0lkeFVzZG5TdXBwbHkAAAAAAAAAAAUAAAAAEW5NZXRyaWNJZHhTdXJwbHVzAAAAAAAAAAAGAAAAABhuTWV0cmljSWR4U3VycGx1c1BlcmNlbnQAAAAAAAAAAAcAAAAADG5NZXRyaWNJZHhCUgAAAAAAAAAACAAAAAAUbk1ldHJpY0lkeE5zYnRTdXBwbHkAAAAAAAAAAAkAAAAAF25NZXRyaWNJZHhNYXhOc2J0U3VwcGx5AAAAAAAAAAAKAAAAABRuTWV0cmljSWR4U3VyZlN1cHBseQAAAAAAAAAACwAAAAAMYkZ1bmNJZHhTdXJmAAAAAAAAAAAAAAAAAA1iRnVuY0lkeFdhdmVzAAAAAAAAAAABAAAAAAxiRnVuY0lkeFVzZG4AAAAAAAAAAAIAAAAAFGJGdW5jSWR4UmVzZXJ2ZVN0YXJ0AAAAAAAAAAADAAAAABNiRnVuY0lkeFN1cHBseVN0YXJ0AAAAAAAAAAAEAAAAAA9iRnVuY0lkeEJSU3RhcnQAAAAAAAAAAAUAAAAAEmJGdW5jSWR4UmVzZXJ2ZUVuZAAAAAAAAAAABgAAAAARYkZ1bmNJZHhTdXBwbHlFbmQAAAAAAAAAAAcAAAAADWJGdW5jSWR4QlJFbmQAAAAAAAAAAAgAAAAAEWJGdW5jSWR4UmVzdFdhdmVzAAAAAAAAAAAJAAAAABBiRnVuY0lkeFJlc3RVc2RuAAAAAAAAAAAKAAAAABJiRnVuY0lkeFdhdmVzUHJpY2UAAAAAAAAAAAsAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAAOTnNidEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAADlN1cmZBc3NldElkS2V5AgAAAA1zdXJmX2Fzc2V0X2lkAAAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAANYmFsYW5jZV9sb2NrXwAAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAV3YXZlcwAAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAhuZXV0cmlubwAAAAANRmlyc3RPcmRlcktleQIAAAALb3JkZXJfZmlyc3QAAAAAD01hdGhDb250cmFjdEtleQIAAAANbWF0aF9jb250cmFjdAAAAAAVTWluV2F2ZXNGb3JOc2J0QnV5S2V5AgAAABJtaW5fd2F2ZXNfbnNidF9idXkAAAAADk1pbk5zYnRTZWxsS2V5AgAAAA1taW5fbnNidF9zZWxsAAAAABVNaW5XYXZlc0ZvclN1cmZCdXlLZXkCAAAAEm1pbl93YXZlc19zdXJmX2J1eQAAAAAUTWluVXNkbkZvclN1cmZCdXlLZXkCAAAAEW1pbl91c2RuX3N1cmZfYnV5AQAAABJnZXRSb2lCeU9yZGVySWRLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAQZGVidWdfb3JkZXJfcm9pXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl9wcmljZV8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfdG90YWxfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX293bmVyXwUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJIZWlnaHRLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAANb3JkZXJfaGVpZ2h0XwUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAANb3JkZXJfc3RhdHVzXwUAAAAHb3JkZXJJZAEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAABNvcmRlcl9maWxsZWRfdG90YWxfBQAAAAdvcmRlcklkAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAALb3JkZXJfcHJldl8FAAAAB29yZGVySWQBAAAAD2dldE5leHRPcmRlcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAtvcmRlcl9uZXh0XwUAAAAHb3JkZXJJZAEAAAAWY29udmVydE5ldXRyaW5vVG9XYXZlcwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMFAAAABmFtb3VudAUAAAAFTVVMVDgFAAAABXByaWNlAQAAABZjb252ZXJ0V2F2ZXNUb05ldXRyaW5vAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwUAAAAGYW1vdW50BQAAAAVwcmljZQUAAAAFTVVMVDgBAAAABXRvWDE2AAAAAgAAAAdvcmlnVmFsAAAADW9yaWdTY2FsZU11bHQJAAE8AAAAAwkAATYAAAABBQAAAAdvcmlnVmFsBQAAAAdNVUxUWDE2CQABNgAAAAEFAAAADW9yaWdTY2FsZU11bHQBAAAAB2Zyb21YMTYAAAACAAAAA3ZhbAAAAA9yZXN1bHRTY2FsZU11bHQJAAGgAAAAAQkAATwAAAADBQAAAAN2YWwJAAE2AAAAAQUAAAAPcmVzdWx0U2NhbGVNdWx0BQAAAAdNVUxUWDE2AAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU1+WJ2GIi6zFsn7vK5pKJxw3NIOJwrWveAAAAAA9jb250cm9sQ29udHJhY3QJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVQhQZlgr9WxzLUVB2LMXSyOf9bsxLVJY6EAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVSFO+MfFxTq/puHhsTXJqxlZgZ4motyILkAAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAPTWF0aENvbnRyYWN0S2V5AAAAAA9uZXV0cmlub0Fzc2V0SWQBAAAAIPd26vf3g8pl224T7gI7z1gplanB0Y3yS9ps2B1igMjeAAAAAAtuc2J0QXNzZXRJZAEAAAAg0LXMsc32iGTNRyotjPq8+T7E/Q4lTB90XCk6/p1poRAAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QCAAAACmlzX2Jsb2NrZWQAAAAAFW1pbldhdmVzQW1vdW50TnNidEJ1eQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABVNaW5XYXZlc0Zvck5zYnRCdXlLZXkAAAAAADuaygAAAAAAC21pbk5zYnRTZWxsCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADk1pbk5zYnRTZWxsS2V5AAAAAAAAD0JAAAAAABVtaW5XYXZlc0Ftb3VudFN1cmZCdXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAVTWluV2F2ZXNGb3JTdXJmQnV5S2V5AAAAAAAF9eEAAAAAABRtaW5Vc2RuQW1vdW50U3VyZkJ1eQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABRNaW5Vc2RuRm9yU3VyZkJ1eUtleQAAAAAAAJiWgAAAAAAKZmlyc3RPcmRlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAANRmlyc3RPcmRlcktleQEAAAANZ2V0T3JkZXJQcmljZQAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlck93bmVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABBQAAAAJpZAEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAJpZAEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAACaWQBAAAADGdldFByZXZPcmRlcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9nZXRQcmV2T3JkZXJLZXkAAAABBQAAAAJpZAEAAAAMZ2V0TmV4dE9yZGVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2dldE5leHRPcmRlcktleQAAAAEFAAAAAmlkAQAAAA9nZXRSZXZlcnNlUHJpY2UAAAABAAAABXByaWNlCQAAaQAAAAIJAABoAAAAAgUAAAAFTVVMVDYFAAAABU1VTFQ2BQAAAAVwcmljZQEAAAAWY2FsY05zYnQyV2F2ZXNQcmljZVJhdwAAAAIAAAANc3BlbnRXYXZlc1JhdwAAAA9yZWNlaXZlZE5zYnRSYXcJAAE8AAAAAwkAATYAAAABBQAAAA1zcGVudFdhdmVzUmF3CQABNgAAAAEJAABoAAAAAgUAAAAFTVVMVDYFAAAABU1VTFQ2CQABNgAAAAEFAAAAD3JlY2VpdmVkTnNidFJhdwEAAAAJb3JkZXJEYXRhAAAACAAAAAdvcmRlcklkAAAADXRvdGFsV2F2ZWxldHMAAAAOZmlsbGVkV2F2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AAABaQEAAAANY29uc3RydWN0b3JWMgAAAAIAAAAVbWluV2F2ZXNGb3JTdXJmQnV5S2V5AAAAFG1pblVzZG5Gb3JTdXJmQnV5S2V5AwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAEVBlcm1pc3Npb24gZGVuaWVkBAAAAAVpc3N1ZQkABEMAAAAHAgAAAARTVVJGAgAAACxTbWFydCBVdGlsaXR5IFJlY2FwaXRhbGl6YXRpb24gRmVhdHVyZSB0b2tlbgAAAAAAAAAAAAAAAAAAAAAABgYFAAAABHVuaXQAAAAAAAAAAAAEAAAAB2Fzc2V0SWQJAAQ4AAAAAQUAAAAFaXNzdWUJAARMAAAAAgUAAAAFaXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAOU3VyZkFzc2V0SWRLZXkJAAJYAAAAAQUAAAAHYXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAVTWluV2F2ZXNGb3JTdXJmQnV5S2V5BQAAABVtaW5XYXZlc0ZvclN1cmZCdXlLZXkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFE1pblVzZG5Gb3JTdXJmQnV5S2V5BQAAABRtaW5Vc2RuRm9yU3VyZkJ1eUtleQUAAAADbmlsAAAAAWkBAAAAB2J1eU5zYnQAAAAABAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACXBtdEFtb3VudAgFAAAAA3BtdAAAAAZhbW91bnQEAAAACHdhdmVzUGF5BQAAAAlwbXRBbW91bnQDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABZY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbCByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMDCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkCQAAAgAAAAECAAAAEmNhbiB1c2Ugd2F2ZXMgb25seQMJAABmAAAAAgUAAAAVbWluV2F2ZXNBbW91bnRO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T3JkZXIFAAAAB29yZGVySWQFAAAACW5leHRPcmRlcgUAAAAKZmlyc3RPcmRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0TmV4dE9yZGVyS2V5AAAAAQUAAAAJcHJldk9yZGVyBQAAAAluZXh0T3JkZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2dldFByZXZPcmRlcktleQAAAAEFAAAACW5leHRPcmRlcgUAAAAJcHJldk9yZGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFnZXRPcmRlclN0YXR1c0tleQAAAAEFAAAAB29yZGVySWQFAAAACENBTkNFTEVECQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAR1bml0BQAAAANuaWwAAAABaQEAAAAgbWluV2F2ZXNBbW91bnROc2J0QnV5U1lTUkVBRE9OTFkAAAAACQAFFAAAAAIFAAAAA25pbAUAAAAVbWluV2F2ZXNBbW91bnROc2J0QnV5AAAAAWkBAAAAH21pbk5zYnRBbW91bnRGb3JTZWxsU1lTUkVBRE9OTFkAAAAACQAFFAAAAAIFAAAAA25pbAUAAAALbWluTnNidFNlbGwAAAABaQEAAAAgbWluV2F2ZXNBbW91bnRTdXJmQnV5U1lTUkVBRE9OTFkAAAAACQAFFAAAAAIFAAAAA25pbAUAAAAVbWluV2F2ZXNBbW91bnRTdXJmQnV5AAAAAWkBAAAAH21pblVzZG5BbW91bnRTdXJmQnV5U1lTUkVBRE9OTFkAAAAACQAFFAAAAAIFAAAAA25pbAUAAAAUbWluVXNkbkFtb3VudFN1cmZCdXkAAAABaQEAAAAHYnV5U3VyZgAAAAMAAAASYXZlcmFnZVByaWNlV2FudGVkAAAAEG1heFRvbGVyYW5jZVBlcmMAAAAJYXV0b1N0YWtlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAACJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBAAAAANwbXQJAAGRAAAAAggFAAAA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AQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAKc3VyZlJlc3VsdAUAAAAQYkZ1bmNJZHhSZXN0VXNkbgMJAABmAAAAAgUAAAAIcmVzdFVzZG4AAAAAAAAAAAAJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAQbmV1dHJpbm9Db250cmFjdAkAAGUAAAACBQAAAANhbXQFAAAACHJlc3RVc2RuBQAAAA9uZXV0cmlub0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAhyZXN0VXNkbgUAAAAPbmV1dHJpbm9Bc3NldElkBQAAAANuaWwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAQbmV1dHJpbm9Db250cmFjdAkAAGUAAAACBQAAAANhbXQFAAAACHJlc3RVc2RuBQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAA25pbAQAAAALc3VyZkFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTgpAAAAAQUAAAAOU3VyZkFzc2V0SWRLZXkJAAROAAAAAgUAAAAIdHJhbnNmZXIJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAtzdXJmQXNzZXRJZAUAAAAKc3VyZkFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApzdXJmQW1vdW50BQAAAAtzdXJmQXNzZXRJZAkABEwAAAACCQEAAAAIc3VyZkRhdGEAAAABBQAAAApzdXJmUmVzdWx0BQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABNwdWJLZXlBZG1pbnNMaXN0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAsRXh0RUVLMTlubUtqOW1DcG5XeXZFRUpGWUFUTE1jVkVNdm9oaFVIa3lITm0JAARMAAAAAgIAAAAsRXY1cHk1RmZCUVg5Y1pwWUtuZlFyVEI0OUJ5ZjhRbXBaV2VEVlJpbTR5VjcJAARMAAAAAgIAAAAsRFV1dUxqWHU5OG5Cd1pjN2Zxd0NUanRBM25uUndnVGJrTVNyNVNVMk5tRFIJAARMAAAAAgIAAAAsNVdSWEZTandjVGJOZktjSnM4WnFYbVNTV1lzU1ZKVXRNdk1xWmo1aEg0TmMFAAAAA25pbAUAAAADU0VQBAAAABBwdWJLZXlBZG1pbnNMaXN0CQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAPY29udHJvbENvbnRyYWN0AgAAAAwlc19fbXVsdGlzaWcFAAAAE3B1YktleUFkbWluc0xpc3RTdHIFAAAAA1NFUAQAAAAFY291bnQJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAwkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAMAAAAAAAAAAAIAAAAAAAAAAAAJAABnAAAAAgUAAAAFY291bnQAAAAAAAAAAAPUb1Yp", "chainId": 84, "height": 2130636, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bp1n5bin2Tv2iA1xf6yFEF6fQdQwaDNyZ86VwA24DyMR Next: HVZUfbhWUgdgDGZCpNz5ARKHKaUJB3GtFpcG8k1HgQc9 Diff:
OldNewDifferences
341341
342342
343343 @Callable(i)
344-func buySurf (noLessAmount,autoStake) = if ((size(i.payments) != 1))
344+func buySurf (averagePriceWanted,maxTolerancePerc,autoStake) = if ((size(i.payments) != 1))
345345 then throw("exactly 1 payment must be attached")
346346 else {
347347 let pmt = i.payments[0]
362362 else {
363363 let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amt, pmtAssetId], nil))
364364 let surfAmount = asInt(surfResult[bFuncIdxSurf])
365- if ((noLessAmount > surfAmount))
366- then throw(((("Requested no less than " + toString(noLessAmount)) + " SURF, but can buy only ") + toString(surfAmount)))
365+ let spendWanted = fraction(averagePriceWanted, surfAmount, MULT8)
366+ let spentActual = if ((pmtAssetId == WAVESID))
367+ then asInt(surfResult[bFuncIdxWaves])
368+ else asInt(surfResult[bFuncIdxUsdn])
369+ let impactPerc = fraction((spentActual - spendWanted), MULT6, spendWanted)
370+ if ((impactPerc > maxTolerancePerc))
371+ then throw(((("Tolerance " + toString(maxTolerancePerc)) + " exceeded: ") + toString(impactPerc)))
367372 else {
368373 let transfer = if ((pmtAssetId == WAVESID))
369374 then {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
55
66
77 func getStringByKey (key) = valueOrElse(getString(this, key), "")
88
99
1010 func getBoolByAddressAndKey (address,key) = valueOrElse(getBoolean(address, key), false)
1111
1212
1313 func getStringByAddressAndKey (address,key) = valueOrElse(getString(address, key), "")
1414
1515
1616 func getNumberByAddressAndKey (address,key) = valueOrElse(getInteger(address, key), 0)
1717
1818
1919 func asAnyList (val) = match val {
2020 case valAnyLyst: List[Any] =>
2121 valAnyLyst
2222 case _ =>
2323 throw("fail to cast into List[Any]")
2424 }
2525
2626
2727 func asString (val) = match val {
2828 case valStr: String =>
2929 valStr
3030 case _ =>
3131 throw("fail to cast into String")
3232 }
3333
3434
3535 func asInt (val) = match val {
3636 case valInt: Int =>
3737 valInt
3838 case _ =>
3939 throw("fail to cast into Int")
4040 }
4141
4242
4343 let SEP = "__"
4444
4545 let MULT6 = 1000000
4646
4747 let MULT8 = 100000000
4848
4949 let MULTX16 = toBigInt(10000000000000000)
5050
5151 let CANCELED = "canceled"
5252
5353 let NEW = "new"
5454
5555 let FILLED = "filled"
5656
5757 let WAVESID = fromBase58String("WAVES")
5858
5959 let nMetricIdxPrice = 0
6060
6161 let nMetricIdxUsdnLockedBalance = 1
6262
6363 let nMetricIdxWavesLockedBalance = 2
6464
6565 let nMetricIdxReserve = 3
6666
6767 let nMetricIdxReserveInUsdn = 4
6868
6969 let nMetricIdxUsdnSupply = 5
7070
7171 let nMetricIdxSurplus = 6
7272
7373 let nMetricIdxSurplusPercent = 7
7474
7575 let nMetricIdxBR = 8
7676
7777 let nMetricIdxNsbtSupply = 9
7878
7979 let nMetricIdxMaxNsbtSupply = 10
8080
8181 let nMetricIdxSurfSupply = 11
8282
8383 let bFuncIdxSurf = 0
8484
8585 let bFuncIdxWaves = 1
8686
8787 let bFuncIdxUsdn = 2
8888
8989 let bFuncIdxReserveStart = 3
9090
9191 let bFuncIdxSupplyStart = 4
9292
9393 let bFuncIdxBRStart = 5
9494
9595 let bFuncIdxReserveEnd = 6
9696
9797 let bFuncIdxSupplyEnd = 7
9898
9999 let bFuncIdxBREnd = 8
100100
101101 let bFuncIdxRestWaves = 9
102102
103103 let bFuncIdxRestUsdn = 10
104104
105105 let bFuncIdxWavesPrice = 11
106106
107107 let PriceKey = "price"
108108
109109 let NsbtAssetIdKey = "bond_asset_id"
110110
111111 let NeutrinoAssetIdKey = "neutrino_asset_id"
112112
113113 let SurfAssetIdKey = "surf_asset_id"
114114
115115 let BalanceLockedkKey = "balance_lock_"
116116
117117 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
118118
119119 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
120120
121121 let FirstOrderKey = "order_first"
122122
123123 let MathContractKey = "math_contract"
124124
125125 let MinWavesForNsbtBuyKey = "min_waves_nsbt_buy"
126126
127127 let MinNsbtSellKey = "min_nsbt_sell"
128128
129129 let MinWavesForSurfBuyKey = "min_waves_surf_buy"
130130
131131 let MinUsdnForSurfBuyKey = "min_usdn_surf_buy"
132132
133133 func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
134134
135135
136136 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
137137
138138
139139 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
140140
141141
142142 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
143143
144144
145145 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
146146
147147
148148 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
149149
150150
151151 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
152152
153153
154154 func getPrevOrderKey (orderId) = ("order_prev_" + orderId)
155155
156156
157157 func getNextOrderKey (orderId) = ("order_next_" + orderId)
158158
159159
160160 func convertNeutrinoToWaves (amount,price) = fraction(amount, MULT8, price)
161161
162162
163163 func convertWavesToNeutrino (amount,price) = fraction(amount, price, MULT8)
164164
165165
166166 func toX16 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULTX16, toBigInt(origScaleMult))
167167
168168
169169 func fromX16 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULTX16))
170170
171171
172172 let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj')
173173
174174 let controlContract = Address(base58'3MrwvfA9VRYwhHy4NuWPQGdxCtZdhH4LMMa')
175175
176176 let liquidationContract = Address(base58'3N24ZPUAMhFm76N3vbNiiDtFqfUnmBHTc5N')
177177
178178 let mathContract = addressFromStringValue(getStringByKey(MathContractKey))
179179
180180 let neutrinoAssetId = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
181181
182182 let nsbtAssetId = base58'F3iaxzruFeKujfVfYSZEkejpjh67wmRfPCRHiNmWKp3Z'
183183
184184 let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
185185
186186 let minWavesAmountNsbtBuy = valueOrElse(getInteger(this, MinWavesForNsbtBuyKey), 1000000000)
187187
188188 let minNsbtSell = valueOrElse(getInteger(this, MinNsbtSellKey), 1000000)
189189
190190 let minWavesAmountSurfBuy = valueOrElse(getInteger(this, MinWavesForSurfBuyKey), 100000000)
191191
192192 let minUsdnAmountSurfBuy = valueOrElse(getInteger(this, MinUsdnForSurfBuyKey), 10000000)
193193
194194 let firstOrder = getStringByKey(FirstOrderKey)
195195
196196 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
197197
198198
199199 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
200200
201201
202202 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
203203
204204
205205 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
206206
207207
208208 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
209209
210210
211211 func getPrevOrder (id) = getStringByKey(getPrevOrderKey(id))
212212
213213
214214 func getNextOrder (id) = getStringByKey(getNextOrderKey(id))
215215
216216
217217 func getReversePrice (price) = ((MULT6 * MULT6) / price)
218218
219219
220220 func calcNsbt2WavesPriceRaw (spentWavesRaw,receivedNsbtRaw) = fraction(toBigInt(spentWavesRaw), toBigInt((MULT6 * MULT6)), toBigInt(receivedNsbtRaw))
221221
222222
223223 func orderData (orderId,totalWavelets,filledWavelets,owner,status,roi,price,currentPrice) = [StringEntry(getOrderPriceKey(orderId), toString(price)), IntegerEntry(getOrderTotalKey(orderId), totalWavelets), IntegerEntry(getOrderFilledTotalKey(orderId), filledWavelets), StringEntry(getOrderOwnerKey(orderId), owner), IntegerEntry(getOrderHeightKey(orderId), height), StringEntry(getOrderStatusKey(orderId), status), IntegerEntry(("debug_order_currentPrice_" + orderId), currentPrice), IntegerEntry(getRoiByOrderIdKey(orderId), roi)]
224224
225225
226226 func toStr (name,curveResult) = (((((((((((((((((((((((((((((((((((name + "[nsbtAmountRaw=") + toString(asInt(curveResult[0]))) + " usdnPayment=") + toString(asInt(curveResult[1]))) + " wRaw=") + toString(asInt(curveResult[2]))) + " uRaw=") + toString(asInt(curveResult[3]))) + " mRaw=") + toString(asInt(curveResult[4]))) + " sRaw=") + toString(asInt(curveResult[5]))) + " nsbtCurveParam_a=") + toString(asInt(curveResult[6]))) + " nsbtCurveParam_b=") + toString(asInt(curveResult[7]))) + " wReservesInUsdn=") + toString(asInt(curveResult[8]))) + " price=") + toString(asInt(curveResult[9]))) + " multBR=") + toString(asInt(curveResult[10]))) + " multPower=") + toString(asInt(curveResult[11]))) + " multExpInPower=") + asString(curveResult[12])) + " multK=") + asString(curveResult[13])) + " step1=") + asString(curveResult[14])) + " step2=") + asString(curveResult[15])) + " step3=") + toString(asInt(curveResult[16]))) + "]")
227227
228228
229229 func surfData (surfResult) = StringEntry("debug_surfResult", makeString(["%d%d%d%d%d%d%d%d%d%d%d", toString(asInt(surfResult[bFuncIdxSurf])), toString(asInt(surfResult[bFuncIdxWaves])), toString(asInt(surfResult[bFuncIdxUsdn])), toString(asInt(surfResult[bFuncIdxReserveStart])), toString(asInt(surfResult[bFuncIdxSupplyStart])), toString(asInt(surfResult[bFuncIdxBRStart])), toString(asInt(surfResult[bFuncIdxReserveEnd])), toString(asInt(surfResult[bFuncIdxSupplyEnd])), toString(asInt(surfResult[bFuncIdxBREnd])), toString(asInt(surfResult[bFuncIdxRestWaves])), toString(asInt(surfResult[bFuncIdxRestUsdn]))], SEP))
230230
231231
232232 @Callable(i)
233233 func constructor (mathContractAddress,minWavesForNsbtBuy,minNsbtSell) = if ((i.caller != this))
234234 then throw("Permission denied")
235235 else [StringEntry(MathContractKey, mathContractAddress), IntegerEntry(MinNsbtSellKey, minNsbtSell), IntegerEntry(MinWavesForNsbtBuyKey, minWavesForNsbtBuy)]
236236
237237
238238
239239 @Callable(i)
240240 func constructorV2 (minWavesForSurfBuyKey,minUsdnForSurfBuyKey) = if ((i.caller != this))
241241 then throw("Permission denied")
242242 else {
243243 let issue = Issue("SURF", "Smart Utility Recapitalization Feature token", 0, 6, true, unit, 0)
244244 let assetId = calculateAssetId(issue)
245245 [issue, StringEntry(SurfAssetIdKey, toBase58String(assetId)), IntegerEntry(MinWavesForSurfBuyKey, minWavesForSurfBuyKey), IntegerEntry(MinUsdnForSurfBuyKey, minUsdnForSurfBuyKey)]
246246 }
247247
248248
249249
250250 @Callable(i)
251251 func buyNsbt () = {
252252 let pmt = value(i.payments[0])
253253 let pmtAmount = pmt.amount
254254 let wavesPay = pmtAmount
255255 if (isBlocked)
256256 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
257257 else if (isDefined(pmt.assetId))
258258 then throw("can use waves only")
259259 else if ((minWavesAmountNsbtBuy > pmtAmount))
260260 then throw((("min " + toString((minWavesAmountNsbtBuy / MULT8))) + " waves expected"))
261261 else {
262262 let ownerAddress = i.caller
263263 let neutrinoMetrics = asAnyList(invoke(mathContract, "calcNeutinoMetricsREADONLY", nil, nil))
264264 let currentPrice = asInt(neutrinoMetrics[0])
265265 let curveResult = asAnyList(invoke(mathContract, "curveFunctionREADONLY", [wavesPay], nil))
266266 let nsbtAmount = asInt(curveResult[0])
267267 if ((0 >= nsbtAmount))
268268 then throw("nsbtAmount <= 0")
269269 else {
270270 let nsbt2WavesPriceRaw = calcNsbt2WavesPriceRaw(wavesPay, nsbtAmount)
271271 let roi = 0
272272 let amountLeased = invoke(neutrinoContract, "acceptWaves", nil, i.payments)
273273 if ((amountLeased == amountLeased))
274274 then $Tuple2((orderData(toBase58String(i.transactionId), pmtAmount, pmtAmount, toString(ownerAddress), FILLED, roi, nsbt2WavesPriceRaw, currentPrice) ++ [ScriptTransfer(ownerAddress, nsbtAmount, nsbtAssetId), StringEntry("debug_curveResult", toStr("curveResult", curveResult))]), nsbtAmount)
275275 else throw("Strict value is not equal to itself.")
276276 }
277277 }
278278 }
279279
280280
281281
282282 @Callable(i)
283283 func sellNsbt () = if (isBlocked)
284284 then throw("contract is blocked by EMERGENCY SHUTDOWN actions until reactivation by emergency oracles")
285285 else {
286286 let pmt = value(i.payments[0])
287287 let pmtAmount = pmt.amount
288288 if ((pmt.assetId != nsbtAssetId))
289289 then throw("can use NSBT only")
290290 else if ((minNsbtSell > pmtAmount))
291291 then throw((("min " + toString((minNsbtSell / MULT6))) + " nsbt expected"))
292292 else {
293293 let newPrice = asInt(asAnyList(invoke(mathContract, "calcContractNsbtPriceSYSREADONLY", [-(pmtAmount)], nil))[0])
294294 if ((MULT6 > newPrice))
295295 then throw((("resulting nsbt price would be < 1 (" + toString(newPrice)) + " usdn)"))
296296 else {
297297 let transf = invoke(neutrinoContract, "transferUsdnToUser", [pmtAmount, toString(i.caller)], nil)
298298 if ((transf == transf))
299299 then $Tuple2(nil, newPrice)
300300 else throw("Strict value is not equal to itself.")
301301 }
302302 }
303303 }
304304
305305
306306
307307 @Callable(i)
308308 func cancelOrder (orderId) = {
309309 let owner = getOrderOwner(orderId)
310310 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
311311 let caller = toString(i.caller)
312312 let nextOrder = getNextOrder(orderId)
313313 let prevOrder = getPrevOrder(orderId)
314314 if ((getOrderStatus(orderId) != NEW))
315315 then throw("invalid order status")
316316 else [StringEntry(FirstOrderKey, if ((firstOrder == orderId))
317317 then nextOrder
318318 else firstOrder), StringEntry(getNextOrderKey(prevOrder), nextOrder), StringEntry(getPrevOrderKey(nextOrder), prevOrder), StringEntry(getOrderStatusKey(orderId), CANCELED), ScriptTransfer(i.caller, amount, unit)]
319319 }
320320
321321
322322
323323 @Callable(i)
324324 func minWavesAmountNsbtBuySYSREADONLY () = $Tuple2(nil, minWavesAmountNsbtBuy)
325325
326326
327327
328328 @Callable(i)
329329 func minNsbtAmountForSellSYSREADONLY () = $Tuple2(nil, minNsbtSell)
330330
331331
332332
333333 @Callable(i)
334334 func minWavesAmountSurfBuySYSREADONLY () = $Tuple2(nil, minWavesAmountSurfBuy)
335335
336336
337337
338338 @Callable(i)
339339 func minUsdnAmountSurfBuySYSREADONLY () = $Tuple2(nil, minUsdnAmountSurfBuy)
340340
341341
342342
343343 @Callable(i)
344-func buySurf (noLessAmount,autoStake) = if ((size(i.payments) != 1))
344+func buySurf (averagePriceWanted,maxTolerancePerc,autoStake) = if ((size(i.payments) != 1))
345345 then throw("exactly 1 payment must be attached")
346346 else {
347347 let pmt = i.payments[0]
348348 let amt = pmt.amount
349349 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
350350 if (if ((pmtAssetId != neutrinoAssetId))
351351 then (pmtAssetId != WAVESID)
352352 else false)
353353 then throw("Unsupported payment asset")
354354 else if (if ((pmtAssetId == neutrinoAssetId))
355355 then (minUsdnAmountSurfBuy > amt)
356356 else false)
357357 then throw((("min " + toString((minUsdnAmountSurfBuy / MULT6))) + " USDN expected"))
358358 else if (if ((pmtAssetId == WAVESID))
359359 then (minWavesAmountSurfBuy > amt)
360360 else false)
361361 then throw((("min " + toString((minWavesAmountSurfBuy / MULT8))) + " WAVES expected"))
362362 else {
363363 let surfResult = asAnyList(invoke(mathContract, "surfFunctionREADONLY", [amt, pmtAssetId], nil))
364364 let surfAmount = asInt(surfResult[bFuncIdxSurf])
365- if ((noLessAmount > surfAmount))
366- then throw(((("Requested no less than " + toString(noLessAmount)) + " SURF, but can buy only ") + toString(surfAmount)))
365+ let spendWanted = fraction(averagePriceWanted, surfAmount, MULT8)
366+ let spentActual = if ((pmtAssetId == WAVESID))
367+ then asInt(surfResult[bFuncIdxWaves])
368+ else asInt(surfResult[bFuncIdxUsdn])
369+ let impactPerc = fraction((spentActual - spendWanted), MULT6, spendWanted)
370+ if ((impactPerc > maxTolerancePerc))
371+ then throw(((("Tolerance " + toString(maxTolerancePerc)) + " exceeded: ") + toString(impactPerc)))
367372 else {
368373 let transfer = if ((pmtAssetId == WAVESID))
369374 then {
370375 let restWaves = asInt(surfResult[bFuncIdxRestWaves])
371376 let wavesAmt = invoke(neutrinoContract, "acceptWaves", nil, [AttachedPayment(unit, (amt - restWaves))])
372377 if ((wavesAmt == wavesAmt))
373378 then if ((restWaves > 0))
374379 then [ScriptTransfer(i.caller, restWaves, unit)]
375380 else nil
376381 else throw("Strict value is not equal to itself.")
377382 }
378383 else {
379384 let restUsdn = asInt(surfResult[bFuncIdxRestUsdn])
380385 if ((restUsdn > 0))
381386 then [ScriptTransfer(neutrinoContract, (amt - restUsdn), neutrinoAssetId), ScriptTransfer(i.caller, restUsdn, neutrinoAssetId)]
382387 else [ScriptTransfer(neutrinoContract, (amt - restUsdn), neutrinoAssetId)]
383388 }
384389 let surfAssetId = fromBase58String(getStringValue(SurfAssetIdKey))
385390 (transfer ++ [Reissue(surfAssetId, surfAmount, true), ScriptTransfer(i.caller, surfAmount, surfAssetId), surfData(surfResult)])
386391 }
387392 }
388393 }
389394
390395
391396 @Verifier(tx)
392397 func verify () = {
393398 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
394399 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
395400 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
396401 then 1
397402 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
398403 then 1
399404 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
400405 then 1
401406 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
402407 then 2
403408 else 0))
404409 (count >= 3)
405410 }
406411

github/deemru/w8io/6500d08 
69.06 ms