hacer un contrato enviar un porcentaje a una billetera específica (siempre)

¿Cómo puedo hacer que un contrato envíe un porcentaje a una billetera específica (siempre)? Ejemplo de que cada vez que se realiza una transacción desde este token, el 1% va a la billetera X.

Gracias.

Ok, felix dolderer, gracias por hacer esto por mí, hermano, realmente lo aprecio.

No sé en qué parte del código poner el código que ya programó por favor.

mira, dejo mi contrato real original en este enlace, ¿cómo puedo integrar tu código a este contrato, por favor, puedes integrar el código que haces para mí en 2 ejemplos (contrato 1 y contrato 2)?

CÓDIGO DE MI CONTRATO https://pastebin.com/MEmaiVh1

gracias

Comparta su código, sus pensamientos, su progreso y el punto específico del problema que está tratando de resolver (asumiendo que realmente está tratando de resolverlo).

Respuestas (1)

Preparé dos contratos para ti, porque no sé qué caso estás tratando de modelar.

El primer contrato funciona en la situación en la que su contrato recibe ether directamente y una parte de ese ether se reenviará a su dirección de destino (billetera X).

El segundo contrato es un contrato simbólico. Con cada transferencia de tokens, una parte de la transferencia se reenviará a su dirección de destino.

pragma solidity ^0.5.0;

contract PercentageEther{

    // Pay the 1% to this address
    address payable target = 0x158de12EE547EAe06Cbdb200A017aCa6B75D230D;

    // Deal with incoming ether 
    function () payable external{
        //Send 1% to the target
        target.transfer(msg.value/100);

        //Do whatever you want to do with the rest
    }

}

Segundo contrato:

pragma solidity ^0.5.0;

contract PercentageToken{

    // Pay the 1% to this address
    address payable target = 0x158de12EE547EAe06Cbdb200A017aCa6B75D230D;

    // necessary variables for your token
    mapping (address => uint) public balanceOf;
    uint public totalSupply;

    // create a token with a specified supply and assign all the tokens to the creator
    constructor(uint _totalSupply) public {
        totalSupply = _totalSupply;
        balanceOf[msg.sender] = totalSupply;
    }

    // your standard token transfer function with the addition of the share that
    // goes to your target address
    function transfer(address _to, uint amount) public {

        // calculate the share for your target address
        uint shareForX = amount/100;

        // store the previous balance of the sender for later assertion
        // (check that all works as intended)
        uint senderBalance = balanceOf[msg.sender];
        // check the sender actually has enough tokens to send
        require(senderBalance >= amount);
        // reduce sender balance first to avoid that the sender sends more than
        // he owns by submitting multiple transactions.
        balanceOf[msg.sender] -= amount;
        // store the previous balance of the receiver for later assertion
        // (check that all works as intended)
        uint receiverBalance = balanceOf[_to];

        // add the amount of tokens to the receiver but deduce the share for your
        // target address
        balanceOf[_to] += amount-shareForX;
        // add the share to your target address
        balanceOf[target] += shareForX;

        // check that everything works as intended, specifically checking that
        // the sum of tokens in all reladed accounts is the same before and after
        // the transaction. 
        assert(balanceOf[msg.sender] + balanceOf[_to] + shareForX ==
            senderBalance + receiverBalance);
    }
}
Hola felix, revisa mi pregunta actualizada ...
StackExchange no se trata realmente de implementar soluciones para otros, se trata de responder preguntas y problemas generales. Para usted, el segundo contrato en mi respuesta es relevante. Simplemente mire la función de transferencia y agregue todas las líneas donde se menciona shareForX a sus funciones de transferencia y transferencia. (Puede ignorar la línea que comienza con afirmar)
@FelixDolderer esto funciona en el caso específico de querer eliminar el 1%, pero ¿y si es el 5%? Siempre podríamos dividir por 20, pero eso no es muy escalable. Estoy tratando de encontrar una manera de usar decimales para obtener un porcentaje, por ejemplo: uintShareForX = cantidad * 0.05; pero los decimales parecen muy complicados en solidez. ¿Tienes algún consejo?
@RichardBonneau No estoy seguro de entender su problema. Para un porcentaje diferente, cambiaría la línea a "uint shareForX = cantidad*porcentaje/100;". Además, los decimales no deberían ser un problema a menos que vaya a cantidades muy pequeñas, ya que el éter tiene 18 lugares decimales. Incluso podría tener el porcentaje como variable y cambiarlo en un momento futuro.