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:
OldNewDifferences
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