¿Cómo permitir que una cuenta se retire de otra?

El objetivo es crear un contrato que permita a la parte B retirar dinero de la cuenta de la parte A según alguna fórmula. No quiero usar un modelo de depósito en garantía, sino solo para:

  1. Deje que A certifique que está de acuerdo con que B se retire en algún momento futuro.
  2. Establezca un umbral de cuánto / tiempo B puede retirar.

¿Hay algún ejemplo o mejores prácticas para esto?

Respuestas (3)

No puede retirar directamente de la cuenta de otra persona. Sin embargo, puede crear contratos inteligentes en los que A pueda depositar el dinero. Luego, B puede retirar el dinero del contrato inteligente durante un cierto período de tiempo. Si B no ha retirado el dinero y el plazo ha terminado, A puede retirar el dinero del contrato inteligente

Recomiendo usar una bóveda. Puede consultar OpenZeppelin RefundVault. Los usuarios envían algunos fondos a esta bóveda y, según su lógica comercial, el usuario puede solicitar un reembolso y retirar fondos.

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/v1.10.0/contracts/crowdsale/distribution/utils/RefundVault.sol

Para los tokens ERC20, puede usar la approvefunción para permitir que otra persona se retire de sus tokens:

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#approve

Permite _spenderretirar de su cuenta varias veces, hasta el _valuemonto. Si se vuelve a llamar a esta función, sobrescribe la asignación actual con _value.

Para Ether, puede configurar algo así como una billetera de múltiples firmas donde las personas tienen acceso a los mismos fondos almacenados en ese contrato. Es posible que este contrato no funcione exactamente como lo espera desde el primer momento, pero debería ser un gran comienzo:

https://github.com/ConsenSys/MultiSigWallet

¡Genial, gracias! ¿ Supongo que también podría usar WETH en lugar de la billetera multisig?
No estoy familiarizado con WETH, pero supongo que debería poder responder su propia pregunta ya que es usted quien busca una funcionalidad específica.