Как разрешить одному счету выходить из другого?

Цель состоит в том, чтобы создать контракт, который позволяет стороне B снимать средства со счета стороны A в соответствии с некоторой формулой. Я не хочу использовать модель условного депонирования, а просто для того, чтобы:

  1. Пусть A подтвердит, что они согласны с отказом B в какой-то момент времени в будущем.
  2. Установите пороговое значение того, сколько/долго B может снять деньги.

Есть ли примеры или лучшие практики для этого?

Ответы (3)

Вы не можете вывести деньги с чужого счета напрямую. Однако вы можете создать смарт-контракты, в которых А может внести деньги. Затем B разрешается снимать деньги со смарт-контракта в течение определенного периода времени. Если B не вывел деньги и период закончился, A может вывести деньги из смарт-контракта.

Я рекомендую использовать Vault. Вы можете проверить OpenZeppelin RefundVault. Пользователи отправляют некоторые средства в это хранилище, и в зависимости от вашей бизнес-логики пользователь может запросить возврат и снятие средств.

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

Для токенов ERC20 вы можете использовать approveфункцию, позволяющую кому-то другому вывести средства из ваших запасов токенов:

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

Позволяет _spenderснимать с вашего счета несколько раз, до _valueсуммы. Если эта функция вызывается снова, она перезаписывает текущий допуск на _value.

Для эфира вы можете настроить что-то вроде мультиподписного кошелька, где отдельные лица имеют доступ к тем же средствам, которые хранятся в этом контракте. Этот контракт может работать не совсем так, как вы предполагали, но должен стать отличным началом:

https://github.com/ConsenSys/MultiSigWallet

Хорошо, спасибо! Я полагаю, я мог бы также использовать WETH вместо мультиподписного кошелька?
Я не знаком с WETH, но я предполагаю, что вы сможете ответить на свой вопрос, поскольку именно вы ищете конкретную функциональность.