{"id":13803351,"url":"https://github.com/proofxyz/solidify","last_synced_at":"2026-01-16T22:42:02.237Z","repository":{"id":63649773,"uuid":"569350029","full_name":"proofxyz/solidify","owner":"proofxyz","description":null,"archived":false,"fork":false,"pushed_at":"2023-08-17T12:49:28.000Z","size":2042,"stargazers_count":125,"open_issues_count":3,"forks_count":11,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-05-13T15:43:52.516Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/proofxyz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-22T16:17:47.000Z","updated_at":"2024-12-24T01:58:15.000Z","dependencies_parsed_at":"2024-06-18T21:33:06.392Z","dependency_job_id":"84c614ce-1813-44d5-9be3-b65e3ce1a037","html_url":"https://github.com/proofxyz/solidify","commit_stats":{"total_commits":5,"total_committers":1,"mean_commits":5.0,"dds":0.0,"last_synced_commit":"623e2295bd6881fec269b518c5514032e58fa937"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/proofxyz/solidify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proofxyz%2Fsolidify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proofxyz%2Fsolidify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proofxyz%2Fsolidify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proofxyz%2Fsolidify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/proofxyz","download_url":"https://codeload.github.com/proofxyz/solidify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/proofxyz%2Fsolidify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28485683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T01:00:29.831Z","updated_at":"2026-01-16T22:42:02.209Z","avatar_url":"https://github.com/proofxyz.png","language":"Go","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"solidify logo\" src=\"logo.png\" height=\"150\" /\u003e\n  \u003ch1 align=\"center\"\u003eSolidify\u003c/h3\u003e\n\u003c/p\u003e\n\n---\n![Test Status](https://github.com/proofxyz/solidify/workflows/test/badge.svg)\n[![License](https://img.shields.io/github/license/proofxyz/solidify)](/LICENSE)\n\n`solidify` is a golang + solidity library aimed to make storing arbitrary data on EVM blockchains as easy and efficient as possible.\n\n\u003e But remember: *With great power comes great responsibility*.  \nThis library is not intended to turn the Ethereum blockchain into a general data storage.\nInstead, it strives to improve the situation by making it as efficient as possible and empower projects where on-chain data is mission critical. \n\n\n## Getting started\n\n### Dependencies\n\nThis project uses golang generics.\nMake sure you have `go \u003e 1.18` installed on your machine.\nSee [here](https://go.dev/doc/install) for more info.\n\nFor smart-contract testing we use [Forge](https://book.getfoundry.sh/).\nInstall it following the instructions [here](https://book.getfoundry.sh/getting-started/installation) or simply run\n\n```bash\ncurl -L https://foundry.paradigm.xyz | bash\nfoundryup\n```\n\n### Running tests\n\nTo see if your installation was successful run the project's tests via\n\n```bash\ngo generate ./...\ngo test ./...\nforge test\n```\n\n## Documentation\n\nThe library consists of a golang (`./go`) and a solidity (`./contracts`) part.\nThe former is intended to generate contracts containing data which can then be accessed on-chain using the latter.\n\n### General concept\n\nThere are three central concepts that are used frequently throughout this library to build up a storage pattern: `Field`, `Bucket` and `BucketStorage`.\n\n- `Field` is any generic object that can be serialised into a binary blob. For example, this could be a subimage frame that can be serialised into a raw (A)RGB stream with frame location metadata.  \n- `Bucket` is used to assemble multiple `Field`s and compress them. `Bucket`s futher add access information to the  assembled blob data to facilitate `Field` access. For example, this could consist of adding a index header to the joint blob to mark at which offset each field starts.  \n- `BucketStorage` is a list of `Bucket`s that will be turned into a smart-contract. \n\n\n```mermaid\nflowchart LR \n\nsubgraph Compression\nField1 \u0026 Field2 \u0026 ... --\u003e Bucket\nend\n\n\nBucket --\u003e Bucket1\n\nsubgraph Contract\n    Bucket1 \u0026 Bucket2 --\u003e BucketStorage\n    .. --\u003e BucketStorage\nend\n\nsubgraph Bundle\n    BucketStorage --\u003e BucketStorage1\n    BucketStorage2\nend\n```\n\n### Bucket flavours\n\nThe library comes with two already implemented types of buckets under `go/utils`: `IndexedBucket` and `LabelledBucket`.\n\n`IndexedBucket` prepends a field offset header to the concatenated field blobs that stores the index at which each field starts.\nFields in such buckets can be accessed using the `contracts/IndexedBucketLib.sol` library.\n\n`LabelledBucket` prepends a field label to each fixed-sized field data blob.\nThe field data can then be accessed using a binary search over sorted labels implemented in the `contracts/LabelledBucketLib.sol` library.\n\nThe contract writing routines in `go/storage` are agnostic of the exact Bucket implementation.\nSo the user is free to implement their own Buckets, i.e. index schemes as needed.\n\n### Examples\n\nTo get more familiar with the library we encourage the reader to take a look at the tests under `/test/**/testgen` and how we applied it to put [Moonbirds](https://moonbirds.xyz) in-chain under `examples/moonbirds`. ","funding_links":[],"categories":["Templates \u0026 Libraries"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproofxyz%2Fsolidify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fproofxyz%2Fsolidify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fproofxyz%2Fsolidify/lists"}