- Android App — наше приложение на телефоне юзера
- Phantom — кошелёк (отдельное приложение на телефоне, вызывается через MWA)
- Publishing Service — наш сервер на Hetzner
- Solana — блокчейн
- dApp Store Portal — портал Solana Mobile для ревью
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
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
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 рабочих дня
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"]
Сервер никогда не имеет приватного ключа юзера. Он подписывает только mint keypair — одноразовый ключ, который он сам сгенерировал для создания NFT.