diff --git a/packages/web/spec/info/_category_.json b/packages/web/spec/info/_category_.json
new file mode 100644
index 000000000..ecf432a97
--- /dev/null
+++ b/packages/web/spec/info/_category_.json
@@ -0,0 +1,5 @@
+{
+ "label": "ethdebug/format/info",
+ "position": 5,
+ "link": null
+}
diff --git a/packages/web/spec/info/info.mdx b/packages/web/spec/info/info.mdx
new file mode 100644
index 000000000..decf23edc
--- /dev/null
+++ b/packages/web/spec/info/info.mdx
@@ -0,0 +1,11 @@
+---
+sidebar_position: 4
+---
+
+import SchemaViewer from "@site/src/components/SchemaViewer";
+
+# Schema
+
+
diff --git a/packages/web/spec/info/overview.mdx b/packages/web/spec/info/overview.mdx
new file mode 100644
index 000000000..8b7dada58
--- /dev/null
+++ b/packages/web/spec/info/overview.mdx
@@ -0,0 +1,55 @@
+---
+sidebar_position: 1
+---
+
+# Overview
+
+:::tip[Summary]
+
+**ethdebug/format/info** is a JSON Schema and namespace containing the
+**ethdebug/format/info/resources** JSON Schema. These schemas provide a means
+for representing the debugging data pertaining to a particular compilation.
+
+These two schemas serve to address two distinct purposes:
+1. **ethdebug/format/info** provides a means for representing a complete,
+ standalone, and language-agnostic representation of all necessary debugging
+ data. Objects in this schema contain all information specified by
+ **ethdebug/format/info/resources** plus additional metadata.
+2. **ethdebug/format/info/resources** provides a means for compilers to specify
+ compilation-related debug information without also specifying compilation
+ metadata that may already be found elsewhere in compiler output.
+
+Due to the common practice that EVM language compilers already provide their
+own structured JSON output formats, it is expected that compilers will
+primarily produce objects in the **ethdebug/format/info/resources** schema, and
+that language-specific tooling will serve to convert these objects plus other
+compiler JSON output into the more standalone **ethdebug/format/info**.
+
+This format recommends that compilers **should** ensure there
+exists tooling support for the creation of **ethdebug/format/info** objects,
+either via custom compilation modes or through the distribution of first- or
+third-party tools.
+
+:::
+
+This format defines the primary **ethdebug/format/info** schema.
+
+JSON values adhering to this schema contain debugging information about a
+single invocation of a compiler.
+
+
+## Reading this schema
+
+The **ethdebug/format/info** schema is a standalone schema and does not define
+a corresponding namespace.
+
+This schema (like all schemas in this format) are specified as
+[JSON Schema](https://json-schema.org), draft 2020-12.
+
+Please refer to one or more of the following resources in this section, or
+see the navigation bar for complete contents:
+
+- [Schema](/spec/info) (**ethdebug/format/info** schema listing)
+
+- [Resources schema](/spec/info/resources)
+ (**ethdebug/format/info/resources** schema listing)
diff --git a/packages/web/spec/info/resources.mdx b/packages/web/spec/info/resources.mdx
new file mode 100644
index 000000000..37b4752a4
--- /dev/null
+++ b/packages/web/spec/info/resources.mdx
@@ -0,0 +1,11 @@
+---
+sidebar_position: 5
+---
+
+import SchemaViewer from "@site/src/components/SchemaViewer";
+
+# Resources lookup schema
+
+
diff --git a/packages/web/src/schemas.ts b/packages/web/src/schemas.ts
index 486b4ce5c..2f9649965 100644
--- a/packages/web/src/schemas.ts
+++ b/packages/web/src/schemas.ts
@@ -194,6 +194,11 @@ const materialsSchemaIndex: SchemaIndex = {
title: "Source range schema",
href: "/spec/materials/source-range"
},
+
+ "schema:ethdebug/format/info": {
+ title: "ethdebug/format/info",
+ href: "/spec/info"
+ },
};
const programSchemaIndex: SchemaIndex = {
@@ -216,7 +221,15 @@ const programSchemaIndex: SchemaIndex = {
}
})).reduce((a, b) => ({ ...a, ...b }), {})
),
+};
+const infoSchemaIndex: SchemaIndex = {
+ "schema:ethdebug/format/info": {
+ href: "/spec/info"
+ },
+ "schema:ethdebug/format/info/resources": {
+ href: "/spec/info/resources"
+ },
};
export const schemaIndex: SchemaIndex = {
@@ -225,4 +238,5 @@ export const schemaIndex: SchemaIndex = {
...dataSchemaIndex,
...materialsSchemaIndex,
...programSchemaIndex,
+ ...infoSchemaIndex,
};
diff --git a/schemas/info.schema.yaml b/schemas/info.schema.yaml
new file mode 100644
index 000000000..624c2bca9
--- /dev/null
+++ b/schemas/info.schema.yaml
@@ -0,0 +1,184 @@
+$schema: "https://json-schema.org/draft/2020-12/schema"
+$id: "schema:ethdebug/format/info"
+
+title: ethdebug/format/info
+description: |
+ Debugging information about a single compilation
+
+type: object
+
+$ref: "schema:ethdebug/format/info/resources"
+
+properties:
+ programs:
+ type: array
+ items:
+ $ref: "schema:ethdebug/format/program"
+ additionalItems:
+ false
+
+ compilation:
+ $ref: "schema:ethdebug/format/materials/compilation"
+
+
+required:
+ - compilation
+ - programs
+
+examples:
+ - compilation:
+ id: __301f3b6d85831638
+ compiler:
+ name: egc
+ version: 0.2.3+commit.8b37fa7a
+ settings:
+ turbo: true
+ sources:
+ - id: 1
+ path: "Escrow.eg"
+ language: examplelang
+ contents: |
+ import { Asset } from std::asset::fungible;
+
+ type State = !slots[
+ ready: bool,
+ complete: bool,
+
+ beneficiary: address,
+
+ asset: Asset,
+ amount: uint256,
+
+ canRemit: () -> bool,
+ ]
+
+ @create
+ func setup(
+ beneficiary: address,
+ asset: Asset,
+ canRemit: () -> bool,
+ ) -> State:
+ return {
+ ready = False,
+ complete = False,
+ beneficiary,
+ asset,
+ amount = 0,
+ canRemit,
+ }
+
+ @abi
+ @state(self: State)
+ @account(self)
+ func deposit(depositor: address, amount: uint256):
+ require(!self.ready)
+ require(!self.complete)
+
+ # expects an existing allowance (also known as "approval")
+ self.asset.transferFrom(depositor, self, amount)
+
+ self.amount = amount
+ self.ready = True
+
+ @abi
+ @state(self: State)
+ func remit():
+ require(self.ready)
+ require(!self.complete)
+
+ require(self.canRemit())
+
+ asset.transfer(self.beneficiary, self.amount)
+
+ self.complete = True
+
+ types:
+ # Define the State type structure
+ State:
+ kind: "struct"
+ contains:
+ - name: "ready"
+ type:
+ kind: "bool"
+ - name: "complete"
+ type:
+ kind: "bool"
+ - name: "beneficiary"
+ type:
+ kind: "address"
+ - name: "asset"
+ type:
+ kind: "struct"
+ contains:
+ - name: "address"
+ type:
+ kind: "address"
+ - name: "amount"
+ type:
+ kind: "uint"
+ bits: 256
+ - name: "canRemit"
+ type:
+ kind: "function"
+ internal: true
+ contains:
+ parameters:
+ type:
+ kind: "tuple"
+ contains: []
+ returns:
+ type:
+ kind: "bool"
+
+ pointers:
+ # Define storage layout for the State struct
+ State_storage:
+ expect: ["slot"]
+ for:
+ group:
+ - name: "ready"
+ location: "storage"
+ slot: "slot"
+ offset: 0
+ length: 1
+ - name: "complete"
+ location: "storage"
+ slot: "slot"
+ offset: 1
+ length: 1
+ - name: "beneficiary"
+ location: "storage"
+ slot: { "$sum": ["slot", 1] }
+ - name: "asset"
+ location: "storage"
+ slot: { "$sum": ["slot", 2] }
+ - name: "amount"
+ location: "storage"
+ slot: { "$sum": ["slot", 3] }
+ - name: "canRemit"
+ location: "storage"
+ slot: { "$sum": ["slot", 4] }
+
+ programs:
+ - contract:
+ name: "Escrow"
+ definition:
+ source:
+ id: 1
+ range:
+ offset: 0
+ length: 891
+ environment: "create"
+ instructions:
+ - offset: 0
+ operation:
+ mnemonic: "PUSH1"
+ arguments: ["0x80"]
+ context:
+ code:
+ source:
+ id: 1
+ range:
+ offset: 891
+ length: 20
+
diff --git a/schemas/info/resources.schema.yaml b/schemas/info/resources.schema.yaml
new file mode 100644
index 000000000..83f96ed65
--- /dev/null
+++ b/schemas/info/resources.schema.yaml
@@ -0,0 +1,75 @@
+$schema: "https://json-schema.org/draft/2020-12/schema"
+$id: "schema:ethdebug/format/info/resources"
+
+title: ethdebug/format/info/resources
+description: |
+ An object containing lookup tables for finding debugging resources by name.
+
+type: object
+
+properties:
+ types:
+ title: Types by name
+ description: |
+ A collection of types by name identifier.
+ type: object
+ additionalProperties:
+ $ref: "schema:ethdebug/format/type"
+
+ pointers:
+ title: Pointer templates by name
+ description: |
+ A collection of pointer templates by name identifier.
+ type: object
+ additionalProperties:
+ $ref: "schema:ethdebug/format/pointer/template"
+
+ compilation:
+ $ref: "schema:ethdebug/format/materials/compilation"
+
+
+required:
+ - types
+ - pointers
+
+examples:
+ - types:
+ "struct__Coordinate":
+ kind: struct
+ contains:
+ - name: x
+ type:
+ kind: uint
+ bits: 128
+ - name: y
+ type:
+ kind: uint
+ bits: 128
+ definition:
+ name: Coordinate
+ location:
+ source:
+ id: 5
+ range:
+ offset: 18
+ length: 55
+
+ pointers:
+ "struct__Coordinate__storage":
+ expect:
+ - contract_variable_slot__struct__Coordinate__storage
+ for:
+ group:
+ - name: member__x__struct__Coordinate__storage
+ location: storage
+ slot: contract_variable_slot__struct__Coordinate__storage
+ offset: 0
+ length: 128
+ - name: member__y__struct__Coordinate__storage
+ location: storage
+ slot: contract_variable_slot__struct__Coordinate__storage
+ offset:
+ $sum:
+ - .offset: member__x__struct__Coordinate__storage
+ - .length: member__x__struct__Coordinate__storage
+ length: 128
diff --git a/schemas/materials/compilation.schema.yaml b/schemas/materials/compilation.schema.yaml
index d685d83e3..cb9a4c977 100644
--- a/schemas/materials/compilation.schema.yaml
+++ b/schemas/materials/compilation.schema.yaml
@@ -11,7 +11,7 @@ properties:
description: |
Compilation ID. Optional, but **should** be specified.
- This value **should** be globally-unique and generated only from the
+ This value **must** be globally-unique and generated only from the
compiler inputs (settings, sources, etc.); the same compiler inputs/
settings **should** produce the same identifier.