backend/app/utils/blockchain.py

131 lines
3.5 KiB
Python
Raw Normal View History

2022-10-08 12:38:54 +03:00
from pydantic import BaseModel
import requests as r
2022-10-08 14:39:52 +03:00
import json
from time import sleep
from typing import List
2022-10-08 12:38:54 +03:00
URL = 'https://hackathon.lsp.team/hk'
2022-10-08 14:39:52 +03:00
base_headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
2022-10-08 12:38:54 +03:00
2022-10-08 14:39:52 +03:00
class Wallet(BaseModel):
2022-10-08 12:38:54 +03:00
publicKey: str
privateKey: str
2022-10-08 14:39:52 +03:00
class WalletBalance(BaseModel):
matic: float
coins: float
class TransHash(BaseModel):
transaction_hash: str
class NftInfo(BaseModel):
uri: str
tokens: List[int]
class TransactionHistory(BaseModel):
hash: str
timestamp: int
token_name: str
from_wallet: str
to_wallet: str
def create_wallet() -> Wallet:
2022-10-08 12:38:54 +03:00
response = r.post(URL+'/v1/wallets/new')
data = response.json()
2022-10-08 14:39:52 +03:00
return Wallet(publicKey=data['publicKey'], privateKey=data['privateKey'])
def check_transaction(trans_hash: str) -> str:
res = r.get(URL + '/v1/transfers/status/'+trans_hash, data=json.dumps({
'transactionHash': trans_hash
}),
headers=base_headers
)
return res.json()['status']
def transfer_rubbles(my_wallet_private_key, transfer_publick_key: str, amount: float) -> TransHash:
response = r.post(URL+'/v1/transfers/ruble', data=json.dumps({
"fromPrivateKey": my_wallet_private_key,
"toPublicKey": transfer_publick_key,
"amount": amount
}),
headers={
'Content-Type': 'application/json',
'Accept': 'application/json'
}
)
return TransHash(transaction_hash=response.json()['transaction'])
def create_nft(wallet_public_key: str, string_url: str) -> TransHash:
response = r.post(URL + '/v1/nft/generate', data=json.dumps(
{
"toPublicKey": wallet_public_key,
"uri": string_url,
"nftCount": 1
}
),
headers=base_headers
)
return TransHash(transaction_hash=response.json()['transaction_hash'])
def get_nfts(wallet_public_key: str) -> List[NftInfo]:
res = r.get(URL+f'/v1/wallets/{wallet_public_key}/nft/balance')
print(res.json())
return list(
map(
lambda res: NftInfo(
uri=res['uri'],
tokens=res['tokens']
),
res.json()['balance']
),
)
def get_history(wallet_public_key: str) -> List[TransactionHistory]:
res = r.post(URL+f'/v1/wallets/{wallet_public_key}/history', data=json.dumps({
"page": 0,
"offset": 100,
"sort": "asc"
}), headers=base_headers)
return list(
map(
lambda res: TransactionHistory(
hash=res['hash'],
timestamp=res['timeStamp'],
token_name=res['tokenName'],
from_wallet=res['from'],
to_wallet=res['to']
),
res.json()['history']
),
)
def transfer_nft(my_private_wallet_key: str, transfer_publick_key: str, token_id: int) -> TransHash:
res = r.post(URL+'/v1/transfers/nft', data=json.dumps(
{
"fromPrivateKey": my_private_wallet_key,
"toPublicKey": transfer_publick_key,
"tokenId": token_id
}
), headers=base_headers)
return TransHash(transaction_hash=res.json()['transaction_hash'])
def get_balance(my_public_wallet_key: str) -> WalletBalance:
res = r.get(URL+f'/v1/wallets/{my_public_wallet_key}/balance')
return WalletBalance(matic=res.json()['maticAmount'], coins=res.json()['coinsAmount'])