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:
Old | New | Differences | |
---|---|---|---|
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let Scale6 = 1000000 | |
5 | 5 | ||
6 | + | let Scale6BigInt = toBigInt(Scale6) | |
7 | + | ||
6 | 8 | let Scale8 = 100000000 | |
9 | + | ||
10 | + | let Scale8BigInt = toBigInt(Scale8) | |
7 | 11 | ||
8 | 12 | let SEP = "__" | |
9 | 13 | ||
10 | 14 | let InScale = 1000000 | |
15 | + | ||
16 | + | let InScaleBigInt = toBigInt(InScale) | |
11 | 17 | ||
12 | 18 | let InAsset = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
13 | 19 | ||
104 | 110 | ||
105 | 111 | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse,a3Scale) = { | |
106 | 112 | let a12 = if (pool1Reverse) | |
107 | - | then pool1._2 | |
108 | - | else pool1._1 | |
113 | + | then toBigInt(pool1._2) | |
114 | + | else toBigInt(pool1._1) | |
109 | 115 | let a21 = if (pool1Reverse) | |
110 | - | then pool1._1 | |
111 | - | else pool1._2 | |
116 | + | then toBigInt(pool1._1) | |
117 | + | else toBigInt(pool1._2) | |
112 | 118 | let a23 = if (pool2Reverse) | |
113 | - | then pool2._2 | |
114 | - | else pool2._1 | |
119 | + | then toBigInt(pool2._2) | |
120 | + | else toBigInt(pool2._1) | |
115 | 121 | let a32 = if (pool2Reverse) | |
116 | - | then pool2._1 | |
117 | - | else pool2._2 | |
122 | + | then toBigInt(pool2._1) | |
123 | + | else toBigInt(pool2._2) | |
118 | 124 | let a31 = if (pool3Reverse) | |
119 | - | then pool3._2 | |
120 | - | else pool3._1 | |
125 | + | then toBigInt(pool3._2) | |
126 | + | else toBigInt(pool3._1) | |
121 | 127 | let a13 = if (pool3Reverse) | |
122 | - | then pool3._1 | |
123 | - | else pool3._2 | |
128 | + | then toBigInt(pool3._1) | |
129 | + | else toBigInt(pool3._2) | |
124 | 130 | let aaDenominator = (a23 + a21) | |
125 | - | let aa13 = fraction(fraction(a12, a23, | |
126 | - | let aa31 = fraction(fraction(a21, a32, a3Scale), | |
127 | - | let aDenominator = (fraction(a31, | |
128 | - | let a = fraction(fraction(aa13, a31, a3Scale), | |
129 | - | let aa = fraction(fraction(aa31, a13, | |
130 | - | let delta = ( | |
131 | - | let inAmount = (fraction(delta, | |
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) | |
132 | 138 | if ((0 >= inAmount)) | |
133 | 139 | then $Tuple2(0, nil) | |
134 | 140 | else { | |
181 | 187 | ||
182 | 188 | let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh')) | |
183 | 189 | ||
184 | - | let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, | |
190 | + | let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, Scale8BigInt)] | |
185 | 191 | ||
186 | 192 | @Callable(i) | |
187 | 193 | func default () = if ((i.caller != caller)) |
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 | + | let Scale6BigInt = toBigInt(Scale6) | |
7 | + | ||
6 | 8 | let Scale8 = 100000000 | |
9 | + | ||
10 | + | let Scale8BigInt = toBigInt(Scale8) | |
7 | 11 | ||
8 | 12 | let SEP = "__" | |
9 | 13 | ||
10 | 14 | let InScale = 1000000 | |
15 | + | ||
16 | + | let InScaleBigInt = toBigInt(InScale) | |
11 | 17 | ||
12 | 18 | let InAsset = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
13 | 19 | ||
14 | 20 | let InAssetStr = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
15 | 21 | ||
16 | 22 | let caller = Address(base58'3PQ23xgnf98t4qDtF5bscxdCDwgYoL7SPeK') | |
17 | 23 | ||
18 | 24 | let receiver = Address(base58'3PLoX5yufZz9jRahL1CVVRAXq8VpUmXBKLK') | |
19 | 25 | ||
20 | 26 | let wxSwapAddress = Address(base58'3P68zNiufsu1viZpu1aY3cdahRRKcvV5N93') | |
21 | 27 | ||
22 | 28 | let thisAddressStr = toString(this) | |
23 | 29 | ||
24 | 30 | func getIntOrZero (key) = valueOrElse(getInteger(key), 0) | |
25 | 31 | ||
26 | 32 | ||
27 | 33 | func getBalance (asset) = if ((asset == unit)) | |
28 | 34 | then wavesBalance(this).regular | |
29 | 35 | else assetBalance(this, value(asset)) | |
30 | 36 | ||
31 | 37 | ||
32 | 38 | func getAssetOrWaves (assetStr) = if ((assetStr == "WAVES")) | |
33 | 39 | then unit | |
34 | 40 | else fromBase58String(assetStr) | |
35 | 41 | ||
36 | 42 | ||
37 | 43 | let inBalance = getBalance(InAsset) | |
38 | 44 | ||
39 | 45 | func getSwopPool (pool) = { | |
40 | 46 | let assetIdAStr = getStringValue(pool, "A_asset_id") | |
41 | 47 | let assetIdBStr = getStringValue(pool, "B_asset_id") | |
42 | 48 | let assetIdA = getAssetOrWaves(assetIdAStr) | |
43 | 49 | let assetIdB = getAssetOrWaves(assetIdBStr) | |
44 | 50 | let balanceA = getIntegerValue(pool, "A_asset_balance") | |
45 | 51 | let balanceB = getIntegerValue(pool, "B_asset_balance") | |
46 | 52 | let outFee = getIntegerValue(pool, "commission") | |
47 | 53 | $Tuple9(balanceA, balanceB, assetIdA, assetIdB, assetIdAStr, assetIdBStr, 0, outFee, pool) | |
48 | 54 | } | |
49 | 55 | ||
50 | 56 | ||
51 | 57 | func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP) | |
52 | 58 | ||
53 | 59 | ||
54 | 60 | func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP) | |
55 | 61 | ||
56 | 62 | ||
57 | 63 | func getAdditionalBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyAdditionalBalance(assetId)), 0) | |
58 | 64 | ||
59 | 65 | ||
60 | 66 | func getStakingAssetBalanceOrZero (pool,assetId) = valueOrElse(getInteger(pool, keyStakingAssetBalance(assetId)), 0) | |
61 | 67 | ||
62 | 68 | ||
63 | 69 | func getWxAccountBalance (pool,assetId) = { | |
64 | 70 | let balanceOnPool = if ((assetId == "WAVES")) | |
65 | 71 | then wavesBalance(pool).available | |
66 | 72 | else assetBalance(pool, fromBase58String(assetId)) | |
67 | 73 | let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(pool, assetId)) - getStakingAssetBalanceOrZero(pool, assetId)) | |
68 | 74 | max([0, totalBalance]) | |
69 | 75 | } | |
70 | 76 | ||
71 | 77 | ||
72 | 78 | func getWxPool (pool) = { | |
73 | 79 | let assetIdAStr = getStringValue(pool, "%s__amountAsset") | |
74 | 80 | let assetIdBStr = getStringValue(pool, "%s__priceAsset") | |
75 | 81 | let assetIdA = getAssetOrWaves(assetIdAStr) | |
76 | 82 | let assetIdB = getAssetOrWaves(assetIdBStr) | |
77 | 83 | let balanceA = getWxAccountBalance(pool, assetIdAStr) | |
78 | 84 | let balanceB = getWxAccountBalance(pool, assetIdBStr) | |
79 | 85 | let protocolFee = getIntegerValue(wxSwapAddress, "%s__protocolFee") | |
80 | 86 | let poolFee = getIntegerValue(wxSwapAddress, "%s__poolFee") | |
81 | 87 | let inFee = fraction((protocolFee + poolFee), Scale6, Scale8) | |
82 | 88 | $Tuple9(balanceA, balanceB, assetIdA, assetIdB, assetIdAStr, assetIdBStr, inFee, 0, wxSwapAddress) | |
83 | 89 | } | |
84 | 90 | ||
85 | 91 | ||
86 | 92 | func calcSwap (pmtAmount,tokenFrom,tokenTo,inFee,outFee) = { | |
87 | 93 | let cleanAmount = fraction(pmtAmount, (Scale6 - inFee), Scale6) | |
88 | 94 | let amountWithoutFee = fraction(tokenTo, cleanAmount, (cleanAmount + tokenFrom)) | |
89 | 95 | let amountWithFee = fraction(amountWithoutFee, (Scale6 - outFee), Scale6) | |
90 | 96 | amountWithFee | |
91 | 97 | } | |
92 | 98 | ||
93 | 99 | ||
94 | 100 | func estimateSwap (poolInfo,inAsset,inAmount) = { | |
95 | 101 | let routeArgs = if ((inAsset == poolInfo._3)) | |
96 | 102 | then $Tuple3(poolInfo._4, poolInfo._6, calcSwap(inAmount, poolInfo._1, poolInfo._2, poolInfo._7, poolInfo._8)) | |
97 | 103 | else $Tuple3(poolInfo._3, poolInfo._5, calcSwap(inAmount, poolInfo._2, poolInfo._1, poolInfo._7, poolInfo._8)) | |
98 | 104 | let dappArgs = if ((poolInfo._9 == wxSwapAddress)) | |
99 | 105 | then $Tuple2("swap", [0, routeArgs._2, thisAddressStr]) | |
100 | 106 | else $Tuple2("exchange", [1]) | |
101 | 107 | $Tuple4(routeArgs._1, routeArgs._3, dappArgs._1, dappArgs._2) | |
102 | 108 | } | |
103 | 109 | ||
104 | 110 | ||
105 | 111 | func estimateRoute (pool1,pool2,pool3,pool1Reverse,pool2Reverse,pool3Reverse,a3Scale) = { | |
106 | 112 | let a12 = if (pool1Reverse) | |
107 | - | then pool1._2 | |
108 | - | else pool1._1 | |
113 | + | then toBigInt(pool1._2) | |
114 | + | else toBigInt(pool1._1) | |
109 | 115 | let a21 = if (pool1Reverse) | |
110 | - | then pool1._1 | |
111 | - | else pool1._2 | |
116 | + | then toBigInt(pool1._1) | |
117 | + | else toBigInt(pool1._2) | |
112 | 118 | let a23 = if (pool2Reverse) | |
113 | - | then pool2._2 | |
114 | - | else pool2._1 | |
119 | + | then toBigInt(pool2._2) | |
120 | + | else toBigInt(pool2._1) | |
115 | 121 | let a32 = if (pool2Reverse) | |
116 | - | then pool2._1 | |
117 | - | else pool2._2 | |
122 | + | then toBigInt(pool2._1) | |
123 | + | else toBigInt(pool2._2) | |
118 | 124 | let a31 = if (pool3Reverse) | |
119 | - | then pool3._2 | |
120 | - | else pool3._1 | |
125 | + | then toBigInt(pool3._2) | |
126 | + | else toBigInt(pool3._1) | |
121 | 127 | let a13 = if (pool3Reverse) | |
122 | - | then pool3._1 | |
123 | - | else pool3._2 | |
128 | + | then toBigInt(pool3._1) | |
129 | + | else toBigInt(pool3._2) | |
124 | 130 | let aaDenominator = (a23 + a21) | |
125 | - | let aa13 = fraction(fraction(a12, a23, | |
126 | - | let aa31 = fraction(fraction(a21, a32, a3Scale), | |
127 | - | let aDenominator = (fraction(a31, | |
128 | - | let a = fraction(fraction(aa13, a31, a3Scale), | |
129 | - | let aa = fraction(fraction(aa31, a13, | |
130 | - | let delta = ( | |
131 | - | let inAmount = (fraction(delta, | |
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) | |
132 | 138 | if ((0 >= inAmount)) | |
133 | 139 | then $Tuple2(0, nil) | |
134 | 140 | else { | |
135 | 141 | let input = if ((inAmount > inBalance)) | |
136 | 142 | then inBalance | |
137 | 143 | else inAmount | |
138 | 144 | let swap1 = estimateSwap(pool1, InAsset, input) | |
139 | 145 | let swap2 = estimateSwap(pool2, swap1._1, swap1._2) | |
140 | 146 | let swap3 = estimateSwap(pool3, swap2._1, swap2._2) | |
141 | 147 | $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)]) | |
142 | 148 | } | |
143 | 149 | } | |
144 | 150 | ||
145 | 151 | ||
146 | 152 | func invokeSwap (args) = { | |
147 | 153 | let currentBalance = getBalance(args._4) | |
148 | 154 | let trimmedAmount = if ((args._5 > currentBalance)) | |
149 | 155 | then currentBalance | |
150 | 156 | else args._5 | |
151 | 157 | let resultAmount = if ((args._4 == InAsset)) | |
152 | 158 | then trimmedAmount | |
153 | 159 | else if ((currentBalance > args._5)) | |
154 | 160 | then currentBalance | |
155 | 161 | else trimmedAmount | |
156 | 162 | invoke(args._1, args._2, args._3, [AttachedPayment(args._4, resultAmount)]) | |
157 | 163 | } | |
158 | 164 | ||
159 | 165 | ||
160 | 166 | let swop_btcwxg_xtn = getSwopPool(Address(base58'3PACj2DLTw3uUhsUmT98zHU5M4hPufbHKav')) | |
161 | 167 | ||
162 | 168 | let swop_power_xtn = getSwopPool(Address(base58'3P88KDKWHNKNdbZxe8FfAJP8coAhvfDtuzV')) | |
163 | 169 | ||
164 | 170 | let swop_swop_xtn = getSwopPool(Address(base58'3P27S9V36kw2McjWRZ37AxTx8iwkd7HXw6W')) | |
165 | 171 | ||
166 | 172 | let swop_swop_waves = getSwopPool(Address(base58'3PH8Np6jwuoikvkHL2qmdpFEHBR4UV5vwSq')) | |
167 | 173 | ||
168 | 174 | let swop_waves_btcwxg = getSwopPool(Address(base58'3P8FVZgAJUAq32UEZtTw84qS4zLqEREiEiP')) | |
169 | 175 | ||
170 | 176 | let swop_waves_xtn = getSwopPool(Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')) | |
171 | 177 | ||
172 | 178 | let swop_wx_xtn = getSwopPool(Address(base58'3PKi4G3VX2k42ZSmNNrmvgdDH7JzRaUhY7R')) | |
173 | 179 | ||
174 | 180 | let wx_power_waves = getWxPool(Address(base58'3PDi7Qq8pLQYvtKyTfQuqqPUWyhoYbU957t')) | |
175 | 181 | ||
176 | 182 | let wx_swop_waves = getWxPool(Address(base58'3PA8nK44sopUpXNcCRTpPSH2F7yjvxzx5cw')) | |
177 | 183 | ||
178 | 184 | let wx_waves_xtn = getWxPool(Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g')) | |
179 | 185 | ||
180 | 186 | let wx_wx_xtn = getWxPool(Address(base58'3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99')) | |
181 | 187 | ||
182 | 188 | let wx_wx_waves = getWxPool(Address(base58'3PFzaH2ghpwANHFgjeva83N1yxzErELx2eh')) | |
183 | 189 | ||
184 | - | let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, | |
190 | + | let routes = [$Tuple7(wx_waves_xtn, wx_wx_waves, swop_wx_xtn, true, true, false, Scale8BigInt)] | |
185 | 191 | ||
186 | 192 | @Callable(i) | |
187 | 193 | func default () = if ((i.caller != caller)) | |
188 | 194 | then throw("No touching") | |
189 | 195 | else { | |
190 | 196 | func accumFunction (accum,next) = { | |
191 | 197 | let est = estimateRoute(next._1, next._2, next._3, next._4, next._5, next._6, next._7) | |
192 | 198 | $Tuple2((accum._1 :+ est._1), (accum._2 :+ est._2)) | |
193 | 199 | } | |
194 | 200 | ||
195 | 201 | let fold = { | |
196 | 202 | let $l = routes | |
197 | 203 | let $s = size($l) | |
198 | 204 | let $acc0 = $Tuple2(nil, nil) | |
199 | 205 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
200 | 206 | then $a | |
201 | 207 | else accumFunction($a, $l[$i]) | |
202 | 208 | ||
203 | 209 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
204 | 210 | then $a | |
205 | 211 | else throw("List size exceeds 1") | |
206 | 212 | ||
207 | 213 | $f0_2($f0_1($acc0, 0), 1) | |
208 | 214 | } | |
209 | 215 | let maxSwapProfit = max(fold._1) | |
210 | 216 | if ((0 >= maxSwapProfit)) | |
211 | 217 | then throw("Estimate fail") | |
212 | 218 | else { | |
213 | 219 | let estimatedResult = fold._2[value(indexOf(fold._1, maxSwapProfit))] | |
214 | 220 | let result1 = invokeSwap(estimatedResult[0]) | |
215 | 221 | if ((result1 == result1)) | |
216 | 222 | then { | |
217 | 223 | let result2 = invokeSwap(estimatedResult[1]) | |
218 | 224 | if ((result2 == result2)) | |
219 | 225 | then { | |
220 | 226 | let result3 = invokeSwap(estimatedResult[2]) | |
221 | 227 | if ((result3 == result3)) | |
222 | 228 | then { | |
223 | 229 | let profit = (getBalance(InAsset) - inBalance) | |
224 | 230 | if ((0 >= profit)) | |
225 | 231 | then throw("Execute fail") | |
226 | 232 | else [ScriptTransfer(receiver, profit, InAsset), IntegerEntry(((("profit_" + InAssetStr) + "_") + toString(lastBlock.timestamp)), profit), IntegerEntry(("totalProfit_" + InAssetStr), (getIntOrZero(("totalProfit_" + InAssetStr)) + profit))] | |
227 | 233 | } | |
228 | 234 | else throw("Strict value is not equal to itself.") | |
229 | 235 | } | |
230 | 236 | else throw("Strict value is not equal to itself.") | |
231 | 237 | } | |
232 | 238 | else throw("Strict value is not equal to itself.") | |
233 | 239 | } | |
234 | 240 | } | |
235 | 241 | ||
236 | 242 |
github/deemru/w8io/786bc32 55.48 ms ◑