Criando o pacote nestjs-web3js: Integração do NestJS com Web3.js

Cláudio Rapôso
4 min readJul 3, 2023

O NestJS é um framework para a construção de aplicativos Node.js escaláveis e eficientes. Por outro lado, o Web3.js é uma biblioteca JavaScript para interagir com a blockchain Ethereum. Neste artigo, vamos explorar como criar um pacote chamado nestjs-web3js que permite a integração fácil e eficiente do NestJS com o Web3.js.

Se você quiser entender um pouco como funciona o pacote web3.js, veja os artigos abaixo:

Integração do MetaMask com NestJS e Web3.js: Um Guia Detalhado | by Cláudio Rapôso | Jun, 2023 | Medium

Minting de NFTs com NestJS e web3.js | by Cláudio Rapôso | Jul, 2023 | Medium

Visão geral do pacote

O pacote nestjs-web3js é projetado para fornecer um módulo do NestJS chamado Web3jsModule e um serviço correspondente chamado Web3jsService. Ele permite que os desenvolvedores acessem a instância do Web3.js de forma centralizada e fácil em seus aplicativos NestJS.

Estrutura do pacote

A estrutura básica do pacote nestjs-web3js é a seguinte:

nestjs-web3js
├── src
│ └── web3js
│ ├── dto
│ │ └── create-web3js-service.dto.ts
│ ├── web3js.module.ts
│ └── web3js.service.ts
└── index.ts

A pasta src contém todo o código-fonte do pacote, e o arquivo index.ts é usado para exportar os principais componentes do pacote.

Componentes principais

Vamos analisar os principais componentes do pacote nestjs-web3js:

Web3jsModule

O Web3jsModule é um módulo do NestJS que fornece o serviço Web3jsService para toda a aplicação. Ele é projetado para ser importado no módulo principal do NestJS usando o método forRoot.

Aqui está a implementação do Web3jsModule:

import { DynamicModule, Global, Module } from '@nestjs/common';
import { Web3jsService } from './web3js.service';
import Web3 from 'web3';
import { CreateWeb3jsServiceDto } from './dto/create-web3js-service.dto';

@Global()
@Module({
providers: [Web3jsService],
exports: [Web3jsService],
})
export class Web3jsModule {
static forRoot({ infuraUrl }: CreateWeb3jsServiceDto): DynamicModule {
return {
module: Web3jsModule,
providers: [
{
provide: Web3jsService,
useFactory: () => new Web3jsService(new Web3(infuraUrl)),
},
],
};
}
}

O Web3jsModule é marcado com o decorador @Global para permitir que o serviço Web3jsService seja compartilhado entre os diferentes módulos do NestJS.

Web3jsService

O Web3jsService é um serviço do NestJS que encapsula a instância do Web3.js. Ele fornece uma interface conveniente para interagir com a blockchain Ethereum em um aplicativo NestJS.

Aqui está a implementação do Web3jsService:

import { Injectable } from '@nestjs/common';
import Web3 from 'web3';

@Injectable()
export class Web3jsService {
private readonly props: Required<Web3>;
constructor(web3: Web3) {
this.props = web3;
}
get web3(): Required<Web3> {
return this.props;
}
}

O Web3jsService é injetável usando o decorador @Injectable do NestJS. Ele recebe uma instância do Web3.js no construtor e fornece uma propriedade web3 para acessar a instância do Web3.js.

create-web3js-service.dto.ts

O arquivo create-web3js-service.dto.ts define o esquema de validação e criação de um objeto de configuração para o serviço Web3jsService. Ele usa a biblioteca nestjs-zod para criar o esquema.

Aqui está a implementação do create-web3js-service.dto.ts:

import { createZodDto } from 'nestjs-zod';
import { z } from 'nestjs-zod/z';

export const CreateWeb3jsServiceSchema = z
.object({
infuraUrl: z.string().url().min(3),
})
.required();

// class is required for using DTO as a type
export class CreateWeb3jsServiceDto extends createZodDto(
CreateWeb3jsServiceSchema,
) {}

O esquema CreateWeb3jsServiceSchema define uma propriedade infuraUrl que deve ser uma string contendo uma URL válida com pelo menos 3 caracteres. O CreateWeb3jsServiceDto é criado usando a função createZodDto do nestjs-zod para aplicar o esquema de validação.

Usando o pacote nestjs-web3js

Agora que o pacote nestjs-web3js está pronto, vamos ver como usá-lo em um aplicativo NestJS.

Instalação

Para começar, você precisa instalar o pacote nestjs-web3js em seu aplicativo NestJS. Abra um terminal na raiz do seu projeto e execute o seguinte comando:

npm install nestjs-web3js

Importação e configuração

Após a instalação, você pode importar o módulo Web3jsModule em seu módulo principal do NestJS. Certifique-se de fornecer a configuração necessária ao usar o método forRoot.

Aqui está um exemplo de como importar e configurar o Web3jsModule:

import { Module } from '@nestjs/common';
import { Web3jsModule, CreateWeb3jsServiceDto } from 'nestjs-web3js';

@Module({
imports: [
Web3jsModule.forRoot({
infuraUrl: 'https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY',
} as CreateWeb3jsServiceDto),
],
})
export class AppModule {}

Certifique-se de substituir 'https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY' pelo URL do Infura correspondente à sua chave de API.

Uso do serviço

Uma vez configurado, você pode injetar o serviço Web3jsService em seus controladores, serviços ou outros componentes do NestJS.

Aqui está um exemplo de como usar o serviço Web3jsService em um controlador:

import { Controller, Get } from '@nestjs/common';
import { Web3jsService } from 'nestjs-web3js';

@Controller('example')
export class ExampleController {
constructor(private readonly web3jsService: Web3jsService) {}

@Get()
async getBlockNumber(): Promise<number> {
const blockNumber = await this.web3jsService.web3.eth.getBlockNumber();
return blockNumber;
}
}

Neste exemplo, o controlador ExampleController injeta o serviço Web3jsService por meio do construtor e usa a propriedade web3 para interagir com a instância do Web3.js.

Conclusão

Neste artigo, exploramos a criação do pacote nestjs-web3js que fornece uma integração fácil e eficiente do NestJS com o Web3.js. Vimos como importar, configurar e usar o pacote em um aplicativo NestJS. Agora você pode aproveitar os recursos poderosos do Web3.js em seus aplicativos NestJS de maneira simples e organizada. Para obter mais informações e exemplos de uso, consulte a documentação oficial do NestJS e do Web3.js.

Espero que este artigo tenha sido útil e que você possa aproveitar ao máximo o pacote nestjs-web3js em seus projetos.

O Código fonte: engcfraposo/nestjs-web3js: The nestjs-web3js is a NestJS module that provides a connection to Ethereum’s blockchain. It uses the web3.js library, which is a collection of libraries that allow you to interact with a local or remote Ethereum node using HTTP, IPC, or WebSocket. (github.com)

O Pacote: nestjs-web3js — npm (npmjs.com)

Caso queira ler o artigo em inglês: Creating the nestjs-web3js Package: Integrating NestJS with Web3.js | by Cláudio Rapôso | Jul, 2023 | Medium

--

--

Cláudio Rapôso
Cláudio Rapôso

Written by Cláudio Rapôso

Microsoft MVP | Software Architect | Teacher | Book Author | MCT | 12x Microsoft Certified Connect with me in https://www.linkedin.com/in/cfraposo