diff --git a/apps/core/src/app.module.ts b/apps/core/src/app.module.ts index d14e90f..9c0981d 100644 --- a/apps/core/src/app.module.ts +++ b/apps/core/src/app.module.ts @@ -7,9 +7,10 @@ import { CampaignsModule } from './campaigns/campaigns.module'; import { InvestmentsModule } from './investments/investments.module'; import { DeployModule } from './deploy/deploy.module'; import { LoansModule } from './loans/loans.module'; +import { ParticipationTokenModule } from './participation-token/participation-token.module'; @Module({ - imports: [PrismaModule, SorobanModule, CampaignsModule, InvestmentsModule, DeployModule, LoansModule], + imports: [PrismaModule, SorobanModule, CampaignsModule, InvestmentsModule, DeployModule, LoansModule,ParticipationTokenModule], controllers: [AppController], providers: [AppService], }) diff --git a/apps/core/src/participation-token/dto/buy.dto.ts b/apps/core/src/participation-token/dto/buy.dto.ts new file mode 100644 index 0000000..4a1aca9 --- /dev/null +++ b/apps/core/src/participation-token/dto/buy.dto.ts @@ -0,0 +1,27 @@ +import { IsString, IsNotEmpty, IsNumber, IsPositive } from 'class-validator'; + +export class BuyDto { + @IsString() + @IsNotEmpty() + contractId: string; + + @IsString() + @IsNotEmpty() + usdcAddress: string; + + @IsString() + @IsNotEmpty() + payer: string; + + @IsString() + @IsNotEmpty() + beneficiary: string; + + @IsNumber() + @IsPositive() + amount: number; + + @IsString() + @IsNotEmpty() + callerPublicKey: string; +} diff --git a/apps/core/src/participation-token/participation-token.controller.ts b/apps/core/src/participation-token/participation-token.controller.ts new file mode 100644 index 0000000..33e2545 --- /dev/null +++ b/apps/core/src/participation-token/participation-token.controller.ts @@ -0,0 +1,16 @@ +import { Controller, Post, Body } from '@nestjs/common'; +import { ParticipationTokenService } from './participation-token.service'; +import { BuyDto } from './dto/buy.dto'; + +@Controller('participation-token') +export class ParticipationTokenController { + constructor( + private readonly participationTokenService: ParticipationTokenService, + ) {} + + @Post('buy') + async buy(@Body() dto: BuyDto) { + const unsignedXdr = await this.participationTokenService.buy(dto); + return { unsignedXdr }; + } +} diff --git a/apps/core/src/participation-token/participation-token.module.ts b/apps/core/src/participation-token/participation-token.module.ts new file mode 100644 index 0000000..32655ce --- /dev/null +++ b/apps/core/src/participation-token/participation-token.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ParticipationTokenController } from './participation-token.controller'; +import { ParticipationTokenService } from './participation-token.service'; + +@Module({ + controllers: [ParticipationTokenController], + providers: [ParticipationTokenService], +}) +export class ParticipationTokenModule {} diff --git a/apps/core/src/participation-token/participation-token.service.ts b/apps/core/src/participation-token/participation-token.service.ts new file mode 100644 index 0000000..4f98bd8 --- /dev/null +++ b/apps/core/src/participation-token/participation-token.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; +import { SorobanService } from '../soroban/soroban.service'; +import { BuyDto } from './dto/buy.dto'; + +@Injectable() +export class ParticipationTokenService { + constructor(private readonly soroban: SorobanService) {} + + buy(dto: BuyDto): Promise { + return this.soroban.buildContractCallTransaction( + dto.contractId, + 'buy', + { + usdc: dto.usdcAddress, + payer: dto.payer, + beneficiary: dto.beneficiary, + amount: dto.amount, + }, + dto.callerPublicKey, + ); + } +}