openapi: 3.0.0
paths:
  /api/send-transaction:
    post:
      operationId: AppController_sendTransaction
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction:
                  type: string
                  description: Base64 encoded signed transaction to send
                  example: eyJ0eXBlIjoiVFJBTlNBQ1RJT04iLCJhY3Rpb24iOiJTRU5EIn0=
      responses:
        '200':
          description: Transaction sent successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SendTransactionResponse'
        '400':
          description: Bad request - Missing transaction
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Send a signed transaction to the blockchain
      tags:
        - General
  /api/get-price:
    get:
      operationId: AppController_getTokenPriceInSolana
      parameters:
        - name: tokenAddress
          required: true
          in: query
          description: Solana address of the token to get price for
          schema:
            example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
            type: string
      responses:
        '200':
          description: Returns the token price in SOL
          content:
            application/json:
              schema:
                type: object
                properties:
                  price:
                    type: number
                    description: Price of the token in SOL
                    example: 1.5
        '500':
          description: Internal server error
      summary: Get token price in SOL
      tags:
        - General
  /api/currency-list:
    get:
      operationId: AppController_getSupportedCurrencyList
      parameters: []
      responses:
        '200':
          description: Returns list of supported currencies with their details
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    address:
                      type: string
                      description: Solana address of the currency
                      example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
                    symbol:
                      type: string
                      description: Currency symbol
                      example: USDC
                    name:
                      type: string
                      description: Currency name
                      example: USD Coin
                    decimals:
                      type: number
                      description: Number of decimal places
                      example: 6
        '500':
          description: Internal server error
      summary: Get list of supported currencies
      tags:
        - General
  /api/offers:
    post:
      operationId: OfferController_createOffer
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlaceOfferArgs'
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and offer receipt address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferTransactionResponse'
        '403':
          description: Unauthorized - Must be the buyer
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Create a new offer for an NFT
      tags:
        - Offers
  /api/offers/cancel:
    post:
      operationId: OfferController_cancelOffer
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelOfferArgs'
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and offer receipt address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferTransactionResponse'
        '403':
          description: Unauthorized - Must be the buyer
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Cancel an existing offer
      tags:
        - Offers
  /api/offers/{receiptAddress}:
    get:
      operationId: OfferController_getOfferByReceiptAddress
      parameters:
        - name: receiptAddress
          required: true
          in: path
          description: Solana address of the offer receipt
          schema:
            type: string
      responses:
        '200':
          description: Returns the offer details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferModel'
        '500':
          description: Internal server error
      summary: Get offer by receipt address
      tags:
        - Offers
  /api/offers/asset/{assetAddress}:
    get:
      operationId: OfferController_getOffersByNft
      parameters:
        - name: assetAddress
          required: true
          in: path
          description: Solana address of the NFT asset
          schema:
            type: string
      responses:
        '200':
          description: Returns list of offers for the NFT
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/OfferModel'
        '500':
          description: Internal server error
      summary: Get all offers for a specific NFT
      tags:
        - Offers
  /api/offers/buyer/{buyerAddress}:
    get:
      operationId: OfferController_getOffersByBuyer
      parameters:
        - name: buyerAddress
          required: true
          in: path
          description: Solana address of the buyer
          schema:
            type: string
      responses:
        '200':
          description: Returns list of offers made by the buyer
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/OfferModel'
        '500':
          description: Internal server error
      summary: Get all offers made by a specific buyer
      tags:
        - Offers
  /api/offers/{id}/seen:
    put:
      operationId: OfferController_markOfferAsSeen
      parameters:
        - name: id
          required: true
          in: path
          description: Offer ID
          schema:
            type: string
      responses:
        '200':
          description: Offer marked as seen successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferModel'
        '500':
          description: Internal server error
      summary: Mark an offer as seen
      tags:
        - Offers
  /api/offers/my/{userAddress}:
    get:
      operationId: OfferController_findMyOffers
      parameters:
        - name: userAddress
          required: true
          in: path
          description: Solana address of the authenticated user
          schema:
            type: string
      responses:
        '200':
          description: Returns list of offers made by the user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/OfferModel'
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Get all offers made by the authenticated user
      tags:
        - Offers
  /api/offers/received/{userAddress}:
    get:
      operationId: OfferController_findReceivedOffers
      parameters:
        - name: userAddress
          required: true
          in: path
          description: Solana address of the authenticated user
          schema:
            type: string
      responses:
        '200':
          description: Returns list of offers received by the user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/OfferModel'
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Get all offers received by the authenticated user
      tags:
        - Offers
  /api/offers/accept:
    post:
      operationId: OfferController_acceptOffer
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AcceptOfferArgs'
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and NFT asset address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetTransactionResponse'
        '403':
          description: Unauthorized - Must be the seller
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Accept an offer
      tags:
        - Offers
  /api/asset/create:
    post:
      operationId: AssetController_createAsset
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: Asset image file (required)
                name:
                  type: string
                  description: Name of the asset
                creator:
                  type: string
                  description: Solana address of the creator
                collectionAddress:
                  type: string
                  description: Solana address of the collection
                description:
                  type: string
                  description: Description of the asset
                payer:
                  type: string
                  description: >-
                    Solana address of the payer (defaults to creator if not
                    provided)
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and asset address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetTransactionResponse'
        '400':
          description: Bad request - Missing required fields
        '403':
          description: Unauthorized - Must be the creator
        '422':
          description: Unprocessable entity - Invalid file type
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Create a new NFT asset
      tags:
        - Assets
  /api/asset/burn:
    post:
      operationId: AssetController_burnAsset
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                assetAddress:
                  type: string
                  description: Solana address of the asset to burn
                payer:
                  type: string
                  description: Solana address of the payer
                collectionAddress:
                  type: string
                  description: Solana address of the collection
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and asset address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetTransactionResponse'
        '400':
          description: Bad request - Missing required fields
        '403':
          description: Unauthorized - Must be the payer
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Burn an NFT asset
      tags:
        - Assets
  /api/asset/transfer:
    post:
      operationId: AssetController_transferAsset
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                assetAddress:
                  type: string
                  description: Solana address of the asset to transfer
                currentOwner:
                  type: string
                  description: Solana address of the current owner
                newOwner:
                  type: string
                  description: Solana address of the new owner
                collectionAddress:
                  type: string
                  description: Solana address of the collection
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and asset address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetTransactionResponse'
        '400':
          description: Bad request - Missing required fields
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Transfer an NFT asset to a new owner
      tags:
        - Assets
  /api/asset/for-sale:
    post:
      operationId: AssetController_setAssetForSale
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                assetAddress:
                  type: string
                  description: Solana address of the asset to list
                price:
                  type: number
                  description: Price of the asset
                owner:
                  type: string
                  description: Solana address of the current owner
                currencyAddress:
                  type: string
                  description: Solana address of the currency token
                collectionAddress:
                  type: string
                  description: Solana address of the collection
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and asset address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetTransactionResponse'
        '400':
          description: Bad request - Missing required fields
        '403':
          description: Unauthorized - Must be the owner
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: List an NFT asset for sale
      tags:
        - Assets
  /api/asset/cancel-for-sale:
    post:
      operationId: AssetController_cancelForSale
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                assetAddress:
                  type: string
                  description: Solana address of the listed asset
                owner:
                  type: string
                  description: Solana address of the current owner
                collectionAddress:
                  type: string
                  description: Solana address of the collection
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and asset address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetTransactionResponse'
        '400':
          description: Bad request - Missing required fields
        '403':
          description: Unauthorized - Must be the owner
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Cancel a listed NFT asset
      tags:
        - Assets
  /api/asset/{assetAddress}:
    get:
      operationId: AssetController_fetchAsset
      parameters:
        - name: assetAddress
          required: true
          in: path
          description: Solana address of the asset
          schema:
            type: string
      responses:
        '200':
          description: Returns the asset details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetModel'
        '400':
          description: Bad request - Missing asset address
        '500':
          description: Internal server error
      summary: Get asset details by address
      tags:
        - Assets
  /api/asset/{assetAddress}/owner:
    get:
      operationId: AssetController_getAssetOwner
      parameters:
        - name: assetAddress
          required: true
          in: path
          description: Solana address of the asset
          schema:
            type: string
      responses:
        '200':
          description: Returns the current owner address
        '500':
          description: Internal server error
      summary: Get current owner of an asset
      tags:
        - Assets
  /api/asset/owner/{ownerAddress}:
    get:
      operationId: AssetController_getAssetsbyOwner
      parameters:
        - name: ownerAddress
          required: true
          in: path
          description: Solana address of the owner
          schema:
            type: string
      responses:
        '200':
          description: Returns list of assets owned by the address
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AssetModel'
        '400':
          description: Bad request - Missing owner address
        '500':
          description: Internal server error
      summary: Get all assets owned by an address
      tags:
        - Assets
  /api/asset/favorites/{userAddress}:
    get:
      operationId: AssetController_getFavoriteAssets
      parameters:
        - name: userAddress
          required: true
          in: path
          description: Solana address of the user
          schema:
            type: string
      responses:
        '200':
          description: Returns list of favorite assets
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AssetModel'
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Get favorite assets of a user
      tags:
        - Assets
  /api/asset/accept-sale:
    post:
      operationId: AssetController_acceptSale
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                asset:
                  type: string
                  description: Solana address of the asset to buy
                buyer:
                  type: string
                  description: Solana address of the buyer
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and asset address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetTransactionResponse'
        '400':
          description: Bad request - Missing required fields
        '403':
          description: Unauthorized - Must be the buyer
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Accept a sale of an NFT asset
      tags:
        - Assets
  /api/asset/{assetAddress}/activities:
    get:
      operationId: AssetController_getAssetActivities
      parameters:
        - name: assetAddress
          required: true
          in: path
          description: Solana address of the asset
          schema:
            type: string
      responses:
        '200':
          description: Returns list of activities for the asset
        '500':
          description: Internal server error
      summary: Get activity history of an asset
      tags:
        - Assets
  /api/collection/{collectionAddress}:
    get:
      operationId: CollectionController_fetchCollection
      parameters:
        - name: collectionAddress
          required: true
          in: path
          description: Solana address of the collection
          schema:
            type: string
      responses:
        '200':
          description: Returns the collection details
        '500':
          description: Internal server error
      summary: Get collection by address
      tags:
        - Collections
    put:
      operationId: CollectionController_updateCollection
      parameters:
        - name: collectionAddress
          required: true
          in: path
          description: Solana address of the collection to update
          schema:
            type: string
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                image:
                  type: string
                  format: binary
                  description: New collection image file (optional)
                banner:
                  type: string
                  format: binary
                  description: New collection banner image file (optional)
                category:
                  type: string
                  description: New category of the collection
                description:
                  type: string
                  description: New description of the collection
                website:
                  type: string
                  description: New website URL
                twitter:
                  type: string
                  description: New Twitter handle
                telegram:
                  type: string
                  description: New Telegram link
                instagram:
                  type: string
                  description: New Instagram handle
                discord:
                  type: string
                  description: New Discord server link
                youtube:
                  type: string
                  description: New YouTube channel link
      responses:
        '200':
          description: Collection updated successfully
        '400':
          description: Bad request - Missing collection address
        '403':
          description: Unauthorized - Must be the collection owner
        '422':
          description: Unprocessable entity - Invalid file type
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Update an existing collection
      tags:
        - Collections
  /api/collection/create:
    post:
      operationId: CollectionController_createCollection
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                image:
                  type: string
                  format: binary
                  description: Collection image file (required)
                banner:
                  type: string
                  format: binary
                  description: Collection banner image file (optional)
                creator:
                  type: string
                  description: Solana address of the collection creator
                collectionName:
                  type: string
                  description: Name of the collection
                category:
                  type: string
                  description: Category of the collection
                payer:
                  type: string
                  description: >-
                    Solana address of the payer (defaults to creator if not
                    provided)
                description:
                  type: string
                  description: Description of the collection
                creatorName:
                  type: string
                  description: Name of the creator
                website:
                  type: string
                  description: Website URL
                twitter:
                  type: string
                  description: Twitter handle
                telegram:
                  type: string
                  description: Telegram link
                instagram:
                  type: string
                  description: Instagram handle
                discord:
                  type: string
                  description: Discord server link
                youtube:
                  type: string
                  description: YouTube channel link
                maxSize:
                  type: number
                  description: Maximum size of the collection
                sellerFee:
                  type: string
                  description: Seller fee in basis points
                totalSupply:
                  type: string
                  description: Total supply of NFTs in the collection
      responses:
        '200':
          description: Returns base64 encoded transaction to sign and collection address
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionTransactionResponse'
        '400':
          description: Bad request - Missing required fields
        '403':
          description: Unauthorized - Must be the creator or payer
        '422':
          description: Unprocessable entity - Invalid file type
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Create a new NFT collection
      tags:
        - Collections
  /api/collection/{collectionAddress}/detailed-info:
    get:
      operationId: CollectionController_fetchFullCollectionInfo
      parameters:
        - name: collectionAddress
          required: true
          in: path
          description: Solana address of the collection
          schema:
            type: string
      responses:
        '200':
          description: Returns detailed collection information
        '500':
          description: Internal server error
      summary: Get detailed information about a collection
      tags:
        - Collections
  /api/collection/creator/{userAddress}:
    get:
      operationId: CollectionController_getCollectionsByCreator
      parameters:
        - name: userAddress
          required: true
          in: path
          description: Solana address of the creator
          schema:
            type: string
      responses:
        '200':
          description: Returns list of collections created by the user
        '500':
          description: Internal server error
      summary: Get all collections created by a specific user
      tags:
        - Collections
  /api/collection/all:
    post:
      operationId: CollectionController_getAllCollections
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetAllCollectionsArgs'
      responses:
        '200':
          description: Returns list of collections matching the filter criteria
        '500':
          description: Internal server error
      summary: Get all collections with optional filtering
      tags:
        - Collections
  /api/user/{userAddress}:
    get:
      operationId: UserController_fetchCollection
      parameters:
        - name: userAddress
          required: true
          in: path
          description: User wallet address
          schema:
            type: string
      responses:
        '200':
          description: Returns user profile
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserModel'
        '500':
          description: Internal server error
      summary: Get user profile by address
      tags:
        - User
    put:
      operationId: UserController_updateUser
      parameters:
        - name: userAddress
          required: true
          in: path
          description: User wallet address
          schema:
            type: string
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: User name
                bio:
                  type: string
                  description: User biography
                website:
                  type: string
                  description: User website URL
                twitter:
                  type: string
                  description: Twitter handle
                telegram:
                  type: string
                  description: Telegram username
                instagram:
                  type: string
                  description: Instagram handle
                discord:
                  type: string
                  description: Discord username
                youtube:
                  type: string
                  description: YouTube channel
                avatar:
                  type: string
                  format: binary
                  description: User avatar image
                banner:
                  type: string
                  format: binary
                  description: User banner image
      responses:
        '200':
          description: Profile updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserModel'
        '400':
          description: Bad request - Invalid input or unauthorized
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Update user profile
      tags:
        - User
  /api/user/{userAddress}/accept-agreement:
    post:
      operationId: UserController_acceptAgreement
      parameters:
        - name: userAddress
          required: true
          in: path
          description: User wallet address
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                agreement:
                  type: boolean
                  description: Agreement acceptance status
      responses:
        '200':
          description: Agreement accepted successfully
        '400':
          description: Bad request - Invalid input or unauthorized
      security:
        - bearer: []
      summary: Accept user agreement
      tags:
        - User
  /api/user/{userAddress}/toggle-favorite-collection:
    post:
      operationId: UserController_favoriteCollection
      parameters:
        - name: userAddress
          required: true
          in: path
          description: User wallet address
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                collectionAddress:
                  type: string
                  description: Collection address to toggle
      responses:
        '200':
          description: Favorite collection toggled successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserModel'
        '400':
          description: Bad request - Invalid input or unauthorized
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Toggle favorite collection
      tags:
        - User
  /api/user/{userAddress}/toggle-favorite-asset:
    post:
      operationId: UserController_favoriteAsset
      parameters:
        - name: userAddress
          required: true
          in: path
          description: User wallet address
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                assetAddress:
                  type: string
                  description: Asset address to toggle
      responses:
        '200':
          description: Favorite asset toggled successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserModel'
        '400':
          description: Bad request - Invalid input or unauthorized
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Toggle favorite asset
      tags:
        - User
  /api/user/{userAddress}/balance:
    post:
      operationId: UserController_getUserBalance
      parameters:
        - name: userAddress
          required: true
          in: path
          description: User wallet address
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                tokenAddress:
                  type: string
                  description: Token address to check balance
      responses:
        '200':
          description: Returns user token balance
        '400':
          description: Bad request - Invalid input
        '500':
          description: Internal server error
      summary: Get user token balance
      tags:
        - User
  /api/user/{userAddress}/trades:
    get:
      operationId: UserController_getUserTrades
      parameters:
        - name: userAddress
          required: true
          in: path
          description: User wallet address
          schema:
            type: string
      responses:
        '200':
          description: Returns user trade history
        '400':
          description: Bad request - Invalid input or unauthorized
        '500':
          description: Internal server error
      security:
        - bearer: []
      summary: Get user trade history
      tags:
        - User
  /api/auth/signIn:
    post:
      operationId: AuthController_signIn
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                userAddress:
                  type: string
                  description: Solana address of the user
                  example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
                signature:
                  type: string
                  description: Signature of the auth message signed by the user's wallet
                  example: >-
                    2UzGCZxHosKL7K4Zq3J9NKJf2T2WtFbG6qRJzpqdRzS8nJgFzLdKQmW3XqY5N2vBmKcRzT9yLpV7xHjM4nQ8
              required:
                - userAddress
                - signature
      responses:
        '200':
          description: Successfully authenticated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthToken'
        '403':
          description: Authentication failed
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Failed to sign in
                  error:
                    type: string
                    example: Invalid signature
      summary: Sign in with wallet signature
      tags:
        - Authentication
  /api/auth/messageToSign:
    post:
      operationId: AuthController_authWithWallet
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                userAddress:
                  type: string
                  description: Solana address of the user requesting authentication
                  example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
              required:
                - userAddress
      responses:
        '200':
          description: Returns message to sign and nonce
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignInMessage'
        '400':
          description: Failed to generate auth message
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Failed to generate auth message
                  error:
                    type: string
                    example: Invalid user address
      summary: Get message to sign for authentication
      tags:
        - Authentication
info:
  title: Opincur NFT Marketplace API
  description: |2-

          Comprehensive API for managing NFTs, collections, offers, and user interactions on the Opincur platform.
          
          Key Features:
          - User Management: Profile creation, social links, favorites, and trade history
          - Asset Operations: Create, burn, transfer, list, and manage NFT assets
          - Offer System: Create, accept, cancel, and manage NFT offers
          - Collection Management: Create and manage NFT collections
          - Authentication: Secure wallet-based authentication
          
          Authentication:
          - All protected endpoints require a valid JWT token
          - Token can be obtained through wallet signature verification
          
          Rate Limiting:
          - Most endpoints are rate limited for stability
          - Standard limits: 5 requests per minute for write operations
          - Higher limits: 20 requests per minute for read operations
          
          Transaction Flow:
          - Write operations return base64 encoded transactions
          - Transactions must be signed client-side before submission
          - Use the /api/send-transaction endpoint to submit signed transactions
        
  version: '1.0'
  contact: {}
tags:
  - name: Authentication
    description: Wallet-based authentication endpoints
  - name: User
    description: User profile and preferences management
  - name: Assets
    description: NFT asset creation and management
  - name: Offers
    description: NFT offer creation and management
  - name: Collections
    description: NFT collection management
  - name: General
    description: General utility endpoints
servers: []
components:
  securitySchemes:
    JWT-auth:
      scheme: bearer
      bearerFormat: JWT
      type: http
      name: JWT
      description: Enter JWT token
      in: header
  schemas:
    SendTransactionResponse:
      type: object
      properties:
        signature:
          type: string
          description: Signature of the submitted transaction on the Solana blockchain
          example: 5K3v...abc
        status:
          type: string
          description: Status of the transaction after submission (e.g., confirmed)
          example: confirmed
      required:
        - signature
        - status
    PlaceOfferArgs:
      type: object
      properties:
        assetAddress:
          type: string
          description: NFT asset address
        price:
          type: number
          description: Offer price
        currencyAddress:
          type: string
          description: Currency address for payment
        currencySymbol:
          type: string
          description: Currency symbol
        buyer:
          type: string
          description: Buyer wallet address
        collectionAddress:
          type: string
          description: Collection address
        receiptAddress:
          type: string
          description: Offer receipt address
      required:
        - assetAddress
        - price
        - currencyAddress
        - currencySymbol
        - buyer
    OfferTransactionResponse:
      type: object
      properties:
        transaction:
          type: string
          description: >-
            Base64 encoded transaction that needs to be signed on the client
            side
          example: eyJ0eXBlIjoiT0ZGRVIiLCJhY3Rpb24iOiJDUkVBVEUifQ==
        receiptAddress:
          type: string
          description: Solana address of the offer receipt
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
      required:
        - transaction
        - receiptAddress
    CancelOfferArgs:
      type: object
      properties:
        assetAddress:
          type: string
          description: NFT asset address
        buyer:
          type: string
          description: Buyer wallet address
        currencyAddress:
          type: string
          description: Currency address
      required:
        - assetAddress
        - buyer
        - currencyAddress
    AssetModel:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the asset
        name:
          type: string
          description: Name of the NFT asset
          example: 'CryptoPunk #1234'
        pictureId:
          type: string
          description: ID of the asset picture
        order:
          type: number
          description: Order/sequence number of the asset
          example: 1
        description:
          type: string
          description: Description of the NFT asset
          example: A unique digital collectible
        imageUrl:
          type: string
          description: URL of the asset image
        mimeType:
          type: string
          description: MIME type of the asset image
          example: image/png
        thumbnailUrl:
          type: string
          description: URL of the asset thumbnail
        metaData:
          type: string
          description: Metadata of the NFT in JSON format
        collectionName:
          type: string
          description: Name of the collection this asset belongs to
        collectionId:
          type: string
          description: ID of the collection
        collectionPublicKey:
          type: string
          description: Solana public key of the collection
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        authorPublicKey:
          type: string
          description: Solana public key of the asset creator
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        publicKey:
          type: string
          description: Solana public key of the asset
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        mintedAt:
          format: date-time
          type: string
          description: Date when the asset was minted
        createdAt:
          format: date-time
          type: string
          description: Date when the asset was created
        updatedAt:
          format: date-time
          type: string
          description: Date when the asset was last updated
        status:
          type: string
          description: Current status of the asset
          example: LISTED
        priceInSol:
          type: number
          description: Current price in SOL
          example: 1.5
        price:
          type: number
          description: Current price in the specified currency
        currencySymbol:
          type: string
          description: Symbol of the currency used for pricing
          example: USDC
        currencyAddress:
          type: string
          description: Solana address of the currency used for pricing
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        lastPrice:
          type: number
          description: Last sale price in the specified currency
        lastPriceSymbol:
          type: string
          description: Symbol of the currency used for last sale
          example: USDC
        lastPriceAddress:
          type: string
          description: Solana address of the currency used for last sale
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        lastPriceInSol:
          type: number
          description: Last sale price in SOL
          example: 1.2
        receiptAddress:
          type: string
          description: Solana address of the offer receipt
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        viewsCount:
          type: number
          description: Number of times the asset has been viewed
          example: 100
        tradesCount:
          type: number
          description: Number of trades/transactions for this asset
          example: 5
        removed:
          type: boolean
          description: Whether the asset has been removed
          default: false
        currentOwnerAddress:
          type: string
          description: Solana address of the current owner
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        currentOwnerAvatar:
          type: string
          description: URL of the current owner avatar
        type:
          type: string
          description: Type of the asset
          example: NFT
      required:
        - name
        - order
        - createdAt
        - updatedAt
        - viewsCount
        - tradesCount
        - removed
    OfferModel:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the offer
        nftAddress:
          type: string
          description: NFT asset address
        buyerAddress:
          type: string
          description: Buyer wallet address
        price:
          type: number
          description: Offer price in the specified currency
        priceInSol:
          type: number
          description: Offer price converted to SOL
        currencySymbol:
          type: string
          description: Currency symbol (e.g., SOL, USDC)
        currencyAddress:
          type: string
          description: Currency contract address
        version:
          type: number
          description: Offer version number
        metadataAddress:
          type: string
          description: Metadata address for the offer
        receiptAddress:
          type: string
          description: Offer receipt address
        createdAt:
          format: date-time
          type: string
          description: Creation timestamp
        seen:
          type: boolean
          description: Whether the offer has been seen by the seller
        cancelled:
          type: boolean
          description: Whether the offer has been cancelled
        cancelledAt:
          format: date-time
          type: string
          description: Timestamp when the offer was cancelled
        accepted:
          type: boolean
          description: Whether the offer has been accepted
        acceptedAt:
          format: date-time
          type: string
          description: Timestamp when the offer was accepted
        acceptedBy:
          type: string
          description: Address of the user who accepted the offer
        type:
          type: string
          description: Type of the offer
        thumbnailUrl:
          type: string
          description: URL to NFT thumbnail image
        nft:
          description: Associated NFT details
          allOf:
            - $ref: '#/components/schemas/AssetModel'
      required:
        - id
        - nftAddress
        - buyerAddress
        - price
        - priceInSol
        - currencySymbol
        - currencyAddress
        - receiptAddress
        - createdAt
        - seen
        - cancelled
        - accepted
    AcceptOfferArgs:
      type: object
      properties:
        offerReceipt:
          type: string
          description: Offer receipt address
        seller:
          type: string
          description: Seller wallet address
      required:
        - offerReceipt
        - seller
    AssetTransactionResponse:
      type: object
      properties:
        transaction:
          type: string
          description: >-
            Base64 encoded transaction that needs to be signed on the client
            side
          example: eyJ0eXBlIjoiQVNTRVQiLCJhY3Rpb24iOiJUUkFOU0ZFUiJ9==
        assetAddress:
          type: string
          description: Solana address of the NFT asset
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
      required:
        - transaction
        - assetAddress
    CollectionTransactionResponse:
      type: object
      properties:
        transaction:
          type: string
          description: >-
            Base64 encoded transaction that needs to be signed on the client
            side
          example: eyJ0eXBlIjoiQ09MTEVDVElPTiIsImFjdGlvbiI6IkNSRUFURSJ9==
        collectionAddress:
          type: string
          description: Solana address of the NFT collection
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
      required:
        - transaction
        - collectionAddress
    GetAllCollectionsArgs:
      type: object
      properties:
        category:
          type: string
          description: Collection category
        view:
          type: string
          description: View type (e.g., favorites, portfolio)
        userAddress:
          type: string
          description: User wallet address
    UserModel:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier of the user
        publicKey:
          type: string
          description: User wallet address
        name:
          type: string
          description: User display name
        email:
          type: string
          description: User email address
        avatar:
          type: string
          description: URL to user avatar image
        bannerUrl:
          type: string
          description: URL to user banner image
        bio:
          type: string
          description: User biography
        website:
          type: string
          description: User website URL
        twitter:
          type: string
          description: Twitter handle
        instagram:
          type: string
          description: Instagram handle
        discord:
          type: string
          description: Discord username
        youtube:
          type: string
          description: YouTube channel
        telegram:
          type: string
          description: Telegram username
        createdAt:
          format: date-time
          type: string
          description: User creation timestamp
        updatedAt:
          format: date-time
          type: string
          description: Last update timestamp
        agreement:
          type: boolean
          description: User agreement acceptance status
        agreementAt:
          format: date-time
          type: string
          description: Timestamp when user accepted the agreement
        favoriteCollections:
          description: List of favorite collection addresses
          type: array
          items:
            type: string
        favoriteAssets:
          description: List of favorite asset addresses
          type: array
          items:
            type: string
      required:
        - publicKey
        - createdAt
        - updatedAt
        - agreement
        - favoriteCollections
        - favoriteAssets
    AuthToken:
      type: object
      properties:
        accessToken:
          type: string
          description: JWT token for authentication
          example: >-
            eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyQWRkcmVzcyI6IjB4MTIzIiwiZXhwIjoxNTE2MjM5MDIyfQ
        userAddress:
          type: string
          description: Solana address of the authenticated user
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
      required:
        - accessToken
        - userAddress
    SignInMessage:
      type: object
      properties:
        userAddress:
          type: string
          description: Solana address of the user requesting authentication
          example: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
        message:
          type: string
          description: Message to be signed by the user for authentication
          example: >-
            Sign-in to opin.art with this your wallet:
            7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU


            Nonce: 123456
        nonce:
          type: number
          description: Nonce value to prevent replay attacks
          example: 123456
      required:
        - userAddress
        - message
        - nonce
