Usar el tipo de biblioteca compartida en los contratos

Quiero reutilizar el tipo DateRangeen dos contratos. Sin embargo, fallo con múltiples errores. Actualmente tengo un error:

G21FE98E9 Member "endTicks" not found or not visible after argument-dependent lookup in tuple(uint64,uint64)

No encontré ninguna información relacionada que pudiera ayudar a resolver este problema.

Aquí está el código completo del contrato:

pragma solidity ^0.4.21;

contract SeasonFactory {    
    address public owner;
    address[] public seasons;

    event SeasonCreated(uint64 indexed beginTicks, uint64 indexed endTicks, address season);

    function SeasonFactory() public {
        owner = msg.sender;
    }

    function newSeason(uint64 beginTicks, uint64 endTicks) public restricted {
        require(beginTicks < endTicks);
        require(seasons.length == 0 || Season(seasons[seasons.length - 1]).period().endTicks() < beginTicks);

        Season season = new Season(owner, beginTicks, endTicks);
        seasons.push(season);
        emit SeasonCreated(beginTicks, endTicks, season);
    }

    function getSeasonsCount() public view returns(uint) {
        return seasons.length;
    }

    function getSeasonForDate(uint64 ticks) public view returns(address) {
        for (uint i = seasons.length - 1; i >= 0; i--) {
            Season season = Season(seasons[i]);
            if (ticks >= season.period.beginTicks() && ticks <= season.period.endTicks())
                return season;
        }
        return 0;
    }

    modifier restricted {
        require(owner == msg.sender);
        _;
    }
}

contract Season {
    address public owner;
    SharedTypes.DateRange public period;

    function Season(address owner_, uint64 beginTicks, uint64 endTicks) public {
        owner = owner_;
        period = SharedTypes.DateRange(beginTicks, endTicks);
    }
}

library SharedTypes {
    struct DateRange {    
        uint64 beginTicks;
        uint64 endTicks;
    }
}

¿Qué podría estar mal aquí?

¿Cuál es el propósito de Season(seasons[seasons.length - 1]).period().endTicks() < beginTicks)y Season season = Season(seasons[i])cuándo Season necesita 3 parámetros?
Además, si está heredando la Seasonfunción de contract Season, debe colocar ese contrato sobre SeasonFactoryy heredar correctamente concontract SeasonFactory is Season {}
El uso de @ReyHaynes con un solo parámetro debería ser un elenco, supongo. Lo encontré en algún lugar de Internet. No hay herencia, Factory obviamente no es un objeto.
Las funciones son de uso explícito, si tiene 3 parámetros, necesita 3 parámetros. Sin embargo, puede crear varias funciones con el mismo nombre y una cantidad diferente de parámetros, lo que se denomina sobrecarga de funciones.
Solo estoy lanzando algunos addressque se sabe que son un contrato T. Ver dappsforbeginners.wordpress.com/tutorials/…

Respuestas (1)

Según esta publicación , un contrato no puede acceder directamente al almacenamiento de otro contrato.

Probablemente necesite implementar una función getter, como se describe en esta publicación .

Intenté usar la siguiente función en su contrato de temporada y funcionó bien:

function getTicks(uint ind) view public returns( uint64 ){
    if(ind == 1) return period.endTicks;
    else return period.beginTicks;
}
Otra sorpresa de solidez. Gracias por una respuesta.