|
| 1 | +import os |
| 2 | +import subprocess |
| 3 | +import logging |
| 4 | +from solana.publickey import PublicKey |
| 5 | + |
| 6 | +logger = logging.getLogger(__name__) |
| 7 | +logger.setLevel(logging.DEBUG) |
| 8 | + |
| 9 | +solana_url = os.environ.get("SOLANA_URL", "http://localhost:8899") |
| 10 | +evm_loader_id = os.environ.get("EVM_LOADER") |
| 11 | +neon_cli_timeout = float(os.environ.get("NEON_CLI_TIMEOUT", "0.1")) |
| 12 | + |
| 13 | +class solana_cli: |
| 14 | + def call(self, *args): |
| 15 | + try: |
| 16 | + cmd = ["solana", |
| 17 | + "--url", solana_url, |
| 18 | + ] + list(args) |
| 19 | + print(cmd) |
| 20 | + return subprocess.check_output(cmd, universal_newlines=True) |
| 21 | + except subprocess.CalledProcessError as err: |
| 22 | + import sys |
| 23 | + logger.debug("ERR: solana error {}".format(err)) |
| 24 | + raise |
| 25 | + |
| 26 | + |
| 27 | +class neon_cli: |
| 28 | + def call(self, *args): |
| 29 | + try: |
| 30 | + cmd = ["neon-cli", |
| 31 | + "--commitment=recent", |
| 32 | + "--url", solana_url, |
| 33 | + "--evm_loader={}".format(evm_loader_id), |
| 34 | + ] + list(args) |
| 35 | + print(cmd) |
| 36 | + return subprocess.check_output(cmd, timeout=neon_cli_timeout, universal_newlines=True) |
| 37 | + except subprocess.CalledProcessError as err: |
| 38 | + import sys |
| 39 | + logger.debug("ERR: neon-cli error {}".format(err)) |
| 40 | + raise |
| 41 | + |
| 42 | +def read_elf_params(out_dict): |
| 43 | + logger.debug('load for solana_url={} and evm_loader_id={}'.format(solana_url, evm_loader_id)) |
| 44 | + res = solana_cli().call('program', 'dump', evm_loader_id, './evm_loader.dump') |
| 45 | + substr = "Wrote program to " |
| 46 | + path = "" |
| 47 | + for line in res.splitlines(): |
| 48 | + if line.startswith(substr): |
| 49 | + path = line[len(substr):].strip() |
| 50 | + if path == "": |
| 51 | + raise Exception("cannot program dump for ", evm_loader_id) |
| 52 | + for param in neon_cli().call("neon-elf-params", path).splitlines(): |
| 53 | + if param.startswith('NEON_') and '=' in param: |
| 54 | + v = param.split('=') |
| 55 | + out_dict[v[0]] = v[1] |
| 56 | + |
| 57 | +ELF_PARAMS = {} |
| 58 | +read_elf_params(ELF_PARAMS) |
| 59 | +COLLATERAL_POOL_BASE = ELF_PARAMS.get("NEON_POOL_BASE") |
| 60 | +ETH_TOKEN_MINT_ID: PublicKey = PublicKey(ELF_PARAMS.get("NEON_TOKEN_MINT")) |
0 commit comments