# EDUT Contracts On-chain contracts and deployment artifacts for membership and entitlements. ## Scope 1. Human membership contract (soulbound governance identity). 2. Offer + entitlement settlement contract for fixed-SKU purchases. 3. ABI and deployment artifact publication. ## Current Contract `contracts/EdutHumanMembership.sol` Features: 1. One-time soulbound human token mint. 2. Sponsor mint support (`mintMembership(recipient)` can be paid by inviter/company wallet). 3. Owner-configurable flat mint price (`updateMintPrice`), launch default is fixed `100 USDC` (6 decimals). 4. Membership status lifecycle (`ACTIVE/SUSPENDED/REVOKED`) for runtime gates. 5. Treasury address control for settlement routing. `contracts/EdutOfferEntitlement.sol` Features: 1. Membership-gated entitlement purchases. 2. Owner-configurable offer registry (`upsertOffer`). 3. Fixed USDC settlement support (ETH optional if payment token is zero address). 4. Deterministic entitlement id sequence with state lifecycle (`ACTIVE/SUSPENDED/REVOKED`). 5. Emits offer + entitlement events for backend reconciliation. ## Local Commands Use a Hardhat-supported Node runtime (`20.x` recommended). 1. `npm install` 2. `npm run build` 3. `npm run test` 4. `npm run deploy:sepolia` 5. `npm run deploy:mainnet` 6. `npm run deploy:entitlement:sepolia` 7. `npm run deploy:entitlement:mainnet` 8. `npm run update:membership:price:sepolia` 9. `npm run update:membership:price:mainnet` `make check` wraps build + tests. ## Deployment Environment Copy `.env.example` values into your shell/session before deploy: 1. `DEPLOYER_PRIVATE_KEY` 2. `BASE_SEPOLIA_RPC_URL` / `BASE_MAINNET_RPC_URL` 3. `TREASURY_WALLET` 4. `MINT_CURRENCY_ADDRESS` (USDC token contract on target chain) 5. `MINT_AMOUNT_ATOMIC` 6. `DEPLOY_OUTPUT_PATH` (optional) 7. `ENTITLEMENT_TREASURY_WALLET` 8. `MEMBERSHIP_CONTRACT_ADDRESS` 9. `PAYMENT_TOKEN_ADDRESS` 10. `OFFER_PRICE_ATOMIC` 11. `ENTITLEMENT_DEPLOY_OUTPUT_PATH` (optional) 12. `OFFERS_JSON` (optional path to per-offer seed config JSON) 13. `OFFERS_INLINE_JSON` (optional inline JSON array alternative to `OFFERS_JSON`) `update:membership:price:*` requires: 1. `MEMBERSHIP_CONTRACT_ADDRESS` 2. `MINT_CURRENCY_ADDRESS` 3. `MINT_AMOUNT_ATOMIC` If no offer override JSON is provided, deploy script seeds default offers at `OFFER_PRICE_ATOMIC`. Use `deploy/offers.template.json` to define per-offer prices and policy flags. Smoke flow optional vars: 1. `E2E_IDENTITY_ASSURANCE_LEVEL` 2. `E2E_IDENTITY_ATTESTED_BY` 3. `E2E_IDENTITY_ATTESTATION_ID` Example (Sepolia): ```bash cd /Users/vsg/Documents/VSG\ Codex/contracts export $(grep -v '^#' .env | xargs) npm run deploy:sepolia ``` ## Boundary Contracts are settlement primitives. Runtime execution remains off-chain and fail-closed by entitlement state.