# Kaia Provider

Ethers.js 또는 Web3.js를 Wepin Provider와 함께 사용하면 EVM 계열의 블록체인과 상호작용 할 수 있습니다.&#x20;

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

{% hint style="info" %}
목록에 필요한 블록체인이 없나요? [위핀 팀에 요청](https://wepinwallet.typeform.com/WEPIN-Wallet)하여 별도의 비용 없이 블록체인을 추가할 수 있습니다.
{% endhint %}

<table><thead><tr><th width="172.33333333333331">Chain ID</th><th>Network Name</th><th>Network Variable</th><th></th></tr></thead><tbody><tr><td>8217</td><td>Kaia Mainnet</td><td>klaytn</td><td></td></tr><tr><td>1001</td><td>Kaia Kairos Testnet</td><td>klaytn-testnet</td><td></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`: 위젯 기본 언어 설정, 기본 값은 `ko`입니다. 현재 지원하는 언어는 `en`, `ko`, `ja` 3가지 입니다.
  * `defaultCurrency`: T위젯 기본 통화 설정, 기본 값은 `KRW`입니다. 현재 지원하는 통화는 `USD`, `KRW`, `JPY` 3가지 입니다.

### **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에 해당하는 Provider를 반환합니다.

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

#### **Parameters**

* `network` \<string> \
  위핀이 지원하는 Provider의 Network Variable 값으로, Kaia Mainnet의 경우 "klaytn" 입니다. Network Variable은 소문자로 입력해야 합니다. 전체 목록은 [Kaia Provider 지원 네트워크](#supported-networks)에서 확인하세요.

#### **Return value**

* `Promise`\<BaseProvider> - A EIP-1193 provider

#### **Example**

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

## finalize

WepinProvider 사용을 종료합니다.

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

#### **Parameters**

* `<void>`

#### **Return value**

* `<void>`

#### **Example**

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

***

### request

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

{% hint style="info" %}

#### kaia prefix method 는 버전0.0.31 이부터 지원합니다.

{% endhint %}

#### eth\_accounts / klay\_accounts / kaia\_accounts

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

**Parameters**

* `void`

**Returns**

* `Promise<Array<string>>` - 사용자의 주소 목록을 반환합니다.

**Example**

```typescript
const accounts = await wepinProvider.request({
      method: 'kaia_accounts',
      params: []
})
```

***

#### eth\_signTransaction / klay\_signTransaction / kaia\_signTransaction

주어진 매개변수로 트랜잭션을 구성하고 사용자의 개인키로 트랜잭션에 서명합니다.&#x20;

**Supported Tx Type**

<table><thead><tr><th width="300">TxType</th><th width="247">Support Fee Delegateed</th><th>Version</th></tr></thead><tbody><tr><td>TxTypeLegacy</td><td>false</td><td></td></tr><tr><td>TxTypeValueTransfer</td><td>true</td><td>≥ v.0.0.31</td></tr><tr><td>TxTypeValueTransferMemo</td><td>true</td><td>≥ v.0.0.31</td></tr><tr><td>TxTypeSmartContractExecution</td><td>true</td><td>≥ v.0.0.31</td></tr></tbody></table>

**Parameters**

{% tabs %}
{% tab title="TxTypeLegacy" %}
TxTypeLegacyTransaction 은 기존에 Kaia(Klaytn)에 존재했던 거래 유형을 나타냅니다.

* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소 (컨트랙트 주소 또는 일반 계정 주소)
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice`\<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
* `data` \<string> - 실행할 스마트 컨트랙트의 데이터 또는 빈 값. 일반 전송의 경우 `0x`
  {% endtab %}

{% tab title="TxTypeValueTransfer" %}
TxTypeValueTransfer 는 사용자가 KLAY 를 전송할 때 사용되는 트랜잭션입니다.

* `typeInt` \<number> - 8(TxTypeValueTransfer) or 9(TxTypeFeeDelegatedValueTransfer) or 10(TxTypeFeeDelegatedValueTransferWithRatio)
* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice` \<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
* `feePayer` \<string> - 수수료를 대납할 계정의 주소. typeInt 가 9 또는 10 일 때 필요.
* `feeRatio` \<string> - 수수료 대납자의 수수료 비율. 1\~99 사이의 값을 HexString 형식으로 입력. typeInt가 10 일 때 필요.
  {% endtab %}

{% tab title="TxTypeValueTransferMemo" %}
TxTypeValueTransferMemo 는 사용자가 특정 메세지와 함께KLAY 를 전송할 때 사용되는 트랜잭션 입니다.

* `typeInt` \<number> - 16(TxTypeValueTransfer) or 17(TxTypeFeeDelegatedValueTransfer) or 18(TxTypeFeeDelegatedValueTransferWithRatio)
* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice` \<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
* `input` \<string> - 트랜잭션과 함께 전송되는 메세지. Hex string 형식으로 입력.
* `feePayer` \<string> - 수수료를 대납할 계정의 주소. typeInt 가 17 또는 18 일 때 필요.
* `feeRatio` \<string> - 수수료 대납자의 수수료 비율. 1\~99 사이의 값을 HexString 형식으로 입력. typeInt가 18 일 때 필요.
  {% endtab %}

{% tab title="TxTypeSmartContractExecution" %}
TxTypeSmartContractExecution 은 스마트 컨트랙트 실행을 위한 트랜잭션입니다.

* `typeInt` \<number> - 48(TxTypeValueTransfer) or 49(TxTypeFeeDelegatedValueTransfer) or 50(TxTypeFeeDelegatedValueTransferWithRatio)
* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소 (컨트랙트 주소)
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice` \<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
* `input` \<string> - 트랜잭션과 함께 전송되는 데이터. Hex string 형식으로 입력.
* `feePayer` \<string> - 수수료를 대납할 계정의 주소. typeInt 가 49 또는 50 일 때 필요.
* `feeRatio` \<string> - 수수료 대납자의 수수료 비율. 1\~99 사이의 값을 HexString 형식으로 입력. typeInt가 50 일 때 필요.
  {% endtab %}
  {% endtabs %}

**Returns**

* `Promise<Object>`
  * `raw <string>` - 직렬화된 트랜잭션
  * `tx <Object>` - 서명이 포함된 트랜잭션 오브젝트.

**Example**

<pre class="language-typescript"><code class="lang-typescript"><strong>const params = {
</strong>      typeInt: 49,       //TxTypeFeeDelegatedSmartContractExecution
      from: senderAddress,
      to: '0x4dbccb64e9f7b4df4263d8e3b93c89ae406fd8e5',
      input: '0x45773e4e'
      gas: '0x15f90',
      gasPrice: '0x5d21dba00',
      feePayer: feePayerAddress,
}

const {raw, tx} = await wepinProvider.request({
      method: 'kaia_signTransaction',
      params: [params]
})


const decodedTx = caver.transaction.decode(raw)
const signedTx = await caver.wallet.signAsFeePayer(
      feePayerAddress,
      decodedTx as FeeDelegatedTransaction
)
const txId = await caver.rpc.klay.sendRawTransaction(
      signedTx.getRawTransaction()
)
</code></pre>

***

#### eth\_sendTransaction / klay\_sendTransaction / kaia\_sendTransaction

주어진 매개변수로 트랜잭션을 구성하고 사용자의 개인키로 트랜잭션에 서명하여 네트워크에 전송합니다.&#x20;

sendTransaction 은 FeeDelegated 를 지원하지 않습니다.

**Supported Tx Type**

<table><thead><tr><th width="300">TxType</th><th>Version</th></tr></thead><tbody><tr><td>TxTypeLegacy</td><td></td></tr><tr><td>TxTypeValueTransfer</td><td>≥ v.0.0.31</td></tr><tr><td>TxTypeValueTransferMemo</td><td>≥ v.0.0.31</td></tr><tr><td>TxTypeSmartContractExecution</td><td>≥ v.0.0.31</td></tr></tbody></table>

**Parameters**

{% tabs %}
{% tab title="TxTypeLegacy" %}
TxTypeLegacyTransaction 은 기존에 Kaia(Klaytn)에 존재했던 거래 유형을 나타냅니다.

* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소 (컨트랙트 주소 또는 일반 계정 주소)
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice`\<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
* `data` \<string> - 실행할 스마트 컨트랙트의 데이터 또는 빈 값. 일반 전송의 경우 `0x`
  {% endtab %}

{% tab title="TxTypeValueTransfer" %}
TxTypeValueTransfer 는 사용자가 KLAY 를 전송할 때 사용되는 트랜잭션입니다.

* `typeInt` \<number> - 8
* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice` \<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
  {% endtab %}

{% tab title="TxTypeValueTransferMemo" %}
TxTypeValueTransferMemo 는 사용자가 특정 메세지와 함께KLAY 를 전송할 때 사용되는 트랜잭션 입니다.

* `typeInt` \<number> - 16
* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice` \<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
* `input` \<string> - 트랜잭션과 함께 전송되는 메세지. Hex string 형식으로 입력.
  {% endtab %}

{% tab title="TxTypeSmartContractExecution" %}
TxTypeSmartContractExecution 은 스마트 컨트랙트 실행을 위한 트랜잭션입니다.

* `typeInt` \<number> - 48
* `from` \<string> - 트랜잭션을 보내는 계정의 주소. 실제 서명자의 주소와 다르면 에러 발생.
* `to` \<string> - 트랜잭션의 수신자 주소 (컨트랙트 주소)
* `gas` \<string> - 트랜잭션 실행에 필요한 최대 가스량. Hex string 형식으로 입력.
* `gasPrice` \<string> - 트랜잭션에 지불할 가스 비용. Hex string 형식으로 입력.
* `value` \<string> - 트랜잭션과 함께 전송되는 Klay 값. Hex string 형식으로 입력.
* `input` \<string> - 트랜잭션과 함께 전송되는 데이터. Hes string 형식으로 입력.
  {% endtab %}
  {% endtabs %}

**Returns**

* `Promise<string>` - 트랜잭션 해시

**Example**

```typescript
const params = {
      typeInt: 8,       //TxTypeValueTransfer
      from: senderAddress,
      to: toAddress,
      value: '0x1234'
      gas: '0x15f90',
      gasPrice: '0x5d21dba00'
}

const txId = await wepinProvider.request({
      method: 'kaia_sendTransaction',
      params: [params]
})
```

***

#### eth\_sign / klay\_sign / kaia\_sign

EIP-191 방식으로 message 를 서명합니다.

**Parameters**

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

**Returns**

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

**Example**

```typescript
const message = 'Hello World'

const signature = await wepinProvider.request({
      method: 'kaia_sign',
      params: [signerAddress, message]
})
```

***

#### personal\_sign

EIP-191 방식으로 message 를 서명합니다.

**Parameters**

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

**Returns**

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

**Example**

```typescript
const message = 'Hello World'

const signature = await wepinProvider.request({
      method: 'personal_sign',
      params: [signerAddress, message]
})
```

***

#### eth\_signTypedData\_v1 / klay\_signTypedData\_v1

EIP-712 v1 형식의 데이터를 서명합니다.

**Parameters**

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

**Returns**

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

**Example**

```typescript
const signature = await wepinProvider.request({
      method: 'kaia_signTypedData_v1',
      params: [signerAddress, msgParamsV1 ]
})
```

***

#### eth\_signTypedData\_v3 / klay\_signTypedData\_v3

EIP-712 v3 형식의 데이터를 서명합니다.

**Parameters**

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

**Returns**

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

**Example**

```typescript
const signature = await wepinProvider.request({
      method: 'kaia_signTypedData_v3',
      params: [signerAddress, msgParamsV3 ]
})
```

***

#### eth\_signTypedData\_v4 / klay\_signTypedData\_v4

EIP-712 v4 형식의 데이터를 서명합니다.

**Parameters**

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

**Returns**

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

**Example**

```typescript
const signature = await wepinProvider.request({
      method: 'kaia_signTypedData_v4',
      params: [signerAddress, msgParamsV4 ]
})
```

그 외 Kaia 네트워크의 자세한 내용은 아래 링크를 참고하세요.

{% embed url="<https://docs.kaia.io/references/json-rpc/references/>" %}
