2023.05.18 01:38 [3647996] smart account 3PMB6ajcL1KpY7DN5nXKf54ieLgaB4xsPFk > SELF 0.00000000 Waves
{ "type": 13, "id": "Comjoe3RLz6en7ihUFfyvuJJuNMdCcJU9qa89YTEYGn4", "fee": 800000, "feeAssetId": null, "timestamp": 1684363081874, "version": 1, "sender": "3PMB6ajcL1KpY7DN5nXKf54ieLgaB4xsPFk", "senderPublicKey": "6uhb6AgKwFhRA2MZ37H8cixm7WFtpThFHq3tcaTDuSzc", "proofs": [ "3Vwad2FWrpaJbWuXAWnwDh8v6P2nMxHUSdJw5wDzCiuDrz8bMwZvj72K6WKF5L5Fjn45qnBfmKAcvM68QtgB9QUr" ], "script": "base64:BgIECAISACcABlNjYWxlNgDAhD0ADFNjYWxlNkJpZ0ludAkAtgIBBQZTY2FsZTYABlNjYWxlOACAwtcvAAxTY2FsZThCaWdJbnQJALYCAQUGU2NhbGU4AApaZXJvQmlnSW50CQC2AgEAAAADU0VQAgJfXwAHSW5TY2FsZQCAwtcvAApJbkRlY2ltYWxzAAgADUluU2NhbGVCaWdJbnQJALYCAQUHSW5TY2FsZQAHSW5Bc3NldAEgbPpq/8XtqowLf7Uqk9KiDC+Cgtt0egSMU/v9Ex9zoP8ACkluQXNzZXRTdHICLDhMUVc4ZjdQNWQ1UFpNN0d0WkVCZ2FxUlBHU3pTM0RmUHVpWHJVUko0QUpTAAZjYWxsZXIJAQdBZGRyZXNzAQEaAVfyTI2mBDNxC6+/pEnHCC85SsZCCZoQMLQACWdlbmVyYXRvcgkBB0FkZHJlc3MBARoBV3fRSsAAJg9QbYMls1p2hOXjOfleDQxxRAAIcmVjZWl2ZXIJAQdBZGRyZXNzAQEaAVfPBWlzlYdYIwJnIbyPiV+SembopB4yfhgAC21ldnJlY2VpdmVyCQEHQWRkcmVzcwEBGgFXHuH7QDFrgebsS1YbBSxRoZNu3wmxPNLBAA13eFN3YXBBZGRyZXNzCQEHQWRkcmVzcwEBGgFXLio1NbENt/F5PuG3RtCedFJNezHQg64GAA50aGlzQWRkcmVzc1N0cgkApQgBBQR0aGlzAQxnZXRJbnRPclplcm8BA2tleQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQNrZXkAAAEKZ2V0QmFsYW5jZQEFYXNzZXQDCQAAAgUFYXNzZXQFBHVuaXQICQDvBwEFBHRoaXMHcmVndWxhcgkA8AcCBQR0aGlzCQEFdmFsdWUBBQVhc3NldAEPZ2V0QXNzZXRPcldhdmVzAQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgIFV0FWRVMFBHVuaXQJANkEAQUIYXNzZXRTdHIACWluQmFsYW5jZQkBCmdldEJhbGFuY2UBBQdJbkFzc2V0AA9pbkJhbGFuY2VCaWdJbnQJALYCAQUJaW5CYWxhbmNlAQtnZXRTd29wUG9vbAEEcG9vbAQLYXNzZXRJZEFTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCCkFfYXNzZXRfaWQEC2Fzc2V0SWRCU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sAgpCX2Fzc2V0X2lkBAhhc3NldElkQQkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRBU3RyBAhhc3NldElkQgkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRCU3RyBAhiYWxhbmNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIPQV9hc3NldF9iYWxhbmNlBAhiYWxhbmNlQgkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIPQl9hc3NldF9iYWxhbmNlBAZvdXRGZWUJALgCAgUMU2NhbGU2QmlnSW50CQC2AgEJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHBvb2wCCmNvbW1pc3Npb24JAJsKCQkAtgIBBQhiYWxhbmNlQQkAtgIBBQhiYWxhbmNlQgUIYXNzZXRJZEEFCGFzc2V0SWRCBQthc3NldElkQVN0cgULYXNzZXRJZEJTdHIFDFNjYWxlNkJpZ0ludAUGb3V0RmVlBQRwb29sARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgINc3Rha2VkQmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIRc2hhcmVBc3NldEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAgRwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEcG9vbAkBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAAAARxnZXRTdGFraW5nQXNzZXRCYWxhbmNlT3JaZXJvAgRwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEcG9vbAkBFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBBQdhc3NldElkAAABE2dldFd4QWNjb3VudEJhbGFuY2UCBHBvb2wHYXNzZXRJZAQNYmFsYW5jZU9uUG9vbAMJAAACBQdhc3NldElkAgVXQVZFUwgJAO8HAQUEcG9vbAlhdmFpbGFibGUJAPAHAgUEcG9vbAkA2QQBBQdhc3NldElkBAx0b3RhbEJhbGFuY2UJAGUCCQBkAgUNYmFsYW5jZU9uUG9vbAkBGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAgUEcG9vbAUHYXNzZXRJZAkBHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8CBQRwb29sBQdhc3NldElkCQCWAwEJAMwIAgAACQDMCAIFDHRvdGFsQmFsYW5jZQUDbmlsAQlnZXRXeFBvb2wBBHBvb2wEC2Fzc2V0SWRBU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sAg8lc19fYW1vdW50QXNzZXQEC2Fzc2V0SWRCU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sAg4lc19fcHJpY2VBc3NldAQIYXNzZXRJZEEJAQ9nZXRBc3NldE9yV2F2ZXMBBQthc3NldElkQVN0cgQIYXNzZXRJZEIJAQ9nZXRBc3NldE9yV2F2ZXMBBQthc3NldElkQlN0cgQIYmFsYW5jZUEJARNnZXRXeEFjY291bnRCYWxhbmNlAgUEcG9vbAULYXNzZXRJZEFTdHIECGJhbGFuY2VCCQETZ2V0V3hBY2NvdW50QmFsYW5jZQIFBHBvb2wFC2Fzc2V0SWRCU3RyBAtwcm90b2NvbEZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNd3hTd2FwQWRkcmVzcwIPJXNfX3Byb3RvY29sRmVlBAdwb29sRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ13eFN3YXBBZGRyZXNzAgslc19fcG9vbEZlZQQFaW5GZWUJALgCAgUMU2NhbGU2QmlnSW50CQC8AgMJALYCAQkAZAIFC3Byb3RvY29sRmVlBQdwb29sRmVlBQxTY2FsZTZCaWdJbnQFDFNjYWxlOEJpZ0ludAkAmwoJCQC2AgEFCGJhbGFuY2VBCQC2AgEFCGJhbGFuY2VCBQhhc3NldElkQQUIYXNzZXRJZEIFC2Fzc2V0SWRBU3RyBQthc3NldElkQlN0cgUFaW5GZWUFDFNjYWxlNkJpZ0ludAUNd3hTd2FwQWRkcmVzcwEIY2FsY1N3YXAFCXBtdEFtb3VudAl0b2tlbkZyb20HdG9rZW5UbwVpbkZlZQZvdXRGZWUEC2NsZWFuQW1vdW50CQC8AgMFCXBtdEFtb3VudAUFaW5GZWUFDFNjYWxlNkJpZ0ludAQQYW1vdW50V2l0aG91dEZlZQkAvAIDBQd0b2tlblRvBQtjbGVhbkFtb3VudAkAtwICBQtjbGVhbkFtb3VudAUJdG9rZW5Gcm9tBA1hbW91bnRXaXRoRmVlCQC8AgMFEGFtb3VudFdpdGhvdXRGZWUFBm91dEZlZQUMU2NhbGU2QmlnSW50BQ1hbW91bnRXaXRoRmVlAQxlc3RpbWF0ZVN3YXADCHBvb2xJbmZvB2luQXNzZXQIaW5BbW91bnQECXJvdXRlQXJncwMJAAACBQdpbkFzc2V0CAUIcG9vbEluZm8CXzMJAJUKAwgFCHBvb2xJbmZvAl80CAUIcG9vbEluZm8CXzYJAQhjYWxjU3dhcAUFCGluQW1vdW50CAUIcG9vbEluZm8CXzEIBQhwb29sSW5mbwJfMggFCHBvb2xJbmZvAl83CAUIcG9vbEluZm8CXzgJAJUKAwgFCHBvb2xJbmZvAl8zCAUIcG9vbEluZm8CXzUJAQhjYWxjU3dhcAUFCGluQW1vdW50CAUIcG9vbEluZm8CXzIIBQhwb29sSW5mbwJfMQgFCHBvb2xJbmZvAl83CAUIcG9vbEluZm8CXzgECGRhcHBBcmdzAwkAAAIIBQhwb29sSW5mbwJfOQUNd3hTd2FwQWRkcmVzcwkAlAoCAgRzd2FwCQDMCAIAAAkAzAgCCAUJcm91dGVBcmdzAl8yCQDMCAIFDnRoaXNBZGRyZXNzU3RyBQNuaWwJAJQKAgIIZXhjaGFuZ2UJAMwIAgABBQNuaWwJAJYKBAgFCXJvdXRlQXJncwJfMQgFCXJvdXRlQXJncwJfMwgFCGRhcHBBcmdzAl8xCAUIZGFwcEFyZ3MCXzIBDWVzdGltYXRlUm91dGUGBXBvb2wxBXBvb2wyBXBvb2wzDHBvb2wxUmV2ZXJzZQxwb29sMlJldmVyc2UMcG9vbDNSZXZlcnNlBANhMTIDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMggFBXBvb2wxAl8xBANhMjEDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMQgFBXBvb2wxAl8yBANhMjMDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMggFBXBvb2wyAl8xBANhMzIDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMQgFBXBvb2wyAl8yBANhMzEDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMggFBXBvb2wzAl8xBANhMTMDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMQgFBXBvb2wzAl8yBA1hYURlbm9taW5hdG9yCQC3AgIFA2EyMwkAvAIDCQC8AgMFA2EyMQgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfNwUMU2NhbGU2QmlnSW50BARhYTEzCQC8AgMFA2ExMgUDYTIzBQ1hYURlbm9taW5hdG9yBARhYTMxCQC8AgMJALwCAwkAvAIDBQNhMjEFA2EzMgUNYWFEZW5vbWluYXRvcggFBXBvb2wyAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfOAUMU2NhbGU2QmlnSW50BAxhRGVub21pbmF0b3IJALcCAgUDYTMxCQC8AgMJALwCAwUEYWEzMQgFBXBvb2wxAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMQJfOAUMU2NhbGU2QmlnSW50BAFhCQC8AgMFBGFhMTMFA2EzMQUMYURlbm9taW5hdG9yBAJhYQkAvAIDCQC8AgMJALwCAwUEYWEzMQUDYTEzBQxhRGVub21pbmF0b3IIBQVwb29sMwJfNwUMU2NhbGU2QmlnSW50CAUFcG9vbDMCXzgFDFNjYWxlNkJpZ0ludAQFZGVsdGEJALwCAwkAuAICCQEKc3FydEJpZ0ludAQJALwCAwkAvAIDCQC8AgMFAmFhBQFhBQ1JblNjYWxlQmlnSW50CAUFcG9vbDECXzcFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQFCkluRGVjaW1hbHMFCkluRGVjaW1hbHMFB0NFSUxJTkcFAWEFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl83AwkAwAICBQpaZXJvQmlnSW50BQVkZWx0YQkAlAoCAAAFA25pbAQFaW5wdXQDCQC/AgIFBWRlbHRhBQ9pbkJhbGFuY2VCaWdJbnQFD2luQmFsYW5jZUJpZ0ludAUFZGVsdGEEBXN3YXAxCQEMZXN0aW1hdGVTd2FwAwUFcG9vbDEFB0luQXNzZXQFBWlucHV0BAVzd2FwMgkBDGVzdGltYXRlU3dhcAMFBXBvb2wyCAUFc3dhcDECXzEIBQVzd2FwMQJfMgQFc3dhcDMJAQxlc3RpbWF0ZVN3YXADBQVwb29sMwgFBXN3YXAyAl8xCAUFc3dhcDICXzIJAJQKAgkAoAMBCQC4AgIIBQVzd2FwMwJfMgUFaW5wdXQJAMwIAgkAlwoFCAUFcG9vbDECXzkIBQVzd2FwMQJfMwgFBXN3YXAxAl80BQdJbkFzc2V0CQCgAwEFBWlucHV0CQDMCAIJAJcKBQgFBXBvb2wyAl85CAUFc3dhcDICXzMIBQVzd2FwMgJfNAgFBXN3YXAxAl8xCQCgAwEIBQVzd2FwMQJfMgkAzAgCCQCXCgUIBQVwb29sMwJfOQgFBXN3YXAzAl8zCAUFc3dhcDMCXzQIBQVzd2FwMgJfMQkAoAMBCAUFc3dhcDICXzIFA25pbAEKaW52b2tlU3dhcAEEYXJncwQOY3VycmVudEJhbGFuY2UJAQpnZXRCYWxhbmNlAQgFBGFyZ3MCXzQEDXRyaW1tZWRBbW91bnQDCQBmAggFBGFyZ3MCXzUFDmN1cnJlbnRCYWxhbmNlBQ5jdXJyZW50QmFsYW5jZQgFBGFyZ3MCXzUEDHJlc3VsdEFtb3VudAMJAAACCAUEYXJncwJfNAUHSW5Bc3NldAUNdHJpbW1lZEFtb3VudAMJAGYCBQ5jdXJyZW50QmFsYW5jZQgFBGFyZ3MCXzUFDmN1cnJlbnRCYWxhbmNlBQ10cmltbWVkQW1vdW50CQD8BwQIBQRhcmdzAl8xCAUEYXJncwJfMggFBGFyZ3MCXzMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIIBQRhcmdzAl80BQxyZXN1bHRBbW91bnQFA25pbAAPc3dvcF9idGN3eGdfeHRuCQELZ2V0U3dvcFBvb2wBCQEHQWRkcmVzcwEBGgFXWr+O60axuBKu/VzJ19HG/Sl1XSao2mqXABFzd29wX3dhdmVzX2J0Y3d4ZwkBC2dldFN3b3BQb29sAQkBB0FkZHJlc3MBARoBV0VVUiA2i4brnFuT+reFxVu3I8K2xWYPrAANd3hfYnRjd3hnX3h0bgkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVdwdLQqo8iSwSMmznCoYKy2oO71ZSSMCNkAD3d4X3dhdmVzX2J0Y3d4ZwkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVfrhaRPK2J6J8Bwm0Esmjz40kkwm8AZcFUADHd4X3dhdmVzX3h0bgkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVftR5/NQjyTvkshzfsCfh/ILfuWgHrDr30ABnJvdXRlcwkAzAgCCQCYCgYFD3d4X3dhdmVzX2J0Y3d4ZwUMd3hfd2F2ZXNfeHRuBQ13eF9idGN3eGdfeHRuBgcGCQDMCAIJAJgKBgUNd3hfYnRjd3hnX3h0bgUMd3hfd2F2ZXNfeHRuBQ93eF93YXZlc19idGN3eGcHBgcJAMwIAgkAmAoGBRFzd29wX3dhdmVzX2J0Y3d4ZwUMd3hfd2F2ZXNfeHRuBQ9zd29wX2J0Y3d4Z194dG4GBwYJAMwIAgkAmAoGBQ9zd29wX2J0Y3d4Z194dG4FDHd4X3dhdmVzX3h0bgURc3dvcF93YXZlc19idGN3eGcHBgcJAMwIAgkAmAoGBQ93eF93YXZlc19idGN3eGcFDHd4X3dhdmVzX3h0bgUPc3dvcF9idGN3eGdfeHRuBgcGCQDMCAIJAJgKBgUPc3dvcF9idGN3eGdfeHRuBQx3eF93YXZlc194dG4FD3d4X3dhdmVzX2J0Y3d4ZwcGBwkAzAgCCQCYCgYFDXd4X2J0Y3d4Z194dG4FDHd4X3dhdmVzX3h0bgURc3dvcF93YXZlc19idGN3eGcHBgcJAMwIAgkAmAoGBRFzd29wX3dhdmVzX2J0Y3d4ZwUMd3hfd2F2ZXNfeHRuBQ13eF9idGN3eGdfeHRuBgcGBQNuaWwBAWkBB2RlZmF1bHQAAwkBAiE9AggFAWkGY2FsbGVyBQZjYWxsZXIJAAIBAgtObyB0b3VjaGluZwoBDWFjY3VtRnVuY3Rpb24CBWFjY3VtBG5leHQECmVzdGltYXRpb24JAQ1lc3RpbWF0ZVJvdXRlBggFBG5leHQCXzEIBQRuZXh0Al8yCAUEbmV4dAJfMwgFBG5leHQCXzQIBQRuZXh0Al81CAUEbmV4dAJfNgkAlAoCCQDNCAIIBQVhY2N1bQJfMQgFCmVzdGltYXRpb24CXzEJAM0IAggFBWFjY3VtAl8yCAUKZXN0aW1hdGlvbgJfMgQEZm9sZAoAAiRsBQZyb3V0ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1hY2N1bUZ1bmN0aW9uAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA4CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAQNbWF4U3dhcFByb2ZpdAkAlgMBCAUEZm9sZAJfMQMJAGcCAAAFDW1heFN3YXBQcm9maXQJAAIBAg1Fc3RpbWF0ZSBmYWlsBA9lc3RpbWF0ZWRSZXN1bHQJAJEDAggFBGZvbGQCXzIJAQV2YWx1ZQEJAM8IAggFBGZvbGQCXzEFDW1heFN3YXBQcm9maXQEB3Jlc3VsdDEJAQppbnZva2VTd2FwAQkAkQMCBQ9lc3RpbWF0ZWRSZXN1bHQAAAMJAAACBQdyZXN1bHQxBQdyZXN1bHQxBAdyZXN1bHQyCQEKaW52b2tlU3dhcAEJAJEDAgUPZXN0aW1hdGVkUmVzdWx0AAEDCQAAAgUHcmVzdWx0MgUHcmVzdWx0MgQHcmVzdWx0MwkBCmludm9rZVN3YXABCQCRAwIFD2VzdGltYXRlZFJlc3VsdAACAwkAAAIFB3Jlc3VsdDMFB3Jlc3VsdDMEBnByb2ZpdAkAZQIJAQpnZXRCYWxhbmNlAQUHSW5Bc3NldAUJaW5CYWxhbmNlBApwdXJlUHJvZml0AwkAZgIJAGoCCAUBaQNmZWUACgAACQBlAgUGcHJvZml0APjSAQkAZQIFBnByb2ZpdACQAwMJAGcCAAAFCnB1cmVQcm9maXQJAAIBAgxFeGVjdXRlIGZhaWwDCQAAAggFCWxhc3RCbG9jawlnZW5lcmF0b3IFCWdlbmVyYXRvcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQttZXZyZWNlaXZlcgUGcHJvZml0BQdJbkFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgttZXZfcHJvZml0XwUKSW5Bc3NldFN0cgIBXwkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUGcHJvZml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEG1ldl90b3RhbFByb2ZpdF8FCkluQXNzZXRTdHIJAGQCCQEMZ2V0SW50T3JaZXJvAQkArAICAhBtZXZfdG90YWxQcm9maXRfBQpJbkFzc2V0U3RyBQZwcm9maXQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhyZWNlaXZlcgUGcHJvZml0BQdJbkFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgdwcm9maXRfBQpJbkFzc2V0U3RyAgFfCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQZwcm9maXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIMdG90YWxQcm9maXRfBQpJbkFzc2V0U3RyCQBkAgkBDGdldEludE9yWmVybwEJAKwCAgIMdG90YWxQcm9maXRfBQpJbkFzc2V0U3RyBQZwcm9maXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgBl09yh", "chainId": 87, "height": 3647996, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: A5ubFaAmxboiD6aLwYjpsgRDpnQBkLGy9fzeLMMz45XE Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let Scale6 = 1000000 | |
5 | + | ||
6 | + | let Scale6BigInt = toBigInt(Scale6) | |
7 | + | ||
8 | + | let Scale8 = 100000000 | |
9 | + | ||
10 | + | let Scale8BigInt = toBigInt(Scale8) | |
11 | + | ||
12 | + | let ZeroBigInt = toBigInt(0) | |
13 | + | ||
14 | + | let SEP = "__" | |
15 | + | ||
16 | + | let InScale = 100000000 | |
17 | + | ||
18 | + | let InDecimals = 8 | |
19 | + | ||
20 | + | let InScaleBigInt = toBigInt(InScale) | |
21 | + | ||
22 | + | let InAsset = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' | |
23 | + | ||
24 | + | let InAssetStr = "8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" | |
25 | + | ||
26 | + | let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK') | |
27 | + | ||
28 | + | let generator = Address(base58'3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1') | |
29 | + | ||
30 | + | let receiver = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK') | |
31 | + | ||
32 | + | let mevreceiver = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe') | |
33 | + | ||
34 | + | let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
35 | + | ||
36 | + | let thisAddressStr = toString(this) | |
37 | + | ||
38 | + | func getIntOrZero (key) = valueOrElse(getInteger(key), 0) | |
39 | + | ||
40 | + | ||
41 | + | func getBalance (asset) = if ((asset == unit)) | |
42 | + | then wavesBalance(this).regular | |
43 | + | else assetBalance(this, value(asset)) | |
44 | + | ||
45 | + | ||
46 | + | func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES")) | |
47 | + | then unit | |
48 | + | else fromBase58String(assetStr) | |
49 | + | ||
50 | + | ||
51 | + | let inBalance = getBalance(InAsset) | |
52 | + | ||
53 | + | let inBalanceBigInt = toBigInt(inBalance) | |
54 | + | ||
55 | + | func getSwopPool (pool) = { | |
56 | + | let assetIdAStr = getStringValue(pool, "A_asset_id") | |
57 | + | let assetIdBStr = getStringValue(pool, "B_asset_id") | |
58 | + | let assetIdA = getAssetOrWaves(assetIdAStr) | |
59 | + | let assetIdB = getAssetOrWaves(assetIdBStr) | |
60 | + | let balanceA = getIntegerValue(pool, "A_asset_balance") | |
61 | + | let balanceB = getIntegerValue(pool, "B_asset_balance") | |
62 | + | let outFee = (Scale6BigInt - toBigInt(getIntegerValue(pool, "commission"))) | |
63 | + | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, Scale6BigInt, outFee, pool) | |
64 | + | } | |
65 | + | ||
66 | + | ||
67 | + | func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP) | |
68 | + | ||
69 | + | ||
70 | + | func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP) | |
71 | + | ||
72 | + | ||
73 | + | func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0) | |
74 | + | ||
75 | + | ||
76 | + | func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0) | |
77 | + | ||
78 | + | ||
79 | + | func getWxAccountBalance (pool,assetId) = { | |
80 | + | let balanceOnPool = if ((assetId == "WAVES")) | |
81 | + | then wavesBalance(pool).available | |
82 | + | else assetBalance(pool, fromBase58String(assetId)) | |
83 | + | let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId)) | |
84 | + | max([0, totalBalance]) | |
85 | + | } | |
86 | + | ||
87 | + | ||
88 | + | func getWxPool (pool) = { | |
89 | + | let assetIdAStr = getStringValue(pool, "%s__amountAsset") | |
90 | + | let assetIdBStr = getStringValue(pool, "%s__priceAsset") | |
91 | + | let assetIdA = getAssetOrWaves(assetIdAStr) | |
92 | + | let assetIdB = getAssetOrWaves(assetIdBStr) | |
93 | + | let balanceA = getWxAccountBalance(pool, assetIdAStr) | |
94 | + | let balanceB = getWxAccountBalance(pool, assetIdBStr) | |
95 | + | let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee") | |
96 | + | let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee") | |
97 | + | let inFee = (Scale6BigInt - fraction(toBigInt((protocolFee + poolFee)), Scale6BigInt, Scale8BigInt)) | |
98 | + | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, Scale6BigInt, wxSwapAddress) | |
99 | + | } | |
100 | + | ||
101 | + | ||
102 | + | func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = { | |
103 | + | let cleanAmount = fraction(pmtAmount, inFee, Scale6BigInt) | |
104 | + | let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom)) | |
105 | + | let amountWithFee = fraction(amountWithoutFee, outFee, Scale6BigInt) | |
106 | + | amountWithFee | |
107 | + | } | |
108 | + | ||
109 | + | ||
110 | + | func estimateSwap (poolInfo,inAsset,inAmount) = { | |
111 | + | let routeArgs = if ((inAsset == poolInfo._3)) | |
112 | + | then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8)) | |
113 | + | else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8)) | |
114 | + | let dappArgs = if ((poolInfo._9 == wxSwapAddress)) | |
115 | + | then $Tuple2("swap", [0, routeArgs._2, thisAddressStr]) | |
116 | + | else $Tuple2("exchange", [1]) | |
117 | + | $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2) | |
118 | + | } | |
119 | + | ||
120 | + | ||
121 | + | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
122 | + | let a12 = if (pool1Reverse) | |
123 | + | then pool1._2 | |
124 | + | else pool1._1 | |
125 | + | let a21 = if (pool1Reverse) | |
126 | + | then pool1._1 | |
127 | + | else pool1._2 | |
128 | + | let a23 = if (pool2Reverse) | |
129 | + | then pool2._2 | |
130 | + | else pool2._1 | |
131 | + | let a32 = if (pool2Reverse) | |
132 | + | then pool2._1 | |
133 | + | else pool2._2 | |
134 | + | let a31 = if (pool3Reverse) | |
135 | + | then pool3._2 | |
136 | + | else pool3._1 | |
137 | + | let a13 = if (pool3Reverse) | |
138 | + | then pool3._1 | |
139 | + | else pool3._2 | |
140 | + | let aaDenominator = (a23 + fraction(fraction(a21, pool1._8, Scale6BigInt), pool2._7, Scale6BigInt)) | |
141 | + | let aa13 = fraction(a12, a23, aaDenominator) | |
142 | + | let aa31 = fraction(fraction(fraction(a21, a32, aaDenominator), pool2._7, Scale6BigInt), pool2._8, Scale6BigInt) | |
143 | + | let aDenominator = (a31 + fraction(fraction(aa31, pool1._7, Scale6BigInt), pool1._8, Scale6BigInt)) | |
144 | + | let a = fraction(aa13, a31, aDenominator) | |
145 | + | let aa = fraction(fraction(fraction(aa31, a13, aDenominator), pool3._7, Scale6BigInt), pool3._8, Scale6BigInt) | |
146 | + | let delta = fraction((sqrtBigInt(fraction(fraction(fraction(aa, a, InScaleBigInt), pool1._7, Scale6BigInt), pool1._8, Scale6BigInt), InDecimals, InDecimals, CEILING) - a), Scale6BigInt, pool1._7) | |
147 | + | if ((ZeroBigInt >= delta)) | |
148 | + | then $Tuple2(0, nil) | |
149 | + | else { | |
150 | + | let input = if ((delta > inBalanceBigInt)) | |
151 | + | then inBalanceBigInt | |
152 | + | else delta | |
153 | + | let swap1 = estimateSwap(pool1, InAsset, input) | |
154 | + | let swap2 = estimateSwap(pool2, swap1._1, swap1._2) | |
155 | + | let swap3 = estimateSwap(pool3, swap2._1, swap2._2) | |
156 | + | $Tuple2(toInt((swap3._2 - input)), [$Tuple5(pool1._9, swap1._3, swap1._4, InAsset, toInt(input)), $Tuple5(pool2._9, swap2._3, swap2._4, swap1._1, toInt(swap1._2)), $Tuple5(pool3._9, swap3._3, swap3._4, swap2._1, toInt(swap2._2))]) | |
157 | + | } | |
158 | + | } | |
159 | + | ||
160 | + | ||
161 | + | func invokeSwap (args) = { | |
162 | + | let currentBalance = getBalance(args._4) | |
163 | + | let trimmedAmount = if ((args._5 > currentBalance)) | |
164 | + | then currentBalance | |
165 | + | else args._5 | |
166 | + | let resultAmount = if ((args._4 == InAsset)) | |
167 | + | then trimmedAmount | |
168 | + | else if ((currentBalance > args._5)) | |
169 | + | then currentBalance | |
170 | + | else trimmedAmount | |
171 | + | invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)]) | |
172 | + | } | |
173 | + | ||
174 | + | ||
175 | + | let swop_btcwxg_xtn = getSwopPool(Address(base58'3PACj2DLTw3uUhsUmT98zHU5M4hPufbHKav')) | |
176 | + | ||
177 | + | let swop_waves_btcwxg = getSwopPool(Address(base58'3P8FVZgAJUAq32UEZtTw84qS4zLqEREiEiP')) | |
178 | + | ||
179 | + | let wx_btcwxg_xtn = getWxPool(Address(base58'3PCBWDTA6jrFswd7gQgaE3Xk7gLM5RKofvp')) | |
180 | + | ||
181 | + | let wx_waves_btcwxg = getWxPool(Address(base58'3PPQDcvXuwVToC2QNWzPwxmLxLzMw9Eoe8C')) | |
182 | + | ||
183 | + | let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g')) | |
184 | + | ||
185 | + | let routes = [$Tuple6(wx_waves_btcwxg, wx_waves_xtn, wx_btcwxg_xtn, true, false, true), $Tuple6(wx_btcwxg_xtn, wx_waves_xtn, wx_waves_btcwxg, false, true, false), $Tuple6(swop_waves_btcwxg, wx_waves_xtn, swop_btcwxg_xtn, true, false, true), $Tuple6(swop_btcwxg_xtn, wx_waves_xtn, swop_waves_btcwxg, false, true, false), $Tuple6(wx_waves_btcwxg, wx_waves_xtn, swop_btcwxg_xtn, true, false, true), $Tuple6(swop_btcwxg_xtn, wx_waves_xtn, wx_waves_btcwxg, false, true, false), $Tuple6(wx_btcwxg_xtn, wx_waves_xtn, swop_waves_btcwxg, false, true, false), $Tuple6(swop_waves_btcwxg, wx_waves_xtn, wx_btcwxg_xtn, true, false, true)] | |
186 | + | ||
187 | + | @Callable(i) | |
188 | + | func default () = if ((i.caller != caller)) | |
189 | + | then throw("No touching") | |
190 | + | else { | |
191 | + | func accumFunction (accum,next) = { | |
192 | + | let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6) | |
193 | + | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
194 | + | } | |
195 | + | ||
196 | + | let fold = { | |
197 | + | let $l = routes | |
198 | + | let $s = size($l) | |
199 | + | let $acc0 = $Tuple2(nil, nil) | |
200 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
201 | + | then $a | |
202 | + | else accumFunction($a, $l[$i]) | |
203 | + | ||
204 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
205 | + | then $a | |
206 | + | else throw("List size exceeds 8") | |
207 | + | ||
208 | + | $f0_2($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) | |
209 | + | } | |
210 | + | let maxSwapProfit = max(fold._1) | |
211 | + | if ((0 >= maxSwapProfit)) | |
212 | + | then throw("Estimate fail") | |
213 | + | else { | |
214 | + | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
215 | + | let result1 = invokeSwap(estimatedResult[0]) | |
216 | + | if ((result1 == result1)) | |
217 | + | then { | |
218 | + | let result2 = invokeSwap(estimatedResult[1]) | |
219 | + | if ((result2 == result2)) | |
220 | + | then { | |
221 | + | let result3 = invokeSwap(estimatedResult[2]) | |
222 | + | if ((result3 == result3)) | |
223 | + | then { | |
224 | + | let profit = (getBalance(InAsset) - inBalance) | |
225 | + | let pureProfit = if (((i.fee % 10) > 0)) | |
226 | + | then (profit - 27000) | |
227 | + | else (profit - 400) | |
228 | + | if ((0 >= pureProfit)) | |
229 | + | then throw("Execute fail") | |
230 | + | else if ((lastBlock.generator == generator)) | |
231 | + | then [ScriptTransfer(mevreceiver, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))] | |
232 | + | else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))] | |
233 | + | } | |
234 | + | else throw("Strict value is not equal to itself.") | |
235 | + | } | |
236 | + | else throw("Strict value is not equal to itself.") | |
237 | + | } | |
238 | + | else throw("Strict value is not equal to itself.") | |
239 | + | } | |
240 | + | } | |
241 | + | ||
242 | + |
github/deemru/w8io/786bc32 21.50 ms ◑