contracts/scripts/deploy-entitlement.cjs

109 lines
3.2 KiB
JavaScript

const hre = require("hardhat");
const fs = require("fs");
const path = require("path");
const DEFAULT_OFFERS = [
"edut.solo.core",
"edut.workspace.core",
"edut.workspace.ai",
"edut.workspace.lane24",
"edut.workspace.sovereign",
];
function requiredEnv(name) {
const value = process.env[name];
if (!value || !value.trim()) {
throw new Error(`Missing required env: ${name}`);
}
return value.trim();
}
function requireAddress(name, value, { allowZero = false } = {}) {
if (!hre.ethers.utils.isAddress(value)) {
throw new Error(`Invalid address for ${name}: ${value}`);
}
if (!allowZero && value === hre.ethers.constants.AddressZero) {
throw new Error(`${name} cannot be zero address`);
}
return value;
}
function parseUint(name, value) {
try {
const parsed = hre.ethers.BigNumber.from(value);
if (parsed.lt(0)) {
throw new Error("must be >= 0");
}
return parsed;
} catch (err) {
throw new Error(`Invalid uint for ${name}: ${value} (${err.message})`);
}
}
async function main() {
const treasury = requireAddress(
"ENTITLEMENT_TREASURY_WALLET",
requiredEnv("ENTITLEMENT_TREASURY_WALLET"),
);
const paymentToken = requireAddress(
"PAYMENT_TOKEN_ADDRESS",
(process.env.PAYMENT_TOKEN_ADDRESS || hre.ethers.constants.AddressZero).trim(),
{ allowZero: true },
);
const membershipContract = requireAddress(
"MEMBERSHIP_CONTRACT_ADDRESS",
requiredEnv("MEMBERSHIP_CONTRACT_ADDRESS"),
);
const offerPriceAtomic = parseUint(
"OFFER_PRICE_ATOMIC",
(process.env.OFFER_PRICE_ATOMIC || "1000000000").trim(),
);
const [deployer] = await hre.ethers.getSigners();
console.log("deployer:", deployer.address);
console.log("network:", hre.network.name);
console.log("treasury:", treasury);
console.log("payment_token:", paymentToken);
console.log("membership_contract:", membershipContract);
console.log("offer_price_atomic:", offerPriceAtomic.toString());
const factory = await hre.ethers.getContractFactory("EdutOfferEntitlement");
const contract = await factory.deploy(treasury, paymentToken, membershipContract);
await contract.deployed();
console.log("entitlement_contract:", contract.address);
const seededOffers = [];
for (const offerID of DEFAULT_OFFERS) {
const tx = await contract.upsertOffer(offerID, offerPriceAtomic, true, true);
const receipt = await tx.wait();
seededOffers.push({ offerID, txHash: receipt.transactionHash });
console.log("offer_seeded:", offerID, receipt.transactionHash);
}
const output = {
network: hre.network.name,
chainId: hre.network.config.chainId || null,
deployer: deployer.address,
treasury,
paymentToken,
membershipContract,
offerPriceAtomic: offerPriceAtomic.toString(),
entitlementContract: contract.address,
txHash: contract.deployTransaction.hash,
seededOffers,
};
const outputPath = (process.env.ENTITLEMENT_DEPLOY_OUTPUT_PATH || "").trim();
if (outputPath) {
const absolute = path.resolve(outputPath);
fs.mkdirSync(path.dirname(absolute), { recursive: true });
fs.writeFileSync(absolute, JSON.stringify(output, null, 2));
console.log("deployment_output:", absolute);
}
}
main().catch((err) => {
console.error(err);
process.exitCode = 1;
});