> For the complete documentation index, see [llms.txt](https://docs.0xpass.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.0xpass.io/wallet-operations/passkeys-signer/sign-transaction/sign-transaction-sdk.md).

# Sign Transaction SDK

To sign a transaction a user  / an account would need to have to have been register and authenticated  by going through  [Register using SDK](/authentication/passkeys/registration/register-using-sdk.md) flow.

## **Session-Based Authentication**

In order to use this flow, you must  [Authenticating with SDK](/authentication/passkeys/authentication/authenticating-with-sdk.md) first to obtain a JWT.  Here is a sample of how to use it

```javascript
import { Passport } from "@0xpass/passport";
import { WebauthnSigner } from "@0xpass/webauthn-signer";
import { stringToHex } from "viem";
import { Passport } from "@0xpass/passport";
import { WebauthnSigner } from "@0xpass/webauthn-signer";

const signer = new WebauthnSigner({
      rpId: window.location.hostname,
      rpName: "rpName",
});

const passport = new Passport({
    scopeId: "insert_your_scope_id",
    signer: signer
});

const userInput {
   username: "insert_registered_username_here"
   userDisplayName: "insert_registered_user_display_name_here"
}

await passport.setupEncryption();
await passport.authenticate(userInput);

// Transaction Can be of type legacy (0x0),
// EIP2930 (0x01) or EIP1559 (0x02)
const transaction = {
  nonce: "0",
  maxPriorityFeePerGas: "0x9184E72A", 
  maxFeePerGas: "0x9184E72A",
  to: "0xb89FF4E9AD6B33F69153fa710F9849f51712eEc4",
  gas: "0x7530", 
  value: "0x2386F26FC10000", 
  chainId: "0x7A69",
  type: "0x02"
}

// Generate a threshold signature
const signature = await passport.signTransaction(transaction);
console.log(signature); // This is an rlp encoded transaction signature
```

### signTransaction Parameters

<table><thead><tr><th>Parameter</th><th>Description</th><th>Example Values</th></tr></thead><tbody><tr><td><code>transaction</code></td><td>The transaction object to be signed, can be a Legacy, EIP2930, or EIP1559 transaction type</td><td><pre class="language-json"><code class="lang-json">{
  "nonce": "0",
  "maxPriorityFeePerGas": "0x9184E72A", 
  "maxFeePerGas": "0x9184E72A",
  "to": "0xb89FF4E9AD6B33F69153fa710F9849f51712eEc4",
  "gas": "0x7530", 
  "value": "0x2386F26FC10000", 
  "chainId": "0x7A69",
  "type": "0x02"
}
</code></pre></td></tr></tbody></table>

#### signTransaction Response

A successful response will return the following,  an RLP encoded transaction signature from the authenticated account that can be executed as a raw transaction.

```json
{
    "jsonrpc": "2.0",
    "result": "signed_transaction_here",
    "id": 1
}
```

## **Direct Passkey Authentication**

Since you will be directly authenticating with Passkeys here, you don't need to go through authentication step. Here is a code sample:

```javascript
import { Passport } from "@0xpass/passport";
import { WebauthnSigner } from "@0xpass/webauthn-signer";
import { stringToHex } from "viem";
import { Passport } from "@0xpass/passport";
import { WebauthnSigner } from "@0xpass/webauthn-signer";

const signer = new WebauthnSigner({
      rpId: window.location.hostname,
      rpName: "rpName",
});

const passport = new Passport({
    scope_id: "insert_your_scope_id",
    signer: signer
});

const userInput {
   username: "insert_registered_username_here"
   userDisplayName: "insert_registered_user_display_name_here"
}

await passport.setupEncryption();
//This step is different for direct authentication
passport.setUserData(userInput)

// Transaction Can be of type legacy (0x0),
// EIP2930 (0x01) or EIP1559 (0x02)
const transaction = {
  nonce: "0",
  maxPriorityFeePerGas: "0x9184E72A", 
  maxFeePerGas: "0x9184E72A",
  to: "0xb89FF4E9AD6B33F69153fa710F9849f51712eEc4",
  gas: "0x7530", 
  value: "0x2386F26FC10000", 
  chainId: "0x7A69",
  type: "0x02"
}

// Generate a threshold signature
const signature = await passport.signTransaction(transaction);
console.log(signature); // This is an rlp encoded transaction signature
```

### signTransaction Parameters

<table><thead><tr><th>Parameter</th><th>Description</th><th>Example Values</th></tr></thead><tbody><tr><td><code>transaction</code></td><td>The transaction object to be signed, can be a Legacy, EIP2930, or EIP1559 transaction type</td><td><pre class="language-json"><code class="lang-json">{
  "nonce": "0",
  "maxPriorityFeePerGas": "0x9184E72A", 
  "maxFeePerGas": "0x9184E72A",
  "to": "0xb89FF4E9AD6B33F69153fa710F9849f51712eEc4",
  "gas": "0x7530", 
  "value": "0x2386F26FC10000", 
  "chainId": "0x7A69",
  "type": "0x02"
}
</code></pre></td></tr></tbody></table>

#### signTransaction Response

A successful response will return the following,  an RLP encoded transaction signature from the authenticated account that can be executed as a raw transaction.

```json
{
    "jsonrpc": "2.0",
    "result": "signed_transaction_here",
    "id": 1
}
```
