Escribir datos en la instancia de contrato creada a través de Factory

Estoy tratando de ejecutar la siguiente aplicación en mi cadena privada usando Truffle.

Creé una AuctionFactory que generaría nuevos objetos de Subasta para nuevos subastadores. La fábrica de subastas se ve así:

pragma solidity ^0.4.11;

import '../contracts/Auction.sol';

contract AuctionFactory {

// contains the owner of an auction mapped to the address of that auction
mapping( address => address) public auctions;

function createAuction(uint32 pTicketPerPerson, uint256 pTotalTickets, uint256 pEndTime, uint32 pMinimumBid) returns (address auctionAddress) {

    address owner = msg.sender;
    Auction newAuction = new Auction(owner, pTicketPerPerson, pTotalTickets, pEndTime, pMinimumBid);
    auctions[owner] = newAuction;
    return newAuction;

}


function getAuctionAddress( address auctioneer) returns (address auctionAddress) {

    //do some sanity
    return auctions[auctioneer];
}
}

Este es el Contrato de Subasta

pragma solidity ^0.4.11;

  contract Auction {

    uint32 ticketId = 0;
    uint32 public balanceTikets;
    uint32 public ticketPerPerson;
    uint32 public minimumBid;
    uint32 public highestBid;
    uint256 public totalTickets;
    uint256 public endTime;
    uint256 public lastBid;

    address public lastBidder;
    address public auctioneer;

    mapping( address => Ticket[]) public allotedTicketsCount;

    mapping( address => uint256) public bids;

    event BidCreated(address bidder, uint32 bidAmount);
    event HighestBid(address bidder, uint32 bidAmount);

    struct Ticket {
       uint32 id;
       uint32 pricePaid;
    }


    /**
    * Constructor which will be called
    * for each new auction that is created. The requestor becomes the owner of new auction
    * 
    */
    function Auction(address owner, uint32 pTicketPerPerson, uint256 pTotalTickets, uint256 pEndTime, uint32 pMinimumBid ) {
      auctioneer = owner;
      ticketPerPerson = pTicketPerPerson;
      totalTickets = pTotalTickets;
      endTime = now + (pEndTime * 1 hours );
      minimumBid = pMinimumBid;
      highestBid = pMinimumBid; // start with 
    }


    function bidForTicket(address bidder, uint256 amount)  {

     bids[bidder] = amount;
     lastBidder = bidder;
     lastBid = amount;

   }

   function getBidFor(address bidAddress) returns (uint256 bidAmt) {
      return bids[bidAddress];
   }

  }

El script de migración de Truffle para la fábrica tiene esto

    var AuctionFactory = artifacts.require("./AuctionFactory.sol");

    module.exports = function(deployer) {
      deployer.deploy(AuctionFactory, {gas: 1583814});
    };

Estoy usando Truffle para crear una interfaz de usuario de muestra para trabajar con estos. La aplicación.js se ve así

    import { default as Web3} from 'web3';
    import { default as contract } from 'truffle-contract'
    // Import our contract artifacts and turn them into usable abstractions.
    import auctionFactory from '../../build/contracts/AuctionFactory.json'
    import auction from '../../build/contracts/Auction.json'

    var AuctionFactory = contract(auctionFactory);
    var Auction = contract(auction);

    window.bid = function() {
        let auctioneerId = $('#auctioneerId').val();
        let bidder = $('#bidder').val();
        let bidAmount = $('#bidAmount').val();
        console.log("Bid details " + bidAmount + " " + bidder);
        AuctionFactory.deployed().then(function(factoryInstance) {
                console.log("Factory address " + factoryInstance.address);
                factoryInstance.getAuctionAddress.call(auctioneerId).then(function(result) {
                    var myAuction = Auction.at(result);
                    console.warn("address of auction  "  + result);
                        //try to get some values from the auction

             myAuction.totalTickets.call().then(function(totalTickets) {
                console.warn("Total Tkts  " + totalTickets);
                $("#total_tkt").html(totalTickets+"");
            });


                    myAuction.bidForTicket(bidder, bidAmount, {gas:4000000, from:bidder}).then(function() {
                        console.warn("Bid created ");
                        myAuction.lastBidder.call().then(function(lastBidder) {
                            console.warn("Last bidder  " + lastBidder);

                        });

                        myAuction.lastBid.call().then(function(lastBid) {
                            console.warn("lastBid is " + lastBid);

                        });

                        myAuction.getBidFor.call(bidder).then(function(bidAmt) {
                            console.warn("Bid amt for " + bidder + " " + bidAmt);

                        });

                    });


                });                 
        });
    }

Soy capaz de crear una subasta. Obtenga su dirección de AuctionFactory según el creador de la subasta. Si leo valores que se establecieron durante la inicialización de la Subasta como:

myAuction.totalTickets.call()

Soy capaz de obtener datos correctos.

Pero cuando trato de agregar una oferta a la Subasta usando

myAuction.bidForTicket(bidder, bidAmount, {gas:4000000, from:bidder})

Ese valor nunca se agrega al contrato de Subasta. He comprobado las direcciones y otras configuraciones.

Intenté implementar el contrato de subasta por separado como un solo contrato y puedo crear ofertas y leer valores actualizados. Pero cuando uso la Subasta creada por la fábrica, simplemente no escribe valores. Quiero decir, cuando leo esos campos obtengo 0 y la dirección del último postor es 0x0

¿Realmente me gustaría entender lo que me estoy perdiendo aquí? Gracias de antemano.

Respuestas (1)

En caso de que alguien más se esté rompiendo la cabeza con la sintaxis: el cambio que tuve que hacer para que esto funcionara estaba en app.js. En lugar de

myAuction.bidForTicket(bidder, bidAmount, {gas:4000000, from:bidder}).then(function() 

Tuve que cambiarlo a:

var txnHash = bidProduct.bid.sendTransaction(bidAmount, {gas: 1400000, from:bidder}).then(function(txnHash) {.....

Quiero decir que el valor de retorno aún se puede ignorar, pero "sendTransaction" es lo que creo que funcionó para mí. Según los documentos, simplemente llamar al método debería haber funcionado y debería haber obtenido el hash de la transacción, pero no pude entender por qué no funcionaría con el código anterior.