Bridge2

The hyperliquid bridge native USDC and is secured by the L1 validator set: https://arbiscan.io/address/0x2df1c51e09aecf9cacb7bc98cb1742757f163df7

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)]
    #[eip712(
        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