# UniSat Wallet

## UniSat Wallet API

Welcome to UniSat's Developer Documentation. This documentation is for learning to develop applications for UniSat Wallet.

## Getting Started

To develop for UniSat Wallet, install UniSat Wallet on your development machine. [Download here](https://unisat.io/).

Once UniSat Wallet is installed and running, you should find that new browser tabs have a `window.unisat` object available in the developer console. This is how your website will interact with UniSat Wallet.

### Browser Detection

To verify if the browser is running UniSat Wallet, copy and paste the code snippet below in the developer console of your web browser:

```javascript
if (typeof window.unisat !== 'undefined') {
  console.log('UniSat Wallet is installed!');
}
```

You can review the full API for the `window.unisat` object here.

### Connecting to UniSat Wallet

"Connecting" or "logging in" to UniSat Wallet effectively means "to access the user's Bitcoin account(s)".

You should **only** initiate a connection request in response to direct user action, such as clicking a button. You should **always** disable the "connect" button while the connection request is pending. You should **never** initiate a connection request on page load.

We recommend that you provide a button to allow the user to connect UniSat Wallet to your dapp. Clicking this button should call the following method:

```javascript
unisat.requestAccounts()
```

### Demo

* [Online Demo](https://demo.unisat.io)
* [Demo source code](https://github.com/unisat-wallet/unisat-web3-demo)

## Methods

### requestAccounts

```typescript
unisat.requestAccounts()
```

Connect the current account.

**Parameters**

none

**Returns**

`Promise` returns `string[]` : Address of current account.

**Example**

```typescript
try {
  let accounts = await window.unisat.requestAccounts();
  console.log('connect success', accounts);
} catch (e) {
  console.log('connect failed');
}
> connect success ['tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz']
```

### getAccounts

```typescript
unisat.getAccounts()
```

Get address of current account

**Parameters**

none

**Returns**

* `Promise` - `string`: address of current account

**Example**

```typescript
try {
  let res = await window.unisat.getAccounts();
  console.log(res)
} catch (e) {
  console.log(e);
}
> ["tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz"]
```

### getNetwork

```typescript
unisat.getNetwork()
```

get network

{% hint style="warning" %}
Please note that this method only supports bitcoin mainnet and bitcoin testnet. Due to the support for more networks, please switch to the **getChain** method.
{% endhint %}

**Parameters**

none

**Returns**

* `Promise` - `string`: the network. `livenet` and `testnet`

**Example**

```typescript
try {
  let res = await window.unisat.getNetwork();
  console.log(res)
} catch (e) {
  console.log(e);
}

> 0
```

### switchNetwork

```typescript
unisat.switchNetwork(network)
```

switch network

{% hint style="warning" %}
Please note that this method only supports bitcoin mainnet and bitcoin testnet. Due to the support for more networks, please switch to the **switchChain** method.
{% endhint %}

**Parameters**

* `network` - `string`: the network. `livenet` and `testnet`

**Returns**

none

**Example**

```typescript
try {
  let res = await window.unisat.switchNetwork("livenet");
  console.log(res)
} catch (e) {
  console.log(e);
}

> 0
```

### getChain

```typescript
unisat.getChain()
```

get chain

*( Requires extension version greater than 1.4.0 )*

{% content-ref url="/pages/LACJAW3GKcae50U6gjg5" %}
[Supported Chains](/developer-support/open-api-documentation/unisat-wallet/supported-chains.md)
{% endcontent-ref %}

**Parameters**

none

**Returns**

* `Promise` - `Object`:
  * `enum` - `string` : the enum of chain
  * `name` - `string` : the name of chain
  * `network` - `string` :  `livenet` or `testnet`

**Example**

```typescript
try {
  let res = await window.unisat.getChain();
  console.log(res)
} catch (e) {
  console.log(e);
}

>  {enum: 'BITCOIN_MAINNET', name: 'Bitcoin Mainnet', network: 'livenet'}
```

### switchChain

```typescript
unisat.switchChain(chain)
```

switch chain&#x20;

*( Requires extension version greater than 1.4.0 )*

**Parameters**

* `chain` - `string`: the chain. `BITCOIN_MAINNET` or `BITCOIN_TESTNET` or `FRACTAL_BITCOIN_MAINNET`

**Returns**

* `Promise` - `Object`:
  * `enum` - `string` : the enum of chain
  * `name` - `string` : the name of chain
  * `network` - `string` :  `livenet` or `testnet`

**Example**

```typescript
try {
  let res = await window.unisat.switchChain("BITCOIN_MAINNET");
  console.log(res)
} catch (e) {
  console.log(e);
}

> {enum: 'BITCOIN_MAINNET', name: 'Bitcoin Mainnet', network: 'livenet'}
```

### getPublicKey

```typescript
unisat.getPublicKey()
```

Get publicKey of current account.

**Parameters**

none

**Returns**

* `Promise` - `string`: publicKey

**Example**

```typescript
try {
  let res = await window.unisat.getPublicKey();
  console.log(res)
} catch (e) {
  console.log(e);
}
> 03cbaedc26f03fd3ba02fc936f338e980c9e2172c5e23128877ed46827e935296f
```

### getBalance

```typescript
unisat.getBalance()
```

Get BTC balance

**Parameters**

none

**Returns**

* `Promise` - `Object`:
  * `confirmed` - `number` : the confirmed satoshis
  * `unconfirmed` - `number` : the unconfirmed satoshis
  * `total` - `number` : the total satoshis

**Example**

```typescript
try {
  let res = await window.unisat.getBalance();
  console.log(res)
} catch (e) {
  console.log(e);
}

> {
    "confirmed":0,
    "unconfirmed":100000,
    "total":100000
  }
```

### getInscriptions

```typescript
unisat.getInscriptions(cursor,size)
```

List inscriptions of current account

**Parameters**

none

**Returns**

* `Promise` - `Object`:
  * `total` - `number` : the total count
  * `list` - `Object[]` :
  * `inscriptionId` - `string` : the id of inscription.
  * `inscriptionNumber` - `string` : the number of inscription.
  * `address` - `string` : the address of inscription.
  * `outputValue` - `string` : the output value of inscription.
  * `content` - `string` : the content url of inscription.
  * `contentLength` - `string` : the content length of inscription.
  * `contentType` - `number` : the content type of inscription.
  * `preview` - `number` : the preview link
  * `timestamp` - `number` : the blocktime of inscription.
  * `offset` - `number` : the offset of inscription.
  * `genesisTransaction` - `string` : the txid of genesis transaction
  * `location` - `string` : the txid and vout of current location

**Example**

```typescript
try {
  let res = await window.unisat.getInscriptions(0,10);
  console.log(res)
} catch (e) {
  console.log(e);
}

> {
  "total":10,
  "list":[
    {
      inscriptionId: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531i0',
      inscriptionNumber: 959941,
      address: 'bc1q8h8s4zd9y0lkrx334aqnj4ykqs220ss735a3gh',
      outputValue: 546,
      preview: 'https://ordinals.com/preview/6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531i0',
      content: 'https://ordinals.com/content/6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531i0',
      contentLength: 53,
      contentType: 'text/plain;charset=utf-8',
      timestamp: 1680865285,
      genesisTransaction: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531',
      location: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531:0:0',
      output: '6037b17df2f48cf87f6b6e6ff89af416f6f21dd3d3bc9f1832fb1ff560037531:0',
      offset: 0
    }
  ]
}
```

### sendBitcoin

```typescript
unisat.sendBitcoin(toAddress, satoshis, options)
```

Send BTC

**Parameters**

* `toAddress` - `string`: the address to send
* `satoshis` - `number`: the satoshis to send
* `options` - `object`:  (optional)
  * `feeRate` - `number`: the network fee rate
  * `memo` - `string`: (optional)  The data content of OP\_RETURN, which needs to be in UTF-8 or HEX encoded format.
  * `memos` - `string[]`: (optional) The data content of OP\_RETURN, which needs to be in UTF-8 or HEX encoded format, provided in the form of an array.

**Returns**

* `Promise` - `string`: txid

**Example**

```typescript
try {
  let txid = await window.unisat.sendBitcoin("tb1qrn7tvhdf6wnh790384ahj56u0xaa0kqgautnnz",1000);
  console.log(txid)
} catch (e) {
  console.log(e);
}
```

### sendRunes

```typescript
unisat.sendRunes(address, runeid, amount, options)
```

Send Runes

**Parameters**

* `address` - `string`: the receiver address.
* `runeid` - `string`: the runeid&#x20;
* `amount` - `string`: the amount to send&#x20;
* `options` - `Object`:  (optional)
  * `feeRate` - `number`: the network fee rate

**Returns**

* `Promise` - `Object`:
  * `txid` - `string` : the txid

**Example**

```typescript
try {
  let txid = await window.unisat.sendRunes("tb1q8h8s4zd9y0lkrx334aqnj4ykqs220ss7mjxzny","63104:1",10,{feeRate:15});
  console.log(txid)
} catch (e) {
  console.log(e);
}
```

### sendInscription

```typescript
unisat.sendInscription(address, inscriptionId, options)
```

Send Inscription

**Parameters**

* `address` - `string`: the receiver address.
* `inscriptionId` - `string`: the id of Inscription
* `options` - `Object`:  (optional)
  * `feeRate` - `number`: the network fee rate

**Returns**

* `Promise` - `Object`:
  * `txid` - `string` : the txid

**Example**

```typescript
try {
  let txid = await window.unisat.sendInscription("tb1q8h8s4zd9y0lkrx334aqnj4ykqs220ss7mjxzny","e9b86a063d78cc8a1ed17d291703bcc95bcd521e087ab0c7f1621c9c607def1ai0",{feeRate:15});
  console.log("send Inscription 204 to tb1q8h8s4zd9y0lkrx334aqnj4ykqs220ss7mjxzny",txid)
} catch (e) {
  console.log(e);
}
```

### inscribeTransfer

```typescript
unisat.inscribeTransfer(ticker, amount)
```

Inscribe BRC-20  TRANSFER Inscription

**Parameters**

* `ticker` - `string`:  BRC-20 ticker&#x20;
* `amount` - `string`: the amount to inscribe

**Returns**

* `Promise` - `void`:

**Example**

```typescript

window.unisat.inscribeTransfer("ordi","100"); 

```

### signMessage

```typescript
unisat.signMessage(msg[, type])
```

sign message

**Parameters**

* `msg` - `string`: a string to sign
* `type` - `string`:  (Optional) "ecdsa" | "bip322-simple". default is "ecdsa"

**Returns**

* `Promise` - `string`: the signature.

**Example**

```typescript
// sign by ecdsa
try {
  let res = await window.unisat.signMessage("abcdefghijk123456789");
  console.log(res)
} catch (e) {
  console.log(e);
}

> G+LrYa7T5dUMDgQduAErw+i6ebK4GqTXYVWIDM+snYk7Yc6LdPitmaqM6j+iJOeID1CsMXOJFpVopvPiHBdulkE=

// verify by ecdsa
import { verifyMessage } from "@unisat/wallet-utils";
const pubkey = "026887958bcc4cb6f8c04ea49260f0d10e312c41baf485252953b14724db552aac";
const message = "abcdefghijk123456789";
const signature = "G+LrYa7T5dUMDgQduAErw+i6ebK4GqTXYVWIDM+snYk7Yc6LdPitmaqM6j+iJOeID1CsMXOJFpVopvPiHBdulkE=";
const result = verifyMessage(pubkey,message,signature);
console.log(result);

> true


// sign by bip322-simple
try {
  let res = await window.unisat.signMessage("abcdefghijk123456789","bip322-simple");
  console.log(res)
} catch (e) {
  console.log(e);
}

> AkcwRAIgeHUcjr0jODaR7GMM8cenWnIj0MYdGmmrpGyMoryNSkgCICzVXWrLIKKp5cFtaCTErY7FGNXTFe6kuEofl4G+Vi5wASECaIeVi8xMtvjATqSSYPDRDjEsQbr0hSUpU7FHJNtVKqw=


```

### pushTx

```typescript
unisat.pushTx(options)
```

Push Transaction

**Parameters**

* `options` - `Object`:
  * `rawtx` - `string`: rawtx to push

**Returns**

* `Promise` - `string`: txid

**Example**

```typescript
try {
  let txid = await window.unisat.pushTx({
    rawtx:"0200000000010135bd7d..."
  });
  console.log(txid)
} catch (e) {
  console.log(e);
}
```

### signPsbt

```typescript
unisat.signPsbt(psbtHex[, options])
```

Sign PSBT

This method will traverse all inputs that match the current address to sign.

**Parameters**

* `psbtHex` - `string`: the hex string of psbt to sign
* options
  * `autoFinalized` - `boolean`: whether finalize psbt after signing, default is true
  * `toSignInputs` - `array`:&#x20;
    * `index` - `number`: which input to sign&#x20;
    * `address` - `string`: (at least specify either an address or a publicKey) Which corresponding private key to use for signing
    * `publicKey` - `string`: (at least specify either an address or a publicKey) Which corresponding private key to use for signing
    * `sighashTypes` - `number[]`: (optionals) sighashTypes
    * `disableTweakSigner` - `boolean` :(optionals)  Default value is false. Setting it true allows the use of the original private key when signing taproot inputs.
    * `useTweakedSigner` - `boolean` :(optionals)  . By setting useTweakedSigner, you can forcibly decide whether or not to use tweakedSigner. It has a higher priority than disableTweakSigner.

&#x20;**Returns**

* `Promise` - `string`: the hex string of signed psbt

**Example**

```typescript
try {
  let res = await window.unisat.signPsbt(
    "70736274ff01007d....",
    {
        autoFinalized:false,
        toSignInputs:[
          {
            index: 0,
            address: "tb1q8h8....mjxzny",
          },
          {
            index: 1,
            publicKey: "tb1q8h8....mjxzny",
            sighashTypes: [1]
          },
          {
            index: 2,
            publicKey: "02062...8779693f",
          }
        ]
    }
  );
  console.log(res)
} catch (e) {
  console.log(e);
}

unisat.signPsbt("xxxxxxxx",{toSignInputs:[{index:0,publicKey:"xxxxxx",disableTweakSigner:true}],autoFinalized:false})

```

### signPsbts

```typescript
unisat.signPsbts(psbtHexs[, options])
```

Sign Multiple PSBTs at once

This method will traverse all inputs that match the current address to sign.

**Parameters**

* `psbtHexs` - `string[]`: the hex strings of psbt to sign
* `options` - `object`\[]: the options of signing psbt
  * `autoFinalized` - `boolean`: whether finalize psbt after signing, default is true
  * `toSignInputs` - `array`:&#x20;
    * `index` - `number`: which input to sign&#x20;
    * `address` - `string`: (at least specify either an address or a publicKey) Which corresponding private key to use for signing
    * `publicKey` - `string`: (at least specify either an address or a publicKey) Which corresponding private key to use for signing
    * `sighashTypes` - `number[]`: (optionals) sighashTypes
    * `useTweakedSigner` - `boolean` :(optionals)  . By setting useTweakedSigner, you can forcibly decide whether or not to use tweakedSigner. It has a higher priority than disableTweakSigner.

**Returns**

* `Promise` - `string[]`: the hex strings of signed psbt

**Example**

```typescript
try {
  let res = await window.unisat.signPsbts(["70736274ff01007d...","70736274ff01007d..."]);
  console.log(res)
} catch (e) {
  console.log(e);
}
```

### pushPsbt

```typescript
unisat.pushPsbt(psbtHex)
```

Push transaction

**Parameters**

* `psbtHex` - `string`: the hex string of psbt to push

**Returns**

* `Promise` - `string`: txid

**Example**

```typescript
try {
  let res = await window.unisat.pushPsbt("70736274ff01007d....");
  console.log(res)
} catch (e) {
  console.log(e);
}
```

## Events

### accountsChanged

```typescript
unisat.on('accountsChanged', handler: (accounts: Array<string>) => void);
unisat.removeListener('accountsChanged', handler: (accounts: Array<string>) => void);
```

The `accountsChanged` will be emitted whenever the user's exposed account address changes.

### networkChanged

```typescript
unisat.on('networkChanged', handler: (network: string) => void);
unisat.removeListener('networkChanged', handler: (network: string) => void);
```

The `networkChanged` will be emitted whenever the user's network changes.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.unisat.io/developer-support/open-api-documentation/unisat-wallet.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
