2023.05.02 03:57 [3625072] smart account 3PPR4Ph1yR3YNRPPEVgfFmvU3m6Qv53DMFX > SELF 0.00000000 Waves

{ "type": 13, "id": "59AxN6oEXFhArbSwyNKYMUfVPnPVWb9vfuAmv3iU2jKg", "fee": 700000, "feeAssetId": null, "timestamp": 1682989113526, "version": 1, "sender": "3PPR4Ph1yR3YNRPPEVgfFmvU3m6Qv53DMFX", "senderPublicKey": "4TckHuUtoPbs3o2PszT1XMnbp9WK5q1YXD538BkR7HHs", "proofs": [ "5ztUHinGHZ1QTteH8YxEpHfArQ1J1KTZ4eMdEjqdzNTb9vz2w1XiiSiZvns9evRHqjDgwzEjTtQdGfeqesFTGHoj" ], "script": "base64:BgIECAISACkABlNjYWxlNgDAhD0ADFNjYWxlNkJpZ0ludAkAtgIBBQZTY2FsZTYABlNjYWxlOACAwtcvAAxTY2FsZThCaWdJbnQJALYCAQUGU2NhbGU4AANTRVACAl9fAAdJblNjYWxlAMCEPQANSW5TY2FsZUJpZ0ludAkAtgIBBQdJblNjYWxlAAdJbkFzc2V0ASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAKSW5Bc3NldFN0cgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAABmNhbGxlcgkBB0FkZHJlc3MBARoBV/JMjaYEM3ELr7+kSccILzlKxkIJmhAwtAAIcmVjZWl2ZXIJAQdBZGRyZXNzAQEaAVfPBWlzlYdYIwJnIbyPiV+SembopB4yfhgADXd4U3dhcEFkZHJlc3MJAQdBZGRyZXNzAQEaAVcuKjU1sQ238Xk+4bdG0J50Uk17MdCDrgYADnRoaXNBZGRyZXNzU3RyCQClCAEFBHRoaXMBDGdldEludE9yWmVybwEDa2V5CQELdmFsdWVPckVsc2UCCQCfCAEFA2tleQAAAQpnZXRCYWxhbmNlAQVhc3NldAMJAAACBQVhc3NldAUEdW5pdAgJAO8HAQUEdGhpcwdyZWd1bGFyCQDwBwIFBHRoaXMJAQV2YWx1ZQEFBWFzc2V0AQ9nZXRBc3NldE9yV2F2ZXMBCGFzc2V0U3RyAwkAAAIFCGFzc2V0U3RyAgVXQVZFUwUEdW5pdAkA2QQBBQhhc3NldFN0cgAJaW5CYWxhbmNlCQEKZ2V0QmFsYW5jZQEFB0luQXNzZXQBC2dldFN3b3BQb29sAQRwb29sBAthc3NldElkQVN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAIKQV9hc3NldF9pZAQLYXNzZXRJZEJTdHIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wCCkJfYXNzZXRfaWQECGFzc2V0SWRBCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEFTdHIECGFzc2V0SWRCCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEJTdHIECGJhbGFuY2VBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9BX2Fzc2V0X2JhbGFuY2UECGJhbGFuY2VCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sAg9CX2Fzc2V0X2JhbGFuY2UEBm91dEZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAIKY29tbWlzc2lvbgkAmwoJBQhiYWxhbmNlQQUIYmFsYW5jZUIFCGFzc2V0SWRBBQhhc3NldElkQgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyAAAFBm91dEZlZQUEcG9vbAEUa2V5QWRkaXRpb25hbEJhbGFuY2UBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICDXN0YWtlZEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICEXNoYXJlQXNzZXRCYWxhbmNlCQDMCAIFB2Fzc2V0SWQFA25pbAUDU0VQARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwIEcG9vbAdhc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHBvb2wJARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQAAAEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwIEcG9vbAdhc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHBvb2wJARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQUHYXNzZXRJZAAAARNnZXRXeEFjY291bnRCYWxhbmNlAgRwb29sB2Fzc2V0SWQEDWJhbGFuY2VPblBvb2wDCQAAAgUHYXNzZXRJZAIFV0FWRVMICQDvBwEFBHBvb2wJYXZhaWxhYmxlCQDwBwIFBHBvb2wJANkEAQUHYXNzZXRJZAQMdG90YWxCYWxhbmNlCQBlAgkAZAIFDWJhbGFuY2VPblBvb2wJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwIFBHBvb2wFB2Fzc2V0SWQJARxnZXRTdGFraW5nQXNzZXRCYWxhbmNlT3JaZXJvAgUEcG9vbAUHYXNzZXRJZAkAlgMBCQDMCAIAAAkAzAgCBQx0b3RhbEJhbGFuY2UFA25pbAEJZ2V0V3hQb29sAQRwb29sBAthc3NldElkQVN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAIPJXNfX2Ftb3VudEFzc2V0BAthc3NldElkQlN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAIOJXNfX3ByaWNlQXNzZXQECGFzc2V0SWRBCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEFTdHIECGFzc2V0SWRCCQEPZ2V0QXNzZXRPcldhdmVzAQULYXNzZXRJZEJTdHIECGJhbGFuY2VBCQETZ2V0V3hBY2NvdW50QmFsYW5jZQIFBHBvb2wFC2Fzc2V0SWRBU3RyBAhiYWxhbmNlQgkBE2dldFd4QWNjb3VudEJhbGFuY2UCBQRwb29sBQthc3NldElkQlN0cgQLcHJvdG9jb2xGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDXd4U3dhcEFkZHJlc3MCDyVzX19wcm90b2NvbEZlZQQHcG9vbEZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNd3hTd2FwQWRkcmVzcwILJXNfX3Bvb2xGZWUEBWluRmVlCQBrAwkAZAIFC3Byb3RvY29sRmVlBQdwb29sRmVlBQZTY2FsZTYFBlNjYWxlOAkAmwoJBQhiYWxhbmNlQQUIYmFsYW5jZUIFCGFzc2V0SWRBBQhhc3NldElkQgULYXNzZXRJZEFTdHIFC2Fzc2V0SWRCU3RyBQVpbkZlZQAABQ13eFN3YXBBZGRyZXNzAQhjYWxjU3dhcAUJcG10QW1vdW50CXRva2VuRnJvbQd0b2tlblRvBWluRmVlBm91dEZlZQQLY2xlYW5BbW91bnQJAGsDBQlwbXRBbW91bnQJAGUCBQZTY2FsZTYFBWluRmVlBQZTY2FsZTYEEGFtb3VudFdpdGhvdXRGZWUJAGsDBQd0b2tlblRvBQtjbGVhbkFtb3VudAkAZAIFC2NsZWFuQW1vdW50BQl0b2tlbkZyb20EDWFtb3VudFdpdGhGZWUJAGsDBRBhbW91bnRXaXRob3V0RmVlCQBlAgUGU2NhbGU2BQZvdXRGZWUFBlNjYWxlNgUNYW1vdW50V2l0aEZlZQEMZXN0aW1hdGVTd2FwAwhwb29sSW5mbwdpbkFzc2V0CGluQW1vdW50BAlyb3V0ZUFyZ3MDCQAAAgUHaW5Bc3NldAgFCHBvb2xJbmZvAl8zCQCVCgMIBQhwb29sSW5mbwJfNAgFCHBvb2xJbmZvAl82CQEIY2FsY1N3YXAFBQhpbkFtb3VudAgFCHBvb2xJbmZvAl8xCAUIcG9vbEluZm8CXzIIBQhwb29sSW5mbwJfNwgFCHBvb2xJbmZvAl84CQCVCgMIBQhwb29sSW5mbwJfMwgFCHBvb2xJbmZvAl81CQEIY2FsY1N3YXAFBQhpbkFtb3VudAgFCHBvb2xJbmZvAl8yCAUIcG9vbEluZm8CXzEIBQhwb29sSW5mbwJfNwgFCHBvb2xJbmZvAl84BAhkYXBwQXJncwMJAAACCAUIcG9vbEluZm8CXzkFDXd4U3dhcEFkZHJlc3MJAJQKAgIEc3dhcAkAzAgCAAAJAMwIAggFCXJvdXRlQXJncwJfMgkAzAgCBQ50aGlzQWRkcmVzc1N0cgUDbmlsCQCUCgICCGV4Y2hhbmdlCQDMCAIAAQUDbmlsCQCWCgQIBQlyb3V0ZUFyZ3MCXzEIBQlyb3V0ZUFyZ3MCXzMIBQhkYXBwQXJncwJfMQgFCGRhcHBBcmdzAl8yAQ1lc3RpbWF0ZVJvdXRlBwVwb29sMQVwb29sMgVwb29sMwxwb29sMVJldmVyc2UMcG9vbDJSZXZlcnNlDHBvb2wzUmV2ZXJzZQdhM1NjYWxlBANhMTIDBQxwb29sMVJldmVyc2UJALYCAQgFBXBvb2wxAl8yCQC2AgEIBQVwb29sMQJfMQQDYTIxAwUMcG9vbDFSZXZlcnNlCQC2AgEIBQVwb29sMQJfMQkAtgIBCAUFcG9vbDECXzIEA2EyMwMFDHBvb2wyUmV2ZXJzZQkAtgIBCAUFcG9vbDICXzIJALYCAQgFBXBvb2wyAl8xBANhMzIDBQxwb29sMlJldmVyc2UJALYCAQgFBXBvb2wyAl8xCQC2AgEIBQVwb29sMgJfMgQDYTMxAwUMcG9vbDNSZXZlcnNlCQC2AgEIBQVwb29sMwJfMgkAtgIBCAUFcG9vbDMCXzEEA2ExMwMFDHBvb2wzUmV2ZXJzZQkAtgIBCAUFcG9vbDMCXzEJALYCAQgFBXBvb2wzAl8yBA1hYURlbm9taW5hdG9yCQC3AgIFA2EyMwUDYTIxBARhYTEzCQC8AgMJALwCAwUDYTEyBQNhMjMFDUluU2NhbGVCaWdJbnQFDFNjYWxlNkJpZ0ludAUNYWFEZW5vbWluYXRvcgQEYWEzMQkAvAIDCQC8AgMFA2EyMQUDYTMyBQdhM1NjYWxlBQxTY2FsZTZCaWdJbnQFDWFhRGVub21pbmF0b3IEDGFEZW5vbWluYXRvcgkAtwICCQC8AgMFA2EzMQUMU2NhbGU2QmlnSW50BQdhM1NjYWxlBQRhYTMxBAFhCQC8AgMJALwCAwUEYWExMwUDYTMxBQdhM1NjYWxlBQxTY2FsZTZCaWdJbnQFDGFEZW5vbWluYXRvcgQCYWEJALwCAwkAvAIDBQRhYTMxBQNhMTMFDUluU2NhbGVCaWdJbnQFDFNjYWxlNkJpZ0ludAUMYURlbm9taW5hdG9yBAVkZWx0YQkAuAICCQEKc3FydEJpZ0ludAQJALwCAwUCYWEFAWEFDFNjYWxlNkJpZ0ludAAGAAYFB0NFSUxJTkcFAWEECGluQW1vdW50CQBpAgkAoAMBCQC8AgMFBWRlbHRhBQ1JblNjYWxlQmlnSW50BQxTY2FsZTZCaWdJbnQAAgMJAGcCAAAFCGluQW1vdW50CQCUCgIAAAUDbmlsBAVpbnB1dAMJAGYCBQhpbkFtb3VudAUJaW5CYWxhbmNlBQlpbkJhbGFuY2UFCGluQW1vdW50BAVzd2FwMQkBDGVzdGltYXRlU3dhcAMFBXBvb2wxBQdJbkFzc2V0BQVpbnB1dAQFc3dhcDIJAQxlc3RpbWF0ZVN3YXADBQVwb29sMggFBXN3YXAxAl8xCAUFc3dhcDECXzIEBXN3YXAzCQEMZXN0aW1hdGVTd2FwAwUFcG9vbDMIBQVzd2FwMgJfMQgFBXN3YXAyAl8yCQCUCgIJAGUCCAUFc3dhcDMCXzIFBWlucHV0CQDMCAIJAJcKBQgFBXBvb2wxAl85CAUFc3dhcDECXzMIBQVzd2FwMQJfNAUHSW5Bc3NldAUFaW5wdXQJAMwIAgkAlwoFCAUFcG9vbDICXzkIBQVzd2FwMgJfMwgFBXN3YXAyAl80CAUFc3dhcDECXzEIBQVzd2FwMQJfMgkAzAgCCQCXCgUIBQVwb29sMwJfOQgFBXN3YXAzAl8zCAUFc3dhcDMCXzQIBQVzd2FwMgJfMQgFBXN3YXAyAl8yBQNuaWwBCmludm9rZVN3YXABBGFyZ3MEDmN1cnJlbnRCYWxhbmNlCQEKZ2V0QmFsYW5jZQEIBQRhcmdzAl80BA10cmltbWVkQW1vdW50AwkAZgIIBQRhcmdzAl81BQ5jdXJyZW50QmFsYW5jZQUOY3VycmVudEJhbGFuY2UIBQRhcmdzAl81BAxyZXN1bHRBbW91bnQDCQAAAggFBGFyZ3MCXzQFB0luQXNzZXQFDXRyaW1tZWRBbW91bnQDCQBmAgUOY3VycmVudEJhbGFuY2UIBQRhcmdzAl81BQ5jdXJyZW50QmFsYW5jZQUNdHJpbW1lZEFtb3VudAkA/AcECAUEYXJncwJfMQgFBGFyZ3MCXzIIBQRhcmdzAl8zCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCAUEYXJncwJfNAUMcmVzdWx0QW1vdW50BQNuaWwAD3N3b3BfYnRjd3hnX3h0bgkBC2dldFN3b3BQb29sAQkBB0FkZHJlc3MBARoBV1q/jutGsbgSrv1cydfRxv0pdV0mqNpqlwAOc3dvcF9wb3dlcl94dG4JAQtnZXRTd29wUG9vbAEJAQdBZGRyZXNzAQEaAVdD+cS9pV4LRrVpu+IW3b+PeY/HZrPmiQ4ADXN3b3Bfc3dvcF94dG4JAQtnZXRTd29wUG9vbAEJAQdBZGRyZXNzAQEaAVcB/mLN/cXkiD2ELfgN6I5jfG2ZLgGLAscAD3N3b3Bfc3dvcF93YXZlcwkBC2dldFN3b3BQb29sAQkBB0FkZHJlc3MBARoBV6a158kc4+na+6+Y2fMbA3iKrKaJDjCTugARc3dvcF93YXZlc19idGN3eGcJAQtnZXRTd29wUG9vbAEJAQdBZGRyZXNzAQEaAVdFVVIgNouG65xbk/q3hcVbtyPCtsVmD6wADnN3b3Bfd2F2ZXNfeHRuCQELZ2V0U3dvcFBvb2wBCQEHQWRkcmVzcwEBGgFXq6Cdjrv8dok/NU7xvbFLKgOXWEUfx4rzAAtzd29wX3d4X3h0bgkBC2dldFN3b3BQb29sAQkBB0FkZHJlc3MBARoBV8ME0At8wOL1pxUmBjwn7bVTs8qDn9Py4AAOd3hfcG93ZXJfd2F2ZXMJAQlnZXRXeFBvb2wBCQEHQWRkcmVzcwEBGgFXgTawT2doacAQvhDQ6s91Zb0F3opvubAPAA13eF9zd29wX3dhdmVzCQEJZ2V0V3hQb29sAQkBB0FkZHJlc3MBARoBV1oApB14wDCX6MLHakBuYmLudG084IPBfAAMd3hfd2F2ZXNfeHRuCQEJZ2V0V3hQb29sAQkBB0FkZHJlc3MBARoBV+1Hn81CPJO+SyHN+wJ+H8gt+5aAesOvfQAJd3hfd3hfeHRuCQEJZ2V0V3hQb29sAQkBB0FkZHJlc3MBARoBV3D/xi5mRA30O/nQjGXN6dEzY5zPcg/hnAALd3hfd3hfd2F2ZXMJAQlnZXRXeFBvb2wBCQEHQWRkcmVzcwEBGgFXmkQFmJm8tKiQ5rdVb7cYKMuIhtMFfR9WAAZyb3V0ZXMJAMwIAgkAmQoHBQx3eF93YXZlc194dG4FC3d4X3d4X3dhdmVzBQtzd29wX3d4X3h0bgYGBwUMU2NhbGU4QmlnSW50BQNuaWwBAWkBB2RlZmF1bHQAAwkBAiE9AggFAWkGY2FsbGVyBQZjYWxsZXIJAAIBAgtObyB0b3VjaGluZwoBDWFjY3VtRnVuY3Rpb24CBWFjY3VtBG5leHQEA2VzdAkBDWVzdGltYXRlUm91dGUHCAUEbmV4dAJfMQgFBG5leHQCXzIIBQRuZXh0Al8zCAUEbmV4dAJfNAgFBG5leHQCXzUIBQRuZXh0Al82CAUEbmV4dAJfNwkAlAoCCQDNCAIIBQVhY2N1bQJfMQgFA2VzdAJfMQkAzQgCCAUFYWNjdW0CXzIIBQNlc3QCXzIEBGZvbGQKAAIkbAUGcm91dGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENYWNjdW1GdW5jdGlvbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgMQkBBSRmMF8yAgkBBSRmMF8xAgUFJGFjYzAAAAABBA1tYXhTd2FwUHJvZml0CQCWAwEIBQRmb2xkAl8xAwkAZwIAAAUNbWF4U3dhcFByb2ZpdAkAAgECDUVzdGltYXRlIGZhaWwED2VzdGltYXRlZFJlc3VsdAkAkQMCCAUEZm9sZAJfMgkBBXZhbHVlAQkAzwgCCAUEZm9sZAJfMQUNbWF4U3dhcFByb2ZpdAQHcmVzdWx0MQkBCmludm9rZVN3YXABCQCRAwIFD2VzdGltYXRlZFJlc3VsdAAAAwkAAAIFB3Jlc3VsdDEFB3Jlc3VsdDEEB3Jlc3VsdDIJAQppbnZva2VTd2FwAQkAkQMCBQ9lc3RpbWF0ZWRSZXN1bHQAAQMJAAACBQdyZXN1bHQyBQdyZXN1bHQyBAdyZXN1bHQzCQEKaW52b2tlU3dhcAEJAJEDAgUPZXN0aW1hdGVkUmVzdWx0AAIDCQAAAgUHcmVzdWx0MwUHcmVzdWx0MwQGcHJvZml0CQBlAgkBCmdldEJhbGFuY2UBBQdJbkFzc2V0BQlpbkJhbGFuY2UDCQBnAgAABQZwcm9maXQJAAIBAgxFeGVjdXRlIGZhaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIcmVjZWl2ZXIFBnByb2ZpdAUHSW5Bc3NldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgIHcHJvZml0XwUKSW5Bc3NldFN0cgIBXwkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUGcHJvZml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICDHRvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgkAZAIJAQxnZXRJbnRPclplcm8BCQCsAgICDHRvdGFsUHJvZml0XwUKSW5Bc3NldFN0cgUGcHJvZml0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ArnwUZA==", "chainId": 87, "height": 3625072, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GSSXrh73CrxgY7pdYccv56BxbGS5ZMPBHoxHSVdZM2mH Next: AcPQpvW1rDTYZzW7GCrxvb2dknMpZK5Xsw5zQinATNnn Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale6 = 1000000
55
6+let Scale6BigInt = toBigInt(Scale6)
7+
68 let Scale8 = 100000000
9+
10+let Scale8BigInt = toBigInt(Scale8)
711
812 let SEP = "__"
913
1014 let InScale = 1000000
15+
16+let InScaleBigInt = toBigInt(InScale)
1117
1218 let InAsset = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1319
104110
105111 func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse,a3Scale) = {
106112 let a12 = if (pool1Reverse)
107- then pool1._2
108- else pool1._1
113+ then toBigInt(pool1._2)
114+ else toBigInt(pool1._1)
109115 let a21 = if (pool1Reverse)
110- then pool1._1
111- else pool1._2
116+ then toBigInt(pool1._1)
117+ else toBigInt(pool1._2)
112118 let a23 = if (pool2Reverse)
113- then pool2._2
114- else pool2._1
119+ then toBigInt(pool2._2)
120+ else toBigInt(pool2._1)
115121 let a32 = if (pool2Reverse)
116- then pool2._1
117- else pool2._2
122+ then toBigInt(pool2._1)
123+ else toBigInt(pool2._2)
118124 let a31 = if (pool3Reverse)
119- then pool3._2
120- else pool3._1
125+ then toBigInt(pool3._2)
126+ else toBigInt(pool3._1)
121127 let a13 = if (pool3Reverse)
122- then pool3._1
123- else pool3._2
128+ then toBigInt(pool3._1)
129+ else toBigInt(pool3._2)
124130 let aaDenominator = (a23 + a21)
125- let aa13 = fraction(fraction(a12, a23, InScale), Scale6, aaDenominator)
126- let aa31 = fraction(fraction(a21, a32, a3Scale), Scale6, aaDenominator)
127- let aDenominator = (fraction(a31, Scale6, a3Scale) + aa31)
128- let a = fraction(fraction(aa13, a31, a3Scale), Scale6, aDenominator)
129- let aa = fraction(fraction(aa31, a13, InScale), Scale6, aDenominator)
130- let delta = (sqrt(fraction(aa, a, Scale6), 6, 6, CEILING) - a)
131- let inAmount = (fraction(delta, InScale, Scale6) / 2)
131+ let aa13 = fraction(fraction(a12, a23, InScaleBigInt), Scale6BigInt, aaDenominator)
132+ let aa31 = fraction(fraction(a21, a32, a3Scale), Scale6BigInt, aaDenominator)
133+ let aDenominator = (fraction(a31, Scale6BigInt, a3Scale) + aa31)
134+ let a = fraction(fraction(aa13, a31, a3Scale), Scale6BigInt, aDenominator)
135+ let aa = fraction(fraction(aa31, a13, InScaleBigInt), Scale6BigInt, aDenominator)
136+ let delta = (sqrtBigInt(fraction(aa, a, Scale6BigInt), 6, 6, CEILING) - a)
137+ let inAmount = (toInt(fraction(delta, InScaleBigInt, Scale6BigInt)) / 2)
132138 if ((0 >= inAmount))
133139 then $Tuple2(0, nil)
134140 else {
181187
182188 let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh'))
183189
184-let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, Scale8)]
190+let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, Scale8BigInt)]
185191
186192 @Callable(i)
187193 func default () = if ((i.caller != caller))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale6 = 1000000
55
6+let Scale6BigInt = toBigInt(Scale6)
7+
68 let Scale8 = 100000000
9+
10+let Scale8BigInt = toBigInt(Scale8)
711
812 let SEP = "__"
913
1014 let InScale = 1000000
15+
16+let InScaleBigInt = toBigInt(InScale)
1117
1218 let InAsset = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1319
1420 let InAssetStr = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p"
1521
1622 let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK')
1723
1824 let receiver = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK')
1925
2026 let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93')
2127
2228 let thisAddressStr = toString(this)
2329
2430 func getIntOrZero (key) = valueOrElse(getInteger(key), 0)
2531
2632
2733 func getBalance (asset) = if ((asset == unit))
2834 then wavesBalance(this).regular
2935 else assetBalance(this, value(asset))
3036
3137
3238 func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES"))
3339 then unit
3440 else fromBase58String(assetStr)
3541
3642
3743 let inBalance = getBalance(InAsset)
3844
3945 func getSwopPool (pool) = {
4046 let assetIdAStr = getStringValue(pool, "A_asset_id")
4147 let assetIdBStr = getStringValue(pool, "B_asset_id")
4248 let assetIdA = getAssetOrWaves(assetIdAStr)
4349 let assetIdB = getAssetOrWaves(assetIdBStr)
4450 let balanceA = getIntegerValue(pool, "A_asset_balance")
4551 let balanceB = getIntegerValue(pool, "B_asset_balance")
4652 let outFee = getIntegerValue(pool, "commission")
4753 $Tuple9(balanceA, balanceB, assetIdA, assetIdB, assetIdAStr, assetIdBStr, 0, outFee, pool)
4854 }
4955
5056
5157 func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP)
5258
5359
5460 func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP)
5561
5662
5763 func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0)
5864
5965
6066 func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0)
6167
6268
6369 func getWxAccountBalance (pool,assetId) = {
6470 let balanceOnPool = if ((assetId == "WAVES"))
6571 then wavesBalance(pool).available
6672 else assetBalance(pool, fromBase58String(assetId))
6773 let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId))
6874 max([0, totalBalance])
6975 }
7076
7177
7278 func getWxPool (pool) = {
7379 let assetIdAStr = getStringValue(pool, "%s__amountAsset")
7480 let assetIdBStr = getStringValue(pool, "%s__priceAsset")
7581 let assetIdA = getAssetOrWaves(assetIdAStr)
7682 let assetIdB = getAssetOrWaves(assetIdBStr)
7783 let balanceA = getWxAccountBalance(pool, assetIdAStr)
7884 let balanceB = getWxAccountBalance(pool, assetIdBStr)
7985 let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee")
8086 let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee")
8187 let inFee = fraction((protocolFee + poolFee), Scale6, Scale8)
8288 $Tuple9(balanceA, balanceB, assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, 0, wxSwapAddress)
8389 }
8490
8591
8692 func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = {
8793 let cleanAmount = fraction(pmtAmount, (Scale6 - inFee), Scale6)
8894 let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom))
8995 let amountWithFee = fraction(amountWithoutFee, (Scale6 - outFee), Scale6)
9096 amountWithFee
9197 }
9298
9399
94100 func estimateSwap (poolInfo,inAsset,inAmount) = {
95101 let routeArgs = if ((inAsset == poolInfo._3))
96102 then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8))
97103 else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8))
98104 let dappArgs = if ((poolInfo._9 == wxSwapAddress))
99105 then $Tuple2("swap", [0, routeArgs._2, thisAddressStr])
100106 else $Tuple2("exchange", [1])
101107 $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2)
102108 }
103109
104110
105111 func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse,a3Scale) = {
106112 let a12 = if (pool1Reverse)
107- then pool1._2
108- else pool1._1
113+ then toBigInt(pool1._2)
114+ else toBigInt(pool1._1)
109115 let a21 = if (pool1Reverse)
110- then pool1._1
111- else pool1._2
116+ then toBigInt(pool1._1)
117+ else toBigInt(pool1._2)
112118 let a23 = if (pool2Reverse)
113- then pool2._2
114- else pool2._1
119+ then toBigInt(pool2._2)
120+ else toBigInt(pool2._1)
115121 let a32 = if (pool2Reverse)
116- then pool2._1
117- else pool2._2
122+ then toBigInt(pool2._1)
123+ else toBigInt(pool2._2)
118124 let a31 = if (pool3Reverse)
119- then pool3._2
120- else pool3._1
125+ then toBigInt(pool3._2)
126+ else toBigInt(pool3._1)
121127 let a13 = if (pool3Reverse)
122- then pool3._1
123- else pool3._2
128+ then toBigInt(pool3._1)
129+ else toBigInt(pool3._2)
124130 let aaDenominator = (a23 + a21)
125- let aa13 = fraction(fraction(a12, a23, InScale), Scale6, aaDenominator)
126- let aa31 = fraction(fraction(a21, a32, a3Scale), Scale6, aaDenominator)
127- let aDenominator = (fraction(a31, Scale6, a3Scale) + aa31)
128- let a = fraction(fraction(aa13, a31, a3Scale), Scale6, aDenominator)
129- let aa = fraction(fraction(aa31, a13, InScale), Scale6, aDenominator)
130- let delta = (sqrt(fraction(aa, a, Scale6), 6, 6, CEILING) - a)
131- let inAmount = (fraction(delta, InScale, Scale6) / 2)
131+ let aa13 = fraction(fraction(a12, a23, InScaleBigInt), Scale6BigInt, aaDenominator)
132+ let aa31 = fraction(fraction(a21, a32, a3Scale), Scale6BigInt, aaDenominator)
133+ let aDenominator = (fraction(a31, Scale6BigInt, a3Scale) + aa31)
134+ let a = fraction(fraction(aa13, a31, a3Scale), Scale6BigInt, aDenominator)
135+ let aa = fraction(fraction(aa31, a13, InScaleBigInt), Scale6BigInt, aDenominator)
136+ let delta = (sqrtBigInt(fraction(aa, a, Scale6BigInt), 6, 6, CEILING) - a)
137+ let inAmount = (toInt(fraction(delta, InScaleBigInt, Scale6BigInt)) / 2)
132138 if ((0 >= inAmount))
133139 then $Tuple2(0, nil)
134140 else {
135141 let input = if ((inAmount > inBalance))
136142 then inBalance
137143 else inAmount
138144 let swap1 = estimateSwap(pool1, InAsset, input)
139145 let swap2 = estimateSwap(pool2, swap1._1, swap1._2)
140146 let swap3 = estimateSwap(pool3, swap2._1, swap2._2)
141147 $Tuple2((swap3._2 - input), [$Tuple5(pool1._9, swap1._3, swap1._4, InAsset, input), $Tuple5(pool2._9, swap2._3, swap2._4, swap1._1, swap1._2), $Tuple5(pool3._9, swap3._3, swap3._4, swap2._1, swap2._2)])
142148 }
143149 }
144150
145151
146152 func invokeSwap (args) = {
147153 let currentBalance = getBalance(args._4)
148154 let trimmedAmount = if ((args._5 > currentBalance))
149155 then currentBalance
150156 else args._5
151157 let resultAmount = if ((args._4 == InAsset))
152158 then trimmedAmount
153159 else if ((currentBalance > args._5))
154160 then currentBalance
155161 else trimmedAmount
156162 invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)])
157163 }
158164
159165
160166 let swop_btcwxg_xtn = getSwopPool(Address(base58'3PACj2DLTw3uUhsUmT98zHU5M4hPufbHKav'))
161167
162168 let swop_power_xtn = getSwopPool(Address(base58'3P88KDKWHNKNdbZxe8FfAJP8coAhvfDtuzV'))
163169
164170 let swop_swop_xtn = getSwopPool(Address(base58'3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W'))
165171
166172 let swop_swop_waves = getSwopPool(Address(base58'3PH8Np6jwuoikvkHL2qmdpFEHBR4UV5vwSq'))
167173
168174 let swop_waves_btcwxg = getSwopPool(Address(base58'3P8FVZgAJUAq32UEZtTw84qS4zLqEREiEiP'))
169175
170176 let swop_waves_xtn = getSwopPool(Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG'))
171177
172178 let swop_wx_xtn = getSwopPool(Address(base58'3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R'))
173179
174180 let wx_power_waves = getWxPool(Address(base58'3PDi7Qq8pLQYvtKyTfQuqqPUWyhoYbU957t'))
175181
176182 let wx_swop_waves = getWxPool(Address(base58'3PA8nK44sopUpXNcCRTpPSH2F7yjvxzx5cw'))
177183
178184 let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g'))
179185
180186 let wx_wx_xtn = getWxPool(Address(base58'3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99'))
181187
182188 let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh'))
183189
184-let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, Scale8)]
190+let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, Scale8BigInt)]
185191
186192 @Callable(i)
187193 func default () = if ((i.caller != caller))
188194 then throw("No touching")
189195 else {
190196 func accumFunction (accum,next) = {
191197 let est = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6, next._7)
192198 $Tuple2((accum._1 :+ est._1), (accum._2 :+ est._2))
193199 }
194200
195201 let fold = {
196202 let $l = routes
197203 let $s = size($l)
198204 let $acc0 = $Tuple2(nil, nil)
199205 func $f0_1 ($a,$i) = if (($i >= $s))
200206 then $a
201207 else accumFunction($a, $l[$i])
202208
203209 func $f0_2 ($a,$i) = if (($i >= $s))
204210 then $a
205211 else throw("List size exceeds 1")
206212
207213 $f0_2($f0_1($acc0, 0), 1)
208214 }
209215 let maxSwapProfit = max(fold._1)
210216 if ((0 >= maxSwapProfit))
211217 then throw("Estimate fail")
212218 else {
213219 let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))]
214220 let result1 = invokeSwap(estimatedResult[0])
215221 if ((result1 == result1))
216222 then {
217223 let result2 = invokeSwap(estimatedResult[1])
218224 if ((result2 == result2))
219225 then {
220226 let result3 = invokeSwap(estimatedResult[2])
221227 if ((result3 == result3))
222228 then {
223229 let profit = (getBalance(InAsset) - inBalance)
224230 if ((0 >= profit))
225231 then throw("Execute fail")
226232 else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))]
227233 }
228234 else throw("Strict value is not equal to itself.")
229235 }
230236 else throw("Strict value is not equal to itself.")
231237 }
232238 else throw("Strict value is not equal to itself.")
233239 }
234240 }
235241
236242

github/deemru/w8io/786bc32 
55.48 ms