tx · 435qVExo6v5rMJvrWBdSraNkoEGDYTuuaxcybCjD6kdf

3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT:  -0.01000000 Waves

2023.05.28 13:09 [3663216] smart account 3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT > SELF 0.00000000 Waves

{ "type": 13, "id": "435qVExo6v5rMJvrWBdSraNkoEGDYTuuaxcybCjD6kdf", "fee": 1000000, "feeAssetId": null, "timestamp": 1685268669930, "version": 2, "chainId": 87, "sender": "3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT", "senderPublicKey": "7kuQGHmvhzQW3ERxGyMrxfq3LuxHSJ6UdBZcuy498sf6", "proofs": [ "5UAfawYiCKr6rb724q22TCGsekiwMsmubrJyXwgR2oNhokcsWzi1EXSCnLiMEiJ6Hai2MH7fq3XJu2chefk5y5vS" ], "script": "base64:BgIfCAISBAoCCAgSAwoBARIFCgMICAgSBAoCCAESAwoBCB0ADWtfaW5pdGlhbGl6ZWQCDWtfaW5pdGlhbGl6ZWQAB2tfYWRtaW4CB2tfYWRtaW4ABmtfc3RlcAIGa19zdGVwAAxrX3F1b3RlQXNzZXQCDGtfcXVvdGVBc3NldAAMa19zcG90TWFya2V0AgxrX3Nwb3RNYXJrZXQAD2tfZnV0dXJlc01hcmtldAIPa19mdXR1cmVzTWFya2V0ABNrX21pbkluY3JlYXNlU3ByZWFkAhNrX21pbkluY3JlYXNlU3ByZWFkAA5rX3Bvc2l0aW9uTG9uZwIOa19wb3NpdGlvbkxvbmcAD2tfcG9zaXRpb25TaG9ydAIPa19wb3NpdGlvblNob3J0ABBrX3Bvc2l0aW9uU3ByZWFkAhBrX3Bvc2l0aW9uU3ByZWFkAA9rX3Bvc2l0aW9uTW9uZXkCD2tfcG9zaXRpb25Nb25leQAOa19wb3NpdGlvblNpemUCDmtfcG9zaXRpb25TaXplAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAAlESVJfU0hPUlQAAgEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEMYWRtaW5BZGRyZXNzAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa19hZG1pbgENZ2V0UXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUMa19xdW90ZUFzc2V0AQ1nZXRTcG90TWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0ARBnZXRGdXR1cmVzTWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFD2tfZnV0dXJlc01hcmtldAUGX2Fzc2V0ARFtaW5JbmNyZWFzZVNwcmVhZAAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFE2tfbWluSW5jcmVhc2VTcHJlYWQBC2dldFBvc2l0aW9uAQZfYXNzZXQECGxvbmdTaXplCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25Mb25nBQZfYXNzZXQAAAMJAAACBQhsb25nU2l6ZQAACQCWCgQAAAAAAAAAAAkAlgoEBQhsb25nU2l6ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uU2hvcnQFBl9hc3NldAAACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25TcHJlYWQFBl9hc3NldAAACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFD2tfcG9zaXRpb25Nb25leQUGX2Fzc2V0AAABD2dldEFzc2V0QmFsYW5jZQEGX2Fzc2V0AwkAAAIFBl9hc3NldAIFV0FWRVMICQDvBwEFBHRoaXMHcmVndWxhcgkA8AcCBQR0aGlzCQDZBAEFBl9hc3NldAEKZ2V0QXNzZXRJZAEGX2Fzc2V0AwkAAAIFBl9hc3NldAIFV0FWRVMFBHVuaXQJANkEAQUGX2Fzc2V0AQlub3JtYWxpemUCB19hbW91bnQGX2Fzc2V0BAhkZWNpbWFscwMJAAACBQZfYXNzZXQCBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQUGX2Fzc2V0CGRlY2ltYWxzAwkAAAIFCGRlY2ltYWxzAAgJAGkCBQdfYW1vdW50AGQDCQAAAgUIZGVjaW1hbHMABgUHX2Ftb3VudAkAAgECGkludmFsaWQgZGVjaW1hbHMgZm9yIGFzc2V0AQtkZU5vcm1hbGl6ZQIHX2Ftb3VudAZfYXNzZXQECGRlY2ltYWxzAwkAAAIFBl9hc3NldAIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQZfYXNzZXQIZGVjaW1hbHMDCQAAAgUIZGVjaW1hbHMACAkAaAIFB19hbW91bnQAZAMJAAACBQhkZWNpbWFscwAGBQdfYW1vdW50CQACAQIaSW52YWxpZCBkZWNpbWFscyBmb3IgYXNzZXQBDnVwZGF0ZVBvc2l0aW9uBQZfYXNzZXQMX25ld0xvbmdTaXplDV9uZXdTaG9ydFNpemUNX25ld0F2Z1NwcmVhZA5fbmV3TW9uZXlTcGVudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvbkxvbmcFBl9hc3NldAUMX25ld0xvbmdTaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uU2hvcnQFBl9hc3NldAUNX25ld1Nob3J0U2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvblNwcmVhZAUGX2Fzc2V0BQ1fbmV3QXZnU3ByZWFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uTW9uZXkFBl9hc3NldAUOX25ld01vbmV5U3BlbnQFA25pbAEOZGVsZXRlUG9zaXRpb24BBl9hc3NldAkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uTG9uZwUGX2Fzc2V0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFD2tfcG9zaXRpb25TaG9ydAUGX2Fzc2V0CQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25TcHJlYWQFBl9hc3NldAkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uTW9uZXkFBl9hc3NldAUDbmlsBQFpAQppbml0aWFsaXplAgZfYWRtaW4LX3F1b3RlQXNzZXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlJbnZhbGlkIGluaXRpYWxpemUgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tfYWRtaW4FBl9hZG1pbgkAzAgCCQELU3RyaW5nRW50cnkCBQxrX3F1b3RlQXNzZXQFC19xdW90ZUFzc2V0BQNuaWwBaQEOY2hhbmdlU2V0dGluZ3MBEl9taW5JbmNyZWFzZVNwcmVhZAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIGNoYW5nZVNldHRpbmdzIHBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa19taW5JbmNyZWFzZVNwcmVhZAUSX21pbkluY3JlYXNlU3ByZWFkBQNuaWwBaQEJYWRkTWFya2V0AwZfYXNzZXQLX3Nwb3RNYXJrZXQOX2Z1dHVyZXNNYXJrZXQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIYSW52YWxpZCBhZGRNYXJrZXQgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0BQtfc3BvdE1hcmtldAkAzAgCCQELU3RyaW5nRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX2Z1dHVyZXNNYXJrZXQFBl9hc3NldAUOX2Z1dHVyZXNNYXJrZXQFA25pbAFpARBpbmNyZWFzZVBvc2l0aW9uAgZfYXNzZXQPX3F1b3RlQXNzZXRTdGVwBApxdW90ZUFzc2V0CQENZ2V0UXVvdGVBc3NldAAECnNwb3RNYXJrZXQJAQ1nZXRTcG90TWFya2V0AQUGX2Fzc2V0BAthc3NldEJlZm9yZQkBD2dldEFzc2V0QmFsYW5jZQEFBl9hc3NldAMJAAACBQthc3NldEJlZm9yZQULYXNzZXRCZWZvcmUEB2J1eVNwb3QJAPwHBAUKc3BvdE1hcmtldAIEc3dhcAkAzAgCAAAJAMwIAgUGX2Fzc2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpxdW90ZUFzc2V0BQ9fcXVvdGVBc3NldFN0ZXAFA25pbAMJAAACBQdidXlTcG90BQdidXlTcG90BAphc3NldEFmdGVyCQEPZ2V0QXNzZXRCYWxhbmNlAQUGX2Fzc2V0AwkAAAIFCmFzc2V0QWZ0ZXIFCmFzc2V0QWZ0ZXIEC2Fzc2V0Qm91Z2h0CQBlAgUKYXNzZXRBZnRlcgULYXNzZXRCZWZvcmUED2Fzc2V0Qm91Z2h0Tm9ybQkBCW5vcm1hbGl6ZQIFC2Fzc2V0Qm91Z2h0BQZfYXNzZXQEEGJ1eVByaWNlTm9ybUZhY3QJAQRkaXZkAgUPX3F1b3RlQXNzZXRTdGVwBQ9hc3NldEJvdWdodE5vcm0EDWZ1dHVyZXNNYXJrZXQJARBnZXRGdXR1cmVzTWFya2V0AQUGX2Fzc2V0BAxzaG9ydEZ1dHVyZXMJAPwHBAUNZnV0dXJlc01hcmtldAIQaW5jcmVhc2VQb3NpdGlvbgkAzAgCBQlESVJfU0hPUlQJAMwIAgUMREVDSU1BTF9VTklUCQDMCAIAAAkAzAgCAgAJAMwIAgIABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnF1b3RlQXNzZXQFD19xdW90ZUFzc2V0U3RlcAUDbmlsAwkAAAIFDHNob3J0RnV0dXJlcwUMc2hvcnRGdXR1cmVzBAtwb3NpdGlvbktleQkArAICCQCsAgIJAKUIAQUEdGhpcwIBXwkApAMBBQlESVJfU0hPUlQED3Bvc2l0aW9uRnVsbEtleQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFC3Bvc2l0aW9uS2V5BA5hc3NldFNob3J0Tm9ybQkBAS0BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1mdXR1cmVzTWFya2V0BQ9wb3NpdGlvbkZ1bGxLZXkEEnNob3J0UHJpY2VOb3JtRmFjdAkBBGRpdmQCBQ9fcXVvdGVBc3NldFN0ZXAFDmFzc2V0U2hvcnROb3JtBApzcHJlYWRGYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFEGJ1eVByaWNlTm9ybUZhY3QFEnNob3J0UHJpY2VOb3JtRmFjdAQJbWluU3ByZWFkCQERbWluSW5jcmVhc2VTcHJlYWQAAwkAZgIFCnNwcmVhZEZhY3QFCW1pblNwcmVhZAQLJHQwNjAzMDYxMDAJAQtnZXRQb3NpdGlvbgEFBl9hc3NldAQIbG9uZ1NpemUIBQskdDA2MDMwNjEwMAJfMQQJc2hvcnRTaXplCAULJHQwNjAzMDYxMDACXzIECWF2Z1NwcmVhZAgFCyR0MDYwMzA2MTAwAl8zBAptb25leVNwZW50CAULJHQwNjAzMDYxMDACXzQEC25ld0xvbmdTaXplCQBkAgUIbG9uZ1NpemUFD2Fzc2V0Qm91Z2h0Tm9ybQQMbmV3U2hvcnRTaXplCQBkAgUJc2hvcnRTaXplBQ5hc3NldFNob3J0Tm9ybQQMbmV3QXZnU3ByZWFkCQEEZGl2ZAIJAGQCCQEEbXVsZAIFCWF2Z1NwcmVhZAkAZAIFCGxvbmdTaXplBQlzaG9ydFNpemUJAQRtdWxkAgUKc3ByZWFkRmFjdAkAZAIFD2Fzc2V0Qm91Z2h0Tm9ybQUOYXNzZXRTaG9ydE5vcm0JAGQCCQBkAgkAZAIFCGxvbmdTaXplBQlzaG9ydFNpemUFD2Fzc2V0Qm91Z2h0Tm9ybQUOYXNzZXRTaG9ydE5vcm0EDW5ld01vbmV5U3BlbnQJAGQCBQptb25leVNwZW50CQBoAgUPX3F1b3RlQXNzZXRTdGVwAAIJAQ51cGRhdGVQb3NpdGlvbgUFBl9hc3NldAULbmV3TG9uZ1NpemUFDG5ld1Nob3J0U2l6ZQUMbmV3QXZnU3ByZWFkBQ1uZXdNb25leVNwZW50BARkYXRhCQDMCAIJAKQDAQUPYXNzZXRCb3VnaHROb3JtCQDMCAIJAKQDAQUQYnV5UHJpY2VOb3JtRmFjdAkAzAgCCQCkAwEFDmFzc2V0U2hvcnROb3JtCQDMCAIJAKQDAQUSc2hvcnRQcmljZU5vcm1GYWN0CQDMCAIJAKQDAQUKc3ByZWFkRmFjdAkAzAgCCQCkAwEFCW1pblNwcmVhZAUDbmlsCQACAQkArAICAhBJbnZhbGlkIHNwcmVhZDogCQC5CQIFBGRhdGECASwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xvc2VQb3NpdGlvbgEGX2Fzc2V0BApxdW90ZUFzc2V0CQENZ2V0UXVvdGVBc3NldAAEDXF1b3RlQXNzZXRTdHIJANgEAQUKcXVvdGVBc3NldAQKc3BvdE1hcmtldAkBDWdldFNwb3RNYXJrZXQBBQZfYXNzZXQECyR0MDcwNzI3MTQyCQELZ2V0UG9zaXRpb24BBQZfYXNzZXQECGxvbmdTaXplCAULJHQwNzA3MjcxNDICXzEECXNob3J0U2l6ZQgFCyR0MDcwNzI3MTQyAl8yBAlhdmdTcHJlYWQIBQskdDA3MDcyNzE0MgJfMwQKbW9uZXlTcGVudAgFCyR0MDcwNzI3MTQyAl80BBBxdW90ZUFzc2V0QmVmb3JlCQEPZ2V0QXNzZXRCYWxhbmNlAQUNcXVvdGVBc3NldFN0cgMJAAACBRBxdW90ZUFzc2V0QmVmb3JlBRBxdW90ZUFzc2V0QmVmb3JlBAhzZWxsU3BvdAkA/AcEBQpzcG90TWFya2V0AgRzd2FwCQDMCAIAAAkAzAgCBQ1xdW90ZUFzc2V0U3RyCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKZ2V0QXNzZXRJZAEFBl9hc3NldAkBC2RlTm9ybWFsaXplAgUIbG9uZ1NpemUFBl9hc3NldAUDbmlsAwkAAAIFCHNlbGxTcG90BQhzZWxsU3BvdAQPcXVvdGVBc3NldEFmdGVyCQEPZ2V0QXNzZXRCYWxhbmNlAQUNcXVvdGVBc3NldFN0cgMJAAACBQ9xdW90ZUFzc2V0QWZ0ZXIFD3F1b3RlQXNzZXRBZnRlcgQMYXNzZXRTb2xkRm9yCQBlAgUPcXVvdGVBc3NldEFmdGVyBRBxdW90ZUFzc2V0QmVmb3JlBBBhc3NldFNvbGRGb3JOb3JtCQEJbm9ybWFsaXplAgUMYXNzZXRTb2xkRm9yBQ1xdW90ZUFzc2V0U3RyBBFzZWxsUHJpY2VOb3JtRmFjdAkBBGRpdmQCBRBhc3NldFNvbGRGb3JOb3JtBQhsb25nU2l6ZQQNZnV0dXJlc01hcmtldAkBEGdldEZ1dHVyZXNNYXJrZXQBBQZfYXNzZXQEEXF1b3RlQXNzZXRCZWZvcmUyCQEPZ2V0QXNzZXRCYWxhbmNlAQUNcXVvdGVBc3NldFN0cgMJAAACBRFxdW90ZUFzc2V0QmVmb3JlMgURcXVvdGVBc3NldEJlZm9yZTIEEWNsb3NlU2hvcnRGdXR1cmVzCQD8BwQFDWZ1dHVyZXNNYXJrZXQCDWNsb3NlUG9zaXRpb24JAMwIAgUJc2hvcnRTaXplCQDMCAIFCURJUl9TSE9SVAkAzAgCAAAJAMwIAgcJAMwIAgIABQNuaWwFA25pbAMJAAACBRFjbG9zZVNob3J0RnV0dXJlcwURY2xvc2VTaG9ydEZ1dHVyZXMEEHF1b3RlQXNzZXRBZnRlcjIJAQ9nZXRBc3NldEJhbGFuY2UBBQ1xdW90ZUFzc2V0U3RyAwkAAAIFEHF1b3RlQXNzZXRBZnRlcjIFEHF1b3RlQXNzZXRBZnRlcjIEDnNob3J0Q2xvc2VkRm9yCQBlAgUQcXVvdGVBc3NldEFmdGVyMgURcXVvdGVBc3NldEJlZm9yZTIEEnNob3J0UHJpY2VOb3JtRmFjdAkBBGRpdmQCBQ5zaG9ydENsb3NlZEZvcgUJc2hvcnRTaXplBAhtb25leUdvdAkAZAIFDnNob3J0Q2xvc2VkRm9yBQxhc3NldFNvbGRGb3IDCQBmAgUIbW9uZXlHb3QFCm1vbmV5U3BlbnQJAQ5kZWxldGVQb3NpdGlvbgEFBl9hc3NldAQEZGF0YQkAzAgCCQCkAwEFEGFzc2V0U29sZEZvck5vcm0JAMwIAgkApAMBBRFzZWxsUHJpY2VOb3JtRmFjdAkAzAgCCQCkAwEFDnNob3J0Q2xvc2VkRm9yCQDMCAIJAKQDAQUSc2hvcnRQcmljZU5vcm1GYWN0BQNuaWwJAAIBCQCsAgICGkludmFsaWQgc3ByZWFkIGZvciBjbG9zZTogCQC5CQIFBGRhdGECASwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAiDcng==", "height": 3663216, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4PPDzhWH9E1T3Bhwmg6inSGe2BqMt1ssvJqPgTWkQ4vz Next: 4ys7oSUFgxcDsjzHNdXzfrNnDbnBGK1A2dCeLeeYqxfb Diff:
OldNewDifferences
2020 let k_positionShort = "k_positionShort"
2121
2222 let k_positionSpread = "k_positionSpread"
23+
24+let k_positionMoney = "k_positionMoney"
2325
2426 let k_positionSize = "k_positionSize"
2527
5456 func getPosition (_asset) = {
5557 let longSize = valueOrElse(getInteger(this, toCompositeKey(k_positionLong, _asset)), 0)
5658 if ((longSize == 0))
57- then $Tuple3(0, 0, 0)
58- else $Tuple3(longSize, valueOrElse(getInteger(this, toCompositeKey(k_positionShort, _asset)), 0), valueOrElse(getInteger(this, toCompositeKey(k_positionSpread, _asset)), 0))
59+ then $Tuple4(0, 0, 0, 0)
60+ 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))
5961 }
6062
6163
9395 }
9496
9597
96-func updatePosition (_asset,_newLongSize,_newShortSize,_newAvgSpread) = [IntegerEntry(toCompositeKey(k_positionLong, _asset), _newLongSize), IntegerEntry(toCompositeKey(k_positionShort, _asset), _newShortSize), IntegerEntry(toCompositeKey(k_positionSpread, _asset), _newAvgSpread)]
98+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)]
9799
98100
99-func deletePosition (_asset) = [DeleteEntry(toCompositeKey(k_positionLong, _asset)), DeleteEntry(toCompositeKey(k_positionShort, _asset)), DeleteEntry(toCompositeKey(k_positionSpread, _asset))]
101+func deletePosition (_asset) = [DeleteEntry(toCompositeKey(k_positionLong, _asset)), DeleteEntry(toCompositeKey(k_positionShort, _asset)), DeleteEntry(toCompositeKey(k_positionSpread, _asset)), DeleteEntry(toCompositeKey(k_positionMoney, _asset))]
100102
101103
102104 @Callable(i)
148150 let minSpread = minIncreaseSpread()
149151 if ((spreadFact > minSpread))
150152 then {
151- let $t057445802 = getPosition(_asset)
152- let longSize = $t057445802._1
153- let shortSize = $t057445802._2
154- let avgSpread = $t057445802._3
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
155158 let newLongSize = (longSize + assetBoughtNorm)
156159 let newShortSize = (shortSize + assetShortNorm)
157160 let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
158- updatePosition(_asset, newLongSize, newShortSize, newAvgSpread)
161+ let newMoneySpent = (moneySpent + (_quoteAssetStep * 2))
162+ updatePosition(_asset, newLongSize, newShortSize, newAvgSpread, newMoneySpent)
159163 }
160164 else {
161165 let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
178182 let quoteAsset = getQuoteAsset()
179183 let quoteAssetStr = toBase58String(quoteAsset)
180184 let spotMarket = getSpotMarket(_asset)
181- let $t066986756 = getPosition(_asset)
182- let longSize = $t066986756._1
183- let shortSize = $t066986756._2
184- let avgSpread = $t066986756._3
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
185190 let quoteAssetBefore = getAssetBalance(quoteAssetStr)
186191 if ((quoteAssetBefore == quoteAssetBefore))
187192 then {
206211 then {
207212 let shortClosedFor = (quoteAssetAfter2 - quoteAssetBefore2)
208213 let shortPriceNormFact = divd(shortClosedFor, shortSize)
209- let spreadFact = (DECIMAL_UNIT - divd(shortPriceNormFact, sellPriceNormFact))
210- if ((avgSpread > spreadFact))
211- then {
212- let data = [toString(assetSoldForNorm), toString(sellPriceNormFact), toString(shortClosedFor), toString(shortPriceNormFact), toString(spreadFact), toString(avgSpread)]
213- throw(("Valid spread for close: " + makeString(data, ",")))
214- }
214+ let moneyGot = (shortClosedFor + assetSoldFor)
215+ if ((moneyGot > moneySpent))
216+ then deletePosition(_asset)
215217 else {
216- let data = [toString(assetSoldForNorm), toString(sellPriceNormFact), toString(shortClosedFor), toString(shortPriceNormFact), toString(spreadFact), toString(avgSpread)]
218+ let data = [toString(assetSoldForNorm), toString(sellPriceNormFact), toString(shortClosedFor), toString(shortPriceNormFact)]
217219 throw(("Invalid spread for close: " + makeString(data, ",")))
218220 }
219221 }
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"
23+
24+let k_positionMoney = "k_positionMoney"
2325
2426 let k_positionSize = "k_positionSize"
2527
2628 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
2729
2830 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
2931
3032
3133 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
3234
3335
3436 let DIR_SHORT = 2
3537
3638 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
3739
3840
3941 func adminAddress () = addressFromStringValue(getStringValue(this, k_admin))
4042
4143
4244 func getQuoteAsset () = fromBase58String(getStringValue(this, k_quoteAsset))
4345
4446
4547 func getSpotMarket (_asset) = addressFromStringValue(getStringValue(this, toCompositeKey(k_spotMarket, _asset)))
4648
4749
4850 func getFuturesMarket (_asset) = addressFromStringValue(getStringValue(this, toCompositeKey(k_futuresMarket, _asset)))
4951
5052
5153 func minIncreaseSpread () = getIntegerValue(this, k_minIncreaseSpread)
5254
5355
5456 func getPosition (_asset) = {
5557 let longSize = valueOrElse(getInteger(this, toCompositeKey(k_positionLong, _asset)), 0)
5658 if ((longSize == 0))
57- then $Tuple3(0, 0, 0)
58- else $Tuple3(longSize, valueOrElse(getInteger(this, toCompositeKey(k_positionShort, _asset)), 0), valueOrElse(getInteger(this, toCompositeKey(k_positionSpread, _asset)), 0))
59+ then $Tuple4(0, 0, 0, 0)
60+ 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))
5961 }
6062
6163
6264 func getAssetBalance (_asset) = if ((_asset == "WAVES"))
6365 then wavesBalance(this).regular
6466 else assetBalance(this, fromBase58String(_asset))
6567
6668
6769 func getAssetId (_asset) = if ((_asset == "WAVES"))
6870 then unit
6971 else fromBase58String(_asset)
7072
7173
7274 func normalize (_amount,_asset) = {
7375 let decimals = if ((_asset == "WAVES"))
7476 then 8
7577 else value(assetInfo(fromBase58String(_asset))).decimals
7678 if ((decimals == 8))
7779 then (_amount / 100)
7880 else if ((decimals == 6))
7981 then _amount
8082 else throw("Invalid decimals for asset")
8183 }
8284
8385
8486 func deNormalize (_amount,_asset) = {
8587 let decimals = if ((_asset == "WAVES"))
8688 then 8
8789 else value(assetInfo(fromBase58String(_asset))).decimals
8890 if ((decimals == 8))
8991 then (_amount * 100)
9092 else if ((decimals == 6))
9193 then _amount
9294 else throw("Invalid decimals for asset")
9395 }
9496
9597
96-func updatePosition (_asset,_newLongSize,_newShortSize,_newAvgSpread) = [IntegerEntry(toCompositeKey(k_positionLong, _asset), _newLongSize), IntegerEntry(toCompositeKey(k_positionShort, _asset), _newShortSize), IntegerEntry(toCompositeKey(k_positionSpread, _asset), _newAvgSpread)]
98+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)]
9799
98100
99-func deletePosition (_asset) = [DeleteEntry(toCompositeKey(k_positionLong, _asset)), DeleteEntry(toCompositeKey(k_positionShort, _asset)), DeleteEntry(toCompositeKey(k_positionSpread, _asset))]
101+func deletePosition (_asset) = [DeleteEntry(toCompositeKey(k_positionLong, _asset)), DeleteEntry(toCompositeKey(k_positionShort, _asset)), DeleteEntry(toCompositeKey(k_positionSpread, _asset)), DeleteEntry(toCompositeKey(k_positionMoney, _asset))]
100102
101103
102104 @Callable(i)
103105 func initialize (_admin,_quoteAsset) = if ((i.caller != this))
104106 then throw("Invalid initialize params")
105107 else [StringEntry(k_admin, _admin), StringEntry(k_quoteAsset, _quoteAsset)]
106108
107109
108110
109111 @Callable(i)
110112 func changeSettings (_minIncreaseSpread) = if ((i.caller != adminAddress()))
111113 then throw("Invalid changeSettings params")
112114 else [IntegerEntry(k_minIncreaseSpread, _minIncreaseSpread)]
113115
114116
115117
116118 @Callable(i)
117119 func addMarket (_asset,_spotMarket,_futuresMarket) = if ((i.caller != adminAddress()))
118120 then throw("Invalid addMarket params")
119121 else [StringEntry(toCompositeKey(k_spotMarket, _asset), _spotMarket), StringEntry(toCompositeKey(k_futuresMarket, _asset), _futuresMarket)]
120122
121123
122124
123125 @Callable(i)
124126 func increasePosition (_asset,_quoteAssetStep) = {
125127 let quoteAsset = getQuoteAsset()
126128 let spotMarket = getSpotMarket(_asset)
127129 let assetBefore = getAssetBalance(_asset)
128130 if ((assetBefore == assetBefore))
129131 then {
130132 let buySpot = invoke(spotMarket, "swap", [0, _asset, toString(this)], [AttachedPayment(quoteAsset, _quoteAssetStep)])
131133 if ((buySpot == buySpot))
132134 then {
133135 let assetAfter = getAssetBalance(_asset)
134136 if ((assetAfter == assetAfter))
135137 then {
136138 let assetBought = (assetAfter - assetBefore)
137139 let assetBoughtNorm = normalize(assetBought, _asset)
138140 let buyPriceNormFact = divd(_quoteAssetStep, assetBoughtNorm)
139141 let futuresMarket = getFuturesMarket(_asset)
140142 let shortFutures = invoke(futuresMarket, "increasePosition", [DIR_SHORT, DECIMAL_UNIT, 0, "", ""], [AttachedPayment(quoteAsset, _quoteAssetStep)])
141143 if ((shortFutures == shortFutures))
142144 then {
143145 let positionKey = ((toString(this) + "_") + toString(DIR_SHORT))
144146 let positionFullKey = toCompositeKey(k_positionSize, positionKey)
145147 let assetShortNorm = -(getIntegerValue(futuresMarket, positionFullKey))
146148 let shortPriceNormFact = divd(_quoteAssetStep, assetShortNorm)
147149 let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
148150 let minSpread = minIncreaseSpread()
149151 if ((spreadFact > minSpread))
150152 then {
151- let $t057445802 = getPosition(_asset)
152- let longSize = $t057445802._1
153- let shortSize = $t057445802._2
154- let avgSpread = $t057445802._3
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
155158 let newLongSize = (longSize + assetBoughtNorm)
156159 let newShortSize = (shortSize + assetShortNorm)
157160 let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
158- updatePosition(_asset, newLongSize, newShortSize, newAvgSpread)
161+ let newMoneySpent = (moneySpent + (_quoteAssetStep * 2))
162+ updatePosition(_asset, newLongSize, newShortSize, newAvgSpread, newMoneySpent)
159163 }
160164 else {
161165 let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
162166 throw(("Invalid spread: " + makeString(data, ",")))
163167 }
164168 }
165169 else throw("Strict value is not equal to itself.")
166170 }
167171 else throw("Strict value is not equal to itself.")
168172 }
169173 else throw("Strict value is not equal to itself.")
170174 }
171175 else throw("Strict value is not equal to itself.")
172176 }
173177
174178
175179
176180 @Callable(i)
177181 func closePosition (_asset) = {
178182 let quoteAsset = getQuoteAsset()
179183 let quoteAssetStr = toBase58String(quoteAsset)
180184 let spotMarket = getSpotMarket(_asset)
181- let $t066986756 = getPosition(_asset)
182- let longSize = $t066986756._1
183- let shortSize = $t066986756._2
184- let avgSpread = $t066986756._3
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
185190 let quoteAssetBefore = getAssetBalance(quoteAssetStr)
186191 if ((quoteAssetBefore == quoteAssetBefore))
187192 then {
188193 let sellSpot = invoke(spotMarket, "swap", [0, quoteAssetStr, toString(this)], [AttachedPayment(getAssetId(_asset), deNormalize(longSize, _asset))])
189194 if ((sellSpot == sellSpot))
190195 then {
191196 let quoteAssetAfter = getAssetBalance(quoteAssetStr)
192197 if ((quoteAssetAfter == quoteAssetAfter))
193198 then {
194199 let assetSoldFor = (quoteAssetAfter - quoteAssetBefore)
195200 let assetSoldForNorm = normalize(assetSoldFor, quoteAssetStr)
196201 let sellPriceNormFact = divd(assetSoldForNorm, longSize)
197202 let futuresMarket = getFuturesMarket(_asset)
198203 let quoteAssetBefore2 = getAssetBalance(quoteAssetStr)
199204 if ((quoteAssetBefore2 == quoteAssetBefore2))
200205 then {
201206 let closeShortFutures = invoke(futuresMarket, "closePosition", [shortSize, DIR_SHORT, 0, false, ""], nil)
202207 if ((closeShortFutures == closeShortFutures))
203208 then {
204209 let quoteAssetAfter2 = getAssetBalance(quoteAssetStr)
205210 if ((quoteAssetAfter2 == quoteAssetAfter2))
206211 then {
207212 let shortClosedFor = (quoteAssetAfter2 - quoteAssetBefore2)
208213 let shortPriceNormFact = divd(shortClosedFor, shortSize)
209- let spreadFact = (DECIMAL_UNIT - divd(shortPriceNormFact, sellPriceNormFact))
210- if ((avgSpread > spreadFact))
211- then {
212- let data = [toString(assetSoldForNorm), toString(sellPriceNormFact), toString(shortClosedFor), toString(shortPriceNormFact), toString(spreadFact), toString(avgSpread)]
213- throw(("Valid spread for close: " + makeString(data, ",")))
214- }
214+ let moneyGot = (shortClosedFor + assetSoldFor)
215+ if ((moneyGot > moneySpent))
216+ then deletePosition(_asset)
215217 else {
216- let data = [toString(assetSoldForNorm), toString(sellPriceNormFact), toString(shortClosedFor), toString(shortPriceNormFact), toString(spreadFact), toString(avgSpread)]
218+ let data = [toString(assetSoldForNorm), toString(sellPriceNormFact), toString(shortClosedFor), toString(shortPriceNormFact)]
217219 throw(("Invalid spread for close: " + makeString(data, ",")))
218220 }
219221 }
220222 else throw("Strict value is not equal to itself.")
221223 }
222224 else throw("Strict value is not equal to itself.")
223225 }
224226 else throw("Strict value is not equal to itself.")
225227 }
226228 else throw("Strict value is not equal to itself.")
227229 }
228230 else throw("Strict value is not equal to itself.")
229231 }
230232 else throw("Strict value is not equal to itself.")
231233 }
232234
233235

github/deemru/w8io/6500d08 
44.99 ms