docs-dw-smartcontract/README.md

3.0 KiB
Raw Permalink Blame History

sequenceDiagram
    autonumber
    actor User as Пользователь (MiniApp + TON Connect)
    participant FE as Frontend (MiniApp)
    participant BE as Backend
    participant TC as toncenter API v3
    participant SC as Atomic Payment Contract (1 платеж)

    FE->>BE: CreatePayment -> создать платеж в БД (amount)
    Note over BE: Генерирует transaction_id и сохраняет в БД: service_public_key, service_private_key, transaction_id, expected_ton_amount, valid_until, статус платежа
    BE-->>FE: PaymentInit(address, stateInit, payload_signed)
    Note over BE,FE: payload_signed включает: valid_until, - expected_ton_amount, - (опционально) параметры/ограничения\nи подписан service_public_key

    FE->>User: TON Connect запрос на оплату\n(to=address, stateInit, payload)
    User->>SC: Internal message + value (TON) с stateInit (деплой) и payload
    SC->>SC: Проверка подписи (service_public_key) Проверка valid_until Проверка expected_ton_amount == value
    alt Валидация ОК
        SC->>SC: status = 1 (Paid / Awaiting confirm) запоминает факт платежа (anti-replay)
        SC-->>User: Успех, транзакция принята
    else Валидация НЕ ОК
        SC-->>User: Reject / bounce (неверная сумма/подпись/истек срок)
    end

    loop Периодический мониторинг активных платежей
        BE->>BE: Собрать список активных платежей (valid_until не истек)
        Note over BE: Для каждого платежа вычисляет адрес контракта из service_public_key + transaction_id
        BE->>TC: getAccounts / getTransactions / getAccountState (batch до ~1000 адресов)
        TC-->>BE: Статусы/данные по контрактам
        alt Найден контракт со status=1 и оплатой
            BE->>BE: Рассчитать распределение: applying_address, applying_ton_amount,\nsystem_fee_address, reserve_amount
            BE->>SC: External confirm message (подпись backend/service key)
            SC->>SC: Проверка подписи confirm Проверка status==1 Проверка applying_amount <= paid_amount
            SC->>SC: Transfer applying_amount -> applying_address
            SC->>SC: Остаток -> system_fee_address (минус reserve на хранение)
            SC->>SC: status = 2 (Confirmed / Distributed)
            BE-->>BE: Пометить платеж зачисленным (можно кредитовать пользователя)
        else Контракт не оплачен / нет / истек
            BE-->>BE: Ничего не делать или закрыть платеж по valid_until
        end
    end