# ТЗ: CLI клиент для apostol-dm

## 1. Введение

Приложение `dm-cli` - интерфейс командной строки для доступа к функциям модуля сделок (dm) сервиса обработки bitcoin платежей BitDeals. Приложение должно предоставлять доступ к основной функциональности dm через командную строку.

Ресурсы:

- Исходный код модуля сделок: https://git.bitdeals.org/private/apostol-dm/.

- Docker образ модуля сделок: `docker pull registry.bitdeals.org/apostol-dm`

- Документация API модуля сделок: https://git.bitdeals.org/private/apostol-dm/src/branch/master/doc/REST-API-ru.md

- Веб интерфейс модуля сделок: https://testnet-dm2.bitdeals.org/dm/.

- Доступные пользователи bitdeals для работы с учётными данными и сделками при выполнении ТЗ: `mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp` (продавец); `mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC` (покупатель); `mynFyJJkRhsbB6y1Q5kTgDGckVz2m9NKH8` (пользователь модуля сделок).

## 2. Общие требования

1. В режиме работы `--debug` приложение должно дополнительно выводить данные API запросов и ответов.

2. Значение параметра `--address` приложения должно принимать IP адрес и порт, или URL путь, например `https://testnet-dm2.bitdeals.org/dm/` .

## 3. Функции dm-cli

### 3.1. Документация по использованию

1. Приложение должно выводить справку по использованию приложения по ключу `-h` или `--help`

2. Если переменная в значении: `LANG=ru_RU.UTF-8`, то справка должна быть на русском языке.

   `Пример сообщения 'dm-cli --help':`

   На английском:

       Usage: dm-cli [global] <group> [<args>]

       Global options:
         --debug              print debug information, input and output API requests
         --address <ip:port>  address of the bitdeals dm, default: 127.0.0.1:4999
         --help               print condensed help for all subcommands
         --version            print version string

           dm-cli account status <bitcoin_address>
               Show account data details
           dm-cli account update [options]
               Update your account data

           dm-cli deal create
               Create a new deal
           dm-cli deal status
               Show deal data details
           dm-cli deal complete
               Complete deal
           dm-cli deal cancel
               Cancel deal
           dm-cli deal negative
               Leave negative feedback

   На русском:

       Использование: dm-cli [глобальные параметры] <группа> [<аргументы>]

       Глобальные параметры:
         --debug              выводить отладочную информацию, входные и выходные API-запросы
         --address <ip:port>  адрес модуля сделок (dm), по умолчанию: 127.0.0.1:4999
         --help               вывести краткую справку по всем подкомандам
         --version            вывести строку версии

           dm-cli account status <биткоин адрес>
               Показать учётные данные аккаунта
           dm-cli account update [параметры]
               Изменить учётные данные аккаунта

           dm-cli deal create
               Создать новую сделку
           dm-cli deal status
               Показать данные сделки
           dm-cli deal complete
               Завершить сделку
           dm-cli deal cancel
               Отменить сделку
           dm-cli deal negative
               Оставить негативный отзыв

### 3.2. Запрос данных пользователей

1. Запрос должен происходить в соответствии с синтаксисом:

   `Пример сообщения 'dm-cli account status --help':`

   На английском:

       Usage: dm-cli account status [options] <bitcoin_address>

           Show info about a bitdeals user.

           -f|--feedbacks [p|n]      Show last 1K received feedbacks.
                                     Use p or n to filter only positive or negative feedbacks.
           -i|--info                 Show user account details.
           -r|--rating               Show user rating information.
           -s|--status               Show user account status (default action).

   На русском:

       Использование: dm-cli account status [параметры] <биткоин адрес>

           Показать информацию о пользователе bitdeals.

           -f|--feedbacks [p|n]      Показать последнюю 1 тыс. полученных отзывов.
                                     Используй p или n для фильтрации только позитивных или негативных отзывов.
           -i|--info                 Показать данные учётной записи.
           -r|--rating               Показать данные рейтинга.
           -s|--status               Показать статус пользователя (действие по умолчанию).

2. Примеры входных и выходных данных.

   1. Запрос статуса (`--status`) пользователя `mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp`:

          curl "https://testnet-dm.bitdeals.org/api/v1/account/status?address=mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp"

      `Пример ответа:`

          {
            "id": "c381f540d48c1d34",
            "action": "Status",
            "address": "mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp",
            "result": {
              "success": true,
              "message": "Open"
            },
            "payload": " "
          }

   2. Запрос информации (`--info`) о пользователе `mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC`:

          curl -X POST "https://testnet-dm2.bitdeals.org/api/v1/user/profile" \
              -H "Content-Type: application/json"
              -d '{"code":"mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC"}'

      `Пример ответа:`

          {
            "id": "65380112-e797-4041-8254-0c8878ea36e2",
            "userid": "fdbde2fe-d7c4-42d4-a6fd-39c58a17afac",
            "created": "2023-03-15T17:03:32.192766+03:00",
            "code": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
            "address": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
            "bitmessages": [
              "BM-2cWUG4jmW9CwKtNYv6nrJFTiNL4f8Ys8Dd"
            ],
            "module": "mynFyJJkRhsbB6y1Q5kTgDGckVz2m9NKH8",
            "btckey": "02128188a04564583a8540bcd584116d7de1d04dbbcc79c8fd5d45e6a1a65c7031",
            "pgpkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmI0EaByQKQEEAMfwUb7ErrEBDLkjYNwxFvzqdekC3+gR/GpyKOz55kNX/Cwm6ohS\nkNJGVlTR73pXSrQV0c14Dwzgf+HCBFamx1toOCW72GytX71aom2uXHLy8JOzc7bk\naQ+wLti0ghx+cdwvgRuJV5co2tlTxh87iariasP3Dgas4wtRrNvDcQNNABEBAAG0\nJEFjY291bnRfVVJMIChodHRwOi8vcmFuZG9tLXNpdGUuY29tKYjOBBMBCgA4FiEE\nnvbbPXqkDv91aLC/44t8noXtKDgFAmgckCkCGwMFCwkIBwMFFQoJCAsFFgIDAQAC\nHgECF4AACgkQ44t8noXtKDhovwP/eSVEE4234FPSAbI04DFSwt+TtwTqlFHV4O0d\nIzoGHNrQDB/jROugZtRsYR5mQtKbRuSSZTxZZikoJAufG3GBaq4JbDVsYQWRYl/G\ncxmOlS3u+qzjLCDKnn7VDDer+Ewbj2Cc4feH4eJe5vk7TOlXRAfPjV+Mm1gxTVUg\ncw44f624jQRoHJApAQQAu1u/UED5BYEblglb399KDyWHWRPSgM7yQvQHSUxUG4y9\nvzyDC303Hj238RI3AsYRF61EoriHlwAibf2d5LXwPpQrBuKyAzOPus3AIsVPqerK\naQB9poEpdHFr6qhDBumm1uHDKeFMhMcObI0Spz1Y5vUfJq5bMV3KGoYcxlac5bEA\nEQEAAYi2BBgBCgAgFiEEnvbbPXqkDv91aLC/44t8noXtKDgFAmgckCkCGwwACgkQ\n44t8noXtKDj1uwP+IS11c2N2dGLzpTHdujN1NVrvPxGur3lAxIidG57fGwK76RYm\nCrXws6SHORphBUw8nYzE1k9ZTOaZ4c/cNYYpDv6sxYqbFcco5WB1BnGUqtXUj4eK\n8vtje+VeZ+DOPmjUIEd3lMcTJo9sUXzLUxwiFIk89IGXSieOJ5QL+8M/M38=\n=4NLS\n-----END PGP PUBLIC KEY BLOCK-----",
            "urlaccount": [
              "https://testnet.bitdeals.org",
              "http://random-site.com"
            ],
            "urltrusted": [
              "https://testnet.bitdeals.org",
              "http://170.75.173.70:4999",
              "https://placard.zr-code.com",
              "http://testnet-dm.bitdeals.org:4999",
              "http://placard.zr-code.com",
              "http://testnet-dm.bitdeals.org",
              "https://testnet-dm2.bitdeals.org",
              "http://testnet-dm2.bitdeals.org",
              "http://testnet.bitdeals.org",
              "https://testnet-dm.bitdeals.org",
              "https://placard.bitdeals.org",
              "http://placard.bitdeals.org",
              "http://testnet2.bitdeals.org",
              "https://testnet2.bitdeals.org",
              "http://placard2.bitdeals.org",
              "https://placard2.bitdeals.org",
              "http://random-site.com"
            ],
            "seller": {
              "count": 11,
              "positive": 5
            },
            "customer": {
              "count": 604,
              "positive": 36
            },
            "state": "2565936d-6798-4035-b30d-9b1d388f40a6",
            "statecode": "enabled",
            "statelabel": "Open"
          }

   3. Запрос списка отзывов (`--feedbacks`) пользователя `mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC`:

          curl -X POST "https://testnet-dm2.bitdeals.org/api/v1/deal/feedback/list" \
              -H "Content-Type: application/json" \
              -d '{"search":[{"field":"sellercode","compare":"EQL","value":"mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC"}],"orderby":["date DESC"],"reclimit":1000,"recoffset":0}'

      `Пример ответа:`

          [
            {
              "deal": "d63350a1-8483-4c0f-87d2-8a4920f7bdba",
              "date": "2025-09-17T11:40:11",
              "sum": 0.002,
              "seller": "65380112-e797-4041-8254-0c8878ea36e2",
              "sellercode": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
              "customer": "65380112-e797-4041-8254-0c8878ea36e2",
              "customercode": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
              "leave_before": "2025-09-17T13:00:00",
              "status": null,
              "statustext": "none",
              "comments": "cancel deal test comment message 3",
              "refund": null
            },
            {
              "deal": "7e82e9c3-0e85-4635-8b53-6da7e541e6e3",
              "date": "2025-09-17T11:29:35",
              "sum": 0.002,
              "seller": "65380112-e797-4041-8254-0c8878ea36e2",
              "sellercode": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
              "customer": "65380112-e797-4041-8254-0c8878ea36e2",
              "customercode": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
              "leave_before": "2025-09-17T12:50:01",
              "status": -1,
              "statustext": "negative",
              "comments": "negative comment text for test",
              "refund": null
            },
            {
              "deal": "3f989f08-b5a0-4ceb-80a5-acd18a6559d4",
              "date": "2025-09-17T11:28:28",
              "sum": 0.002,
              "seller": "65380112-e797-4041-8254-0c8878ea36e2",
              "sellercode": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
              "customer": "65380112-e797-4041-8254-0c8878ea36e2",
              "customercode": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC",
              "leave_before": "2025-09-17T12:50:01",
              "status": 0,
              "statustext": "neutral",
              "comments": null,
              "refund": "50"
            }
          ]

3. Примеры вывода команд `dm-cli account`:

   `dm-cli account status mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp:`

       Hello, mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp!

       Your account status: Open

       ----- BITCOIN PUBLIC KEY -----

       024f226cd37ab7e768de7b68946d661d067ef1d58a183254225a4f91f6ae8918ee

       ----- PGP PUBLIC KEY -----

       pub  1024R/49dfccb97b9074c6 2025-08-04

       uid Account_URL (https://example-3208928123.com)
       sig  sig   49dfccb97b9074c6 2025-08-04

       sub  1024R/4060f9d47d382de2 2025-08-04
       sig sbind  49dfccb97b9074c6 2025-08-04

       ----- ACCOUNT URL LIST -----

       https://example-3208928123.com

       ----- TRUSTED URL LIST -----

       http://170.75.173.70:4999
       https://placard.zr-code.com
       https://testnet.bitdeals.org
       http://placard.zr-code.com
       http://testnet-dm.bitdeals.org
       https://testnet-dm2.bitdeals.org
       http://testnet-dm2.bitdeals.org
       http://localhost:4999
       http://testnet.bitdeals.org
       http://placard.bitdeals.org
       https://placard.bitdeals.org
       https://testnet-dm.bitdeals.org
       https://testnet2.bitdeals.org
       http://testnet2.bitdeals.org
       https://placard2.bitdeals.org
       http://placard2.bitdeals.org
       https://example-3208928123.com

       -----
       Thank you,
       BitDeals.

   `dm-cli account --info mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC:`

       bitcoin: mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC
       btckey: 02128188a04564583a8540bcd584116d7de1d04dbbcc79c8fd5d45e6a1a65c7031
       bitmessage: BM-2cWUG4jmW9CwKtNYv6nrJFTiNL4f8Ys8Dd
       pgpkey: |
         -----BEGIN PGP PUBLIC KEY BLOCK-----

         mI0EaByQKQEEAMfwUb7ErrEBDLkjYNwxFvzqdekC3+gR/GpyKOz55kNX/Cwm6ohS
         kNJGVlTR73pXSrQV0c14Dwzgf+HCBFamx1toOCW72GytX71aom2uXHLy8JOzc7bk
         aQ+wLti0ghx+cdwvgRuJV5co2tlTxh87iariasP3Dgas4wtRrNvDcQNNABEBAAG0
         JEFjY291bnRfVVJMIChodHRwOi8vcmFuZG9tLXNpdGUuY29tKYjOBBMBCgA4FiEE
         nvbbPXqkDv91aLC/44t8noXtKDgFAmgckCkCGwMFCwkIBwMFFQoJCAsFFgIDAQAC
         HgECF4AACgkQ44t8noXtKDhovwP/eSVEE4234FPSAbI04DFSwt+TtwTqlFHV4O0d
         IzoGHNrQDB/jROugZtRsYR5mQtKbRuSSZTxZZikoJAufG3GBaq4JbDVsYQWRYl/G
         cxmOlS3u+qzjLCDKnn7VDDer+Ewbj2Cc4feH4eJe5vk7TOlXRAfPjV+Mm1gxTVUg
         cw44f624jQRoHJApAQQAu1u/UED5BYEblglb399KDyWHWRPSgM7yQvQHSUxUG4y9
         vzyDC303Hj238RI3AsYRF61EoriHlwAibf2d5LXwPpQrBuKyAzOPus3AIsVPqerK
         aQB9poEpdHFr6qhDBumm1uHDKeFMhMcObI0Spz1Y5vUfJq5bMV3KGoYcxlac5bEA
         EQEAAYi2BBgBCgAgFiEEnvbbPXqkDv91aLC/44t8noXtKDgFAmgckCkCGwwACgkQ
         44t8noXtKDj1uwP+IS11c2N2dGLzpTHdujN1NVrvPxGur3lAxIidG57fGwK76RYm
         CrXws6SHORphBUw8nYzE1k9ZTOaZ4c/cNYYpDv6sxYqbFcco5WB1BnGUqtXUj4eK
         8vtje+VeZ+DOPmjUIEd3lMcTJo9sUXzLUxwiFIk89IGXSieOJ5QL+8M/M38=
         =4NLS
         -----END PGP PUBLIC KEY BLOCK-----

   `dm-cli account --feedbacks p mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp:`

       - deal: ff5f337f-e0ab-4515-857f-3a0c8530dcd3
         date: '2025-10-05T15:29:23'
         statustext: positive
         comments: positive comment about the deal
       - deal: b7657c83-1502-4a33-8d35-4317a8d5e086
         date: '2025-09-17T10:44:50'
         statustext: positive
         comments: null
       - deal: 1a79222f-401c-4a73-8f3f-3f0184db3fbb
         date: '2025-08-04T10:42:36'
         statustext: positive
         comments: null
       - deal: ecc50f4c-4477-4eee-84b7-f8b2ba3755a3
         date: '2025-08-04T08:42:46'
         statustext: positive
         comments: null
       - deal: aa7ff721-8b15-42f4-8de0-a79bdf47fd55
         date: '2025-08-01T08:46:16'
         statustext: positive
         comments: null
       - deal: 34010ce2-6775-474d-8316-3bbcea736d8e
         date: '2025-08-01T08:14:23'
         statustext: positive
         comments: null

   `dm-cli account --rating mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC:`

       created: 2023-03-15
       seller:
         count: 11
         positive: 5
       customer:
         count: 604
         positive: 36

### 3.3. Изменение учётных данных пользователя

1. Запрос должен происходить в соответствии с синтаксисом:

   `Пример сообщения 'dm-cli account update --help':`

   На английском:

       Usage: dm-cli account update [options] <bitcoin_address>

           Update user account data.

           To change the account data you should sign the current date and new user data
           with your bitcoin private key. For example, current date, new bitmessage, signature:
           2020-01-01
           BM-2cUuxYUFWLCrtpKRMdHCpU1QKEuFtHh7vu
           IEF1ysyhu8ps0m5xSJaZZg/5hBylmcWQQggkGO7yNN8iMf/EA2O287kxi58xCDDtxvdsC0TWqylVE5MT5CouamU=

           -d|--date <yyyy-mm-dd>    Current date.
           -s|--signature <sig>      Bitcoin signature.
           -p|--pgp <pgp>            Set up an armored RSA pgp key.
           -u|--url [+/-]<url>       Add/remove an url to trusted list.
           -b|--bitmessage           Change bitmessage address.

   На русском:

       Использование: dm-cli account update [параметры] <биткоин адрес>

           Изменить учётные данные пользователя.

           Для изменения учётных данных вы должны подписать текущую дату и новые данные пользователя
           вашим приватным биткоин ключом. Например, текущая дата, новый битмессадж, подпись:
           2020-01-01
           BM-2cUuxYUFWLCrtpKRMdHCpU1QKEuFtHh7vu
           IEF1ysyhu8ps0m5xSJaZZg/5hBylmcWQQggkGO7yNN8iMf/EA2O287kxi58xCDDtxvdsC0TWqylVE5MT5CouamU=

           -d|--date <yyyy-mm-dd>    Текущая дата.
           -s|--signature <sig>      Биткоин подпись.
           -p|--pgp <pgp>            Установить armored RSA pgp ключ.
           -u|--url [+/-]<url>       Добавить/удалить url в trusted список.
           -b|--bitmessage           Изменить битмессадж адрес.

2. Примеры входных и выходных данных.

   1. Добавлиение url в trusted список пользователя `mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp`:

          curl -X POST "https://testnet-dm2.bitdeals.org/api/v1/client/update" \
              -H "Content-Type: application/json" \
              -d '{"address":"mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp","date":"2025-10-21","url":["https://testnet-dm2.bitdeals.org"],"sign":"IAGHICUSCxUrcWTMSL9j94vRufb9l5nBckahT+RznlHMPx9LTPpDHsozxVyxkpjtgrhC8eCyJKNaOw8U/v56pL0="}'

      `Пример ответа:`

          {"id": "2838be66674f610b06746deb3654a641cf25cc73cb", "action": "Update", "address": "mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp", "result": {"success": true, "message": "Account updated"}, "payload": " "}

3. Пример вывода команды `dm-cli account update`:

   `dm-cli account update -d 2025-10-21 -s "IAGH…​pL0=" -u "https://testnet-dm2.bitdeals.org" mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp:`

       success: true
       message: Account updated

4. Команда должна производить изменение данных пользователя:

   1. PGP ключа

   2. Списка Trusted URL

   3. Bitmessage адреса

### 3.4. Создание сделки

1. Запрос должен происходить в соответствии с синтаксисом:

   `Пример сообщения 'dm-cli deal create --help':`

   На английском:

       Usage: dm-cli deal create [options]

           Create a new deal

           [smhd] means seconds, minutes, hours, days.
           For example: --leave-before 2020-01-01, or --leave-before 10d.

           -a|--at                   Deal site
           -s|--seller               Seller user in deal
           -c|--customer             Customer user in deal
           -t|--type [prepayment|postpayment]
                                     Deal type
           -s|--sum                  Deal sum in BTC
           -l|--leave-before { <yyyy-mm-dd> [hh:mm:ss UTC] | <time>[smhd] }
                                     Deal end date (deal duration); default: 14d
           -p|--pay { <yyyy-mm-dd> [hh:mm:ss UTC] | <time>[smhd] }
                                     Time for make payment; default: 1d

   На русском:

       Использование: dm-cli deal create [параметры]

           Создать новую сделку

           [smhd] означает секунды, минуты, часы, дни.
           Например: --leave-before 2020-01-01, or --leave-before 10d.

           -a|--at                   Сайт проведения сделки
           -s|--seller               Продавец в сделке
           -c|--customer             Покупатель в сделке
           -t|--type [prepayment|postpayment]
                                     Тип сделки
           -s|--sum                  Сумма сделки в BTC
           -l|--leave-before { <гггг-мм-дд> [чч:мм:сс UTC] | <время>[smhd] }
                                     Время окончания сделки (длительность сделки), по умолчанию: 14d
           -p|--pay { <гггг-мм-дд> [чч:мм:сс UTC] | <время>[smhd] }
                                     Время для оплаты сделки; по умолчанию: 1d

2. Примеры входных и выходных данных.

   1. Запрос создания сделки:

          curl -X POST "https://testnet-dm2.bitdeals.org/api/v1/deal/create" \
              -H "Content-Type: application/json" \
              -d '{"at":"https://testnet-dm2.bitdeals.org","type":"Prepayment","seller":{"address":                               "mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp"},"customer":{"address":"mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC"},"payment":{"sum":"0.01000000"}}'

      `Пример ответа:`

          {"id": "f38bfeeb1ddac852", "action": "Created", "address": "mynFyJJkRhsbB6y1Q5kTgDGckVz2m9NKH8", "deal": {"order": "Created", "type": "Prepayment", "code": "ae6d226b2fe5ce009f252e65fcf66fd079729ac8", "at": "https://testnet-dm2.bitdeals.org", "date": "2025-10-21 09:08:12 UTC", "salt": "343c82c2", "seller": {"address": "mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp", "rating": "0+, 32%"}, "customer": {"address": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC", "rating": "0+, 45%"}, "payment": {"address": "2N7gRqGakSZaowyqSHSULaPzp7Fy2KKUQQ7", "until": "2025-10-22 09:08:12 UTC", "sum": "0.01 tBTC"}, "feedback": {"leave_before": "2025-11-04 09:08:12 UTC"}}, "result": {"success": true, "message": "New deal created"}, "payload": " "}

3. Пример вывода команды `dm-cli deal create`:

   `Пример вывода команды 'dm-cli deals create -t prepayment -s mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp -c mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC -s 0.01:`

       -----BEGIN PGP SIGNED MESSAGE-----
       Hash: SHA512

       deal:
         order: Confirmed
         type: Prepayment
         at: https://testnet-dm2.bitdeals.org
         date: 2025-10-21 09:08:12 UTC
         salt: 343c82c2
         seller:
           address: mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp
           rating: 600+, 32%
         customer:
           address: mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC
           rating: 600+, 36%
         payment:
           address: 2N7gRqGakSZaowyqSHSULaPzp7Fy2KKUQQ7
           until: 2025-10-22 09:08:12 UTC
           sum: 0.01 tBTC
         feedback:
           leave-before: 2025-11-04 09:08:12 UTC
           status: None
       -----BEGIN PGP SIGNATURE-----
       Version: cc

       wpwEAQEKAAYFAmj3UBgACgkQDjku08Oit1JLogQA0PofMslTfBrNCKFfdlAgj/8A
       03lXiHPRd36PVzaa8lK6tHmdfs0EFrp28InXLswfksXD/0Hj9SBKrDQz1qxwqXqZ
       rGC1RiXqRpHxl++3/lx3AguPPX5QydjDEwKSA3lL2pnsnnqe2edqUttJzunz9LYy
       mhdbFlS1jaFzO0w25Ww=
       =1TmH
       -----END PGP SIGNATURE-----

4. Команда должна создавать сделку с учётом указанных параметров:

   - Место (сайт) проведения сделки [`deal.at`];

   - Стороны сделки [`seller`, `customer`];

   - Тип сделки [`Prepayment`, `Postpayment`];

   - Сумма сделки в BTC [`payment.sum`];

   - Длительность сделки [`feedback.leave-before`];

   - Время для оплаты сделки [`payment.until`];

### 3.5. Статус сделки

1. Запрос должен происходить в соответствии с синтаксисом:

   `Пример сообщения 'dm-cli deal status --help':`

   На английском:

       Usage: dm-cli deal status { <bitcoin_address>|<deal_code> }

           Show a deal data details

           To show a deal details use a bitcoin payment address or a deal code.

           -i|--is-paid              Check a deal is Paid. Returns an exit code 0 if deal is Paid, or non-zero otherwise.

   На русском:

       Использование: dm-cli deal status { <биткоин адрес>|<код сделки> }

           Показать детали сделки

           Чтобы показать детали сделки используйте адрес оплаты сделки или код сделки.

           -i|--is-paid              Проверить является ли сделка оплаченной. Возвращает exit code 0 если сделка является оплаченной, или не ноль в других случаях.

2. Примеры входных и выходных данных.

   1. Запрос статуса сделки:

          curl -X POST "https://testnet-dm2.bitdeals.org/api/v1/deal/status" \
              -H "Content-Type: application/json" \
              -d '{"address":"3e251d8fdcfa80adf5a3050064fc4ecb01d304d1"}'

      `Пример ответа:`

          {"id": "207022ea5d39ebb2", "action": "Status", "deal": {"order": "Confirmed", "type": "Prepayment", "code": "3e251d8fdcfa80adf5a3050064fc4ecb01d304d1", "at": "https://testnet-dm2.bitdeals.org", "date": "2025-10-21 09:02:11 UTC", "salt": "fd986961", "seller": {"address": "mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp", "rating": "0+, 32%"}, "customer": {"address": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC", "rating": "0+, 36%"}, "payment": {"address": "2NCBgmt37qw97ujZFjgmPEWuoYweR4BWT9g", "until": "2025-10-22 09:02:11 UTC", "sum": "0.01 tBTC"}, "feedback": {"leave_before": "2025-11-04 09:02:11 UTC"}}, "result": {"success": true, "message": "Deal status"}, "payload": " "}

3. Пример вывода команды `dm-cli deal status`:

   `Пример вывода команды dm-cli deal status 2N7gRqGakSZaowyqSHSULaPzp7Fy2KKUQQ7:`

       -----BEGIN PGP SIGNED MESSAGE-----
       Hash: SHA512

       deal:
         order: Create
         type: Prepayment
         at: https://testnet-dm2.bitdeals.org
         date: 2025-10-21 09:08:12 UTC
         salt: 343c82c2
         seller:
           address: mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp
           rating: 0+, 32%
         customer:
           address: mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC
           rating: 0+, 45%
         payment:
           address: 2N7gRqGakSZaowyqSHSULaPzp7Fy2KKUQQ7
           until: 2025-10-22 09:08:12 UTC
           sum: 0.01 tBTC
         feedback:
           leave-before: 2025-11-04 09:08:12 UTC
       -----BEGIN PGP SIGNATURE-----
       Version: cc

       wpwEAQEKAAYFAmj3TYAACgkQDjku08Oit1IGSgP+LAdxiF+6JHHZCXrZ6QGtxYu4
       xgFyrnoqfCzqiM1VQu08llDmRvuhTLL0PMLqPgWQF/E0JrKtOGubdUbPBijJnm8x
       bUbcs4Z8KHr6N8DaEwg9OLASXnzUDes0hBP2l4Eb+RpZaQv8T1ATymZTKwn3mm29
       6h/HKBuGKHWcU60ngCg=
       =dQwF
       -----END PGP SIGNATURE-----

4. Проверка `--is-paid` должна проверять состояние оплаты сделки на основе полученного текста деталей сделки. Для `order: Paid`, `order: Completed`, `order: Executed` - сделка оплачена, соответсвенно, exit code команды должен быть равен 0.

### 3.6. Завершение сделки

1. Запрос должен происходить в соответствии с синтаксисом:

   `Пример сообщения 'dm-cli deal complete --help':`

   На английском:

       Usage: dm-cli deal complete [options] { <bitcoin_address>|<deal_code> }

           Complete a deal

           -p|--positive             Complete deal with positive feedback. (default action)
           -r|--refund <num>         Refund % number of a deal sum to the customer. Format: 100.00[%]

   На русском:

       Использование: dm-cli deal complete [параметры] { <биткоин адес>|<код сделки> }

           Завершить сделку

           -p|--positive             Завершить сделку с позитивным отзывом. (действие по умолчанию)
           -r|--refund <num>         Возврат % от суммы сделки покупателю. Формат: 100.00[%]

2. Примеры входных и выходных данных.

   1. Запрос завершения сделки:

          curl -X POST "https://testnet-dm2.bitdeals.org/api/v1/deal/complete" \
              -H "Content-Type: application/json" \
              -d '{"order":"Paid","type":"Postpayment","code":"d87cc05dd42bf4fb6cc5d231388a254de94b787a","at":"https://testnet-dm2.bitdeals.org","date":"2025-10-21 11:36:26 UTC","salt":"8f489443","seller":{"address":"mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp","rating":"600+, 32%"},"customer":{"address":"mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC","rating":"600+, 36%"},"payment":{"address":"2Mvh1UozwwUwuFcmeCqQm7UEKAxnV4ANhAS","until":"2025-10-22 11:36:26 UTC","sum":"0.01 tBTC"},"feedback":{"leave_before":"2025-11-04 11:36:26 UTC","status":"Neutral","refund":45}}'

      `Пример ответа:`

          {"id": "f1c94f5a62e005b4", "action": "Complete", "deal": {"order": "Complete", "type": "Postpayment", "code": "d87cc05dd42bf4fb6cc5d231388a254de94b787a", "at": "https://testnet-dm2.bitdeals.org", "date": "2025-10-21 11:36:26 UTC", "salt": "8f489443", "seller": {"address": "mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp", "rating": "0+, 32%"}, "customer": {"address": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC", "rating": "0+, 36%"}, "payment": {"address": "2Mvh1UozwwUwuFcmeCqQm7UEKAxnV4ANhAS", "until": "2025-10-22 11:36:26 UTC", "sum": "0.01 tBTC"}, "feedback": {"leave_before": "2025-11-04 11:36:26 UTC", "status": "Neutral"}}, "result": {"success": true, "message": "Completion command accepted"}, "payload": "CgotLS0tLSBSRVBPUlQgLS0tLS0KClBHUCBzaWduYXR1cmU6IDxmb250IGNvbG9yPSIjMTQ1QTMyIj48Yj52YWxpZC4KPC9iPjwvZm9udD5Nb2R1bGU6IG15bkZ5SkprUmhzYkI2eTFRNWtUZ0RHY2tWejJtOU5LSDgKCkZlZTogMSU="}

3. Пример вывода команды `dm-cli deal complete`:

   `Пример вывода команды dm-cli deal complete -r 45 2Mvh1UozwwUwuFcmeCqQm7UEKAxnV4ANhAS:`

       success: true
       message: Completion command accepted

### 3.7. Отмена сделки

1. Запрос должен происходить в соответствии с синтаксисом:

   `Пример сообщения 'dm-cli deal cancel --help':`

   На английском:

       Usage: dm-cli deal cancel [options] <bitcoin_address>

           Cancel a deal

           To cancel a deal you should sign the deal payment address and feeback text message
           with the seller bitcoin private key. For example, address, feedback, signature:
           2NEVoXnRgUeb3j17s7pP6DoFHBVHMb94gF5
           seller random cancel reason text
           IEOGJ5q/a2cWJPMosQmCHNN6RsXF8Xy/UgaazIoY2i5udbw/v38g1/PdWs451dvFr9Iq/Bq5YL2YdpUFTuijQ60=

           -m|--message <text>       Deal cancel reason text message
           -s|--signature <sig>      Bitcoin signature.

   На русском:

       Использование: dm-cli deal cancel [параметры] <биткоин адрес>

           Отменить сделку

           Для отмены сделки вы должны подписать адрес оплаты сделки и текст отзыва биткоин
           ключом продавца. Например, адрес, отзыв, подпись:
           2NEVoXnRgUeb3j17s7pP6DoFHBVHMb94gF5
           seller random cancel reason text
           IEOGJ5q/a2cWJPMosQmCHNN6RsXF8Xy/UgaazIoY2i5udbw/v38g1/PdWs451dvFr9Iq/Bq5YL2YdpUFTuijQ60=

           -m|--message <text>       Текст сообщения с причино отмены сделки
           -s|--signature <sig>      Биткоин подпись.

2. Примеры входных и выходных данных.

   1. Запрос завершения сделки:

          curl --location 'https://testnet-dm2.bitdeals.org/api/v1/deal/cancel' \
          --form 'type="Postpayment"' \
          --form 'at="https://testnet-dm2.bitdeals.org"' \
          --form 'date="2025-10-21 11:59:41 UTC"' \
          --form 'salt="98b00a5e"' \
          --form 'seller_address="mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp"' \
          --form 'seller_rating="600+, 32%"' \
          --form 'seller_signature="IERJW29usD99pIkyJktK7z24fxdWncr9GoN/bBvfeHELDNj2aMSOC0JzNqQbnnsT3ETA9mEB9gj5YF+AD4ACuwE="' \
          --form 'customer_address="mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC"' \
          --form 'customer_rating="600+, 36%"' \
          --form 'payment_address="2Mt7UW5RqXUaEN7Y93jo67ZgixcLNPDgvvk"' \
          --form 'payment_until="2025-10-22 11:59:41 UTC"' \
          --form 'payment_sum="0.01 tBTC"' \
          --form 'feedback_leave_before="2025-11-04 11:59:41 UTC"' \
          --form 'feedback_status="None"' \
          --form 'feedback_comments="Cancellation comments"'

      `Пример ответа:`

          {"id": "3f1b2d6409bfa4bd", "action": "Cancelled", "address": "mynFyJJkRhsbB6y1Q5kTgDGckVz2m9NKH8", "deal": {"order": "Cancelled", "type": "Postpayment", "code": "6e7fa8bdd6f406bf3f5d253b67730523ea62b03f", "at": "https://placard.bitdeals.org", "date": "2024-10-23 10:34:09 UTC", "salt": "6cbf5879", "seller": {"address": "mnumHs9HQMrw2Q1iKLNnx9NzExS7nMLmyp", "rating": "0, 0%"}, "customer": {"address": "mraXx7JrmAmuKypdJ1vseQBXySsdRZE5AC", "rating": "0, 0%"}, "payment": {"address": "2NFgvA4f8ibA5jJ6hca1dX9HvBguNTgP6eR", "until": "2024-10-23 15:34:09 UTC", "sum": "0.00519519 tBTC"}, "feedback": {"leave_before": "2025-07-10 10:34:09 UTC", "status": "Positive", "comments": "random deal cancel message"}}, "result": {"success": true, "message": "Deal cancelled"}, "payload": "CgotLS0tLSBSRVBPUlQgLS0tLS0KClBHUCBzaWduYXR1cmU6IDxmb250IGNvbG9yPSIjMTQ1QTMyIj48Yj52YWxpZC4KPC9iPjwvZm9udD5Nb2R1bGU6IG15bkZ5SkprUmhzYkI2eTFRNWtUZ0RHY2tWejJtOU5LSDgKCkZlZTogMSU="}

3. Пример вывода команды `dm-cli deal cancel`:

   `Пример вывода команды dm-cli deal cancel -m "Cancellation comments" -s "CgoL…​MSU=" 2Mt7UW5RqXUaEN7Y93jo67ZgixcLNPDgvvk:`

       success: true
       message: Deal cancelled

### 3.8. Оставление негативного отзыва

1. Запрос должен происходить в соответствии с синтаксисом:

   `Пример сообщения 'dm-cli deal negative --help':`

   На английском:

       Usage: dm-cli deal negative [options] <bitcoin_address>

           Leave a negative feedback

           To leave a negative feedback you should sign the deal payment address and feeback text message
           with the customer bitcoin private key. For example, address, feedback, signature:
           2NEVoXnRgUeb3j17s7pP6DoFHBVHMb94gF5
           customer random feedback text
           H1u44C5cyEeKjHqnNnn09B8mIRMdqgR8PD9AeF8mv+cCEqM9HPkcWLrc8a/v2po2YmXJSeya6uy0XaLnmmmO/1o=

           -m|--message <text>       Deal feedback text message
           -s|--signature <sig>      Bitcoin signature.

   На русском:

       Использование: dm-cli deal negative [options] <биткоин адрес>

           Оставить негативный отзыв

           Для оставления негативного отзыва ва должны подписать адрес оплаты сделки и текст отзыва биткоин
           ключом покупателя. Например, адрес, отзыв, подпись:
           2NEVoXnRgUeb3j17s7pP6DoFHBVHMb94gF5
           customer random feedback text
           H1u44C5cyEeKjHqnNnn09B8mIRMdqgR8PD9AeF8mv+cCEqM9HPkcWLrc8a/v2po2YmXJSeya6uy0XaLnmmmO/1o=

           -m|--message <text>       Текст сообщения отзыва
           -s|--signature <sig>      Биткоин подпись.

2. Примеры входных и выходных данных.

   1. Запрос завершения сделки:

      `Пример ответа:`

3. Пример вывода команды `dm-cli deal negative`:

   `Пример вывода команды dm-cli deal negative:`

4. В результате исполнения команды, указанная сделка должна получить негативный отзыв (status: Negative).