@v3finance/core-sdk 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +6 -2
  3. package/dist/cjs/core/gated.d.ts +9 -3
  4. package/dist/cjs/core/gated.d.ts.map +1 -1
  5. package/dist/cjs/core/gated.js +9 -3
  6. package/dist/cjs/core/gated.js.map +1 -1
  7. package/dist/cjs/core/http.d.ts.map +1 -1
  8. package/dist/cjs/core/http.js +17 -3
  9. package/dist/cjs/core/http.js.map +1 -1
  10. package/dist/cjs/generated/operations.js +1 -1
  11. package/dist/cjs/generated/types.d.ts +30 -14
  12. package/dist/cjs/generated/types.d.ts.map +1 -1
  13. package/dist/cjs/resources/addresses.d.ts +4 -3
  14. package/dist/cjs/resources/addresses.d.ts.map +1 -1
  15. package/dist/cjs/resources/addresses.js +4 -3
  16. package/dist/cjs/resources/addresses.js.map +1 -1
  17. package/dist/cjs/resources/approvals.d.ts +22 -0
  18. package/dist/cjs/resources/approvals.d.ts.map +1 -1
  19. package/dist/cjs/resources/approvals.js +22 -0
  20. package/dist/cjs/resources/approvals.js.map +1 -1
  21. package/dist/cjs/resources/transfers.d.ts +81 -17
  22. package/dist/cjs/resources/transfers.d.ts.map +1 -1
  23. package/dist/cjs/resources/transfers.js +81 -17
  24. package/dist/cjs/resources/transfers.js.map +1 -1
  25. package/dist/cjs/resources/types.d.ts +0 -4
  26. package/dist/cjs/resources/types.d.ts.map +1 -1
  27. package/dist/cjs/version.d.ts +1 -1
  28. package/dist/cjs/version.js +1 -1
  29. package/dist/esm/core/gated.d.ts +9 -3
  30. package/dist/esm/core/gated.d.ts.map +1 -1
  31. package/dist/esm/core/gated.js +9 -3
  32. package/dist/esm/core/gated.js.map +1 -1
  33. package/dist/esm/core/http.d.ts.map +1 -1
  34. package/dist/esm/core/http.js +17 -3
  35. package/dist/esm/core/http.js.map +1 -1
  36. package/dist/esm/generated/operations.js +1 -1
  37. package/dist/esm/generated/types.d.ts +30 -14
  38. package/dist/esm/generated/types.d.ts.map +1 -1
  39. package/dist/esm/resources/addresses.d.ts +4 -3
  40. package/dist/esm/resources/addresses.d.ts.map +1 -1
  41. package/dist/esm/resources/addresses.js +4 -3
  42. package/dist/esm/resources/addresses.js.map +1 -1
  43. package/dist/esm/resources/approvals.d.ts +22 -0
  44. package/dist/esm/resources/approvals.d.ts.map +1 -1
  45. package/dist/esm/resources/approvals.js +22 -0
  46. package/dist/esm/resources/approvals.js.map +1 -1
  47. package/dist/esm/resources/transfers.d.ts +81 -17
  48. package/dist/esm/resources/transfers.d.ts.map +1 -1
  49. package/dist/esm/resources/transfers.js +81 -17
  50. package/dist/esm/resources/transfers.js.map +1 -1
  51. package/dist/esm/resources/types.d.ts +0 -4
  52. package/dist/esm/resources/types.d.ts.map +1 -1
  53. package/dist/esm/version.d.ts +1 -1
  54. package/dist/esm/version.js +1 -1
  55. package/docs/concepts.md +7 -4
  56. package/docs/errors.md +54 -16
  57. package/package.json +1 -1
  58. package/src/core/gated.ts +9 -3
  59. package/src/core/http.ts +17 -3
  60. package/src/generated/operations.ts +1 -1
  61. package/src/generated/types.ts +31 -14
  62. package/src/resources/addresses.ts +4 -3
  63. package/src/resources/approvals.ts +22 -0
  64. package/src/resources/transfers.ts +81 -17
  65. package/src/resources/types.ts +0 -4
  66. package/src/version.ts +1 -1
@@ -229,8 +229,8 @@ export interface AddressDetail {
229
229
  tokenId: string | null;
230
230
  /** format: date-time */
231
231
  createdAt: string;
232
- /** Сводка совместного доступа. Приходит в списке и детали адреса; PATCH /addresses/{id} переиспользует эту же схему и sharing НЕ возвращает */
233
- sharing?: SharingSummary;
232
+ /** Сводка совместного доступа. Приходит всегда: в списке, ответе PATCH и детали адреса */
233
+ sharing: SharingSummary;
234
234
  /** Код токена адреса (из segmentsJson + asset route) */
235
235
  asset: string | null;
236
236
  assetName: string | null;
@@ -297,6 +297,7 @@ export interface OutgoingTxSummary {
297
297
  status: string;
298
298
  txHash: string | null;
299
299
  fee: string | null;
300
+ /** Причина закрытия — только у failed/rejected/cancelled. У остальных статусов (awaiting_approval, pending, submitted, confirmed) — ВСЕГДА null: у незакрытого перевода причины отказа нет. Неясный исход исполнения (pending, транзакция могла уйти в сеть) здесь не показывается — его признак pending дольше 10 минут по updatedAt («ждёт сверки администратором») */
300
301
  failureReason: string | null;
301
302
  /** format: date-time */
302
303
  createdAt: string;
@@ -461,8 +462,8 @@ export interface AddressListItem {
461
462
  assetSymbol: string | null;
462
463
  /** Баланс в decimal (по token.decimals). NULL — ledger-счёта ещё нет */
463
464
  balanceDecimal: string | null;
464
- /** Сводка совместного доступа. Приходит в списке и детали адреса; PATCH /addresses/{id} переиспользует эту же схему и sharing НЕ возвращает */
465
- sharing?: SharingSummary;
465
+ /** Сводка совместного доступа. Приходит всегда: в списке, ответе PATCH и детали адреса */
466
+ sharing: SharingSummary;
466
467
  /** Владелец адреса (создатель) с UI-метаданными */
467
468
  owner: MemberCard | null;
468
469
  access: AddressAccess;
@@ -745,11 +746,11 @@ export interface ApprovalRequestDetail {
745
746
  }
746
747
  export interface ApprovalRequestEvent {
747
748
  id: string;
748
- /** created|voted|approved|rejected|cancelled|applied|apply_failed|stale */
749
+ /** created|voted|approved|rejected|cancelled|applied|apply_failed|stale|folder_skipped. folder_skipped идёт ПОСЛЕ applied: адрес по заявке create_address создан, но в папку, выбранную при подаче, не положен (папку удалили или у инициатора отозвали право) — причина в comment */
749
750
  type: string;
750
751
  actorId: string | null;
751
752
  decision: string | null;
752
- /** Пояснение ПОДПИСАНТА. У события applied всегда null — id созданного объекта лежит в resultId, чтобы клиент не напечатал его как комментарий */
753
+ /** У voted — пояснение ПОДПИСАНТА; у stale, apply_failed и folder_skipped — системное пояснение для человека. У события applied всегда null — id созданного объекта лежит в resultId, чтобы клиент не напечатал его как комментарий */
753
754
  comment: string | null;
754
755
  /** Только у applied: id созданного/изменённого объекта */
755
756
  resultId: string | null;
@@ -1250,7 +1251,7 @@ export interface CreateAddressBody {
1250
1251
  * length: 1..16
1251
1252
  */
1252
1253
  emoji?: string;
1253
- /** Создать адрес В группу адресов (нужно право create_address на группе). Новый адрес — member группы, доступен её участникам */
1254
+ /** Создать адрес В группу адресов (нужно право create_address на группе). Новый адрес — member группы, доступен её участникам. Если создание ушло на подпись (202), папка сохраняется в заявке, а право на неё перепроверяется при применении: отозвали — адрес создаётся без папки, с оговоркой applyWarnings в ответе голосования. При прямом создании (201) то же — оговорка `warnings` в теле ответа */
1254
1255
  groupId?: string;
1255
1256
  }
1256
1257
  export interface CreateAddressGroupBody {
@@ -1274,6 +1275,14 @@ export interface CreateAddressResult {
1274
1275
  label: string | null;
1275
1276
  description: string | null;
1276
1277
  };
1278
+ /** Создано, но не всё: адрес есть, а в папку из `groupId` не положен. Право на папку роут проверяет до создания (иначе 403), а запись членства — уже после Wallet Service и мониторинга; право могли отозвать в этом окне или запись могла не пройти. Есть только когда непусто; не показывать адрес в папке, если оговорка пришла */
1279
+ warnings?: FolderSkipWarning[];
1280
+ }
1281
+ export interface FolderSkipWarning {
1282
+ /** FOLDER_NOT_FOUND — папку удалили; FOLDER_FORBIDDEN — у создателя адреса больше нет права заводить в неё адреса; FOLDER_WRITE_FAILED — сбой записи */
1283
+ code: "FOLDER_NOT_FOUND" | "FOLDER_FORBIDDEN" | "FOLDER_WRITE_FAILED";
1284
+ /** Готовая фраза для человека */
1285
+ message: string;
1277
1286
  }
1278
1287
  export interface CreateCompositeBody {
1279
1288
  /**
@@ -1617,7 +1626,7 @@ export interface CreateTransactionResult {
1617
1626
  amountDecimal: string;
1618
1627
  asset: string;
1619
1628
  network: string;
1620
- /** confirmed — новый успешный перевод; pending/failed возможны при replay по idempotencyKey */
1629
+ /** 201 — confirmed (исполнен сейчас); редко pending с заполненным txHash (транзакция ушла в сеть, а учёт не записался — доводит сверка, повторять перевод нельзя); 202 — awaiting_approval; 200 (replay по idempotencyKey) — ТЕКУЩИЙ статус перевода, любой: pending (первый запрос ещё исполняется — или его исход неизвестен: первый ответ был 502 TRANSFER_OUTCOME_UNKNOWN; повтор НЕ исполняет перевод заново, исход устанавливает сверка), awaiting_approval, confirmed, failed, rejected, cancelled */
1621
1630
  status: string;
1622
1631
  txHash: string | null;
1623
1632
  fee: string | null;
@@ -1631,12 +1640,13 @@ export interface CreateTransactionResult {
1631
1640
  }
1632
1641
  export interface CreateTransferBody {
1633
1642
  fromAddressId: string;
1643
+ /** Адрес получателя. Формат проверяется по типу сети адреса-отправителя ДО резерва средств: TRON — base58check (34 символа, «T…», контрольная сумма), EVM — 0x + 40 hex (смешанный регистр — контрольная сумма EIP-55). Не подошёл — 400 INVALID_DESTINATION_ADDRESS. Строка проверяется как есть, пробелы по краям — ошибка формата */
1634
1644
  toAddress: string;
1635
1645
  /** DECIMAL строка — конвертируется по token.decimals */
1636
1646
  amount: string;
1637
1647
  asset: string;
1638
1648
  /**
1639
- * Уникальный ключ попытки перевода (рекомендуется: uuid). Повторный запрос с тем же ключом вернёт существующую транзакцию без второго broadcast. Для новой попытки после failed — новый ключ.
1649
+ * Уникальный ключ попытки перевода (рекомендуется: uuid). Повторный запрос с тем же ключом и теми же параметрами вернёт 200 с существующим переводом — без второго broadcast, без повторной оценки политик. Тот же ключ с другими параметрами — 409 IDEMPOTENCY_KEY_REUSED. Для новой попытки после failed — новый ключ.
1640
1650
  *
1641
1651
  * length: 8..128
1642
1652
  */
@@ -1907,6 +1917,7 @@ export interface HistoryOutItem {
1907
1917
  asset: string;
1908
1918
  assetSymbol: string;
1909
1919
  fee: string | null;
1920
+ /** Причина закрытия — только у failed/rejected/cancelled. У остальных статусов (awaiting_approval, pending, submitted, confirmed) — ВСЕГДА null: у незакрытого перевода причины отказа нет. Неясный исход исполнения (pending, транзакция могла уйти в сеть) здесь не показывается — его признак pending дольше 10 минут по updatedAt («ждёт сверки администратором») */
1910
1921
  failureReason: string | null;
1911
1922
  fromAddress: {
1912
1923
  id: string;
@@ -2983,7 +2994,7 @@ export interface RatesResponse {
2983
2994
  }>;
2984
2995
  }
2985
2996
  export interface ReconcileTransferBody {
2986
- /** Хеш от подписывающего сервиса. ЕСТЬ — транзакция ушла в сеть, перевод доводится до confirmed. НЕТ (или null) — считаем, что broadcast'а не было, и возвращаем резерв (failed) */
2997
+ /** Хеш от подписывающего сервиса. ЕСТЬ — транзакция ушла в сеть, перевод доводится до confirmed. НЕТ (или null) — сверяющий утверждает, что broadcast'а не было, и резерв возвращается (failed). Для pending с неясным исходом (у pending без txHash его не отличить по ответам API — failureReason у незакрытого перевода null) это утверждение нужно ПРОВЕРИТЬ по сети: возврат за ушедшую транзакцию печатает деньги. Если у pending-перевода хеш уже сохранён (broadcast прошёл), он обязателен: без него — 409 TRANSFER_BROADCAST, с другим — 409 TXHASH_MISMATCH (сохранённый — в error.details.txHash) */
2987
2998
  txHash?: string | null;
2988
2999
  /** Комиссия, если известна */
2989
3000
  fee?: string | null;
@@ -2991,7 +3002,8 @@ export interface ReconcileTransferBody {
2991
3002
  reason?: string | null;
2992
3003
  }
2993
3004
  export interface ReconcileTransferResult {
2994
- status: "confirmed" | "failed";
3005
+ /** Статус перевода после сверки: confirmed (по хешу) | failed (резерв возвращён). rejected/cancelled — у закрытого перевода с невозвращённым резервом: резерв возвращён, статус прежний */
3006
+ status: "confirmed" | "failed" | "rejected" | "cancelled";
2995
3007
  txHash: string | null;
2996
3008
  }
2997
3009
  export interface RegisterPushTokenBody {
@@ -3010,8 +3022,9 @@ export interface RequestVoteResult {
3010
3022
  approvals: number;
3011
3023
  /** range: -9007199254740991..9007199254740991 */
3012
3024
  threshold: number;
3013
- /** true — этот голос финализировал заявку (применена/отклонена) */
3025
+ /** true — этот голос финализировал заявку (применена/отклонена). У заявки на перевод status=APPROVED при finalized=false значит, что исход рассчитал НЕ этот вызов: applyError пуст — перевод исполняет (исполнил) параллельный запрос ЛИБО исполнение, начатое другим вызовом, оборвалось (сам перевод тогда не закроется); исход — только по GET /transfers/{id}: confirmed/failed, а pending дольше 10 минут по updatedAt — ждёт сверки (admin). applyError TRANSFER_EXECUTION_FAILED — к моменту одобрения перевод уже не ждал подписей. finalized=false с пустым applyError приходит и тогда, когда одобрил ЭТОТ голос, но исход перевода им не установлен (перевод pending: подписывающий сервис не дал определённого ответа, транзакция могла уйти в сеть, а могла и нет): показывайте «голос учтён», не «применено». finalized=true с пустым applyError у перевода — исполнен этим вызовом (confirmed) */
3014
3026
  finalized: boolean;
3027
+ /** Голос финализировал заявку, а применение не дало результата; status при этом итоговый. Коды: STALE — цель изменилась (status=REJECTED); APPLY_FAILED / APPLY_FAILED_ROLLED_BACK / APPLY_FAILED_PARTIAL — мутация не применена (целиком / цепочка откатана / частично). У action=transfer финальный approve ИСПОЛНЯЕТ перевод, status=APPROVED: TRANSFER_EXECUTION_FAILED — перевод не исполнен (обычно failed, резерв возвращён; точный статус — GET /transfers/{id}; при finalized=false — перевод уже не ждал подписей, одобрение его не исполняло). Неясный исход перевода (подписывающий сервис не дал определённого ответа, перевод pending, средства зарезервированы, транзакция могла уйти в сеть, исход установит сверка, admin) ошибкой НЕ отдаётся: applyError null, status APPROVED, finalized=false. Кода TRANSFER_OUTCOME_UNKNOWN здесь нет — он только у POST /transfers */
3015
3028
  applyError: {
3016
3029
  code: string;
3017
3030
  message: string;
@@ -3019,6 +3032,8 @@ export interface RequestVoteResult {
3019
3032
  resolvedResultId: string | null;
3020
3033
  /** Только для композитных заявок: прогресс по шагам */
3021
3034
  stepsProgress?: StepProgress[];
3035
+ /** Применено, но не всё: адрес по заявке create_address создан (resolvedResultId), а в папку, выбранную при подаче, не положен. Право на папку проверяется при ПРИМЕНЕНИИ, а не при подаче. Есть только когда непусто; в истории заявки — событие folder_skipped */
3036
+ applyWarnings?: FolderSkipWarning[];
3022
3037
  }
3023
3038
  export interface StepProgress {
3024
3039
  /** range: -9007199254740991..9007199254740991 */
@@ -3169,6 +3184,7 @@ export interface TransactionDetail {
3169
3184
  decisionPolicyCode: string | null;
3170
3185
  /** Человеческое название решающей политики (для UI вместо кода) */
3171
3186
  decisionPolicyName: string | null;
3187
+ /** Причина закрытия — только у failed/rejected/cancelled. У остальных статусов (awaiting_approval, pending, submitted, confirmed) — ВСЕГДА null: у незакрытого перевода причины отказа нет. Неясный исход исполнения (pending, транзакция могла уйти в сеть) здесь не показывается — его признак pending дольше 10 минут по updatedAt («ждёт сверки администратором») */
3172
3188
  failureReason: string | null;
3173
3189
  /** format: date-time */
3174
3190
  createdAt: string;
@@ -3486,7 +3502,7 @@ export interface VoteRequestBody {
3486
3502
  comment?: string;
3487
3503
  }
3488
3504
  export interface VoteResult {
3489
- /** Статус перевода ПОСЛЕ голоса: awaiting_approval (голосов мало) | rejected | confirmed/failed (финальный approve исполняет сразу) */
3505
+ /** Статус перевода ПОСЛЕ голоса: awaiting_approval (голосов мало) | rejected | confirmed/failed (финальный approve исполняет сразу). pending — исполнение не закончено, повторять перевод нельзя; executionError у pending всегда null, исход этим ответом НЕ установлен, ждать его «через секунды» нельзя. Так отдаётся и неясный исход (подписывающий сервис не дал определённого ответа, транзакция могла уйти в сеть, резерв стоит — доводит сверка, admin), и: txHash в GET /transfers/{id} есть — транзакция ушла в сеть, а учёт не записался, доводит сверка (admin) по этому хешу; перевод исполняет параллельный запрос (одновременный голос другого подписанта или исходный вызов при повторе голоса) ЛИБО исполнение оборвалось (клиент, который его начал, отключился — сам перевод тогда не закроется). Различает только время: перечитывайте GET; confirmed/failed — исход; pending дольше 10 минут по updatedAt — «ждёт сверки администратором» */
3490
3506
  status: string;
3491
3507
  /**
3492
3508
  * Собрано approve-голосов
@@ -3496,7 +3512,7 @@ export interface VoteResult {
3496
3512
  approvals: number;
3497
3513
  /** range: -9007199254740991..9007199254740991 */
3498
3514
  threshold: number;
3499
- /** Если финальный approve запустил исполнение и оно упало (средства возвращены) */
3515
+ /** Финальный approve запустил исполнение, и оно перевод НЕ исполнило. code: TRANSFER_EXECUTION_FAILED — не исполнен (status=failed, средства возвращены; исключения: failed с txHash у перевода, см. описание ручки, и status=pending, если сам возврат резерва не записался — тогда перевод доводит сверка). Тот же код — если к моменту одобрения перевод уже не ждал подписей (status — его фактический: failed/rejected/cancelled): одобрение его не исполнило. Неясный исход (подписывающий сервис не дал определённого ответа, транзакция могла уйти в сеть) ошибкой НЕ отдаётся: status=pending, executionError=null — показывайте «исполняется, исход уточняется». Кода TRANSFER_OUTCOME_UNKNOWN в голосе нет, он только у POST /transfers */
3500
3516
  executionError: {
3501
3517
  code: string;
3502
3518
  message: string;