## 1. Project Overview & Quickstart (teamchong/faq)

# faq

Open-source repository teamchong/faq

### Repository Details
- **Repository:** [teamchong/faq](https://github.com/teamchong/faq)
- **Primary Language:** Code

*Note: High-volume repository documentation is actively indexed and synchronized by YakaAI.*

## 2. Official Technical Reference & Guides (teamchong/docs)

## File: README.md

---
---

# Introduction

**Phantom** is a wallet and browser extension that can be used to manage digital assets and access decentralized applications on the [Solana](https://solana.com/) blockchain. 

It works by creating and managing private keys on behalf of its users, allowing them to store funds and sign transactions. 

The extension injects a `solana` object into the javascript context of every web application the user visits. The application may then interact with the wallet, such as asking for permission to perform a transaction, through this injected object.

---

## File: faq.md

# FAQ

## Are hardware wallets supported?

Yes, currently [Ledger](https://www.ledger.com/) is supported and requires no special treatment on the application side.

---

## File: sandbox.md

# Sandbox

For a live example of a simple Phantom integration, check out our developer sandbox on [Codesandbox](https://codesandbox.io/s/github/phantom-labs/sandbox?file=/src/App.tsx) and [GitHub](https://github.com/phantom-labs/sandbox).

---

## File: SUMMARY.md

# Table of contents

* [Introduction](README.md)

## Integrating

* [Detecting the Provider](integrating/detecting-the-provider.md)
* [Establishing a Connection](integrating/establishing-a-connection.md)
* [Sending a Transaction](integrating/sending-a-transaction.md)
* [Live Integrations](integrating/live-integrations.md)

## Resources

---

* [Sandbox](sandbox.md)
* [FAQ](faq.md)

---

## File: integrating/detecting-the-provider.md

# Detecting the Provider

The Phantom browser extension will inject an object called`solana` on the [window](https://developer.mozilla.org/en-US/docs/Web/API/Window) object of any web application the user visits.

To detect if a browser extension using this API is installed, you can check for the existence of the `solana` object.

To make it easy to detect Phantom specifically, the extension will add an additional `isPhantom` flag.

```javascript
const isPhantomInstalled = window.solana && window.solana.isPhantom
```

If Phantom is not installed, we recommend you redirect your users to [our website](https://phantom.app/). Altogether, this may look like the following.

```javascript
const getProvider = () => {
  if ("solana" in window) {
    const provider = window.solana;
    if (provider.isPhantom) {
      return provider;
    }
  }
  window.open("https://phantom.app/", "_blank");
};
```

---

## File: integrating/establishing-a-connection.md

# Establishing a Connection

In order to start interacting with Phantom you must first establish a connection. This connection request will prompt the user for permission to share their public key, and indicate that they are willing to interact further. 

Once permission is established the first time, the web application's domain will be whitelisted for future connection requests. The user may also indicate that they are willing to auto-approve certain transactions from the application as well.

Similarly, it is possible to terminate the connection both on the application and the user side.

## Connecting

The **recommended** and **easiest** way to connect to Phantom is by calling `window.solana.connect()` . However, the provider also exposes a `request` JSON RPC interface.

{% tabs %}
{% tab title="connect\(\)" %}
```javascript
window.solana.connect();
```
{% endtab %}

{% tab title="request\(\)" %}
```javascript
window.solana.request({ method: "connect" })
```
{% endtab %}
{% endtabs %}

When the user has accepted the request to connect, the provider will emit a `connect` event.

```javascript
window.solana.on('connect' () => console.log("connected!"))
```

Once the web application is connected to Phantom, it will be able to read the connected account's public key and send transactions. It also exposes a convenience `isConnect` boolean, and will indicate whether automatic transaction approvals have been enabled by the user.

```javascript
window.solana.publicKey.toString()
// 26qv4GCcx98RihuK3c4T6ozB3J7L6VwCuFVc7Ta2A3Uo 
window.solana.isConnect
// true
window.solana.autoApprove
// true or false
```

## Disconnecting

Disconnecting is similar to connecting, however, it is possible for the disconnection to originate from the wallet.

{% tabs %}
{% tab title="disconnect\(\)" %}
```javascript
window.solana.disconnect();
```
{% endtab %}

{% tab title="request\(\)" %}
```javascript
window.solana.request({ method: "disconnect" });
```
{% endtab %}
{% endtabs %}

```javascript
window.solana.on('disconnect' () => console.log("disconnected!"))
```

---

## File: integrating/live-integrations.md

# Live Integrations

Phantom is integrated in major Solana projects, many of which are open source. Here are some examples.

* [Serum DEX](https://github.com/project-serum/serum-dex-ui/blob/master/src/wallet-adapters/phantom/index.tsx)
* [Serum Swap \(oyster-swap\)](https://github.com/project-serum/oyster-swap/blob/master/src/wallet-adapters/phantom/index.tsx)
* [sol-wallet-adapter](https://github.com/project-serum/sol-wallet-adapter)

---

## File: integrating/sending-a-transaction.md

# Sending a Transaction

Once the web application is connected to Phantom, it can send transactions on behalf of the user, with the user's permission.

In order to send a transaction, the web application must:

* Create an unsigned transaction or transactions.
* Have it be signed by the user's Phantom wallet.
* Send it to a Solana node for processing.

For more information about the nature of transactions on Solana, it is recommended to review the `solana-web3.js` [docs](https://solana-labs.github.io/solana-web3.js/class/src/transaction.js~Transaction.html) as well as the official [Solana docs](https://docs.solana.com/developing/programming-model/transactions).

For a sample transaction check out our developer sandbox.

{% page-ref page="../sandbox.md" %}

## Signing a Transaction

Once a transaction is created, the web application may ask the user's Phantom wallet to sign the transaction using their account's private key. By far the **easiest** and **recommended** way of doing this is by using the `signTransaction` method on the provider, but it is also possible to do with `request`. In both cases, the call with return a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) for the signed transaction.

{% tabs %}
{% tab title="signTransaction\(\)" %}
```javascript
const network = "<NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const signedTransaction = await window.solana.signTransaction(transaction);
const signature = await connection.sendRawTransaction(signedTransaction.serialize());
```
{% endtab %}

{% tab title="request\(\)" %}
```javascript
const network = "<NETWORK_URL>";
const connection = new Connection(network);
const transaction = new Transaction();
const signedTransaction = await window.solana.request({
    method: "signTransaction",
    params: {
         message: bs58.encode(transaction.serializeMessage()),
    },
});
const signature = await connection.sendRawTransaction(signedTransaction.serialize());
```
{% endtab %}
{% endtabs %}

## Signing Multiple Transactions

It is also possible to sign and send multiple transactions at once. This is exposed through the `signAllTransactions` method on the provider.

{% tabs %}
{% tab title="signAllTransactions\(\)" %}
```javascript
const signedTransactions = await window.solana.signAllTransactions(transactions);
```
{% endtab %}

{% tab title="request\(\)" %}
```javascript
const message = transactions.map(transaction => {
    return bs58.encode(transaction.serializeMessage());
});
const signedTransactions = await window.solana.request({
    method: "signAllTransactions",
    params: { message },
});
```
{% endtab %}
{% endtabs %}