Hola...necesito ayuda para la universidad

Mi idea para la universidad era hacer un contrato en el que el monto total del contrato se comparta por igual entre 2 socios en testnet. Estoy usando Mist y tengo dos billeteras (cuentas), una se llama MainAcc y otra socio1. Puedo enviar mi contrato en línea, no hay errores en el compilador. Puedo enviarlo a la cadena de bloques, pero cuando voy a mi contrato y llamo a la función withdrawy elijo un usuario, comienza a procesarse, todo se ve bien y la transacción se extrae, pero no hay éter. se ha movido de contrato a socio o MainAcc.

Si compilo Remix, funciona, puedo enviar dinero entre cuentas pero tengo una advertencia --- Requisito de gas de la función PayCheck.withdraw() alto: infinito. Si el requisito de gas de una función es superior al límite de gas del bloque, no se puede ejecutar. Evite bucles en sus funciones o acciones que modifiquen grandes áreas de almacenamiento (esto incluye borrar o copiar matrices en el almacenamiento) --- tal vez esa sea la razón por la que no funcionará en TestNet

Estoy realmente desesperado, hice un seminario completo sobre contratos inteligentes (historia, idea, moneda criptográfica, cadena de bloques, beneficios, etc.) y Ethereum como la plataforma más grande y solo necesito este contrato simple para terminarlo con un ejemplo genial :(

¡Gracias de antemano!

pragma solidity ^0.4.18;

contract PayCheck {

    address[] employees = [0xE83fad0b5EdF2999c29a00199Ca9B773A4627239, 0x118531D9C6C9114c8B999Ac1197778d1669Fc6c6];

    mapping (address => uint) withdrawnAmounts;

    constructor() payable public{
    }

    function () payable public{
    }

    modifier canWithdraw() {
        bool contains = false;

        for(uint i = 0; i < employees.length; i++) {
            if(employees[i] == msg.sender) {
                contains = true;
            }
        }
        require(contains);
        _;
    }

    function withdraw() canWithdraw public{
        uint amountAllocated = address(this).balance/employees.length;
        uint amountWithdrawn = withdrawnAmounts[msg.sender];
        uint amount = amountAllocated - amountWithdrawn;
        withdrawnAmounts[msg.sender] = amountWithdrawn + amount;
        if (amount > 0) {
            msg.sender.transfer(amount);
        }

    }

}

Respuestas (1)

Funciona muy bien para mí.

Inicialmente, estaba un poco desconcertado mientras lo probaba en Remix y no podía ver que el Ether se recibiera en ninguna parte. Al final, parece que Remix no se muestra en ninguna parte si recibe Ether en la transacción (excepto tal vez en el saldo de la dirección en la parte superior derecha).

Terminé agregando algunos registros (y direcciones cambiadas) y aquí puedes ver que funciona:

pragma solidity ^0.4.18;

contract PayCheck {

    address[] employees = [0xca35b7d915458ef540ade6068dfe2f44e8fa733c, 0x118531D9C6C9114c8B999Ac1197778d1669Fc6c6];

    mapping (address => uint) withdrawnAmounts;

    constructor() payable public{
    }

    function () payable public{
    }

    modifier canWithdraw() {
        bool contains = false;

        for(uint i = 0; i < employees.length; i++) {
            if(employees[i] == msg.sender) {
                contains = true;
            }
        }
        require(contains);
        _;
    }

    event DebugLog(string, uint256);

    function withdraw() canWithdraw public{
        uint amountAllocated = address(this).balance/employees.length;
        uint amountWithdrawn = withdrawnAmounts[msg.sender];
        uint amount = amountAllocated - amountWithdrawn;
        withdrawnAmounts[msg.sender] = amountWithdrawn + amount;
        if (amount > 0) {
            emit DebugLog("balance before", msg.sender.balance);
            msg.sender.transfer(amount);
            emit DebugLog("balance after", msg.sender.balance);
        }

    }
}

Espero que también sepa que este código solo es válido para fines de demostración: tiene muchos errores de subdesbordamiento/desbordamiento y otros problemas de validación.