cómo implementar un contrato inteligente de depósito en garantía y usarlo con emocionantes tokens erc20

Quiero construir un contrato inteligente de depósito en garantía con un token estándar ERC20 en particular. quiero mantener el token en depósito como garantía para la transacción. y bajo alguna condición, esos tokens deberían volver a la cuenta del vendedor.

Entonces, en mi aplicación, la parte A usa algunos servicios de la parte B, pero la parte B no es de confianza, por lo que la parte B mantendrá algunos tokens en custodia y, después de alguna condición, la parte B recuperará esos tokens. es como un fideicomiso de transacción unidireccional .

pero qué condiciones podemos usar como si la condición. también puedo enviar tokens a smartContract y, si puedo, cómo enviar esos tokens de regreso a la billetera de la Parte B o cómo enviar los tokens recibidos del contrato inteligente de depósito en garantía a cualquier persona propietaria de la billetera

y si soy el propietario de los tokens y no puedo entender quién puede implementar el depósito en garantía. Porque si implemento el depósito en garantía y soy el propietario de los tokens, entonces puedo ir a esa función de token y usar la función transferfrom() y usar el depósito en garantía dirección para recuperar mis tokens, así que cómo evitar esta pregunta. Entonces, cómo bloquear de forma segura esos tokens en depósito. porque casi el 90% de los tutoriales son sobre ether, no sobre tokens en ethers.

Respuestas (2)

Estoy teniendo algunas dificultades para seguir tu escritura, así que haré esto un poco más generalizado.

Si usted es quien lanzó el token, entonces ha decidido cómo se pueden transferir los tokens. Lo más probable es que usted, como propietario del contrato, tenga pleno poder para transferir cualquier cantidad de tokens a quien desee, o tal vez incluso eliminar tokens de alguien (sí, los tokens se pueden eliminar ya que solo existen dentro del mismo contrato, en realidad nunca se "envían"). ' en cualquier lugar).

Entonces, si tiene pleno poder sobre los tokens, puede hacer lo que quiera con ellos: mantener algunos en cualquier tipo de depósito en garantía, por ejemplo, si su contrato admite dicha funcionalidad.

Si no creó el contrato de token (pero fue creado por otra persona), puede actuar como depositario y transferir los tokens a su cuenta. Cuando ya no se necesita el servicio de depósito en garantía, puede autorizar ( approvefunción en ERC20) la transferencia de regreso a alguien o transferirlo directamente con la transferfunción.

Creamos una solución para la funcionalidad de depósito en garantía para tokens ERC20.

El código que usamos es el siguiente.

pragma solidity ^0.4.21;

import "../zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "../zeppelin-solidity/contracts/ownership/Ownable.sol";
import "../webshop/Webshop.sol";

contract Escrow is Ownable {
    enum PaymentStatus { Pending, Completed, Refunded }

    event PaymentCreation(uint indexed orderId, address indexed customer, uint value);
    event PaymentCompletion(uint indexed orderId, address indexed customer, uint value, PaymentStatus status);

    struct Payment {
        address customer;
        uint value;
        PaymentStatus status;
        bool refundApproved;
    }

    mapping(uint => Payment) public payments;
    ERC20 public currency;
    address public collectionAddress;
    Webshop public webshop;

    function Escrow(ERC20 _currency, address _collectionAddress) public {
        currency = _currency;
        collectionAddress = _collectionAddress;
        webshop = Webshop(msg.sender);
    }

    function createPayment(uint _orderId, address _customer, uint _value) external onlyOwner {
        payments[_orderId] = Payment(_customer, _value, PaymentStatus.Pending, false);
        emit PaymentCreation(_orderId, _customer, _value);
    }

    function release(uint _orderId) external {
        completePayment(_orderId, collectionAddress, PaymentStatus.Completed);
    }

    function refund(uint _orderId) external {
        completePayment(_orderId, msg.sender, PaymentStatus.Refunded);
    }

    function approveRefund(uint _orderId) external {
        require(msg.sender == collectionAddress);
        Payment storage payment = payments[_orderId];
        payment.refundApproved = true;
    }

    function completePayment(uint _orderId, address _receiver, PaymentStatus _status) private {
        Payment storage payment = payments[_orderId];
        require(payment.customer == msg.sender);
        require(payment.status == PaymentStatus.Pending);
        if (_status == PaymentStatus.Refunded) {
            require(payment.refundApproved);
        }
        currency.transfer(_receiver, payment.value);
        webshop.changeOrderStatus(_orderId, Webshop.OrderStatus.Completed);
        payment.status = _status;
        emit PaymentCompletion(_orderId, payment.customer, payment.value, _status);
    }
}

El artículo, incluido el código, se puede encontrar en https://medium.com/@s_van_laar/how-to-build-an-escrow-contract-with-an-ethereum-erc20-token-bfc4825b0dd7

Se desaconsejan las respuestas de solo enlace. Incluya lo suficiente en el cuerpo de su respuesta para que siga siendo útil y relevante, incluso si todos los enlaces están rotos.
@TjadenHess Ingresó el código y se refirió al artículo original. Por favor, elimine el -1