openapi: 3.0.0
info:
  description: "Cyphernode API v1"
  version: "1.0.0"
  title: "Cyphernode API"
externalDocs:
  description: "Find out more about Swagger"
  url: "http://swagger.io"
servers:
  - url: /v1
    description: authoring
  - url: http://localhost:8888/v1
    description: local cyphernode
tags:
  - name: "cyphernode"
    description: "Everything bitcoin"
    externalDocs:
      description: "Find out more"
      url: "http://cyphernode.io"
  - name: "openapi generator"
    externalDocs:
      description: "Find out more"
      url: "https://github.com/OpenAPITools/openapi-generator"
  - name: "watchedAddress"
    description: "Watch addresses"
  - name: "block"
    description: "Block information"
paths:
  /watchedAddress:
    post:
      tags:
        - "watchedAddress"
      summary: "Add a new address to ne watched"
      description: "Inserts the address and callbacks in the DB and imports the address to the Watching wallet."
      operationId: "addWatchedAddress"
      requestBody:
        description: "Address that needs to be watched"
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WatchedAddress'
      responses:
        201:
          description: "successfully created"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchedAddress'
        401:
          $ref: '#/components/schemas/ApiResponseNotAllowed'
        405:
          $ref: '#/components/schemas/ApiResponseInvalidInput'
        503:
          description: "Resource temporarily unavailable"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseTemporarilyUnavailable'
      security:
        - BearerAuth: []
    get:
      tags:
        - "watchedAddress"
      summary: "Get list of watched addresses"
      description: "Returns the list of currently watched addresses and callback information."
      operationId: "listWatchedAddress"
      responses:
        200:
          description: "successful operation"
          content:
            application/json:
              schema:
                type: "array"
                items:
                  $ref: '#/components/schemas/WatchedAddress'
        401:
          $ref: '#/components/schemas/ApiResponseNotAllowed'
        503:
          description: "Resource temporarily unavailable"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseTemporarilyUnavailable'
      security:
        - BearerAuth: []
  /watchedAddress/{address}:
    get:
      parameters:
        - in: "path"
          name: "address"
          description: "Address"
          required: true
          schema:
            $ref: '#/components/schemas/TypeAddressString'
      tags:
        - "watchedAddress"
      summary: "Show watched address"
      description: ""
      operationId: "getWatchedAddress"
      responses:
        200:
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WatchedAddress'
        401:
          $ref: '#/components/schemas/ApiResponseNotAllowed'
        404:
          $ref: '#/components/schemas/ApiResponseNotFound'
        503:
          description: "Resource temporarily unavailable"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseTemporarilyUnavailable'
      security:
        - BearerAuth: []
    delete:
      parameters:
        - in: "path"
          name: "address"
          description: "Address"
          required: true
          schema:
            $ref: '#/components/schemas/TypeAddressString'
      tags:
        - "watchedAddress"
      summary: "Delete watched address"
      description: "Updates the watched address row in DB so that callbacks won't be called on tx confirmations for that address."
      operationId: "deleteWatchedAddress"
      responses:
        200:
          description: "successful operation"
        401:
          $ref: '#/components/schemas/ApiResponseNotAllowed'
        404:
          $ref: '#/components/schemas/ApiResponseNotFound'
        503:
          description: "Resource temporarily unavailable"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseTemporarilyUnavailable'
      security:
        - BearerAuth: []
  /block/{blockHash}:
    get:
      parameters:
        - in: "path"
          name: "blockHash"
          description: "Blockhash"
          required: true
          schema:
            $ref: '#/components/schemas/TypeHashString'
      tags:
        - "block"
      summary: "Show block info"
      description: ""
      operationId: "getBlockInfo"
      responses:
        200:
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Block'
        401:
          $ref: '#/components/schemas/ApiResponseNotAllowed'
        404:
          $ref: '#/components/schemas/ApiResponseNotFound'
        503:
          description: "Resource temporarily unavailable"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseTemporarilyUnavailable'
      security:
        - BearerAuth: []
  /block/best:
    get:
      tags:
        - "block"
      summary: "Get the best block info"
      description: ""
      operationId: "getBestBlockInfo"
      responses:
        200:
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Block'
        401:
          $ref: '#/components/schemas/ApiResponseNotAllowed'
        503:
          description: "Resource temporarily unavailable"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseTemporarilyUnavailable'
      security:
        - BearerAuth: []
  /block/bestHash:
    get:
      tags:
        - "block"
      summary: "Get the best block hash."
      description: "Returns the best block hash of the watching Bitcoin node."
      operationId: "getBestBlockHash"
      responses:
        200:
          description: "successful operation"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TypeHashString'
        401:
          $ref: '#/components/schemas/ApiResponseNotAllowed'
        503:
          description: "Resource temporarily unavailable"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponseTemporarilyUnavailable'
      security:
        - BearerAuth: []
components:
  schemas:
    WatchedAddress:
      type: "object"
      required:
        - "address"
        - "callback"
      properties:
        id:
          type: "integer"
        address:
          $ref: '#/components/schemas/TypeAddressString'
        callback:
          description: "Async callback in case of activity on address"
          type: "string"
          format: "url"
        estimatesmartfee2blocks:
          type: "number"
        estimatesmartfee6blocks:
          type: "number"
        estimatesmartfee36blocks:
          type: "number"
        estimatesmartfee144blocks:
          type: "number"
        watching_since:
          type: "string"
          format: "date-time"
    Block:
      type: "object"
      required:
        - "address"
        - "callback"
      properties:
        id:
          type: "integer"
        hash:
          $ref: '#/components/schemas/TypeHashString'
        confirmations:
          type: "integer"
        strippedsize:
          type: "integer"
        size:
          type: "integer"
        weight:
          type: "integer"
        height:
          type: "integer"
        version:
          type: "integer"
        versionHex:
          $ref: '#/components/schemas/TypeInt32HexString'
        merkleroot:
          $ref: '#/components/schemas/TypeHashString'
        transactions:
          type: "array"
          items:
            $ref: '#/components/schemas/TypeHashString'
        time:
          type: "integer"
        mediantime:
          type: "integer"
        nonce:
          type: "integer"
        bits:
          $ref: '#/components/schemas/TypeInt32HexString'
        difficulty:
          type: 'integer'
        chainwork:
          $ref: '#/components/schemas/TypeHashString'

        transactionCount:
          type: 'integer'
        previousblockhash:
          $ref: '#/components/schemas/TypeHashString'
        nextblockhash:
          $ref: '#/components/schemas/TypeHashString'
    TypeAddressString:
      description: "base58 check encoded address"
      type: "string"
      pattern: "^[a-km-zA-HJ-NP-Z1-9]{26,35}$"
    TypeHashString:
      description: "64 character hex string"
      type: "string"
      pattern: "^[a-fA-F0-9]{64}$"
    TypeInt32HexString:
      description: "8 character hex string"
      type: "string"
      pattern: "^[a-fA-F0-9]{8}$"
    ApiResponseTemporarilyUnavailable:
      type: "object"
      properties:
        reason:
          type: "string"
    ApiResponseNotAllowed:
      description: Access token is missing or invalid
    ApiResponseNotFound:
      description: Not found
    ApiResponseInvalidInput:
      description: Invalid Input
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
