Compare commits

...

2 commits

Author SHA1 Message Date
vvbach
cba7093c18 Merge branch 'master' of https://git.frostfs.info/nastyxxaavs/web3_draft 2025-01-21 18:23:22 +03:00
vvbach
3281f19594 fix: money.go 2025-01-21 18:23:18 +03:00
2 changed files with 26 additions and 117 deletions

View file

@ -2,132 +2,35 @@ package contracts
import (
"fmt"
"context"
"github.com/nspcc-dev/neo-go/pkg/interop"
"github.com/nspcc-dev/neo-go/pkg/interop/storage"
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
"github.com/nspcc-dev/neo-go/pkg/util"
"github.com/nspcc-dev/neo-go/pkg/interop/runtime"
"github.com/nspcc-dev/neo-go/pkg/interop/native/gas"
)
const (
walletKey = "walletKey"
)
func _deploy(data interface{}, isUpdate bool) {
if isUpdate {
return
}
// передаем кошелек при деплое контрокта
args := data.(struct {
wallet interop.Hash160
})
if len(args.wallet) != interop.Hash160Len {
panic("Invalid hash of wallet")
}
ctx := storage.GetContext()
storage.Put(ctx, walletKey, args.wallet)
}
func getBalance(wallet interop.Hash160) int {
rpcClient, err := rpcclient.New(context.Background(), "http://localhost:20332", rpcclient.Options{})
if err != nil {
return 0
}
addressHash, err := util.Uint160DecodeStringLE(string(wallet))
if err != nil {
return 0
}
balances, err := rpcClient.GetNEP11Balances(addressHash)
if err != nil {
return 0;
}
return balances
}
func Deposit(walletAddr string, amount int) (string, error) {
// Create RPC client
rpcClient, err := rpcclient.New(context.Background(), "http://localhost:20332", rpcclient.Options{})
if err != nil {
return "", fmt.Errorf("failed to create RPC client: %v", err)
}
addressHash, err := util.Uint160DecodeStringLE(walletAddr)
if err != nil {
return "", fmt.Errorf("invalid wallet address: %v", err)
}
w, err := wallet.NewWallet("path_to_wallet_file") // Replace with actual wallet file path
if err != nil {
return "", fmt.Errorf("failed to load wallet: %v", err)
}
account, err := w.GetAccount("your_account_name") // Replace with your account name
if err != nil {
return "", fmt.Errorf("failed to get account: %v", err)
}
amountInCoins := util.Fixed8(amount) // Amount to transfer
tx, err := neotx.NewTransfer(account, addressHash, amountInCoins)
if err != nil {
return "", fmt.Errorf("failed to create transfer transaction: %v", err)
}
// Sign the transaction with the sender's private key
if err := tx.Sign(account.PrivateKey()); err != nil {
return "", fmt.Errorf("failed to sign transaction: %v", err)
}
// Send the transaction to the blockchain
txID, err := rpcClient.SendRawTransaction(tx)
if err != nil {
return "", fmt.Errorf("failed to send transaction: %v", err)
}
// Return the transaction ID
return txID.String(), nil
}
func Transfer(from interop.Hash160, to interop.Hash160, amount int) bool {
if getBalance(from) < amount {
func DeductTokens(wallet interop.Hash160, amount int) bool {
balance := gas.BalanceOf(wallet)
if balance < amount {
runtime.Log(fmt.Sprintf("Insufficient balance for wallet: %x", wallet))
return false
}
Deposit(from, -amount)
Deposit(to, amount)
return true
}
// todo нужно сделать несколько функций
// функция списания комиссии за присоединение к комнате - эта комиссия начисляется на кошелек контракта в prize pool
// функция списания комиссии за ответ на вопрос - комиссия начисляется на кошелек контракта в prize pool
// функция распределения prize pool между победителями и хостом
// может быть еще какие нибудь, потом обсудим
func ChargeParticipationFee(wallet interop.Hash160, fee int) bool {
if getBalance(wallet) < fee {
contractHash := runtime.GetExecutingScriptHash()
if !gas.Transfer(wallet, contractHash, amount, nil) {
runtime.Log(fmt.Sprintf("Failed to deduct %d tokens from wallet: %x", amount, wallet))
return false
}
Deposit(wallet, -fee)
runtime.Log(fmt.Sprintf("Successfully deducted %d tokens from wallet: %x", amount, wallet))
return true
}
func DistributeRewards(host interop.Hash160, winners []interop.Hash160, reward int) bool {
hostShare := reward * 50 / 100
Deposit(host, hostShare)
winnerShare := reward * 50 / 100 / len(winners)
for _, winner := range winners {
Deposit(winner, winnerShare)
func RewardTokens(wallet interop.Hash160, amount int) bool {
contractHash := runtime.GetExecutingScriptHash()
if !gas.Transfer(contractHash, wallet, amount, nil) {
runtime.Log(fmt.Sprintf("Failed to reward %d tokens to wallet: %x", amount, wallet))
return false
}
runtime.Log(fmt.Sprintf("Successfully rewarded %d tokens to wallet: %x", amount, wallet))
return true
}

View file

@ -110,7 +110,8 @@ func CreateRoom(host interop.Hash160, RoundWinnersCount, GameWinnersCount int) s
Rounds: []Round{},
}
// todo: Добавить списание токенов за создание комнаты
amount := 10
DeductTokens(host, amount);
setRoom(ctx, &room)
return id
@ -131,7 +132,8 @@ func JoinRoom(roomId string) bool {
}
}
// todo: Добавить списание токенов за вход в комнату
amount := 15
DeductTokens(wallet, amount)
var player = Player{
Wallet: wallet,
@ -241,7 +243,8 @@ func SendAnswer(roomId string, text string) bool {
return false // Only player can send content, player must be active, room status must be answering
}
// todo: Добавить списание токенов за добавление ответа
amount := 10
DeductTokens(wallet, amount)
var round = room.Rounds[len(room.Rounds)-1]
@ -501,6 +504,9 @@ func finishGame(ctx storage.Context, room *Room) bool {
sendMessageToPlayers("FinishGame", result)
// todo: Отправка награды победителям и хосту
for _, player := range winners {
RewardTokens(player.Wallet, 50)
}
room.Status = RoomStatusFinished
setRoom(ctx, room)