feat(marketplace): expose w.mkt.order as 4th wallet in marketplaceMemberWallet DTO + regen

DTO `MarketplaceMemberWallet.wallets` теперь возвращает массив из 4 USER_SHARED-кошельков
пайщика для Стола заказов:

  1. w.wal.share  — Паевой   | Цифровой Кошелёк
  2. w.wal.member — Членский | Цифровой Кошелёк
  3. w.mkt.member — Членский | Стол Заказов (свободные средства программы)
  4. w.mkt.order  — Резерв   | Стол Заказов (под конкретный Order; новый, 2026-05-28)

Поле `blocked` остаётся в DTO для wallet/withdraw flow и legacy данных, но для
marketplace-кошельков (w.mkt.member, w.mkt.order) всегда `0` после миграции
с BLOCK/UNBLOCK на пары TRANSFER — резерв выражается через `.available`
отдельного кошелька w.mkt.order. Обновлены description'ы @Field и @Query на
бизнес-словаре (без story-ссылок).

Regen:
- cooptypes/ledger2/wallets.generated.ts: wallets=16, mapping=8 (из C++).
- controller/schema.gql, controller/zeus/index.ts, sdk/zeus/index.ts:
  только description-only diff в MarketplaceMemberWallet/Entry, никаких
  breaking changes в типах GraphQL/zeus.

Unit-тесты marketplace-member-wallet-resolver.test.ts обновлены под 4-й
кошелёк (4/4 passed, runInBand).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-28 11:22:52 +05:00
parent 07584c8e78
commit fb94c7ff11
7 changed files with 98 additions and 64 deletions
+8 -4
View File
@@ -8137,7 +8137,7 @@ type MarketplaceMemberWallet {
username: String!
"""
Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member
Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order
"""
wallets: [MarketplaceWalletEntry!]!
}
@@ -9254,7 +9254,9 @@ type MarketplaceWalletEntry {
"""Доступный остаток (`userwallets.available`)"""
available: String!
"""Заблокированный остаток (`userwallets.blocked`)"""
"""
Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных.
"""
blocked: String!
"""Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY)"""
@@ -9268,7 +9270,9 @@ type MarketplaceWalletEntry {
"""
label: String!
"""eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member)"""
"""
eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order)
"""
name: String!
"""program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов"""
@@ -13286,7 +13290,7 @@ type Query {
marketplaceListWriteoffProposals(data: MarketplaceListWriteoffProposalsInput!, options: PaginationInput): PaginatedMarketplaceWriteoffProposals!
"""
Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member
Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order
"""
marketplaceMemberWallet: MarketplaceMemberWallet!
@@ -1,23 +1,30 @@
import { Field, Int, ObjectType } from '@nestjs/graphql';
/**
* Story 1.5: кошельки пайщика на Столе заказов.
* Кошельки пайщика на Столе заказов.
*
* По стандарту контракта marketplace (см. `marketplace/p.mkt.supply.standard.yaml`,
* раздел «wallets») в процессах ЦПП «Стол Заказов» у пайщика участвуют три
* раздел «wallets») в процессах ЦПП «Стол Заказов» у пайщика участвуют четыре
* USER_SHARED-кошелька:
*
* 1. `w.wal.share` — ЦПП «Цифровой Кошелёк», паевые взносы деньгами (program_id=1).
* 2. `w.wal.member` — Универсальный членский кошелёк (program_id=1), играет роль
* транзитного: средства идут share → member → mkt.member.
* 3. `w.mkt.member` — Программный членский кошелёк ЦПП «Стол Заказов»
* (program_id=2), формируется при первом orderoffer/createorder.
* (program_id=2), .available — свободные средства программы.
* 4. `w.mkt.order` — Резерв средств пайщика под конкретный Order (program_id=2).
* Сюда движутся средства на createorder (TRANSFER из
* w.mkt.member), обратно — на cancel/decline/expire.
* Сжигается BURN'ом на signiss2 (выдача имущества).
*
* Источник балансов — core `UserWalletRepository.findByUsername` (PG-кеш
* `ledger2::userwallets`); RPC к chain не выполняется (ADR-011). Каждый
* кошелёк отдаётся «как есть» — `available` и `blocked` напрямую из L3,
* без сворачивания/переименования. Если L3-записи ещё нет (пайщик не
* двигал средства через данный кошелёк) — возвращаем `0/0`.
* двигал средства через данный кошелёк) — возвращаем `0/0`. Поле `blocked`
* для marketplace-кошельков всегда `0` после миграции с BLOCK/UNBLOCK на
* пары TRANSFER (2026-05-28) — резерв выражается через .available
* отдельного кошелька w.mkt.order.
*
* Платформенный кошелёк `w.mkt.payout` (COOPERATIVE, не per-user) сюда не
* включается — это кошелёк выплат поставщикам, отображается в admin-вьюхе
@@ -25,7 +32,7 @@ import { Field, Int, ObjectType } from '@nestjs/graphql';
*/
@ObjectType('MarketplaceWalletEntry')
export class MarketplaceWalletEntryDTO {
@Field(() => String, { description: 'eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member)' })
@Field(() => String, { description: 'eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order)' })
public readonly name!: string;
@Field(() => String, { description: 'Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY)' })
@@ -46,7 +53,10 @@ export class MarketplaceWalletEntryDTO {
@Field(() => String, { description: 'Доступный остаток (`userwallets.available`)' })
public readonly available!: string;
@Field(() => String, { description: 'Заблокированный остаток (`userwallets.blocked`)' })
@Field(() => String, {
description:
'Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных.',
})
public readonly blocked!: string;
constructor(init: {
@@ -77,7 +87,7 @@ export class MarketplaceMemberWalletDTO {
public readonly coopname!: string;
@Field(() => [MarketplaceWalletEntryDTO], {
description: 'Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member',
description: 'Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order',
})
public readonly wallets!: MarketplaceWalletEntryDTO[];
@@ -22,11 +22,11 @@ import { MarketplaceMembershipGuard } from '../guards/marketplace-membership.gua
* (`marketplace/p.mkt.supply.standard.yaml`, секция «wallets»). Порядок
* соответствует pipeline средств в orderoffer/createorder:
* `w.wal.share` (деньги) → `w.wal.member` (универсальный членский) →
* `w.mkt.member` (программный членский ЦПП).
* `w.mkt.member` (программный членский ЦПП) → `w.mkt.order` (резерв под Order).
*
* `label` — UX-метка в формате `<тип взноса> | <программа>` (review
* @dacom-dark-sun PR #380 line 34). Не та же что `human_name` из
* cooptypes (там длинное юр.описание); этот label короткий, для panel/list.
* `label` — UX-метка в формате `<тип взноса> | <программа>`. Не та же что
* `human_name` из cooptypes (там длинное юр.описание); этот label короткий,
* для panel/list.
*/
const MARKETPLACE_RELEVANT_WALLETS: ReadonlyArray<{
name: string;
@@ -36,6 +36,7 @@ const MARKETPLACE_RELEVANT_WALLETS: ReadonlyArray<{
{ name: 'w.wal.share', program_id: 1, label: 'Паевой | Цифровой Кошелёк' },
{ name: 'w.wal.member', program_id: 1, label: 'Членский | Цифровой Кошелёк' },
{ name: 'w.mkt.member', program_id: 2, label: 'Членский | Стол Заказов' },
{ name: 'w.mkt.order', program_id: 2, label: 'Резерв | Стол Заказов' },
];
/**
@@ -65,7 +66,7 @@ export class MarketplaceMemberWalletResolver {
@Query(() => MarketplaceMemberWalletDTO, {
name: 'marketplaceMemberWallet',
description:
'Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member',
'Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order',
})
@UseGuards(GqlJwtAuthGuard, MarketplaceMembershipGuard)
async marketplaceMemberWallet(
@@ -1,16 +1,19 @@
/**
* Unit-тесты MarketplaceMemberWalletResolver (Story 1.5, review-fix 2026-05-14).
* Unit-тесты MarketplaceMemberWalletResolver.
*
* После review @dacom-dark-sun (PR #380) resolver перепиcан:
* - Возвращает массив всех 3 USER_SHARED-кошельков стандарта marketplace
* (`w.wal.share`, `w.wal.member`, `w.mkt.member`) — каждый со своим
* `name`/`human_name`/`available`/`blocked`, без сворачивания и без
* старой нотации `membership_contribution`.
* - Источник — core `UserWalletRepository.findByUsername` (PG-кеш
* `ledger2::userwallets`), не свёрнутый `WalletService.getProgramWallet`.
* - Пайщик без L3-записи по конкретному кошельку → `0/0` (рабочее состояние,
* а не ошибка) — например, `w.mkt.member` появляется только после
* первого `orderoffer`/`createorder`.
* Resolver возвращает массив 4-х USER_SHARED-кошельков стандарта marketplace:
* - `w.wal.share` — паевые взносы деньгами (program_id=1).
* - `w.wal.member` — универсальный членский (program_id=1).
* - `w.mkt.member` — программный членский Стола Заказов (program_id=2).
* - `w.mkt.order` — резерв под Order (program_id=2). Введён 2026-05-28
* взамен механики .blocked на w.mkt.member.
*
* Каждый кошелёк со своим `name`/`human_name`/`available`/`blocked`, без
* сворачивания. Источник — core `UserWalletRepository.findByUsername`
* (PG-кеш `ledger2::userwallets`). Пайщик без L3-записи по конкретному
* кошельку → `0/0` (рабочее состояние, а не ошибка) — например,
* `w.mkt.member` появляется только после первого `orderoffer`/`createorder`,
* а `w.mkt.order` — только после первого `createorder`.
*/
jest.mock('~/config/config', () => ({
@@ -33,10 +36,11 @@ const member = {
};
describe('MarketplaceMemberWalletResolver', () => {
it('пайщик с записями share + mkt.member → массив из 3 кошельков, w.wal.member нулевой', async () => {
it('пайщик с записями share + mkt.member + mkt.order → массив из 4 кошельков', async () => {
const repo = makeRepo([
{ wallet_name: 'w.wal.share', available: '125.0000 RUB', blocked: '5.0000 RUB' },
{ wallet_name: 'w.mkt.member', available: '300.0000 RUB', blocked: '0.0000 RUB' },
{ wallet_name: 'w.mkt.order', available: '80.0000 RUB', blocked: '0.0000 RUB' },
// нерелевантные стол-заказам кошельки не должны попасть в выдачу
{ wallet_name: 'w.cap.blago', available: '999.0000 RUB', blocked: '0.0000 RUB' },
]);
@@ -48,7 +52,7 @@ describe('MarketplaceMemberWalletResolver', () => {
expect(dto.username).toBe('alice');
expect(dto.coopname).toBe('voskhod');
expect(dto.wallets).toHaveLength(3);
expect(dto.wallets).toHaveLength(4);
expect(dto.wallets[0]).toMatchObject({
name: 'w.wal.share',
program_id: 1,
@@ -71,20 +75,32 @@ describe('MarketplaceMemberWalletResolver', () => {
available: '300.0000 RUB',
blocked: '0.0000 RUB',
});
expect(dto.wallets[3]).toMatchObject({
name: 'w.mkt.order',
program_id: 2,
label: 'Резерв | Стол Заказов',
available: '80.0000 RUB',
blocked: '0.0000 RUB',
});
});
it('пайщик без L3-записей вообще → 3 кошелька с 0/0 (а не NotFoundException)', async () => {
it('пайщик без L3-записей вообще → 4 кошелька с 0/0 (а не NotFoundException)', async () => {
const repo = makeRepo([]);
const resolver = new MarketplaceMemberWalletResolver(repo);
const dto = await resolver.marketplaceMemberWallet(member as any);
expect(dto.wallets).toHaveLength(3);
expect(dto.wallets).toHaveLength(4);
for (const w of dto.wallets) {
expect(w.available).toBe('0');
expect(w.blocked).toBe('0');
}
expect(dto.wallets.map((w) => w.name)).toEqual(['w.wal.share', 'w.wal.member', 'w.mkt.member']);
expect(dto.wallets.map((w) => w.name)).toEqual([
'w.wal.share',
'w.wal.member',
'w.mkt.member',
'w.mkt.order',
]);
});
it('human_name подтягивается из cooptypes LEDGER2_WALLET_REGISTRY', async () => {
@@ -96,6 +112,7 @@ describe('MarketplaceMemberWalletResolver', () => {
expect(dto.wallets[0].human_name).toBe('Паевой взнос пайщика');
expect(dto.wallets[1].human_name).toBe('ЦК — членская часть пайщика');
expect(dto.wallets[2].human_name).toBe('ЦПП «Стол Заказов» — программный членский у пайщика');
expect(dto.wallets[3].human_name).toBe('ЦПП «Стол Заказов» — резерв под заказ у пайщика');
});
it('w.mkt.payout (COOPERATIVE) не попадает в выдачу — это кооперативный кошелёк, не пайщика', async () => {
+16 -16
View File
@@ -6911,7 +6911,7 @@ export type ValueTypes = {
["MarketplaceMemberWallet"]: AliasType<{
coopname?:boolean | `@${string}`,
username?:boolean | `@${string}`,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets?:ValueTypes["MarketplaceWalletEntry"],
__typename?: boolean | `@${string}`,
['...on MarketplaceMemberWallet']?: Omit<ValueTypes["MarketplaceMemberWallet"], "...on MarketplaceMemberWallet">
@@ -7691,7 +7691,7 @@ export type ValueTypes = {
["MarketplaceWalletEntry"]: AliasType<{
/** Доступный остаток (`userwallets.available`) */
available?:boolean | `@${string}`,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked?:boolean | `@${string}`,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name?:boolean | `@${string}`,
@@ -7699,7 +7699,7 @@ export type ValueTypes = {
kind?:boolean | `@${string}`,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label?:boolean | `@${string}`,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name?:boolean | `@${string}`,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id?:boolean | `@${string}`,
@@ -9614,7 +9614,7 @@ marketplaceListSupplierOrders?: [{ input?: ValueTypes["MarketplaceListOrdersInpu
/** Список пайщиков-поставщиков, допущенных к публикации оферт */
marketplaceListWhitelist?:ValueTypes["MarketplaceWhitelistEntry"],
marketplaceListWriteoffProposals?: [{ data: ValueTypes["MarketplaceListWriteoffProposalsInput"] | Variable<any, string>, options?: ValueTypes["PaginationInput"] | undefined | null | Variable<any, string>},ValueTypes["PaginatedMarketplaceWriteoffProposals"]],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet?:ValueTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState?:ValueTypes["MarketplaceOnboardingState"],
@@ -16873,7 +16873,7 @@ export type ResolverInputTypes = {
["MarketplaceMemberWallet"]: AliasType<{
coopname?:boolean | `@${string}`,
username?:boolean | `@${string}`,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets?:ResolverInputTypes["MarketplaceWalletEntry"],
__typename?: boolean | `@${string}`
}>;
@@ -17627,7 +17627,7 @@ export type ResolverInputTypes = {
["MarketplaceWalletEntry"]: AliasType<{
/** Доступный остаток (`userwallets.available`) */
available?:boolean | `@${string}`,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked?:boolean | `@${string}`,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name?:boolean | `@${string}`,
@@ -17635,7 +17635,7 @@ export type ResolverInputTypes = {
kind?:boolean | `@${string}`,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label?:boolean | `@${string}`,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name?:boolean | `@${string}`,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id?:boolean | `@${string}`,
@@ -19479,7 +19479,7 @@ marketplaceListSupplierOrders?: [{ input?: ResolverInputTypes["MarketplaceListOr
/** Список пайщиков-поставщиков, допущенных к публикации оферт */
marketplaceListWhitelist?:ResolverInputTypes["MarketplaceWhitelistEntry"],
marketplaceListWriteoffProposals?: [{ data: ResolverInputTypes["MarketplaceListWriteoffProposalsInput"], options?: ResolverInputTypes["PaginationInput"] | undefined | null},ResolverInputTypes["PaginatedMarketplaceWriteoffProposals"]],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet?:ResolverInputTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState?:ResolverInputTypes["MarketplaceOnboardingState"],
@@ -26514,7 +26514,7 @@ export type ModelTypes = {
["MarketplaceMemberWallet"]: {
coopname: string,
username: string,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets: Array<ModelTypes["MarketplaceWalletEntry"]>
};
["MarketplaceModerationLogEntry"]: {
@@ -27233,7 +27233,7 @@ export type ModelTypes = {
["MarketplaceWalletEntry"]: {
/** Доступный остаток (`userwallets.available`) */
available: string,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked: string,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name: string,
@@ -27241,7 +27241,7 @@ export type ModelTypes = {
kind: string,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label: string,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name: string,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id: number
@@ -29741,7 +29741,7 @@ export type ModelTypes = {
marketplaceListWhitelist: Array<ModelTypes["MarketplaceWhitelistEntry"]>,
/** Лента всех проектов списания кооператива с фильтром по статусу. */
marketplaceListWriteoffProposals: ModelTypes["PaginatedMarketplaceWriteoffProposals"],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet: ModelTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState: ModelTypes["MarketplaceOnboardingState"],
@@ -37072,7 +37072,7 @@ export type GraphQLTypes = {
__typename: "MarketplaceMemberWallet",
coopname: string,
username: string,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets: Array<GraphQLTypes["MarketplaceWalletEntry"]>,
['...on MarketplaceMemberWallet']: Omit<GraphQLTypes["MarketplaceMemberWallet"], "...on MarketplaceMemberWallet">
};
@@ -37852,7 +37852,7 @@ export type GraphQLTypes = {
__typename: "MarketplaceWalletEntry",
/** Доступный остаток (`userwallets.available`) */
available: string,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked: string,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name: string,
@@ -37860,7 +37860,7 @@ export type GraphQLTypes = {
kind: string,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label: string,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name: string,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id: number,
@@ -40524,7 +40524,7 @@ export type GraphQLTypes = {
marketplaceListWhitelist: Array<GraphQLTypes["MarketplaceWhitelistEntry"]>,
/** Лента всех проектов списания кооператива с фильтром по статусу. */
marketplaceListWriteoffProposals: GraphQLTypes["PaginatedMarketplaceWriteoffProposals"],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet: GraphQLTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState: GraphQLTypes["MarketplaceOnboardingState"],
@@ -25,6 +25,7 @@ export const LEDGER2_WALLET_REGISTRY: readonly WalletMeta[] = [
{ name: "w.cap.blago", human_name: "ЦПП «Благорост» — единый кошелёк программы у пайщика", kind: "USER_SHARED" },
{ name: "w.cap.preimp", human_name: "Первичный учёт РИД-взносов до перехода на электронный учёт", kind: "USER_SHARED" },
{ name: "w.mkt.member", human_name: "ЦПП «Стол Заказов» — программный членский у пайщика", kind: "USER_SHARED" },
{ name: "w.mkt.order", human_name: "ЦПП «Стол Заказов» — резерв под заказ у пайщика", kind: "USER_SHARED" },
{ name: "w.cap.gen", human_name: "ЦПП «Генератор» — единый кошелёк программы", kind: "COOPERATIVE" },
{ name: "w.reg.entry", human_name: "Вступительные взносы", kind: "COOPERATIVE" },
{ name: "w.wal.wthdrw", human_name: "Возвраты паевых взносов пайщикам (deprecated, не используется в новых операциях)", kind: "COOPERATIVE" },
@@ -57,4 +58,5 @@ export const LEDGER2_USER_SHARED_PROGRAM_MAPPING: readonly ProgramWalletMapping[
{ wallet_name: "w.cap.gen", required_program_id: 3, program_label: "Генератор" },
{ wallet_name: "w.cap.preimp", required_program_id: 0, program_label: null },
{ wallet_name: "w.mkt.member", required_program_id: 2, program_label: "Marketplace" },
{ wallet_name: "w.mkt.order", required_program_id: 2, program_label: "Marketplace" },
] as const
+16 -16
View File
@@ -6911,7 +6911,7 @@ export type ValueTypes = {
["MarketplaceMemberWallet"]: AliasType<{
coopname?:boolean | `@${string}`,
username?:boolean | `@${string}`,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets?:ValueTypes["MarketplaceWalletEntry"],
__typename?: boolean | `@${string}`,
['...on MarketplaceMemberWallet']?: Omit<ValueTypes["MarketplaceMemberWallet"], "...on MarketplaceMemberWallet">
@@ -7691,7 +7691,7 @@ export type ValueTypes = {
["MarketplaceWalletEntry"]: AliasType<{
/** Доступный остаток (`userwallets.available`) */
available?:boolean | `@${string}`,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked?:boolean | `@${string}`,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name?:boolean | `@${string}`,
@@ -7699,7 +7699,7 @@ export type ValueTypes = {
kind?:boolean | `@${string}`,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label?:boolean | `@${string}`,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name?:boolean | `@${string}`,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id?:boolean | `@${string}`,
@@ -9614,7 +9614,7 @@ marketplaceListSupplierOrders?: [{ input?: ValueTypes["MarketplaceListOrdersInpu
/** Список пайщиков-поставщиков, допущенных к публикации оферт */
marketplaceListWhitelist?:ValueTypes["MarketplaceWhitelistEntry"],
marketplaceListWriteoffProposals?: [{ data: ValueTypes["MarketplaceListWriteoffProposalsInput"] | Variable<any, string>, options?: ValueTypes["PaginationInput"] | undefined | null | Variable<any, string>},ValueTypes["PaginatedMarketplaceWriteoffProposals"]],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet?:ValueTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState?:ValueTypes["MarketplaceOnboardingState"],
@@ -16873,7 +16873,7 @@ export type ResolverInputTypes = {
["MarketplaceMemberWallet"]: AliasType<{
coopname?:boolean | `@${string}`,
username?:boolean | `@${string}`,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets?:ResolverInputTypes["MarketplaceWalletEntry"],
__typename?: boolean | `@${string}`
}>;
@@ -17627,7 +17627,7 @@ export type ResolverInputTypes = {
["MarketplaceWalletEntry"]: AliasType<{
/** Доступный остаток (`userwallets.available`) */
available?:boolean | `@${string}`,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked?:boolean | `@${string}`,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name?:boolean | `@${string}`,
@@ -17635,7 +17635,7 @@ export type ResolverInputTypes = {
kind?:boolean | `@${string}`,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label?:boolean | `@${string}`,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name?:boolean | `@${string}`,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id?:boolean | `@${string}`,
@@ -19479,7 +19479,7 @@ marketplaceListSupplierOrders?: [{ input?: ResolverInputTypes["MarketplaceListOr
/** Список пайщиков-поставщиков, допущенных к публикации оферт */
marketplaceListWhitelist?:ResolverInputTypes["MarketplaceWhitelistEntry"],
marketplaceListWriteoffProposals?: [{ data: ResolverInputTypes["MarketplaceListWriteoffProposalsInput"], options?: ResolverInputTypes["PaginationInput"] | undefined | null},ResolverInputTypes["PaginatedMarketplaceWriteoffProposals"]],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet?:ResolverInputTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState?:ResolverInputTypes["MarketplaceOnboardingState"],
@@ -26514,7 +26514,7 @@ export type ModelTypes = {
["MarketplaceMemberWallet"]: {
coopname: string,
username: string,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets: Array<ModelTypes["MarketplaceWalletEntry"]>
};
["MarketplaceModerationLogEntry"]: {
@@ -27233,7 +27233,7 @@ export type ModelTypes = {
["MarketplaceWalletEntry"]: {
/** Доступный остаток (`userwallets.available`) */
available: string,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked: string,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name: string,
@@ -27241,7 +27241,7 @@ export type ModelTypes = {
kind: string,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label: string,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name: string,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id: number
@@ -29741,7 +29741,7 @@ export type ModelTypes = {
marketplaceListWhitelist: Array<ModelTypes["MarketplaceWhitelistEntry"]>,
/** Лента всех проектов списания кооператива с фильтром по статусу. */
marketplaceListWriteoffProposals: ModelTypes["PaginatedMarketplaceWriteoffProposals"],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet: ModelTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState: ModelTypes["MarketplaceOnboardingState"],
@@ -37072,7 +37072,7 @@ export type GraphQLTypes = {
__typename: "MarketplaceMemberWallet",
coopname: string,
username: string,
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member */
/** Релевантные стол-заказам USER_SHARED-кошельки пайщика; порядок: share → member → mkt.member → mkt.order */
wallets: Array<GraphQLTypes["MarketplaceWalletEntry"]>,
['...on MarketplaceMemberWallet']: Omit<GraphQLTypes["MarketplaceMemberWallet"], "...on MarketplaceMemberWallet">
};
@@ -37852,7 +37852,7 @@ export type GraphQLTypes = {
__typename: "MarketplaceWalletEntry",
/** Доступный остаток (`userwallets.available`) */
available: string,
/** Заблокированный остаток (`userwallets.blocked`) */
/** Заблокированный остаток (`userwallets.blocked`). Для marketplace-кошельков всегда `0` — резерв выражается через `.available` кошелька w.mkt.order. Поле остаётся для wallet/withdraw flow и legacy данных. */
blocked: string,
/** Человекочитаемое название (из cooptypes LEDGER2_WALLET_REGISTRY) */
human_name: string,
@@ -37860,7 +37860,7 @@ export type GraphQLTypes = {
kind: string,
/** UX-метка кошелька в формате `<тип взноса> | <программа>` (например «Паевой | Цифровой Кошелёк», «Членский | Стол Заказов») */
label: string,
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member) */
/** eosio::name кошелька (w.wal.share / w.wal.member / w.mkt.member / w.mkt.order) */
name: string,
/** program_id: 1 — Цифровой Кошелёк, 2 — Стол Заказов */
program_id: number,
@@ -40524,7 +40524,7 @@ export type GraphQLTypes = {
marketplaceListWhitelist: Array<GraphQLTypes["MarketplaceWhitelistEntry"]>,
/** Лента всех проектов списания кооператива с фильтром по статусу. */
marketplaceListWriteoffProposals: GraphQLTypes["PaginatedMarketplaceWriteoffProposals"],
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member */
/** Кошельки пайщика, релевантные столу заказов: w.wal.share, w.wal.member, w.mkt.member, w.mkt.order */
marketplaceMemberWallet: GraphQLTypes["MarketplaceMemberWallet"],
/** Состояние онбординга пайщика в Столе заказов: показывать ли gate или пропускать на стол */
marketplaceOnboardingState: GraphQLTypes["MarketplaceOnboardingState"],