tx · 5MxnbHDZTkoZwnYKVcgHZmCfYSSYMFXZqcNrChgrkidE 3PMqKakbsELgTxiAHNzm4ryEJBLKJcLetyj: -0.01100000 Waves 2023.10.13 13:45 [3862588] smart account 3PMqKakbsELgTxiAHNzm4ryEJBLKJcLetyj > SELF 0.00000000 Waves
{ "type": 13, "id": "5MxnbHDZTkoZwnYKVcgHZmCfYSSYMFXZqcNrChgrkidE", "fee": 1100000, "feeAssetId": null, "timestamp": 1697193969815, "version": 2, "chainId": 87, "sender": "3PMqKakbsELgTxiAHNzm4ryEJBLKJcLetyj", "senderPublicKey": "y6K4a5SRZdvLzRWHrhjBuh5BQqujMD5sLnAocMyZ3P3", "proofs": [ "2sQ5cNqkjFdZhpRiPmU2tZyhwvqBg41stApLRcweyX14N897dg4tmn8ntgLzMML5J4Exj1z9yx3cKGQzbTU9tomz" ], "script": "base64:BgIfCAISABIICgYBAQgIGBgSBAoCCAgSBAoCCAESAwoBCBIADGFkbWluQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAgVhZG1pbgIAAAphcmJDb3VudGVyCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCCmFyYkNvdW50ZXIAAAANd3hTd2FwQWRkcmVzcwIjM1A2OHpOaXVmc3UxdmlacHUxYVkzY2RhaFJSS2N2VjVOOTMBC3dyaXRlU3RyaW5nAgNrZXkLc3RyaW5nVmFsdWUJAQtTdHJpbmdFbnRyeQIFA2tleQULc3RyaW5nVmFsdWUBDHdyaXRlSW50ZWdlcgIDa2V5DGludGVnZXJWYWx1ZQkBDEludGVnZXJFbnRyeQIFA2tleQUMaW50ZWdlclZhbHVlAQdpc0FkbWluAQ1jYWxsZXJBZGRyZXNzAwkAAAIFDWNhbGxlckFkZHJlc3MJANkEAQUMYWRtaW5BZGRyZXNzBgcBDXNwbGl0Q2ZtbUpzb24BBWVudHJ5CQC1CQIFBWVudHJ5AgEvAQppbnZva2VTd29wAwtwb29sQWRkcmVzcwd0b2tlbklkC2lucHV0QW1vdW50BA50b2tlbklkQ2hlY2tlZAMJAAACBQd0b2tlbklkAgVXQVZFUwUEdW5pdAkA2QQBBQd0b2tlbklkBAZyZXN1bHQJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQULcG9vbEFkZHJlc3MCCGV4Y2hhbmdlCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQ50b2tlbklkQ2hlY2tlZAULaW5wdXRBbW91bnQFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAQHJG1hdGNoMAUGcmVzdWx0AwkAAQIFByRtYXRjaDACCUxpc3RbQW55XQQGcmVzdWx0BQckbWF0Y2gwBAckbWF0Y2gxCQCRAwIFBnJlc3VsdAAAAwkAAQIFByRtYXRjaDECA0ludAQBYQUHJG1hdGNoMQUBYQkAAgECGExpc3QgaXRlbSBpcyBub3QgYW4gaW50IQkAAgECKVJlc3VsdCBvZiBzd29wIGludm9rYXRpb24gZG9lcyBub3QgbWF0Y2ghCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQhpbnZva2VXeAMJdG9rZW5JZEluCnRva2VuSWRPdXQLaW5wdXRBbW91bnQEEHRva2VuSWRJbkNoZWNrZWQDCQAAAgUJdG9rZW5JZEluAgVXQVZFUwUEdW5pdAkA2QQBBQl0b2tlbklkSW4EEXRva2VuSWRPdXRDaGVja2VkAwkAAAIFCnRva2VuSWRPdXQCBVdBVkVTAgAFCnRva2VuSWRPdXQEAXIJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUNd3hTd2FwQWRkcmVzcwIEc3dhcAkAzAgCAAEJAMwIAgURdG9rZW5JZE91dENoZWNrZWQJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFEHRva2VuSWRJbkNoZWNrZWQFC2lucHV0QW1vdW50BQNuaWwDCQAAAgUBcgUBcgQHJG1hdGNoMAUBcgMJAAECBQckbWF0Y2gwAgNJbnQEAXIFByRtYXRjaDAFAXIJAAIBAilSZXN1bHQgb2Ygc3dvcCBpbnZva2F0aW9uIGRvZXMgbm90IG1hdGNoIQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMaW52b2tlUHV6emxlBAtwb29sQWRkcmVzcwl0b2tlbklkSW4KdG9rZW5JZE91dAtpbnB1dEFtb3VudAQQdG9rZW5JZEluQ2hlY2tlZAMJAAACBQl0b2tlbklkSW4CBVdBVkVTBQR1bml0CQDZBAEFCXRva2VuSWRJbgQGcmVzdWx0CQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3Bvb2xBZGRyZXNzAgRzd2FwCQDMCAIFCnRva2VuSWRPdXQJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFEHRva2VuSWRJbkNoZWNrZWQFC2lucHV0QW1vdW50BQNuaWwDCQAAAgUGcmVzdWx0BQZyZXN1bHQEByRtYXRjaDAFBnJlc3VsdAMJAAECBQckbWF0Y2gwAgNJbnQEBnJlc3VsdAUHJG1hdGNoMAUGcmVzdWx0CQACAQIpUmVzdWx0IG9mIHN3b3AgaW52b2thdGlvbiBkb2VzIG5vdCBtYXRjaCEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEWRldGVybWluZVBsYXRmb3JtAwRjZm1tCXRva2VuSWRJbgp0b2tlbklkT3V0BARpdGVtCQENc3BsaXRDZm1tSnNvbgEFBGNmbW0EC2lucHV0QW1vdW50CQC2CQEJAJEDAgUEaXRlbQACBAVpbnB1dAQHJG1hdGNoMAULaW5wdXRBbW91bnQDCQABAgUHJG1hdGNoMAIDSW50BAtpbnB1dEFtb3VudAUHJG1hdGNoMAULaW5wdXRBbW91bnQJAAIBAihEYXRhdHlwZSBvZiBpbnB1dCBhbW91bnQgZG9lcyBub3QgbWF0Y2ghBAZyZXN1bHQDCQAAAgkAkQMCBQRpdGVtAAACBFNXT1AJAQppbnZva2VTd29wAwkAkQMCBQRpdGVtAAEFCXRva2VuSWRJbgUFaW5wdXQDCQAAAgkAkQMCBQRpdGVtAAACDldhdmVzIEV4Y2hhbmdlCQEIaW52b2tlV3gDBQl0b2tlbklkSW4FCnRva2VuSWRPdXQFBWlucHV0AwkAAAIJAJEDAgUEaXRlbQAAAgtQdXp6bGUgU3dhcAkBDGludm9rZVB1enpsZQQJAJEDAgUEaXRlbQABBQl0b2tlbklkSW4FCnRva2VuSWRPdXQFBWlucHV0CQACAQIbUGxhdGZvcm0gaWQgZG9lcyBub3QgbWF0Y2ghBQZyZXN1bHQBDHByb2Nlc3NDZm1tcwMFc3dhcHMJdG9rZW5JZEluCnRva2VuSWRPdXQKAQppbnZva2VTd2FwAgVhY2N1bQRuZXh0BAskdDA2OTU5Njk4NgUFYWNjdW0EBnJlc3VsdAgFCyR0MDY5NTk2OTg2Al8xBAVpbmRleAgFCyR0MDY5NTk2OTg2Al8yAwkAZgIJAJADAQUFc3dhcHMFBWluZGV4CQCUCgIJAGQCBQZyZXN1bHQJARFkZXRlcm1pbmVQbGF0Zm9ybQMFBG5leHQFCXRva2VuSWRJbgUKdG9rZW5JZE91dAkAZAIFBWluZGV4AAEJAJQKAgUGcmVzdWx0BQVpbmRleAQLcmVzdWx0VHVwbGUKAAIkbAUFc3dhcHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQppbnZva2VTd2FwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA0MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoCAULcmVzdWx0VHVwbGUCXzEBH2NhbGNFeGNlc3NBbW91bnRQZXJDZm1tUG9zaXRpdmUCCmRpZmZlcmVuY2ULbnVtYmVyQ2ZtbXMECHF1b3RpZW50CQBuBAUKZGlmZmVyZW5jZQABBQtudW1iZXJDZm1tcwUERE9XTgQWdG90YWxEaXN0cmlidXRlZEFtb3VudAkAaAIFCHF1b3RpZW50BQtudW1iZXJDZm1tcwQPcmVtYWluaW5nQW1vdW50CQBlAgUKZGlmZmVyZW5jZQUWdG90YWxEaXN0cmlidXRlZEFtb3VudAMJAGYCBQ9yZW1haW5pbmdBbW91bnQAAAkAlAoCBQhxdW90aWVudAUPcmVtYWluaW5nQW1vdW50CQCUCgIFCHF1b3RpZW50AAABH2NhbGNFeGNlc3NBbW91bnRQZXJDZm1tTmVnYXRpdmUCCmRpZmZlcmVuY2ULbnVtYmVyQ2ZtbXMECHF1b3RpZW50CQBuBAUKZGlmZmVyZW5jZQABBQtudW1iZXJDZm1tcwUERE9XTgQWdG90YWxEaXN0cmlidXRlZEFtb3VudAkAaAIFCHF1b3RpZW50BQtudW1iZXJDZm1tcwQPcmVtYWluaW5nQW1vdW50CQBlAgUKZGlmZmVyZW5jZQUWdG90YWxEaXN0cmlidXRlZEFtb3VudAMJAGYCAAAFD3JlbWFpbmluZ0Ftb3VudAkAlAoCBQhxdW90aWVudAUPcmVtYWluaW5nQW1vdW50CQCUCgIFCHF1b3RpZW50AAABGmRpc3RyaWJ1dGVBZGRpdGlvbmFsVG9rZW5zAgVzd2FwcwRkaWZmBAp0b3RhbFN3YXBzCQCQAwEFBXN3YXBzBAskdDA3OTk3ODA4MAkBH2NhbGNFeGNlc3NBbW91bnRQZXJDZm1tUG9zaXRpdmUCBQRkaWZmBQp0b3RhbFN3YXBzBAhxdW90aWVudAgFCyR0MDc5OTc4MDgwAl8xBA9yZW1haW5pbmdBbW91bnQIBQskdDA3OTk3ODA4MAJfMgoBDWFkanVzdEFtb3VudHMCBWFjY3VtBG5leHQECyR0MDgxNTM4MTk1BQVhY2N1bQQNYWRqdXN0ZWRTd2FwcwgFCyR0MDgxNTM4MTk1Al8xBA1yZW1haW5pbmdEaWZmCAULJHQwODE1MzgxOTUCXzIEBGl0ZW0JAQ1zcGxpdENmbW1Kc29uAQUEbmV4dAQLaW5wdXRBbW91bnQJALYJAQkAkQMCBQRpdGVtAAIEByRtYXRjaDAFC2lucHV0QW1vdW50AwkAAQIFByRtYXRjaDACA0ludAQFaW5wdXQFByRtYXRjaDAEDmFtb3VudFRvQWRqdXN0AwkAZgIFDXJlbWFpbmluZ0RpZmYAAAkAZAIJAGQCBQVpbnB1dAUIcXVvdGllbnQAAQkAZAIFBWlucHV0BQhxdW90aWVudAQHbmV3SXRlbQkArAICCQCsAgIJAKwCAgkArAICCQCRAwIFBGl0ZW0AAAIBLwkAkQMCBQRpdGVtAAECAS8JAKQDAQUOYW1vdW50VG9BZGp1c3QEEG5ld1JlbWFpbmluZ0RpZmYDCQBmAgUNcmVtYWluaW5nRGlmZgAACQBlAgUNcmVtYWluaW5nRGlmZgABBQ1yZW1haW5pbmdEaWZmCQCUCgIJAM0IAgUNYWRqdXN0ZWRTd2FwcwUHbmV3SXRlbQUQbmV3UmVtYWluaW5nRGlmZgkAAgECGUlucHV0IGhhcyB3cm9uZyBkYXRhdHlwZSEEBnJlc3VsdAoAAiRsBQVzd2FwcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQ9yZW1haW5pbmdBbW91bnQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDWFkanVzdEFtb3VudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDQwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgIBQZyZXN1bHQCXzEBGGRpc3RyaWJ1dGVSZW1haW5pbmdEaWZmcwINcmVtYWluaW5nRGlmZgVzd2FwcwoBFmRpc3RyaWJ1dGVQcm9wb3J0aW9uYWwCBWFjY3VtBG5leHQECyR0MDkwNzE5MTEwBQVhY2N1bQQNYWRqdXN0ZWRTd2FwcwgFCyR0MDkwNzE5MTEwAl8xBApyZW1haW5EaWZmCAULJHQwOTA3MTkxMTACXzIEBGl0ZW0JAQ1zcGxpdENmbW1Kc29uAQUEbmV4dAQLaW5wdXRBbW91bnQJALYJAQkAkQMCBQRpdGVtAAIEEGlucHV0QW1vdW50Q2hlY2sEByRtYXRjaDAFC2lucHV0QW1vdW50AwkAAQIFByRtYXRjaDACA0ludAQFaW5wdXQFByRtYXRjaDAFBWlucHV0CQACAQIkSW5wdXQgYW1vdW50IGhhcyB0aGUgd3JvbmcgZGF0YSB0eXBlBA9tYXhTdWJ0cmFjdGFibGUDCQBmAgUQaW5wdXRBbW91bnRDaGVjawAECQBrAwUQaW5wdXRBbW91bnRDaGVjawADAAQAAAQMJHQwOTUwODEwMTIyAwMJAAACBQpyZW1haW5EaWZmAAAGCQAAAgUPbWF4U3VidHJhY3RhYmxlAAAJAJQKAgUKcmVtYWluRGlmZgAAAwkAZgIJAGQCBQpyZW1haW5EaWZmBQ9tYXhTdWJ0cmFjdGFibGUAAAQVcmVtYWluaW5nU3VidHJhY3RhYmxlCQBkAgUKcmVtYWluRGlmZgUPbWF4U3VidHJhY3RhYmxlCQCUCgIAAAkAZQIFD21heFN1YnRyYWN0YWJsZQUVcmVtYWluaW5nU3VidHJhY3RhYmxlAwkAZgIAAAkAZAIFCnJlbWFpbkRpZmYFD21heFN1YnRyYWN0YWJsZQkAlAoCCQBkAgUKcmVtYWluRGlmZgUPbWF4U3VidHJhY3RhYmxlBQ9tYXhTdWJ0cmFjdGFibGUJAJQKAgAABQ9tYXhTdWJ0cmFjdGFibGUEEG5ld1JlbWFpbmluZ0RpZmYIBQwkdDA5NTA4MTAxMjICXzEEEnN1YnRyYWN0YWJsZUFtb3VudAgFDCR0MDk1MDgxMDEyMgJfMgQOYW1vdW50VG9BZGp1c3QJAGUCBRBpbnB1dEFtb3VudENoZWNrBRJzdWJ0cmFjdGFibGVBbW91bnQEB25ld0l0ZW0JAKwCAgkArAICCQCsAgIJAKwCAgkAkQMCBQRpdGVtAAACAS8JAJEDAgUEaXRlbQABAgEvCQCkAwEFDmFtb3VudFRvQWRqdXN0CQCUCgIJAM0IAgUNYWRqdXN0ZWRTd2FwcwUHbmV3SXRlbQUQbmV3UmVtYWluaW5nRGlmZgoAAiRsBQVzd2FwcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQ1yZW1haW5pbmdEaWZmCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZkaXN0cmlidXRlUHJvcG9ydGlvbmFsAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA0MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoARhkaXN0cmlidXRlTmVnYXRpdmVUb2tlbnMCBXN3YXBzBGRpZmYECnRvdGFsU3dhcHMJAJADAQUFc3dhcHMEDSR0MDEwNDg3MTA1NzAJAR9jYWxjRXhjZXNzQW1vdW50UGVyQ2ZtbU5lZ2F0aXZlAgUEZGlmZgUKdG90YWxTd2FwcwQIcXVvdGllbnQIBQ0kdDAxMDQ4NzEwNTcwAl8xBA9yZW1haW5pbmdBbW91bnQIBQ0kdDAxMDQ4NzEwNTcwAl8yCgENYWRqdXN0QW1vdW50cwIFYWNjdW0EbmV4dAQNJHQwMTA2NDMxMDY4NQUFYWNjdW0EDWFkanVzdGVkU3dhcHMIBQ0kdDAxMDY0MzEwNjg1Al8xBA1yZW1haW5pbmdEaWZmCAUNJHQwMTA2NDMxMDY4NQJfMgQEaXRlbQkBDXNwbGl0Q2ZtbUpzb24BBQRuZXh0BAtpbnB1dEFtb3VudAkAtgkBCQCRAwIFBGl0ZW0AAgQHJG1hdGNoMAULaW5wdXRBbW91bnQDCQABAgUHJG1hdGNoMAIDSW50BAVpbnB1dAUHJG1hdGNoMAQNJHQwMTA4MjIxMTE3MgMJAGcCCQBkAgUFaW5wdXQFCHF1b3RpZW50AAEDAwkAZgIFDXJlbWFpbmluZ0RpZmYAAAkAZwIJAGUCCQBkAgUFaW5wdXQFCHF1b3RpZW50AAEAAQcJAJQKAgkAZQIJAGQCBQVpbnB1dAUIcXVvdGllbnQAAQkAZQIFDXJlbWFpbmluZ0RpZmYAAQkAlAoCCQBkAgUFaW5wdXQFCHF1b3RpZW50BQ1yZW1haW5pbmdEaWZmCQCUCgIFBWlucHV0CQBkAgUNcmVtYWluaW5nRGlmZgUIcXVvdGllbnQEDmFtb3VudFRvQWRqdXN0CAUNJHQwMTA4MjIxMTE3MgJfMQQQbmV3UmVtYWluaW5nRGlmZggFDSR0MDEwODIyMTExNzICXzIEB25ld0l0ZW0JAKwCAgkArAICCQCsAgIJAKwCAgkAkQMCBQRpdGVtAAACAS8JAJEDAgUEaXRlbQABAgEvCQCkAwEFDmFtb3VudFRvQWRqdXN0CQCUCgIJAM0IAgUNYWRqdXN0ZWRTd2FwcwUHbmV3SXRlbQUQbmV3UmVtYWluaW5nRGlmZgkAAgECGUlucHV0IGhhcyB3cm9uZyBkYXRhdHlwZSEEDSR0MDExMzcxMTE0NjIKAAIkbAUFc3dhcHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUPcmVtYWluaW5nQW1vdW50CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1hZGp1c3RBbW91bnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA0MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoBA1hZGp1c3RlZFN3YXBzCAUNJHQwMTEzNzExMTQ2MgJfMQQOcmVtYWluaW5nRGlmZnMIBQ0kdDAxMTM3MTExNDYyAl8yBA0kdDAxMTQ2NjExNTQ2CQEYZGlzdHJpYnV0ZVJlbWFpbmluZ0RpZmZzAgUOcmVtYWluaW5nRGlmZnMFDWFkanVzdGVkU3dhcHMECmZpbmFsU3dhcHMIBQ0kdDAxMTQ2NjExNTQ2Al8xBAVkaWZmcwgFDSR0MDExNDY2MTE1NDYCXzIFCmZpbmFsU3dhcHMBF2hhbmRsZVNlY29uZElucHV0QW1vdW50AxNwcmVkZXRlcm1pbmVkQW1vdW50D2F2YWlsYWJsZUFtb3VudAVzd2FwcwQEZGlmZgkAZQIFD2F2YWlsYWJsZUFtb3VudAUTcHJlZGV0ZXJtaW5lZEFtb3VudAQNYWRqdXN0ZWRTd2FwcwMJAGYCBQRkaWZmAAAJARpkaXN0cmlidXRlQWRkaXRpb25hbFRva2VucwIFBXN3YXBzBQRkaWZmAwkAZgIAAAUEZGlmZgkBGGRpc3RyaWJ1dGVOZWdhdGl2ZVRva2VucwIFBXN3YXBzBQRkaWZmBQVzd2FwcwUNYWRqdXN0ZWRTd2FwcwUBaQEFc2V0dXAAAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzAgVhZG1pbgkAzAgCCQELd3JpdGVTdHJpbmcCAgVhZG1pbgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBQNuaWwJAAIBAhNEYXBwIGFscmVhZHkgc2V0dXAhAWkBCGJhc2ljQXJiBgtzdGFydEFtb3VudA5zZWNvbmRBbW91bnRJbgpmaXJzdFRva2VuC3NlY29uZFRva2VuCWZpcnN0U3dhcApzZWNvbmRTd2FwAwkBB2lzQWRtaW4BCAgFAWkGY2FsbGVyBWJ5dGVzBBlhdmFpbGFibGVBbW91bnRGaXJzdFRva2VuAwkAAAIFCmZpcnN0VG9rZW4CBVdBVkVTBAdiYWxhbmNlCQDvBwEFBHRoaXMIBQdiYWxhbmNlCWF2YWlsYWJsZQQMZmlyc3RUb2tlbklkBAN0SWQJANkEAQUKZmlyc3RUb2tlbgQHJG1hdGNoMAUDdElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA3RJZAUHJG1hdGNoMAUDdElkCQACAQIQSW52YWxpZCBkYXRhdHlwZQkA8AcCBQR0aGlzBQxmaXJzdFRva2VuSWQDCQBnAgUZYXZhaWxhYmxlQW1vdW50Rmlyc3RUb2tlbgULc3RhcnRBbW91bnQEC2ZpcnN0UmVzdWx0CQEMcHJvY2Vzc0NmbW1zAwUJZmlyc3RTd2FwBQpmaXJzdFRva2VuBQtzZWNvbmRUb2tlbgQLc2Vjb25kU3dhcHMDCQAAAgULZmlyc3RSZXN1bHQFDnNlY29uZEFtb3VudEluBQpzZWNvbmRTd2FwCQEXaGFuZGxlU2Vjb25kSW5wdXRBbW91bnQDBQ5zZWNvbmRBbW91bnRJbgULZmlyc3RSZXN1bHQFCnNlY29uZFN3YXAEDHNlY29uZFJlc3VsdAkBDHByb2Nlc3NDZm1tcwMFC3NlY29uZFN3YXBzBQtzZWNvbmRUb2tlbgUKZmlyc3RUb2tlbgMJAGYCBQxzZWNvbmRSZXN1bHQFC3N0YXJ0QW1vdW50CQCUCgIJAMwIAgkBDHdyaXRlSW50ZWdlcgIJAKwCAgIKQXJiUmVzdWx0XwkApAMBBQphcmJDb3VudGVyCQBlAgUMc2Vjb25kUmVzdWx0BQtzdGFydEFtb3VudAkAzAgCCQELd3JpdGVTdHJpbmcCCQCsAgICEEFyYlJlc3VsdCBUb2tlbl8JAKQDAQUKYXJiQ291bnRlcgUKZmlyc3RUb2tlbgkAzAgCCQEMd3JpdGVJbnRlZ2VyAgIKYXJiQ291bnRlcgkAZAIFCmFyYkNvdW50ZXIAAQUDbmlsCQBlAgUMc2Vjb25kUmVzdWx0BQtzdGFydEFtb3VudAkAAgEJAKwCAgkArAICCQCsAgICKFRyYWRlIHdhcyBub3QgcHJvZml0YWJsZSEgSW5wdXQgYW1vdW50OiAJAKQDAQULc3RhcnRBbW91bnQCECBPdXRwdXQgYW1vdW50OiAJAKQDAQUMc2Vjb25kUmVzdWx0CQACAQIpQXZhaWxhYmxlIGlucHV0IGFtb3VudCBpcyBub3Qgc3VmZmljaWVudCEJAAIBAipBZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggYWRtaW4gYWRkcmVzcyEBaQERdXBkYXRlU3RyaW5nRW50cnkCA2tleQtzdHJpbmdWYWx1ZQMJAQdpc0FkbWluAQgIBQFpBmNhbGxlcgVieXRlcwkAzAgCCQELd3JpdGVTdHJpbmcCBQNrZXkFC3N0cmluZ1ZhbHVlBQNuaWwJAAIBAipBZGRyZXNzIGRvZXMgbm90IG1hdGNoIHdpdGggYWRtaW4gYWRkcmVzcyEBaQESdXBkYXRlSW50ZWdlckVudHJ5AgNrZXkMaW50ZWdlclZhbHVlAwkBB2lzQWRtaW4BCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIJAQx3cml0ZUludGVnZXICBQNrZXkFDGludGVnZXJWYWx1ZQUDbmlsCQACAQIqQWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIGFkbWluIGFkZHJlc3MhAWkBEmRlbGV0ZVN0b3JhZ2VFbnRyeQEDa2V5AwkBB2lzQWRtaW4BCAgFAWkGY2FsbGVyBWJ5dGVzCQDMCAIJAQtEZWxldGVFbnRyeQEFA2tleQUDbmlsCQACAQIqQWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIGFkbWluIGFkZHJlc3MhAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleXaEJSc=", "height": 3862588, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FQaEmXf6Cx8tvCBGzLqkMMu8ou4zS5FmRu5NF7hNBjpX Next: DqgaCDsr1fvNLHXxejT8bpgZwsPHyABFuZSGGg4tPdBw Diff:
Old | New | Differences | |
---|---|---|---|
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let adminAddress = valueOrElse(getString(this, "admin"), "") | |
5 | + | ||
6 | + | let arbCounter = valueOrElse(getInteger(this, "arbCounter"), 0) | |
5 | 7 | ||
6 | 8 | let wxSwapAddress = "3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93" | |
7 | 9 | ||
97 | 99 | ||
98 | 100 | func processCfmms (swaps,tokenIdIn,tokenIdOut) = { | |
99 | 101 | func invokeSwap (accum,next) = { | |
100 | - | let $ | |
101 | - | let result = $ | |
102 | - | let index = $ | |
102 | + | let $t069596986 = accum | |
103 | + | let result = $t069596986._1 | |
104 | + | let index = $t069596986._2 | |
103 | 105 | if ((size(swaps) > index)) | |
104 | 106 | then $Tuple2((result + determinePlatform(next, tokenIdIn, tokenIdOut)), (index + 1)) | |
105 | 107 | else $Tuple2(result, index) | |
145 | 147 | ||
146 | 148 | func distributeAdditionalTokens (swaps,diff) = { | |
147 | 149 | let totalSwaps = size(swaps) | |
148 | - | let $ | |
149 | - | let quotient = $ | |
150 | - | let remainingAmount = $ | |
150 | + | let $t079978080 = calcExcessAmountPerCfmmPositive(diff, totalSwaps) | |
151 | + | let quotient = $t079978080._1 | |
152 | + | let remainingAmount = $t079978080._2 | |
151 | 153 | func adjustAmounts (accum,next) = { | |
152 | - | let $ | |
153 | - | let adjustedSwaps = $ | |
154 | - | let remainingDiff = $ | |
154 | + | let $t081538195 = accum | |
155 | + | let adjustedSwaps = $t081538195._1 | |
156 | + | let remainingDiff = $t081538195._2 | |
155 | 157 | let item = splitCfmmJson(next) | |
156 | 158 | let inputAmount = parseInt(item[2]) | |
157 | 159 | match inputAmount { | |
189 | 191 | ||
190 | 192 | func distributeRemainingDiffs (remainingDiff,swaps) = { | |
191 | 193 | func distributeProportional (accum,next) = { | |
192 | - | let $ | |
193 | - | let adjustedSwaps = $ | |
194 | - | let remainDiff = $ | |
194 | + | let $t090719110 = accum | |
195 | + | let adjustedSwaps = $t090719110._1 | |
196 | + | let remainDiff = $t090719110._2 | |
195 | 197 | let item = splitCfmmJson(next) | |
196 | 198 | let inputAmount = parseInt(item[2]) | |
197 | 199 | let inputAmountCheck = match inputAmount { | |
203 | 205 | let maxSubtractable = if ((inputAmountCheck > 4)) | |
204 | 206 | then fraction(inputAmountCheck, 3, 4) | |
205 | 207 | else 0 | |
206 | - | let $ | |
208 | + | let $t0950810122 = if (if ((remainDiff == 0)) | |
207 | 209 | then true | |
208 | 210 | else (maxSubtractable == 0)) | |
209 | 211 | then $Tuple2(remainDiff, 0) | |
215 | 217 | else if ((0 > (remainDiff + maxSubtractable))) | |
216 | 218 | then $Tuple2((remainDiff + maxSubtractable), maxSubtractable) | |
217 | 219 | else $Tuple2(0, maxSubtractable) | |
218 | - | let newRemainingDiff = $ | |
219 | - | let subtractableAmount = $ | |
220 | + | let newRemainingDiff = $t0950810122._1 | |
221 | + | let subtractableAmount = $t0950810122._2 | |
220 | 222 | let amountToAdjust = (inputAmountCheck - subtractableAmount) | |
221 | 223 | let newItem = ((((item[0] + "/") + item[1]) + "/") + toString(amountToAdjust)) | |
222 | 224 | $Tuple2((adjustedSwaps :+ newItem), newRemainingDiff) | |
239 | 241 | ||
240 | 242 | func distributeNegativeTokens (swaps,diff) = { | |
241 | 243 | let totalSwaps = size(swaps) | |
242 | - | let $ | |
243 | - | let quotient = $ | |
244 | - | let remainingAmount = $ | |
244 | + | let $t01048710570 = calcExcessAmountPerCfmmNegative(diff, totalSwaps) | |
245 | + | let quotient = $t01048710570._1 | |
246 | + | let remainingAmount = $t01048710570._2 | |
245 | 247 | func adjustAmounts (accum,next) = { | |
246 | - | let $ | |
247 | - | let adjustedSwaps = $ | |
248 | - | let remainingDiff = $ | |
248 | + | let $t01064310685 = accum | |
249 | + | let adjustedSwaps = $t01064310685._1 | |
250 | + | let remainingDiff = $t01064310685._2 | |
249 | 251 | let item = splitCfmmJson(next) | |
250 | 252 | let inputAmount = parseInt(item[2]) | |
251 | 253 | match inputAmount { | |
252 | 254 | case input: Int => | |
253 | - | let $ | |
255 | + | let $t01082211172 = if (((input + quotient) >= 1)) | |
254 | 256 | then if (if ((remainingDiff > 0)) | |
255 | 257 | then (((input + quotient) - 1) >= 1) | |
256 | 258 | else false) | |
257 | 259 | then $Tuple2(((input + quotient) - 1), (remainingDiff - 1)) | |
258 | 260 | else $Tuple2((input + quotient), remainingDiff) | |
259 | 261 | else $Tuple2(input, (remainingDiff + quotient)) | |
260 | - | let amountToAdjust = $ | |
261 | - | let newRemainingDiff = $ | |
262 | + | let amountToAdjust = $t01082211172._1 | |
263 | + | let newRemainingDiff = $t01082211172._2 | |
262 | 264 | let newItem = ((((item[0] + "/") + item[1]) + "/") + toString(amountToAdjust)) | |
263 | 265 | $Tuple2((adjustedSwaps :+ newItem), newRemainingDiff) | |
264 | 266 | case _ => | |
266 | 268 | } | |
267 | 269 | } | |
268 | 270 | ||
269 | - | let $ | |
271 | + | let $t01137111462 = { | |
270 | 272 | let $l = swaps | |
271 | 273 | let $s = size($l) | |
272 | 274 | let $acc0 = $Tuple2(nil, remainingAmount) | |
280 | 282 | ||
281 | 283 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40) | |
282 | 284 | } | |
283 | - | let adjustedSwaps = $ | |
284 | - | let remainingDiffs = $ | |
285 | - | let $ | |
286 | - | let finalSwaps = $ | |
287 | - | let diffs = $ | |
285 | + | let adjustedSwaps = $t01137111462._1 | |
286 | + | let remainingDiffs = $t01137111462._2 | |
287 | + | let $t01146611546 = distributeRemainingDiffs(remainingDiffs, adjustedSwaps) | |
288 | + | let finalSwaps = $t01146611546._1 | |
289 | + | let diffs = $t01146611546._2 | |
288 | 290 | finalSwaps | |
289 | 291 | } | |
290 | 292 | ||
335 | 337 | else handleSecondInputAmount(secondAmountIn, firstResult, secondSwap) | |
336 | 338 | let secondResult = processCfmms(secondSwaps, secondToken, firstToken) | |
337 | 339 | if ((secondResult > startAmount)) | |
338 | - | then $Tuple2( | |
340 | + | then $Tuple2([writeInteger(("ArbResult_" + toString(arbCounter)), (secondResult - startAmount)), writeString(("ArbResult Token_" + toString(arbCounter)), firstToken), writeInteger("arbCounter", (arbCounter + 1))], (secondResult - startAmount)) | |
339 | 341 | else throw(((("Trade was not profitable! Input amount: " + toString(startAmount)) + " Output amount: ") + toString(secondResult))) | |
340 | 342 | } | |
341 | 343 | else throw("Available input amount is not sufficient!") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let adminAddress = valueOrElse(getString(this, "admin"), "") | |
5 | + | ||
6 | + | let arbCounter = valueOrElse(getInteger(this, "arbCounter"), 0) | |
5 | 7 | ||
6 | 8 | let wxSwapAddress = "3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93" | |
7 | 9 | ||
8 | 10 | func writeString (key,stringValue) = StringEntry(key, stringValue) | |
9 | 11 | ||
10 | 12 | ||
11 | 13 | func writeInteger (key,integerValue) = IntegerEntry(key, integerValue) | |
12 | 14 | ||
13 | 15 | ||
14 | 16 | func isAdmin (callerAddress) = if ((callerAddress == fromBase58String(adminAddress))) | |
15 | 17 | then true | |
16 | 18 | else false | |
17 | 19 | ||
18 | 20 | ||
19 | 21 | func splitCfmmJson (entry) = split(entry, "/") | |
20 | 22 | ||
21 | 23 | ||
22 | 24 | func invokeSwop (poolAddress,tokenId,inputAmount) = { | |
23 | 25 | let tokenIdChecked = if ((tokenId == "WAVES")) | |
24 | 26 | then unit | |
25 | 27 | else fromBase58String(tokenId) | |
26 | 28 | let result = invoke(addressFromStringValue(poolAddress), "exchange", [1], [AttachedPayment(tokenIdChecked, inputAmount)]) | |
27 | 29 | if ((result == result)) | |
28 | 30 | then match result { | |
29 | 31 | case result: List[Any] => | |
30 | 32 | match result[0] { | |
31 | 33 | case a: Int => | |
32 | 34 | a | |
33 | 35 | case _ => | |
34 | 36 | throw("List item is not an int!") | |
35 | 37 | } | |
36 | 38 | case _ => | |
37 | 39 | throw("Result of swop invokation does not match!") | |
38 | 40 | } | |
39 | 41 | else throw("Strict value is not equal to itself.") | |
40 | 42 | } | |
41 | 43 | ||
42 | 44 | ||
43 | 45 | func invokeWx (tokenIdIn,tokenIdOut,inputAmount) = { | |
44 | 46 | let tokenIdInChecked = if ((tokenIdIn == "WAVES")) | |
45 | 47 | then unit | |
46 | 48 | else fromBase58String(tokenIdIn) | |
47 | 49 | let tokenIdOutChecked = if ((tokenIdOut == "WAVES")) | |
48 | 50 | then "" | |
49 | 51 | else tokenIdOut | |
50 | 52 | let r = invoke(addressFromStringValue(wxSwapAddress), "swap", [1, tokenIdOutChecked, toString(this)], [AttachedPayment(tokenIdInChecked, inputAmount)]) | |
51 | 53 | if ((r == r)) | |
52 | 54 | then match r { | |
53 | 55 | case r: Int => | |
54 | 56 | r | |
55 | 57 | case _ => | |
56 | 58 | throw("Result of swop invokation does not match!") | |
57 | 59 | } | |
58 | 60 | else throw("Strict value is not equal to itself.") | |
59 | 61 | } | |
60 | 62 | ||
61 | 63 | ||
62 | 64 | func invokePuzzle (poolAddress,tokenIdIn,tokenIdOut,inputAmount) = { | |
63 | 65 | let tokenIdInChecked = if ((tokenIdIn == "WAVES")) | |
64 | 66 | then unit | |
65 | 67 | else fromBase58String(tokenIdIn) | |
66 | 68 | let result = invoke(addressFromStringValue(poolAddress), "swap", [tokenIdOut, 1], [AttachedPayment(tokenIdInChecked, inputAmount)]) | |
67 | 69 | if ((result == result)) | |
68 | 70 | then match result { | |
69 | 71 | case result: Int => | |
70 | 72 | result | |
71 | 73 | case _ => | |
72 | 74 | throw("Result of swop invokation does not match!") | |
73 | 75 | } | |
74 | 76 | else throw("Strict value is not equal to itself.") | |
75 | 77 | } | |
76 | 78 | ||
77 | 79 | ||
78 | 80 | func determinePlatform (cfmm,tokenIdIn,tokenIdOut) = { | |
79 | 81 | let item = splitCfmmJson(cfmm) | |
80 | 82 | let inputAmount = parseInt(item[2]) | |
81 | 83 | let input = match inputAmount { | |
82 | 84 | case inputAmount: Int => | |
83 | 85 | inputAmount | |
84 | 86 | case _ => | |
85 | 87 | throw("Datatype of input amount does not match!") | |
86 | 88 | } | |
87 | 89 | let result = if ((item[0] == "SWOP")) | |
88 | 90 | then invokeSwop(item[1], tokenIdIn, input) | |
89 | 91 | else if ((item[0] == "Waves Exchange")) | |
90 | 92 | then invokeWx(tokenIdIn, tokenIdOut, input) | |
91 | 93 | else if ((item[0] == "Puzzle Swap")) | |
92 | 94 | then invokePuzzle(item[1], tokenIdIn, tokenIdOut, input) | |
93 | 95 | else throw("Platform id does not match!") | |
94 | 96 | result | |
95 | 97 | } | |
96 | 98 | ||
97 | 99 | ||
98 | 100 | func processCfmms (swaps,tokenIdIn,tokenIdOut) = { | |
99 | 101 | func invokeSwap (accum,next) = { | |
100 | - | let $ | |
101 | - | let result = $ | |
102 | - | let index = $ | |
102 | + | let $t069596986 = accum | |
103 | + | let result = $t069596986._1 | |
104 | + | let index = $t069596986._2 | |
103 | 105 | if ((size(swaps) > index)) | |
104 | 106 | then $Tuple2((result + determinePlatform(next, tokenIdIn, tokenIdOut)), (index + 1)) | |
105 | 107 | else $Tuple2(result, index) | |
106 | 108 | } | |
107 | 109 | ||
108 | 110 | let resultTuple = { | |
109 | 111 | let $l = swaps | |
110 | 112 | let $s = size($l) | |
111 | 113 | let $acc0 = $Tuple2(0, 0) | |
112 | 114 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
113 | 115 | then $a | |
114 | 116 | else invokeSwap($a, $l[$i]) | |
115 | 117 | ||
116 | 118 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
117 | 119 | then $a | |
118 | 120 | else throw("List size exceeds 40") | |
119 | 121 | ||
120 | 122 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40) | |
121 | 123 | } | |
122 | 124 | resultTuple._1 | |
123 | 125 | } | |
124 | 126 | ||
125 | 127 | ||
126 | 128 | func calcExcessAmountPerCfmmPositive (difference,numberCfmms) = { | |
127 | 129 | let quotient = fraction(difference, 1, numberCfmms, DOWN) | |
128 | 130 | let totalDistributedAmount = (quotient * numberCfmms) | |
129 | 131 | let remainingAmount = (difference - totalDistributedAmount) | |
130 | 132 | if ((remainingAmount > 0)) | |
131 | 133 | then $Tuple2(quotient, remainingAmount) | |
132 | 134 | else $Tuple2(quotient, 0) | |
133 | 135 | } | |
134 | 136 | ||
135 | 137 | ||
136 | 138 | func calcExcessAmountPerCfmmNegative (difference,numberCfmms) = { | |
137 | 139 | let quotient = fraction(difference, 1, numberCfmms, DOWN) | |
138 | 140 | let totalDistributedAmount = (quotient * numberCfmms) | |
139 | 141 | let remainingAmount = (difference - totalDistributedAmount) | |
140 | 142 | if ((0 > remainingAmount)) | |
141 | 143 | then $Tuple2(quotient, remainingAmount) | |
142 | 144 | else $Tuple2(quotient, 0) | |
143 | 145 | } | |
144 | 146 | ||
145 | 147 | ||
146 | 148 | func distributeAdditionalTokens (swaps,diff) = { | |
147 | 149 | let totalSwaps = size(swaps) | |
148 | - | let $ | |
149 | - | let quotient = $ | |
150 | - | let remainingAmount = $ | |
150 | + | let $t079978080 = calcExcessAmountPerCfmmPositive(diff, totalSwaps) | |
151 | + | let quotient = $t079978080._1 | |
152 | + | let remainingAmount = $t079978080._2 | |
151 | 153 | func adjustAmounts (accum,next) = { | |
152 | - | let $ | |
153 | - | let adjustedSwaps = $ | |
154 | - | let remainingDiff = $ | |
154 | + | let $t081538195 = accum | |
155 | + | let adjustedSwaps = $t081538195._1 | |
156 | + | let remainingDiff = $t081538195._2 | |
155 | 157 | let item = splitCfmmJson(next) | |
156 | 158 | let inputAmount = parseInt(item[2]) | |
157 | 159 | match inputAmount { | |
158 | 160 | case input: Int => | |
159 | 161 | let amountToAdjust = if ((remainingDiff > 0)) | |
160 | 162 | then ((input + quotient) + 1) | |
161 | 163 | else (input + quotient) | |
162 | 164 | let newItem = ((((item[0] + "/") + item[1]) + "/") + toString(amountToAdjust)) | |
163 | 165 | let newRemainingDiff = if ((remainingDiff > 0)) | |
164 | 166 | then (remainingDiff - 1) | |
165 | 167 | else remainingDiff | |
166 | 168 | $Tuple2((adjustedSwaps :+ newItem), newRemainingDiff) | |
167 | 169 | case _ => | |
168 | 170 | throw("Input has wrong datatype!") | |
169 | 171 | } | |
170 | 172 | } | |
171 | 173 | ||
172 | 174 | let result = { | |
173 | 175 | let $l = swaps | |
174 | 176 | let $s = size($l) | |
175 | 177 | let $acc0 = $Tuple2(nil, remainingAmount) | |
176 | 178 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
177 | 179 | then $a | |
178 | 180 | else adjustAmounts($a, $l[$i]) | |
179 | 181 | ||
180 | 182 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
181 | 183 | then $a | |
182 | 184 | else throw("List size exceeds 40") | |
183 | 185 | ||
184 | 186 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40) | |
185 | 187 | } | |
186 | 188 | result._1 | |
187 | 189 | } | |
188 | 190 | ||
189 | 191 | ||
190 | 192 | func distributeRemainingDiffs (remainingDiff,swaps) = { | |
191 | 193 | func distributeProportional (accum,next) = { | |
192 | - | let $ | |
193 | - | let adjustedSwaps = $ | |
194 | - | let remainDiff = $ | |
194 | + | let $t090719110 = accum | |
195 | + | let adjustedSwaps = $t090719110._1 | |
196 | + | let remainDiff = $t090719110._2 | |
195 | 197 | let item = splitCfmmJson(next) | |
196 | 198 | let inputAmount = parseInt(item[2]) | |
197 | 199 | let inputAmountCheck = match inputAmount { | |
198 | 200 | case input: Int => | |
199 | 201 | input | |
200 | 202 | case _ => | |
201 | 203 | throw("Input amount has the wrong data type") | |
202 | 204 | } | |
203 | 205 | let maxSubtractable = if ((inputAmountCheck > 4)) | |
204 | 206 | then fraction(inputAmountCheck, 3, 4) | |
205 | 207 | else 0 | |
206 | - | let $ | |
208 | + | let $t0950810122 = if (if ((remainDiff == 0)) | |
207 | 209 | then true | |
208 | 210 | else (maxSubtractable == 0)) | |
209 | 211 | then $Tuple2(remainDiff, 0) | |
210 | 212 | else if (((remainDiff + maxSubtractable) > 0)) | |
211 | 213 | then { | |
212 | 214 | let remainingSubtractable = (remainDiff + maxSubtractable) | |
213 | 215 | $Tuple2(0, (maxSubtractable - remainingSubtractable)) | |
214 | 216 | } | |
215 | 217 | else if ((0 > (remainDiff + maxSubtractable))) | |
216 | 218 | then $Tuple2((remainDiff + maxSubtractable), maxSubtractable) | |
217 | 219 | else $Tuple2(0, maxSubtractable) | |
218 | - | let newRemainingDiff = $ | |
219 | - | let subtractableAmount = $ | |
220 | + | let newRemainingDiff = $t0950810122._1 | |
221 | + | let subtractableAmount = $t0950810122._2 | |
220 | 222 | let amountToAdjust = (inputAmountCheck - subtractableAmount) | |
221 | 223 | let newItem = ((((item[0] + "/") + item[1]) + "/") + toString(amountToAdjust)) | |
222 | 224 | $Tuple2((adjustedSwaps :+ newItem), newRemainingDiff) | |
223 | 225 | } | |
224 | 226 | ||
225 | 227 | let $l = swaps | |
226 | 228 | let $s = size($l) | |
227 | 229 | let $acc0 = $Tuple2(nil, remainingDiff) | |
228 | 230 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
229 | 231 | then $a | |
230 | 232 | else distributeProportional($a, $l[$i]) | |
231 | 233 | ||
232 | 234 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
233 | 235 | then $a | |
234 | 236 | else throw("List size exceeds 40") | |
235 | 237 | ||
236 | 238 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40) | |
237 | 239 | } | |
238 | 240 | ||
239 | 241 | ||
240 | 242 | func distributeNegativeTokens (swaps,diff) = { | |
241 | 243 | let totalSwaps = size(swaps) | |
242 | - | let $ | |
243 | - | let quotient = $ | |
244 | - | let remainingAmount = $ | |
244 | + | let $t01048710570 = calcExcessAmountPerCfmmNegative(diff, totalSwaps) | |
245 | + | let quotient = $t01048710570._1 | |
246 | + | let remainingAmount = $t01048710570._2 | |
245 | 247 | func adjustAmounts (accum,next) = { | |
246 | - | let $ | |
247 | - | let adjustedSwaps = $ | |
248 | - | let remainingDiff = $ | |
248 | + | let $t01064310685 = accum | |
249 | + | let adjustedSwaps = $t01064310685._1 | |
250 | + | let remainingDiff = $t01064310685._2 | |
249 | 251 | let item = splitCfmmJson(next) | |
250 | 252 | let inputAmount = parseInt(item[2]) | |
251 | 253 | match inputAmount { | |
252 | 254 | case input: Int => | |
253 | - | let $ | |
255 | + | let $t01082211172 = if (((input + quotient) >= 1)) | |
254 | 256 | then if (if ((remainingDiff > 0)) | |
255 | 257 | then (((input + quotient) - 1) >= 1) | |
256 | 258 | else false) | |
257 | 259 | then $Tuple2(((input + quotient) - 1), (remainingDiff - 1)) | |
258 | 260 | else $Tuple2((input + quotient), remainingDiff) | |
259 | 261 | else $Tuple2(input, (remainingDiff + quotient)) | |
260 | - | let amountToAdjust = $ | |
261 | - | let newRemainingDiff = $ | |
262 | + | let amountToAdjust = $t01082211172._1 | |
263 | + | let newRemainingDiff = $t01082211172._2 | |
262 | 264 | let newItem = ((((item[0] + "/") + item[1]) + "/") + toString(amountToAdjust)) | |
263 | 265 | $Tuple2((adjustedSwaps :+ newItem), newRemainingDiff) | |
264 | 266 | case _ => | |
265 | 267 | throw("Input has wrong datatype!") | |
266 | 268 | } | |
267 | 269 | } | |
268 | 270 | ||
269 | - | let $ | |
271 | + | let $t01137111462 = { | |
270 | 272 | let $l = swaps | |
271 | 273 | let $s = size($l) | |
272 | 274 | let $acc0 = $Tuple2(nil, remainingAmount) | |
273 | 275 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
274 | 276 | then $a | |
275 | 277 | else adjustAmounts($a, $l[$i]) | |
276 | 278 | ||
277 | 279 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
278 | 280 | then $a | |
279 | 281 | else throw("List size exceeds 40") | |
280 | 282 | ||
281 | 283 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40) | |
282 | 284 | } | |
283 | - | let adjustedSwaps = $ | |
284 | - | let remainingDiffs = $ | |
285 | - | let $ | |
286 | - | let finalSwaps = $ | |
287 | - | let diffs = $ | |
285 | + | let adjustedSwaps = $t01137111462._1 | |
286 | + | let remainingDiffs = $t01137111462._2 | |
287 | + | let $t01146611546 = distributeRemainingDiffs(remainingDiffs, adjustedSwaps) | |
288 | + | let finalSwaps = $t01146611546._1 | |
289 | + | let diffs = $t01146611546._2 | |
288 | 290 | finalSwaps | |
289 | 291 | } | |
290 | 292 | ||
291 | 293 | ||
292 | 294 | func handleSecondInputAmount (predeterminedAmount,availableAmount,swaps) = { | |
293 | 295 | let diff = (availableAmount - predeterminedAmount) | |
294 | 296 | let adjustedSwaps = if ((diff > 0)) | |
295 | 297 | then distributeAdditionalTokens(swaps, diff) | |
296 | 298 | else if ((0 > diff)) | |
297 | 299 | then distributeNegativeTokens(swaps, diff) | |
298 | 300 | else swaps | |
299 | 301 | adjustedSwaps | |
300 | 302 | } | |
301 | 303 | ||
302 | 304 | ||
303 | 305 | @Callable(i) | |
304 | 306 | func setup () = if (!(isDefined(getString(this, "admin")))) | |
305 | 307 | then [writeString("admin", toBase58String(i.caller.bytes))] | |
306 | 308 | else throw("Dapp already setup!") | |
307 | 309 | ||
308 | 310 | ||
309 | 311 | ||
310 | 312 | @Callable(i) | |
311 | 313 | func basicArb (startAmount,secondAmountIn,firstToken,secondToken,firstSwap,secondSwap) = if (isAdmin(i.caller.bytes)) | |
312 | 314 | then { | |
313 | 315 | let availableAmountFirstToken = if ((firstToken == "WAVES")) | |
314 | 316 | then { | |
315 | 317 | let balance = wavesBalance(this) | |
316 | 318 | balance.available | |
317 | 319 | } | |
318 | 320 | else { | |
319 | 321 | let firstTokenId = { | |
320 | 322 | let tId = fromBase58String(firstToken) | |
321 | 323 | match tId { | |
322 | 324 | case tId: ByteVector => | |
323 | 325 | tId | |
324 | 326 | case _ => | |
325 | 327 | throw("Invalid datatype") | |
326 | 328 | } | |
327 | 329 | } | |
328 | 330 | assetBalance(this, firstTokenId) | |
329 | 331 | } | |
330 | 332 | if ((availableAmountFirstToken >= startAmount)) | |
331 | 333 | then { | |
332 | 334 | let firstResult = processCfmms(firstSwap, firstToken, secondToken) | |
333 | 335 | let secondSwaps = if ((firstResult == secondAmountIn)) | |
334 | 336 | then secondSwap | |
335 | 337 | else handleSecondInputAmount(secondAmountIn, firstResult, secondSwap) | |
336 | 338 | let secondResult = processCfmms(secondSwaps, secondToken, firstToken) | |
337 | 339 | if ((secondResult > startAmount)) | |
338 | - | then $Tuple2( | |
340 | + | then $Tuple2([writeInteger(("ArbResult_" + toString(arbCounter)), (secondResult - startAmount)), writeString(("ArbResult Token_" + toString(arbCounter)), firstToken), writeInteger("arbCounter", (arbCounter + 1))], (secondResult - startAmount)) | |
339 | 341 | else throw(((("Trade was not profitable! Input amount: " + toString(startAmount)) + " Output amount: ") + toString(secondResult))) | |
340 | 342 | } | |
341 | 343 | else throw("Available input amount is not sufficient!") | |
342 | 344 | } | |
343 | 345 | else throw("Address does not match with admin address!") | |
344 | 346 | ||
345 | 347 | ||
346 | 348 | ||
347 | 349 | @Callable(i) | |
348 | 350 | func updateStringEntry (key,stringValue) = if (isAdmin(i.caller.bytes)) | |
349 | 351 | then [writeString(key, stringValue)] | |
350 | 352 | else throw("Address does not match with admin address!") | |
351 | 353 | ||
352 | 354 | ||
353 | 355 | ||
354 | 356 | @Callable(i) | |
355 | 357 | func updateIntegerEntry (key,integerValue) = if (isAdmin(i.caller.bytes)) | |
356 | 358 | then [writeInteger(key, integerValue)] | |
357 | 359 | else throw("Address does not match with admin address!") | |
358 | 360 | ||
359 | 361 | ||
360 | 362 | ||
361 | 363 | @Callable(i) | |
362 | 364 | func deleteStorageEntry (key) = if (isAdmin(i.caller.bytes)) | |
363 | 365 | then [DeleteEntry(key)] | |
364 | 366 | else throw("Address does not match with admin address!") | |
365 | 367 | ||
366 | 368 | ||
367 | 369 | @Verifier(tx) | |
368 | 370 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
369 | 371 |
github/deemru/w8io/3ef1775 75.46 ms ◑