Skip to content

Commit

Permalink
Added verification and contract customizatino to token deploy.
Browse files Browse the repository at this point in the history
  • Loading branch information
miohtama committed May 12, 2017
1 parent b27bc13 commit 426eacc
Showing 1 changed file with 56 additions and 10 deletions.
66 changes: 56 additions & 10 deletions ico/cmd/deploytoken.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Deploy tokens contract."""
import os
import time
import sys
import datetime
Expand All @@ -12,24 +13,30 @@

from ico.utils import check_succesful_tx
from ico.utils import get_constructor_arguments
from ico.etherscan import verify_contract
from ico.etherscan import get_etherscan_link


@click.command()
@click.option('--chain', nargs=1, default="mainnet", help='On which chain to deploy - see populus.json')
@click.option('--address', nargs=1, help='Address to deploy from and who becomes as a owner (must exist on geth)', required=True)
@click.option('--contract-name', nargs=1, help='Name of the token contract', default="CentrallyIssuedToken")
@click.option('--release-agent', nargs=1, help='Address that acts as a release agent (can be same as owner)', default=None)
@click.option('--minting-agent', nargs=1, help='Address that acts as a minting agent (can be same as owner)', default=None)
@click.option('--name', nargs=1, required=True, help='Token name', type=str)
@click.option('--symbol', nargs=1, required=True, help='Token symbol', type=str)
@click.option('--supply', nargs=1, default=21000000, help='What is the initial token supply', type=int)
@click.option('--decimals', nargs=1, default=0, help='How many decimal points the token has', type=int)
def main(chain, address, name, symbol, supply, decimals, minting_agent, release_agent):
"""Deploy a CrowdsaleToken contract.
@click.option('--verify/--no-verify', default=False, help='Verify contract on EtherScan.io')
@click.option('--verify-filename', nargs=1, help='Solidity source file of the token contract for verification', default=None)
def main(chain, address, contract_name, name, symbol, supply, decimals, minting_agent, release_agent, verify, verify_filename):
"""Deploy a token contract.
Example:
Examples:
deploy-token --chain=ropsten --address=0x3c2d4e5eae8c4a31ccc56075b5fd81307b1627c6 --name="MikkoToken 2.0" --symbol=MOO --release-agent=0x3c2d4e5eae8c4a31ccc56075b5fd81307b1627c6 --supply=100000
deploy-token --chain=kovan --contract-name="CentrallyIssuedToken" --address=0x001FC7d7E506866aEAB82C11dA515E9DD6D02c25 --name="TestToken" --symbol=MOO --supply=916 --decimals=0 --verify --verify-filename=CentrallyIssuedToken.sol
"""

project = Project()
Expand All @@ -48,16 +55,21 @@ def main(chain, address, name, symbol, supply, decimals, minting_agent, release_
transaction = {"from": address}
args = [name, symbol, supply, decimals]

if contract_name == "CentrallyIssuedToken":
# TODO: Generalize settings contract args
# This sets the upgrade master
args = [address] + args

# This does deployment with all dependencies linked in

print("Starting contract deployment")
contract, txhash = c.provider.deploy_contract('CrowdsaleToken', deploy_transaction=transaction, deploy_args=args)
contract, txhash = c.provider.deploy_contract(contract_name, deploy_transaction=transaction, deploy_args=args)
print("Contract address is", contract.address)

# This is needed for Etherscan contract verification
# https://etherscanio.freshdesk.com/support/solutions/articles/16000053599-contract-verification-constructor-arguments
data = get_constructor_arguments(contract, args)
print("CrowdsaleToken constructor arguments is", data)
const_args = get_constructor_arguments(contract, args)
print("CrowdsaleToken constructor arguments is", const_args)

if release_agent:
print("Setting release agent to", release_agent)
Expand All @@ -69,11 +81,45 @@ def main(chain, address, name, symbol, supply, decimals, minting_agent, release_
txid = contract.transact(transaction).setMintAgent(minting_agent, True)
check_succesful_tx(web3, txid)

if verify:
chain_name = chain
fname = verify_filename
browser_driver = "chrome"
verify_contract(
project=project,
libraries={}, # TODO: Figure out how to pass around
chain_name=chain_name,
address=contract.address,
contract_name=contract_name,
contract_filename=fname,
constructor_args=const_args,
# libraries=runtime_data["contracts"][name]["libraries"],
browser_driver=browser_driver)
link = get_etherscan_link(chain_name, contract.address)

print("Verified contract is", link)

# Do some contract reads to see everything looks ok
print("Token owner:", contract.call().owner())
print("Token minting finished:", contract.call().mintingFinished())
print("Token released:", contract.call().released())
print("Token release agent:", contract.call().releaseAgent())
try:
print("Token owner:", contract.call().owner())
except ValueError:
pass # No owner

try:
print("Token upgradeMaster:", contract.call().upgradeMaster())
except ValueError:
pass

try:
print("Token minting finished:", contract.call().mintingFinished())
except ValueError:
pass

try:
print("Token released:", contract.call().released())
print("Token release agent:", contract.call().releaseAgent())
except ValueError:
pass

print("All done! Enjoy your decentralized future.")

Expand Down

0 comments on commit 426eacc

Please sign in to comment.