tx · 3rYKZE4t4NBdYai78q2yPzKoePBRbGnGYdU4z74m5jwD

3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT:  -0.01000000 Waves

2023.05.28 13:29 [3663238] smart account 3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT > SELF 0.00000000 Waves

{ "type": 13, "id": "3rYKZE4t4NBdYai78q2yPzKoePBRbGnGYdU4z74m5jwD", "fee": 1000000, "feeAssetId": null, "timestamp": 1685269740787, "version": 2, "chainId": 87, "sender": "3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT", "senderPublicKey": "7kuQGHmvhzQW3ERxGyMrxfq3LuxHSJ6UdBZcuy498sf6", "proofs": [ "5mNZVCEup4j5mwzy8YgvUBnytMxtQYLtXNGCyD7VZu4rCqseD4sHTPCRtbfboQVPU83GsWHUBdnZ863qhyHKn7Gh" ], "script": "base64:BgIfCAISBAoCCAgSAwoBARIFCgMICAgSBAoCCAESAwoBCB0ADWtfaW5pdGlhbGl6ZWQCDWtfaW5pdGlhbGl6ZWQAB2tfYWRtaW4CB2tfYWRtaW4ABmtfc3RlcAIGa19zdGVwAAxrX3F1b3RlQXNzZXQCDGtfcXVvdGVBc3NldAAMa19zcG90TWFya2V0AgxrX3Nwb3RNYXJrZXQAD2tfZnV0dXJlc01hcmtldAIPa19mdXR1cmVzTWFya2V0ABNrX21pbkluY3JlYXNlU3ByZWFkAhNrX21pbkluY3JlYXNlU3ByZWFkAA5rX3Bvc2l0aW9uTG9uZwIOa19wb3NpdGlvbkxvbmcAD2tfcG9zaXRpb25TaG9ydAIPa19wb3NpdGlvblNob3J0ABBrX3Bvc2l0aW9uU3ByZWFkAhBrX3Bvc2l0aW9uU3ByZWFkAA9rX3Bvc2l0aW9uTW9uZXkCD2tfcG9zaXRpb25Nb25leQAOa19wb3NpdGlvblNpemUCDmtfcG9zaXRpb25TaXplAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAAlESVJfU0hPUlQAAgEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEMYWRtaW5BZGRyZXNzAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa19hZG1pbgENZ2V0UXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUMa19xdW90ZUFzc2V0AQ1nZXRTcG90TWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0ARBnZXRGdXR1cmVzTWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFD2tfZnV0dXJlc01hcmtldAUGX2Fzc2V0ARFtaW5JbmNyZWFzZVNwcmVhZAAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFE2tfbWluSW5jcmVhc2VTcHJlYWQBC2dldFBvc2l0aW9uAQZfYXNzZXQECGxvbmdTaXplCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25Mb25nBQZfYXNzZXQAAAMJAAACBQhsb25nU2l6ZQAACQCWCgQAAAAAAAAAAAkAlgoEBQhsb25nU2l6ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uU2hvcnQFBl9hc3NldAAACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25TcHJlYWQFBl9hc3NldAAACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFD2tfcG9zaXRpb25Nb25leQUGX2Fzc2V0AAABD2dldEFzc2V0QmFsYW5jZQEGX2Fzc2V0AwkAAAIFBl9hc3NldAIFV0FWRVMICQDvBwEFBHRoaXMHcmVndWxhcgkA8AcCBQR0aGlzCQDZBAEFBl9hc3NldAEKZ2V0QXNzZXRJZAEGX2Fzc2V0AwkAAAIFBl9hc3NldAIFV0FWRVMFBHVuaXQJANkEAQUGX2Fzc2V0AQlub3JtYWxpemUCB19hbW91bnQGX2Fzc2V0BAhkZWNpbWFscwMJAAACBQZfYXNzZXQCBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQUGX2Fzc2V0CGRlY2ltYWxzAwkAAAIFCGRlY2ltYWxzAAgJAGkCBQdfYW1vdW50AGQDCQAAAgUIZGVjaW1hbHMABgUHX2Ftb3VudAkAAgECGkludmFsaWQgZGVjaW1hbHMgZm9yIGFzc2V0AQtkZU5vcm1hbGl6ZQIHX2Ftb3VudAZfYXNzZXQECGRlY2ltYWxzAwkAAAIFBl9hc3NldAIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQZfYXNzZXQIZGVjaW1hbHMDCQAAAgUIZGVjaW1hbHMACAkAaAIFB19hbW91bnQAZAMJAAACBQhkZWNpbWFscwAGBQdfYW1vdW50CQACAQIaSW52YWxpZCBkZWNpbWFscyBmb3IgYXNzZXQBDnVwZGF0ZVBvc2l0aW9uBQZfYXNzZXQMX25ld0xvbmdTaXplDV9uZXdTaG9ydFNpemUNX25ld0F2Z1NwcmVhZA5fbmV3TW9uZXlTcGVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvbkxvbmcFBl9hc3NldAUMX25ld0xvbmdTaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uU2hvcnQFBl9hc3NldAUNX25ld1Nob3J0U2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvblNwcmVhZAUGX2Fzc2V0BQ1fbmV3QXZnU3ByZWFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uTW9uZXkFBl9hc3NldAUOX25ld01vbmV5U3BlbnQFA25pbAEOZGVsZXRlUG9zaXRpb24BBl9hc3NldAkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uTG9uZwUGX2Fzc2V0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFD2tfcG9zaXRpb25TaG9ydAUGX2Fzc2V0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25TcHJlYWQFBl9hc3NldAkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uTW9uZXkFBl9hc3NldAUDbmlsBQFpAQppbml0aWFsaXplAgZfYWRtaW4LX3F1b3RlQXNzZXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlJbnZhbGlkIGluaXRpYWxpemUgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tfYWRtaW4FBl9hZG1pbgkAzAgCCQELU3RyaW5nRW50cnkCBQxrX3F1b3RlQXNzZXQFC19xdW90ZUFzc2V0BQNuaWwBaQEOY2hhbmdlU2V0dGluZ3MBEl9taW5JbmNyZWFzZVNwcmVhZAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIGNoYW5nZVNldHRpbmdzIHBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa19taW5JbmNyZWFzZVNwcmVhZAUSX21pbkluY3JlYXNlU3ByZWFkBQNuaWwBaQEJYWRkTWFya2V0AwZfYXNzZXQLX3Nwb3RNYXJrZXQOX2Z1dHVyZXNNYXJrZXQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIYSW52YWxpZCBhZGRNYXJrZXQgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0BQtfc3BvdE1hcmtldAkAzAgCCQELU3RyaW5nRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX2Z1dHVyZXNNYXJrZXQFBl9hc3NldAUOX2Z1dHVyZXNNYXJrZXQFA25pbAFpARBpbmNyZWFzZVBvc2l0aW9uAgZfYXNzZXQPX3F1b3RlQXNzZXRTdGVwBApxdW90ZUFzc2V0CQENZ2V0UXVvdGVBc3NldAAECnNwb3RNYXJrZXQJAQ1nZXRTcG90TWFya2V0AQUGX2Fzc2V0BAthc3NldEJlZm9yZQkBD2dldEFzc2V0QmFsYW5jZQEFBl9hc3NldAMJAAACBQthc3NldEJlZm9yZQULYXNzZXRCZWZvcmUEB2J1eVNwb3QJAPwHBAUKc3BvdE1hcmtldAIEc3dhcAkAzAgCAAAJAMwIAgUGX2Fzc2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpxdW90ZUFzc2V0BQ9fcXVvdGVBc3NldFN0ZXAFA25pbAMJAAACBQdidXlTcG90BQdidXlTcG90BAphc3NldEFmdGVyCQEPZ2V0QXNzZXRCYWxhbmNlAQUGX2Fzc2V0AwkAAAIFCmFzc2V0QWZ0ZXIFCmFzc2V0QWZ0ZXIEC2Fzc2V0Qm91Z2h0CQBlAgUKYXNzZXRBZnRlcgULYXNzZXRCZWZvcmUED2Fzc2V0Qm91Z2h0Tm9ybQkBCW5vcm1hbGl6ZQIFC2Fzc2V0Qm91Z2h0BQZfYXNzZXQEEGJ1eVByaWNlTm9ybUZhY3QJAQRkaXZkAgUPX3F1b3RlQXNzZXRTdGVwBQ9hc3NldEJvdWdodE5vcm0EDWZ1dHVyZXNNYXJrZXQJARBnZXRGdXR1cmVzTWFya2V0AQUGX2Fzc2V0BAtwb3NpdGlvbktleQkArAICCQCsAgIJAKUIAQUEdGhpcwIBXwkApAMBBQlESVJfU0hPUlQED3Bvc2l0aW9uRnVsbEtleQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFC3Bvc2l0aW9uS2V5BBRhc3NldFNob3J0Tm9ybUJlZm9yZQkBAS0BCQELdmFsdWVPckVsc2UCCQCaCAIFDWZ1dHVyZXNNYXJrZXQFD3Bvc2l0aW9uRnVsbEtleQAAAwkAAAIFFGFzc2V0U2hvcnROb3JtQmVmb3JlBRRhc3NldFNob3J0Tm9ybUJlZm9yZQQMc2hvcnRGdXR1cmVzCQD8BwQFDWZ1dHVyZXNNYXJrZXQCEGluY3JlYXNlUG9zaXRpb24JAMwIAgUJRElSX1NIT1JUCQDMCAIFDERFQ0lNQUxfVU5JVAkAzAgCAAAJAMwIAgIACQDMCAICAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpxdW90ZUFzc2V0BQ9fcXVvdGVBc3NldFN0ZXAFA25pbAMJAAACBQxzaG9ydEZ1dHVyZXMFDHNob3J0RnV0dXJlcwQTYXNzZXRTaG9ydE5vcm1BZnRlcgkBAS0BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1mdXR1cmVzTWFya2V0BQ9wb3NpdGlvbkZ1bGxLZXkDCQAAAgUTYXNzZXRTaG9ydE5vcm1BZnRlcgUTYXNzZXRTaG9ydE5vcm1BZnRlcgQOYXNzZXRTaG9ydE5vcm0JAGUCBRNhc3NldFNob3J0Tm9ybUFmdGVyBRRhc3NldFNob3J0Tm9ybUJlZm9yZQQSc2hvcnRQcmljZU5vcm1GYWN0CQEEZGl2ZAIFD19xdW90ZUFzc2V0U3RlcAUOYXNzZXRTaG9ydE5vcm0ECnNwcmVhZEZhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgUQYnV5UHJpY2VOb3JtRmFjdAUSc2hvcnRQcmljZU5vcm1GYWN0BAltaW5TcHJlYWQJARFtaW5JbmNyZWFzZVNwcmVhZAADCQBmAgUKc3ByZWFkRmFjdAUJbWluU3ByZWFkBAskdDA2MTk4NjI2OAkBC2dldFBvc2l0aW9uAQUGX2Fzc2V0BAhsb25nU2l6ZQgFCyR0MDYxOTg2MjY4Al8xBAlzaG9ydFNpemUIBQskdDA2MTk4NjI2OAJfMgQJYXZnU3ByZWFkCAULJHQwNjE5ODYyNjgCXzMECm1vbmV5U3BlbnQIBQskdDA2MTk4NjI2OAJfNAQLbmV3TG9uZ1NpemUJAGQCBQhsb25nU2l6ZQUPYXNzZXRCb3VnaHROb3JtBAxuZXdTaG9ydFNpemUJAGQCBQlzaG9ydFNpemUFDmFzc2V0U2hvcnROb3JtBAxuZXdBdmdTcHJlYWQJAQRkaXZkAgkAZAIJAQRtdWxkAgUJYXZnU3ByZWFkCQBkAgUIbG9uZ1NpemUFCXNob3J0U2l6ZQkBBG11bGQCBQpzcHJlYWRGYWN0CQBkAgUPYXNzZXRCb3VnaHROb3JtBQ5hc3NldFNob3J0Tm9ybQkAZAIJAGQCCQBkAgUIbG9uZ1NpemUFCXNob3J0U2l6ZQUPYXNzZXRCb3VnaHROb3JtBQ5hc3NldFNob3J0Tm9ybQQNbmV3TW9uZXlTcGVudAkAZAIFCm1vbmV5U3BlbnQJAGgCBQ9fcXVvdGVBc3NldFN0ZXAAAgkBDnVwZGF0ZVBvc2l0aW9uBQUGX2Fzc2V0BQtuZXdMb25nU2l6ZQUMbmV3U2hvcnRTaXplBQxuZXdBdmdTcHJlYWQFDW5ld01vbmV5U3BlbnQEBGRhdGEJAMwIAgkApAMBBQ9hc3NldEJvdWdodE5vcm0JAMwIAgkApAMBBRBidXlQcmljZU5vcm1GYWN0CQDMCAIJAKQDAQUOYXNzZXRTaG9ydE5vcm0JAMwIAgkApAMBBRJzaG9ydFByaWNlTm9ybUZhY3QJAMwIAgkApAMBBQpzcHJlYWRGYWN0CQDMCAIJAKQDAQUJbWluU3ByZWFkBQNuaWwJAAIBCQCsAgICEEludmFsaWQgc3ByZWFkOiAJALkJAgUEZGF0YQIBLAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1jbG9zZVBvc2l0aW9uAQZfYXNzZXQECnF1b3RlQXNzZXQJAQ1nZXRRdW90ZUFzc2V0AAQNcXVvdGVBc3NldFN0cgkA2AQBBQpxdW90ZUFzc2V0BApzcG90TWFya2V0CQENZ2V0U3BvdE1hcmtldAEFBl9hc3NldAQLJHQwNzI0MDczMTAJAQtnZXRQb3NpdGlvbgEFBl9hc3NldAQIbG9uZ1NpemUIBQskdDA3MjQwNzMxMAJfMQQJc2hvcnRTaXplCAULJHQwNzI0MDczMTACXzIECWF2Z1NwcmVhZAgFCyR0MDcyNDA3MzEwAl8zBAptb25leVNwZW50CAULJHQwNzI0MDczMTACXzQEEHF1b3RlQXNzZXRCZWZvcmUJAQ9nZXRBc3NldEJhbGFuY2UBBQ1xdW90ZUFzc2V0U3RyAwkAAAIFEHF1b3RlQXNzZXRCZWZvcmUFEHF1b3RlQXNzZXRCZWZvcmUECHNlbGxTcG90CQD8BwQFCnNwb3RNYXJrZXQCBHN3YXAJAMwIAgAACQDMCAIFDXF1b3RlQXNzZXRTdHIJAMwIAgkApQgBBQR0aGlzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpnZXRBc3NldElkAQUGX2Fzc2V0CQELZGVOb3JtYWxpemUCBQhsb25nU2l6ZQUGX2Fzc2V0BQNuaWwDCQAAAgUIc2VsbFNwb3QFCHNlbGxTcG90BA9xdW90ZUFzc2V0QWZ0ZXIJAQ9nZXRBc3NldEJhbGFuY2UBBQ1xdW90ZUFzc2V0U3RyAwkAAAIFD3F1b3RlQXNzZXRBZnRlcgUPcXVvdGVBc3NldEFmdGVyBAxhc3NldFNvbGRGb3IJAGUCBQ9xdW90ZUFzc2V0QWZ0ZXIFEHF1b3RlQXNzZXRCZWZvcmUEEGFzc2V0U29sZEZvck5vcm0JAQlub3JtYWxpemUCBQxhc3NldFNvbGRGb3IFDXF1b3RlQXNzZXRTdHIEEXNlbGxQcmljZU5vcm1GYWN0CQEEZGl2ZAIFEGFzc2V0U29sZEZvck5vcm0FCGxvbmdTaXplBA1mdXR1cmVzTWFya2V0CQEQZ2V0RnV0dXJlc01hcmtldAEFBl9hc3NldAQRcXVvdGVBc3NldEJlZm9yZTIJAQ9nZXRBc3NldEJhbGFuY2UBBQ1xdW90ZUFzc2V0U3RyAwkAAAIFEXF1b3RlQXNzZXRCZWZvcmUyBRFxdW90ZUFzc2V0QmVmb3JlMgQRY2xvc2VTaG9ydEZ1dHVyZXMJAPwHBAUNZnV0dXJlc01hcmtldAINY2xvc2VQb3NpdGlvbgkAzAgCBQlzaG9ydFNpemUJAMwIAgUJRElSX1NIT1JUCQDMCAIAAAkAzAgCBwkAzAgCAgAFA25pbAUDbmlsAwkAAAIFEWNsb3NlU2hvcnRGdXR1cmVzBRFjbG9zZVNob3J0RnV0dXJlcwQQcXVvdGVBc3NldEFmdGVyMgkBD2dldEFzc2V0QmFsYW5jZQEFDXF1b3RlQXNzZXRTdHIDCQAAAgUQcXVvdGVBc3NldEFmdGVyMgUQcXVvdGVBc3NldEFmdGVyMgQOc2hvcnRDbG9zZWRGb3IJAGUCBRBxdW90ZUFzc2V0QWZ0ZXIyBRFxdW90ZUFzc2V0QmVmb3JlMgQSc2hvcnRQcmljZU5vcm1GYWN0CQEEZGl2ZAIFDnNob3J0Q2xvc2VkRm9yBQlzaG9ydFNpemUECG1vbmV5R290CQBkAgUOc2hvcnRDbG9zZWRGb3IFDGFzc2V0U29sZEZvcgMJAGYCBQhtb25leUdvdAUKbW9uZXlTcGVudAkBDmRlbGV0ZVBvc2l0aW9uAQUGX2Fzc2V0BARkYXRhCQDMCAIJAKQDAQUQYXNzZXRTb2xkRm9yTm9ybQkAzAgCCQCkAwEFEXNlbGxQcmljZU5vcm1GYWN0CQDMCAIJAKQDAQUOc2hvcnRDbG9zZWRGb3IJAMwIAgkApAMBBRJzaG9ydFByaWNlTm9ybUZhY3QJAMwIAgkApAMBBQhtb25leUdvdAkAzAgCCQCkAwEFCm1vbmV5U3BlbnQFA25pbAkAAgEJAKwCAgIaSW52YWxpZCBzcHJlYWQgZm9yIGNsb3NlOiAJALkJAgUEZGF0YQIBLAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgDB7M3U", "height": 3663238, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4ys7oSUFgxcDsjzHNdXzfrNnDbnBGK1A2dCeLeeYqxfb Next: none Diff:
OldNewDifferences
139139 let assetBoughtNorm = normalize(assetBought, _asset)
140140 let buyPriceNormFact = divd(_quoteAssetStep, assetBoughtNorm)
141141 let futuresMarket = getFuturesMarket(_asset)
142- let shortFutures = invoke(futuresMarket, "increasePosition", [DIR_SHORT, DECIMAL_UNIT, 0, "", ""], [AttachedPayment(quoteAsset, _quoteAssetStep)])
143- if ((shortFutures == shortFutures))
142+ let positionKey = ((toString(this) + "_") + toString(DIR_SHORT))
143+ let positionFullKey = toCompositeKey(k_positionSize, positionKey)
144+ let assetShortNormBefore = -(valueOrElse(getInteger(futuresMarket, positionFullKey), 0))
145+ if ((assetShortNormBefore == assetShortNormBefore))
144146 then {
145- let positionKey = ((toString(this) + "_") + toString(DIR_SHORT))
146- let positionFullKey = toCompositeKey(k_positionSize, positionKey)
147- let assetShortNorm = -(getIntegerValue(futuresMarket, positionFullKey))
148- let shortPriceNormFact = divd(_quoteAssetStep, assetShortNorm)
149- let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
150- let minSpread = minIncreaseSpread()
151- if ((spreadFact > minSpread))
147+ let shortFutures = invoke(futuresMarket, "increasePosition", [DIR_SHORT, DECIMAL_UNIT, 0, "", ""], [AttachedPayment(quoteAsset, _quoteAssetStep)])
148+ if ((shortFutures == shortFutures))
152149 then {
153- let $t060306100 = getPosition(_asset)
154- let longSize = $t060306100._1
155- let shortSize = $t060306100._2
156- let avgSpread = $t060306100._3
157- let moneySpent = $t060306100._4
158- let newLongSize = (longSize + assetBoughtNorm)
159- let newShortSize = (shortSize + assetShortNorm)
160- let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
161- let newMoneySpent = (moneySpent + (_quoteAssetStep * 2))
162- updatePosition(_asset, newLongSize, newShortSize, newAvgSpread, newMoneySpent)
150+ let assetShortNormAfter = -(getIntegerValue(futuresMarket, positionFullKey))
151+ if ((assetShortNormAfter == assetShortNormAfter))
152+ then {
153+ let assetShortNorm = (assetShortNormAfter - assetShortNormBefore)
154+ let shortPriceNormFact = divd(_quoteAssetStep, assetShortNorm)
155+ let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
156+ let minSpread = minIncreaseSpread()
157+ if ((spreadFact > minSpread))
158+ then {
159+ let $t061986268 = getPosition(_asset)
160+ let longSize = $t061986268._1
161+ let shortSize = $t061986268._2
162+ let avgSpread = $t061986268._3
163+ let moneySpent = $t061986268._4
164+ let newLongSize = (longSize + assetBoughtNorm)
165+ let newShortSize = (shortSize + assetShortNorm)
166+ let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
167+ let newMoneySpent = (moneySpent + (_quoteAssetStep * 2))
168+ updatePosition(_asset, newLongSize, newShortSize, newAvgSpread, newMoneySpent)
169+ }
170+ else {
171+ let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
172+ throw(("Invalid spread: " + makeString(data, ",")))
173+ }
174+ }
175+ else throw("Strict value is not equal to itself.")
163176 }
164- else {
165- let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
166- throw(("Invalid spread: " + makeString(data, ",")))
167- }
177+ else throw("Strict value is not equal to itself.")
168178 }
169179 else throw("Strict value is not equal to itself.")
170180 }
182192 let quoteAsset = getQuoteAsset()
183193 let quoteAssetStr = toBase58String(quoteAsset)
184194 let spotMarket = getSpotMarket(_asset)
185- let $t070727142 = getPosition(_asset)
186- let longSize = $t070727142._1
187- let shortSize = $t070727142._2
188- let avgSpread = $t070727142._3
189- let moneySpent = $t070727142._4
195+ let $t072407310 = getPosition(_asset)
196+ let longSize = $t072407310._1
197+ let shortSize = $t072407310._2
198+ let avgSpread = $t072407310._3
199+ let moneySpent = $t072407310._4
190200 let quoteAssetBefore = getAssetBalance(quoteAssetStr)
191201 if ((quoteAssetBefore == quoteAssetBefore))
192202 then {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_initialized = "k_initialized"
55
66 let k_admin = "k_admin"
77
88 let k_step = "k_step"
99
1010 let k_quoteAsset = "k_quoteAsset"
1111
1212 let k_spotMarket = "k_spotMarket"
1313
1414 let k_futuresMarket = "k_futuresMarket"
1515
1616 let k_minIncreaseSpread = "k_minIncreaseSpread"
1717
1818 let k_positionLong = "k_positionLong"
1919
2020 let k_positionShort = "k_positionShort"
2121
2222 let k_positionSpread = "k_positionSpread"
2323
2424 let k_positionMoney = "k_positionMoney"
2525
2626 let k_positionSize = "k_positionSize"
2727
2828 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
2929
3030 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
3131
3232
3333 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
3434
3535
3636 let DIR_SHORT = 2
3737
3838 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
3939
4040
4141 func adminAddress () = addressFromStringValue(getStringValue(this, k_admin))
4242
4343
4444 func getQuoteAsset () = fromBase58String(getStringValue(this, k_quoteAsset))
4545
4646
4747 func getSpotMarket (_asset) = addressFromStringValue(getStringValue(this, toCompositeKey(k_spotMarket, _asset)))
4848
4949
5050 func getFuturesMarket (_asset) = addressFromStringValue(getStringValue(this, toCompositeKey(k_futuresMarket, _asset)))
5151
5252
5353 func minIncreaseSpread () = getIntegerValue(this, k_minIncreaseSpread)
5454
5555
5656 func getPosition (_asset) = {
5757 let longSize = valueOrElse(getInteger(this, toCompositeKey(k_positionLong, _asset)), 0)
5858 if ((longSize == 0))
5959 then $Tuple4(0, 0, 0, 0)
6060 else $Tuple4(longSize, valueOrElse(getInteger(this, toCompositeKey(k_positionShort, _asset)), 0), valueOrElse(getInteger(this, toCompositeKey(k_positionSpread, _asset)), 0), valueOrElse(getInteger(this, toCompositeKey(k_positionMoney, _asset)), 0))
6161 }
6262
6363
6464 func getAssetBalance (_asset) = if ((_asset == "WAVES"))
6565 then wavesBalance(this).regular
6666 else assetBalance(this, fromBase58String(_asset))
6767
6868
6969 func getAssetId (_asset) = if ((_asset == "WAVES"))
7070 then unit
7171 else fromBase58String(_asset)
7272
7373
7474 func normalize (_amount,_asset) = {
7575 let decimals = if ((_asset == "WAVES"))
7676 then 8
7777 else value(assetInfo(fromBase58String(_asset))).decimals
7878 if ((decimals == 8))
7979 then (_amount / 100)
8080 else if ((decimals == 6))
8181 then _amount
8282 else throw("Invalid decimals for asset")
8383 }
8484
8585
8686 func deNormalize (_amount,_asset) = {
8787 let decimals = if ((_asset == "WAVES"))
8888 then 8
8989 else value(assetInfo(fromBase58String(_asset))).decimals
9090 if ((decimals == 8))
9191 then (_amount * 100)
9292 else if ((decimals == 6))
9393 then _amount
9494 else throw("Invalid decimals for asset")
9595 }
9696
9797
9898 func updatePosition (_asset,_newLongSize,_newShortSize,_newAvgSpread,_newMoneySpent) = [IntegerEntry(toCompositeKey(k_positionLong, _asset), _newLongSize), IntegerEntry(toCompositeKey(k_positionShort, _asset), _newShortSize), IntegerEntry(toCompositeKey(k_positionSpread, _asset), _newAvgSpread), IntegerEntry(toCompositeKey(k_positionMoney, _asset), _newMoneySpent)]
9999
100100
101101 func deletePosition (_asset) = [DeleteEntry(toCompositeKey(k_positionLong, _asset)), DeleteEntry(toCompositeKey(k_positionShort, _asset)), DeleteEntry(toCompositeKey(k_positionSpread, _asset)), DeleteEntry(toCompositeKey(k_positionMoney, _asset))]
102102
103103
104104 @Callable(i)
105105 func initialize (_admin,_quoteAsset) = if ((i.caller != this))
106106 then throw("Invalid initialize params")
107107 else [StringEntry(k_admin, _admin), StringEntry(k_quoteAsset, _quoteAsset)]
108108
109109
110110
111111 @Callable(i)
112112 func changeSettings (_minIncreaseSpread) = if ((i.caller != adminAddress()))
113113 then throw("Invalid changeSettings params")
114114 else [IntegerEntry(k_minIncreaseSpread, _minIncreaseSpread)]
115115
116116
117117
118118 @Callable(i)
119119 func addMarket (_asset,_spotMarket,_futuresMarket) = if ((i.caller != adminAddress()))
120120 then throw("Invalid addMarket params")
121121 else [StringEntry(toCompositeKey(k_spotMarket, _asset), _spotMarket), StringEntry(toCompositeKey(k_futuresMarket, _asset), _futuresMarket)]
122122
123123
124124
125125 @Callable(i)
126126 func increasePosition (_asset,_quoteAssetStep) = {
127127 let quoteAsset = getQuoteAsset()
128128 let spotMarket = getSpotMarket(_asset)
129129 let assetBefore = getAssetBalance(_asset)
130130 if ((assetBefore == assetBefore))
131131 then {
132132 let buySpot = invoke(spotMarket, "swap", [0, _asset, toString(this)], [AttachedPayment(quoteAsset, _quoteAssetStep)])
133133 if ((buySpot == buySpot))
134134 then {
135135 let assetAfter = getAssetBalance(_asset)
136136 if ((assetAfter == assetAfter))
137137 then {
138138 let assetBought = (assetAfter - assetBefore)
139139 let assetBoughtNorm = normalize(assetBought, _asset)
140140 let buyPriceNormFact = divd(_quoteAssetStep, assetBoughtNorm)
141141 let futuresMarket = getFuturesMarket(_asset)
142- let shortFutures = invoke(futuresMarket, "increasePosition", [DIR_SHORT, DECIMAL_UNIT, 0, "", ""], [AttachedPayment(quoteAsset, _quoteAssetStep)])
143- if ((shortFutures == shortFutures))
142+ let positionKey = ((toString(this) + "_") + toString(DIR_SHORT))
143+ let positionFullKey = toCompositeKey(k_positionSize, positionKey)
144+ let assetShortNormBefore = -(valueOrElse(getInteger(futuresMarket, positionFullKey), 0))
145+ if ((assetShortNormBefore == assetShortNormBefore))
144146 then {
145- let positionKey = ((toString(this) + "_") + toString(DIR_SHORT))
146- let positionFullKey = toCompositeKey(k_positionSize, positionKey)
147- let assetShortNorm = -(getIntegerValue(futuresMarket, positionFullKey))
148- let shortPriceNormFact = divd(_quoteAssetStep, assetShortNorm)
149- let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
150- let minSpread = minIncreaseSpread()
151- if ((spreadFact > minSpread))
147+ let shortFutures = invoke(futuresMarket, "increasePosition", [DIR_SHORT, DECIMAL_UNIT, 0, "", ""], [AttachedPayment(quoteAsset, _quoteAssetStep)])
148+ if ((shortFutures == shortFutures))
152149 then {
153- let $t060306100 = getPosition(_asset)
154- let longSize = $t060306100._1
155- let shortSize = $t060306100._2
156- let avgSpread = $t060306100._3
157- let moneySpent = $t060306100._4
158- let newLongSize = (longSize + assetBoughtNorm)
159- let newShortSize = (shortSize + assetShortNorm)
160- let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
161- let newMoneySpent = (moneySpent + (_quoteAssetStep * 2))
162- updatePosition(_asset, newLongSize, newShortSize, newAvgSpread, newMoneySpent)
150+ let assetShortNormAfter = -(getIntegerValue(futuresMarket, positionFullKey))
151+ if ((assetShortNormAfter == assetShortNormAfter))
152+ then {
153+ let assetShortNorm = (assetShortNormAfter - assetShortNormBefore)
154+ let shortPriceNormFact = divd(_quoteAssetStep, assetShortNorm)
155+ let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
156+ let minSpread = minIncreaseSpread()
157+ if ((spreadFact > minSpread))
158+ then {
159+ let $t061986268 = getPosition(_asset)
160+ let longSize = $t061986268._1
161+ let shortSize = $t061986268._2
162+ let avgSpread = $t061986268._3
163+ let moneySpent = $t061986268._4
164+ let newLongSize = (longSize + assetBoughtNorm)
165+ let newShortSize = (shortSize + assetShortNorm)
166+ let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
167+ let newMoneySpent = (moneySpent + (_quoteAssetStep * 2))
168+ updatePosition(_asset, newLongSize, newShortSize, newAvgSpread, newMoneySpent)
169+ }
170+ else {
171+ let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
172+ throw(("Invalid spread: " + makeString(data, ",")))
173+ }
174+ }
175+ else throw("Strict value is not equal to itself.")
163176 }
164- else {
165- let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
166- throw(("Invalid spread: " + makeString(data, ",")))
167- }
177+ else throw("Strict value is not equal to itself.")
168178 }
169179 else throw("Strict value is not equal to itself.")
170180 }
171181 else throw("Strict value is not equal to itself.")
172182 }
173183 else throw("Strict value is not equal to itself.")
174184 }
175185 else throw("Strict value is not equal to itself.")
176186 }
177187
178188
179189
180190 @Callable(i)
181191 func closePosition (_asset) = {
182192 let quoteAsset = getQuoteAsset()
183193 let quoteAssetStr = toBase58String(quoteAsset)
184194 let spotMarket = getSpotMarket(_asset)
185- let $t070727142 = getPosition(_asset)
186- let longSize = $t070727142._1
187- let shortSize = $t070727142._2
188- let avgSpread = $t070727142._3
189- let moneySpent = $t070727142._4
195+ let $t072407310 = getPosition(_asset)
196+ let longSize = $t072407310._1
197+ let shortSize = $t072407310._2
198+ let avgSpread = $t072407310._3
199+ let moneySpent = $t072407310._4
190200 let quoteAssetBefore = getAssetBalance(quoteAssetStr)
191201 if ((quoteAssetBefore == quoteAssetBefore))
192202 then {
193203 let sellSpot = invoke(spotMarket, "swap", [0, quoteAssetStr, toString(this)], [AttachedPayment(getAssetId(_asset), deNormalize(longSize, _asset))])
194204 if ((sellSpot == sellSpot))
195205 then {
196206 let quoteAssetAfter = getAssetBalance(quoteAssetStr)
197207 if ((quoteAssetAfter == quoteAssetAfter))
198208 then {
199209 let assetSoldFor = (quoteAssetAfter - quoteAssetBefore)
200210 let assetSoldForNorm = normalize(assetSoldFor, quoteAssetStr)
201211 let sellPriceNormFact = divd(assetSoldForNorm, longSize)
202212 let futuresMarket = getFuturesMarket(_asset)
203213 let quoteAssetBefore2 = getAssetBalance(quoteAssetStr)
204214 if ((quoteAssetBefore2 == quoteAssetBefore2))
205215 then {
206216 let closeShortFutures = invoke(futuresMarket, "closePosition", [shortSize, DIR_SHORT, 0, false, ""], nil)
207217 if ((closeShortFutures == closeShortFutures))
208218 then {
209219 let quoteAssetAfter2 = getAssetBalance(quoteAssetStr)
210220 if ((quoteAssetAfter2 == quoteAssetAfter2))
211221 then {
212222 let shortClosedFor = (quoteAssetAfter2 - quoteAssetBefore2)
213223 let shortPriceNormFact = divd(shortClosedFor, shortSize)
214224 let moneyGot = (shortClosedFor + assetSoldFor)
215225 if ((moneyGot > moneySpent))
216226 then deletePosition(_asset)
217227 else {
218228 let data = [toString(assetSoldForNorm), toString(sellPriceNormFact), toString(shortClosedFor), toString(shortPriceNormFact), toString(moneyGot), toString(moneySpent)]
219229 throw(("Invalid spread for close: " + makeString(data, ",")))
220230 }
221231 }
222232 else throw("Strict value is not equal to itself.")
223233 }
224234 else throw("Strict value is not equal to itself.")
225235 }
226236 else throw("Strict value is not equal to itself.")
227237 }
228238 else throw("Strict value is not equal to itself.")
229239 }
230240 else throw("Strict value is not equal to itself.")
231241 }
232242 else throw("Strict value is not equal to itself.")
233243 }
234244
235245

github/deemru/w8io/3ef1775 
40.49 ms