Skip to content

Commit

Permalink
Merge pull request #372 from planetarium/release/2.3.0
Browse files Browse the repository at this point in the history
Release/2.3.0
  • Loading branch information
U-lis authored Jan 27, 2025
2 parents 86eab45 + e498bcb commit 2ac1d9f
Show file tree
Hide file tree
Showing 9 changed files with 164 additions and 13 deletions.
6 changes: 3 additions & 3 deletions common/lib9c/actions/burn_asset.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from typing import Optional

from lib9c.actions import ActionBase
from lib9c.models.address import Address
from lib9c.models.fungible_asset_value import FungibleAssetValue
from common.lib9c.actions import ActionBase
from common.lib9c.models.address import Address
from common.lib9c.models.fungible_asset_value import FungibleAssetValue


class BurnAsset(ActionBase):
Expand Down
2 changes: 1 addition & 1 deletion common/lib9c/actions/issue_token.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from common.lib9c.actions import ActionBase
from common.lib9c.models.address import Address
from lib9c.models.fungible_asset_value import FungibleAssetValue
from common.lib9c.models.fungible_asset_value import FungibleAssetValue


class ItemSpec:
Expand Down
2 changes: 1 addition & 1 deletion common/utils/transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def create_unsigned_tx(planet_id: PlanetID, public_key: str, address: str, nonce
# MaxGasPrice (see also Mead section for the currency spec)
b"m": [
{"decimalPlaces": b"\x12", "minters": None, "ticker": "Mead"},
1000000000000000000,
10_000_000_000_000,
],
# Nonce
b"n": nonce,
Expand Down
111 changes: 111 additions & 0 deletions iap/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import os

import requests
from fastapi import APIRouter

from common._graphql import GQL
from common.utils.receipt import PlanetID
from iap.api import history, purchase, product, admin, l10n, mileage

router = APIRouter(
Expand All @@ -18,3 +23,109 @@

for view in __all__:
router.include_router(view.router)

PLANET_DICT = {
"ODIN": {
"planet_id": PlanetID.ODIN,
"url": os.environ.get("ODIN_GQL_URL"),
},
"HEIMDALL": {
"planet_id": PlanetID.HEIMDALL,
"url": os.environ.get("HEIMDALL_GQL_URL"),

},
# "IDUN": {
# "planet_id": PlanetID.IDUN,
# "url": os.environ.get("ODIN_GQL_URL"),
#
# },
"THOR": {
"planet_id": PlanetID.THOR,
"url": os.environ.get("THOR_GQL_URL"),

},
}


@router.get("/balance/{planet}")
def get_balance(planet: str):
"""Report IAP Garage stock"""
target_planet = PLANET_DICT[planet.upper()]
url = target_planet["url"]
gql = GQL(url, jwt_secret=os.environ.get("HEADLESS_GQL_JWT_SECRET"))
query = """
query balanceQuery(
$address: Address! = "0xCb75C84D76A6f97A2d55882Aea4436674c288673"
) {
stateQuery {
BlackCat: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1001", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
RedDongle: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1002", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
Valkyrie: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1003", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
LilFenrir: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1004", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
ThorRune: balance (
address: $address,
currency: {ticker: "FAV__RUNESTONE_GOLDENTHOR", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
GoldenMeat: balance (
address: $address,
currency: {ticker: "Item_NT_800202", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
CriRune: balance (
address: $address,
currency: {ticker: "FAV__RUNESTONE_CRI", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
EmeraldDust: balance (
address: $address,
currency: {ticker: "Item_NT_600203", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
Crystal: balance (
address: $address,
currency: {ticker: "FAV__CRYSTAL", decimalPlaces: 18, minters: [], }
) { currency {ticker} quantity }
hourglass: balance (
address: $address,
currency: {ticker: "Item_NT_400000", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
APPotion: balance (
address: $address,
currency: {ticker: "Item_NT_500000", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
GoldenLeafRune: balance (
address: $address,
currency: {ticker: "FAV__RUNE_GOLDENLEAF", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
GoldenDust: balance (
address: $address,
currency: {ticker: "Item_NT_600201", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
RubyDust: balance (
address: $address,
currency: {ticker: "Item_NT_600202", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
SilverDust: balance (
address: $address,
currency: {ticker: "Item_NT_800201", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
}
}"""

resp = requests.post(url, json={"query": query}, headers={"Authorization": f"Bearer {gql.create_token()}"})
data = resp.json()["data"]["stateQuery"]

msg = {}
for name, balance in data.items():
msg[name] = {"ticker": balance["currency"]["ticker"], "quantity": float(balance["quantity"])}

return msg
6 changes: 3 additions & 3 deletions tests/utils/test_transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,15 @@ def test_get_same_byteshex():
],
b'g': b'E\x82%\r\r\xa3;\x06w\x9a\x84u\xd2\x83\xd5\xdd!\x0ch;\x9b\x99\x9dt\xd0?\xacOX\xfak\xce',
b'l': 1,
b'm': [{'decimalPlaces': b'\x12', 'minters': None, 'ticker': 'Mead'}, 1000000000000000000],
b'm': [{'decimalPlaces': b'\x12', 'minters': None, 'ticker': 'Mead'}, 10_000_000_000_000],
b'n': 11,
b'p': b'\x04\x97\x0c\x06QVU|O#\xa0\x89E\xed6\xe5\x1f`4\x14\xd5K\x98\xa6\xd0\x1akpC\xb96\xc9\xef\xa9\xea4dsa\x02\x02\x89|\xa6\xa8u\xc3\xcf\x0b\xe8\x8aV4\xdd(Lx\xed\x1bM\x95\x8c\xf6HV',
b's': b'\x0e\x19\xa9\x92\xad\x97kI\x86\t\x88\x13\xdf\xcd$\xb0wZ\xc0\xaa',
b't': '2023-11-22T01:56:33.194530Z',
b'u': []
}

expected = "64313a616c6475373a747970655f69647531313a636c61696d5f6974656d7375363a76616c7565736475323a63646c6c32303ae27560fc2e0cd920633eddbcbf09e703a75827496c6c647531333a646563696d616c506c61636573313a0075373a6d696e746572736e75363a7469636b65727531343a4974656d5f4e545f353030303030656931656565656575323a696431363a3979aba1631d25438c8bf93eed328eff75313a6d7535303a7b22736561736f6e5f70617373223a207b226e223a205b315d2c202270223a205b5d2c202274223a2022636c61696d227d7d656565313a6733323a4582250d0da33b06779a8475d283d5dd210c683b9b999d74d03fac4f58fa6bce313a6c693165313a6d6c647531333a646563696d616c506c61636573313a1275373a6d696e746572736e75363a7469636b657275343a4d6561646569313030303030303030303030303030303030306565313a6e69313165313a7036353a04970c065156557c4f23a08945ed36e51f603414d54b98a6d01a6b7043b936c9efa9ea346473610202897ca6a875c3cf0be88a5634dd284c78ed1b4d958cf64856313a7332303a0e19a992ad976b4986098813dfcd24b0775ac0aa313a747532373a323032332d31312d32325430313a35363a33332e3139343533305a313a756c6565"
expected = "64313a616c6475373a747970655f69647531313a636c61696d5f6974656d7375363a76616c7565736475323a63646c6c32303ae27560fc2e0cd920633eddbcbf09e703a75827496c6c647531333a646563696d616c506c61636573313a0075373a6d696e746572736e75363a7469636b65727531343a4974656d5f4e545f353030303030656931656565656575323a696431363a3979aba1631d25438c8bf93eed328eff75313a6d7535303a7b22736561736f6e5f70617373223a207b226e223a205b315d2c202270223a205b5d2c202274223a2022636c61696d227d7d656565313a6733323a4582250d0da33b06779a8475d283d5dd210c683b9b999d74d03fac4f58fa6bce313a6c693165313a6d6c647531333a646563696d616c506c61636573313a1275373a6d696e746572736e75363a7469636b657275343a4d656164656931303030303030303030303030306565313a6e69313165313a7036353a04970c065156557c4f23a08945ed36e51f603414d54b98a6d01a6b7043b936c9efa9ea346473610202897ca6a875c3cf0be88a5634dd284c78ed1b4d958cf64856313a7332303a0e19a992ad976b4986098813dfcd24b0775ac0aa313a747532373a323032332d31312d32325430313a35363a33332e3139343533305a313a756c6565"

assert expected == bencodex.dumps(value).hex()

Expand Down Expand Up @@ -75,7 +75,7 @@ def test_create_unsigned_tx():
datetime.datetime(2021, 10, 1, 5, 36, 33, 194530)
)

expected_tx = "64313a616c6475373a747970655f69647531313a636c61696d5f6974656d7375363a76616c7565736475323a63646c6c32303ae27560fc2e0cd920633eddbcbf09e703a75827496c6c647531333a646563696d616c506c61636573313a0075373a6d696e746572736e75363a7469636b65727531343a4974656d5f4e545f353030303030656931656565656575323a696431363a3979aba1631d25438c8bf93eed328eff75313a6d7535303a7b22736561736f6e5f70617373223a207b226e223a205b315d2c202270223a205b5d2c202274223a2022636c61696d227d7d656565313a6733323a4582250d0da33b06779a8475d283d5dd210c683b9b999d74d03fac4f58fa6bce313a6c693465313a6d6c647531333a646563696d616c506c61636573313a1275373a6d696e746572736e75363a7469636b657275343a4d6561646569313030303030303030303030303030303030306565313a6e693065313a7033333a024007a3342b03083e7c87e80b6daa9be6f7e1caae66c368fb32ca43994394ef3e313a7332303a8ba11bef1db41f3118f7478ccfcbe7f1af4650fa313a747532373a323032312d31302d30315430353a33363a33332e3139343533305a313a756c6565"
expected_tx = "64313a616c6475373a747970655f69647531313a636c61696d5f6974656d7375363a76616c7565736475323a63646c6c32303ae27560fc2e0cd920633eddbcbf09e703a75827496c6c647531333a646563696d616c506c61636573313a0075373a6d696e746572736e75363a7469636b65727531343a4974656d5f4e545f353030303030656931656565656575323a696431363a3979aba1631d25438c8bf93eed328eff75313a6d7535303a7b22736561736f6e5f70617373223a207b226e223a205b315d2c202270223a205b5d2c202274223a2022636c61696d227d7d656565313a6733323a4582250d0da33b06779a8475d283d5dd210c683b9b999d74d03fac4f58fa6bce313a6c693465313a6d6c647531333a646563696d616c506c61636573313a1275373a6d696e746572736e75363a7469636b657275343a4d656164656931303030303030303030303030306565313a6e693065313a7033333a024007a3342b03083e7c87e80b6daa9be6f7e1caae66c368fb32ca43994394ef3e313a7332303a8ba11bef1db41f3118f7478ccfcbe7f1af4650fa313a747532373a323032312d31302d30315430353a33363a33332e3139343533305a313a756c6565"
loaded_tx = bencodex.loads(unsigned_tx)

assert expected_tx == unsigned_tx.hex()
Expand Down
7 changes: 4 additions & 3 deletions worker/worker/manual/burn_asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
from common import logger
from common._crypto import Account
from common._graphql import GQL
from common.lib9c.actions.burn_asset import BurnAsset
from common.lib9c.models.address import Address
from common.lib9c.models.fungible_asset_value import FungibleAssetValue
from common.utils.aws import fetch_parameter, fetch_kms_key_id
from common.utils.receipt import PlanetID
from common.utils.transaction import create_unsigned_tx, append_signature_to_unsigned_tx
from lib9c.actions.burn_asset import BurnAsset
from lib9c.models.fungible_asset_value import FungibleAssetValue

# NOTE: Set these values by manual from here
PLANET_ID = PlanetID.XXX
Expand Down Expand Up @@ -43,7 +44,7 @@ def burn_asset(event, context):
nonce = data["nonce"]
amt = data["amount"]
amount = FungibleAssetValue.from_raw_data(ticker=amt[0], decimal_places=amt[1], amount=amt[2])
action = BurnAsset(owner=data["owner"], amount=amount, memo=data["memo"])
action = BurnAsset(owner=Address(data["owner"]), amount=amount, memo=data["memo"])
utx = create_unsigned_tx(planet_id=PLANET_ID, public_key=account.pubkey.hex(), address=account.address, nonce=nonce,
plain_value=action.plain_value, timestamp=datetime.utcnow() + timedelta(days=1)
)
Expand Down
4 changes: 2 additions & 2 deletions worker/worker/manual/issue_token.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
from common import logger
from common._crypto import Account
from common._graphql import GQL
from common.lib9c.actions.issue_token import IssueToken, ItemSpec
from common.lib9c.models.fungible_asset_value import FungibleAssetValue
from common.utils.aws import fetch_parameter, fetch_kms_key_id
from common.utils.receipt import PlanetID
from common.utils.transaction import create_unsigned_tx, append_signature_to_unsigned_tx
from lib9c.actions.issue_token import IssueToken, ItemSpec
from lib9c.models.fungible_asset_value import FungibleAssetValue

# NOTE: Set these values by manual from here
PLANET_ID = PlanetID.XXX
Expand Down
16 changes: 16 additions & 0 deletions worker/worker/status_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,22 @@ def check_token_balance(planet: PlanetID):
$address: Address! = "0xCb75C84D76A6f97A2d55882Aea4436674c288673"
) {
stateQuery {
BlackCat: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1001", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
RedDongle: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1002", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
Valkyrie: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1003", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
LilFenrir: balance (
address: $address,
currency: {ticker: "FAV__SOULSTONE_1004", decimalPlaces: 0, minters: [], }
) { currency {ticker} quantity }
ThorRune: balance (
address: $address,
currency: {ticker: "FAV__RUNESTONE_GOLDENTHOR", decimalPlaces: 0, minters: [], }
Expand Down
23 changes: 23 additions & 0 deletions worker/worker/tracker.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import json
import os
import boto3
from collections import defaultdict
from typing import Optional, Tuple

from datetime import datetime, timezone, timedelta
from gql.dsl import dsl_gql, DSLQuery
from sqlalchemy import create_engine, select
from sqlalchemy.orm import sessionmaker, scoped_session
Expand All @@ -24,6 +26,9 @@
True
)["Value"]

SQS_URL = os.environ.get("SQS_URL")
sqs = boto3.client("sqs", region_name=os.environ.get("REGION_NAME"))

LIMIT = 200

engine = create_engine(DB_URI, pool_size=5, max_overflow=5)
Expand Down Expand Up @@ -69,6 +74,24 @@ def track_tx(event, context):
).order_by(Receipt.id).limit(LIMIT)
).fetchall()

now = datetime.now(tz=timezone.utc)
created_receipt_list = sess.scalars(
select(Receipt).where(
Receipt.created_at <= now - timedelta(minutes=5),
Receipt.status == ReceiptStatus.VALID,
Receipt.tx_status == TxStatus.CREATED
).order_by(Receipt.id).limit(LIMIT)
).fetchall()

if created_receipt_list:
for created_receipt in created_receipt_list:
msg = {
"uuid": str(created_receipt.uuid),
}

sqs.send_message(QueueUrl=SQS_URL, MessageBody=json.dumps(msg))
logger.info(f"Found created receipt [{len(created_receipt_list)}], re queuing.")

result = defaultdict(list)
for receipt in receipt_list:
tx_id, tx_status, msg = process(GQL_DICT[receipt.planet_id], receipt.tx_id)
Expand Down

0 comments on commit 2ac1d9f

Please sign in to comment.