tx · 7qQPzGhD6q2W7JHVGNDr9dpzm1mhmEFttArXKmkJZL8r

3PCam3YxMpzVz97vSWeuGCa8kGJfJrUfjY1:  -0.00900000 Waves

2023.06.29 23:03 [3710056] smart account 3PCam3YxMpzVz97vSWeuGCa8kGJfJrUfjY1 > SELF 0.00000000 Waves

{ "type": 13, "id": "7qQPzGhD6q2W7JHVGNDr9dpzm1mhmEFttArXKmkJZL8r", "fee": 900000, "feeAssetId": null, "timestamp": 1688069011869, "version": 1, "sender": "3PCam3YxMpzVz97vSWeuGCa8kGJfJrUfjY1", "senderPublicKey": "5YzAWoy7GGDLi9Z73s7XHZnxsKH8ihqDiYUD4jeU1rWH", "proofs": [ "5pJ2ET9VL7viHyM8DwKAAHPh7Ch2DPtyY8e4suoRy9mLbTjZv6Lj1NwUzgnY3GkfR8xeEeALgD9CbCAR6zh5onzQ" ], "script": "base64:BgIOCAISABIDCgEEEgMKAQEpAAZTY2FsZTYAwIQ9AAxTY2FsZTZCaWdJbnQJALYCAQUGU2NhbGU2AAZTY2FsZTgAgMLXLwAMU2NhbGU4QmlnSW50CQC2AgEFBlNjYWxlOAAKWmVyb0JpZ0ludAkAtgIBAAAAA1NFUAICX18AB0luU2NhbGUAwIQ9AApJbkRlY2ltYWxzAAYADUluU2NhbGVCaWdJbnQJALYCAQUHSW5TY2FsZQAHSW5Bc3NldAEgHpQHE1J2oSWV/chhqIJfEH/fOk8pu/yaRj9a/TZPn5EACkluQXNzZXRTdHICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKAAZjYWxsZXIJAQdBZGRyZXNzAQEaAVfyTI2mBDNxC6+/pEnHCC85SsZCCZoQMLQADGNvbmZpZ3VyYXRvcgkBB0FkZHJlc3MBARoBV0AaOZfQDuIJbWeUCWOxPxWW6J/dSy2+5AAJZ2VuZXJhdG9yCQEHQWRkcmVzcwEBGgFXd9FKwAAmD1BtgyWzWnaE5eM5+V4NDHFEAARtYWluCQEHQWRkcmVzcwEBGgFXzwVpc5WHWCMCZyG8j4lfknpm6KQeMn4YAA5tZXZSZXNlcnZlRnVuZAkBB0FkZHJlc3MBARoBVxRBSlrcSQMDknVAKWPSozf9b6nVeeCqAAANd3hTd2FwQWRkcmVzcwkBB0FkZHJlc3MBARoBVy4qNTWxDbfxeT7ht0bQnnRSTXsx0IOuBgAOdGhpc0FkZHJlc3NTdHIJAKUIAQUEdGhpcwEMZ2V0SW50T3JaZXJvAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUDa2V5AAABDmdldEJvb2xPckZhbHNlAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAKAIAQUDa2V5BwEKZ2V0QmFsYW5jZQEFYXNzZXQDCQAAAgUFYXNzZXQFBHVuaXQICQDvBwEFBHRoaXMHcmVndWxhcgkA8AcCBQR0aGlzCQEFdmFsdWUBBQVhc3NldAEPZ2V0QXNzZXRPcldhdmVzAQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgIFV0FWRVMFBHVuaXQJANkEAQUIYXNzZXRTdHIBC2dldFN3b3BQb29sAQRwb29sBAthc3NldElkQVN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAIKQV9hc3NldF9pZAQLYXNzZXRJZEJTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCCkJfYXNzZXRfaWQECGFzc2V0SWRBCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEFTdHIECGFzc2V0SWRCCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEJTdHIECGJhbGFuY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJhbGFuY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9CX2Fzc2V0X2JhbGFuY2UEBm91dEZlZQkAuAICBQxTY2FsZTZCaWdJbnQJALYCAQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIKY29tbWlzc2lvbgkAmwoJCQC2AgEFCGJhbGFuY2VBCQC2AgEFCGJhbGFuY2VCBQhhc3NldElkQQUIYXNzZXRJZEIFC2Fzc2V0SWRBU3RyBQthc3NldElkQlN0cgUMU2NhbGU2QmlnSW50BQZvdXRGZWUFBHBvb2wBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg1zdGFrZWRCYWxhbmNlCQDMCAIFB2Fzc2V0SWQFA25pbAUDU0VQARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhFzaGFyZUFzc2V0QmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8CBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sCQEUa2V5QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkAAABHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8CBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAETZ2V0V3hBY2NvdW50QmFsYW5jZQIEcG9vbAdhc3NldElkBA1iYWxhbmNlT25Qb29sAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQRwb29sCWF2YWlsYWJsZQkA8AcCBQRwb29sCQDZBAEFB2Fzc2V0SWQEDHRvdGFsQmFsYW5jZQkAZQIJAGQCBQ1iYWxhbmNlT25Qb29sCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8CBQRwb29sBQdhc3NldElkCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwIFBHBvb2wFB2Fzc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgUMdG90YWxCYWxhbmNlBQNuaWwBCWdldFd4UG9vbAEEcG9vbAQLYXNzZXRJZEFTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCDyVzX19hbW91bnRBc3NldAQLYXNzZXRJZEJTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCDiVzX19wcmljZUFzc2V0BAhhc3NldElkQQkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRBU3RyBAhhc3NldElkQgkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRCU3RyBAhiYWxhbmNlQQkBE2dldFd4QWNjb3VudEJhbGFuY2UCBQRwb29sBQthc3NldElkQVN0cgQIYmFsYW5jZUIJARNnZXRXeEFjY291bnRCYWxhbmNlAgUEcG9vbAULYXNzZXRJZEJTdHIEC3Byb3RvY29sRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ13eFN3YXBBZGRyZXNzAg8lc19fcHJvdG9jb2xGZWUEB3Bvb2xGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXd4U3dhcEFkZHJlc3MCCyVzX19wb29sRmVlBAVpbkZlZQkAuAICBQxTY2FsZTZCaWdJbnQJALwCAwkAtgIBCQBkAgULcHJvdG9jb2xGZWUFB3Bvb2xGZWUFDFNjYWxlNkJpZ0ludAUMU2NhbGU4QmlnSW50CQCbCgkJALYCAQUIYmFsYW5jZUEJALYCAQUIYmFsYW5jZUIFCGFzc2V0SWRBBQhhc3NldElkQgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyBQVpbkZlZQUMU2NhbGU2QmlnSW50BQ13eFN3YXBBZGRyZXNzAQhjYWxjU3dhcAUJcG10QW1vdW50CXRva2VuRnJvbQd0b2tlblRvBWluRmVlBm91dEZlZQQLY2xlYW5BbW91bnQJALwCAwUJcG10QW1vdW50BQVpbkZlZQUMU2NhbGU2QmlnSW50BBBhbW91bnRXaXRob3V0RmVlCQC8AgMFB3Rva2VuVG8FC2NsZWFuQW1vdW50CQC3AgIFC2NsZWFuQW1vdW50BQl0b2tlbkZyb20EDWFtb3VudFdpdGhGZWUJALwCAwUQYW1vdW50V2l0aG91dEZlZQUGb3V0RmVlBQxTY2FsZTZCaWdJbnQFDWFtb3VudFdpdGhGZWUBDGVzdGltYXRlU3dhcAMIcG9vbEluZm8HaW5Bc3NldAhpbkFtb3VudAQJcm91dGVBcmdzAwkAAAIFB2luQXNzZXQIBQhwb29sSW5mbwJfMwkAlQoDCAUIcG9vbEluZm8CXzQIBQhwb29sSW5mbwJfNgkBCGNhbGNTd2FwBQUIaW5BbW91bnQIBQhwb29sSW5mbwJfMQgFCHBvb2xJbmZvAl8yCAUIcG9vbEluZm8CXzcIBQhwb29sSW5mbwJfOAkAlQoDCAUIcG9vbEluZm8CXzMIBQhwb29sSW5mbwJfNQkBCGNhbGNTd2FwBQUIaW5BbW91bnQIBQhwb29sSW5mbwJfMggFCHBvb2xJbmZvAl8xCAUIcG9vbEluZm8CXzcIBQhwb29sSW5mbwJfOAQIZGFwcEFyZ3MDCQAAAggFCHBvb2xJbmZvAl85BQ13eFN3YXBBZGRyZXNzCQCUCgICBHN3YXAJAMwIAgAACQDMCAIIBQlyb3V0ZUFyZ3MCXzIJAMwIAgUOdGhpc0FkZHJlc3NTdHIFA25pbAkAlAoCAghleGNoYW5nZQkAzAgCAAEFA25pbAkAlgoECAUJcm91dGVBcmdzAl8xCAUJcm91dGVBcmdzAl8zCAUIZGFwcEFyZ3MCXzEIBQhkYXBwQXJncwJfMgENZXN0aW1hdGVSb3V0ZQcPaW5CYWxhbmNlQmlnSW50BXBvb2wxBXBvb2wyBXBvb2wzDHBvb2wxUmV2ZXJzZQxwb29sMlJldmVyc2UMcG9vbDNSZXZlcnNlBANhMTIDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMggFBXBvb2wxAl8xBANhMjEDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMQgFBXBvb2wxAl8yBANhMjMDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMggFBXBvb2wyAl8xBANhMzIDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMQgFBXBvb2wyAl8yBANhMzEDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMggFBXBvb2wzAl8xBANhMTMDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMQgFBXBvb2wzAl8yBA1hYURlbm9taW5hdG9yCQC3AgIFA2EyMwkAvAIDCQC8AgMFA2EyMQgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfNwUMU2NhbGU2QmlnSW50BARhYTEzCQC8AgMFA2ExMgUDYTIzBQ1hYURlbm9taW5hdG9yBARhYTMxCQC8AgMJALwCAwkAvAIDBQNhMjEFA2EzMgUNYWFEZW5vbWluYXRvcggFBXBvb2wyAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfOAUMU2NhbGU2QmlnSW50BAxhRGVub21pbmF0b3IJALcCAgUDYTMxCQC8AgMJALwCAwUEYWEzMQgFBXBvb2wxAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMQJfOAUMU2NhbGU2QmlnSW50BAFhCQC8AgMFBGFhMTMFA2EzMQUMYURlbm9taW5hdG9yBAJhYQkAvAIDCQC8AgMJALwCAwUEYWEzMQUDYTEzBQxhRGVub21pbmF0b3IIBQVwb29sMwJfNwUMU2NhbGU2QmlnSW50CAUFcG9vbDMCXzgFDFNjYWxlNkJpZ0ludAQFZGVsdGEJALwCAwkAuAICCQEKc3FydEJpZ0ludAQJALwCAwkAvAIDCQC8AgMFAmFhBQFhBQ1JblNjYWxlQmlnSW50CAUFcG9vbDECXzcFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQFCkluRGVjaW1hbHMFCkluRGVjaW1hbHMFB0NFSUxJTkcFAWEFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl83AwkAwAICBQpaZXJvQmlnSW50BQVkZWx0YQkAlAoCAAAFA25pbAQFaW5wdXQDCQC/AgIFBWRlbHRhBQ9pbkJhbGFuY2VCaWdJbnQFD2luQmFsYW5jZUJpZ0ludAUFZGVsdGEEBXN3YXAxCQEMZXN0aW1hdGVTd2FwAwUFcG9vbDEFB0luQXNzZXQFBWlucHV0BAVzd2FwMgkBDGVzdGltYXRlU3dhcAMFBXBvb2wyCAUFc3dhcDECXzEIBQVzd2FwMQJfMgQFc3dhcDMJAQxlc3RpbWF0ZVN3YXADBQVwb29sMwgFBXN3YXAyAl8xCAUFc3dhcDICXzIJAJQKAgkAoAMBCQC4AgIIBQVzd2FwMwJfMgUFaW5wdXQJAMwIAgkAlwoFCAUFcG9vbDECXzkIBQVzd2FwMQJfMwgFBXN3YXAxAl80BQdJbkFzc2V0CQCgAwEFBWlucHV0CQDMCAIJAJcKBQgFBXBvb2wyAl85CAUFc3dhcDICXzMIBQVzd2FwMgJfNAgFBXN3YXAxAl8xCQCgAwEIBQVzd2FwMQJfMgkAzAgCCQCXCgUIBQVwb29sMwJfOQgFBXN3YXAzAl8zCAUFc3dhcDMCXzQIBQVzd2FwMgJfMQkAoAMBCAUFc3dhcDICXzIFA25pbAEKaW52b2tlU3dhcAEEYXJncwQOY3VycmVudEJhbGFuY2UJAQpnZXRCYWxhbmNlAQgFBGFyZ3MCXzQEDXRyaW1tZWRBbW91bnQDCQBmAggFBGFyZ3MCXzUFDmN1cnJlbnRCYWxhbmNlBQ5jdXJyZW50QmFsYW5jZQgFBGFyZ3MCXzUEDHJlc3VsdEFtb3VudAMJAAACCAUEYXJncwJfNAUHSW5Bc3NldAUNdHJpbW1lZEFtb3VudAMJAGYCBQ5jdXJyZW50QmFsYW5jZQgFBGFyZ3MCXzUFDmN1cnJlbnRCYWxhbmNlBQ10cmltbWVkQW1vdW50CQD8BwQIBQRhcmdzAl8xCAUEYXJncwJfMggFBGFyZ3MCXzMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIIBQRhcmdzAl80BQxyZXN1bHRBbW91bnQFA25pbAAQc3dvcF94dG5fdXNkdHd4ZwkBC2dldFN3b3BQb29sAQkBB0FkZHJlc3MBARoBV2KDlvSlnWQ7GHE03GPK2awHDncevWRfrgANd3hfc3VyZl93YXZlcwkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVfktfkSPv3QP0tMJ98CoBZvEAsiS6hM5S4AD3d4X3N1cmZfdXNkdHd4ZwkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVfSPg6CMddu1fBxEjrYMK+JPLL5YySRVnQADHd4X3dhdmVzX3h0bgkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVftR5/NQjyTvkshzfsCfh/ILfuWgHrDr30AEHd4X3dhdmVzX3VzZHR3eGcJAQlnZXRXeFBvb2wBCQEHQWRkcmVzcwEBGgFXvyExMPhYogtFPRYgqEzgsrm9PLX4ojcPAA13eF93eF91c2R0d3hnCQEJZ2V0V3hQb29sAQkBB0FkZHJlc3MBARoBV60rHELuijj8FEfmXyzq0RyWL+qiY/ydbgALd3hfd3hfd2F2ZXMJAQlnZXRXeFBvb2wBCQEHQWRkcmVzcwEBGgFXmkQFmJm8tKiQ5rdVb7cYKMuIhtMFfR9WAAZyb3V0ZXMJAMwIAgkAmAoGBRBzd29wX3h0bl91c2R0d3hnBQx3eF93YXZlc194dG4FEHd4X3dhdmVzX3VzZHR3eGcGBgcJAMwIAgkAmAoGBRB3eF93YXZlc191c2R0d3hnBQx3eF93YXZlc194dG4FEHN3b3BfeHRuX3VzZHR3eGcGBwcJAMwIAgkAmAoGBRB3eF93YXZlc191c2R0d3hnBQ13eF9zdXJmX3dhdmVzBQ93eF9zdXJmX3VzZHR3eGcGBgcJAMwIAgkAmAoGBQ93eF9zdXJmX3VzZHR3eGcFDXd4X3N1cmZfd2F2ZXMFEHd4X3dhdmVzX3VzZHR3eGcGBwcJAMwIAgkAmAoGBRB3eF93YXZlc191c2R0d3hnBQt3eF93eF93YXZlcwUNd3hfd3hfdXNkdHd4ZwYGBwkAzAgCCQCYCgYFDXd4X3d4X3VzZHR3eGcFC3d4X3d4X3dhdmVzBRB3eF93YXZlc191c2R0d3hnBgcHBQNuaWwDAWkBB2RlZmF1bHQAAwkBAiE9AggFAWkGY2FsbGVyBQZjYWxsZXIJAAIBAgtObyB0b3VjaGluZwMJAQ5nZXRCb29sT3JGYWxzZQECBnBhdXNlZAkAAgECBlBhdXNlZAQJaW5CYWxhbmNlCgABQAkA/AcEBQRtYWluAgZib3Jyb3cJAMwIAgUKSW5Bc3NldFN0cgkAzAgCAAAFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlpbkJhbGFuY2UFCWluQmFsYW5jZQQPaW5CYWxhbmNlQmlnSW50CQC2AgEFCWluQmFsYW5jZQoBDWFjY3VtRnVuY3Rpb24CBWFjY3VtBG5leHQECmVzdGltYXRpb24JAQ1lc3RpbWF0ZVJvdXRlBwUPaW5CYWxhbmNlQmlnSW50CAUEbmV4dAJfMQgFBG5leHQCXzIIBQRuZXh0Al8zCAUEbmV4dAJfNAgFBG5leHQCXzUIBQRuZXh0Al82CQCUCgIJAM0IAggFBWFjY3VtAl8xCAUKZXN0aW1hdGlvbgJfMQkAzQgCCAUFYWNjdW0CXzIIBQplc3RpbWF0aW9uAl8yBARmb2xkCgACJGwFBnJvdXRlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDWFjY3VtRnVuY3Rpb24CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDgJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIBA1tYXhTd2FwUHJvZml0CQCWAwEIBQRmb2xkAl8xAwkAZwIAAAUNbWF4U3dhcFByb2ZpdAkAAgECDUVzdGltYXRlIGZhaWwED2VzdGltYXRlZFJlc3VsdAkAkQMCCAUEZm9sZAJfMgkBBXZhbHVlAQkAzwgCCAUEZm9sZAJfMQUNbWF4U3dhcFByb2ZpdAQHcmVzdWx0MQkBCmludm9rZVN3YXABCQCRAwIFD2VzdGltYXRlZFJlc3VsdAAAAwkAAAIFB3Jlc3VsdDEFB3Jlc3VsdDEEB3Jlc3VsdDIJAQppbnZva2VTd2FwAQkAkQMCBQ9lc3RpbWF0ZWRSZXN1bHQAAQMJAAACBQdyZXN1bHQyBQdyZXN1bHQyBAdyZXN1bHQzCQEKaW52b2tlU3dhcAEJAJEDAgUPZXN0aW1hdGVkUmVzdWx0AAIDCQAAAgUHcmVzdWx0MwUHcmVzdWx0MwQKb3V0QmFsYW5jZQkBCmdldEJhbGFuY2UBBQdJbkFzc2V0BAZwcm9maXQJAGUCBQpvdXRCYWxhbmNlBQlpbkJhbGFuY2UECXRocmVzaG9sZAkBEUBleHRyTmF0aXZlKDEwNTUpAQIJdGhyZXNob2xkBApwdXJlUHJvZml0CQBlAgUGcHJvZml0BQl0aHJlc2hvbGQDCQBnAgAABQpwdXJlUHJvZml0CQACAQIMRXhlY3V0ZSBmYWlsAwkAAAIIBQlsYXN0QmxvY2sJZ2VuZXJhdG9yBQlnZW5lcmF0b3IEBXJlcGF5CQD8BwQFBG1haW4CBXJlcGF5BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB0luQXNzZXQFCWluQmFsYW5jZQUDbmlsAwkAAAIFBXJlcGF5BQVyZXBheQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5tZXZSZXNlcnZlRnVuZAUGcHJvZml0BQdJbkFzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgttZXZfcHJvZml0XwUKSW5Bc3NldFN0cgIBXwkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUGcHJvZml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEG1ldl90b3RhbFByb2ZpdF8FCkluQXNzZXRTdHIJAGQCCQEMZ2V0SW50T3JaZXJvAQkArAICAhBtZXZfdG90YWxQcm9maXRfBQpJbkFzc2V0U3RyBQZwcm9maXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFcmVwYXkJAPwHBAUEbWFpbgIFcmVwYXkFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHSW5Bc3NldAUKb3V0QmFsYW5jZQUDbmlsAwkAAAIFBXJlcGF5BQVyZXBheQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgIHcHJvZml0XwUKSW5Bc3NldFN0cgIBXwkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUGcHJvZml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICDHRvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgkAZAIJAQxnZXRJbnRPclplcm8BCQCsAgICDHRvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgUGcHJvZml0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIc2V0UGF1c2UBBnBhdXNlZAMJAQIhPQIIBQFpBmNhbGxlcgUMY29uZmlndXJhdG9yCQACAQILTm8gdG91Y2hpbmcJAMwIAgkBDEJvb2xlYW5FbnRyeQICBnBhdXNlZAUGcGF1c2VkBQNuaWwBaQEMc2V0VGhyZXNob2xkAQh0aGVzaG9sZAMJAQIhPQIIBQFpBmNhbGxlcgUMY29uZmlndXJhdG9yCQACAQILTm8gdG91Y2hpbmcJAMwIAgkBDEludGVnZXJFbnRyeQICCXRocmVzaG9sZAUIdGhlc2hvbGQFA25pbAA9qijp", "chainId": 87, "height": 3710056, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3AfwC2NzvuP1fTE8N7V3WDbjJhm9Z674ic23SWSAUXeC Next: 3ZjgT5Bay9RcVmH3TAC6krW49M8LryxAw3D1yXb8vsXa Diff:
OldNewDifferences
2525
2626 let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK')
2727
28+let configurator = Address(base58'3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f')
29+
2830 let generator = Address(base58'3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1')
2931
30-let receiver = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK')
32+let main = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK')
3133
32-let mevreceiver = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')
34+let mevReserveFund = Address(base58'3P3mzTYSLt7dC68o81J8Y684CNmWGGKjvYw')
3335
3436 let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93')
3537
3638 let thisAddressStr = toString(this)
3739
3840 func getIntOrZero (key) = valueOrElse(getInteger(key), 0)
41+
42+
43+func getBoolOrFalse (key) = valueOrElse(getBoolean(key), false)
3944
4045
4146 func getBalance (asset) = if ((asset == unit))
4752 then unit
4853 else fromBase58String(assetStr)
4954
50-
51-let inBalance = getBalance(InAsset)
52-
53-let inBalanceBigInt = toBigInt(inBalance)
5455
5556 func getSwopPool (pool) = {
5657 let assetIdAStr = getStringValue(pool, "A_asset_id")
118119 }
119120
120121
121-func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = {
122+func estimateRoute (inBalanceBigInt,pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = {
122123 let a12 = if (pool1Reverse)
123124 then pool1._2
124125 else pool1._1
191192 @Callable(i)
192193 func default () = if ((i.caller != caller))
193194 then throw("No touching")
194- else {
195- func accumFunction (accum,next) = {
196- let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6)
197- $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2))
195+ else if (getBoolOrFalse("paused"))
196+ then throw("Paused")
197+ else {
198+ let inBalance = {
199+ let @ = invoke(main, "borrow", [InAssetStr, 0], nil)
200+ if ($isInstanceOf(@, "Int"))
201+ then @
202+ else throw(($getType(@) + " couldn't be cast to Int"))
203+ }
204+ if ((inBalance == inBalance))
205+ then {
206+ let inBalanceBigInt = toBigInt(inBalance)
207+ func accumFunction (accum,next) = {
208+ let estimation = estimateRoute(inBalanceBigInt, next._1, next._2, next._3, next._4, next._5, next._6)
209+ $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2))
210+ }
211+
212+ let fold = {
213+ let $l = routes
214+ let $s = size($l)
215+ let $acc0 = $Tuple2(nil, nil)
216+ func $f0_1 ($a,$i) = if (($i >= $s))
217+ then $a
218+ else accumFunction($a, $l[$i])
219+
220+ func $f0_2 ($a,$i) = if (($i >= $s))
221+ then $a
222+ else throw("List size exceeds 8")
223+
224+ $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)
225+ }
226+ let maxSwapProfit = max(fold._1)
227+ if ((0 >= maxSwapProfit))
228+ then throw("Estimate fail")
229+ else {
230+ let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))]
231+ let result1 = invokeSwap(estimatedResult[0])
232+ if ((result1 == result1))
233+ then {
234+ let result2 = invokeSwap(estimatedResult[1])
235+ if ((result2 == result2))
236+ then {
237+ let result3 = invokeSwap(estimatedResult[2])
238+ if ((result3 == result3))
239+ then {
240+ let outBalance = getBalance(InAsset)
241+ let profit = (outBalance - inBalance)
242+ let threshold = getIntegerValue("threshold")
243+ let pureProfit = (profit - threshold)
244+ if ((0 >= pureProfit))
245+ then throw("Execute fail")
246+ else if ((lastBlock.generator == generator))
247+ then {
248+ let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, inBalance)])
249+ if ((repay == repay))
250+ then [ScriptTransfer(mevReserveFund, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))]
251+ else throw("Strict value is not equal to itself.")
252+ }
253+ else {
254+ let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, outBalance)])
255+ if ((repay == repay))
256+ then [IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))]
257+ else throw("Strict value is not equal to itself.")
258+ }
259+ }
260+ else throw("Strict value is not equal to itself.")
261+ }
262+ else throw("Strict value is not equal to itself.")
263+ }
264+ else throw("Strict value is not equal to itself.")
265+ }
266+ }
267+ else throw("Strict value is not equal to itself.")
198268 }
199269
200- let fold = {
201- let $l = routes
202- let $s = size($l)
203- let $acc0 = $Tuple2(nil, nil)
204- func $f0_1 ($a,$i) = if (($i >= $s))
205- then $a
206- else accumFunction($a, $l[$i])
207270
208- func $f0_2 ($a,$i) = if (($i >= $s))
209- then $a
210- else throw("List size exceeds 6")
211271
212- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
213- }
214- let maxSwapProfit = max(fold._1)
215- if ((0 >= maxSwapProfit))
216- then throw("Estimate fail")
217- else {
218- let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))]
219- let result1 = invokeSwap(estimatedResult[0])
220- if ((result1 == result1))
221- then {
222- let result2 = invokeSwap(estimatedResult[1])
223- if ((result2 == result2))
224- then {
225- let result3 = invokeSwap(estimatedResult[2])
226- if ((result3 == result3))
227- then {
228- let profit = (getBalance(InAsset) - inBalance)
229- let pureProfit = if (((i.fee % 10) > 0))
230- then (profit - 16000000)
231- else (profit - 250000)
232- if ((0 >= pureProfit))
233- then throw("Execute fail")
234- else if ((lastBlock.generator == generator))
235- then [ScriptTransfer(mevreceiver, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))]
236- else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))]
237- }
238- else throw("Strict value is not equal to itself.")
239- }
240- else throw("Strict value is not equal to itself.")
241- }
242- else throw("Strict value is not equal to itself.")
243- }
244- }
272+@Callable(i)
273+func setPause (paused) = if ((i.caller != configurator))
274+ then throw("No touching")
275+ else [BooleanEntry("paused", paused)]
276+
277+
278+
279+@Callable(i)
280+func setThreshold (theshold) = if ((i.caller != configurator))
281+ then throw("No touching")
282+ else [IntegerEntry("threshold", theshold)]
245283
246284
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale6 = 1000000
55
66 let Scale6BigInt = toBigInt(Scale6)
77
88 let Scale8 = 100000000
99
1010 let Scale8BigInt = toBigInt(Scale8)
1111
1212 let ZeroBigInt = toBigInt(0)
1313
1414 let SEP = "__"
1515
1616 let InScale = 1000000
1717
1818 let InDecimals = 6
1919
2020 let InScaleBigInt = toBigInt(InScale)
2121
2222 let InAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
2323
2424 let InAssetStr = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ"
2525
2626 let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK')
2727
28+let configurator = Address(base58'3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f')
29+
2830 let generator = Address(base58'3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1')
2931
30-let receiver = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK')
32+let main = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK')
3133
32-let mevreceiver = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')
34+let mevReserveFund = Address(base58'3P3mzTYSLt7dC68o81J8Y684CNmWGGKjvYw')
3335
3436 let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93')
3537
3638 let thisAddressStr = toString(this)
3739
3840 func getIntOrZero (key) = valueOrElse(getInteger(key), 0)
41+
42+
43+func getBoolOrFalse (key) = valueOrElse(getBoolean(key), false)
3944
4045
4146 func getBalance (asset) = if ((asset == unit))
4247 then wavesBalance(this).regular
4348 else assetBalance(this, value(asset))
4449
4550
4651 func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES"))
4752 then unit
4853 else fromBase58String(assetStr)
4954
50-
51-let inBalance = getBalance(InAsset)
52-
53-let inBalanceBigInt = toBigInt(inBalance)
5455
5556 func getSwopPool (pool) = {
5657 let assetIdAStr = getStringValue(pool, "A_asset_id")
5758 let assetIdBStr = getStringValue(pool, "B_asset_id")
5859 let assetIdA = getAssetOrWaves(assetIdAStr)
5960 let assetIdB = getAssetOrWaves(assetIdBStr)
6061 let balanceA = getIntegerValue(pool, "A_asset_balance")
6162 let balanceB = getIntegerValue(pool, "B_asset_balance")
6263 let outFee = (Scale6BigInt - toBigInt(getIntegerValue(pool, "commission")))
6364 $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, Scale6BigInt, outFee, pool)
6465 }
6566
6667
6768 func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP)
6869
6970
7071 func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP)
7172
7273
7374 func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0)
7475
7576
7677 func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0)
7778
7879
7980 func getWxAccountBalance (pool,assetId) = {
8081 let balanceOnPool = if ((assetId == "WAVES"))
8182 then wavesBalance(pool).available
8283 else assetBalance(pool, fromBase58String(assetId))
8384 let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId))
8485 max([0, totalBalance])
8586 }
8687
8788
8889 func getWxPool (pool) = {
8990 let assetIdAStr = getStringValue(pool, "%s__amountAsset")
9091 let assetIdBStr = getStringValue(pool, "%s__priceAsset")
9192 let assetIdA = getAssetOrWaves(assetIdAStr)
9293 let assetIdB = getAssetOrWaves(assetIdBStr)
9394 let balanceA = getWxAccountBalance(pool, assetIdAStr)
9495 let balanceB = getWxAccountBalance(pool, assetIdBStr)
9596 let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee")
9697 let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee")
9798 let inFee = (Scale6BigInt - fraction(toBigInt((protocolFee + poolFee)), Scale6BigInt, Scale8BigInt))
9899 $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, Scale6BigInt, wxSwapAddress)
99100 }
100101
101102
102103 func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = {
103104 let cleanAmount = fraction(pmtAmount, inFee, Scale6BigInt)
104105 let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom))
105106 let amountWithFee = fraction(amountWithoutFee, outFee, Scale6BigInt)
106107 amountWithFee
107108 }
108109
109110
110111 func estimateSwap (poolInfo,inAsset,inAmount) = {
111112 let routeArgs = if ((inAsset == poolInfo._3))
112113 then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8))
113114 else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8))
114115 let dappArgs = if ((poolInfo._9 == wxSwapAddress))
115116 then $Tuple2("swap", [0, routeArgs._2, thisAddressStr])
116117 else $Tuple2("exchange", [1])
117118 $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2)
118119 }
119120
120121
121-func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = {
122+func estimateRoute (inBalanceBigInt,pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = {
122123 let a12 = if (pool1Reverse)
123124 then pool1._2
124125 else pool1._1
125126 let a21 = if (pool1Reverse)
126127 then pool1._1
127128 else pool1._2
128129 let a23 = if (pool2Reverse)
129130 then pool2._2
130131 else pool2._1
131132 let a32 = if (pool2Reverse)
132133 then pool2._1
133134 else pool2._2
134135 let a31 = if (pool3Reverse)
135136 then pool3._2
136137 else pool3._1
137138 let a13 = if (pool3Reverse)
138139 then pool3._1
139140 else pool3._2
140141 let aaDenominator = (a23 + fraction(fraction(a21, pool1._8, Scale6BigInt), pool2._7, Scale6BigInt))
141142 let aa13 = fraction(a12, a23, aaDenominator)
142143 let aa31 = fraction(fraction(fraction(a21, a32, aaDenominator), pool2._7, Scale6BigInt), pool2._8, Scale6BigInt)
143144 let aDenominator = (a31 + fraction(fraction(aa31, pool1._7, Scale6BigInt), pool1._8, Scale6BigInt))
144145 let a = fraction(aa13, a31, aDenominator)
145146 let aa = fraction(fraction(fraction(aa31, a13, aDenominator), pool3._7, Scale6BigInt), pool3._8, Scale6BigInt)
146147 let delta = fraction((sqrtBigInt(fraction(fraction(fraction(aa, a, InScaleBigInt), pool1._7, Scale6BigInt), pool1._8, Scale6BigInt), InDecimals, InDecimals, CEILING) - a), Scale6BigInt, pool1._7)
147148 if ((ZeroBigInt >= delta))
148149 then $Tuple2(0, nil)
149150 else {
150151 let input = if ((delta > inBalanceBigInt))
151152 then inBalanceBigInt
152153 else delta
153154 let swap1 = estimateSwap(pool1, InAsset, input)
154155 let swap2 = estimateSwap(pool2, swap1._1, swap1._2)
155156 let swap3 = estimateSwap(pool3, swap2._1, swap2._2)
156157 $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))])
157158 }
158159 }
159160
160161
161162 func invokeSwap (args) = {
162163 let currentBalance = getBalance(args._4)
163164 let trimmedAmount = if ((args._5 > currentBalance))
164165 then currentBalance
165166 else args._5
166167 let resultAmount = if ((args._4 == InAsset))
167168 then trimmedAmount
168169 else if ((currentBalance > args._5))
169170 then currentBalance
170171 else trimmedAmount
171172 invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)])
172173 }
173174
174175
175176 let swop_xtn_usdtwxg = getSwopPool(Address(base58'3PAunb4Dadc9rQM2VJNQBgQV3vrgF9z8Evq'))
176177
177178 let wx_surf_waves = getWxPool(Address(base58'3PNnCngfvAzyvAQ1cEudZ3o6o3tFktsBVz5'))
178179
179180 let wx_surf_usdtwxg = getWxPool(Address(base58'3PM6YyJauiFTZzVLuRcCkDwWBvWTvPYo1ZM'))
180181
181182 let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g'))
182183
183184 let wx_waves_usdtwxg = getWxPool(Address(base58'3PKMVZ7kQeaREajYi8Yc25Ro6mcNw5D6QSa'))
184185
185186 let wx_wx_usdtwxg = getWxPool(Address(base58'3PHiXGo7NTRoC2KqkMZ1y9LaA2QSrroGs8y'))
186187
187188 let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh'))
188189
189190 let routes = [$Tuple6(swop_xtn_usdtwxg, wx_waves_xtn, wx_waves_usdtwxg, true, true, false), $Tuple6(wx_waves_usdtwxg, wx_waves_xtn, swop_xtn_usdtwxg, true, false, false), $Tuple6(wx_waves_usdtwxg, wx_surf_waves, wx_surf_usdtwxg, true, true, false), $Tuple6(wx_surf_usdtwxg, wx_surf_waves, wx_waves_usdtwxg, true, false, false), $Tuple6(wx_waves_usdtwxg, wx_wx_waves, wx_wx_usdtwxg, true, true, false), $Tuple6(wx_wx_usdtwxg, wx_wx_waves, wx_waves_usdtwxg, true, false, false)]
190191
191192 @Callable(i)
192193 func default () = if ((i.caller != caller))
193194 then throw("No touching")
194- else {
195- func accumFunction (accum,next) = {
196- let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6)
197- $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2))
195+ else if (getBoolOrFalse("paused"))
196+ then throw("Paused")
197+ else {
198+ let inBalance = {
199+ let @ = invoke(main, "borrow", [InAssetStr, 0], nil)
200+ if ($isInstanceOf(@, "Int"))
201+ then @
202+ else throw(($getType(@) + " couldn't be cast to Int"))
203+ }
204+ if ((inBalance == inBalance))
205+ then {
206+ let inBalanceBigInt = toBigInt(inBalance)
207+ func accumFunction (accum,next) = {
208+ let estimation = estimateRoute(inBalanceBigInt, next._1, next._2, next._3, next._4, next._5, next._6)
209+ $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2))
210+ }
211+
212+ let fold = {
213+ let $l = routes
214+ let $s = size($l)
215+ let $acc0 = $Tuple2(nil, nil)
216+ func $f0_1 ($a,$i) = if (($i >= $s))
217+ then $a
218+ else accumFunction($a, $l[$i])
219+
220+ func $f0_2 ($a,$i) = if (($i >= $s))
221+ then $a
222+ else throw("List size exceeds 8")
223+
224+ $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)
225+ }
226+ let maxSwapProfit = max(fold._1)
227+ if ((0 >= maxSwapProfit))
228+ then throw("Estimate fail")
229+ else {
230+ let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))]
231+ let result1 = invokeSwap(estimatedResult[0])
232+ if ((result1 == result1))
233+ then {
234+ let result2 = invokeSwap(estimatedResult[1])
235+ if ((result2 == result2))
236+ then {
237+ let result3 = invokeSwap(estimatedResult[2])
238+ if ((result3 == result3))
239+ then {
240+ let outBalance = getBalance(InAsset)
241+ let profit = (outBalance - inBalance)
242+ let threshold = getIntegerValue("threshold")
243+ let pureProfit = (profit - threshold)
244+ if ((0 >= pureProfit))
245+ then throw("Execute fail")
246+ else if ((lastBlock.generator == generator))
247+ then {
248+ let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, inBalance)])
249+ if ((repay == repay))
250+ then [ScriptTransfer(mevReserveFund, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))]
251+ else throw("Strict value is not equal to itself.")
252+ }
253+ else {
254+ let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, outBalance)])
255+ if ((repay == repay))
256+ then [IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))]
257+ else throw("Strict value is not equal to itself.")
258+ }
259+ }
260+ else throw("Strict value is not equal to itself.")
261+ }
262+ else throw("Strict value is not equal to itself.")
263+ }
264+ else throw("Strict value is not equal to itself.")
265+ }
266+ }
267+ else throw("Strict value is not equal to itself.")
198268 }
199269
200- let fold = {
201- let $l = routes
202- let $s = size($l)
203- let $acc0 = $Tuple2(nil, nil)
204- func $f0_1 ($a,$i) = if (($i >= $s))
205- then $a
206- else accumFunction($a, $l[$i])
207270
208- func $f0_2 ($a,$i) = if (($i >= $s))
209- then $a
210- else throw("List size exceeds 6")
211271
212- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
213- }
214- let maxSwapProfit = max(fold._1)
215- if ((0 >= maxSwapProfit))
216- then throw("Estimate fail")
217- else {
218- let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))]
219- let result1 = invokeSwap(estimatedResult[0])
220- if ((result1 == result1))
221- then {
222- let result2 = invokeSwap(estimatedResult[1])
223- if ((result2 == result2))
224- then {
225- let result3 = invokeSwap(estimatedResult[2])
226- if ((result3 == result3))
227- then {
228- let profit = (getBalance(InAsset) - inBalance)
229- let pureProfit = if (((i.fee % 10) > 0))
230- then (profit - 16000000)
231- else (profit - 250000)
232- if ((0 >= pureProfit))
233- then throw("Execute fail")
234- else if ((lastBlock.generator == generator))
235- then [ScriptTransfer(mevreceiver, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))]
236- else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))]
237- }
238- else throw("Strict value is not equal to itself.")
239- }
240- else throw("Strict value is not equal to itself.")
241- }
242- else throw("Strict value is not equal to itself.")
243- }
244- }
272+@Callable(i)
273+func setPause (paused) = if ((i.caller != configurator))
274+ then throw("No touching")
275+ else [BooleanEntry("paused", paused)]
276+
277+
278+
279+@Callable(i)
280+func setThreshold (theshold) = if ((i.caller != configurator))
281+ then throw("No touching")
282+ else [IntegerEntry("threshold", theshold)]
245283
246284

github/deemru/w8io/3ef1775 
37.05 ms