# Oz Governor Get Proposal Details

**URL:** <https://forum.openzeppelin.com/t/oz-governor-get-proposal-details/27436>\
**Category:** Smart Contracts\
**Created:** [April 11, 2022, 1:25pm UTC](https://forum.openzeppelin.com/t/oz-governor-get-proposal-details/27436 "2022-04-11T13:25:21Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![SCD](https://avatars.discourse-cdn.com/v4/letter/s/6f9a4e/32.png) [@SCD](https://forum.openzeppelin.com/u/SCD)\
**Post date:** [April 11, 2022, 1:25pm UTC](https://forum.openzeppelin.com/t/oz-governor-get-proposal-details/27436/1 "2022-04-11T13:25:21Z")

</div>

Hi, i have a question about Openzeppelin Governor contracts. Is it possible to get proposal details from proposal id? When creating proposal it just saves the voteStart and voteEnd parameters. But i need a whole details of the proposals(description, for votes, abstain votes, etc. ) to list them on front end. I would be glad if anybody could help.

```auto
    struct ProposalCore {
        Timers.BlockNumber voteStart;
        Timers.BlockNumber voteEnd;
        bool executed;
        bool canceled;
    }

    string private _name;

    mapping(uint256 => ProposalCore) private _proposals;

```

The function that creates proposals.

```auto
function propose(
        address[] memory targets,
        uint256[] memory values,
        bytes[] memory calldatas,
        string memory description
    ) public virtual override returns (uint256) {
        require(
            getVotes(msg.sender, block.number - 1) >= proposalThreshold(),
            "GovernorCompatibilityBravo: proposer votes below proposal threshold"
        );

        uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));

        require(targets.length == values.length, "Governor: invalid proposal length");
        require(targets.length == calldatas.length, "Governor: invalid proposal length");
        require(targets.length > 0, "Governor: empty proposal");

        ProposalCore storage proposal = _proposals[proposalId];
        require(proposal.voteStart.isUnset(), "Governor: proposal already exists");

        uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();
        uint64 deadline = snapshot + votingPeriod().toUint64();

        proposal.voteStart.setDeadline(snapshot);
        proposal.voteEnd.setDeadline(deadline);

        emit ProposalCreated(
            proposalId,
            _msgSender(),
            targets,
            values,
            new string[](targets.length),
            calldatas,
            snapshot,
            deadline,
            description
        );

        return proposalId;
    }

```

---

<div class="post-metadata">

**Author:** ![JulissaDantes](https://sea2.discourse-cdn.com/flex022/user_avatar/forum.openzeppelin.com/julissadantes/32/15410_2.png) [@JulissaDantes](https://forum.openzeppelin.com/u/JulissaDantes)\
**Post date:** [April 13, 2022, 1:43pm UTC](https://forum.openzeppelin.com/t/oz-governor-get-proposal-details/27436/2 "2022-04-13T13:43:43Z")

</div>

You can save the description data off chain, and then compare against hash(proposial Id) to make sure it matches, and include other extensions on your like [`GovernorCountingSimple`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/governance/extensions/GovernorCountingSimple.sol) containing the `proposalVotes` that return the for, abstain, and against votes.
