-----

Documentation: [html](https://docs-beta.ethers.io/)

-----

Making Your Own
===============

CLI
---

#### **addPlugin**( command , pluginClass ) => *void*

Add a *plugin* class for the *command*. After all options and flags have been consumed, the first argument will be consumed and the associated plugin class will be instantiated and run.


#### **setPlugin**( pluginClass ) => *void*

Set a dedicated [Plugin](/v5/cli/plugin/#cli-plugin) class which will handle all input. This may not be used in conjuction with addPlugin and will not automatically accept a command from the arguments.


#### **showUsage**( [ message = "" [ , status = 0 ] ] ) => *never*

Shows the usage help screen for the CLI and terminates.


#### **run**( args ) => *Promise< void >*

Usually the value of *args* passed in will be `process.argv.slice(2)`.


Plugin
------

#### *plugin* . **network** => *[Network](/v5/api/providers/types/#providers-Network)*

The network this plugin is running for.


#### *plugin* . **provider** => *[Provider](/v5/api/providers/provider/)*

The provider for this plugin is running for.


#### *plugin* . **accounts** => *Array< [Signer](/v5/api/signer/#Signer) >*

The accounts passed into the plugin using `--account`, `--account-rpc` and `--account-void` which this plugin can use.


#### *plugin* . **gasLimit** => *[BigNumber](/v5/api/utils/bignumber/)*

The gas limit this plugin should use. This is null if unspecified.


#### *plugin* . **gasPrice** => *[BigNumber](/v5/api/utils/bignumber/)*

The gas price this plugin should use. This is null if unspecified.


#### *plugin* . **nonce** => *number*

The initial nonce for the account this plugin should use.


### Methods

#### *plugin* . **prepareOptions**( argParser [ , verifyOnly = false ] ) => *Promise< void >*



#### *plugin* . **prepareArgs**( args ) => *Promise< void >*



#### *plugin* . **run**( ) => *Promise< void >*



#### *plugin* . **getAddress**( addressOrName [ , message = "" , [ allowZero = false ] ] ) => *Promise< string >*

A plugin should use this method to resolve an address. If the resovled address is the zero address and *allowZero* is not true, an error is raised.


#### *plugin* . **dump**( header , info ) => *void*

Dumps the contents of *info* to the console with a *header* in a nicely formatted style. In the future, plugins may support a JSON output format which will automatically work with this method.


#### *plugin* . **throwUsageError**( [ message = "" ] ) => *never*

Stops exectuion of the plugin and shows the help screen of the plugin with the optional *message*.


#### *plugin* . **throwError**( message ) => *never*

Stops execution of the plugin and shows *message*.


### Static Methods

#### *Plugin* . **getHelp** => *Help*

Each subclass should implement this static method which is used to generate the help screen.


#### *Plugin* . **getOptionHelp** => *Array< Help >*

Each subclass should implement this static method if it supports additional options which is used to generate the help screen.


ArgParser
---------

```
/home/ethers> ethers --account wallet.json --yes send ricmoo.eth 1.0
#  An Option ----------^                     ^   ^
#    - name =  "account"                     |   |
#    - value = "wallet.json"                 |   |
#  A Flag -----------------------------------+   |
#    - name  = "yes"                             |
#    - value = true                              |
#  Arguments ------------------------------------+
#    - count = 3
#    - [ "send", "ricmoo.eth", "1.0" ]
```


Flags are simple binary options (such as the `--yes`), which are true if present otherwise false.

Options require a single parameter follow them on the command line (such as `--account wallet.json`, which nhas the name `account` and the value `wallet.json`)

Arguments are all other values on the command line, and are not accessed through the **ArgParser** directly.

When a CLI is run, an **ArgParser** is used to validate the command line by using prepareOptions, which consumes all flags and options leaving only the arguments behind, which are then passed into prepareArgs.


#### *argParser* . **consumeFlag**( name ) => *boolean*

Remove the flag *name* and return true if it is present.


#### *argParser* . **consumeMultiOptions**( names ) => *Array< {name:string,value:string} >*

Remove all options which match any name in the Array of *names* with their values returning the list (in order) of values.


#### *argParser* . **consumeOption**( name ) => *string*

Remove the option with its value for *name* and return the value. This will throw a UsageError if the option is included multiple times.


#### *argParser* . **consumeOptions**( name ) => *Array< string >*

Remove all options with their values for *name* and return the list (in order) of values.


