def deploy_contract(config, contract_name, constructor_args=()): tx = get_contract_deployed_tx(config.dbsession, contract_name) if tx: config.logger.error('contract already deployed at address: {}'.format( tx.contract_address)) return from sto.ethereum.txservice import EthereumStoredTXService from sto.models.implementation import BroadcastAccount, PreparedTransaction assert is_ethereum_network(config.network) check_good_private_key(config.ethereum_private_key) abi = get_abi(config.ethereum_abi_file) for dependency in abi[contract_name]['ordered_full_dependencies']: deploy_contract(config, dependency, None) abi[contract_name]['bytecode'] = _link_bytecode( config.dbsession, abi[contract_name]['bytecode'], abi[contract_name]['linkrefs']) abi[contract_name]['bytecode_runtime'] = _link_bytecode( config.dbsession, abi[contract_name]['bytecode_runtime'], abi[contract_name]['linkrefs_runtime'], ) web3 = create_web3(config.ethereum_node_url) service = EthereumStoredTXService(config.network, config.dbsession, web3, config.ethereum_private_key, config.ethereum_gas_price, config.ethereum_gas_limit, BroadcastAccount, PreparedTransaction) note = "Deploying contract {}".format(contract_name) service.deploy_contract(contract_name=contract_name, abi=abi, note=note, constructor_args=constructor_args) # Write database dbsession = config.dbsession dbsession.commit() # deploy on ethereum network broadcast(config)
def deploy_token_contracts( logger: Logger, dbsession: Session, network: str, ethereum_node_url: Union[str, Web3], ethereum_abi_file: Optional[str], ethereum_private_key: Optional[str], ethereum_gas_limit: Optional[int], ethereum_gas_price: Optional[int], name: str, symbol: str, url: str, amount: int, transfer_restriction: str): """Issue out a new Ethereum token.""" assert type(amount) == int decimals = 18 # Everything else is bad idea check_good_private_key(ethereum_private_key) abi = get_abi(ethereum_abi_file) web3 = create_web3(ethereum_node_url) # We do not have anything else implemented yet assert transfer_restriction == "unrestricted" service = EthereumStoredTXService(network, dbsession, web3, ethereum_private_key, ethereum_gas_price, ethereum_gas_limit, BroadcastAccount, PreparedTransaction) # Deploy security token note = "Deploying token contract for {}".format(name) deploy_tx1 = service.deploy_contract("SecurityToken", abi, note, constructor_args={ "_name": name, "_symbol": symbol, "_url": url }) # See SecurityToken.sol # Deploy transfer agent note = "Deploying unrestricted transfer policy for {}".format(name) deploy_tx2 = service.deploy_contract("UnrestrictedTransferAgent", abi, note) # Set transfer agent note = "Making transfer restriction policy for {} effective".format(name) contract_address = deploy_tx1.contract_address update_tx1 = service.interact_with_contract( "SecurityToken", abi, contract_address, note, "setTransactionVerifier", {"newVerifier": deploy_tx2.contract_address}) # Issue out initial shares note = "Creating {} initial shares for {}".format(amount, name) contract_address = deploy_tx1.contract_address amount_18 = int(amount * 10**decimals) update_tx2 = service.interact_with_contract("SecurityToken", abi, contract_address, note, "issueTokens", {"value": amount_18}) logger.info("Prepared transactions for broadcasting for network %s", network) logger.info("STO token contract address will be %s%s%s", colorama.Fore.LIGHTGREEN_EX, deploy_tx1.contract_address, colorama.Fore.RESET) return [deploy_tx1, deploy_tx2, update_tx1, update_tx2]