es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo retirar el saldo actual del contrato inteligente utilizando web3.py?

Ya he creado una función para hacerlo en solidity, pero en la parte del frontend, quiero poder llamar a esa función y transferir ether desde el contrato a una cuenta. Aquí está el código en solidity.

function withdraw() public payable onlyOwner {
    payable(msg.sender).transfer(address(this).balance);
}

Hasta ahora, para llamar a otras funciones que implican un cambio de estado, he utilizado build transaction de web3.py. Para transferir ether al contrato, he hecho esto –

booking_contract = w3.eth.contract(address=self.receipt.contractAddress, abi=abi)
nonce = w3.eth.getTransactionCount(address)
booking_transaction = booking_contract.functions.book(machine_name, start_time, end_time).buildTransaction(
    {
        "chainId": chain_id,
        "gasPrice": w3.eth.gas_price,
        "from": address,
        "nonce": nonce,
        "value": 100
    }
)
signed_txn = w3.eth.account.sign_transaction(booking_transaction, private_key=key)
txn_hash = w3.eth.send_raw_transaction(signed_txn.rawTransaction)

¿Hay alguna forma de transferir el ether enviado al contrato aquí a cualquier cuenta que desee?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puede usar web3.py para llamar la función withdraw en su contrato y especificar la cuenta a la que desea transferir el ether. Aquí hay un ejemplo de fragmento de código:

    from web3 import Web3
    
    # instancie el objeto web3 y defina el proveedor
    w3 = Web3(Web3.HTTPProvider('http://localhost:8545'))
    
    # defina la dirección y el abi de su contrato
    contract_address = '0x123456...'
    contract_abi = [{'constant': False, 'inputs': [], 'name': 'withdraw', 'outputs': [], 'payable': True, 'stateMutability': 'payable', 'type': 'function'}]
    
    # cree una instancia de contrato
    contract = w3.eth.contract(address=contract_address, abi=contract_abi)
    
    # especifique la cuenta a la que desea transferir el ether
    to_account = '0xabcdef...'
    
    # llame a la función withdraw con la cuenta especificada como destinatario
    tx_hash = contract.functions.withdraw().transact({'from': to_account})
    
    # espere a que se mine la transacción y obtenga el recibo
    tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)
    
    # verifique el saldo de la cuenta destinataria
    balance = w3.eth.getBalance(to_account)
    print('Saldo de la cuenta destinataria:', balance)
    

    En la llamada transact, puede especificar el parámetro from como la cuenta destinataria a la que desea transferir el ether. Una vez que se haya minado la transacción, la cuenta destinataria debería recibir el ether transferido desde el contrato.

Comments are closed.