UNPKG

@q-dev/gdk-sdk

Version:

Typescript Library to interact with GDK Contracts

60 lines 2.16 kB
"use strict"; 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