Subject: Wallet Services showFunding / checkout — all on-ramp providers fail (Mercuryo signature, MoonPay blank, Transak error, Topper geo)

Hi MetaMask / Web3Auth Support,

We integrate Embedded Wallets + Wallet Services and open fiat on-ramp via: wsEmbed.showFunding

Users log in with Google / email through modal WALLET_CONNECTORS.AUTH so the funding session key matches the account wallet.

What works

Login (Google / email modal AUTH) succeeds

Wallet Services checkout UI opens (showFunding)

Destination address in provider URLs matches our account EVM address

What fails — every on-ramp provider inside the same checkout

Mercuryo

Error in UI: “Invalid or missing request signature”

Also on POST https://api.mercuryo.io/v1.6/widget/buy → HTTP 403, code 403029

Example widget URL (signature present, address is our wallet):

Mercuryo widget_id appears to be: e5bf3e67-52a8-4ebc-9648-914e01909146

Address in the URL is correct for the logged-in user; we cannot regenerate Mercuryo’s merchant signature (your widget secret).

MoonPay — checkout / buy.moonpay.com does not load (connection fails / blank).

Transak — generic “Something went wrong”.

Topper — unavailable in my country, regardless of country selected in the UI.

So this is not a single-provider edge case: the entire Wallet Services on-ramp aggregator path is unusable for us.

Questions / ask

Is Wallet Services fiat on-ramp fully enabled for our Client ID / plan (Scale)?

Can you check Mercuryo integration for widget e5bf3e67-… — why v2 signatures are rejected (secret / IP binding / merchant_transaction_id)?

Are MoonPay / Transak / Topper known-degraded for UA (or our project) right now?

Any required checkout params, allowlist domains, or dashboard toggles we are missing?

Happy to provide HAR/network logs, screen recordings, and another failing merchant_transaction_id on request.

Thanks

We’re not able to verify your Client ID’s plan entitlement, per-region provider availability, or the internals of Mercuryo/MoonPay/Transak/Topper sessions from the public Embedded Wallets documentation. Those outcomes depend on your project configuration and the provider-side checkout session — not on whether the destination EVM address is correct, and your URL confirms the address is being passed through correctly.

One SDK detail worth pinning down first: the documented JavaScript checkout API is showCheckout (showCheckout | MetaMask developer documentation). We don’t see wsEmbed.showFunding in the public JS reference, so please confirm the exact Wallet Services package name and version that exposes it, and whether your deployment is on Sapphire Mainnet or Devnet.

On Mercuryo: please do not attempt to generate or modify the signature, widget_id, or any merchant secret client-side. A 403029 / “Invalid or missing request signature” error can only be diagnosed by correlating the checkout-session request and the provider’s response against your project configuration — the address and merchant_transaction_id alone don’t tell us whether the signature was produced against the expected parameters, credential, or environment.

To move this forward, please post the following here, with all secrets and tokens removed:

  • Your Embedded Wallets Client ID (public identifier only) and whether the failing app runs on Sapphire Mainnet or Devnet.
  • The deployed application origin(s) and exact SDK/package versions.
  • The minimal initialization plus checkout invocation code, with credentials redacted.
  • A HAR file covering one attempt per provider: request URL, HTTP status, response headers/body, timestamp with time zone, country, and browser/device. Strip login tokens, cookies, authorization headers, and any provider secrets. Never include a private key or seed phrase.
  • One new failing merchant_transaction_id with its timestamp.
  • The intended country and fiat/asset/network combination for each test. Note that Topper eligibility can legitimately vary by jurisdiction, and selecting a country in the UI does not override its underlying rules.

Also, please re-check your project’s Client ID and connection configuration at https://dashboard.web3auth.io, confirming the deployed app is pointed at the same client/environment you’ve configured. A Devnet-vs-Mainnet or Client-ID mismatch can easily look like a provider-wide outage.

The public checkout reference doesn’t document merchant-signature parameters, allowlist-domain settings, plan entitlement checks, or live provider health — so we can’t confirm any of those from documentation alone. Once the redacted evidence above is posted in this thread, we can help isolate whether the failure occurs before checkout creation, during the provider handoff, or at the provider’s signed-session validation step.

Sources

Note: This response was generated by an AI bot and may require further verification. The MetaMask Community Team has tracked this issue and will be responding as soon as possible.

Thanks for the follow-up. Here is the redacted evidence we can share now. We are not generating or modifying Mercuryo signatures / widget secrets client-side.

1) Client ID + network

  • Client ID: BMhswBezycVnJWn0uApY3qh4iJcxUVIjQt4ZiQtIMHbDjZXsoXQKOVYsCEN7VXwgFSrwkHc_m5IaDKdZMXTtiIk
  • Web3Auth network env: NEXT_PUBLIC_WEB3AUTH_NETWORK=devnet → SDK resolves to WEB3AUTH_NETWORK.SAPPHIRE_DEVNET
  • Dashboard check pending on our side for whether Wallet Services / funding toggles for this Client ID are intended for Devnet vs Mainnet.

2) App origin + SDK versions

  • App origin (develop): https://… (paste exact origin you tested — e.g. cards / frontend develop host)
    Local: http://localhost:… if reproduced there.
  • Packages (installed):
    • @web3auth/modal@11.3.0
    • @web3auth/ws-embed@6.1.0 (transitive via modal ^6.1.0)
    • @web3auth/single-factor-auth@9.5.0 (used for Telegram only; Google/email funding path uses modal AUTH)

3) showFunding vs showCheckout

Public docs emphasize showCheckout. In our stack the AUTH connector’s Wallet Services embed exposes both:

  • wsEmbed.showFunding(...)
  • wsEmbed.showCheckout(...)

We call showFunding on the live AUTH wsEmbed after modal Google/email login (embed.isLoggedIn === true).
@web3auth/ws-embed@6.1.0 types include showFunding and showCheckout.

If showFunding is deprecated / wrong for Sapphire Devnet, please confirm we should switch to showCheckout with the same checkoutParams.

4) Minimal init + checkout invocation (secrets redacted)

Init (simplified):

import { WEB3AUTH_NETWORK, WALLET_CONNECTORS } from '@web3auth/modal';

const web3AuthOptions = {
  clientId: '<CLIENT_ID>',
  web3AuthNetwork: WEB3AUTH_NETWORK.SAPPHIRE_DEVNET, // from env=devnet
  chains: [/* Ethereum 0x1, BSC 0x38 */],
  defaultChainId: '0x1',
  walletServicesConfig: {
    loginMode: 'plugin',
    whiteLabel: { showWidgetButton: false, hideTopup: false },
  },
  // AA config enabled outside Telegram Mini App
};

// User logs in:
await web3Auth.connectTo(WALLET_CONNECTORS.AUTH, {
  authConnection: 'google', // or email passwordless + loginHint
});

Checkout open (exact shape we use):

// AUTH connector → wsEmbed
const embed = web3Auth
  .getConnector('auth', 'eip155')
  ?.wsEmbed;

await embed.showFunding({
  show: true,
  checkoutParams: {
    show: true,
    tokenList: ['USDC', 'USDT', 'ETH'],
    // no receiveWalletAddress
  },
});

We previously experimented with receiveWalletAddress; it is not used in the failing runs below. Destination address in provider URLs matches the logged-in account EVM address.

5) Provider failures (same checkout session / same day)

Country intended: Ukraine. Fiat: USD. Assets tried: USDT / USDC / ETH, network often ethereum in provider UI.

Provider Symptom
Mercuryo UI: “Invalid or missing request signature”; POST /v1.6/widget/buy → 403 / 403029
MoonPay Does not load / connection fails
Transak “Something went wrong”
Topper “Unavailable in my country” even after changing country in UI

6) Mercuryo example (no secrets)

We understand address + merchant_transaction_id alone don’t prove signature validity; sharing for correlation only:

  • widget_id: e5bf3e67-52a8-4ebc-9648-914e01909146
  • address: 0x38618FFb762C2B7B692fAF76f749B1128dE865e9 (matches our account)
  • merchant_transaction_id: 2c43a4f0-01e6-40a2-afb7-2af9f3695d89
  • timestamp: 2026-09-22 ~12:27–12:28 UTC+3 (Europe/Kyiv)
  • Host: production https://exchange.mercuryo.io/... (while our Embedded Wallets project is on Sapphire Devnet)

Question for your team: is it expected that Devnet Wallet Services funding opens production Mercuryo (exchange.mercuryo.io) with production widget_id, and could Devnet↔Mainnet / credential mismatch present exactly as 403029?

7) HAR / more merchant_transaction_ids

We will attach redacted HARs (one attempt per provider: URL, status, response body, timestamp+TZ, country, browser) in a follow-up — stripping cookies, Authorization, login JWTs, and any secrets.
We can also mint a fresh merchant_transaction_id + timestamp in that reply.

8) What we need from you

  1. Confirm whether Sapphire Devnet Wallet Services on-ramp is supported for this Client ID / plan.
  2. Confirm whether we should call showCheckout instead of showFunding.
  3. Correlate Mercuryo 403029 for widget e5bf3e67-… + tx 2c43a4f0-… against your checkout-session signing.
  4. Any known outage / geo restrictions for MoonPay / Transak / Topper for UA on this project.

Happy to provide HARs and another failing merchant_transaction_id as soon as you confirm the preferred upload path.

Thanks for the detailed report — the redacted evidence is helpful.

On showFunding vs showCheckout

showCheckout is the checkout API we document publicly for Embedded Wallets. showFunding may exist on the underlying wsEmbed instance in your installed dependency, but it is not a documented public entry point, so we can’t guarantee its parameter shape or behavior across versions. We recommend moving to showCheckout and following its documented signature rather than reusing your current checkoutParams object as-is: showCheckout | MetaMask developer documentation

To be precise about what we can and can’t confirm: we have no public documentation confirming that showFunding is deprecated, and we cannot correlate a specific Mercuryo widget ID or merchant_transaction_id with backend signing records in this thread.

On Sapphire Devnet vs the production Mercuryo host

Sapphire Devnet is intended for development; Sapphire Mainnet is the appropriate network for a deployed production app. That said, a provider opening https://exchange.mercuryo.io is not, by itself, evidence of a Devnet/Mainnet credential mismatch — providers can serve production-hosted widget infrastructure regardless of environment. Whether a checkout session is valid and available depends on several factors together: the client ID and Sapphire network you pass to the SDK, the Wallet Services configuration enabled for that project, the requesting origin, and the provider’s own supported country, KYC, asset, and chain combinations.

So a Devnet/Mainnet or project-configuration mismatch is one plausible cause of a provider-side rejection, but we can’t state that Mercuryo error 403029 specifically means that without seeing the project configuration and the full provider request/response.

What we need for the next diagnostic pass (please post it here in this thread):

  1. The exact tested application origin, including scheme and port for localhost.
  2. A fresh failing attempt per provider, with timestamp and timezone.
  3. HAR excerpts limited to request URL, HTTP status, and response body. Please strip cookies, Authorization headers, login JWTs, provider secrets, and session identifiers.
  4. Browser console output around the showCheckout call and the provider redirect/iframe creation.
  5. Confirmation from your dashboard that the client ID is configured for the same Sapphire environment you pass to the SDK, and that the tested origin is on the allowlist: https://dashboard.web3auth.io

On the geo failures

Changing the country selector inside a provider’s UI does not override that provider’s own eligibility decision. Topper’s “unavailable in my country” result, and the MoonPay/Transak failures, can depend on actual location, compliance checks, payment method, the selected asset/network pair, and whether the provider supports that session at all.

Please do not post any seed phrase, private key, wallet password, JWT, cookie, Authorization header, or widget secret. The EVM destination address and the redacted provider error body are sufficient for initial diagnosis.

Reference for the documented flow and runnable integrations:

Sources

Note: This response was generated by an AI bot and may require further verification. The MetaMask Community Team has tracked this issue and will be responding as soon as possible.