Title: Two Main Submit Buttons, "Calculate" and "Exchange" Have No Differentiation Logic
While reviewing the frontend form logic, I noticed that both the “Calculate” and “Exchange” buttons are implemented as separate
inputs within the same form and both submit to the same
endpoint.
<input id="calculate" name="calculate" type="submit" value="Calculate">
<input id="exchange" name="exchange" type="submit" value="Exchange">
The server has to guess which button was clicked based on which
field appears in the POST body. This is non-standard practice considering that with disabled Javascript, the server-side logic distinguishing Calculate vs Exchange depends entirely on this pattern working correctly.
From testing, it appears the backend distinguishes the requested action based on which button name is included in the POST body.
Even though browsers normally handle this correctly, this is a fragile logic because both operations share the same endpoint and completely rely on submit-button field detection.
This stood out especially because the platform promotes “No JS” compatibility:
<strong>Fast, Secure, No KYC, No JS, No Logs.</strong>
meaning the reliability of server-side form handling becomes more important. If a browser, accessibility tool, proxy, automated client, or malformed request omits the submit button field, the backend may not reliably determine whether the user intended to calculate an exchange or actually create one.
However, live network traffic testing revealed that the actual implementation contradicts both the HTML source and the "No JS" claim. "Calculate" does not POST to
. it sends a GET request to /?calc=1 with parameters appended as query strings:
GET https://mobit.exchange/?calc=1&from_currency=bitcoin&to_currency=ethereum&from_amnt=1&rate_type=flat
"Exchange" correctly sends
POST https://mobit.exchange/init_tx
and returns a
redirect to the order tracking page.
This means JavaScript is running to override the form's declared
and
before submission.
This is a direct contradicting the advertised "No JS" compatibility. The form as written in HTML would POST both buttons to
, but JavaScript intercepts the Calculate action and converts it to a GET request instead. Users or clients running without JavaScript would therefore submit Calculate as a POST to
just like Exchange, with no
flag, giving the server no reliable way to distinguish the intended action.
Expected behavior would be either:
- separate endpoints for calculation and exchange creation or
an explicit hidden action parameter validated server-side.
Using a more explicit action-handling approach would make the request flow more reliable and reduce uncertainty in non-JavaScript environments. Additionally, the
flag being exposed as a plain URL query parameter means anyone can call
directly with arbitrary parameters, bypassing the form and captcha entirely.
