tx · MzDi5999xzkVALWbbdhnWiVSmPaKbLPfPaPjpp7RUrv 3P4AdC9J6MzTEi2LL9xgQN8EimMnbk4d6Nt: -0.01100000 Waves 2024.03.15 09:50 [4084625] smart account 3P4AdC9J6MzTEi2LL9xgQN8EimMnbk4d6Nt > SELF 0.00000000 Waves
{ "type": 13, "id": "MzDi5999xzkVALWbbdhnWiVSmPaKbLPfPaPjpp7RUrv", "fee": 1100000, "feeAssetId": null, "timestamp": 1710485421257, "version": 2, "chainId": 87, "sender": "3P4AdC9J6MzTEi2LL9xgQN8EimMnbk4d6Nt", "senderPublicKey": "33BMe2b9KpjJyCQXAKa3DKHqSBjB7q2mEJoiP17cRLAN", "proofs": [ "4NgjLZyq8NpDJo27PuF5d4ezfzCMSdGMXxCVmiXxwjwKGGLSrwwwBP6KtThABgiANfZm7kTS6KYB2iFFb3RzKQiV" ], "script": "base64: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dXQJAQV2YWx1ZQEJAM8IAgUIYXNzZXRJZHMFCGFzc2V0T3V0AwkAAAIFB0luZGV4SW4FCEluZGV4T3V0BQhBbW91bnRJbgkAbgQFCkJhbGFuY2VPdXQJAGUCCQBoAgUGU2NhbGU4BQZTY2FsZTgJAKADAQkAdgYJAL0CBAkAtgIBBQlCYWxhbmNlSW4JALYCAQkAaAIFBlNjYWxlOAUGU2NhbGU4CQC2AgEJAGQCBQlCYWxhbmNlSW4FCEFtb3VudEluBQZIQUxGVVAAEAkAtgIBCQBrAwkAkQMCBQ1Bc3NldHNXZWlnaHRzBQdJbmRleEluAJBOCQCRAwIFDUFzc2V0c1dlaWdodHMFCEluZGV4T3V0AAQAEAUHQ0VJTElORwkAaAIFBlNjYWxlOAUGU2NhbGU4BQRET1dOAAt3YXZlc0luU3dvcAkAawMJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwIPQV9hc3NldF9iYWxhbmNlCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wTFAJAKwCAgkArAICAiQzUEhhTmdvbUJrcnZFTDJRbnVKYXJRVkphNzF3anc5cWlxR18JAKUIAQUEdGhpcwIUX3NoYXJlX3Rva2Vuc19sb2NrZWQJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwISc2hhcmVfYXNzZXRfc3VwcGx5AAl4dG5JblN3b3AJAGsDCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wU0MCD0JfYXNzZXRfYmFsYW5jZQkBDnRyeUdldEludGVnZXIyAgUGc3dvcExQCQCsAgIJAKwCAgIkM1BIYU5nb21Ca3J2RUwyUW51SmFyUVZKYTcxd2p3OXFpcUdfCQClCAEFBHRoaXMCFF9zaGFyZV90b2tlbnNfbG9ja2VkCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wU0MCEnNoYXJlX2Fzc2V0X3N1cHBseQEPZ2V0VG9rZW5CYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAXQFByRtYXRjaDAJAGQCCQDwBwIFBHRoaXMFAXQDCQAAAgUHYXNzZXRJZAUDeHRuBQl4dG5JblN3b3AAAAkAZAIICQDvBwEFBHRoaXMHcmVndWxhcgULd2F2ZXNJblN3b3ABA3N1bQIFYWNjdW0BbgkAZAIFBWFjY3VtCQENcGFyc2VJbnRWYWx1ZQEFAW4BCmlzU2h1dGRvd24ABAckbWF0Y2gwCQCbCAIFBHRoaXMCC2lzX3NodXRkb3duAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXgFByRtYXRjaDAFAXgHCAFpAQhzaHV0ZG93bgEIc2h1dGRvd24DCQAAAggFAWkGY2FsbGVyBQR0aGlzCQDMCAIJAQxCb29sZWFuRW50cnkCAgtpc19zaHV0ZG93bgUIc2h1dGRvd24FA25pbAkAAgECCmFkbWluIG9ubHkBaQEFc2V0dXADC2Fzc2V0SWRzU3RyD2Fzc2V0V2VpZ2h0c1N0cgNmZWUDCQEKaXNTaHV0ZG93bgAJAAIBAhNjb250cmFjdCBpcyBvbiBzdG9wAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIKYWRtaW4gb25seQMDCQBmAgUDZmVlAPQDBgkAZgIAAQUDZmVlCQACAQItZmVlIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MDAgKDAuMDEtNSUpBAJzYgkA/AcEBQR0aGlzAgxzdGFydEJhbGFuY2UFA25pbAUDbmlsAwkAAAIFAnNiBQJzYgQNYXNzZXRJZHNTdHJMaQkAtQkCBQthc3NldElkc1N0cgIBLAQKYXNzZXRJZHNMaQoAAiRsBQ1hc3NldElkc1N0ckxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRBc3NldEJ5dGVzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBBFhc3NldFdlaWdodHNTdHJMaQkAtQkCBQ9hc3NldFdlaWdodHNTdHICASwED2Fzc2V0V2VpZ2h0c1N1bQoAAiRsBRFhc3NldFdlaWdodHNTdHJMaQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmNV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDc3VtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY1XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmNV8yAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgkBBSRmNV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCgETYWRkVG9rZW5EYXRhRW50cmllcwIFYWNjdW0IYXNzZXROdW0DCQBnAgUIYXNzZXROdW0JAJADAQUKYXNzZXRJZHNMaQUFYWNjdW0EDWFzc2V0RGVjaW1hbHMEByRtYXRjaDAJAJEDAgUKYXNzZXRJZHNMaQUIYXNzZXROdW0DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBeAUHJG1hdGNoMAgJAQV2YWx1ZQEJAOwHAQUBeAhkZWNpbWFscwAICQDOCAIFBWFjY3VtCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHc3RhdGljXwkAkQMCBQ1hc3NldElkc1N0ckxpBQhhc3NldE51bQIGX3NjYWxlCQBsBgAKAAAFDWFzc2V0RGVjaW1hbHMAAAAABQRET1dOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHc3RhdGljXwkAkQMCBQ1hc3NldElkc1N0ckxpBQhhc3NldE51bQIJX2RlY2ltYWxzBQ1hc3NldERlY2ltYWxzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHc3RhdGljXwkAkQMCBQ1hc3NldElkc1N0ckxpBQhhc3NldE51bQIHX3dlaWdodAkBBXZhbHVlAQkAtgkBCQCRAwIFEWFzc2V0V2VpZ2h0c1N0ckxpBQhhc3NldE51bQkAzAgCCQEMQm9vbGVhbkVudHJ5AgILaXNfc2h1dGRvd24GBQNuaWwDCQECIT0CBQ9hc3NldFdlaWdodHNTdW0AkE4JAAIBAitzdW0gb2YgdG9rZW4gd2VpZ2h0cyBtdXN0IGJlIGVxdWFsIHRvIDEwMDAwCQDOCAIKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmNl8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkVG9rZW5EYXRhRW50cmllcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNl8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjZfMgIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIJAQUkZjZfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAzAgCCQELU3RyaW5nRW50cnkCAg9zdGF0aWNfdG9rZW5JZHMFC2Fzc2V0SWRzU3RyCQDMCAIJAQtTdHJpbmdFbnRyeQICE3N0YXRpY190b2tlbldlaWdodHMFD2Fzc2V0V2VpZ2h0c1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgITc3RhdGljX3Rva2Vuc0Ftb3VudAkAkAMBBQphc3NldElkc0xpCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgpzdGF0aWNfZmVlBQNmZWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQRzd2FwAghhc3NldE91dAdtaW5pbXVtAwMJAAACCQEKaXNTaHV0ZG93bgAGCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVeOHeZRyjgjzsORw8RWi9WD02+IVv823QsHCQACAQIUY29udHJhY3QgaXMgc2h1dGRvd24EA3BtdAMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECIXBsZWFzZSBhdHRhY2ggZXhhY3RseSBvbmUgcGF5bWVudAQIQW1vdW50SW4JAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAdBc3NldEluCAUDcG10B2Fzc2V0SWQECEFzc2V0T3V0CQENZ2V0QXNzZXRCeXRlcwEFCGFzc2V0T3V0BA5Bc3NldEluQmFsYW5jZQkBD2dldFRva2VuQmFsYW5jZQEFB0Fzc2V0SW4ED0Fzc2V0T3V0QmFsYW5jZQkBD2dldFRva2VuQmFsYW5jZQEFCEFzc2V0T3V0BAtmZWVBbW91bnRJbgkAawMFCEFtb3VudEluBQNGZWUFCEZlZVNjYWxlBA1jbGVhbkFtb3VudEluCQBlAgUIQW1vdW50SW4FC2ZlZUFtb3VudEluBAlBbW91bnRPdXQJARJjYWxjdWxhdGVPdXRBbW91bnQFBQ1jbGVhbkFtb3VudEluBQdBc3NldEluBQhBc3NldE91dAUOQXNzZXRJbkJhbGFuY2UFD0Fzc2V0T3V0QmFsYW5jZQQYc2hhcmVBbW91bnRXaXRoZHJhd1dhdmVzAwkAZgIAAAkAZQIFCUFtb3VudE91dAgJAO8HAQUEdGhpcwdyZWd1bGFyAAAJAG4ECQBlAgUJQW1vdW50T3V0CAkA7wcBBQR0aGlzB3JlZ3VsYXIAAQkAawMJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwIPQV9hc3NldF9iYWxhbmNlAAEJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwISc2hhcmVfYXNzZXRfc3VwcGx5BQdDRUlMSU5HBAN1d3MDAwkAAAIFCEFzc2V0T3V0BQR1bml0CQBmAgUYc2hhcmVBbW91bnRXaXRoZHJhd1dhdmVzAAAHCQD8BwQFBnN3b3BTQwIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBRhzaGFyZUFtb3VudFdpdGhkcmF3V2F2ZXMFA25pbAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUDdXdzBQN1d3MEFnNoYXJlQW1vdW50V2l0aGRyYXdYdG4DCQBmAgAACQBlAgUJQW1vdW50T3V0CQDwBwIFBHRoaXMFA3h0bgAACQBuBAkAZQIFCUFtb3VudE91dAkA8AcCBQR0aGlzBQN4dG4AAQkAawMJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwIPQl9hc3NldF9iYWxhbmNlAAEJAQ50cnlHZXRJbnRlZ2VyMgIFBnN3b3BTQwISc2hhcmVfYXNzZXRfc3VwcGx5BQdDRUlMSU5HBAN1eHMDAwkAAAIFCEFzc2V0T3V0BQN4dG4JAGYCBRZzaGFyZUFtb3VudFdpdGhkcmF3WHRuAAAHCQD8BwQFBnN3b3BTQwIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBRZzaGFyZUFtb3VudFdpdGhkcmF3WHRuBQNuaWwFA25pbAUDbmlsBQR1bml0AwkAAAIFA3V4cwUDdXhzAwkAZgIFB21pbmltdW0FCUFtb3VudE91dAkAAgECJ2Ftb3VudCB0byByZWNlaXZlIGlzIGxvd2VyIHRoYW4gbWluaW11bQMJAAACBQhBc3NldE91dAUHQXNzZXRJbgkAAgECGHRoaXMgc3dhcCBpcyBub3QgYWxsb3dlZAMJAGYCAAAJAGUCBQ9Bc3NldE91dEJhbGFuY2UFCUFtb3VudE91dAkAAgECE3N3YXAgc21hbGxlciBhbW91bnQEBGludnQJAPwHBAUEdGhpcwILdHJhbnNmZXJPdXQJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUJQW1vdW50T3V0CQDMCAIFCEFzc2V0T3V0BQNuaWwFA25pbAMJAAACBQRpbnZ0BQRpbnZ0BARzd3hzAwMDCQBmAgkA8AcCBQR0aGlzBQN4dG4AAAkAZgIICQDvBwEFBHRoaXMJYXZhaWxhYmxlAAAHCQAAAgkAZAIFGHNoYXJlQW1vdW50V2l0aGRyYXdXYXZlcwUWc2hhcmVBbW91bnRXaXRoZHJhd1h0bgAABwkA/AcEBQZzd29wU0MCDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIEdHJ1ZQkAzAgCAgEwBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFA3h0bgkA8AcCBQR0aGlzBQN4dG4FA25pbAUEdW5pdAMJAAACBQRzd3hzBQRzd3hzBANpbnYJAPwHBAUHcHJvamVjdAIIc2VsZWN0b3IFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELdHJhbnNmZXJPdXQDB2FkZHJlc3MJQW1vdW50T3V0CEFzc2V0T3V0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB2FkZHJlc3MFCUFtb3VudE91dAUIQXNzZXRPdXQFA25pbAFpAQxzdGFydEJhbGFuY2UAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIcYWNjZXNzIG9ubHkgYnkgcHJvamVjdCBvd25lcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa2V5V2F2ZXNTCQEPZ2V0VG9rZW5CYWxhbmNlAQUEdW5pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHa2V5WHRuUwkBD2dldFRva2VuQmFsYW5jZQEFA3h0bgUDbmlsAWkBFGN1cnJlbnRCYWxhbmNlUHJvZml0AAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHGFjY2VzcyBvbmx5IGJ5IHByb2plY3Qgb3duZXIJAMwIAgkBDEludGVnZXJFbnRyeQICFVdBVkVTIGN1cnJlbnQgYmFsYW5jZQkBD2dldFRva2VuQmFsYW5jZQEFBHVuaXQJAMwIAgkBDEludGVnZXJFbnRyeQICE1hUTiBjdXJyZW50IGJhbGFuY2UJAQ9nZXRUb2tlbkJhbGFuY2UBBQN4dG4JAMwIAgkBDEludGVnZXJFbnRyeQICDFdBVkVTIHByb2ZpdAkAZQIJAQ9nZXRUb2tlbkJhbGFuY2UBBQR1bml0CQENdHJ5R2V0SW50ZWdlcgEFCWtleVdhdmVzUwkAzAgCCQEMSW50ZWdlckVudHJ5AgIKWFROIHByb2ZpdAkAZQIJAQ9nZXRUb2tlbkJhbGFuY2UBBQN4dG4JAQ10cnlHZXRJbnRlZ2VyAQUHa2V5WHRuUwUDbmlsAWkBCHJlYWRTd2FwBAhhc3NldE91dAdtaW5pbXVtB2Fzc2V0SW4IYW1vdW50SW4DAwkAAAIJAQppc1NodXRkb3duAAYJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBARoBV44d5lHKOCPOw5HDxFaL1YPTb4hW/zbdCwcJAAIBAhRjb250cmFjdCBpcyBzaHV0ZG93bgQHQXNzZXRJbgkBDWdldEFzc2V0Qnl0ZXMBBQdhc3NldEluBAhBc3NldE91dAkBDWdldEFzc2V0Qnl0ZXMBBQhhc3NldE91dAQOQXNzZXRJbkJhbGFuY2UJAQ9nZXRUb2tlbkJhbGFuY2UBBQdBc3NldEluBA9Bc3NldE91dEJhbGFuY2UJAQ9nZXRUb2tlbkJhbGFuY2UBBQhBc3NldE91dAQLZmVlQW1vdW50SW4JAGsDBQhhbW91bnRJbgUDRmVlBQhGZWVTY2FsZQQNY2xlYW5BbW91bnRJbgkAZQIFCGFtb3VudEluBQtmZWVBbW91bnRJbgQJQW1vdW50T3V0CQESY2FsY3VsYXRlT3V0QW1vdW50BQUNY2xlYW5BbW91bnRJbgUHQXNzZXRJbgUIQXNzZXRPdXQFDkFzc2V0SW5CYWxhbmNlBQ9Bc3NldE91dEJhbGFuY2UEGHNoYXJlQW1vdW50V2l0aGRyYXdXYXZlcwMJAGYCAAAJAGUCBQlBbW91bnRPdXQICQDvBwEFBHRoaXMHcmVndWxhcgAACQBuBAkAZQIFCUFtb3VudE91dAgJAO8HAQUEdGhpcwdyZWd1bGFyAAEJAGsDCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wU0MCD0FfYXNzZXRfYmFsYW5jZQABCQEOdHJ5R2V0SW50ZWdlcjICBQZzd29wU0MCEnNoYXJlX2Fzc2V0X3N1cHBseQUHQ0VJTElORwQWc2hhcmVBbW91bnRXaXRoZHJhd1h0bgMJAGYCAAAJAGUCBQlBbW91bnRPdXQJAPAHAgUEdGhpcwUDeHRuAAAJAG4ECQBlAgUJQW1vdW50T3V0CQDwBwIFBHRoaXMFA3h0bgABCQBrAwkBDnRyeUdldEludGVnZXIyAgUGc3dvcFNDAg9CX2Fzc2V0X2JhbGFuY2UAAQkBDnRyeUdldEludGVnZXIyAgUGc3dvcFNDAhJzaGFyZV9hc3NldF9zdXBwbHkFB0NFSUxJTkcJAMwIAgkBDEludGVnZXJFbnRyeQICEGFzc2V0IGluIGJhbGFuY2UFDkFzc2V0SW5CYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhFhc3NldCBvdXQgYmFsYW5jZQUPQXNzZXRPdXRCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mZWUgYW1vdW50IGluBQtmZWVBbW91bnRJbgkAzAgCCQEMSW50ZWdlckVudHJ5AgIPY2xlYW4gYW1vdW50IGluBQ1jbGVhbkFtb3VudEluCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgphbW91bnQgb3V0BQlBbW91bnRPdXQJAMwIAgkBDEludGVnZXJFbnRyeQICG3NoYXJlIGFtb3VudCB3aXRoZHJhdyB3YXZlcwUYc2hhcmVBbW91bnRXaXRoZHJhd1dhdmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhlzaGFyZSBhbW91bnQgd2l0aGRyYXcgeHRuBRZzaGFyZUFtb3VudFdpdGhkcmF3WHRuCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg13YXZlcyBpbiBzd29wBQt3YXZlc0luU3dvcAkAzAgCCQEMSW50ZWdlckVudHJ5AgILeHRuIGluIHN3b3AFCXh0bkluU3dvcAUDbmlsAWkBB2ludm9rZXIABARpbnYxCQD8BwQJAQdBZGRyZXNzAQEaAVdiez/9Emfien+2V1eDM+9RrnjLQ5J8O00CCHdpdGhkcmF3BQNuaWwFA25pbAMJAAACBQRpbnYxBQRpbnYxBARpbnYyAwkAZgIJAPAHAgkBB0FkZHJlc3MBARoBV2J7P/0SZ+J6f7ZXV4Mz71GueMtDknw7TQUHdnZ4dG5scAAyCQD8BwQJAQdBZGRyZXNzAQEaAVdgzsbyEfjWrsMVMLpYXP8XkcH50MCqY8cCCHdpdGhkcmF3BQNuaWwFA25pbAkA/AcECQEHQWRkcmVzcwEBGgFXYns//RJn4np/tldXgzPvUa54y0OSfDtNAg1pbXBvcnRWVlhUTkxQBQNuaWwFA25pbAMJAAACBQRpbnYyBQRpbnYyBARpbnYzCQD8BwQJAQdBZGRyZXNzAQEaAVfpZiEq0gbg3BaK6whal9SfnWKjf/fCWkwCCHdpdGhkcmF3BQNuaWwFA25pbAMJAAACBQRpbnYzBQRpbnYzBARpbnY0CQD8BwQJAQdBZGRyZXNzAQEaAVepCoCmfeUiMo5IaWo4+2VW7bIvnuaxss0CCHdpdGhkcmF3BQNuaWwFA25pbAMJAAACBQRpbnY0BQRpbnY0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ABPzyOg==", "height": 4084625, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: miBcbFZ9Uqp5DLnGoPQZkA5vBc8R63rf74xDtcQdaKo Next: 9LVybYtop5ysiP1k1DE895Ahc7G2VarZ3ndpgEbopM8n Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let d8 = 100000000 | |
5 | - | ||
6 | 4 | let xtn = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
7 | 5 | ||
8 | 6 | let vvxtnlp = base58'8KEtor9aSsSj38MknyAE7k1uRThHY9prAXgiE4D7WpyL' | |
260 | 258 | let invt = invoke(this, "transferOut", [toString(i.caller), AmountOut, AssetOut], nil) | |
261 | 259 | if ((invt == invt)) | |
262 | 260 | then { | |
263 | - | let swxs = if (if (if ((assetBalance(this, xtn) > | |
264 | - | then (wavesBalance(this).available > | |
261 | + | let swxs = if (if (if ((assetBalance(this, xtn) > 0)) | |
262 | + | then (wavesBalance(this).available > 0) | |
265 | 263 | else false) | |
266 | 264 | then ((shareAmountWithdrawWaves + shareAmountWithdrawXtn) == 0) | |
267 | 265 | else false) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let d8 = 100000000 | |
5 | - | ||
6 | 4 | let xtn = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
7 | 5 | ||
8 | 6 | let vvxtnlp = base58'8KEtor9aSsSj38MknyAE7k1uRThHY9prAXgiE4D7WpyL' | |
9 | 7 | ||
10 | 8 | let swopSC = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG') | |
11 | 9 | ||
12 | 10 | let swopLP = Address(base58'3P73HDkPqG15nLXevjCbmXtazHYTZbpPoPw') | |
13 | 11 | ||
14 | 12 | let project = Address(base58'3PCBL2vbjAVFbiCwmGsPmT6QdATutQnM8ov') | |
15 | 13 | ||
16 | 14 | let keyXtnS = "XTN starting balance" | |
17 | 15 | ||
18 | 16 | let keyWavesS = "WAVES starting balance" | |
19 | 17 | ||
20 | 18 | func tryGetInteger (key) = match getInteger(this, key) { | |
21 | 19 | case b: Int => | |
22 | 20 | b | |
23 | 21 | case _ => | |
24 | 22 | 0 | |
25 | 23 | } | |
26 | 24 | ||
27 | 25 | ||
28 | 26 | func tryGetInteger2 (address,key) = match getInteger(address, key) { | |
29 | 27 | case b: Int => | |
30 | 28 | b | |
31 | 29 | case _ => | |
32 | 30 | 0 | |
33 | 31 | } | |
34 | 32 | ||
35 | 33 | ||
36 | 34 | func tryGetString (key) = match getString(this, key) { | |
37 | 35 | case b: String => | |
38 | 36 | b | |
39 | 37 | case _ => | |
40 | 38 | "" | |
41 | 39 | } | |
42 | 40 | ||
43 | 41 | ||
44 | 42 | func getAssetString (assetId) = match assetId { | |
45 | 43 | case b: ByteVector => | |
46 | 44 | toBase58String(b) | |
47 | 45 | case _ => | |
48 | 46 | "WAVES" | |
49 | 47 | } | |
50 | 48 | ||
51 | 49 | ||
52 | 50 | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
53 | 51 | then unit | |
54 | 52 | else fromBase58String(assetIdStr) | |
55 | 53 | ||
56 | 54 | ||
57 | 55 | func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)]) | |
58 | 56 | ||
59 | 57 | ||
60 | 58 | func addAssetWeightToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_weight"))]) | |
61 | 59 | ||
62 | 60 | ||
63 | 61 | let assetIds = { | |
64 | 62 | let $l = split(tryGetString("static_tokenIds"), ",") | |
65 | 63 | let $s = size($l) | |
66 | 64 | let $acc0 = nil | |
67 | 65 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
68 | 66 | then $a | |
69 | 67 | else addAssetBytesToList($a, $l[$i]) | |
70 | 68 | ||
71 | 69 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
72 | 70 | then $a | |
73 | 71 | else throw("List size exceeds 10") | |
74 | 72 | ||
75 | 73 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
76 | 74 | } | |
77 | 75 | ||
78 | 76 | let AssetsWeights = { | |
79 | 77 | let $l = assetIds | |
80 | 78 | let $s = size($l) | |
81 | 79 | let $acc0 = nil | |
82 | 80 | func $f1_1 ($a,$i) = if (($i >= $s)) | |
83 | 81 | then $a | |
84 | 82 | else addAssetWeightToList($a, $l[$i]) | |
85 | 83 | ||
86 | 84 | func $f1_2 ($a,$i) = if (($i >= $s)) | |
87 | 85 | then $a | |
88 | 86 | else throw("List size exceeds 10") | |
89 | 87 | ||
90 | 88 | $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
91 | 89 | } | |
92 | 90 | ||
93 | 91 | let Fee = tryGetInteger("static_fee") | |
94 | 92 | ||
95 | 93 | let Scale8 = 100000000 | |
96 | 94 | ||
97 | 95 | let FeeScale = 10000 | |
98 | 96 | ||
99 | 97 | func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = { | |
100 | 98 | let IndexIn = value(indexOf(assetIds, assetIn)) | |
101 | 99 | let IndexOut = value(indexOf(assetIds, assetOut)) | |
102 | 100 | if ((IndexIn == IndexOut)) | |
103 | 101 | then AmountIn | |
104 | 102 | else fraction(BalanceOut, ((Scale8 * Scale8) - toInt(pow(fraction(toBigInt(BalanceIn), toBigInt((Scale8 * Scale8)), toBigInt((BalanceIn + AmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (Scale8 * Scale8), DOWN) | |
105 | 103 | } | |
106 | 104 | ||
107 | 105 | ||
108 | 106 | let wavesInSwop = fraction(tryGetInteger2(swopSC, "A_asset_balance"), tryGetInteger2(swopLP, (("3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG_" + toString(this)) + "_share_tokens_locked")), tryGetInteger2(swopSC, "share_asset_supply")) | |
109 | 107 | ||
110 | 108 | let xtnInSwop = fraction(tryGetInteger2(swopSC, "B_asset_balance"), tryGetInteger2(swopLP, (("3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG_" + toString(this)) + "_share_tokens_locked")), tryGetInteger2(swopSC, "share_asset_supply")) | |
111 | 109 | ||
112 | 110 | func getTokenBalance (assetId) = match assetId { | |
113 | 111 | case t: ByteVector => | |
114 | 112 | (assetBalance(this, t) + (if ((assetId == xtn)) | |
115 | 113 | then xtnInSwop | |
116 | 114 | else 0)) | |
117 | 115 | case _ => | |
118 | 116 | (wavesBalance(this).regular + wavesInSwop) | |
119 | 117 | } | |
120 | 118 | ||
121 | 119 | ||
122 | 120 | func sum (accum,n) = (accum + parseIntValue(n)) | |
123 | 121 | ||
124 | 122 | ||
125 | 123 | func isShutdown () = match getBoolean(this, "is_shutdown") { | |
126 | 124 | case x: Boolean => | |
127 | 125 | x | |
128 | 126 | case _ => | |
129 | 127 | false | |
130 | 128 | } | |
131 | 129 | ||
132 | 130 | ||
133 | 131 | @Callable(i) | |
134 | 132 | func shutdown (shutdown) = if ((i.caller == this)) | |
135 | 133 | then [BooleanEntry("is_shutdown", shutdown)] | |
136 | 134 | else throw("admin only") | |
137 | 135 | ||
138 | 136 | ||
139 | 137 | ||
140 | 138 | @Callable(i) | |
141 | 139 | func setup (assetIdsStr,assetWeightsStr,fee) = if (isShutdown()) | |
142 | 140 | then throw("contract is on stop") | |
143 | 141 | else if ((this != i.caller)) | |
144 | 142 | then throw("admin only") | |
145 | 143 | else if (if ((fee > 500)) | |
146 | 144 | then true | |
147 | 145 | else (1 > fee)) | |
148 | 146 | then throw("fee value must be between 1 and 500 (0.01-5%)") | |
149 | 147 | else { | |
150 | 148 | let sb = invoke(this, "startBalance", nil, nil) | |
151 | 149 | if ((sb == sb)) | |
152 | 150 | then { | |
153 | 151 | let assetIdsStrLi = split(assetIdsStr, ",") | |
154 | 152 | let assetIdsLi = { | |
155 | 153 | let $l = assetIdsStrLi | |
156 | 154 | let $s = size($l) | |
157 | 155 | let $acc0 = nil | |
158 | 156 | func $f4_1 ($a,$i) = if (($i >= $s)) | |
159 | 157 | then $a | |
160 | 158 | else addAssetBytesToList($a, $l[$i]) | |
161 | 159 | ||
162 | 160 | func $f4_2 ($a,$i) = if (($i >= $s)) | |
163 | 161 | then $a | |
164 | 162 | else throw("List size exceeds 10") | |
165 | 163 | ||
166 | 164 | $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
167 | 165 | } | |
168 | 166 | let assetWeightsStrLi = split(assetWeightsStr, ",") | |
169 | 167 | let assetWeightsSum = { | |
170 | 168 | let $l = assetWeightsStrLi | |
171 | 169 | let $s = size($l) | |
172 | 170 | let $acc0 = 0 | |
173 | 171 | func $f5_1 ($a,$i) = if (($i >= $s)) | |
174 | 172 | then $a | |
175 | 173 | else sum($a, $l[$i]) | |
176 | 174 | ||
177 | 175 | func $f5_2 ($a,$i) = if (($i >= $s)) | |
178 | 176 | then $a | |
179 | 177 | else throw("List size exceeds 10") | |
180 | 178 | ||
181 | 179 | $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
182 | 180 | } | |
183 | 181 | func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi))) | |
184 | 182 | then accum | |
185 | 183 | else { | |
186 | 184 | let assetDecimals = match assetIdsLi[assetNum] { | |
187 | 185 | case x: ByteVector => | |
188 | 186 | value(assetInfo(x)).decimals | |
189 | 187 | case _ => | |
190 | 188 | 8 | |
191 | 189 | } | |
192 | 190 | (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum]))), BooleanEntry("is_shutdown", true)]) | |
193 | 191 | } | |
194 | 192 | ||
195 | 193 | if ((assetWeightsSum != 10000)) | |
196 | 194 | then throw("sum of token weights must be equal to 10000") | |
197 | 195 | else ({ | |
198 | 196 | let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
199 | 197 | let $s = size($l) | |
200 | 198 | let $acc0 = nil | |
201 | 199 | func $f6_1 ($a,$i) = if (($i >= $s)) | |
202 | 200 | then $a | |
203 | 201 | else addTokenDataEntries($a, $l[$i]) | |
204 | 202 | ||
205 | 203 | func $f6_2 ($a,$i) = if (($i >= $s)) | |
206 | 204 | then $a | |
207 | 205 | else throw("List size exceeds 10") | |
208 | 206 | ||
209 | 207 | $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10) | |
210 | 208 | } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), IntegerEntry("static_fee", fee)]) | |
211 | 209 | } | |
212 | 210 | else throw("Strict value is not equal to itself.") | |
213 | 211 | } | |
214 | 212 | ||
215 | 213 | ||
216 | 214 | ||
217 | 215 | @Callable(i) | |
218 | 216 | func swap (assetOut,minimum) = if (if ((isShutdown() == true)) | |
219 | 217 | then (i.caller != Address(base58'3PEtLVxDT8mxAh1SDAn8m7JTGNkdpkaFxBk')) | |
220 | 218 | else false) | |
221 | 219 | then throw("contract is shutdown") | |
222 | 220 | else { | |
223 | 221 | let pmt = if ((size(i.payments) == 1)) | |
224 | 222 | then value(i.payments[0]) | |
225 | 223 | else throw("please attach exactly one payment") | |
226 | 224 | let AmountIn = value(i.payments[0].amount) | |
227 | 225 | let AssetIn = pmt.assetId | |
228 | 226 | let AssetOut = getAssetBytes(assetOut) | |
229 | 227 | let AssetInBalance = getTokenBalance(AssetIn) | |
230 | 228 | let AssetOutBalance = getTokenBalance(AssetOut) | |
231 | 229 | let feeAmountIn = fraction(AmountIn, Fee, FeeScale) | |
232 | 230 | let cleanAmountIn = (AmountIn - feeAmountIn) | |
233 | 231 | let AmountOut = calculateOutAmount(cleanAmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance) | |
234 | 232 | let shareAmountWithdrawWaves = if ((0 > (AmountOut - wavesBalance(this).regular))) | |
235 | 233 | then 0 | |
236 | 234 | else fraction((AmountOut - wavesBalance(this).regular), 1, fraction(tryGetInteger2(swopSC, "A_asset_balance"), 1, tryGetInteger2(swopSC, "share_asset_supply")), CEILING) | |
237 | 235 | let uws = if (if ((AssetOut == unit)) | |
238 | 236 | then (shareAmountWithdrawWaves > 0) | |
239 | 237 | else false) | |
240 | 238 | then invoke(swopSC, "callFunction", ["withdraw", [toString(shareAmountWithdrawWaves)]], nil) | |
241 | 239 | else unit | |
242 | 240 | if ((uws == uws)) | |
243 | 241 | then { | |
244 | 242 | let shareAmountWithdrawXtn = if ((0 > (AmountOut - assetBalance(this, xtn)))) | |
245 | 243 | then 0 | |
246 | 244 | else fraction((AmountOut - assetBalance(this, xtn)), 1, fraction(tryGetInteger2(swopSC, "B_asset_balance"), 1, tryGetInteger2(swopSC, "share_asset_supply")), CEILING) | |
247 | 245 | let uxs = if (if ((AssetOut == xtn)) | |
248 | 246 | then (shareAmountWithdrawXtn > 0) | |
249 | 247 | else false) | |
250 | 248 | then invoke(swopSC, "callFunction", ["withdraw", [toString(shareAmountWithdrawXtn)]], nil) | |
251 | 249 | else unit | |
252 | 250 | if ((uxs == uxs)) | |
253 | 251 | then if ((minimum > AmountOut)) | |
254 | 252 | then throw("amount to receive is lower than minimum") | |
255 | 253 | else if ((AssetOut == AssetIn)) | |
256 | 254 | then throw("this swap is not allowed") | |
257 | 255 | else if ((0 > (AssetOutBalance - AmountOut))) | |
258 | 256 | then throw("swap smaller amount") | |
259 | 257 | else { | |
260 | 258 | let invt = invoke(this, "transferOut", [toString(i.caller), AmountOut, AssetOut], nil) | |
261 | 259 | if ((invt == invt)) | |
262 | 260 | then { | |
263 | - | let swxs = if (if (if ((assetBalance(this, xtn) > | |
264 | - | then (wavesBalance(this).available > | |
261 | + | let swxs = if (if (if ((assetBalance(this, xtn) > 0)) | |
262 | + | then (wavesBalance(this).available > 0) | |
265 | 263 | else false) | |
266 | 264 | then ((shareAmountWithdrawWaves + shareAmountWithdrawXtn) == 0) | |
267 | 265 | else false) | |
268 | 266 | then invoke(swopSC, "callFunction", ["replenishWithTwoTokens", ["true", "0"]], [AttachedPayment(unit, wavesBalance(this).available), AttachedPayment(xtn, assetBalance(this, xtn))]) | |
269 | 267 | else unit | |
270 | 268 | if ((swxs == swxs)) | |
271 | 269 | then { | |
272 | 270 | let inv = invoke(project, "selector", nil, nil) | |
273 | 271 | if ((inv == inv)) | |
274 | 272 | then nil | |
275 | 273 | else throw("Strict value is not equal to itself.") | |
276 | 274 | } | |
277 | 275 | else throw("Strict value is not equal to itself.") | |
278 | 276 | } | |
279 | 277 | else throw("Strict value is not equal to itself.") | |
280 | 278 | } | |
281 | 279 | else throw("Strict value is not equal to itself.") | |
282 | 280 | } | |
283 | 281 | else throw("Strict value is not equal to itself.") | |
284 | 282 | } | |
285 | 283 | ||
286 | 284 | ||
287 | 285 | ||
288 | 286 | @Callable(i) | |
289 | 287 | func transferOut (address,AmountOut,AssetOut) = [ScriptTransfer(addressFromStringValue(address), AmountOut, AssetOut)] | |
290 | 288 | ||
291 | 289 | ||
292 | 290 | ||
293 | 291 | @Callable(i) | |
294 | 292 | func startBalance () = if ((i.caller != this)) | |
295 | 293 | then throw("access only by project owner") | |
296 | 294 | else [IntegerEntry(keyWavesS, getTokenBalance(unit)), IntegerEntry(keyXtnS, getTokenBalance(xtn))] | |
297 | 295 | ||
298 | 296 | ||
299 | 297 | ||
300 | 298 | @Callable(i) | |
301 | 299 | func currentBalanceProfit () = if ((i.caller != this)) | |
302 | 300 | then throw("access only by project owner") | |
303 | 301 | else [IntegerEntry("WAVES current balance", getTokenBalance(unit)), IntegerEntry("XTN current balance", getTokenBalance(xtn)), IntegerEntry("WAVES profit", (getTokenBalance(unit) - tryGetInteger(keyWavesS))), IntegerEntry("XTN profit", (getTokenBalance(xtn) - tryGetInteger(keyXtnS)))] | |
304 | 302 | ||
305 | 303 | ||
306 | 304 | ||
307 | 305 | @Callable(i) | |
308 | 306 | func readSwap (assetOut,minimum,assetIn,amountIn) = if (if ((isShutdown() == true)) | |
309 | 307 | then (i.caller != Address(base58'3PEtLVxDT8mxAh1SDAn8m7JTGNkdpkaFxBk')) | |
310 | 308 | else false) | |
311 | 309 | then throw("contract is shutdown") | |
312 | 310 | else { | |
313 | 311 | let AssetIn = getAssetBytes(assetIn) | |
314 | 312 | let AssetOut = getAssetBytes(assetOut) | |
315 | 313 | let AssetInBalance = getTokenBalance(AssetIn) | |
316 | 314 | let AssetOutBalance = getTokenBalance(AssetOut) | |
317 | 315 | let feeAmountIn = fraction(amountIn, Fee, FeeScale) | |
318 | 316 | let cleanAmountIn = (amountIn - feeAmountIn) | |
319 | 317 | let AmountOut = calculateOutAmount(cleanAmountIn, AssetIn, AssetOut, AssetInBalance, AssetOutBalance) | |
320 | 318 | let shareAmountWithdrawWaves = if ((0 > (AmountOut - wavesBalance(this).regular))) | |
321 | 319 | then 0 | |
322 | 320 | else fraction((AmountOut - wavesBalance(this).regular), 1, fraction(tryGetInteger2(swopSC, "A_asset_balance"), 1, tryGetInteger2(swopSC, "share_asset_supply")), CEILING) | |
323 | 321 | let shareAmountWithdrawXtn = if ((0 > (AmountOut - assetBalance(this, xtn)))) | |
324 | 322 | then 0 | |
325 | 323 | else fraction((AmountOut - assetBalance(this, xtn)), 1, fraction(tryGetInteger2(swopSC, "B_asset_balance"), 1, tryGetInteger2(swopSC, "share_asset_supply")), CEILING) | |
326 | 324 | [IntegerEntry("asset in balance", AssetInBalance), IntegerEntry("asset out balance", AssetOutBalance), IntegerEntry("fee amount in", feeAmountIn), IntegerEntry("clean amount in", cleanAmountIn), IntegerEntry("amount out", AmountOut), IntegerEntry("share amount withdraw waves", shareAmountWithdrawWaves), IntegerEntry("share amount withdraw xtn", shareAmountWithdrawXtn), IntegerEntry("waves in swop", wavesInSwop), IntegerEntry("xtn in swop", xtnInSwop)] | |
327 | 325 | } | |
328 | 326 | ||
329 | 327 | ||
330 | 328 | ||
331 | 329 | @Callable(i) | |
332 | 330 | func invoker () = { | |
333 | 331 | let inv1 = invoke(Address(base58'3PAucbbumdUXmhzcR421zGiayphEdo2tRoz'), "withdraw", nil, nil) | |
334 | 332 | if ((inv1 == inv1)) | |
335 | 333 | then { | |
336 | 334 | let inv2 = if ((assetBalance(Address(base58'3PAucbbumdUXmhzcR421zGiayphEdo2tRoz'), vvxtnlp) > 50)) | |
337 | 335 | then invoke(Address(base58'3PAkmJniMgnnAej5pYf2jFYkCbZow5pt9tr'), "withdraw", nil, nil) | |
338 | 336 | else invoke(Address(base58'3PAucbbumdUXmhzcR421zGiayphEdo2tRoz'), "importVVXTNLP", nil, nil) | |
339 | 337 | if ((inv2 == inv2)) | |
340 | 338 | then { | |
341 | 339 | let inv3 = invoke(Address(base58'3PPCzX2doZ7agBNuGSKqjrbdXgGEtE7CpQ3'), "withdraw", nil, nil) | |
342 | 340 | if ((inv3 == inv3)) | |
343 | 341 | then { | |
344 | 342 | let inv4 = invoke(Address(base58'3PHLhWPrs1mrpM1ZDUv1VmUnZRwchADJELc'), "withdraw", nil, nil) | |
345 | 343 | if ((inv4 == inv4)) | |
346 | 344 | then nil | |
347 | 345 | else throw("Strict value is not equal to itself.") | |
348 | 346 | } | |
349 | 347 | else throw("Strict value is not equal to itself.") | |
350 | 348 | } | |
351 | 349 | else throw("Strict value is not equal to itself.") | |
352 | 350 | } | |
353 | 351 | else throw("Strict value is not equal to itself.") | |
354 | 352 | } | |
355 | 353 | ||
356 | 354 |
github/deemru/w8io/873ac7e 70.82 ms ◑![]()