Upload files to "nft_ideas"

This commit is contained in:
Anastasia Avsyukevich 2025-01-19 15:53:17 +00:00
parent d46002e85e
commit d6795fcf07

156
nft_ideas/nft_idea.go Normal file
View file

@ -0,0 +1,156 @@
package main
import (
"fmt"
"github.com/nspcc-dev/neo-go/pkg/interop"
"github.com/nspcc-dev/neo-go/pkg/interop/native"
"github.com/nspcc-dev/neo-go/pkg/interop/storage"
"github.com/nspcc-dev/neo-go/pkg/util"
"github.com/google/uuid"
)
type Answer struct {
wallet interop.Hash160
content string
votes []interop.Hash160
answerIdx int
nftID interop.Uint160 // NFT ID representing the answer
}
var (
// Переменная для хранения владельцев токенов (NFT)
owners = make(map[uint64]util.Uint160)
tokenID uint64
)
func mintNFT(to util.Uint160, content string) uint64 {
// Генерация уникального ID для NFT
tokenID++
// Создание NFT с уникальным tokenID
owners[tokenID] = to
fmt.Printf("Minted NFT with ID %d for content: %s\n", tokenID, content)
return tokenID
}
// Метод для передачи NFT
func transferNFT(from util.Uint160, to util.Uint160, tokenID uint64) {
// Проверка, что от sender есть токен, и он совпадает с передаваемым
if owners[tokenID] != from {
panic("You are not the owner of this token")
}
// Передаем токен
owners[tokenID] = to
fmt.Printf("Transferred NFT with ID %d from %s to %s\n", tokenID, from, to)
}
// Функция для создания уникального NFT для каждого вопроса
func mintQuestionNFT(roomId string, question string, sender interop.Hash160) uint64 {
tokenID := mintNFT(sender, fmt.Sprintf("Question in Room %s: %s", roomId, question))
// Можно добавить логику для хранения NFT информации в блокчейне
return tokenID
}
// Функция для создания уникального NFT для каждого ответа
func mintAnswerNFT(roomId string, answer string, sender interop.Hash160) uint64 {
tokenID := mintNFT(sender, fmt.Sprintf("Answer in Room %s: %s", roomId, answer))
// Можно добавить логику для хранения NFT информации в блокчейне
return tokenID
}
func AskQuestion(roomId string, question string) bool {
var ctx = storage.GetContext()
var room = getRoom(ctx, roomId)
if !room.Host.Equals(getSender()) || room.Status != RoomStatusGameIsStarted {
return false // Only host can ask question, room status must be game is started
}
// Создание уникального NFT для этого вопроса
nftID := mintQuestionNFT(roomId, question, getSender())
newRound := Round{
number: len(room.Rounds) + 1,
question: fmt.Sprintf("%s (NFT: %s)", question, nftID.String()),
answers: []Answer{},
}
room.Rounds = append(room.Rounds, newRound)
// todo: Списание средств за создание вопроса ? Надо ли делать вообще или можно оставить бесплатным
setRoom(ctx, &room)
return true
}
func SendAnswer(roomId string, text string) bool {
var ctx = storage.GetContext()
var room = getRoom(ctx, roomId)
if !roomContainsPlayer(room.Players, getSender()) || room.Status != RoomStatusRoundIsStarted {
return false // Only player can send content, room status must be round is started
}
// Создание уникального NFT для этого ответа
nftID := mintAnswerNFT(roomId, text, getSender())
// todo: Снятие денег за ввод ответа (если это необходимо)
var round = room.Rounds[len(room.Rounds)-1]
answer := Answer{
wallet: getSender(),
content: text,
votes: []interop.Hash160{},
answerIdx: len(round.answers),
nftID: nftID, // Link NFT to the answe
}
round.answers = append(round.answers, answer)
room.Rounds[len(room.Rounds)-1] = round
setRoom(ctx, &room)
return true
}
// тут пока не уверена, надо подумать
func GetWinner(roomId string) bool {
var ctx = storage.GetContext()
var room = getRoom(ctx, roomId)
if !room.Host.Equals(getSender()) || room.Status != RoomStatusVoting {
return false // Only host can get winner, room status must be voting
}
var round = room.Rounds[len(room.Rounds)-1]
if len(round.answers) == 0 {
return false // Zero winners, because no answer
}
var winners = chooseWinner(round, room.CountWinners)
var result string
for i, winner := range winners {
result += fmt.Sprintf("place:%d, winner:%s, answer NFT: %s,votes:%s\n", i, winner.wallet, winner.nftID.String(), winner.votes) // Show NFT ID for winners
// todo вот надо подумать, надо оно нам еще тут?
// Mint NFT for the winner (we use the index as the token ID for simplicity)
tokenID := uint64(i + 1) // Use a simple ID based on index (can be replaced with more complex logic)
mint(winner.wallet, tokenID) // Mint NFT to the winner's wallet
}
for _, player := range room.Players {
sendMessageToPlayer(result, player)
}
// Отправка награды победителям (например, сообщение о том, что они получили NFT)
for _, winner := range winners {
sendMessageToPlayer(fmt.Sprintf("Congratulations! You have received an NFT. Token ID: %d", uint64(winner.answerIdx+1)), Player{Wallet: winner.wallet})
}
room.Status = RoomStatusGameIsStarted // Next game cycle available to AskQuestion
setRoom(ctx, &room)
return true
}
// возможно понадобится
func TransferNFTToWinner(from util.Uint160, to util.Uint160, tokenID uint64) {
transfer(from, to, tokenID)
sendMessageToPlayer(fmt.Sprintf("You have received an NFT with Token ID: %d", tokenID), Player{Wallet: to})
}