UNPKG

@lyncworld/fuel-marketplace

Version:

Marketplace NPM SDK on Fuel blockchain. Powered by LYNC, it allows anyone to create their own decentralized marketplace which includes listing and buying of Non-fungible tokens (NFTs) and Semi-fungible tokens (SFTs) in a few lines of code.

62 lines (49 loc) 2.36 kB
import { Account, bn } from 'fuels'; import { NftMarketplace } from '@/contracts/marketplace'; import { MarketplaceErrorCodes } from '@/enums'; import { MarketplaceError, MarketplaceServices } from '@/interfaces'; import { checkArguments } from '@/utils'; export class BuyTokenService extends MarketplaceServices { private readonly contract: NftMarketplace | undefined = undefined; private readonly wallet: Account | undefined = undefined; private listingId: `0x${string}` = '0x'; private quantity: number = 0; private pricePerItem: number = 0; constructor(contract: NftMarketplace, wallet: Account) { super(); checkArguments([contract, wallet], 'arguments'); this.contract = contract; this.wallet = wallet; } setProperties(listingId: `0x${string}`, quantity: number, pricePerItem: number) { checkArguments([listingId, quantity, pricePerItem], 'arguments'); this.listingId = listingId; this.quantity = quantity; this.pricePerItem = pricePerItem; return this; } async execute() { checkArguments([this.contract, this.wallet, this.listingId, this.quantity, this.pricePerItem], 'properties'); try { const balance = await this.wallet!.getBalance(this.wallet!.provider.getBaseAssetId()); const totalOrderPrice = parseFloat(this.pricePerItem.toString()) * 10 ** 9 * parseInt(this.quantity.toString()); if (parseFloat(balance.toString()) < totalOrderPrice) { throw new MarketplaceError( 'Insufficient Balance - At least ${totalOrderPrice} ETH is required to complete this transaction.', MarketplaceErrorCodes.InsufficientBalance, { balance, pricePerItem: this.pricePerItem, quantity: this.quantity, totalOrderPrice } ); } const transactionAwaited = await this.contract!.functions.buy_nft(bn(this.listingId), bn(this.quantity)) .callParams({ forward: [bn(totalOrderPrice), this.wallet!.provider.getBaseAssetId()], }) .call(); const finalTransaction = await transactionAwaited.waitForResult(); return { success: true, data: finalTransaction }; } catch (error: unknown) { console.error('Error Log: Error executing buy token transaction: ', { error }); return { success: false, error }; } } }