ERC-8097
Ethereum Improvement Proposal

In-Ground Asset
Token Standard

ERC-8097 defines a canonical on-chain record structure for mining and natural resource assets — covering geological, compliance, extraction, and environmental disclosure in a machine-verifiable format.

EIP 8097
Status Review
Created 2025-11-24
Author Solomon Ashok
Requires EIP-55 · EIP-712 · ERC-165
Licence CC0

What is ERC-8097?

A trust infrastructure layer for the global mining sector — not a financial product, not a risk rating, not a data marketplace.

The Problem

Mining and natural resource assets present a systemic trust problem. Geological reports, ESG disclosures, and compliance records are produced by operators in formats that are not machine-readable, not cross-jurisdictionally comparable, and not permanently verifiable. Investors, regulators, and institutions cannot independently verify claims without re-auditing the underlying documents.

What ERC-8097 Does

ERC-8097 defines five typed metadata objects — IRO, IGO, ICO, IEXO, IEO — plus a Score Mutation Log (SML). Each object is represented on-chain by its SHA-256 hash. Full object data lives off-chain on IPFS. Any verifier can download the content, compute the hash, and confirm it matches the on-chain record. Tamper-proof by construction.

IERC-8097.sol Solidity
// Anchor a mine's ERC-8097 record on-chain function anchor( bytes32 assetId, bytes32 iroHash, // SHA-256 of IRO JSON bytes32 igoHash, // SHA-256 of IGO JSON bytes32 icoHash, // SHA-256 of ICO JSON bytes32 iexoHash, // SHA-256 of IEXO JSON bytes32 ieoHash, // SHA-256 of IEO JSON bytes32 smlHash, // SHA-256 of SML JSON uint256 currentScore, bytes32 reportPdfHash, string calldata reportIpfsUri, string calldata rulebookVersion, string calldata schemaVersion ) external; // Verify the anchored record function getAsset(bytes32 assetId) external view returns (AssetRecord memory); // getCurrentScore() — informational only // NOT a risk rating. NOT financial advice. function getCurrentScore(bytes32 assetId) external view returns (uint256);

Six Canonical Objects

Every mining asset record is decomposed into five metadata objects plus a mutation log. Objects can be independently attested, independently updated, and independently verified.

IRO
In-Ground Resource Object
What is in the ground

Mineral Resource Estimate, Ore Reserve, commodity, reporting standard (JORC/NI 43-101/SAMREC), classification breakdown, CP attestation metadata.

totalResourceMt totalGrade classifications[] oreReserveDeclared cpNameResources objectHash
IGO
In-Ground Geology Object
How we know what is there

Deposit style, drilling methods and metres, QAQC flags, laboratory accreditation, CP site visit confirmation, estimation method and software.

depositStyle drillingTotalMetres qaqcBlanks laboratoryAccreditedISO cpSiteVisitConfirmed estimationMethod
ICO
In-Ground Compliance Object
The legal record

Jurisdiction and regulatory bodies, tenure type and status, ownership structure, indigenous agreements, royalty disclosure, environmental permits.

tenureStatus ownershipPct indigenousAgreement royaltyRateDisclosed environmentalPermitsStatus allTenureOnGranted
IEXO
In-Ground Extraction Object
What has been extracted

Production status, annual guidance, AISC, processing plant data, mine type. Depletion is monotonically enforced on-chain — extraction history cannot be retroactively altered.

productionStatus annualGuidanceMin aiscMin processingRecoveryPct depletionReportedMt ↑ mineType
IEO
In-Ground Environmental Object
The environmental footprint

Three sub-objects: Environmental (EIA, water rights, GHG, net-zero, TCFD), Social (ILO 169, community, H&S), Governance (board ESG, sustainability report, third-party audit).

eiaStatus netZeroTarget tcfdAlignment indigenousConsultation sustainabilityReportPresent thirdPartyESGAudit
SML
Score Mutation Log
Disclosure quality history

Timestamped, causally linked history of all score changes. Full event array stored off-chain. On-chain: SHA-256 hash of the log + informational score (0–1000). Append-only.

currentScore scoreVersion rulebookVersion smlHash anchoredAt
DisclosureStatus — IEO fields Solidity
enum DisclosureStatus { UNKNOWN, // 0 — not assessed CONFIRMED, // 1 — explicitly stated in source document REFERENCED, // 2 — mentioned but not fully detailed NOT_DISCLOSED, // 3 — not found in source document NOT_APPLICABLE // 4 — does not apply at this lifecycle stage } // Note: no value maps to HIGH_RISK or RISK_BAND (R-FORBIDDEN-TERMS)

15 Enforced Rules

Conforming implementations must observe all of the following. Some are enforced at the EVM level; others require CI discipline.

R-LIFECYCLE Monotonic forward only. advanceLifecycle() advances exactly one step. Only anchor() may set ANCHORED state. Prevents INDEXED→ANCHORED bypass.
R-PRODUCTION Explicit transition table. PRODUCTION↔CARE_AND_MAINTENANCE is permitted. CLOSED is terminal. Not numeric ordering.
R-DEPLETION Monotonically increasing. depletionReportedMt may only increase. updateDepletion() reverts if new value ≤ current. Geological reality enforced.
R-CP-EIP712 EIP-712 typed attestations. attestationTimestamp is caller-supplied and in the signed payload — not block.timestamp. Recovered signer stored and emitted.
R-CP-IDENTITY Off-chain credential verification. The contract proves an address signed. It does not prove that address belongs to a credentialled CP/QP. Professional body verification is off-chain.
R-CP-REPLAY Digest-used mapping. Each EIP-712 digest accepted at most once. Duplicate attestation submissions must revert.
R-CP-OBJECT Object hash matching. objectHash in an attestation must match one of the asset's six current hashes. Attesting an unrelated bytes32 must be rejected.
R-REPORT Report required at anchoring. anchor() must revert if reportPdfHash == 0 or reportIpfsUri is empty. Every anchored record must have a human-readable report.
R-SCORE-RANGE Score bounded 0–1000. currentScore must be in [0, 1000]. Enforced in both anchor() and updateSML(). Score is informational only.
R-SLUG-UNIQUE Unique mine slugs. mineSlug must be unique across all registered assets. register() reverts on duplicate.
R-REANCHOR History preserved. AssetRecord stores latest hashes. AssetAnchored and AssetReAnchored event logs are the authoritative immutable history. Prior records never deleted.
R-FORBIDDEN No HIGH_RISK or RISK_BAND in ABI names, event names, return values, or runtime revert strings. NO_DATA displays as "No Data". These terms imply financial risk assessment — outside scope.
R-NO-SCORING Score computation is off-chain. The contract does not compute disclosure quality indices. getCurrentScore() returns an informational value anchored by the operator.
R-NO-RISK No risk assessment. The contract does not assess risk, investment merit, or geological quality. It anchors. It does not evaluate.
R-FRESHNESS Decay is off-chain. Data freshness decay computed off-chain. Decay parameters (lambda values) are off-chain governance. Not implemented in the contract.

Four States, One Direction

Lifecycle advances forward only. advanceLifecycle() moves one step at a time. Only anchor() sets ANCHORED state — preventing any lifecycle bypass.

State 0
INDEXED
Found from public exchange filing. No operator claim. Minimal data.
State 1
CLAIMED
Operator submitted claim. Pending administrative review.
State 2
VERIFIED
Claim confirmed. register() + 2× advanceLifecycle() required.
State 3
ANCHORED
ERC-8097 objects anchored on Base chain. Report on IPFS. Public record live.

Production Status — Permitted Transitions

PRE_EXPLORATION EXPLORATION
EXPLORATION PRE_FEASIBILITY → FEASIBILITY → DEVELOPMENT
DEVELOPMENT PRODUCTION
PRODUCTION CARE_AND_MAINTENANCE bidirectional — mine restart permitted
PRODUCTION · CARE_AND_MAINTENANCE CLOSED terminal — no transitions out

What ERC-8097 Is Not

The standard explicitly prohibits language implying financial risk assessment. These terms must not appear in ABI names, event names, return values, or runtime strings.

❌ Forbidden — violates R-FORBIDDEN-TERMS
HIGH_RISK — implied risk rating
RISK_BAND — financial risk category
Risk Band — same, mixed case
function getRiskScore() — ABI name
event HighRiskAssetDetected() — event name
"asset is HIGH_RISK" — revert string
NO_DATA displays as "High Risk" — UI label
✓ Correct — compliant with R-FORBIDDEN-TERMS
NO_DATA — correct enum value
NO_DATA displays as "No Data" — correct UI label
Intelligence Grade: AA — disclosure quality
getCurrentScore() — informational
Score reflects data completeness only
Not a risk assessment, not financial advice
Comments in NatDoc may explain the rule

Built on Base Chain

The reference implementation is deployed on Base (chain ID 8453). Founding contributor: InGround Assets Limited — the first production system built on ERC-8097.

IERC-8097.sol

Complete interface with all structs, enums, events, and function signatures. Includes CPAttestation, AssetRecord, all six object structs, and DisclosureStatus enum.

IERC-8097.sol on GitHub

ERC-8097.sol

Reference implementation with register() → advanceLifecycle() → anchor() flow. Digest replay protection, object hash matching, explicit production transition table, EIP-712 attestations.

ERC-8097.sol on GitHub

ERC-8097.t.sol

Foundry test suite covering all normative rules: lifecycle bypass prevention, depletion monotonicity, CP attestation replay, object hash matching, score range validation, and fuzz tests.

Test suite on GitHub

Public Verification

Every anchored mine record is publicly verifiable at anchor.inground.xyz. Enter any mine slug to see the on-chain record, download the IPFS report, and verify the SHA-256 hash.

anchor.inground.xyz
Quick start — verify an anchored asset TypeScript
import { ethers } from 'ethers'; const provider = new ethers.JsonRpcProvider('https://mainnet.base.org'); const contract = new ethers.Contract(ERC8097_ADDRESS, ABI, provider); // Resolve mine slug to assetId const assetId = await contract.getAssetBySlug('bellevue-gold-project'); // Get the full anchor record const record = await contract.getAsset(assetId); console.log(record.iroHash); // SHA-256 of IRO JSON object console.log(record.reportPdfHash); // SHA-256 of anchored report PDF console.log(record.reportIpfsUri); // IPFS CID for human-readable report console.log(record.anchoredAt); // Unix timestamp of anchoring // Verify a downloaded PDF const pdfBytes = await fetch(record.reportIpfsUri).then(r => r.arrayBuffer()); const hashBuf = await crypto.subtle.digest('SHA-256', pdfBytes); const hashHex = Array.from(new Uint8Array(hashBuf)) .map(b => b.toString(16).padStart(2, '0')).join(''); const verified = 'sha256:' + hashHex === record.reportPdfHash; console.log('Report verified:', verified); // true if unaltered

Standard Status

ERC-8097 is progressing through the Ethereum Improvement Proposal process. Track progress on Ethereum Magicians and the EIP tracker.

8097
EIP Number
In-Ground Asset Token
Review
Current Status
Progressing through EIP review
8453
Deployed Chain
Base (Ethereum L2)

EIP Progress Timeline

November 2025
Standard Authored
ERC-8097 authored by Solomon Ashok. Initial five-object schema defined.
May 2026
Schema v0.2 Published
Expanded structs, production transitions table, CP replay protection, object hash matching added.
May 2026
Reference Implementation
ERC-8097.sol deployed to Base chain. Foundry test suite published. Founding contributor: InGround Assets Limited.
June 2026
EIP Review Status
Progressing through formal EIP review. Tracking at eip.tools/eip/8097.
Upcoming
Standards Body Engagement
AusIMM, UNIDO Global Alliance, and NI 43-101 body engagement planned.
Upcoming
Final / Living status
Target: EIP Final or Living status following review and adoption.

Attribution & Licence

Standard Provenance

Solomon Ashok (@SolomonAshok)
8097
2025-11-24
Review
EIP-55 · EIP-712 · ERC-165
CC0 (Public Domain)
InGround Assets Limited
anchor.inground.xyz

Get Involved

ERC-8097 is an open standard. Developers, mining institutions, standards bodies, and regulators are welcome to contribute.

⚙️

Implement the Standard

Build on ERC-8097. The reference implementation, ABI, and Foundry test suite are open source under CC0. Deploy your own instance or integrate with the existing Base chain deployment.

View on GitHub →
💬

Join the Discussion

EIP discussions happen on Ethereum Magicians. Review the specification, raise issues, propose improvements. Standards body contributors from AusIMM, NI 43-101, and SAMREC are particularly welcome.

Ethereum Magicians →
🏭

Verify a Mine Record

Every mine anchored under ERC-8097 is publicly verifiable. Download the report from IPFS, compute the SHA-256 hash, confirm it matches the on-chain record. No trust required.

anchor.inground.xyz →