-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcompile_solidity_utils.py
More file actions
48 lines (41 loc) · 1.75 KB
/
compile_solidity_utils.py
File metadata and controls
48 lines (41 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import pickle
from web3 import Web3
from solc import compile_files, link_code
# web3.py instance
w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:7545"))
w3.eth.defaultAccount = w3.eth.accounts[0]
def separate_main_n_link(file_path, contracts):
# separate out main file and link files
# assuming first file is main file.
main = {}
link = {}
all_keys = list(contracts.keys())
for key in all_keys:
if file_path[0] in key:
main = contracts[key]
else:
link[key] = contracts[key]
return main, link
def deploy_contract(contract_interface):
# Instantiate and deploy contract
contract = w3.eth.contract(
abi=contract_interface['abi'], bytecode=contract_interface['bin'])
# Get transaction hash from deployed contract
tx_hash = contract.constructor().transact(transaction={'from': w3.eth.accounts[0]})
# Get tx receipt to get contract address
tx_receipt = w3.eth.getTransactionReceipt(tx_hash)
return tx_receipt['contractAddress']
def deploy_n_transact(file_path, mappings=[]):
# compile all files
contracts = compile_files(file_path, import_remappings=mappings)
link_add = {}
contract_interface, links = separate_main_n_link(file_path, contracts)
# first deploy all link libraries
for link in links:
link_add[link] = deploy_contract(links[link])
# now link dependent library code to main contract binary
# https://solidity.readthedocs.io/en/v0.4.24/using-the-compiler.html?highlight=library
if link_add:
contract_interface['bin'] = link_code(contract_interface['bin'], link_add)
# return contract receipt and abi(application binary interface)
return deploy_contract(contract_interface), contract_interface['abi']