¿Cómo resuelvo "el gas requerido excede la asignación o siempre falla la transacción" cuando intento enviar ether?

Este es el contrato inteligente de muestra que estoy tratando de ejecutar. Todos los métodos funcionan, excepto "payVendor": falla con el gas requerido excede la asignación o siempre falla la transacción . He intentado aumentar el gas, pero no ayuda.

contract vendorContract {

    uint public vendorID;
    uint public ownerID;
    uint256 public contractValue;
    string public contractDescription;
    string public contractStatus;
    string public paymentStatus;
    address public contractOwner;
    address public contractVendor;
    string constant newcon = "New";
    string constant wipcon =  "WIP";
    string constant reqcon  = "Requested";
    string constant shipcon = "Shipped";
    string constant endcon = "Completed";
    string constant err = "Error";


    modifier isOwner()
    {
        if (msg.sender != contractOwner) throw;
        _ ;
    }

    modifier isVendor()
   {
        if (msg.sender != contractVendor) throw;
        _ ;
    }

    function vendorContract(uint _vid, string _desc) public {
        vendorID = _vid;
        contractStatus="New";
        contractOwner=msg.sender;
        contractDescription= _desc;

    }

      function acceptContract(uint256 _cvalue, uint _vidd) public {
        if (vendorID !=  _vidd) {
            contractStatus = err;
            throw;
        }

        contractStatus=wipcon;
        contractValue = _cvalue;
        contractVendor = msg.sender;
        }

    function requestPayment() isVendor {
    paymentStatus=reqcon;
    contractStatus=shipcon;
    }

    function paymentStatus() returns (string) {
    return paymentStatus;
    }


    function payVendor() payable isOwner {   
     if  (!contractVendor.send(contractValue))
        throw;
    //contractVendor.send(contractValue);
    contractStatus = endcon;


    }

   }

Respuestas (1)

Parece funcionar bien para mí. Hay algunas cosas que pueden estar causando esto:

  1. Está enviando menos ETH que contractValue, y está tirando porque no hay suficiente ETH en el contrato para enviar.

  2. Asegúrese de inicializar correctamente el contrato con el valor. Cada valor que pasa está en WEI .

Hay otras cosas a tener en cuenta como sugerencias en este contrato:

  1. La forma en que llamó a su constructor está obsoleta a favor de la constructorfunción.

  2. throwestá en desuso en favor de revert, requirey assert.

Shane - ¡gracias por tu respuesta! Estoy implementando el contrato desde el navegador Remix Solidity. Para enviar ETH al contrato, traté de ingresar un valor distinto de cero en el campo "Valor", y aparece el mismo error "el gas requerido excede...". ¡Ayuda!
Parece que tuve que agregar "pagadero" al constructor, ya está funcionando, gracias por su ayuda.