# Methods

The following shows the methods provided by the Wepin widget JavaScript SDK.

## `openWidget`

```javascript
await wepin.openWidget()
```

The <mark style="color:blue;">`openWidget`</mark> method shows the Wepin widget. The screen displayed in the widget window varies depending on the user's login status. If a user is not logged in, the Wepin widget will show them the login page.

### **Returned value**

* `Promise` \<void>

## `closeWidget`

```javascript
wepin.closeWidget()
```

The <mark style="color:blue;">`closeWidget`</mark> method closes Wepin widget. Closing the window does not log users out.

## `getAccounts`

<pre class="language-javascript"><code class="lang-javascript"><strong>let accounts = await wepin.getAccounts(['Ethereum'])
</strong></code></pre>

or

<pre class="language-javascript"><code class="lang-javascript"><strong>let accounts = await wepin.getAccounts()
</strong></code></pre>

The <mark style="color:blue;">`getAccounts`</mark> method returns user accounts of the networks available in the app. It's a method available after the widget login. The parameters are as follows.

### **Parameters**

* **`networks`**: *Array of string*\
  It is the <mark style="color:blue;">`network`</mark> of the address you want to receive. If no <mark style="color:blue;">`network`</mark> is specified, all addresses available in the app are returned.\
  The names of blockchain networks that can be put into <mark style="color:blue;">`networks`</mark> can be found on the following page.&#x20;

{% content-ref url="broken-reference" %}
[Broken link](https://docs.wepin.io/en/deprecated/web-javascript-sdk/sdk/broken-reference)
{% endcontent-ref %}

### **Returned Value**

* `Promise` \<Array>
  * If a user is logged in, it returns a <mark style="color:blue;">`Promise`</mark> object resolved with array of <mark style="color:blue;">`account`</mark> of networks.
    * Type of <mark style="color:blue;">`account`</mark> is assigned at [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types) as <mark style="color:blue;">`IAccount`</mark>
    * `account` *String*
      * `address` *String*
      * `network` *String*
      * `contract` *String* *optional*&#x20;
        * token contract address. ([`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types)(0.0.12 버전 이상)   `IAccount`에  정의되어 있습니다. )
  * If <mark style="color:blue;">`networks`</mark> aren't passed, it returns a <mark style="color:blue;">`Promise`</mark> object resolved with array of <mark style="color:blue;">`account`</mark> of all networks.
  * Example

    ```json
    [
        {
            "address": "0x0000001111112222223333334444445555556666",
            "network": "Ethereum"
        },
        {
            "address": "0x0000001111112222223333334444445555556666",
            "network": "Ethereum",
            "contract": "0x777777888888999999000000111111222222333333",
        },
    ]
    ```
* `Promise` \<void>
  * If user is not logged in, it returns <mark style="color:blue;">`Promise`</mark>.

## `getStatus` (Supported from version `0.3.1` and above.)

```javascript
var status = wepin.getStatus()
```

The <mark style="color:blue;">`getStatus()`</mark> method returns lifecycle of <mark style="color:blue;">`wepin`</mark>.

### **Returned Value**

* \<WepinLifeCycle>
  * The <mark style="color:blue;">`WepinLifeCycle`</mark> is defined at  [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types) as (Supports version 0.0.7 and above.)
    * `not_initialized`: if `wepin` is not initialized
    * `initializing`: if `wepin` is initializing
    * `initialized`: if `wepin` is initialized
    * `before_login`: if `wepin` is initialized but the user is not logged in
    * `login`: if the user is logged in

## `login` (Supported from version `0.3.1` and above.)

```javascript
var userInfo = await wepin.login()
```

The <mark style="color:blue;">`login()`</mark> method returns information of the logged-in user. If a user is not logged in, Wepin widget will show login page.

### **Returned Value**

`Promise` \<IWepinUser>

* Type of <mark style="color:blue;">`IWepinUser`</mark> is defined in [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types) (Supported from version `0.0.7` and above.)
  * `status` *String <'success'|'fail'>*
  * `userInfo` *Object (optional)*
    * `userId` *String*
    * `email` *String*
    * `provider` *String <'google'|'apple'>*
  * Example

    ```json
    {
        "status": "success",
        "userInfo": {
            "userID": "123455",
            "email": "abc@test.com",
            "provider": "google"
        }
    }
    ```

## `logout` (Supported from version `0.3.1` and above.)

```javascript
await wepin.logout()
```

The <mark style="color:blue;">`logout()`</mark> method performs a `wepin` logout .

### **Returned Value**

* `Promise` \<void>

## `finalize` (Supported from version `0.3.1` and above.)

```javascript
wepin.finalize() 
```

The <mark style="color:blue;">`finalize()`</mark> method finalizes the Wepin SDK. The state of `wepin` changes to <mark style="color:blue;">`not_initialized`</mark>.

### **Returned Value**

* `void`

## `loginWithExternalToken` (Supported from version `0.5.1` and above.)

```javascript
await wepin.loginWithExternalToken(token, sign, withUI?)
```

It logs in to the Wepin with external token(e.g., <mark style="color:blue;">`idToken`</mark>). The <mark style="color:blue;">`loginWithExternalToken()`</mark> method returns information of the logged-in user.

If the user is not registered on Wepin, and the `withUI` value is set to true, the registration page will be displayed in the widget. However, if the `withUI` value is set to false or not defined, a `require/wepin-register` exception will be triggered.

### **Parameters**

* `token` *\<string>*
  * External token value to be used for login (e.g., idToken).
* `sign` *\<string>*
  * Signature value for the token provided as the first parameter. ([Signature Generation Methods](https://github.com/WepinWallet/wepin-widget-js-sdk/blob/main/doc/SignatureGenerationMethods.md))
  * The key for signing can be obtained from [Wepin Workspace](https://workspace.wepin.io/). In the Development Tools menu, click **Get your authentication key** on the Login tab to retrieve the authentication key.
* `withUI` *\<boolean> optional*
  * Indicates whether to display the Wepin widget screen if registration is required.

### **Returned Value**

* `Promise` \<IWepinUser>
  * Type of <mark style="color:blue;">`IWepinUser`</mark> is defined in [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types) (Supports version `0.0.7` and above.)
    * `status` *<'success'|'fail'>*
    * `userInfo` *\<object> optional*
      * `userId` *\<string>*
      * `email` *\<string>*
      * `provider` *<'external\_token'>*
  * Example

    ```
    {
    	status: 'success',
    	userInfo: {
    		userID: '123455',
    		email: 'abc@test.com',
    		provider: 'external_token'
            }
    }
    ```

[#exceptions](#exceptions "mention")

* `require/wepin-register` : If this error occurs, you have to perform the <mark style="color:blue;">`wepin.register(pin)`</mark> method.

## `signUpWithEmailAndPassword` (Supported from version `0.5.1` and above.)

<pre class="language-javascript"><code class="lang-javascript"><strong>await wepin.signUpWithEmailAndPassword(email, password)
</strong></code></pre>

It signs up on the Wepin with your email and password.

### **Parameters**

* `email` *\<string>* - User email
* `password` *\<string>* - User password

### **Returned Value**

* `Promise` *\<boolean>*
  * Returns true if the signup is successful.
* Example

  ```
  {
  	status: 'success',
  	userInfo: {
  		userID: '123455',
  		email: 'abc@test.com',
  		provider: 'external_token'
          }
  }
  ```

[#exceptions](#exceptions "mention")

## `loginWithEmailAndPassword` (Supported from version `0.5.1` and above.)

```javascript
await wepin.loginWithEmailAndPassword(email, password)
```

It logs in to the Wepin with your email and password.

### **Parameters**

* `email` *\<string>* - User email
* `password` *\<string>* - User password

### **Returned Value**

* `Promise` \<IWepinUser>
  * Type of <mark style="color:blue;">`IWepinUser`</mark> is defined in [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types) (Supported from version `0.0.8` and above.)
    * `status` *<'success'|'fail'>*
    * `userInfo` *\<object>* *optional*
      * `userId` *\<string>*
      * `email` *\<string>*
      * `provider` *<'email'>*
  * Example

    ```
    {
    	status: 'success',
    	userInfo: {
    		userID: '123455',
    		email: 'test@test.com',
    		provider: 'email'
            }
    }
    ```

[#exceptions](#exceptions "mention")

* `require/wepin-register` : If this error occurs, you have to perform the <mark style="color:blue;">`wepin.register(pin)`</mark> method.

## `register` (Supported from version `0.5.1` and above.)

```javascript
await wepin.register(pin)
```

It registers in the Wepin with a wallet pin.

After the signup and login are completed, the Wepin service registration (wallet and account creation) will proceed.

### **Parameters**

* `pin` *\<string>* - Wallet PIN

### **Returned Value**

* `Promise` *\<boolean>*
  * Returns true if the registration is successful.
  * After successful registration, the <mark style="color:blue;">`wepin.login(email, password)`</mark> method has to be performed again.

[#exceptions](#exceptions "mention")

## `getBalance` (Supported from version `0.5.1` and above.)

```javascript
await wepin.getBalance(account)
```

It returns the account balance information. It can be only usable after logging in through the widget.

### **Parameters**

* `account` <`IAccount`> - User email
  * Type of <mark style="color:blue;">`IAccount`</mark> is defined in [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types)

### **Returned Value**

* `Promise` <`IAccountBalance`>
  * Type of <mark style="color:blue;">`IAccountBalance`</mark> and <mark style="color:blue;">`ITokenBalance`</mark> is defined in [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types) (Supported from version `0.0.8` and above.)
    * `symbol` *\<string>* - symbol of the account
    * `balance` *\<string>* - balance of the account
    * `tokens` *\<Array<`ITokenBalance`>>* - token balance information for the account
      * `name` *\<string>* - token name
      * `contract` *\<string>* - token contract address
      * `symbol` *\<string>* - token symbol
      * `balance` *\<string>* - token balance
  * Example

    ```
    {
    	symbol: 'ETH',
            balance: '1.1',
    	tokens:[
    		{
    			name: 'test',
    			contract: '0x123...213',
    			symbol: 'TEST',
    			balance: '10'
    		},
    	]
    }
    ```

[#exceptions](#exceptions "mention")

## `send` (Supported from version `0.5.3` and above.)

```javascript
await wepin.send(account, options?)
```

The "send" is performed using the widget, and returns the ID information of the "send" transaction. It can only be used after logging into Wepin.

### **Parameters**

* `account` <`IAccount`> - User email
  * Type of <mark style="color:blue;">`IAccount`</mark> is defined in [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types)
* `options` <`ISendOptions`> - The information required for the "send".
  * The `ISendOptions` is defined at [`@wepin/types`](https://github.com/WepinWallet/wepin-js-sdk-types).
    * `toAddress` <`string`> - The address to send tokens
    * `amount` <`string`> - The amount of tokens to send (in network units)

Example

```javascript
// without options
const result = Wepin.send({
  address: '0x0000001111112222223333334444445555556666',
  network: 'Ethereum',
})

// with options
const result = Wepin.send(
  {
    address: '0x0000001111112222223333334444445555556666',
    network: 'Ethereum',
  },
  { amount: '0.1', toAddress: '0x777777888888999999000000111111222222333333' }
)
```

### **Return Value**

* `Promise` <`string`>
  * &#x20;txID (Transaction ID) of the "send" transaction
  * Example

    ```javascript
    '0x0000001111112222223333334444445555556666.............aaaaaabbbbbbccccccddddddeeeeeeffffff'
    ```

[#exceptions](#exceptions "mention")

## Exceptions

The error message types of the admin method are as follows.

<table><thead><tr><th width="290">Error Message</th><th>Description</th></tr></thead><tbody><tr><td>invalid/email-format</td><td>invalid email format</td></tr><tr><td>invalid/password-format</td><td>invalid password format (A minimum of 8 characters including letters, numbers and special characters. )</td></tr><tr><td>invalid/pin-format</td><td>invalid PIN format (6-8 digit number) (*Do not use the same number more than four times when registering)</td></tr><tr><td>invalid/firebase-token</td><td>invalid firebase token</td></tr><tr><td>invalid/wepin-api-key</td><td>invalid wepin api key</td></tr><tr><td>invalid/account</td><td>invalid account</td></tr><tr><td>invalid/email-domain</td><td>invalid email domain</td></tr><tr><td>invalid/to-address</td><td>invalid to address</td></tr><tr><td>auth/existed-email</td><td>existed email</td></tr><tr><td>auth/too-many-requests</td><td>too many firebase requests</td></tr><tr><td>auth/wrong-password</td><td>wrong password</td></tr><tr><td>auth/expired-token</td><td>expired login session</td></tr><tr><td>auth/unknown/${string}</td><td>unknown auth error</td></tr><tr><td>fail/send-email</td><td>failed to send validation email</td></tr><tr><td>fail/reset-password</td><td>failed to set password</td></tr><tr><td>fail/email-verified</td><td>failed to verify email</td></tr><tr><td>fail/wepin-login</td><td>failed to login to wepin</td></tr><tr><td>fail/wepin-register</td><td>failed to register with wepin</td></tr><tr><td>fail/get-balance</td><td>failed to get balance</td></tr><tr><td>fail/check-email</td><td>failed to check email</td></tr><tr><td>fail/requireFee</td><td>insufficient fee</td></tr><tr><td>fail/requireNetworkFee</td><td>insufficient network fee(only token transaction request)</td></tr><tr><td>require/email-verified</td><td>email verification required</td></tr><tr><td>require/signup</td><td>wepin sign-up required</td></tr><tr><td>require/wepin-register</td><td>wepin registration required</td></tr><tr><td>require/login</td><td>wepin login required</td></tr><tr><td>unknown/${string}</td><td>unknown error</td></tr></tbody></table>
