src/transaction/transaction.controller.ts
/api/v1/transaction
Methods |
| Async queryTx | ||||||
queryTx(transactionDto: QueryBlockchainDto)
|
||||||
Decorators :
@Post('/query')
|
||||||
|
Defined in src/transaction/transaction.controller.ts:82
|
||||||
|
Parameters :
Returns :
unknown
|
| Async submitTx | |||||||||
submitTx(request: AuthRequest, transactionDto: TransactionDto)
|
|||||||||
Decorators :
@Post('/submit')
|
|||||||||
|
Defined in src/transaction/transaction.controller.ts:34
|
|||||||||
|
Parameters :
Returns :
unknown
|
import {
BadRequestException,
Body,
Controller,
Inject,
Post,
Req,
UseGuards,
} from "@nestjs/common";
import { AuthGuard } from "@nestjs/passport";
import { AdminService } from "src/admin/admin.service";
import { AuthRequest } from "src/common/interfaces";
import {
transactionQuery,
transactionSubmitter,
} from "src/common/provider/web3/signer";
import { InternalCustodialService } from "src/shared/custodial/internalCustodial.service";
import { UserService } from "src/user/user.service";
import { QueryBlockchainDto } from "./dtos/query-transaction.dto";
import { TransactionDto } from "./dtos/submit-transaction.dto";
import { getContractByName } from "src/common/provider";
@UseGuards(AuthGuard("jwt"))
@Controller("/api/v1/transaction")
export class TransactionController {
@Inject(AdminService)
private readonly adminService: AdminService;
@Inject(UserService)
private readonly userService: UserService;
@Inject(InternalCustodialService)
private readonly internalInternalCustodialService: InternalCustodialService;
@Post("/submit")
async submitTx(
@Req() request: AuthRequest,
@Body() transactionDto: TransactionDto,
) {
const { role, email } = request.user;
const user =
role === "admin"
? await this.adminService.findByEmail(email)
: (
await this.userService.findUsersByFilter({
email: email,
})
)[0];
if (!user) {
throw new BadRequestException(`No user exist with email ${email}`);
}
if (
!user.wallets.find(
(wallet) =>
wallet.address.toLowerCase() ===
transactionDto.submitterAddress.toLowerCase(),
)
) {
throw new BadRequestException(
`No user don't have address ${transactionDto.submitterAddress}`,
);
}
try {
const custody = await this.internalInternalCustodialService.findOne(
user.wallets[0].address,
);
const contractAddress =
transactionDto.contractAddress ||
getContractByName[transactionDto.contractName].address;
return await transactionSubmitter({
signerKey: custody.privateKey,
contractAddress,
contractName: transactionDto.contractName,
transactionName: transactionDto.transactionName,
args: transactionDto.args,
});
} catch (e) {
throw new Error("Blockchain Tx Failed");
}
}
@Post("/query")
async queryTx(@Body() transactionDto: QueryBlockchainDto) {
const contractAddress =
transactionDto.contractAddress ||
getContractByName[transactionDto.contractName].address;
const queryResult = await transactionQuery({
contractAddress,
contractName: transactionDto.contractName,
queryName: transactionDto.queryName,
args: transactionDto.args,
});
return { queryResult: queryResult.toString() };
}
}