Sign and Broadcast Transaction

To sign and broadcast a transaction to the Hyperliquid network, follow these steps:

  1. Retrieve an unsigned transaction (unsignedTransaction) from of one of the following requests responses: transfer hype from spot to staking balance, delegate, undelegate and withdraw.
  2. Sign the transaction using the following code:
    import { signUserSignedAction, userSignedActionEip712Types, isValidPrivateKey } from "@nktkas/hyperliquid/signing";
    
    async function signTransaction(privateKey, unsignedTransaction) {
      const action = unsignedTransaction.action;
    
      return Buffer.from(
        JSON.stringify({
          ...unsignedTransaction,
          signature: await signUserSignedAction({
            wallet: privateKey,
            action: action,
            types: userSignedActionEip712Types[action.type],
          }),
        })
      ).toString("base64");
    }
    
    (async () => {
      const [, , rawTransaction, privateKey] = process.argv;
    
      if (!rawTransaction || typeof rawTransaction !== "string") {
        console.error("Invalid raw transaction. It should be a base64-encoded string.");
        process.exit(1);
      }
    
      if (!privateKey || typeof privateKey !== "string" || !isValidPrivateKey(privateKey)) {
        console.error("Invalid private key.");
        process.exit(1);
      }
    
      const unsignedTransaction = JSON.parse(Buffer.from(rawTransaction, "base64").toString("utf-8"));
    
      if (
        !("action" in unsignedTransaction) ||
        !("type" in unsignedTransaction.action) ||
        !["cDeposit", "tokenDelegate", "cWithdraw"].includes(unsignedTransaction.action.type)
      ) {
        console.error("Invalid unsigned transaction.");
        process.exit(1);
      }
    
      console.log(await signTransaction(privateKey.startsWith("0x") ? privateKey : `0x${privateKey}`, unsignedTransaction));
    })();
    
    /**
     *  To run with env variables:
     *
     *  $ export RAW_TX= 'rawtxhere'
     *  $ export PRIVATE_KEY= 'privatekeyhere'
     *  $ npx --yes -p @nktkas/[email protected] node hyperliquid-signer.js $RAW_TX $PRIVATE_KEY
     **/
    
  3. Send the signed transaction using the Send a transaction to the network endpoint.

What's Next?