# Solana Provider

@solana/web3.js를 Wepin Provider와 함께 사용하면 Solana 블록체인과 상호작용 할 수 있습니다.&#x20;

## 지원 네트워크 <a href="#supported-networks" id="supported-networks"></a>

<table><thead><tr><th width="172.33333333333331">Chain ID</th><th>Network Name</th><th>Network Variable</th></tr></thead><tbody><tr><td>solana:mainnet</td><td>Solana Mainnet</td><td>solana</td></tr><tr><td>solana:devnet</td><td>Solana Devnet</td><td>solana-devnet</td></tr></tbody></table>

## 설치(Install)

{% tabs %}
{% tab title="npm" %}

```bash
npm install @wepin/provider-js
```

{% endtab %}

{% tab title="yarn" %}

```bash
yarn add @wepin/provider-js
```

{% endtab %}
{% endtabs %}

설치가 완료되면 앱 등록 후 할당받은 App ID와 App Key를 사용하여 아래와 같이 WepinProvider 인스턴스를 초기화합니다. 이렇게 하면 WepinProvider 를 사용할 수 있게 됩니다.

<pre class="language-javascript"><code class="lang-javascript"><strong>// 1. 패키지 import
</strong>import { WepinProvider } from '@wepin/provider-js'
<strong>
</strong>// 2. 초기화
const WepinProvider = new WepinProvider({
    appId: 'your-wepin-app-id',
    appKey: 'your-wepin-app-key',
})
</code></pre>

***

## 초기화하기 <a href="#initialization" id="initialization"></a>

Wepin Provider를 초기화하는 방법입니다.&#x20;

## init

```javascript
await wepinProvider.init(attributes?)
```

### **Parameters**

* `attributes` \<object> **optional**
  * `defaultLanguage`: 위젯의 기본 설정 언어. 현재 지원하는 언어는 `en`, `ko` , `ja`입니다.
  * `defaultCurrency`: 위젯의 기본 통화 설정. 현재 지원하는 통화는 `USD`, `KRW`, `JPY` 입니다.

### **Return value**

* `Promise`\<void>

### **Example**

```javascript
await wepinProvider.init({
    defaultLanguage: 'ko',
    defaultCurrency: 'KRW',
})
```

***

## isInitialized

WepinProvider 가 정상적으로 초기화 되었는지 확인할 수 있습니다.&#x20;

```javascript
wepinProvider.isInitialized()
```

### **Parameters**

* `<void>`

### **Return value**

* `<boolean>`\
  init이 정상적으로 잘 된 경우 <mark style="color:orange;">`true`</mark> , 실패한 경우 <mark style="color:orange;">`false`</mark> 를 반환합니다.

### **Example**

```javascript
if(wepinProvider.isInitialized()) {
  console.log('wepinProvider is initialized!')
}
```

***

## changeLanguage

위젯의 언어와 통화를 변경할 수 있습니다.

```javascript
wepinProvider.changeLanguage(attributes)
```

### **Parameters**

* `attributes` \<object>
  * `language` \<string>\
    위젯에 표시될 언어를   지정합니다. 현재 지원하는 언어는 `en`, `ko`, `ja` 3가지 입니다.
  * `currency` \<string>\
    위젯에 표시될 통화를  지정합니다. 현재 지원하는 통화는 `USD`, `KRW`, `JPY` 3가지 입니다.

### **Return value**

* \<boolean>\
  init이 정상적으로 잘 된 경우 <mark style="color:orange;">`true`</mark> , 실패한 경우 <mark style="color:orange;">`false`</mark> 를 반환합니다.

### **Example**

```javascript
if(wepinProvider.isInitialized()) {
  console.log('wepinProvider is initialized!')
}
```

***

## 메서드(Method)

Wepin Provider 초기화 후에 메소드를 사용할 수 있습니다.

## getProvider

Network에 해당하는 프로바이더를 반환합니다.

```jsx
await wepinProvider.getProvider(network)
```

### **Parameters**

* `network` \<string> \
  위핀이 지원하는 Provider의 Network Variable 값으로, Solana Mainnet의 경우 "solana" 입니다. Network Variable은 소문자로 입력해야 합니다. 전체 목록은 [Solana Provider 지원 네트워크](/widget-integration/web-javascript-sdk/provider/solana-provider.md#undefined)에서 확인하세요.

### **Return value**

* `Promise`\<BaseProvider> - solana provider

### **Example**

```javascript
const provider = await wepinProvider.getProvider('solana')
```

***

## finalize

WepinProvider 사용을 종료합니다.

```javascript
wepinProvider.finalize()
```

### **Parameters**

* `<void>`

### **Return value**

* `<void>`

### **Example**

```javascript
wepinProvider.finalize()
```

***

## request

Solana 블록체인과 상호작용할 수 있도록 JSON-RPC 요청을 보낼 수 있습니다.

### connect

위핀 지갑에 연결하여 사용자의 허가를 받아 계정의 주소(Public Key)를 공유합니다. 연결이 승인되면 애플리케이션은 메시지 서명이나 트랜잭션 요청을 할 수 있습니다.

#### Parameters

* `<void>`

#### Return value

* `Promise`\<object>
  * `publicKey`\<string> - Solana 계정의 Address(Public Key)

#### Example

```typescript
await wepinProvider.request({
    method: 'connect',
    params: [],
})
```

***

### signTransaction

직렬화된 트랜잭션을 서명합니다. 입력으로 hex string으로 변환된 트랜잭션을 받고, 서명된 트랜잭션을 반환합니다.

#### Parameters

* `<object>`
  * `transaction` \<string> - 직렬화된 트랜잭션을 hex string으로 변환한 값

#### Return value

* `Promise` \<Transaction> - 서명이 포함된 Transaction

#### Example

<pre class="language-typescript"><code class="lang-typescript"><strong>import { Transaction, SystemProgram, PublicKey } from '@solana/web3.js'
</strong>
const transaction = new Transaction()
const { value } = await getBlock()
transaction.add(
  SystemProgram.transfer({
    fromPubkey: new PublicKey(selectedAccount),
    toPubkey: new PublicKey(toAddress),
    lamports: parseFloat(toAmount) * 1000000000,
  })
)

transaction.recentBlockhash = value.blockhash
transaction.feePayer = new PublicKey(selectedAccount.value)

await wepinProvider.request({
    method: 'signTransaction',
    params: { transaction: _toHexString(transaction.serializeMessage()) },
})
</code></pre>

***

### signAndSendTransaction

직렬화된 트랜잭션에 서명하고 Solana 네트워크에 제출합니다. 트랜잭션의 서명(Tx ID)을 반환합니다.

#### Parameters

* `<object>`
  * `transaction` \<string> - 직렬화된 트랜잭션을 hex string으로 변환한 값

#### Return value

* `Promise` \<object>
  * `signature` \<TransactionSignature> - 성공적으로 전송된 트랜잭션의 고유 서명(signature) 을 반환합니다.

#### Example

```typescript
import { Transaction, SystemProgram, PublicKey } from '@solana/web3.js'

const transaction = new Transaction()
const { value } = await getBlock()
transaction.add(
  SystemProgram.transfer({
    fromPubkey: new PublicKey(selectedAccount),
    toPubkey: new PublicKey(toAddress),
    lamports: parseFloat(toAmount) * 1000000000,
  })
)

transaction.recentBlockhash = value.blockhash
transaction.feePayer = new PublicKey(selectedAccount.value)

await wepinProvider.request({
    method: 'signAndSendTransaction',
    params: { transaction: _toHexString(transaction.serializeMessage()) },  //transaction.serializeMessage() 의 return 값은 Buffer 로 hex string 으로 변환해야 합니다.
})
```

***

### signAllTransactions

직렬화된 여러개의 트랜잭션을 한번에 서명합니다. 입력으로 hex string으로 변환된 트랜잭션 배열을 받고, 서명된 트랜잭션 배열을 반환합니다.

#### Parameters

* `<object>`
  * `transactions` \<Array\<string>> - 직렬화된 트랜잭션 데이터 배열. 각 트랜잭션은 Solana의 `Transaction` 또는 `VersionedTransaction` 객체를 직렬화 한 후, 해당 데이터를 Hexadecimal(16진수) 문자열로 변환한 값입니다.

#### Return value

* `Promise` \<Array\<Transaction>> - 서명이 포함된 Transaction 배열

#### Example

```typescript
import { Transaction, SystemProgram, PublicKey } from '@solana/web3.js'

const transaction = new Transaction()
const { value } = await getBlock()
transaction.add(
  SystemProgram.transfer({
    fromPubkey: new PublicKey(selectedAccount),
    toPubkey: new PublicKey(toAddress),
    lamports: parseFloat(toAmount) * 1000000000,
  })
)

transaction.recentBlockhash = value.blockhash
transaction.feePayer = new PublicKey(selectedAccount.value)

await wepinProvider.request({
    method: 'signAndSendTransaction',
    params: { transactions: _toHexString(transaction.serializeMessage()) },  //transaction.serializeMessage() 의 return 값은 Buffer 로 hex string 으로 변환해야 합니다.
})
```

***

### signMessage

특정 계정의 주소(Public Key)와 메시지에 서명합니다. 입력으로 계정 주소와 서명할 메시지를 받습니다.

{% hint style="info" %}
signAllTransactions을 이용하기 위해서는 사전에 사용 등록이 필요합니다. Wepin에 [문의](https://mail.google.com/mail/u/0/?to=wepin.contact@iotrust.kr\&su=%EB%AC%B8%EC%9D%98%ED%95%98%EA%B8%B0%5BGeneral%5D\&body=%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94.+%EA%B4%80%EB%A0%A8+%EB%AC%B8%EC%9D%98+%EC%82%AC%ED%95%AD%EC%9D%84+%EC%9E%85%EB%A0%A5%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94.\&fs=1\&tf=cm)해주세요. 한번에 sign 할 수 있는 Transaction 개수는 최대 10개 입니다.
{% endhint %}

#### Parameters

* `<array>`
  * `<string>` - sign 하는 계정의 주소(Public Key)
  * `<string>` - sign 하려는 message

#### Return value

* `Promise` \<string> - 서명 값(hex string)

#### Example

```typescript
await wepinProvider.request({
    method: 'signMessage',
    params: [selectedAccount, data],
})
```

***

### changeNetwork

네트워크를 변경합니다. Solana Mainnet 또는 Devnet으로 전환할 수 있으며, 변경된 네트워크의 주소, 네트워크 이름 및 chain ID를 반환합니다.

#### Parameters

* `<object>`
  * `chainId` \<string> - 변경할 network 의 chainId. solana chain(solana:mainnet, solana:devnet) 만 가능

#### Return value

* `Promise` \<object>
  * `address` \<string> - 변경된 네트워크의 계정 주소 (Public Key)
  * `network` \<string> - 변경된 네트워크의 이름
  * `chainId` \<string> - 변경된 네트워크의 chain ID

#### Example

```typescript
await wepinProvider.request({
    method: 'changeNetwork',
    params: [{ chainId: 'solana:devnet' }],
})
```

***

## 기타 메서드 예제 <a href="#other-method-example" id="other-method-example"></a>

위핀에서 제공하는 메서드 외에 Solana RPC HTTP Methods 도 사용 가능합니다.

### [getAccountInfo](https://solana.com/docs/rpc/http/getaccountinfo)

Parameter 로 들어온 Pubkey 와 연결된 모든 계정의 정보를 반환합니다.

#### Parameters

* `PubKey` \<string> - 조회할 계정의 주소 (base-58로 인코딩 된 PubKey)
* `<object>`
  * `commitment` \<string> ***optional***
    * Default Commitment - **finalize**
    * **processed** - node가 처리한 가장 최신 블록을 조회. 이 블록은 아직 확정되지 않았으며, 변경될 가능성이 있음
    * **confirmed** - 클러스터의 과반이 승인한 최신 블록을 조회
    * **finalized** - 클러스터의 과반이 최종적으로 확정한 최신 블록
  * `encoding` \<string> ***optional***
    * Account data 의 인코딩 형식
    * base58, base64, base64+zstd, jsonParsed
  * `dataSlice` \<object> ***optional -*** base58, base64, base64+zstd 인코딩일 때만 사용 가능
    * `length` \<usize> - 반환할 바이트 수
    * `offset` \<usize> - 읽기를 시작할 바이트 offset
  * `minContextSlot` \<number> ***optional***
    * 요청을 실행할 수 있는 최소 슬롯

#### Return value

* `context` \<object>
  * `apiVersion` \<string> - solana-core version
  * `slot` \<number> - 작업이  실행된 slot
* `value` \<object> ***nullable***
  * `lamports` \<u64> - 계정 잔액
  * `owner` \<string> - 해당 계정을 소유하고 관리하는 프로그램의  주소 (base-58로 인코딩 된 PubKey)
  * `data` <\[string, encoding] | object> - 계정과 관련된 데이터&#x20;
  * `executable` \<boolean> - 계정에 프로그램이 포함되어있는지(읽기전용  여부포함) 나타내는 불리언 값
  * `rentEpoch` \<u64> - 이 계정이 다음  스토리지 비용을 지불해야 하는 epoch
  * `size` \<u64> - 계정 데이터의 크기

#### Example

```typescript
await wepinProvider.request({
    method: 'getAccountInfo',
    params: [
        "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"
    ],
})
```

```json
//return data
{
  "context": {
    "apiVersion": "2.0.14",
    "slot": 338510838
  },
  "value": {
    "data": "",
    "executable": false,
    "lamports": 14000000000,
    "owner": "11111111111111111111111111111111",
    "rentEpoch": 18446744073709552000,
    "space": 0
  }
}
```

***

### [getBalance](https://solana.com/docs/rpc/http/getbalance)

계정의 잔액을 반환합니다.

#### Parameters

* `Pubkey` \<string> - 잔액을 조회할 계정의 주소 (base-58로 인코딩 된 PubKey)
* \<object>
  * `commitment` \<string> ***optional***
    * Default Commitment - **finalize**
    * **processed** - node가 처리한 가장 최신 블록을 조회. 이 블록은 아직 확정되지 않았으며, 변경될 가능성이 있음.
    * **confirmed** - 클러스터의 과반이 승인한 최신 블록을 조회.
    * **finalized** - 클러스터의 과반이 최종적으로 확정한 최신 블록.
  * `minContextSlot` \<number> ***optional***
    * 요청을 실행할 수 있는 최소 슬롯

#### Return value

* `context` \<object>
  * `apiVersion` \<string> - solana-core version
  * `slot` \<number> - 작업이  실행된 slot
* `value` \<number> - 계정의 잔액

#### Example

```typescript
await wepinProvider.request({
    method: 'getAccountInfo',
    params: [
        "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"
    ],
})
```

```json
//return data
{
  "context": {
    "apiVersion": "2.0.14",
    "slot": 338529622
  },
  "value": 14000000000
}
```

***

### [getLatestBlockhash](https://solana.com/docs/rpc/http/getlatestblockhash)

가장 최신 블록해시를 반환합니다.

#### Parameters

* \<object> ***optional***
  * `commitment` \<string> ***optional***
    * Default Commitment - **finalize**
    * **processed** - node가 처리한 가장 최신 블록을 조회. 이 블록은 아직 확정되지 않았으며, 변경될 가능성이 있음
    * **confirmed** - 클러스터의 과반이 승인한 최신 블록을 조회
    * **finalized** - 클러스터의 과반이 최종적으로 확정한 최신 블록
  * `minContextSlot` \<number> ***optional***
    * 요청을 실행할 수 있는 최소 슬롯

#### Return value

* `context` \<object>
  * `apiVersion` \<string> - solana-core version
  * `slot` \<number> - 작업이  실행된 slot
* `value` \<object>
  * `blockhash` \<string> - base-58로 인코딩 된 해시 값
  * `lastValidBlockHeight` \<number> - 해당 블록 해시가 유효한 마지막 블록 높이

#### Example

```typescript
await wepinProvider.request({
    method: 'getAccountInfo',
    params: [
        "vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg"
    ],
})
```

```json
//return data
{
    "context": {
        "apiVersion": "2.0.14",
        "slot": 338534308
    },
    "value": {
        "blockhash": "8uJtPoFrdEqxFCA4zaBxBQXosZKvWWQYcWb9kZbF2hDW",
        "lastValidBlockHeight": 326729023
    }
}
```

***

### [getTokenAccountsByOwner](https://solana.com/docs/rpc/http/gettokenaccountsbyowner)

계정의 모든 SPL Token 계정 정보를 반환합니다.

#### Parameters

* `PubKey` \<string> - SPL Token Account 의 Owner 주소 (base-58로 인코딩 된 PubKey)
* \<object> - 조회할 SPL 토큰 계정에 대한 필터.  mint 와 programId 중 하나만 있으면 됨
  * `mint` \<string> - base-58로 인코딩 된 특정   토큰의 Mint Address
  * `programId` \<string> -  base-58로 인코딩 된 특정 프로그램의 ID
* \<object>
  * `commitment` \<string> ***optional***
    * Default Commitment - **finalize**
    * **processed** - node가 처리한 가장 최신 블록을 조회. 이 블록은 아직 확정되지 않았으며, 변경될 가능성이 있음
    * **confirmed** - 클러스터의 과반이 승인한 최신 블록을 조회
    * **finalized** - 클러스터의 과반이 최종적으로 확정한 최신 블록
  * `minContextSlot` \<number> ***optional***
    * 요청을 실행할 수 있는 최소 슬롯
  * `encoding` \<string> ***optional***
    * Account data 의 인코딩 형식
    * base58, base64, base64+zstd, jsonParsed
  * `dataSlice` \<object> ***optional -*** base58, base64, base64+zstd 인코딩일 때만 사용 가능
    * `length` \<usize> - 반환할 바이트 수
    * `offset` \<usize> - 읽기를 시작할 바이트 offset

#### Return value

* `context` \<object>
  * `apiVersion` \<string> - solana-core version
  * `slot` \<number> - 작업이  실행된 slot
* `value` \<Array\<object>>
  * `pubkey` \<string> - 조회 된 계정의 주소
  * `account` \<object> - 해당 계정의 정보
    * `lamports` \<u64> - 계정 잔액
    * `data` \<object> - 해당 계정과 연결된 Token state data
      * `parsed` \<object>
        * `info` \<object> - 계정 정보
          * `isNative` \<boolean> - 네이티브 계정 여부 표시. 일반적으로 false
          * `mint` \<string> - 해당 토큰 계정과 연결된 특정 토큰의 주소
          * `owner` \<string> - 해당 토큰 계정을 통제하는 사용자의 Solana 지갑 주소
          * `state` \<string> - 토큰 계정의 상태
          * `tokenAmount` \<object> - 토큰 계정의 잔액 정보
            * `amount` \<string> - 계정 내 보유량을 나타내는 숫자
            * `decimals` \<number> - 해당 토큰의 소수점 자수
            * `uiAmount` \<number> - 소수 형태의 토큰 잔액. **DEPRECATED**
            * `uiAmountString` \<string> - 문자열로 표시된 소수 형태의 토큰 잔액
        * `type` \<string> - info 의 유형. 이 경우 account
      * `program` \<string> - 해당 계정이 속한 프로그램
      * `space` \<number> - 계정 데이터의 크기. 바이트 단위로 표시
    * `executable` \<boolean> - 해당 계정이 실행 가능한지 여부
    * `owner` \<string> - 계정을 소유한 프로그램의 주소
    * `rentEpoch` \<u64> - 계정이 현재 임대 상태인 epoch
    * `size` \<u64> - 계정의 데이터 크기

#### Example

```typescript
await wepinProvider.request({
    method: 'getTokenAccountsByOwner',
    params: [
      "A1TMhSGzQxMr1TboBKtgixKz1sS6REASMxPo1qsyTSJd",
      {
        "mint": "BejB75Gmq8btLboHx7yffWcurHVBv5xvKcnY1fBYxnvf"
      },
      {
        "encoding": "jsonParsed"
      }
    ]
})
```

```json
//return data
{
    "context": {
      "apiVersion": "2.0.8",
      "slot": 329669901
    },
    "value": [
      {
        "account": {
          "data": {
            "parsed": {
              "info": {
                "isNative": false,
                "mint": "BejB75Gmq8btLboHx7yffWcurHVBv5xvKcnY1fBYxnvf",
                "owner": "A1TMhSGzQxMr1TboBKtgixKz1sS6REASMxPo1qsyTSJd",
                "state": "initialized",
                "tokenAmount": {
                  "amount": "10000000000000",
                  "decimals": 9,
                  "uiAmount": 10000,
                  "uiAmountString": "10000"
                }
              },
              "type": "account"
            },
            "program": "spl-token",
            "space": 165
          },
          "executable": false,
          "lamports": 2039280,
          "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
          "rentEpoch": 18446744073709551615,
          "space": 165
        },
        "pubkey": "5HvuXcy57o41qtGBBJM7dRN9DS6G3jd9KEhHt4eYqJmB"
      }
    ]
}
```

***

### [getTokenAccountBalance](https://solana.com/docs/rpc/http/gettokenaccountbalance)

SPL Token 계정의 잔액을 반환합니다.

#### Parameters

* `PubKey` \<string> -  ATA(Associated Token Account) 주소 ( base-58로 인코딩 된 PubKey)

#### Return value

* `context` \<object>
  * `apiVersion` \<string> - solana-core version
  * `slot` \<number> - 작업이 실행된 slot
* `value` \<object>
  * `amount` \<string> - 해당 토큰 계정의 잔액
  * `decimals` \<number> - 해당 토큰의 소수점 자릿수
  * `uiAmount` \<number> ***nullable*** - 소수 형태의 토큰 잔액. **DEPRECATED**
  * `uiAmountString` \<string> - 문자열로 표시된 소수 형태의 토큰 잔액

#### Example

```typescript
await wepinProvider.request({
    method: 'getTokenAccountBalance',
    params: [
        "7fUAJdStEuGbc3sM84cKRL6yYaaSstyLSU4ve5oovLS7"
    ],
})
```

```json
{
    "context": {
      "slot": 1114
    },
    "value": {
      "amount": "9864",
      "decimals": 2,
      "uiAmount": 98.64,
      "uiAmountString": "98.64"
    }
}
```

그 외 Solana 네트워크 프로바이더의 자세한 내용은 아래 링크를 참고하세요.

{% embed url="<https://solana.com/docs/rpc/http>" %}


---

# 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.wepin.io/widget-integration/web-javascript-sdk/provider/solana-provider.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.
