How to create a plugin
In this chapter, you’ll learn how to create & customize a new plugin for a blockchain client.
| Sample code View the complete sample code of this guide on GitHub in the Klayr SDK examples repository. | 
As defined in the Hello World application overview, the plugin shall provide the following functionality:
- 
The plugin should retrieve all events from the blockchain. 
- 
The plugin should filter out the events generated by the Hellomodule.
- 
A plugin should accept a custom configuration based on which it should sync on-chain newHelloevents with the plugin’s database.
- 
The plugin should store all newHelloevents in a database.
- 
The plugin should provide an endpoint to fetch hello messages, their sender addresses, and the height of the block where such an event was emitted. 
| Prerequisites To use this guide, it is assumed that the following criteria have been met: 
 | 
1. Generating the plugin’s file & folder structure
While in the root folder of the Hello client, generate a skeleton for the new plugin with Klayr Commander.
The command generate:plugin expects the following argument:
- 
Plugin alias: The name of the plugin. It needs to be a string in camelCase, and always starts with a lower case letter. No numbers, hyphens, etc., are allowed. 
klayr generate:plugin helloInfoThis will generate the following files:
Using template "klayr-ts" Generating plugin skeleton Registering plugin... identical .klayrrc.json create src/app/plugins/hello_info/hello_info_plugin.ts create test/unit/plugins/hello_info/hello_info_plugin.spec.ts No change to package.json was detected. No package manager install will be executed. Finished creating plugin
The hello_client directory will update and will look like the following:
├── bin/ ├── config/ ├── src/ │ ├── app/ │ │ ├── app.ts │ │ ├── index.ts │ │ ├── modules/ │ │ ├── modules.ts │ │ ├── plugins/ │ │ │ └── hello_info/ (1) │ │ │ └── hello_info_plugin.ts (2) │ │ └── plugins.ts (3) │ └── commands/ ├── test/ │ ├── integration/ │ ├── network/ │ ├── unit/ │ │ ├── modules/ │ │ └── plugins/ │ │ └── hello_info/ └── └── └── hello_info_plugin.spec.ts (4)
| 1 | The plugin’s root folder hello_infois created undersrc/app/plugins/. | 
| 2 | hello_info_plugin.tscontains the bare-boneHelloInfoPluginclass. | 
| 3 | The plugins.tsfile registers all the plugins with thehello_client. | 
| 4 | Contains the unit tests for the plugin. | 
After updating the directory, the Klayr Commander will also automatically register the plugin with the client by adding it to the plugins.ts file.
| Once the first plugin is added to the application, a manual change in  
 Otherwise, you will run into the following error, when trying to start the client: reference error : app is not defined | 
import { Application } from 'klayr-sdk';
import { HelloInfoPlugin } from "./plugins/hello_info/hello_info_plugin";
export const registerPlugins = (app: Application): void => {
    app.registerPlugin(new HelloInfoPlugin());
};2. The "HelloInfoPlugin" class
The HelloInfoPlugin class is defined in the hello_info_plugin.ts file and it contains the plugin’s skeleton along with default functions for a plugin.
import { BasePlugin } from 'klayr-sdk';
export class HelloInfoPlugin extends BasePlugin {
	public name: 'helloInfo';
	public get nodeModulePath(): string {
		return __filename;
	}
	public async load(): Promise<void> {
	}
	public async unload(): Promise<void> {}
}Each plugin’s class must extend from the BasePlugin, which is imported from the klayr-sdk package.
| A plugin is highly customizable and can be implemented in any way as per the business needs.
However, the only mandatory parts of a plugin are the nodeModulePath(),load()andunload()functions.
Their efficacy is discussed in the Plugin Anatomy section. | 
It is worth mentioning that, our goal is to familiarize you with how to create and customize plugins in a blockchain client, our implementation of a plugin can undoubtedly differ from yours depending on your business logic.
Now that we have the bare-bone structure for our HelloInfoPlugin, let’s customize it.