Skip to content

Instantly share code, notes, and snippets.

@mlshv
Last active February 24, 2026 19:22
Show Gist options
  • Select an option

  • Save mlshv/a464666a5e30c194d89285ceb0617fb8 to your computer and use it in GitHub Desktop.

Select an option

Save mlshv/a464666a5e30c194d89285ceb0617fb8 to your computer and use it in GitHub Desktop.
BSF Publishing Flow — Solana dApp Store

BSF Publishing Flow

Участники

  • Android App — наше приложение на телефоне юзера
  • Phantom — кошелёк (отдельное приложение на телефоне, вызывается через MWA)
  • Publishing Service — наш сервер на Hetzner
  • Solana — блокчейн
  • dApp Store Portal — портал Solana Mobile для ревью

Шаг 1 — Создание App NFT

sequenceDiagram
    participant A as Android App
    participant S as Publishing Service
    participant P as Phantom
    participant B as Solana Blockchain

    A->>S: POST /create-app<br/>{publisherAddress, icon, metadata}
    Note over S: Генерирует mintKeypair<br/>Загружает icon на Arweave<br/>Строит транзакцию Metaplex<br/>partialSign mintKeypair
    S-->>A: {transaction: base64, mintAddress}
    A->>P: signTransaction
    Note over P: Юзер подтверждает в Phantom
    P-->>A: signedTransaction
    A->>B: sendRawTransaction
    Note over B: App NFT создан on-chain
Loading

Шаг 2 — Создание Release NFT

sequenceDiagram
    participant A as Android App
    participant S as Publishing Service
    participant P as Phantom
    participant B as Solana Blockchain

    A->>S: POST /create-release<br/>{appMint, APK, screenshots,<br/>banner, icon, metadata}
    Note over S: Генерирует mintKeypair<br/>Загружает медиа на Arweave<br/>Строит транзакцию Metaplex<br/>partialSign mintKeypair
    S-->>A: {transaction: base64, mintAddress}
    A->>P: signTransaction
    Note over P: Юзер подтверждает в Phantom
    P-->>A: signedTransaction
    A->>B: sendRawTransaction
    Note over B: Release NFT создан on-chain
Loading

Шаг 3 — Сабмит в dApp Store

sequenceDiagram
    participant A as Android App
    participant S as Publishing Service
    participant P as Phantom
    participant D as dApp Store Portal

    A->>S: POST /prepare-attestation<br/>{publisherAddress}
    Note over S: blockhash + requestUniqueId
    S-->>A: {attestationBuffer, requestUniqueId}
    A->>P: signMessage attestationBuffer
    Note over P: Юзер подтверждает подпись
    P-->>A: signedAttestation
    A->>S: POST /submit<br/>{signedAttestation, mintAddresses}
    S->>D: HubSpot form submit
    Note over D: Ревью 2-3 рабочих дня
Loading

Кто что подписывает

graph LR
    subgraph Server
        M["mintKeypair - одноразовый"]
    end
    subgraph Phantom
        T["Транзакции как feePayer"]
        AT["Attestation для портала"]
    end

    M -->|partialSign| TX["Транзакция"]
    T -->|signTransaction| TX
    TX -->|send| BC["Solana"]

    AT -->|signMessage| SUB["POST /submit"]
    SUB --> DP["dApp Store Portal"]
Loading

Сервер никогда не имеет приватного ключа юзера. Он подписывает только mint keypair — одноразовый ключ, который он сам сгенерировал для создания NFT.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment