@q-dev/gdk-sdk
Version:
Typescript Library to interact with GDK Contracts
60 lines • 2.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNonceForProposal = exports.getDomain = exports.ConstitutionSignTypes = exports.CandidateTypes = void 0;
const ethers_1 = require("ethers");
// TODO: Divide utils functionality and constants into separate files
exports.CandidateTypes = {
Candidate: [
{ name: "dao", type: "address" },
{ name: "candidate", type: "address" },
{ name: "message", type: "string" },
{ name: "nonce", type: "bytes32" },
],
};
exports.ConstitutionSignTypes = {
ConstitutionSign: [
{ name: "dao", type: "address" },
{ name: "constitutionHash", type: "bytes32" },
{ name: "signer", type: "address" },
],
};
/**
* Get the domain for a contract that supports EIP712.
*
* Usage example:
*
* const domain = await getDomain(daoMemberStorageInstance);
*
* await account.signTypedData(domain, CandidateTypes, {
* dao: daoRegistryAddress, // MUST be in a lowercase
* candidate: (await account.getAddress()).toLowerCase(),
* message: await daoMemberStorage.getMessage(),
* nonce: getNonceForProposal(proposalId, votingContractAddress)
* });
*/
async function getDomain(contract) {
const { fields, name, version, chainId, verifyingContract, salt, extensions } = await contract.eip712Domain();
if (extensions.length > 0) {
throw Error("Extensions not implemented");
}
const domain = {
name,
version,
chainId,
verifyingContract,
salt,
};
const domainFieldNames = ["name", "version", "chainId", "verifyingContract", "salt"];
domainFieldNames.forEach((name, index) => {
if (!(Number(fields) & (1 << index))) {
delete domain[name];
}
});
return domain;
}
exports.getDomain = getDomain;
function getNonceForProposal(proposalId, votingContractAddress) {
return ethers_1.ethers.utils.keccak256(new ethers_1.ethers.utils.AbiCoder().encode(["uint256", "address"], [proposalId, votingContractAddress.toLowerCase()]));
}
exports.getNonceForProposal = getNonceForProposal;
//# sourceMappingURL=eip712.js.map