HourMatch issues renewable energy certificates per plant per hour on a shared ledger and checks green-power claims against it, hour by hour. In the demo week a fictional factory holds certificates for 103% of its electricity use, so it can call itself 100% renewable, yet only 83.0% of its use is matched by certificates from the same hour. Track: Renewable Energy & Energy Trading.

Who would use it and pay for it

The buyer is a company that makes renewable electricity claims and has to defend them: a semiconductor or electronics supplier reporting to RE100 customers, or a data center operator selling "24/7 clean" capacity. Auditors and NGOs use the same ledger for free, since anyone can recompute a claim from public chain state. Certificate issuers and grid operators would run the issuing side.

The problem

Certificates are usually counted over a year, so noon solar can cover a night shift on paper. Bjørn et al. (Nature Climate Change, 2022) looked at 115 companies with science-based targets and found that about two thirds of the reported Scope 2 cuts for 2015 to 2019 came from certificates rather than real reductions. The GHG Protocol opened a consultation on hourly matching in 2025. In Taiwan a certificate (T-REC) covers 1,000 kWh and records no hour, under the Implementation Regulations Governing Renewable Energy Certificates (Art. 5).

What we built

  1. A Solidity contract, HourlyCertificateRegistry, deployed on Ethereum Sepolia and verified on Sourcify. The operator authorizes issuers; each issuer registers its own plants and issues one certificate id per plant per hour (1 unit = 1 kWh). A plant-hour can be issued once. A certificate can be transferred once, from the plant account to a buyer, which follows Taiwan's "transfer once in principle" rule. Only the wallet bound to a company can retire certificates for it, only against the same hour's metered use, never above that use. Certificates from every issuer count against one shared matched counter, so a kWh retired through one issuer cannot be claimed again through another.
  2. A claim checker. A sentence such as "Northbay Fab ran on 100% renewable electricity this week" becomes fields (company, dates, daily hours, weekdays, claimed share, hourly or volume basis, RE100). Code computes the share, gives a verdict and writes a sentence the ledger supports on the same basis. The RE100 rule follows the March 2025 Technical Criteria: projects must be 15 years old or younger, with up to 15% of use allowed from older plants.
  3. A web page that runs the whole ledger in the browser for a demo week built from real Taiwan Power Company output curves, plus an upload mode: a company drops in its own hourly use CSV and certificate CSV, nothing leaves the browser, and the result prints as a one-page report.
  4. A button that reads matchedBps straight from Sepolia and puts it next to the number the browser computed for the same day.

One demo day (8 October 2026) is on chain with six separate wallets: an operator, two issuers and three companies. Nine writes that must fail were sent as real transactions and reverted on chain: a company trying to issue, an issuer issuing for the other issuer's plant, the same day issued twice, a double sale, a resale, another company's wallet retiring the factory's certificates (twice, two ways), a second retirement for an hour already fully matched, and another company anchoring a claim about the factory.

How we built it

Solidity 0.8.24 with Hardhat, ethers v6, plain JavaScript modules shared by the tests and the web page, a static site on Vercel. The JavaScript ledger mirrors the contract rule for rule; the test suite replays the whole demo week (1,381 writes) on the contract and compares every day with the JavaScript result. The demo week uses Taiwan Power Company open data (data.gov.tw dataset 8931, 10-minute snapshots archived by kiang/taipower_data), averaged to hourly values and scaled to plant size.

For the five example sentences on the page, the fields come from a language model parse (aisingapore/Qwen-SEA-LION-v4-32B-IT on PublicAI, temperature 0) made during our evaluation run on 14 October 2026 and cached in the page, which says so. Sentences a visitor types are read by keyword rules in the browser. The rules report an error for an unknown company, a window that crosses midnight or a missing percentage. No model runs on the page, and no model ever decides a number or a verdict.

Evaluation

18 claims about the demo week and 8 about a held-out week. The same model alone, given the hourly table and the rules in its prompt, got 13 of 18 and 3 of 8 right. With the model only filling in fields and code deciding, we got 17 of 18 and 8 of 8. A spreadsheet with SUMPRODUCT formulas, given fields read by a person, got all 26 right; Excel recalculated the workbook and agreed. Three claims are also worked out row by row by a script that imports none of our code. The arithmetic is easy for a spreadsheet. A spreadsheet has no shared state, though: it trusts its certificate column and cannot stop the same certificate from appearing in two companies' files. The contract tests cover that part.

Challenges

Matching the contract and the browser ledger exactly, down to integer rounding, so that the page and the chain show the same 82.8% for the same day. Writing a day of hourly data on chain at a sensible cost: one batch per plant per day, 50.3 million gas for the demo day on Sepolia. Reading Taiwan's certificate rules closely enough to see where an hourly ledger agrees with them (one transfer) and where it differs (hour stamps, the generation-year rule).

Limits

The companies, plants, contracts and wallets are fictional, and the loads were designed so that certificate volume is a little over 100% of use. The hourly shares come from the real curves. Sepolia is a test network and the contract is not audited. The operator writes meter data, so wrong meter data gives a wrong share. At Sepolia's measured gas, a full year of hourly data for many plants would not belong on Ethereum mainnet; a production version would use a rollup or a permissioned chain, or anchor a daily Merkle root. If a national registry published hourly certificates with open read access, it could do much of this without a chain.

Sources

  • Taiwan Power Company, real-time generation by unit, data.gov.tw/dataset/8931
  • Implementation Regulations Governing Renewable Energy Certificates (Taiwan, amended 26 May 2025), law.moj.gov.tw, pcode J0100073
  • RE100 Technical Criteria, 24 March 2025, section 4.2
  • Bjørn, Lloyd, Brander, Matthews (2022), Nature Climate Change 12, 539 to 546
  • GHG Protocol, Scope 2 public consultation (2025)

How to test it

  1. Open https://hourmatch.vercel.app and click the first example. Expect NOT SUPPORTED, 103.0% on paper and 83.0% hour by hour.
  2. Type "Harbor Office ran on 95% renewable power from 9 to 18 on weekdays." Expect 80.2%. Type a company that is not in the ledger and expect CANNOT CHECK.
  3. Scroll to the Sepolia section and press "Read matchedBps from Sepolia". Each company's on-chain share for 8 October should equal the browser value (Northbay Fab 82.8%).
  4. Open any refused transaction on Etherscan; its status is failed and the error name is listed on the page.
  5. Switch to "Your own CSV files", download the two sample files, load them and press "Check my files". Expect the same 103.0% and 83.0%, then try "Printable report".
  6. In the repository: npm install, then npm test (20 node tests and 5 contract tests), then node scripts/verify_chain.mjs to re-read every Sepolia receipt.

Demo video: https://youtu.be/YnZeATspZ3g

Built With

Share this project:

Updates

Submission history