tx · 3xy6j2nHH6ExFCTnYgedqQ4xi3oPooJnhTHbtZxJCtEL 3PCam3YxMpzVz97vSWeuGCa8kGJfJrUfjY1: -0.00800000 Waves 2023.05.20 00:48 [3650882] smart account 3PCam3YxMpzVz97vSWeuGCa8kGJfJrUfjY1 > SELF 0.00000000 Waves
{ "type": 13, "id": "3xy6j2nHH6ExFCTnYgedqQ4xi3oPooJnhTHbtZxJCtEL", "fee": 800000, "feeAssetId": null, "timestamp": 1684532915163, "version": 1, "sender": "3PCam3YxMpzVz97vSWeuGCa8kGJfJrUfjY1", "senderPublicKey": "5YzAWoy7GGDLi9Z73s7XHZnxsKH8ihqDiYUD4jeU1rWH", "proofs": [ "2Wf9qBSit3kVcHXSVKX6xGWWz2jrWbuTT5Nzn6xMYctkWKsBpncQr79iyNLBQLfCyF4wkoCJn97yZsYGACb3m8PG" ], "script": "base64:BgIECAISACkABlNjYWxlNgDAhD0ADFNjYWxlNkJpZ0ludAkAtgIBBQZTY2FsZTYABlNjYWxlOACAwtcvAAxTY2FsZThCaWdJbnQJALYCAQUGU2NhbGU4AApaZXJvQmlnSW50CQC2AgEAAAADU0VQAgJfXwAHSW5TY2FsZQDAhD0ACkluRGVjaW1hbHMABgANSW5TY2FsZUJpZ0ludAkAtgIBBQdJblNjYWxlAAdJbkFzc2V0ASAelAcTUnahJZX9yGGogl8Qf986Tym7/JpGP1r9Nk+fkQAKSW5Bc3NldFN0cgIsMzROOVljRUVUTFduOTNxWVE2NEVzUDF4ODl0U3J1SlU0NFJyRU1TWFhFUEoABmNhbGxlcgkBB0FkZHJlc3MBARoBV/JMjaYEM3ELr7+kSccILzlKxkIJmhAwtAAJZ2VuZXJhdG9yCQEHQWRkcmVzcwEBGgFXd9FKwAAmD1BtgyWzWnaE5eM5+V4NDHFEAAhyZWNlaXZlcgkBB0FkZHJlc3MBARoBV88FaXOVh1gjAmchvI+JX5J6ZuikHjJ+GAALbWV2cmVjZWl2ZXIJAQdBZGRyZXNzAQEaAVce4ftAMWuB5uxLVhsFLFGhk27fCbE80sEADXd4U3dhcEFkZHJlc3MJAQdBZGRyZXNzAQEaAVcuKjU1sQ238Xk+4bdG0J50Uk17MdCDrgYADnRoaXNBZGRyZXNzU3RyCQClCAEFBHRoaXMBDGdldEludE9yWmVybwEDa2V5CQELdmFsdWVPckVsc2UCCQCfCAEFA2tleQAAAQpnZXRCYWxhbmNlAQVhc3NldAMJAAACBQVhc3NldAUEdW5pdAgJAO8HAQUEdGhpcwdyZWd1bGFyCQDwBwIFBHRoaXMJAQV2YWx1ZQEFBWFzc2V0AQ9nZXRBc3NldE9yV2F2ZXMBCGFzc2V0U3RyAwkAAAIFCGFzc2V0U3RyAgVXQVZFUwUEdW5pdAkA2QQBBQhhc3NldFN0cgAJaW5CYWxhbmNlCQEKZ2V0QmFsYW5jZQEFB0luQXNzZXQAD2luQmFsYW5jZUJpZ0ludAkAtgIBBQlpbkJhbGFuY2UBC2dldFN3b3BQb29sAQRwb29sBAthc3NldElkQVN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAIKQV9hc3NldF9pZAQLYXNzZXRJZEJTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCCkJfYXNzZXRfaWQECGFzc2V0SWRBCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEFTdHIECGFzc2V0SWRCCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEJTdHIECGJhbGFuY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJhbGFuY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9CX2Fzc2V0X2JhbGFuY2UEBm91dEZlZQkAuAICBQxTY2FsZTZCaWdJbnQJALYCAQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIKY29tbWlzc2lvbgkAmwoJCQC2AgEFCGJhbGFuY2VBCQC2AgEFCGJhbGFuY2VCBQhhc3NldElkQQUIYXNzZXRJZEIFC2Fzc2V0SWRBU3RyBQthc3NldElkQlN0cgUMU2NhbGU2QmlnSW50BQZvdXRGZWUFBHBvb2wBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg1zdGFrZWRCYWxhbmNlCQDMCAIFB2Fzc2V0SWQFA25pbAUDU0VQARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhFzaGFyZUFzc2V0QmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8CBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sCQEUa2V5QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkAAABHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8CBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAETZ2V0V3hBY2NvdW50QmFsYW5jZQIEcG9vbAdhc3NldElkBA1iYWxhbmNlT25Qb29sAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQRwb29sCWF2YWlsYWJsZQkA8AcCBQRwb29sCQDZBAEFB2Fzc2V0SWQEDHRvdGFsQmFsYW5jZQkAZQIJAGQCBQ1iYWxhbmNlT25Qb29sCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8CBQRwb29sBQdhc3NldElkCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwIFBHBvb2wFB2Fzc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgUMdG90YWxCYWxhbmNlBQNuaWwBCWdldFd4UG9vbAEEcG9vbAQLYXNzZXRJZEFTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCDyVzX19hbW91bnRBc3NldAQLYXNzZXRJZEJTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCDiVzX19wcmljZUFzc2V0BAhhc3NldElkQQkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRBU3RyBAhhc3NldElkQgkBD2dldEFzc2V0T3JXYXZlcwEFC2Fzc2V0SWRCU3RyBAhiYWxhbmNlQQkBE2dldFd4QWNjb3VudEJhbGFuY2UCBQRwb29sBQthc3NldElkQVN0cgQIYmFsYW5jZUIJARNnZXRXeEFjY291bnRCYWxhbmNlAgUEcG9vbAULYXNzZXRJZEJTdHIEC3Byb3RvY29sRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ13eFN3YXBBZGRyZXNzAg8lc19fcHJvdG9jb2xGZWUEB3Bvb2xGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXd4U3dhcEFkZHJlc3MCCyVzX19wb29sRmVlBAVpbkZlZQkAuAICBQxTY2FsZTZCaWdJbnQJALwCAwkAtgIBCQBkAgULcHJvdG9jb2xGZWUFB3Bvb2xGZWUFDFNjYWxlNkJpZ0ludAUMU2NhbGU4QmlnSW50CQCbCgkJALYCAQUIYmFsYW5jZUEJALYCAQUIYmFsYW5jZUIFCGFzc2V0SWRBBQhhc3NldElkQgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyBQVpbkZlZQUMU2NhbGU2QmlnSW50BQ13eFN3YXBBZGRyZXNzAQhjYWxjU3dhcAUJcG10QW1vdW50CXRva2VuRnJvbQd0b2tlblRvBWluRmVlBm91dEZlZQQLY2xlYW5BbW91bnQJALwCAwUJcG10QW1vdW50BQVpbkZlZQUMU2NhbGU2QmlnSW50BBBhbW91bnRXaXRob3V0RmVlCQC8AgMFB3Rva2VuVG8FC2NsZWFuQW1vdW50CQC3AgIFC2NsZWFuQW1vdW50BQl0b2tlbkZyb20EDWFtb3VudFdpdGhGZWUJALwCAwUQYW1vdW50V2l0aG91dEZlZQUGb3V0RmVlBQxTY2FsZTZCaWdJbnQFDWFtb3VudFdpdGhGZWUBDGVzdGltYXRlU3dhcAMIcG9vbEluZm8HaW5Bc3NldAhpbkFtb3VudAQJcm91dGVBcmdzAwkAAAIFB2luQXNzZXQIBQhwb29sSW5mbwJfMwkAlQoDCAUIcG9vbEluZm8CXzQIBQhwb29sSW5mbwJfNgkBCGNhbGNTd2FwBQUIaW5BbW91bnQIBQhwb29sSW5mbwJfMQgFCHBvb2xJbmZvAl8yCAUIcG9vbEluZm8CXzcIBQhwb29sSW5mbwJfOAkAlQoDCAUIcG9vbEluZm8CXzMIBQhwb29sSW5mbwJfNQkBCGNhbGNTd2FwBQUIaW5BbW91bnQIBQhwb29sSW5mbwJfMggFCHBvb2xJbmZvAl8xCAUIcG9vbEluZm8CXzcIBQhwb29sSW5mbwJfOAQIZGFwcEFyZ3MDCQAAAggFCHBvb2xJbmZvAl85BQ13eFN3YXBBZGRyZXNzCQCUCgICBHN3YXAJAMwIAgAACQDMCAIIBQlyb3V0ZUFyZ3MCXzIJAMwIAgUOdGhpc0FkZHJlc3NTdHIFA25pbAkAlAoCAghleGNoYW5nZQkAzAgCAAEFA25pbAkAlgoECAUJcm91dGVBcmdzAl8xCAUJcm91dGVBcmdzAl8zCAUIZGFwcEFyZ3MCXzEIBQhkYXBwQXJncwJfMgENZXN0aW1hdGVSb3V0ZQYFcG9vbDEFcG9vbDIFcG9vbDMMcG9vbDFSZXZlcnNlDHBvb2wyUmV2ZXJzZQxwb29sM1JldmVyc2UEA2ExMgMFDHBvb2wxUmV2ZXJzZQgFBXBvb2wxAl8yCAUFcG9vbDECXzEEA2EyMQMFDHBvb2wxUmV2ZXJzZQgFBXBvb2wxAl8xCAUFcG9vbDECXzIEA2EyMwMFDHBvb2wyUmV2ZXJzZQgFBXBvb2wyAl8yCAUFcG9vbDICXzEEA2EzMgMFDHBvb2wyUmV2ZXJzZQgFBXBvb2wyAl8xCAUFcG9vbDICXzIEA2EzMQMFDHBvb2wzUmV2ZXJzZQgFBXBvb2wzAl8yCAUFcG9vbDMCXzEEA2ExMwMFDHBvb2wzUmV2ZXJzZQgFBXBvb2wzAl8xCAUFcG9vbDMCXzIEDWFhRGVub21pbmF0b3IJALcCAgUDYTIzCQC8AgMJALwCAwUDYTIxCAUFcG9vbDECXzgFDFNjYWxlNkJpZ0ludAgFBXBvb2wyAl83BQxTY2FsZTZCaWdJbnQEBGFhMTMJALwCAwUDYTEyBQNhMjMFDWFhRGVub21pbmF0b3IEBGFhMzEJALwCAwkAvAIDCQC8AgMFA2EyMQUDYTMyBQ1hYURlbm9taW5hdG9yCAUFcG9vbDICXzcFDFNjYWxlNkJpZ0ludAgFBXBvb2wyAl84BQxTY2FsZTZCaWdJbnQEDGFEZW5vbWluYXRvcgkAtwICBQNhMzEJALwCAwkAvAIDBQRhYTMxCAUFcG9vbDECXzcFDFNjYWxlNkJpZ0ludAgFBXBvb2wxAl84BQxTY2FsZTZCaWdJbnQEAWEJALwCAwUEYWExMwUDYTMxBQxhRGVub21pbmF0b3IEAmFhCQC8AgMJALwCAwkAvAIDBQRhYTMxBQNhMTMFDGFEZW5vbWluYXRvcggFBXBvb2wzAl83BQxTY2FsZTZCaWdJbnQIBQVwb29sMwJfOAUMU2NhbGU2QmlnSW50BAVkZWx0YQkAvAIDCQC4AgIJAQpzcXJ0QmlnSW50BAkAvAIDCQC8AgMJALwCAwUCYWEFAWEFDUluU2NhbGVCaWdJbnQIBQVwb29sMQJfNwUMU2NhbGU2QmlnSW50CAUFcG9vbDECXzgFDFNjYWxlNkJpZ0ludAUKSW5EZWNpbWFscwUKSW5EZWNpbWFscwUHQ0VJTElORwUBYQUMU2NhbGU2QmlnSW50CAUFcG9vbDECXzcDCQDAAgIFClplcm9CaWdJbnQFBWRlbHRhCQCUCgIAAAUDbmlsBAVpbnB1dAMJAL8CAgUFZGVsdGEFD2luQmFsYW5jZUJpZ0ludAUPaW5CYWxhbmNlQmlnSW50BQVkZWx0YQQFc3dhcDEJAQxlc3RpbWF0ZVN3YXADBQVwb29sMQUHSW5Bc3NldAUFaW5wdXQEBXN3YXAyCQEMZXN0aW1hdGVTd2FwAwUFcG9vbDIIBQVzd2FwMQJfMQgFBXN3YXAxAl8yBAVzd2FwMwkBDGVzdGltYXRlU3dhcAMFBXBvb2wzCAUFc3dhcDICXzEIBQVzd2FwMgJfMgkAlAoCCQCgAwEJALgCAggFBXN3YXAzAl8yBQVpbnB1dAkAzAgCCQCXCgUIBQVwb29sMQJfOQgFBXN3YXAxAl8zCAUFc3dhcDECXzQFB0luQXNzZXQJAKADAQUFaW5wdXQJAMwIAgkAlwoFCAUFcG9vbDICXzkIBQVzd2FwMgJfMwgFBXN3YXAyAl80CAUFc3dhcDECXzEJAKADAQgFBXN3YXAxAl8yCQDMCAIJAJcKBQgFBXBvb2wzAl85CAUFc3dhcDMCXzMIBQVzd2FwMwJfNAgFBXN3YXAyAl8xCQCgAwEIBQVzd2FwMgJfMgUDbmlsAQppbnZva2VTd2FwAQRhcmdzBA5jdXJyZW50QmFsYW5jZQkBCmdldEJhbGFuY2UBCAUEYXJncwJfNAQNdHJpbW1lZEFtb3VudAMJAGYCCAUEYXJncwJfNQUOY3VycmVudEJhbGFuY2UFDmN1cnJlbnRCYWxhbmNlCAUEYXJncwJfNQQMcmVzdWx0QW1vdW50AwkAAAIIBQRhcmdzAl80BQdJbkFzc2V0BQ10cmltbWVkQW1vdW50AwkAZgIFDmN1cnJlbnRCYWxhbmNlCAUEYXJncwJfNQUOY3VycmVudEJhbGFuY2UFDXRyaW1tZWRBbW91bnQJAPwHBAgFBGFyZ3MCXzEIBQRhcmdzAl8yCAUEYXJncwJfMwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AggFBGFyZ3MCXzQFDHJlc3VsdEFtb3VudAUDbmlsABBzd29wX3h0bl91c2R0d3hnCQELZ2V0U3dvcFBvb2wBCQEHQWRkcmVzcwEBGgFXYoOW9KWdZDsYcTTcY8rZrAcOdx69ZF+uAA13eF9zdXJmX3dhdmVzCQEJZ2V0V3hQb29sAQkBB0FkZHJlc3MBARoBV+S1+RI+/dA/S0wn3wKgFm8QCyJLqEzlLgAPd3hfc3VyZl91c2R0d3hnCQEJZ2V0V3hQb29sAQkBB0FkZHJlc3MBARoBV9I+DoIx127V8HESOtgwr4k8svljJJFWdAAMd3hfd2F2ZXNfeHRuCQEJZ2V0V3hQb29sAQkBB0FkZHJlc3MBARoBV+1Hn81CPJO+SyHN+wJ+H8gt+5aAesOvfQAQd3hfd2F2ZXNfdXNkdHd4ZwkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVe/ITEw+FiiC0U9FiCoTOCyub08tfiiNw8ADXd4X3d4X3VzZHR3eGcJAQlnZXRXeFBvb2wBCQEHQWRkcmVzcwEBGgFXrSscQu6KOPwUR+ZfLOrRHJYv6qJj/J1uAAt3eF93eF93YXZlcwkBCWdldFd4UG9vbAEJAQdBZGRyZXNzAQEaAVeaRAWYmby0qJDmt1Vvtxgoy4iG0wV9H1YABnJvdXRlcwkAzAgCCQCYCgYFEHN3b3BfeHRuX3VzZHR3eGcFDHd4X3dhdmVzX3h0bgUQd3hfd2F2ZXNfdXNkdHd4ZwYGBwkAzAgCCQCYCgYFEHd4X3dhdmVzX3VzZHR3eGcFDHd4X3dhdmVzX3h0bgUQc3dvcF94dG5fdXNkdHd4ZwYHBwkAzAgCCQCYCgYFEHd4X3dhdmVzX3VzZHR3eGcFDXd4X3N1cmZfd2F2ZXMFD3d4X3N1cmZfdXNkdHd4ZwYGBwkAzAgCCQCYCgYFD3d4X3N1cmZfdXNkdHd4ZwUNd3hfc3VyZl93YXZlcwUQd3hfd2F2ZXNfdXNkdHd4ZwYHBwkAzAgCCQCYCgYFEHd4X3dhdmVzX3VzZHR3eGcFC3d4X3d4X3dhdmVzBQ13eF93eF91c2R0d3hnBgYHCQDMCAIJAJgKBgUNd3hfd3hfdXNkdHd4ZwULd3hfd3hfd2F2ZXMFEHd4X3dhdmVzX3VzZHR3eGcGBwcFA25pbAEBaQEHZGVmYXVsdAADCQECIT0CCAUBaQZjYWxsZXIFBmNhbGxlcgkAAgECC05vIHRvdWNoaW5nCgENYWNjdW1GdW5jdGlvbgIFYWNjdW0EbmV4dAQKZXN0aW1hdGlvbgkBDWVzdGltYXRlUm91dGUGCAUEbmV4dAJfMQgFBG5leHQCXzIIBQRuZXh0Al8zCAUEbmV4dAJfNAgFBG5leHQCXzUIBQRuZXh0Al82CQCUCgIJAM0IAggFBWFjY3VtAl8xCAUKZXN0aW1hdGlvbgJfMQkAzQgCCAUFYWNjdW0CXzIIBQplc3RpbWF0aW9uAl8yBARmb2xkCgACJGwFBnJvdXRlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDWFjY3VtRnVuY3Rpb24CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDgJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIBA1tYXhTd2FwUHJvZml0CQCWAwEIBQRmb2xkAl8xAwkAZwIAAAUNbWF4U3dhcFByb2ZpdAkAAgECDUVzdGltYXRlIGZhaWwED2VzdGltYXRlZFJlc3VsdAkAkQMCCAUEZm9sZAJfMgkBBXZhbHVlAQkAzwgCCAUEZm9sZAJfMQUNbWF4U3dhcFByb2ZpdAQHcmVzdWx0MQkBCmludm9rZVN3YXABCQCRAwIFD2VzdGltYXRlZFJlc3VsdAAAAwkAAAIFB3Jlc3VsdDEFB3Jlc3VsdDEEB3Jlc3VsdDIJAQppbnZva2VTd2FwAQkAkQMCBQ9lc3RpbWF0ZWRSZXN1bHQAAQMJAAACBQdyZXN1bHQyBQdyZXN1bHQyBAdyZXN1bHQzCQEKaW52b2tlU3dhcAEJAJEDAgUPZXN0aW1hdGVkUmVzdWx0AAIDCQAAAgUHcmVzdWx0MwUHcmVzdWx0MwQGcHJvZml0CQBlAgkBCmdldEJhbGFuY2UBBQdJbkFzc2V0BQlpbkJhbGFuY2UECnB1cmVQcm9maXQDCQBmAgkAagIIBQFpA2ZlZQAKAAAJAGUCBQZwcm9maXQAgMjQBwkAZQIFBnByb2ZpdACQoQ8DCQBnAgAABQpwdXJlUHJvZml0CQACAQIMRXhlY3V0ZSBmYWlsAwkAAAIIBQlsYXN0QmxvY2sJZ2VuZXJhdG9yBQlnZW5lcmF0b3IJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULbWV2cmVjZWl2ZXIFBnByb2ZpdAUHSW5Bc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgILbWV2X3Byb2ZpdF8FCkluQXNzZXRTdHICAV8JAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAFBnByb2ZpdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhBtZXZfdG90YWxQcm9maXRfBQpJbkFzc2V0U3RyCQBkAgkBDGdldEludE9yWmVybwEJAKwCAgIQbWV2X3RvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgUGcHJvZml0BQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIcmVjZWl2ZXIFBnByb2ZpdAUHSW5Bc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgIHcHJvZml0XwUKSW5Bc3NldFN0cgIBXwkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUGcHJvZml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICDHRvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgkAZAIJAQxnZXRJbnRPclplcm8BCQCsAgICDHRvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgUGcHJvZml0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AgBHJ6w==", "chainId": 87, "height": 3650882, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ByoRZVvcw9emPHwXw5NE7HDFMpiyTt5NLFFyufRdtiHi Next: 3AfwC2NzvuP1fTE8N7V3WDbjJhm9Z674ic23SWSAUXeC Diff:
Old | New | Differences | |
---|---|---|---|
172 | 172 | } | |
173 | 173 | ||
174 | 174 | ||
175 | - | let swop_usdcwxg_usdtwxg = getSwopPool(Address(base58'3PJgkN4gy6b8qpA86otcJ2KDTbL8ay2n91s')) | |
176 | - | ||
177 | 175 | let swop_xtn_usdtwxg = getSwopPool(Address(base58'3PAunb4Dadc9rQM2VJNQBgQV3vrgF9z8Evq')) | |
178 | 176 | ||
179 | 177 | let wx_surf_waves = getWxPool(Address(base58'3PNnCngfvAzyvAQ1cEudZ3o6o3tFktsBVz5')) | |
182 | 180 | ||
183 | 181 | let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g')) | |
184 | 182 | ||
185 | - | let wx_waves_usdcwxg = getWxPool(Address(base58'3P3g3eipfG2NZKKQE8DZXt2E9tRJqii9jcX')) | |
186 | - | ||
187 | 183 | let wx_waves_usdtwxg = getWxPool(Address(base58'3PKMVZ7kQeaREajYi8Yc25Ro6mcNw5D6QSa')) | |
188 | 184 | ||
189 | 185 | let wx_wx_usdtwxg = getWxPool(Address(base58'3PHiXGo7NTRoC2KqkMZ1y9LaA2QSrroGs8y')) | |
190 | 186 | ||
191 | 187 | let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh')) | |
192 | 188 | ||
193 | - | let routes = [$Tuple6(swop_xtn_usdtwxg, wx_waves_xtn, wx_waves_usdtwxg, true, true, false), $Tuple6(wx_waves_usdtwxg, wx_waves_xtn, swop_xtn | |
189 | + | 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)] | |
194 | 190 | ||
195 | 191 | @Callable(i) | |
196 | 192 | func default () = if ((i.caller != caller)) | |
232 | 228 | let profit = (getBalance(InAsset) - inBalance) | |
233 | 229 | let pureProfit = if (((i.fee % 10) > 0)) | |
234 | 230 | then (profit - 16000000) | |
235 | - | else profit | |
231 | + | else (profit - 250000) | |
236 | 232 | if ((0 >= pureProfit)) | |
237 | 233 | then throw("Execute fail") | |
238 | 234 | else if ((lastBlock.generator == generator)) |
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'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ' | |
23 | 23 | ||
24 | 24 | let InAssetStr = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" | |
25 | 25 | ||
26 | 26 | let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK') | |
27 | 27 | ||
28 | 28 | let generator = Address(base58'3PCrRrwHEjGXFjYtXDsNv78f3Ch3CH3p6V1') | |
29 | 29 | ||
30 | 30 | let receiver = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK') | |
31 | 31 | ||
32 | 32 | let mevreceiver = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe') | |
33 | 33 | ||
34 | 34 | let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
35 | 35 | ||
36 | 36 | let thisAddressStr = toString(this) | |
37 | 37 | ||
38 | 38 | func getIntOrZero (key) = valueOrElse(getInteger(key), 0) | |
39 | 39 | ||
40 | 40 | ||
41 | 41 | func getBalance (asset) = if ((asset == unit)) | |
42 | 42 | then wavesBalance(this).regular | |
43 | 43 | else assetBalance(this, value(asset)) | |
44 | 44 | ||
45 | 45 | ||
46 | 46 | func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES")) | |
47 | 47 | then unit | |
48 | 48 | else fromBase58String(assetStr) | |
49 | 49 | ||
50 | 50 | ||
51 | 51 | let inBalance = getBalance(InAsset) | |
52 | 52 | ||
53 | 53 | let inBalanceBigInt = toBigInt(inBalance) | |
54 | 54 | ||
55 | 55 | func getSwopPool (pool) = { | |
56 | 56 | let assetIdAStr = getStringValue(pool, "A_asset_id") | |
57 | 57 | let assetIdBStr = getStringValue(pool, "B_asset_id") | |
58 | 58 | let assetIdA = getAssetOrWaves(assetIdAStr) | |
59 | 59 | let assetIdB = getAssetOrWaves(assetIdBStr) | |
60 | 60 | let balanceA = getIntegerValue(pool, "A_asset_balance") | |
61 | 61 | let balanceB = getIntegerValue(pool, "B_asset_balance") | |
62 | 62 | let outFee = (Scale6BigInt - toBigInt(getIntegerValue(pool, "commission"))) | |
63 | 63 | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, Scale6BigInt, outFee, pool) | |
64 | 64 | } | |
65 | 65 | ||
66 | 66 | ||
67 | 67 | func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP) | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP) | |
71 | 71 | ||
72 | 72 | ||
73 | 73 | func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0) | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0) | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | func getWxAccountBalance (pool,assetId) = { | |
80 | 80 | let balanceOnPool = if ((assetId == "WAVES")) | |
81 | 81 | then wavesBalance(pool).available | |
82 | 82 | else assetBalance(pool, fromBase58String(assetId)) | |
83 | 83 | let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId)) | |
84 | 84 | max([0, totalBalance]) | |
85 | 85 | } | |
86 | 86 | ||
87 | 87 | ||
88 | 88 | func getWxPool (pool) = { | |
89 | 89 | let assetIdAStr = getStringValue(pool, "%s__amountAsset") | |
90 | 90 | let assetIdBStr = getStringValue(pool, "%s__priceAsset") | |
91 | 91 | let assetIdA = getAssetOrWaves(assetIdAStr) | |
92 | 92 | let assetIdB = getAssetOrWaves(assetIdBStr) | |
93 | 93 | let balanceA = getWxAccountBalance(pool, assetIdAStr) | |
94 | 94 | let balanceB = getWxAccountBalance(pool, assetIdBStr) | |
95 | 95 | let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee") | |
96 | 96 | let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee") | |
97 | 97 | let inFee = (Scale6BigInt - fraction(toBigInt((protocolFee + poolFee)), Scale6BigInt, Scale8BigInt)) | |
98 | 98 | $Tuple9(toBigInt(balanceA), toBigInt(balanceB), assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, Scale6BigInt, wxSwapAddress) | |
99 | 99 | } | |
100 | 100 | ||
101 | 101 | ||
102 | 102 | func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = { | |
103 | 103 | let cleanAmount = fraction(pmtAmount, inFee, Scale6BigInt) | |
104 | 104 | let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom)) | |
105 | 105 | let amountWithFee = fraction(amountWithoutFee, outFee, Scale6BigInt) | |
106 | 106 | amountWithFee | |
107 | 107 | } | |
108 | 108 | ||
109 | 109 | ||
110 | 110 | func estimateSwap (poolInfo,inAsset,inAmount) = { | |
111 | 111 | let routeArgs = if ((inAsset == poolInfo._3)) | |
112 | 112 | then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8)) | |
113 | 113 | else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8)) | |
114 | 114 | let dappArgs = if ((poolInfo._9 == wxSwapAddress)) | |
115 | 115 | then $Tuple2("swap", [0, routeArgs._2, thisAddressStr]) | |
116 | 116 | else $Tuple2("exchange", [1]) | |
117 | 117 | $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2) | |
118 | 118 | } | |
119 | 119 | ||
120 | 120 | ||
121 | 121 | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse) = { | |
122 | 122 | let a12 = if (pool1Reverse) | |
123 | 123 | then pool1._2 | |
124 | 124 | else pool1._1 | |
125 | 125 | let a21 = if (pool1Reverse) | |
126 | 126 | then pool1._1 | |
127 | 127 | else pool1._2 | |
128 | 128 | let a23 = if (pool2Reverse) | |
129 | 129 | then pool2._2 | |
130 | 130 | else pool2._1 | |
131 | 131 | let a32 = if (pool2Reverse) | |
132 | 132 | then pool2._1 | |
133 | 133 | else pool2._2 | |
134 | 134 | let a31 = if (pool3Reverse) | |
135 | 135 | then pool3._2 | |
136 | 136 | else pool3._1 | |
137 | 137 | let a13 = if (pool3Reverse) | |
138 | 138 | then pool3._1 | |
139 | 139 | else pool3._2 | |
140 | 140 | let aaDenominator = (a23 + fraction(fraction(a21, pool1._8, Scale6BigInt), pool2._7, Scale6BigInt)) | |
141 | 141 | let aa13 = fraction(a12, a23, aaDenominator) | |
142 | 142 | let aa31 = fraction(fraction(fraction(a21, a32, aaDenominator), pool2._7, Scale6BigInt), pool2._8, Scale6BigInt) | |
143 | 143 | let aDenominator = (a31 + fraction(fraction(aa31, pool1._7, Scale6BigInt), pool1._8, Scale6BigInt)) | |
144 | 144 | let a = fraction(aa13, a31, aDenominator) | |
145 | 145 | let aa = fraction(fraction(fraction(aa31, a13, aDenominator), pool3._7, Scale6BigInt), pool3._8, Scale6BigInt) | |
146 | 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 | 147 | if ((ZeroBigInt >= delta)) | |
148 | 148 | then $Tuple2(0, nil) | |
149 | 149 | else { | |
150 | 150 | let input = if ((delta > inBalanceBigInt)) | |
151 | 151 | then inBalanceBigInt | |
152 | 152 | else delta | |
153 | 153 | let swap1 = estimateSwap(pool1, InAsset, input) | |
154 | 154 | let swap2 = estimateSwap(pool2, swap1._1, swap1._2) | |
155 | 155 | let swap3 = estimateSwap(pool3, swap2._1, swap2._2) | |
156 | 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 | 157 | } | |
158 | 158 | } | |
159 | 159 | ||
160 | 160 | ||
161 | 161 | func invokeSwap (args) = { | |
162 | 162 | let currentBalance = getBalance(args._4) | |
163 | 163 | let trimmedAmount = if ((args._5 > currentBalance)) | |
164 | 164 | then currentBalance | |
165 | 165 | else args._5 | |
166 | 166 | let resultAmount = if ((args._4 == InAsset)) | |
167 | 167 | then trimmedAmount | |
168 | 168 | else if ((currentBalance > args._5)) | |
169 | 169 | then currentBalance | |
170 | 170 | else trimmedAmount | |
171 | 171 | invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)]) | |
172 | 172 | } | |
173 | 173 | ||
174 | 174 | ||
175 | - | let swop_usdcwxg_usdtwxg = getSwopPool(Address(base58'3PJgkN4gy6b8qpA86otcJ2KDTbL8ay2n91s')) | |
176 | - | ||
177 | 175 | let swop_xtn_usdtwxg = getSwopPool(Address(base58'3PAunb4Dadc9rQM2VJNQBgQV3vrgF9z8Evq')) | |
178 | 176 | ||
179 | 177 | let wx_surf_waves = getWxPool(Address(base58'3PNnCngfvAzyvAQ1cEudZ3o6o3tFktsBVz5')) | |
180 | 178 | ||
181 | 179 | let wx_surf_usdtwxg = getWxPool(Address(base58'3PM6YyJauiFTZzVLuRcCkDwWBvWTvPYo1ZM')) | |
182 | 180 | ||
183 | 181 | let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g')) | |
184 | 182 | ||
185 | - | let wx_waves_usdcwxg = getWxPool(Address(base58'3P3g3eipfG2NZKKQE8DZXt2E9tRJqii9jcX')) | |
186 | - | ||
187 | 183 | let wx_waves_usdtwxg = getWxPool(Address(base58'3PKMVZ7kQeaREajYi8Yc25Ro6mcNw5D6QSa')) | |
188 | 184 | ||
189 | 185 | let wx_wx_usdtwxg = getWxPool(Address(base58'3PHiXGo7NTRoC2KqkMZ1y9LaA2QSrroGs8y')) | |
190 | 186 | ||
191 | 187 | let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh')) | |
192 | 188 | ||
193 | - | let routes = [$Tuple6(swop_xtn_usdtwxg, wx_waves_xtn, wx_waves_usdtwxg, true, true, false), $Tuple6(wx_waves_usdtwxg, wx_waves_xtn, swop_xtn | |
189 | + | 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)] | |
194 | 190 | ||
195 | 191 | @Callable(i) | |
196 | 192 | func default () = if ((i.caller != caller)) | |
197 | 193 | then throw("No touching") | |
198 | 194 | else { | |
199 | 195 | func accumFunction (accum,next) = { | |
200 | 196 | let estimation = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6) | |
201 | 197 | $Tuple2((accum._1 :+ estimation._1), (accum._2 :+ estimation._2)) | |
202 | 198 | } | |
203 | 199 | ||
204 | 200 | let fold = { | |
205 | 201 | let $l = routes | |
206 | 202 | let $s = size($l) | |
207 | 203 | let $acc0 = $Tuple2(nil, nil) | |
208 | 204 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
209 | 205 | then $a | |
210 | 206 | else accumFunction($a, $l[$i]) | |
211 | 207 | ||
212 | 208 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
213 | 209 | then $a | |
214 | 210 | else throw("List size exceeds 8") | |
215 | 211 | ||
216 | 212 | $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 | 213 | } | |
218 | 214 | let maxSwapProfit = max(fold._1) | |
219 | 215 | if ((0 >= maxSwapProfit)) | |
220 | 216 | then throw("Estimate fail") | |
221 | 217 | else { | |
222 | 218 | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
223 | 219 | let result1 = invokeSwap(estimatedResult[0]) | |
224 | 220 | if ((result1 == result1)) | |
225 | 221 | then { | |
226 | 222 | let result2 = invokeSwap(estimatedResult[1]) | |
227 | 223 | if ((result2 == result2)) | |
228 | 224 | then { | |
229 | 225 | let result3 = invokeSwap(estimatedResult[2]) | |
230 | 226 | if ((result3 == result3)) | |
231 | 227 | then { | |
232 | 228 | let profit = (getBalance(InAsset) - inBalance) | |
233 | 229 | let pureProfit = if (((i.fee % 10) > 0)) | |
234 | 230 | then (profit - 16000000) | |
235 | - | else profit | |
231 | + | else (profit - 250000) | |
236 | 232 | if ((0 >= pureProfit)) | |
237 | 233 | then throw("Execute fail") | |
238 | 234 | else if ((lastBlock.generator == generator)) | |
239 | 235 | then [ScriptTransfer(mevreceiver, profit, InAsset), IntegerEntry(((("mev_profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("mev_totalProfit_" + InAssetStr), (getIntOrZero(("mev_totalProfit_" + InAssetStr)) + profit))] | |
240 | 236 | else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))] | |
241 | 237 | } | |
242 | 238 | else throw("Strict value is not equal to itself.") | |
243 | 239 | } | |
244 | 240 | else throw("Strict value is not equal to itself.") | |
245 | 241 | } | |
246 | 242 | else throw("Strict value is not equal to itself.") | |
247 | 243 | } | |
248 | 244 | } | |
249 | 245 | ||
250 | 246 |
github/deemru/w8io/3ef1775 46.76 ms ◑