kopia lustrzana https://github.com/bugout-dev/moonworm
Porównaj commity
2 Commity
e8b12a5e6d
...
05274f355d
Autor | SHA1 | Data |
---|---|---|
Neeraj Kashyap | 05274f355d | |
Neeraj Kashyap | ec3e5bccb7 |
|
@ -106,8 +106,23 @@ def handle_brownie_generate(args: argparse.Namespace):
|
||||||
|
|
||||||
project_directory = args.project
|
project_directory = args.project
|
||||||
build_directory = os.path.join(project_directory, "build", "contracts")
|
build_directory = os.path.join(project_directory, "build", "contracts")
|
||||||
|
intermediate_dirs: List[str] = []
|
||||||
|
if args.foundry:
|
||||||
|
build_directory = os.path.join(project_directory, "out")
|
||||||
|
|
||||||
build_file_path = os.path.join(build_directory, f"{args.name}.json")
|
build_file_path = os.path.join(build_directory, f"{args.name}.json")
|
||||||
|
if args.foundry:
|
||||||
|
if args.sol_filename is not None:
|
||||||
|
build_file_path = os.path.join(
|
||||||
|
build_directory, args.sol_filename, f"{args.name}.json"
|
||||||
|
)
|
||||||
|
intermediate_dirs.append(args.sol_filename)
|
||||||
|
else:
|
||||||
|
build_file_path = os.path.join(
|
||||||
|
build_directory, f"{args.name}.sol", f"{args.name}.json"
|
||||||
|
)
|
||||||
|
intermediate_dirs.append(f"{args.name}.sol")
|
||||||
|
else:
|
||||||
if not os.path.isfile(build_file_path):
|
if not os.path.isfile(build_file_path):
|
||||||
raise IOError(
|
raise IOError(
|
||||||
f"File does not exist: {build_file_path}. Maybe you have to compile the smart contracts?"
|
f"File does not exist: {build_file_path}. Maybe you have to compile the smart contracts?"
|
||||||
|
@ -116,6 +131,9 @@ def handle_brownie_generate(args: argparse.Namespace):
|
||||||
with open(build_file_path, "r") as ifp:
|
with open(build_file_path, "r") as ifp:
|
||||||
build = json.load(ifp)
|
build = json.load(ifp)
|
||||||
|
|
||||||
|
if args.foundry:
|
||||||
|
build["contractName"] = args.name
|
||||||
|
|
||||||
relpath = os.path.relpath(project_directory, args.outdir)
|
relpath = os.path.relpath(project_directory, args.outdir)
|
||||||
splitted_relpath = [
|
splitted_relpath = [
|
||||||
f'"{item}"' for item in relpath.split(os.sep)
|
f'"{item}"' for item in relpath.split(os.sep)
|
||||||
|
@ -129,6 +147,8 @@ def handle_brownie_generate(args: argparse.Namespace):
|
||||||
args.name,
|
args.name,
|
||||||
splitted_relpath_string,
|
splitted_relpath_string,
|
||||||
prod=args.prod,
|
prod=args.prod,
|
||||||
|
foundry=args.foundry,
|
||||||
|
intermediate_dirs=intermediate_dirs,
|
||||||
)
|
)
|
||||||
write_file(interface, os.path.join(args.outdir, args.name + ".py"))
|
write_file(interface, os.path.join(args.outdir, args.name + ".py"))
|
||||||
|
|
||||||
|
@ -355,12 +375,22 @@ def generate_argument_parser() -> argparse.ArgumentParser:
|
||||||
"-p",
|
"-p",
|
||||||
"--project",
|
"--project",
|
||||||
required=True,
|
required=True,
|
||||||
help=f"Path to brownie project directory",
|
help=f"Path to brownie/foundry project directory",
|
||||||
|
)
|
||||||
|
generate_brownie_parser.add_argument(
|
||||||
|
"--foundry",
|
||||||
|
action="store_true",
|
||||||
|
help="Project is using Foundry (if not specified, the assumption is that the project uses brownie)",
|
||||||
|
)
|
||||||
|
generate_brownie_parser.add_argument(
|
||||||
|
"--sol-filename",
|
||||||
|
required=False,
|
||||||
|
help="Name of solidity file containing your contract; required if --foundry, moonworm will look for build artifacts in out/<this filename>, defaults to the contract name if not provided",
|
||||||
)
|
)
|
||||||
generate_brownie_parser.add_argument(
|
generate_brownie_parser.add_argument(
|
||||||
"--prod",
|
"--prod",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
help="Generate shippable python interface, in which abi and bytecode will be included inside the generated file",
|
help="Generate self-contained python interface, in which ABI and bytecode will be included inside the generated file",
|
||||||
)
|
)
|
||||||
generate_brownie_parser.set_defaults(func=handle_brownie_generate)
|
generate_brownie_parser.set_defaults(func=handle_brownie_generate)
|
||||||
|
|
||||||
|
|
|
@ -21,14 +21,19 @@ BROWNIE_INTERFACE_TEMPLATE_PATH = os.path.join(
|
||||||
BROWNIE_INTERFACE_PROD_TEMPLATE_PATH = os.path.join(
|
BROWNIE_INTERFACE_PROD_TEMPLATE_PATH = os.path.join(
|
||||||
os.path.dirname(__file__), "brownie_contract_prod.py.template"
|
os.path.dirname(__file__), "brownie_contract_prod.py.template"
|
||||||
)
|
)
|
||||||
|
BROWNIE_INTERFACE_FOUNDRY_TEMPLATE_PATH = os.path.join(
|
||||||
|
os.path.dirname(__file__), "brownie_contract_foundry.py.template"
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
with open(BROWNIE_INTERFACE_TEMPLATE_PATH, "r") as ifp:
|
with open(BROWNIE_INTERFACE_TEMPLATE_PATH, "r") as ifp:
|
||||||
BROWNIE_INTERFACE_TEMPLATE = ifp.read()
|
BROWNIE_INTERFACE_TEMPLATE = ifp.read()
|
||||||
with open(BROWNIE_INTERFACE_PROD_TEMPLATE_PATH, "r") as ifp:
|
with open(BROWNIE_INTERFACE_PROD_TEMPLATE_PATH, "r") as ifp:
|
||||||
BROWNIE_INTERFACE_PROD_TEMPLATE = ifp.read()
|
BROWNIE_INTERFACE_PROD_TEMPLATE = ifp.read()
|
||||||
|
with open(BROWNIE_INTERFACE_FOUNDRY_TEMPLATE_PATH, "r") as ifp:
|
||||||
|
BROWNIE_INTERFACE_FOUNDRY_TEMPLATE = ifp.read()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.warn(
|
logging.warn(
|
||||||
f"WARNING: Could not load cli template from ({BROWNIE_INTERFACE_TEMPLATE_PATH})/({BROWNIE_INTERFACE_PROD_TEMPLATE_PATH}):"
|
f"WARNING: Could not load cli template from ({BROWNIE_INTERFACE_TEMPLATE_PATH})/({BROWNIE_INTERFACE_PROD_TEMPLATE_PATH})/({BROWNIE_INTERFACE_FOUNDRY_TEMPLATE_PATH}):"
|
||||||
)
|
)
|
||||||
logging.warn(e)
|
logging.warn(e)
|
||||||
|
|
||||||
|
@ -962,6 +967,8 @@ def generate_brownie_interface(
|
||||||
cli: bool = True,
|
cli: bool = True,
|
||||||
format: bool = True,
|
format: bool = True,
|
||||||
prod: bool = False,
|
prod: bool = False,
|
||||||
|
foundry: bool = True,
|
||||||
|
intermediate_dirs: Optional[List[str]] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Generates Python code which allows you to interact with a smart contract with a given ABI, build data, and a given name.
|
Generates Python code which allows you to interact with a smart contract with a given ABI, build data, and a given name.
|
||||||
|
@ -988,6 +995,11 @@ def generate_brownie_interface(
|
||||||
7. `prod`: If True, creates a self-contained file. Generated code will not require reference to an
|
7. `prod`: If True, creates a self-contained file. Generated code will not require reference to an
|
||||||
existing brownie project at its runtime.
|
existing brownie project at its runtime.
|
||||||
|
|
||||||
|
8. `foundry`: If True, assumes a Foundry project structure.
|
||||||
|
|
||||||
|
9. intermediate_dirs: Currently only used for Foundry projects. Path to build file via intermediate
|
||||||
|
build subdirectory which takes the name of the Solidity file that the contract is implemented in.
|
||||||
|
|
||||||
|
|
||||||
## Outputs
|
## Outputs
|
||||||
The generated code as a string.
|
The generated code as a string.
|
||||||
|
@ -1011,6 +1023,14 @@ def generate_brownie_interface(
|
||||||
contract_body=contract_body,
|
contract_body=contract_body,
|
||||||
moonworm_version=MOONWORM_VERSION,
|
moonworm_version=MOONWORM_VERSION,
|
||||||
)
|
)
|
||||||
|
elif foundry:
|
||||||
|
content = BROWNIE_INTERFACE_FOUNDRY_TEMPLATE.format(
|
||||||
|
contract_body=contract_body,
|
||||||
|
moonworm_version=MOONWORM_VERSION,
|
||||||
|
relative_path=relative_path,
|
||||||
|
build_subdir=intermediate_dirs[0],
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
content = BROWNIE_INTERFACE_TEMPLATE.format(
|
content = BROWNIE_INTERFACE_TEMPLATE.format(
|
||||||
contract_body=contract_body,
|
contract_body=contract_body,
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
# Code generated by moonworm : https://github.com/moonstream-to/moonworm
|
||||||
|
# Moonworm version : {moonworm_version}
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any, Dict, List, Optional, Union
|
||||||
|
|
||||||
|
from brownie import Contract, network, project
|
||||||
|
from brownie.network.contract import ContractContainer
|
||||||
|
from eth_typing.evm import ChecksumAddress
|
||||||
|
|
||||||
|
|
||||||
|
PROJECT_DIRECTORY = os.path.abspath(os.path.join(os.path.dirname(__file__), {relative_path}))
|
||||||
|
BUILD_DIRECTORY = os.path.join(PROJECT_DIRECTORY, "out", "{build_subdir}")
|
||||||
|
|
||||||
|
def boolean_argument_type(raw_value: str) -> bool:
|
||||||
|
TRUE_VALUES = ["1", "t", "y", "true", "yes"]
|
||||||
|
FALSE_VALUES = ["0", "f", "n", "false", "no"]
|
||||||
|
|
||||||
|
if raw_value.lower() in TRUE_VALUES:
|
||||||
|
return True
|
||||||
|
elif raw_value.lower() in FALSE_VALUES:
|
||||||
|
return False
|
||||||
|
|
||||||
|
raise ValueError(
|
||||||
|
f"Invalid boolean argument: {{raw_value}}. Value must be one of: {{','.join(TRUE_VALUES + FALSE_VALUES)}}"
|
||||||
|
)
|
||||||
|
|
||||||
|
def bytes_argument_type(raw_value: str) -> str:
|
||||||
|
return raw_value
|
||||||
|
|
||||||
|
def get_abi_json(abi_name: str) -> List[Dict[str, Any]]:
|
||||||
|
abi_full_path = os.path.join(BUILD_DIRECTORY, f"{{abi_name}}.json")
|
||||||
|
if not os.path.isfile(abi_full_path):
|
||||||
|
raise IOError(
|
||||||
|
f"File does not exist: {{abi_full_path}}. Maybe you have to compile the smart contracts?"
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(abi_full_path, "r") as ifp:
|
||||||
|
build = json.load(ifp)
|
||||||
|
|
||||||
|
abi_json = build.get("abi")
|
||||||
|
if abi_json is None:
|
||||||
|
raise ValueError(f"Could not find ABI definition in: {{abi_full_path}}")
|
||||||
|
|
||||||
|
return abi_json
|
||||||
|
|
||||||
|
|
||||||
|
def contract_from_build(abi_name: str) -> ContractContainer:
|
||||||
|
# This is workaround because brownie currently doesn't support loading the same project multiple
|
||||||
|
# times. This causes problems when using multiple contracts from the same project in the same
|
||||||
|
# python project.
|
||||||
|
PROJECT = project.main.Project("moonworm", Path(PROJECT_DIRECTORY))
|
||||||
|
|
||||||
|
abi_full_path = os.path.join(BUILD_DIRECTORY, f"{{abi_name}}.json")
|
||||||
|
if not os.path.isfile(abi_full_path):
|
||||||
|
raise IOError(
|
||||||
|
f"File does not exist: {{abi_full_path}}. Maybe you have to compile the smart contracts?"
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(abi_full_path, "r") as ifp:
|
||||||
|
foundry_build = json.load(ifp)
|
||||||
|
|
||||||
|
build = {{
|
||||||
|
"type": "contract",
|
||||||
|
"ast": foundry_build["ast"],
|
||||||
|
"abi": foundry_build["abi"],
|
||||||
|
"contractName": abi_name,
|
||||||
|
"compiler": {{
|
||||||
|
"version": foundry_build["metadata"]["compiler"]["version"],
|
||||||
|
}},
|
||||||
|
"language": foundry_build["metadata"]["language"],
|
||||||
|
"bytecode": foundry_build["bytecode"]["object"],
|
||||||
|
"sourceMap": foundry_build["bytecode"]["sourceMap"],
|
||||||
|
"deployedBytecode": foundry_build["deployedBytecode"]["object"],
|
||||||
|
"deployedSourceMap": foundry_build["deployedBytecode"]["sourceMap"],
|
||||||
|
"pcMap": {{}},
|
||||||
|
}}
|
||||||
|
|
||||||
|
return ContractContainer(PROJECT, build)
|
||||||
|
|
||||||
|
|
||||||
|
{contract_body}
|
|
@ -1 +1 @@
|
||||||
MOONWORM_VERSION = "0.7.2"
|
MOONWORM_VERSION = "0.8.0"
|
||||||
|
|
Ładowanie…
Reference in New Issue