kopia lustrzana https://github.com/bugout-dev/moonstream
158 wiersze
5.9 KiB
Python
158 wiersze
5.9 KiB
Python
|
import argparse
|
||
|
import logging
|
||
|
from typing import Dict, List, Optional, Any
|
||
|
|
||
|
from .. import db
|
||
|
from ..contracts import Dropper_interface, ERC20_interface
|
||
|
from ..settings import BLOCKCHAIN_WEB3_PROVIDERS, UNSUPPORTED_BLOCKCHAIN_ERROR_MESSAGE
|
||
|
|
||
|
|
||
|
def run_fill_raw_amount(args: argparse.Namespace):
|
||
|
# sync raw_amount column with amount column
|
||
|
|
||
|
# create chache of claim token type
|
||
|
# newtwork contract and list of claims with their token type
|
||
|
|
||
|
token_types: Dict[str, Dict[str, List[Dict[str, Any]]]] = dict()
|
||
|
|
||
|
with db.yield_db_session_ctx() as db_session:
|
||
|
|
||
|
res = db_session.execute(
|
||
|
"""select distinct dropper_contracts.blockchain, dropper_contracts.address, dropper_claims.claim_id from dropper_contracts
|
||
|
left join dropper_claims on dropper_contracts.id = dropper_claims.dropper_contract_id
|
||
|
where dropper_claims.claim_id is not null"""
|
||
|
)
|
||
|
results = res.fetchall()
|
||
|
|
||
|
for blockchain, address, claim_id in results:
|
||
|
if blockchain not in token_types:
|
||
|
token_types[blockchain] = dict()
|
||
|
if address not in token_types[blockchain]:
|
||
|
token_types[blockchain][address] = list()
|
||
|
token_types[blockchain][address].append(claim_id)
|
||
|
|
||
|
db_session.execute(
|
||
|
"""
|
||
|
create table temptest
|
||
|
(
|
||
|
blockchain varchar,
|
||
|
address varchar,
|
||
|
claim_id varchar,
|
||
|
token_type varchar,
|
||
|
zeros varchar
|
||
|
)
|
||
|
|
||
|
"""
|
||
|
)
|
||
|
|
||
|
for blockchain in token_types:
|
||
|
if blockchain not in BLOCKCHAIN_WEB3_PROVIDERS:
|
||
|
logging.warn(
|
||
|
f"Blockchain: {blockchain}. {UNSUPPORTED_BLOCKCHAIN_ERROR_MESSAGE}"
|
||
|
)
|
||
|
continue
|
||
|
for address in token_types[blockchain]:
|
||
|
dropper_contract = Dropper_interface.Contract(
|
||
|
BLOCKCHAIN_WEB3_PROVIDERS[blockchain], address
|
||
|
)
|
||
|
|
||
|
for claim_id in token_types[blockchain][address]:
|
||
|
claim_info = dropper_contract.getClaim(claim_id).call()
|
||
|
zeros = None
|
||
|
if claim_info[0] == 20:
|
||
|
erc20_contract = ERC20_interface.Contract(
|
||
|
BLOCKCHAIN_WEB3_PROVIDERS[blockchain], claim_info[1]
|
||
|
)
|
||
|
zeros = "0" * erc20_contract.decimals()
|
||
|
|
||
|
db_session.execute(
|
||
|
"""
|
||
|
insert into temptest
|
||
|
(
|
||
|
blockchain,
|
||
|
address,
|
||
|
claim_id,
|
||
|
token_type,
|
||
|
zeros
|
||
|
|
||
|
)
|
||
|
values
|
||
|
(
|
||
|
:blockchain,
|
||
|
:address,
|
||
|
:claim_id,
|
||
|
:token_type,
|
||
|
:zeros
|
||
|
)
|
||
|
""",
|
||
|
{
|
||
|
"blockchain": blockchain,
|
||
|
"address": address,
|
||
|
"claim_id": str(claim_id),
|
||
|
"token_type": str(claim_info[0]),
|
||
|
"zeros": zeros,
|
||
|
},
|
||
|
)
|
||
|
|
||
|
db_session.commit()
|
||
|
|
||
|
# update raw_amount column
|
||
|
db_session.execute(
|
||
|
"""
|
||
|
update
|
||
|
dropper_claimants
|
||
|
set
|
||
|
raw_amount = (
|
||
|
CASE
|
||
|
WHEN (
|
||
|
select
|
||
|
DISTINCT temptest.token_type
|
||
|
from
|
||
|
temptest
|
||
|
inner join dropper_claims ON temptest.claim_id :: int = dropper_claims.claim_id
|
||
|
where
|
||
|
dropper_claims.id = dropper_claimants.dropper_claim_id
|
||
|
) :: int = 20 THEN CASE
|
||
|
WHEN dropper_claimants.amount is not null
|
||
|
and dropper_claimants.amount > 0 THEN CONCAT(
|
||
|
CAST(dropper_claimants.amount as varchar),
|
||
|
(
|
||
|
select
|
||
|
temptest.zeros
|
||
|
from
|
||
|
temptest
|
||
|
inner join dropper_claims ON temptest.claim_id :: int = dropper_claims.claim_id
|
||
|
where
|
||
|
dropper_claims.id = dropper_claimants.dropper_claim_id
|
||
|
)
|
||
|
)
|
||
|
WHEN true THEN CAST(dropper_claimants.amount as varchar)
|
||
|
END
|
||
|
WHEN true THEN CAST(dropper_claimants.amount as varchar)
|
||
|
END
|
||
|
);
|
||
|
"""
|
||
|
)
|
||
|
db_session.commit()
|
||
|
|
||
|
|
||
|
def main():
|
||
|
parser = argparse.ArgumentParser(
|
||
|
description="dao: The command line interface to Moonstream DAO"
|
||
|
)
|
||
|
parser.set_defaults(func=lambda _: parser.print_help())
|
||
|
subparsers = parser.add_subparsers()
|
||
|
|
||
|
run_fill_raw_amount_parser = subparsers.add_parser(
|
||
|
"fill_raw_amount", help="Fill raw_amount column"
|
||
|
)
|
||
|
|
||
|
run_fill_raw_amount_parser.set_defaults(func=run_fill_raw_amount)
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
args.func(args)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|