tx · AYHmg1NazjuQWkqkiC6Fe7PChFkqZjxHrSufRShJc9uH 3P4YQSjiJJ8WRpuo7NxRX7WSp8Gxn53GDmt: -0.00800000 Waves 2023.06.29 22:58 [3710051] smart account 3P4YQSjiJJ8WRpuo7NxRX7WSp8Gxn53GDmt > SELF 0.00000000 Waves
{ "type": 13, "id": "AYHmg1NazjuQWkqkiC6Fe7PChFkqZjxHrSufRShJc9uH", "fee": 800000, "feeAssetId": null, "timestamp": 1688068708793, "version": 1, "sender": "3P4YQSjiJJ8WRpuo7NxRX7WSp8Gxn53GDmt", "senderPublicKey": "HSNibaGEMpnqqSQpHTkc81Ug2MLwDqXqbhFsW6E75kC3", "proofs": [ "83NLz2uve9wjZFVRgcBFXUUu4vARdbFzywEhc7b4qeMSrsakyaoDbhf23R2VTuHSCv88XHp2gm4JLNbKJhSA6cm" ], "script": "base64:BgIOCAISABIDCgEEEgMKAQElAAZTY2FsZTYAwIQ9AAxTY2FsZTZCaWdJbnQJALYCAQUGU2NhbGU2AAZTY2FsZTgAgMLXLwAMU2NhbGU4QmlnSW50CQC2AgEFBlNjYWxlOAAKWmVyb0JpZ0ludAkAtgIBAAAAA1NFUAICX18AB0luU2NhbGUAwIQ9AApJbkRlY2ltYWxzAAYADUluU2NhbGVCaWdJbnQJALYCAQUHSW5TY2FsZQAHSW5Bc3NldAEgUjPZ4ZeIJuXiH8L96og0uId2o4yxg+/IYBx+ChJUJiUACkluQXNzZXRTdHICLDZYdEhqcFhiczlSUkpQMlNyOUdVeVZxekFDY2J5OVRrVGhIWG5qVkM1Q0RKAAZjYWxsZXIJAQdBZGRyZXNzAQEaAVfyTI2mBDNxC6+/pEnHCC85SsZCCZoQMLQADGNvbmZpZ3VyYXRvcgkBB0FkZHJlc3MBARoBV0AaOZfQDuIJbWeUCWOxPxWW6J/dSy2+5AAJZ2VuZXJhdG9yCQEHQWRkcmVzcwEBGgFXd9FKwAAmD1BtgyWzWnaE5eM5+V4NDHFEAARtYWluCQEHQWRkcmVzcwEBGgFXzwVpc5WHWCMCZyG8j4lfknpm6KQeMn4YAA5tZXZSZXNlcnZlRnVuZAkBB0FkZHJlc3MBARoBVxRBSlrcSQMDknVAKWPSozf9b6nVeeCqAAANd3hTd2FwQWRkcmVzcwkBB0FkZHJlc3MBARoBVy4qNTWxDbfxeT7ht0bQnnRSTXsx0IOuBgAOdGhpc0FkZHJlc3NTdHIJAKUIAQUEdGhpcwEMZ2V0SW50T3JaZXJvAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUDa2V5AAABDmdldEJvb2xPckZhbHNlAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAKAIAQUDa2V5BwEKZ2V0QmFsYW5jZQEFYXNzZXQDCQAAAgUFYXNzZXQFBHVuaXQICQDvBwEFBHRoaXMHcmVndWxhcgkA8AcCBQR0aGlzCQEFdmFsdWUBBQVhc3NldAEPZ2V0QXNzZXRPcldhdmVzAQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgIFV0FWRVMFBHVuaXQJANkEAQUIYXNzZXRTdHIBC2dldFN3b3BQb29sAQRwb29sBAthc3NldElkQVN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAIKQV9hc3NldF9pZAQLYXNzZXRJZEJTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCCkJfYXNzZXRfaWQECGFzc2V0SWRBCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEFTdHIECGFzc2V0SWRCCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEJTdHIECGJhbGFuY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJhbGFuY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9CX2Fzc2V0X2JhbGFuY2UEBm91dEZlZQkAuAICBQxTY2FsZTZCaWdJbnQJALYCAQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIKY29tbWlzc2lvbgkAmwoJCQC2AgEFCGJhbGFuY2VBCQC2AgEFCGJhbGFuY2VCBQhhc3NldElkQQUIYXNzZXRJZEIFC2Fzc2V0SWRBU3RyBQthc3NldElkQlN0cgUMU2NhbGU2QmlnSW50BQZvdXRGZWUFBHBvb2wBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg1zdGFrZWRCYWxhbmNlCQDMCAIFB2Fzc2V0SWQFA25pbAUDU0VQARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhFzaGFyZUFzc2V0QmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8CBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sCQEUa2V5QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkAAABHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8CBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAETZ2V0V3hBY2NvdW50QmFsYW5jZQIEcG9vbAdhc3NldElkBA1iYWxhbmNlT25Qb29sAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQRwb29sCWF2YWlsYWJsZQkA8AcCBQRwb29sCQDZBAEFB2Fzc2V0SWQEDHRvdGFsQmFsYW5jZQkAZQIJAGQCBQ1iYWxhbmNlT25Qb29sCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8CBQRwb29sBQdhc3NldElkCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwIFBHBvb2wFB2Fzc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgUMdG90YWxCYWxhbmNlBQNuaWwBCWdldFd4UG9vbAEEcG9vbAQLYXNzZXRJZEFTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCDyVzX19hbW91bnRBc3NldAQLYXNzZXRJZEJTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCDiVzX19wcmljZUFzc2V0BAhhc3NldElkQQkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRBU3RyBAhhc3NldElkQgkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRCU3RyBAhiYWxhbmNlQQkBE2dldFd4QWNjb3VudEJhbGFuY2UCBQRwb29sBQthc3NldElkQVN0cgQIYmFsYW5jZUIJARNnZXRXeEFjY291bnRCYWxhbmNlAgUEcG9vbAULYXNzZXRJZEJTdHIEC3Byb3RvY29sRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ13eFN3YXBBZGRyZXNzAg8lc19fcHJvdG9jb2xGZWUEB3Bvb2xGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXd4U3dhcEFkZHJlc3MCCyVzX19wb29sRmVlBAVpbkZlZQkAuAICBQxTY2FsZTZCaWdJbnQJALwCAwkAtgIBCQBkAgULcHJvdG9jb2xGZWUFB3Bvb2xGZWUFDFNjYWxlNkJpZ0ludAUMU2NhbGU4QmlnSW50CQCbCgkJALYCAQUIYmFsYW5jZUEJALYCAQUIYmFsYW5jZUIFCGFzc2V0SWRBBQhhc3NldElkQgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyBQVpbkZlZQUMU2NhbGU2QmlnSW50BQ13eFN3YXBBZGRyZXNzAQhjYWxjU3dhcAUJcG10QW1vdW50CXRva2VuRnJvbQd0b2tlblRvBWluRmVlBm91dEZlZQQLY2xlYW5BbW91bnQJALwCAwUJcG10QW1vdW50BQVpbkZlZQUMU2NhbGU2QmlnSW50BBBhbW91bnRXaXRob3V0RmVlCQC8AgMFB3Rva2VuVG8FC2NsZWFuQW1vdW50CQC3AgIFC2NsZWFuQW1vdW50BQl0b2tlbkZyb20EDWFtb3VudFdpdGhGZWUJALwCAwUQYW1vdW50V2l0aG91dEZlZQUGb3V0RmVlBQxTY2FsZTZCaWdJbnQFDWFtb3VudFdpdGhGZWUBDGVzdGltYXRlU3dhcAMIcG9vbEluZm8HaW5Bc3NldAhpbkFtb3VudAQJcm91dGVBcmdzAwkAAAIFB2luQXNzZXQIBQhwb29sSW5mbwJfMwkAlQoDCAUIcG9vbEluZm8CXzQIBQhwb29sSW5mbwJfNgkBCGNhbGNTd2FwBQUIaW5BbW91bnQIBQhwb29sSW5mbwJfMQgFCHBvb2xJbmZvAl8yCAUIcG9vbEluZm8CXzcIBQhwb29sSW5mbwJfOAkAlQoDCAUIcG9vbEluZm8CXzMIBQhwb29sSW5mbwJfNQkBCGNhbGNTd2FwBQUIaW5BbW91bnQIBQhwb29sSW5mbwJfMggFCHBvb2xJbmZvAl8xCAUIcG9vbEluZm8CXzcIBQhwb29sSW5mbwJfOAQIZGFwcEFyZ3MDCQAAAggFCHBvb2xJbmZvAl85BQ13eFN3YXBBZGRyZXNzCQCUCgICBHN3YXAJAMwIAgAACQDMCAIIBQlyb3V0ZUFyZ3MCXzIJAMwIAgUOdGhpc0FkZHJlc3NTdHIFA25pbAkAlAoCAghleGNoYW5nZQkAzAgCAAEFA25pbAkAlgoECAUJcm91dGVBcmdzAl8xCAUJcm91dGVBcmdzAl8zCAUIZGFwcEFyZ3MCXzEIBQhkYXBwQXJncwJfMgENZXN0aW1hdGVSb3V0ZQcPaW5CYWxhbmNlQmlnSW50BXBvb2wxBXBvb2wyBXBvb2wzDHBvb2wxUmV2ZXJzZQxwb29sMlJldmVyc2UMcG9vbDNSZXZlcnNlBANhMTIDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMggFBXBvb2wxAl8xBANhMjEDBQxwb29sMVJldmVyc2UIBQVwb29sMQJfMQgFBXBvb2wxAl8yBANhMjMDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMggFBXBvb2wyAl8xBANhMzIDBQxwb29sMlJldmVyc2UIBQVwb29sMgJfMQgFBXBvb2wyAl8yBANhMzEDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMggFBXBvb2wzAl8xBANhMTMDBQxwb29sM1JldmVyc2UIBQVwb29sMwJfMQgFBXBvb2wzAl8yBA1hYURlbm9taW5hdG9yCQC3AgIFA2EyMwkAvAIDCQC8AgMFA2EyMQgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfNwUMU2NhbGU2QmlnSW50BARhYTEzCQC8AgMFA2ExMgUDYTIzBQ1hYURlbm9taW5hdG9yBARhYTMxCQC8AgMJALwCAwkAvAIDBQNhMjEFA2EzMgUNYWFEZW5vbWluYXRvcggFBXBvb2wyAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMgJfOAUMU2NhbGU2QmlnSW50BAxhRGVub21pbmF0b3IJALcCAgUDYTMxCQC8AgMJALwCAwUEYWEzMQgFBXBvb2wxAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMQJfOAUMU2NhbGU2QmlnSW50BAFhCQC8AgMFBGFhMTMFA2EzMQUMYURlbm9taW5hdG9yBAJhYQkAvAIDCQC8AgMJALwCAwUEYWEzMQUDYTEzBQxhRGVub21pbmF0b3IIBQVwb29sMwJfNwUMU2NhbGU2QmlnSW50CAUFcG9vbDMCXzgFDFNjYWxlNkJpZ0ludAQFZGVsdGEJALwCAwkAuAICCQEKc3FydEJpZ0ludAQJALwCAwkAvAIDCQC8AgMFAmFhBQFhBQ1JblNjYWxlQmlnSW50CAUFcG9vbDECXzcFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQFCkluRGVjaW1hbHMFCkluRGVjaW1hbHMFB0NFSUxJTkcFAWEFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl83AwkAwAICBQpaZXJvQmlnSW50BQVkZWx0YQkAlAoCAAAFA25pbAQFaW5wdXQDCQC/AgIFBWRlbHRhBQ9pbkJhbGFuY2VCaWdJbnQFD2luQmFsYW5jZUJpZ0ludAUFZGVsdGEEBXN3YXAxCQEMZXN0aW1hdGVTd2FwAwUFcG9vbDEFB0luQXNzZXQFBWlucHV0BAVzd2FwMgkBDGVzdGltYXRlU3dhcAMFBXBvb2wyCAUFc3dhcDECXzEIBQVzd2FwMQJfMgQFc3dhcDMJAQxlc3RpbWF0ZVN3YXADBQVwb29sMwgFBXN3YXAyAl8xCAUFc3dhcDICXzIJAJQKAgkAoAMBCQC4AgIIBQVzd2FwMwJfMgUFaW5wdXQJAMwIAgkAlwoFCAUFcG9vbDECXzkIBQVzd2FwMQJfMwgFBXN3YXAxAl80BQdJbkFzc2V0CQCgAwEFBWlucHV0CQDMCAIJAJcKBQgFBXBvb2wyAl85CAUFc3dhcDICXzMIBQVzd2FwMgJfNAgFBXN3YXAxAl8xCQCgAwEIBQVzd2FwMQJfMgkAzAgCCQCXCgUIBQVwb29sMwJfOQgFBXN3YXAzAl8zCAUFc3dhcDMCXzQIBQVzd2FwMgJfMQkAoAMBCAUFc3dhcDICXzIFA25pbAEKaW52b2tlU3dhcAEEYXJncwQOY3VycmVudEJhbGFuY2UJAQpnZXRCYWxhbmNlAQgFBGFyZ3MCXzQEDXRyaW1tZWRBbW91bnQDCQBmAggFBGFyZ3MCXzUFDmN1cnJlbnRCYWxhbmNlBQ5jdXJyZW50QmFsYW5jZQgFBGFyZ3MCXzUEDHJlc3VsdEFtb3VudAMJAAACCAUEYXJncwJfNAUHSW5Bc3NldAUNdHJpbW1lZEFtb3VudAMJAGYCBQ5jdXJyZW50QmFsYW5jZQgFBGFyZ3MCXzUFDmN1cnJlbnRCYWxhbmNlBQ10cmltbWVkQW1vdW50CQD8BwQIBQRhcmdzAl8xCAUEYXJncwJfMggFBGFyZ3MCXzMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIIBQRhcmdzAl80BQxyZXN1bHRBbW91bnQFA25pbAANd3hfc3VyZl93YXZlcwkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVfktfkSPv3QP0tMJ98CoBZvEAsiS6hM5S4AD3d4X3N1cmZfdXNkY3d4ZwkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVdqxhGGceC5b2TQY/zcVjtAqGcauL66RJUAEHd4X3dhdmVzX3VzZGN3eGcJAQlnZXRXeFBvb2wBCQEHQWRkcmVzcwEBGgFXEyF1uGmUd54hELLaF3fjhDou4O6EeMvkAAZyb3V0ZXMJAMwIAgkAmAoGBRB3eF93YXZlc191c2Rjd3hnBQ13eF9zdXJmX3dhdmVzBQ93eF9zdXJmX3VzZGN3eGcGBgcJAMwIAgkAmAoGBQ93eF9zdXJmX3VzZGN3eGcFDXd4X3N1cmZfd2F2ZXMFEHd4X3dhdmVzX3VzZGN3eGcGBwcFA25pbAMBaQEHZGVmYXVsdAADCQECIT0CCAUBaQZjYWxsZXIFBmNhbGxlcgkAAgECC05vIHRvdWNoaW5nAwkBDmdldEJvb2xPckZhbHNlAQIGcGF1c2VkCQACAQIGUGF1c2VkBAlpbkJhbGFuY2UKAAFACQD8BwQFBG1haW4CBmJvcnJvdwkAzAgCBQpJbkFzc2V0U3RyCQDMCAIAAAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCWluQmFsYW5jZQUJaW5CYWxhbmNlBA9pbkJhbGFuY2VCaWdJbnQJALYCAQUJaW5CYWxhbmNlCgENYWNjdW1GdW5jdGlvbgIFYWNjdW0EbmV4dAQKZXN0aW1hdGlvbgkBDWVzdGltYXRlUm91dGUHBQ9pbkJhbGFuY2VCaWdJbnQIBQRuZXh0Al8xCAUEbmV4dAJfMggFBG5leHQCXzMIBQRuZXh0Al80CAUEbmV4dAJfNQgFBG5leHQCXzYJAJQKAgkAzQgCCAUFYWNjdW0CXzEIBQplc3RpbWF0aW9uAl8xCQDNCAIIBQVhY2N1bQJfMggFCmVzdGltYXRpb24CXzIEBGZvbGQKAAIkbAUGcm91dGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENYWNjdW1GdW5jdGlvbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgEDW1heFN3YXBQcm9maXQJAJYDAQgFBGZvbGQCXzEDCQBnAgAABQ1tYXhTd2FwUHJvZml0CQACAQINRXN0aW1hdGUgZmFpbAQPZXN0aW1hdGVkUmVzdWx0CQCRAwIIBQRmb2xkAl8yCQEFdmFsdWUBCQDPCAIIBQRmb2xkAl8xBQ1tYXhTd2FwUHJvZml0BAdyZXN1bHQxCQEKaW52b2tlU3dhcAEJAJEDAgUPZXN0aW1hdGVkUmVzdWx0AAADCQAAAgUHcmVzdWx0MQUHcmVzdWx0MQQHcmVzdWx0MgkBCmludm9rZVN3YXABCQCRAwIFD2VzdGltYXRlZFJlc3VsdAABAwkAAAIFB3Jlc3VsdDIFB3Jlc3VsdDIEB3Jlc3VsdDMJAQppbnZva2VTd2FwAQkAkQMCBQ9lc3RpbWF0ZWRSZXN1bHQAAgMJAAACBQdyZXN1bHQzBQdyZXN1bHQzBApvdXRCYWxhbmNlCQEKZ2V0QmFsYW5jZQEFB0luQXNzZXQEBnByb2ZpdAkAZQIFCm91dEJhbGFuY2UFCWluQmFsYW5jZQQJdGhyZXNob2xkCQERQGV4dHJOYXRpdmUoMTA1NSkBAgl0aHJlc2hvbGQECnB1cmVQcm9maXQJAGUCBQZwcm9maXQFCXRocmVzaG9sZAMJAGcCAAAFCnB1cmVQcm9maXQJAAIBAgxFeGVjdXRlIGZhaWwDCQAAAggFCWxhc3RCbG9jawlnZW5lcmF0b3IFCWdlbmVyYXRvcgQFcmVwYXkJAPwHBAUEbWFpbgIFcmVwYXkFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUHSW5Bc3NldAUJaW5CYWxhbmNlBQNuaWwDCQAAAgUFcmVwYXkFBXJlcGF5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDm1ldlJlc2VydmVGdW5kBQZwcm9maXQFB0luQXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgICC21ldl9wcm9maXRfBQpJbkFzc2V0U3RyAgFfCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQZwcm9maXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIQbWV2X3RvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgkAZAIJAQxnZXRJbnRPclplcm8BCQCsAgICEG1ldl90b3RhbFByb2ZpdF8FCkluQXNzZXRTdHIFBnByb2ZpdAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAVyZXBheQkA/AcEBQRtYWluAgVyZXBheQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdJbkFzc2V0BQpvdXRCYWxhbmNlBQNuaWwDCQAAAgUFcmVwYXkFBXJlcGF5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICAgdwcm9maXRfBQpJbkFzc2V0U3RyAgFfCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQZwcm9maXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIMdG90YWxQcm9maXRfBQpJbkFzc2V0U3RyCQBkAgkBDGdldEludE9yWmVybwEJAKwCAgIMdG90YWxQcm9maXRfBQpJbkFzc2V0U3RyBQZwcm9maXQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhzZXRQYXVzZQEGcGF1c2VkAwkBAiE9AggFAWkGY2FsbGVyBQxjb25maWd1cmF0b3IJAAIBAgtObyB0b3VjaGluZwkAzAgCCQEMQm9vbGVhbkVudHJ5AgIGcGF1c2VkBQZwYXVzZWQFA25pbAFpAQxzZXRUaHJlc2hvbGQBCHRoZXNob2xkAwkBAiE9AggFAWkGY2FsbGVyBQxjb25maWd1cmF0b3IJAAIBAgtObyB0b3VjaGluZwkAzAgCCQEMSW50ZWdlckVudHJ5AgIJdGhyZXNob2xkBQh0aGVzaG9sZAUDbmlsAE/HgS8=", "chainId": 87, "height": 3710051, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9t8Dd8suV2SWJq2Qk8HYGtvvLz7Vz79aP5KzZk9kWtbJ Next: Bd7kAaGYATxmhCoZhnaT41P4WfkfJhgCRLVH6Peksp52 Diff:
Old | New | Differences | |
---|---|---|---|
25 | 25 | ||
26 | 26 | let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK') | |
27 | 27 | ||
28 | + | let configurator = Address(base58'3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f') | |
29 | + | ||
28 | 30 | let generator = Address(base58'3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1') | |
29 | 31 | ||
30 | - | let | |
32 | + | let main = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK') | |
31 | 33 | ||
32 | - | let | |
34 | + | let mevReserveFund = Address(base58'3P3mzTYSLt7dC68o81J8Y684CNmWGGKjvYw') | |
33 | 35 | ||
34 | 36 | let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
35 | 37 | ||
36 | 38 | let thisAddressStr = toString(this) | |
37 | 39 | ||
38 | 40 | func getIntOrZero (key) = valueOrElse(getInteger(key), 0) | |
41 | + | ||
42 | + | ||
43 | + | func getBoolOrFalse (key) = valueOrElse(getBoolean(key), false) | |
39 | 44 | ||
40 | 45 | ||
41 | 46 | func getBalance (asset) = if ((asset == unit)) | |
47 | 52 | then unit | |
48 | 53 | else fromBase58String(assetStr) | |
49 | 54 | ||
50 | - | ||
51 | - | let inBalance = getBalance(InAsset) | |
52 | - | ||
53 | - | let inBalanceBigInt = toBigInt(inBalance) | |
54 | 55 | ||
55 | 56 | func getSwopPool (pool) = { | |
56 | 57 | let assetIdAStr = getStringValue(pool, "A_asset_id") | |
118 | 119 | } | |
119 | 120 | ||
120 | 121 | ||
121 | - | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
122 | + | func estimateRoute (inBalanceBigInt,pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
122 | 123 | let a12 = if (pool1Reverse) | |
123 | 124 | then pool1._2 | |
124 | 125 | else pool1._1 | |
183 | 184 | @Callable(i) | |
184 | 185 | func default () = if ((i.caller != caller)) | |
185 | 186 | then throw("No touching") | |
186 | - | else { | |
187 | - | func accumFunction (accum,next) = { | |
188 | - | let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6) | |
189 | - | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
187 | + | else if (getBoolOrFalse("paused")) | |
188 | + | then throw("Paused") | |
189 | + | else { | |
190 | + | let inBalance = { | |
191 | + | let @ = invoke(main, "borrow", [InAssetStr, 0], nil) | |
192 | + | if ($isInstanceOf(@, "Int")) | |
193 | + | then @ | |
194 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
195 | + | } | |
196 | + | if ((inBalance == inBalance)) | |
197 | + | then { | |
198 | + | let inBalanceBigInt = toBigInt(inBalance) | |
199 | + | func accumFunction (accum,next) = { | |
200 | + | let estimation = estimateRoute(inBalanceBigInt, next._1, next._2, next._3, next._4, next._5, next._6) | |
201 | + | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
202 | + | } | |
203 | + | ||
204 | + | let fold = { | |
205 | + | let $l = routes | |
206 | + | let $s = size($l) | |
207 | + | let $acc0 = $Tuple2(nil, nil) | |
208 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
209 | + | then $a | |
210 | + | else accumFunction($a, $l[$i]) | |
211 | + | ||
212 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
213 | + | then $a | |
214 | + | else throw("List size exceeds 8") | |
215 | + | ||
216 | + | $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) | |
217 | + | } | |
218 | + | let maxSwapProfit = max(fold._1) | |
219 | + | if ((0 >= maxSwapProfit)) | |
220 | + | then throw("Estimate fail") | |
221 | + | else { | |
222 | + | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
223 | + | let result1 = invokeSwap(estimatedResult[0]) | |
224 | + | if ((result1 == result1)) | |
225 | + | then { | |
226 | + | let result2 = invokeSwap(estimatedResult[1]) | |
227 | + | if ((result2 == result2)) | |
228 | + | then { | |
229 | + | let result3 = invokeSwap(estimatedResult[2]) | |
230 | + | if ((result3 == result3)) | |
231 | + | then { | |
232 | + | let outBalance = getBalance(InAsset) | |
233 | + | let profit = (outBalance - inBalance) | |
234 | + | let threshold = getIntegerValue("threshold") | |
235 | + | let pureProfit = (profit - threshold) | |
236 | + | if ((0 >= pureProfit)) | |
237 | + | then throw("Execute fail") | |
238 | + | else if ((lastBlock.generator == generator)) | |
239 | + | then { | |
240 | + | let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, inBalance)]) | |
241 | + | if ((repay == repay)) | |
242 | + | then [ScriptTransfer(mevReserveFund, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))] | |
243 | + | else throw("Strict value is not equal to itself.") | |
244 | + | } | |
245 | + | else { | |
246 | + | let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, outBalance)]) | |
247 | + | if ((repay == repay)) | |
248 | + | then [IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))] | |
249 | + | else throw("Strict value is not equal to itself.") | |
250 | + | } | |
251 | + | } | |
252 | + | else throw("Strict value is not equal to itself.") | |
253 | + | } | |
254 | + | else throw("Strict value is not equal to itself.") | |
255 | + | } | |
256 | + | else throw("Strict value is not equal to itself.") | |
257 | + | } | |
258 | + | } | |
259 | + | else throw("Strict value is not equal to itself.") | |
190 | 260 | } | |
191 | 261 | ||
192 | - | let fold = { | |
193 | - | let $l = routes | |
194 | - | let $s = size($l) | |
195 | - | let $acc0 = $Tuple2(nil, nil) | |
196 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
197 | - | then $a | |
198 | - | else accumFunction($a, $l[$i]) | |
199 | 262 | ||
200 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
201 | - | then $a | |
202 | - | else throw("List size exceeds 2") | |
203 | 263 | ||
204 | - | $f0_2($f0_1($f0_1($acc0, 0), 1), 2) | |
205 | - | } | |
206 | - | let maxSwapProfit = max(fold._1) | |
207 | - | if ((0 >= maxSwapProfit)) | |
208 | - | then throw("Estimate fail") | |
209 | - | else { | |
210 | - | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
211 | - | let result1 = invokeSwap(estimatedResult[0]) | |
212 | - | if ((result1 == result1)) | |
213 | - | then { | |
214 | - | let result2 = invokeSwap(estimatedResult[1]) | |
215 | - | if ((result2 == result2)) | |
216 | - | then { | |
217 | - | let result3 = invokeSwap(estimatedResult[2]) | |
218 | - | if ((result3 == result3)) | |
219 | - | then { | |
220 | - | let profit = (getBalance(InAsset) - inBalance) | |
221 | - | let pureProfit = if (((i.fee % 10) > 0)) | |
222 | - | then (profit - 16000000) | |
223 | - | else (profit - 250000) | |
224 | - | if ((0 >= pureProfit)) | |
225 | - | then throw("Execute fail") | |
226 | - | else if ((lastBlock.generator == generator)) | |
227 | - | then [ScriptTransfer(mevreceiver, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))] | |
228 | - | else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))] | |
229 | - | } | |
230 | - | else throw("Strict value is not equal to itself.") | |
231 | - | } | |
232 | - | else throw("Strict value is not equal to itself.") | |
233 | - | } | |
234 | - | else throw("Strict value is not equal to itself.") | |
235 | - | } | |
236 | - | } | |
264 | + | @Callable(i) | |
265 | + | func setPause (paused) = if ((i.caller != configurator)) | |
266 | + | then throw("No touching") | |
267 | + | else [BooleanEntry("paused", paused)] | |
268 | + | ||
269 | + | ||
270 | + | ||
271 | + | @Callable(i) | |
272 | + | func setThreshold (theshold) = if ((i.caller != configurator)) | |
273 | + | then throw("No touching") | |
274 | + | else [IntegerEntry("threshold", theshold)] | |
237 | 275 | ||
238 | 276 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let Scale6 = 1000000 | |
5 | 5 | ||
6 | 6 | let Scale6BigInt = toBigInt(Scale6) | |
7 | 7 | ||
8 | 8 | let Scale8 = 100000000 | |
9 | 9 | ||
10 | 10 | let Scale8BigInt = toBigInt(Scale8) | |
11 | 11 | ||
12 | 12 | let ZeroBigInt = toBigInt(0) | |
13 | 13 | ||
14 | 14 | let SEP = "__" | |
15 | 15 | ||
16 | 16 | let InScale = 1000000 | |
17 | 17 | ||
18 | 18 | let InDecimals = 6 | |
19 | 19 | ||
20 | 20 | let InScaleBigInt = toBigInt(InScale) | |
21 | 21 | ||
22 | 22 | let InAsset = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ' | |
23 | 23 | ||
24 | 24 | let InAssetStr = "6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" | |
25 | 25 | ||
26 | 26 | let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK') | |
27 | 27 | ||
28 | + | let configurator = Address(base58'3P7mqPfcMt4GeBE1U8gF9jgpCT9T85fSK4f') | |
29 | + | ||
28 | 30 | let generator = Address(base58'3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1') | |
29 | 31 | ||
30 | - | let | |
32 | + | let main = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK') | |
31 | 33 | ||
32 | - | let | |
34 | + | let mevReserveFund = Address(base58'3P3mzTYSLt7dC68o81J8Y684CNmWGGKjvYw') | |
33 | 35 | ||
34 | 36 | let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
35 | 37 | ||
36 | 38 | let thisAddressStr = toString(this) | |
37 | 39 | ||
38 | 40 | func getIntOrZero (key) = valueOrElse(getInteger(key), 0) | |
41 | + | ||
42 | + | ||
43 | + | func getBoolOrFalse (key) = valueOrElse(getBoolean(key), false) | |
39 | 44 | ||
40 | 45 | ||
41 | 46 | func getBalance (asset) = if ((asset == unit)) | |
42 | 47 | then wavesBalance(this).regular | |
43 | 48 | else assetBalance(this, value(asset)) | |
44 | 49 | ||
45 | 50 | ||
46 | 51 | func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES")) | |
47 | 52 | then unit | |
48 | 53 | else fromBase58String(assetStr) | |
49 | 54 | ||
50 | - | ||
51 | - | let inBalance = getBalance(InAsset) | |
52 | - | ||
53 | - | let inBalanceBigInt = toBigInt(inBalance) | |
54 | 55 | ||
55 | 56 | func getSwopPool (pool) = { | |
56 | 57 | let assetIdAStr = getStringValue(pool, "A_asset_id") | |
57 | 58 | let assetIdBStr = getStringValue(pool, "B_asset_id") | |
58 | 59 | let assetIdA = getAssetOrWaves(assetIdAStr) | |
59 | 60 | let assetIdB = getAssetOrWaves(assetIdBStr) | |
60 | 61 | let balanceA = getIntegerValue(pool, "A_asset_balance") | |
61 | 62 | let balanceB = getIntegerValue(pool, "B_asset_balance") | |
62 | 63 | let outFee = (Scale6BigInt - toBigInt(getIntegerValue(pool, "commission"))) | |
63 | 64 | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, Scale6BigInt, outFee, pool) | |
64 | 65 | } | |
65 | 66 | ||
66 | 67 | ||
67 | 68 | func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP) | |
68 | 69 | ||
69 | 70 | ||
70 | 71 | func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP) | |
71 | 72 | ||
72 | 73 | ||
73 | 74 | func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0) | |
74 | 75 | ||
75 | 76 | ||
76 | 77 | func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0) | |
77 | 78 | ||
78 | 79 | ||
79 | 80 | func getWxAccountBalance (pool,assetId) = { | |
80 | 81 | let balanceOnPool = if ((assetId == "WAVES")) | |
81 | 82 | then wavesBalance(pool).available | |
82 | 83 | else assetBalance(pool, fromBase58String(assetId)) | |
83 | 84 | let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId)) | |
84 | 85 | max([0, totalBalance]) | |
85 | 86 | } | |
86 | 87 | ||
87 | 88 | ||
88 | 89 | func getWxPool (pool) = { | |
89 | 90 | let assetIdAStr = getStringValue(pool, "%s__amountAsset") | |
90 | 91 | let assetIdBStr = getStringValue(pool, "%s__priceAsset") | |
91 | 92 | let assetIdA = getAssetOrWaves(assetIdAStr) | |
92 | 93 | let assetIdB = getAssetOrWaves(assetIdBStr) | |
93 | 94 | let balanceA = getWxAccountBalance(pool, assetIdAStr) | |
94 | 95 | let balanceB = getWxAccountBalance(pool, assetIdBStr) | |
95 | 96 | let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee") | |
96 | 97 | let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee") | |
97 | 98 | let inFee = (Scale6BigInt - fraction(toBigInt((protocolFee + poolFee)), Scale6BigInt, Scale8BigInt)) | |
98 | 99 | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, Scale6BigInt, wxSwapAddress) | |
99 | 100 | } | |
100 | 101 | ||
101 | 102 | ||
102 | 103 | func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = { | |
103 | 104 | let cleanAmount = fraction(pmtAmount, inFee, Scale6BigInt) | |
104 | 105 | let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom)) | |
105 | 106 | let amountWithFee = fraction(amountWithoutFee, outFee, Scale6BigInt) | |
106 | 107 | amountWithFee | |
107 | 108 | } | |
108 | 109 | ||
109 | 110 | ||
110 | 111 | func estimateSwap (poolInfo,inAsset,inAmount) = { | |
111 | 112 | let routeArgs = if ((inAsset == poolInfo._3)) | |
112 | 113 | then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8)) | |
113 | 114 | else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8)) | |
114 | 115 | let dappArgs = if ((poolInfo._9 == wxSwapAddress)) | |
115 | 116 | then $Tuple2("swap", [0, routeArgs._2, thisAddressStr]) | |
116 | 117 | else $Tuple2("exchange", [1]) | |
117 | 118 | $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2) | |
118 | 119 | } | |
119 | 120 | ||
120 | 121 | ||
121 | - | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
122 | + | func estimateRoute (inBalanceBigInt,pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
122 | 123 | let a12 = if (pool1Reverse) | |
123 | 124 | then pool1._2 | |
124 | 125 | else pool1._1 | |
125 | 126 | let a21 = if (pool1Reverse) | |
126 | 127 | then pool1._1 | |
127 | 128 | else pool1._2 | |
128 | 129 | let a23 = if (pool2Reverse) | |
129 | 130 | then pool2._2 | |
130 | 131 | else pool2._1 | |
131 | 132 | let a32 = if (pool2Reverse) | |
132 | 133 | then pool2._1 | |
133 | 134 | else pool2._2 | |
134 | 135 | let a31 = if (pool3Reverse) | |
135 | 136 | then pool3._2 | |
136 | 137 | else pool3._1 | |
137 | 138 | let a13 = if (pool3Reverse) | |
138 | 139 | then pool3._1 | |
139 | 140 | else pool3._2 | |
140 | 141 | let aaDenominator = (a23 + fraction(fraction(a21, pool1._8, Scale6BigInt), pool2._7, Scale6BigInt)) | |
141 | 142 | let aa13 = fraction(a12, a23, aaDenominator) | |
142 | 143 | let aa31 = fraction(fraction(fraction(a21, a32, aaDenominator), pool2._7, Scale6BigInt), pool2._8, Scale6BigInt) | |
143 | 144 | let aDenominator = (a31 + fraction(fraction(aa31, pool1._7, Scale6BigInt), pool1._8, Scale6BigInt)) | |
144 | 145 | let a = fraction(aa13, a31, aDenominator) | |
145 | 146 | let aa = fraction(fraction(fraction(aa31, a13, aDenominator), pool3._7, Scale6BigInt), pool3._8, Scale6BigInt) | |
146 | 147 | let delta = fraction((sqrtBigInt(fraction(fraction(fraction(aa, a, InScaleBigInt), pool1._7, Scale6BigInt), pool1._8, Scale6BigInt), InDecimals, InDecimals, CEILING) - a), Scale6BigInt, pool1._7) | |
147 | 148 | if ((ZeroBigInt >= delta)) | |
148 | 149 | then $Tuple2(0, nil) | |
149 | 150 | else { | |
150 | 151 | let input = if ((delta > inBalanceBigInt)) | |
151 | 152 | then inBalanceBigInt | |
152 | 153 | else delta | |
153 | 154 | let swap1 = estimateSwap(pool1, InAsset, input) | |
154 | 155 | let swap2 = estimateSwap(pool2, swap1._1, swap1._2) | |
155 | 156 | let swap3 = estimateSwap(pool3, swap2._1, swap2._2) | |
156 | 157 | $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 | } | |
158 | 159 | } | |
159 | 160 | ||
160 | 161 | ||
161 | 162 | func invokeSwap (args) = { | |
162 | 163 | let currentBalance = getBalance(args._4) | |
163 | 164 | let trimmedAmount = if ((args._5 > currentBalance)) | |
164 | 165 | then currentBalance | |
165 | 166 | else args._5 | |
166 | 167 | let resultAmount = if ((args._4 == InAsset)) | |
167 | 168 | then trimmedAmount | |
168 | 169 | else if ((currentBalance > args._5)) | |
169 | 170 | then currentBalance | |
170 | 171 | else trimmedAmount | |
171 | 172 | invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)]) | |
172 | 173 | } | |
173 | 174 | ||
174 | 175 | ||
175 | 176 | let wx_surf_waves = getWxPool(Address(base58'3PNnCngfvAzyvAQ1cEudZ3o6o3tFktsBVz5')) | |
176 | 177 | ||
177 | 178 | let wx_surf_usdcwxg = getWxPool(Address(base58'3PBfTdcoKmMNxZcjP8eTokbLFqYTUdoNKWL')) | |
178 | 179 | ||
179 | 180 | let wx_waves_usdcwxg = getWxPool(Address(base58'3P3g3eipfG2NZKKQE8DZXt2E9tRJqii9jcX')) | |
180 | 181 | ||
181 | 182 | let routes = [$Tuple6(wx_waves_usdcwxg, wx_surf_waves, wx_surf_usdcwxg, true, true, false), $Tuple6(wx_surf_usdcwxg, wx_surf_waves, wx_waves_usdcwxg, true, false, false)] | |
182 | 183 | ||
183 | 184 | @Callable(i) | |
184 | 185 | func default () = if ((i.caller != caller)) | |
185 | 186 | then throw("No touching") | |
186 | - | else { | |
187 | - | func accumFunction (accum,next) = { | |
188 | - | let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6) | |
189 | - | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
187 | + | else if (getBoolOrFalse("paused")) | |
188 | + | then throw("Paused") | |
189 | + | else { | |
190 | + | let inBalance = { | |
191 | + | let @ = invoke(main, "borrow", [InAssetStr, 0], nil) | |
192 | + | if ($isInstanceOf(@, "Int")) | |
193 | + | then @ | |
194 | + | else throw(($getType(@) + " couldn't be cast to Int")) | |
195 | + | } | |
196 | + | if ((inBalance == inBalance)) | |
197 | + | then { | |
198 | + | let inBalanceBigInt = toBigInt(inBalance) | |
199 | + | func accumFunction (accum,next) = { | |
200 | + | let estimation = estimateRoute(inBalanceBigInt, next._1, next._2, next._3, next._4, next._5, next._6) | |
201 | + | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
202 | + | } | |
203 | + | ||
204 | + | let fold = { | |
205 | + | let $l = routes | |
206 | + | let $s = size($l) | |
207 | + | let $acc0 = $Tuple2(nil, nil) | |
208 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
209 | + | then $a | |
210 | + | else accumFunction($a, $l[$i]) | |
211 | + | ||
212 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
213 | + | then $a | |
214 | + | else throw("List size exceeds 8") | |
215 | + | ||
216 | + | $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) | |
217 | + | } | |
218 | + | let maxSwapProfit = max(fold._1) | |
219 | + | if ((0 >= maxSwapProfit)) | |
220 | + | then throw("Estimate fail") | |
221 | + | else { | |
222 | + | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
223 | + | let result1 = invokeSwap(estimatedResult[0]) | |
224 | + | if ((result1 == result1)) | |
225 | + | then { | |
226 | + | let result2 = invokeSwap(estimatedResult[1]) | |
227 | + | if ((result2 == result2)) | |
228 | + | then { | |
229 | + | let result3 = invokeSwap(estimatedResult[2]) | |
230 | + | if ((result3 == result3)) | |
231 | + | then { | |
232 | + | let outBalance = getBalance(InAsset) | |
233 | + | let profit = (outBalance - inBalance) | |
234 | + | let threshold = getIntegerValue("threshold") | |
235 | + | let pureProfit = (profit - threshold) | |
236 | + | if ((0 >= pureProfit)) | |
237 | + | then throw("Execute fail") | |
238 | + | else if ((lastBlock.generator == generator)) | |
239 | + | then { | |
240 | + | let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, inBalance)]) | |
241 | + | if ((repay == repay)) | |
242 | + | then [ScriptTransfer(mevReserveFund, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))] | |
243 | + | else throw("Strict value is not equal to itself.") | |
244 | + | } | |
245 | + | else { | |
246 | + | let repay = invoke(main, "repay", nil, [AttachedPayment(InAsset, outBalance)]) | |
247 | + | if ((repay == repay)) | |
248 | + | then [IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))] | |
249 | + | else throw("Strict value is not equal to itself.") | |
250 | + | } | |
251 | + | } | |
252 | + | else throw("Strict value is not equal to itself.") | |
253 | + | } | |
254 | + | else throw("Strict value is not equal to itself.") | |
255 | + | } | |
256 | + | else throw("Strict value is not equal to itself.") | |
257 | + | } | |
258 | + | } | |
259 | + | else throw("Strict value is not equal to itself.") | |
190 | 260 | } | |
191 | 261 | ||
192 | - | let fold = { | |
193 | - | let $l = routes | |
194 | - | let $s = size($l) | |
195 | - | let $acc0 = $Tuple2(nil, nil) | |
196 | - | func $f0_1 ($a,$i) = if (($i >= $s)) | |
197 | - | then $a | |
198 | - | else accumFunction($a, $l[$i]) | |
199 | 262 | ||
200 | - | func $f0_2 ($a,$i) = if (($i >= $s)) | |
201 | - | then $a | |
202 | - | else throw("List size exceeds 2") | |
203 | 263 | ||
204 | - | $f0_2($f0_1($f0_1($acc0, 0), 1), 2) | |
205 | - | } | |
206 | - | let maxSwapProfit = max(fold._1) | |
207 | - | if ((0 >= maxSwapProfit)) | |
208 | - | then throw("Estimate fail") | |
209 | - | else { | |
210 | - | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
211 | - | let result1 = invokeSwap(estimatedResult[0]) | |
212 | - | if ((result1 == result1)) | |
213 | - | then { | |
214 | - | let result2 = invokeSwap(estimatedResult[1]) | |
215 | - | if ((result2 == result2)) | |
216 | - | then { | |
217 | - | let result3 = invokeSwap(estimatedResult[2]) | |
218 | - | if ((result3 == result3)) | |
219 | - | then { | |
220 | - | let profit = (getBalance(InAsset) - inBalance) | |
221 | - | let pureProfit = if (((i.fee % 10) > 0)) | |
222 | - | then (profit - 16000000) | |
223 | - | else (profit - 250000) | |
224 | - | if ((0 >= pureProfit)) | |
225 | - | then throw("Execute fail") | |
226 | - | else if ((lastBlock.generator == generator)) | |
227 | - | then [ScriptTransfer(mevreceiver, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))] | |
228 | - | else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))] | |
229 | - | } | |
230 | - | else throw("Strict value is not equal to itself.") | |
231 | - | } | |
232 | - | else throw("Strict value is not equal to itself.") | |
233 | - | } | |
234 | - | else throw("Strict value is not equal to itself.") | |
235 | - | } | |
236 | - | } | |
264 | + | @Callable(i) | |
265 | + | func setPause (paused) = if ((i.caller != configurator)) | |
266 | + | then throw("No touching") | |
267 | + | else [BooleanEntry("paused", paused)] | |
268 | + | ||
269 | + | ||
270 | + | ||
271 | + | @Callable(i) | |
272 | + | func setThreshold (theshold) = if ((i.caller != configurator)) | |
273 | + | then throw("No touching") | |
274 | + | else [IntegerEntry("threshold", theshold)] | |
237 | 275 | ||
238 | 276 |
github/deemru/w8io/3ef1775 42.04 ms ◑