Example #1
0
    def deploy(self,
               contract,
               *args,
               amount=None,
               gas_limit=None,
               gas_price=None,
               callback=None):
        '''Deploys a contract.

        Args:
            contract: ContractContainer instance.
            *args: Constructor arguments. The last argument may optionally be
                   a dictionary of transaction values.

        Kwargs:
            amount: Amount of ether to send with transaction, in wei.
            gas_limit: Gas limit of the transaction.
            gas_price: Gas price of the transaction.
            callback: Callback function to attach to TransactionReceipt.

        Returns:
            * Contract instance if the transaction confirms
            * TransactionReceipt if the transaction is pending or reverts'''
        data = contract.deploy.encode_abi(*args)
        try:
            txid = self._transact({
                'from':
                self.address,
                'value':
                Wei(amount),
                'nonce':
                self.nonce,
                'gasPrice':
                Wei(gas_price) or self._gas_price(),
                'gas':
                Wei(gas_limit) or self._gas_limit("", amount, data),
                'data':
                HexBytes(data)
            })
            revert = None
        except ValueError as e:
            txid, revert = _raise_or_return_tx(e)
        self.nonce += 1
        tx = TransactionReceipt(txid,
                                self,
                                name=contract._name + ".constructor",
                                callback=callback,
                                revert=revert)
        if tx.status != 1:
            return tx
        tx.contract_address = contract.at(tx.contract_address, self, tx)
        return tx.contract_address
Example #2
0
    def transfer(self, to, amount, gas_limit=None, gas_price=None, data=""):
        '''Transfers ether from this account.

        Args:
            to: Account instance or address string to transfer to.
            amount: Amount of ether to send, in wei.

        Kwargs:
            gas_limit: Gas limit of the transaction.
            gas_price: Gas price of the transaction.
            data: Hexstring of data to include in transaction.

        Returns:
            TransactionReceipt object'''
        try:
            txid = self._transact({
                'from': self.address,
                'to': str(to),
                'value': Wei(amount),
                'nonce': self.nonce,
                'gasPrice': Wei(gas_price) if gas_price is not None else self._gas_price(),
                'gas': Wei(gas_limit) or self._gas_limit(to, amount, data),
                'data': HexBytes(data)
            })
            revert_data = None
        except ValueError as e:
            txid, revert_data = _raise_or_return_tx(e)
        self.nonce += 1
        return TransactionReceipt(txid, self, revert_data=revert_data)
Example #3
0
    def transfer(self, to, amount, gas_limit=None, gas_price=None, data=''):
        '''Transfers ether from this account.

        Args:
            to: Account instance or address string to transfer to.
            amount: Amount of ether to send, in wei.
            gas_limit: Gas limit of the transaction.
            gas_price: Gas price of the transaction.

        Returns:
            TransactionReceipt instance'''
        try:
            signed_tx = self._acct.signTransaction({
                'from':
                self.address,
                'nonce':
                self.nonce,
                'gasPrice':
                wei(gas_price) or self._gas_price(),
                'gas':
                wei(gas_limit) or self._gas_limit(to, amount, data),
                'to':
                str(to),
                'value':
                wei(amount),
                'data':
                HexBytes(data)
            }).rawTransaction
            txid = web3.eth.sendRawTransaction(signed_tx)
        except ValueError as e:
            txid = raise_or_return_tx(e)
        self.nonce += 1
        return TransactionReceipt(txid, self)
Example #4
0
    def deploy(
        self,
        contract: Any,
        *args: Tuple,
        amount: Optional[int] = None,
        gas_limit: Optional[int] = None,
        gas_price: Optional[int] = None,
    ) -> Any:
        """Deploys a contract.

        Args:
            contract: ContractContainer instance.
            *args: Constructor arguments. The last argument may optionally be
                   a dictionary of transaction values.

        Kwargs:
            amount: Amount of ether to send with transaction, in wei.
            gas_limit: Gas limit of the transaction.
            gas_price: Gas price of the transaction.

        Returns:
            * Contract instance if the transaction confirms
            * TransactionReceipt if the transaction is pending or reverts"""
        evm = contract._build["compiler"]["evm_version"]
        if rpc.is_active() and not rpc.evm_compatible(evm):
            raise IncompatibleEVMVersion(
                f"Local RPC using '{rpc.evm_version()}' but contract was compiled for '{evm}'"
            )
        data = contract.deploy.encode_abi(*args)
        try:
            txid = self._transact(  # type: ignore
                {
                    "from": self.address,
                    "value": Wei(amount),
                    "nonce": self.nonce,
                    "gasPrice": Wei(gas_price) or self._gas_price(),
                    "gas": Wei(gas_limit) or self._gas_limit("", amount, data),
                    "data": HexBytes(data),
                }
            )
            revert_data = None
        except ValueError as e:
            txid, revert_data = _raise_or_return_tx(e)
        self.nonce += 1
        tx = TransactionReceipt(txid,
                                self,
                                name=contract._name + ".constructor",
                                revert_data=revert_data)
        add_thread = threading.Thread(target=contract._add_from_tx,
                                      args=(tx, ),
                                      daemon=True)
        add_thread.start()
        if tx.status != 1:
            return tx
        add_thread.join()
        return find_contract(tx.contract_address)
Example #5
0
 def _contract_tx(self, fn, args, tx, name, callback=None):
     tx['from'] = self.address
     if type(CONFIG['active_network']['gas_price']) is int:
         tx['gasPrice'] = CONFIG['active_network']['gas_price']
     if type(CONFIG['active_network']['gas_limit']) is int:
         tx['gas'] = CONFIG['active_network']['gas_limit']
     try:
         txid = fn(*args).transact(tx)
     except ValueError as e:
         txid = raise_or_return_tx(e)
     self.nonce += 1
     return TransactionReceipt(txid, self, name=name, callback=callback)
Example #6
0
    def deploy(self, contract, *args, amount=None, gas_limit=None, gas_price=None):
        '''Deploys a contract.

        Args:
            contract: ContractContainer instance.
            *args: Constructor arguments. The last argument may optionally be
                   a dictionary of transaction values.

        Kwargs:
            amount: Amount of ether to send with transaction, in wei.
            gas_limit: Gas limit of the transaction.
            gas_price: Gas price of the transaction.

        Returns:
            * Contract instance if the transaction confirms
            * TransactionReceipt if the transaction is pending or reverts'''
        evm = contract._build['compiler']['evm_version']
        if rpc.is_active() and not rpc.evm_compatible(evm):
            raise IncompatibleEVMVersion(
                f"Local RPC using '{rpc.evm_version()}' but contract was compiled for '{evm}'"
            )
        data = contract.deploy.encode_abi(*args)
        try:
            txid = self._transact({
                'from': self.address,
                'value': Wei(amount),
                'nonce': self.nonce,
                'gasPrice': Wei(gas_price) or self._gas_price(),
                'gas': Wei(gas_limit) or self._gas_limit("", amount, data),
                'data': HexBytes(data)
            })
            revert_data = None
        except ValueError as e:
            txid, revert_data = _raise_or_return_tx(e)
        self.nonce += 1
        tx = TransactionReceipt(
            txid,
            self,
            name=contract._name + ".constructor",
            revert_data=revert_data
        )
        add_thread = threading.Thread(target=contract._add_from_tx, args=(tx,), daemon=True)
        add_thread.start()
        if tx.status != 1:
            return tx
        add_thread.join()
        return history.find_contract(tx.contract_address)
Example #7
0
 def _contract_tx(self, fn, args, tx, name, callback=None):
     try:
         tx.update({
             'from':
             self.address,
             'nonce':
             self.nonce,
             'gasPrice':
             self._gas_price(),
             'gas': (CONFIG['active_network']['gas_limit']
                     or fn(*args).estimateGas({'from': self.address}))
         })
         raw = fn(*args).buildTransaction(tx)
         txid = web3.eth.sendRawTransaction(
             self._acct.signTransaction(raw).rawTransaction)
     except ValueError as e:
         txid = raise_or_return_tx(e)
     self.nonce += 1
     return TransactionReceipt(txid, self, name=name, callback=callback)
Example #8
0
def erc1820_registry(ERC1820Registry):
    # ERC1820Registry contract deployment
    # See https://github.com/ethereum/EIPs/issues/1820 for more details
    raw_transaction = '0xf90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820'
    abi = [{"constant":False,"inputs":[{"name":"_addr","type":"address"},{"name":"_interfaceHash","type":"bytes32"},{"name":"_implementer","type":"address"}],"name":"setInterfaceImplementer","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[{"name":"_addr","type":"address"}],"name":"getManager","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":False,"inputs":[{"name":"_addr","type":"address"},{"name":"_newManager","type":"address"}],"name":"setManager","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[{"name":"_interfaceName","type":"string"}],"name":"interfaceHash","outputs":[{"name":"","type":"bytes32"}],"payable":False,"stateMutability":"pure","type":"function"},{"constant":False,"inputs":[{"name":"_contract","type":"address"},{"name":"_interfaceId","type":"bytes4"}],"name":"updateERC165Cache","outputs":[],"payable":False,"stateMutability":"nonpayable","type":"function"},{"constant":True,"inputs":[{"name":"_addr","type":"address"},{"name":"_interfaceHash","type":"bytes32"}],"name":"getInterfaceImplementer","outputs":[{"name":"","type":"address"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[{"name":"_contract","type":"address"},{"name":"_interfaceId","type":"bytes4"}],"name":"implementsERC165InterfaceNoCache","outputs":[{"name":"","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"constant":True,"inputs":[{"name":"_contract","type":"address"},{"name":"_interfaceId","type":"bytes4"}],"name":"implementsERC165Interface","outputs":[{"name":"","type":"bool"}],"payable":False,"stateMutability":"view","type":"function"},{"anonymous":False,"inputs":[{"indexed":True,"name":"addr","type":"address"},{"indexed":True,"name":"interfaceHash","type":"bytes32"},{"indexed":True,"name":"implementer","type":"address"}],"name":"InterfaceImplementerSet","type":"event"},{"anonymous":False,"inputs":[{"indexed":True,"name":"addr","type":"address"},{"indexed":True,"name":"newManager","type":"address"}],"name":"ManagerChanged","type":"event"}]
    deployment_address = web3.toChecksumAddress('0xa990077c3205cbDf861e17Fa532eeB069cE9fF96')
    funding_amount = Wei("1 ether")

    # Send ether to the registry deployment account
    web3.eth.sendTransaction({
        'from': accounts[0].address,
        'to': deployment_address,
        'value': funding_amount
    })

    # Deploy ERC1820Registry contract
    tx_hash = web3.eth.sendRawTransaction(raw_transaction)

    # Print brownie-style TransactionReceipt
    TransactionReceipt(tx_hash, deployment_address, name='ERC1820Registry.constructor')
    return Contract('ERC1820Registry','0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24', abi)
Example #9
0
    def transfer(
        self,
        to: "Accounts",
        amount: int,
        gas_limit: float = None,
        gas_price: float = None,
        data: str = "",
    ) -> "TransactionReceipt":
        """Transfers ether from this account.

        Args:
            to: Account instance or address string to transfer to.
            amount: Amount of ether to send, in wei.

        Kwargs:
            gas_limit: Gas limit of the transaction.
            gas_price: Gas price of the transaction.
            data: Hexstring of data to include in transaction.

        Returns:
            TransactionReceipt object"""
        try:
            txid = self._transact(  # type: ignore
                {
                    "from": self.address,
                    "to": str(to),
                    "value": Wei(amount),
                    "nonce": self.nonce,
                    "gasPrice": Wei(gas_price)
                    if gas_price is not None
                    else self._gas_price(),
                    "gas": Wei(gas_limit) or self._gas_limit(to, amount, data),
                    "data": HexBytes(data),
                }
            )
            revert_data = None
        except ValueError as e:
            txid, revert_data = _raise_or_return_tx(e)
        self.nonce += 1
        return TransactionReceipt(txid, self, revert_data=revert_data)