Skip to content

depositFor on testnet does not create HyperCore account for contract addresses (Safe multisig) #138

@miohtama

Description

@miohtama

Summary

CoreDepositWallet.depositFor() on HyperEVM testnet (chain 998) succeeds on the EVM side (transaction status=1, events emitted, USDC burned) but never creates the corresponding HyperCore account. The coreUserExists precompile (0x0000000000000000000000000000000000000810) returns False indefinitely, and no spot balances or EVM escrow entries appear on HyperCore. The deposited USDC is effectively lost.

The same code works correctly on mainnet (chain 999) — coreUserExists returns True within 2-4 seconds after depositFor.

Environment

  • Network: HyperEVM testnet (chain ID 998)
  • RPC: https://rpc.hyperliquid-testnet.xyz/evm
  • API: https://api.hyperliquid-testnet.xyz
  • CoreDepositWallet: 0x0B80659a4076E9E93C7DbE0f10675A16a3e5C206
  • Deployer EOA: 0x4E6B7f7aFB2E23Bf9355c10e4454f73E6E6F3D9c (has active HyperCore account with 159 USDC in spot)

Reproduction

We deploy a Safe multisig on HyperEVM testnet, then call CoreDepositWallet.depositFor(safeAddress, amount, 0xFFFFFFFF) to activate the Safe's HyperCore account. The EVM transaction succeeds but the account is never created.

Test 1: 2 USDC, 60s timeout

  • Safe: 0xe0983b68A7a8EFfbC5935f492D443DB54FC8D79D
  • depositFor tx: 0x21c3487a6c84ef34f0e74276cf8ae00b656f534db8aa87aa2d1fd8fe81e3846f
  • Result: coreUserExists returns False for 60 seconds, then timeout
2026-03-09 19:13:29 Account 0xe0983b68A7a8EFfbC5935f492D443DB54FC8D79D coreUserExists on HyperCore: False
2026-03-09 19:13:31 Account 0xe0983b68A7a8EFfbC5935f492D443DB54FC8D79D coreUserExists on HyperCore: False
...repeated every 2s for 60 seconds...
TimeoutError: Account 0xe0983b68A7a8EFfbC5935f492D443DB54FC8D79D was not activated within 60.0s after depositFor transaction 21c3487a6c84ef34f0e74276cf8ae00b656f534db8aa87aa2d1fd8fe81e3846f

Test 2: 5 USDC, 180s timeout

  • Safe: 0xb4282406b0B6EE9AA8EB34D2a86136C98344c23c
  • depositFor tx: 0xe9b22a1e82b25f49599125b3bc71b801a351045b5be57f273b1a346dc672776a
  • Result: coreUserExists returns False for 180 seconds, then timeout

Post-mortem check (via Hyperliquid info API)

After both tests, querying the Safe's HyperCore state shows:

  • Spot balances: 0
  • EVM escrows: 0
  • Perp account value: 0
  • Vault positions: 0

The USDC was burned on HyperEVM but never appeared anywhere on HyperCore.

What we investigated

  1. Increased deposit amount from 2 USDC to 5 USDC (well above the 1 USDC account creation fee) — same result
  2. Increased timeout from 60s to 180s — coreUserExists never flips to True
  3. Verified deployer account is active on HyperCore testnet (159 USDC in spot, 14 token balances)
  4. Verified EVM transactions succeeded with status=1 and emitted expected events (4 logs including USDC burn)
  5. Checked EVM escrow — no entries, meaning the bridge either processed silently or never queued
  6. Reviewed interaction timing docs — understood that EVM→Core transfers are processed after EVM block construction, but 180s is far beyond any documented latency

Suspected cause

The testnet faucet docs state:

Your master account must be activated on mainnet by sending at least $5 USDC on Arbitrum to the bridge address

This appears to apply to all accounts, not just EOAs. A freshly deployed Safe contract address has no mainnet presence, so the testnet HyperCore L1 may be rejecting the account creation silently.

If this is the case, it means depositFor to any new contract address on testnet will always fail, making testnet unusable for testing Safe/multisig activation flows.

Expected behaviour

CoreDepositWallet.depositFor(contractAddress, amount, SPOT_DEX) should create a HyperCore account for the target address on testnet, the same way it does on mainnet. Or, if there is a prerequisite (like mainnet activation), the EVM transaction should revert rather than silently burning the USDC.

Source code

Our activation code: https://github.com/tradingstrategy-ai/web3-ethereum-defi/blob/master/eth_defi/hyperliquid/evm_escrow.py

Related to #9 (must deposit before performing actions).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions