Skip to content

Poupulate nadabot data #46

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Draft
wants to merge 21 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
184 changes: 183 additions & 1 deletion indexer_app/management/commands/populatedata.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@
Pot,
PotApplication,
PotApplicationReview,
PotFactory,
PotPayout,
PotPayoutChallenge,
PotPayoutChallengeAdminResponse,
)
from tokens.models import Token
from nadabot.models import Provider, NadabotRegistry, Stamp, Group


class Command(BaseCommand):
Expand Down Expand Up @@ -213,8 +215,188 @@ def handle(self, *args, **options):
page += 1
else:
break
# Nadabot
NADABOT_ID = "v2new.staging.nadabot.near"
registry, _ = Account.objects.get_or_create(id=NADABOT_ID)
url = f"{settings.FASTNEAR_RPC_URL}/account/{NADABOT_ID}/view/get_contract_source_metadata"
response = requests.get(url)
if response.status_code != 200:
print(
f"Request for nadabot source metadata failed ({response.status_code}) with message: {response.text}"
)
return
source_metadata = response.json()
print("........", source_metadata)
url = f"{settings.FASTNEAR_RPC_URL}/account/{NADABOT_ID}/view/get_config"
response = requests.get(url)
if response.status_code != 200:
print(
f"Request for nadabot config failed ({response.status_code}) with message: {response.text}"
)
return
config = response.json()
print("... requested config, now creating reg..")
owner, _ = Account.objects.get_or_create(id=config["owner"])
reg_defaults = {
"owner": owner,
"created_at": datetime.fromtimestamp(1711744807),
"updated_at": datetime.fromtimestamp(1711744807),
"source_metadata": source_metadata
}
nadabot_registry, _ = NadabotRegistry.objects.update_or_create(
id=registry, defaults=reg_defaults
)
if config.get("admins"):
for admin_id in config["admins"]:
admin, _ = Account.objects.get_or_create(id=admin_id)
nadabot_registry.admins.add(admin)
url = f"{settings.FASTNEAR_RPC_URL}/account/{NADABOT_ID}/view/get_providers"
response = requests.get(url)
if response.status_code != 200:
print(
f"Request for provider data failed ({response.status_code}) with message: {response.text}"
)
return
providers = response.json()
print("provider data; ", providers)
for provider in providers:
print("sleeping for 1 second")
time.sleep(1)
submitter, _ = Account.objects.get_or_create(id=provider["submitted_by"])
contract, _ = Account.objects.get_or_create(id=provider["contract_id"])
# provider_id = provider["id"]
provider_default = {
"contract": contract,
"method_name": provider["method_name"],
"name": provider["provider_name"],
"description": provider.get("description"),
"status": provider["status"],
"admin_notes": provider.get("admin_notes"),
"default_weight": provider["default_weight"],
"gas": provider.get("gas"),
"tags": provider.get("tags"),
"icon_url": provider.get("icon_url"),
"external_url": provider.get("external_url"),
"submitted_by_id": provider["submitted_by"],
"submitted_at": datetime.fromtimestamp(provider.get("submitted_at_ms") / 1000),
"stamp_validity_ms": provider.get("stamp_validity_ms"),
"account_id_arg_name": provider["account_id_arg_name"],
"custom_args": provider.get("custom_args"),
"registry_id": NADABOT_ID
}
provider, _ = Provider.objects.update_or_create(
on_chain_id=provider["id"],
defaults=provider_default
)

# stamps
url = f"{settings.FASTNEAR_RPC_URL}/account/{NADABOT_ID}/view/get_stamps"
response = requests.get(url)
if response.status_code != 200:
print(
f"Request for stamps data failed ({response.status_code}) with message: {response.text}"
)
return
stamps = response.json()
for stamp in stamps:
user, _ = Account.objects.get_or_create(id=stamp["user_id"])
provider, _ = Provider.objects.get_or_create(on_chain_id=stamp["provider"]["id"])
stamp_default = {
"verified_at": datetime.fromtimestamp(stamp["validated_at_ms"] / 1000)
}
stamp_obj, _ = Stamp.objects.update_or_create(
user=user,
provider=provider,
defaults=stamp_default
)

# Groups
url = f"{settings.FASTNEAR_RPC_URL}/account/{NADABOT_ID}/view/get_groups"
response = requests.get(url)
if response.status_code != 200:
print(
f"Request for groups data failed ({response.status_code}) with message: {response.text}"
)
return
groups = response.json()
for group in groups:
print("the roup.. ", group)
rule = group['rule']
rule_key = rule
rule_val = None
if type(rule) == dict:
rule_key = next(iter(rule))
rule_val = rule.get(rule_key)

group_default = {
"name": group["name"],
"created_at": datetime.now(),
"updated_at": datetime.now(),
"rule_type": rule_key,
"rule_val": rule_val
}
group_obj, _ = Group.objects.update_or_create(
id=group["id"],
defaults=group_default
)
if group.get("providers"):
for group_provider_id in group["providers"]:
group_provider, _ = Provider.objects.get_or_create(on_chain_id=group_provider_id)
group_obj.providers.add(group_provider)

# pot factory
POTFACTORY_ID = "v1.potfactory.potlock.near"
pot_factory, _ = Account.objects.get_or_create(id=POTFACTORY_ID)
# get pot factory metadata from fastnear
url = f"{settings.FASTNEAR_RPC_URL}/account/{POTFACTORY_ID}/view/get_contract_source_metadata"
response = requests.get(url)
if response.status_code != 200:
print(
f"Request for pot factory metadata data failed ({response.status_code}) with message: {response.text}"
)
return
metadata = response.json()
print("pot factory metadata; ", metadata)

# get pot factory config
url = f"{settings.FASTNEAR_RPC_URL}/account/{POTFACTORY_ID}/view/get_config"
response = requests.get(url)
if response.status_code != 200:
print(
f"Request for pot factory config data failed ({response.status_code}) with message: {response.text}"
)
return
config = response.json()
# get pot factory owner
owner, _ = Account.objects.get_or_create(id=config["owner"])
protocol_fee_recipient_account, _ = Account.objects.get_or_create(
id=config["protocol_fee_recipient_account"],
)
defaults = {
"owner": owner,
"deployed_at": datetime.fromtimestamp(1707662008),
"source_metadata": metadata,
"protocol_fee_basis_points": config["protocol_fee_basis_points"],
"protocol_fee_recipient": protocol_fee_recipient_account,
"require_whitelist": config["require_whitelist"],
}
# Create Factory object
factory, factory_created = PotFactory.objects.update_or_create(
id=pot_factory, defaults=defaults
)

if config.get("admins"):
for admin_id in config["admins"]:
admin, _ = Account.objects.get_or_create(
id=admin_id,
)
factory.admins.add(admin)

# Add whitelisted deployers to the PotFactory
if config.get("whitelisted_deployers"):
for deployer_id in config["whitelisted_deployers"]:
deployer, _ = Account.objects.get_or_create(id=deployer_id)
factory.whitelisted_deployers.add(deployer)
# pots
near_acct, _ = Account.objects.get_or_create(id="near")
url = f"{settings.FASTNEAR_RPC_URL}/account/{POTFACTORY_ID}/view/get_pots"
Expand Down Expand Up @@ -477,7 +659,7 @@ def handle(self, *args, **options):
for payout in config["payouts"]:
paid_at = (
None
if "paid_at" not in payout
if payout.get("paid_at") is None
else datetime.fromtimestamp(payout["paid_at"] / 1000)
)
recipient, _ = Account.objects.get_or_create(
Expand Down
72 changes: 39 additions & 33 deletions indexer_app/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,15 @@ async def handle_new_nadabot_registry(
try:
registry, _ = await Account.objects.aget_or_create(id=receiverId)
owner, _ = await Account.objects.aget_or_create(id=data["owner"])
reg_defaults = {
"owner": owner,
"created_at": created_at,
"updated_at": created_at,
"source_metadata": data.get('source_metadata')
}
nadabot_registry, created = await NadabotRegistry.objects.aupdate_or_create(
id=registry,
owner=owner,
created_at=created_at,
updated_at=created_at,
source_metadata=data.get("source_metadata"),
defaults=reg_defaults
)

if data.get("admins"):
Expand Down Expand Up @@ -1063,28 +1066,24 @@ async def handle_new_provider(data: dict, receiverId: str, signerId: str):
await cache.aset("last_id", provider_id + 1)

provider = await Provider.objects.aupdate_or_create(
on_chain_id=provider_id,
contract=contract,
method_name=data["method_name"],
name=data["provider_name"],
description=data.get("description"),
status=data["status"],
admin_notes=data.get("admin_notes"),
default_weight=data["default_weight"],
gas=data.get("gas"),
tags=data.get("tags"),
icon_url=data.get("icon_url"),
external_url=data.get("external_url"),
submitted_by_id=data["submitted_by"],
submitted_at=datetime.fromtimestamp(data.get("submitted_at_ms") / 1000),
stamp_validity_ms=(
datetime.fromtimestamp(data.get("stamp_validity_ms") / 1000)
if data.get("stamp_validity_ms")
else None
),
account_id_arg_name=data["account_id_arg_name"],
custom_args=data.get("custom_args"),
registry_id=receiverId,
on_chain_id=provider_id,
contract=contract,
method_name=data["method_name"],
name=data["provider_name"],
description=data.get("description"),
status=data["status"],
admin_notes=data.get("admin_notes"),
default_weight=data["default_weight"],
gas=data.get("gas"),
tags=data.get("tags"),
icon_url=data.get("icon_url"),
external_url=data.get("external_url"),
submitted_by_id=data["submitted_by"],
submitted_at = datetime.fromtimestamp(data.get("submitted_at_ms") / 1000),
stamp_validity_ms = data.get("stamp_validity_ms"),
account_id_arg_name = data["account_id_arg_name"],
custom_args = data.get("custom_args"),
registry_id=receiverId
)
except Exception as e:
logger.error(f"Failed to add new stamp provider: {e}")
Expand All @@ -1100,10 +1099,13 @@ async def handle_add_stamp(data: dict, receiverId: str, signerId: str):
provider, _ = await Provider.objects.aget_or_create(on_chain_id=data["provider_id"])

try:
stamp_default = {
"verified_at": datetime.fromtimestamp(data["validated_at_ms"] / 1000)
}
stamp = await Stamp.objects.aupdate_or_create(
user=user,
provider=provider,
verified_at=datetime.fromtimestamp(data["validated_at_ms"] / 1000),
defaults=stamp_default
)
except Exception as e:
logger.error(f"Failed to create stamp: {e}")
Expand All @@ -1123,13 +1125,17 @@ async def handle_new_group(data: dict, created_at: datetime):
rule_key = next(iter(rule))
rule_val = rule.get(rule_key)

group = await Group.objects.acreate(
group_default = {
"name": group_data["name"],
"created_at": created_at,
"updated_at": created_at,
"rule_type": rule_key,
"rule_val": rule_val
}

group, _ = Group.objects.update_or_create(
id=group_data["id"],
name=group_data["name"],
created_at=created_at,
updated_at=created_at,
rule_type=rule_key,
rule_val=rule_val,
defaults=group_default
)

logger.info(f"addding provider.... : {group_data['providers']}")
Expand Down
2 changes: 1 addition & 1 deletion nadabot/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
BASE_PATTERN = (
r"nadabot\.testnet"
if settings.ENVIRONMENT == "testnet"
else r"v\d+(?:new)?\.[a-zA-Z]+\.nadabot\.near"
else r"v\d+(?:new)?(?:\.[a-zA-Z]+)?\.nadabot\.near"
)


Expand Down