kodadot/nft-gallery

View on GitHub
composables/transaction/types.ts

Summary

Maintainability
A
3 hrs
Test Coverage
import type { OpenSeaAttribute as Attribute } from '@kodadot1/hyperdata'
import type { Interaction } from '@kodadot1/minimark/v1'
import type { ApiPromise } from '@polkadot/api'
import type { Prefix } from '@kodadot1/static'
import type { Ref } from 'vue'
import type { Abi as ViemAbi } from 'viem'
import type { BaseTokenType } from '@/components/base/types'
import type { Royalty } from '@/utils/royalty'
import type { ShoppingActions } from '@/utils/shoppingActions'
import type { Extrinsic } from '@/utils/transactionExecutor'
import type { Metadata } from '@/services/nftStorage'

type SuccessFunctionMessage = (blockNumber: string) => string
export type ObjectMessage = {
  message: string | SuccessFunctionMessage
  large: boolean
  shareLink?: string
}
export type ExecuteTransactionSuccessMessage =
  | string
  | SuccessFunctionMessage
  | ObjectMessage

type BaseExecuteTransactionParams = {
  arg: any[]
  successMessage?: ExecuteTransactionSuccessMessage
  errorMessage?: string | (() => string)
}

export type ExecuteSubstrateTransactionParams = {
  cb: (...params: any[]) => Extrinsic
} & BaseExecuteTransactionParams

export type Abi = ViemAbi

export type ExecuteEvmTransactionParams = {
  address: string
  functionName: string
  abi: Abi
  value?: string
} & BaseExecuteTransactionParams

export type ExecuteTransactionParams =
  | ExecuteSubstrateTransactionParams
  | ExecuteEvmTransactionParams

export type ExecuteTransaction = (p: ExecuteTransactionParams) => void

type BaseUnionMintParams<T> = {
  item: T
  isLoading: Ref<boolean>
  status: Ref<string>
  executeTransaction: ExecuteTransaction
}

export type BaseSubstrateMintParams<T> = {
  api: ApiPromise
} & BaseUnionMintParams<T>

export type BaseEvmMintParams<T> = BaseUnionMintParams<T>

export type BaseMintParams<T> =
  | BaseSubstrateMintParams<T>
  | BaseEvmMintParams<T>

export type MintTokenParams = BaseMintParams<ActionMintToken>
export type SubstrateMintTokenParams = BaseSubstrateMintParams<ActionMintToken>

export type MintCollectionParams = BaseMintParams<ActionMintCollection>

export type MintDropParams = BaseMintParams<ActionMintDrop>
export type SubstrateMintDropParams = BaseSubstrateMintParams<ActionMintDrop>
export type EvmMintDropParams = BaseEvmMintParams<ActionMintDrop>

export type CreateSwapParams = BaseSubstrateMintParams<ActionSwap>

export type NftCountType = {
  nftCount: number
}

export type SymbolType = {
  symbol: string
}

export type BaseCollectionType = {
  name: string
  file: File | null
  description: string
  royalty?: Royalty
  hasRoyalty?: boolean
}

export type CollectionToMintKusama = BaseCollectionType &
  NftCountType &
  SymbolType

export type CollectionToMintStatmine = BaseCollectionType & NftCountType

export type CollectionToMintBasilisk = BaseCollectionType & {
  tags: Attribute[]
}

export type MintedCollection = {
  id: string
  alreadyMinted: number
  metadata: string
  name?: string
  lastIndexUsed: number
  totalCount: number
  max: number
}

export type TokenToMint = BaseTokenType<MintedCollection> & {
  tags: Attribute[]
  nsfw: boolean
  postfix: boolean
  price?: string | number
  royalty?: Royalty
  hasRoyalty?: boolean
}

export type ActionConsume = {
  interaction: Interaction.CONSUME
  urlPrefix: Prefix
  nftIds: string[]
  abi?: Abi | null
  successMessage?: string
  errorMessage?: string
}

export type TokenToBuy = {
  id: string
  price: string
  currentOwner: string
  royalty?: Royalty
}

export type ActionBuy = {
  interaction: Interaction.BUY
  urlPrefix: string
  nfts: TokenToBuy | TokenToBuy[]
  successMessage?: string
  errorMessage?: string
}

export type TokenToList = {
  price: string
  nftId: string
}

export type TokenToOffer = {
  price: string
  collectionId: string
  nftSn: string
  duration: number
}

export type ActionList = {
  interaction: Interaction.LIST
  urlPrefix: string
  token: TokenToList | TokenToList[]
  successMessage?: string | ((blockNumber: string) => string)
  errorMessage?: string
  nftId?: string
  price?: string
}

type TokenToSend = {
  id: string
  sn: string
  collectionId: string
}

export type ActionSend = {
  interaction: Interaction.SEND
  urlPrefix: string
  address: string
  nfts: TokenToSend[]
  abi?: Abi | null
  successMessage?: string
  errorMessage?: string
}

export type ActionOffer = {
  interaction: typeof ShoppingActions.MAKE_OFFER
  urlPrefix: string
  token: TokenToOffer | TokenToOffer[]
  successMessage?: string | ((blockNumber: string) => string)
  errorMessage?: string
}

export type SwapSurchargeDirection = 'Send' | 'Receive'

export type SwapSurcharge = { amount: string, direction: SwapSurchargeDirection }

export type TokenToSwap = {
  id: string
  collectionId: string
  sn: string
}

export type ActionSwap = {
  interaction: typeof ShoppingActions.CREATE_SWAP
  urlPrefix: string
  offered: TokenToSwap[]
  desired: TokenToSwap[]
  surcharge?: SwapSurcharge
  duration: number
  successMessage?: string
  errorMessage?: string
}

export type ActionCancelOffer = {
  interaction: typeof ShoppingActions.CANCEL_OFFER
  urlPrefix: Prefix
  offeredId: string
  successMessage?: string
  errorMessage?: string
}

export type ActionAcceptOffer = {
  interaction: typeof ShoppingActions.ACCEPT_OFFER
  urlPrefix: Prefix
  nftId: string
  collectionId: string
  offeredId: string
  price: string
  successMessage?: string
  errorMessage?: string
}

export type ActionCancelSwap = {
  interaction: typeof ShoppingActions.CANCEL_SWAP
  urlPrefix: Prefix
  offeredId: string
  offeredCollectionId: string
  successMessage?: string
  errorMessage?: string
}

export type ActionAcceptSwap = {
  interaction: typeof ShoppingActions.ACCEPT_SWAP
  urlPrefix: Prefix
  sendCollection: string
  sendItem: string
  receiveItem: string
  receiveCollection: string
  price: string | null
  surcharge: string | null
  successMessage?: string
  errorMessage?: string
}

export interface ActionMintToken {
  interaction: Interaction.MINTNFT
  urlPrefix: string
  token: TokenToMint | TokenToMint[]
  successMessage?: string | ((blockNumber: string) => string)
  errorMessage?: string
}

export interface ActionMintDrop {
  interaction: NFTs.MINT_DROP
  availableSerialNumbers?: string[]
  price: string | null
  collectionId: string
  prefix: Prefix
}

export interface ActionMintCollection {
  interaction: Interaction.MINT
  urlPrefix: string
  collection:
    | CollectionToMintBasilisk
    | CollectionToMintKusama
    | CollectionToMintStatmine
  successMessage?: string | ((blockNumber: string) => string)
  errorMessage?: string
}

export enum Collections {
  DELETE = 'delete',
  UPDATE_COLLECTION = 'updateCollection',
}

export type ActionsInteractions = Interaction | ShoppingActions | Collections

export interface ActionDeleteCollection {
  interaction: Collections.DELETE
  collectionId: string
  urlPrefix: string
  successMessage?: string | ((blockNumber: string) => string)
  errorMessage?: string
}

export enum NFTs {
  MINT_DROP = 'mintDrop',
  SET_METADATA = 'setMetadata',
}

export type ActionMetadataSetMetadata = Metadata & { image: File | string }

export interface ActionSetNftMetadata {
  interaction: NFTs.SET_METADATA
  urlPrefix: string
  nftSn: string
  collectionId: string
  metadata: ActionMetadataSetMetadata
  successMessage?: string
  errorMessage?: string
}

export type SetNftMetadataParams = BaseUnionMintParams<ActionSetNftMetadata> & { api: ApiPromise }

export type UpdateCollection = {
  name: string
  description: string
  image: File | string
  imageType?: string
  banner?: File | string | null
  max: number | null
}

export type UpdateCollectionParams = BaseUnionMintParams<ActionUpdateCollection> & { api: ApiPromise }

export interface ActionUpdateCollection {
  interaction: Collections.UPDATE_COLLECTION
  collectionId: string
  collection: UpdateCollection
  update: { max: boolean, metadata: boolean }
  urlPrefix: string
  successMessage?: string | ((blockNumber: string) => string)
  errorMessage?: string
}

export type Actions =
  | ActionBuy
  | ActionList
  | ActionSend
  | ActionOffer
  | ActionConsume
  | ActionCancelSwap
  | ActionAcceptSwap
  | ActionCancelOffer
  | ActionAcceptOffer
  | ActionMintToken
  | ActionMintCollection
  | ActionDeleteCollection
  | ActionUpdateCollection
  | ActionSetNftMetadata
  | ActionMintDrop
  | ActionSwap