# 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 지원 네트워크](#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>" %}
