The hyperliquid bridge native USDC and is secured by the L1 validator set:

The deposit flow is for the bridge is simple. The user sends native USDC to the bridge and it is credited to the account that sent it in less than 1 minute.

The withdrawal flow requires a user wallet signature on the L1 only, and no Arbitrum transaction. The withdrawal from Arbitrum is handled entirely the validators, and the funds arrive in the user wallet in 3-4 minutes. This payload for signTypedData is

    #[derive(Debug, Clone, Eip712, EthAbiType)]
        name = "Exchange",
        version = "1",
        chain_id = 421613,
        verifying_contract = "0x0000000000000000000000000000000000000000"
    struct WithdrawFromBridge2SignPayload {
        destination: String,
        usd: String,
        time: u64,

and the corresponding L1 action is

struct WithdrawFromBridge2Action {
    chain: String, 
    payload: WithdrawFromBridge2SignPayload,

Example signed L1 action:

    "action": {
        "type": "withdraw2",
        "chain": "Arbitrum",
        "payload": {
            "destination": "0x000....0",
            "usd": "12.3",
            "time": 1698693262
    "nonce": 1698693262 // IMPORTANT: this must match "time",
    "signature": {"r": ..., "s": ..., "v": ... } // signedTypedData output of payload

Last updated