# LFW: Blockchain <> Game
## Flow Game mint 1 NFT từ nhân vật / item trong game
### Diagram

### Context:
- Data (chỉ số nhân vật, metadata, ...) sẽ được lưu toàn bộ ở game server
- Blockchain Server sẽ chỉ lưu 2 thông tin:
- tokenId: Id của NFT được tạo bởi smart contract
- MetadataURL: link tới API để get được metadata từ game server
- Khi chỉ số (metadata) thay đổi, game server **không cần** thông báo cho blockchain server
- Game server lưu thông tin tokenId tương ứng vào database, blockchain server sẽ dùng tokenId để query metadata đang được lưu ở game server
### APIs:
1. API để game mint ra 1 NFT
POST: {blockchain-server-url}/nft
body:
```
{
"category": "string"
"ingame_id": // id của item trong db bên game
}
```
2. API để blockchain server update tokenId vào ingame_id
PUT: {game-server-url}/item/add-tokenId
body:
```
{
"ingame_id": // id ingame của item này
"token_id": // token id của nft này
}
```
Note: Do phần khi mint sẽ phải tương tác với blockchain, nên sẽ phải làm async (quản lý state: item đang được minting, đã mint (khi blockchain gọi api (2) qua cho game))
## Flow Frontend retrieve data để render lên UI
### Diagram

### APIs:
1. API để blockchain server query metadata của các nft
GET: {game-server-url}/items?token_id[]=1,token_id[]=2,token_id[]=3,...
response:
```
[
{
"token_id": 1,
"metadata": {...}
},
{
"token_id": 2,
"metadata": {...}
},
{
"token_id": 3,
"metadata": {...}
},
]
```
## Flow login/reset-password/signup
Phần này thì server blockchain sẽ đóng vai trò proxy để forward request sang cho bên Game server sử lý, nên a cứ đưa specs tụi em sẽ implement theo đó
ví dụ 1 flow login:

---
// TODO:
// - connect wallet
// - track token <> KNB
// - import NFT vao game