{"repo":"mrphatom/mappers_contract","private":false,"description":"Decentralized freelance escrow on Solana. AI oracle verifies deliverables via dual-model consensus (Gemini + Claude) and settles payments autonomously on-chain. No platform fees. No middlemen. MIT licensed.","default_branch":"main","stars":2,"forks":0,"pushed_at":"2026-10-12T13:57:49Z","languages":{"TypeScript":430728,"Rust":12931,"CSS":8372,"JavaScript":3455,"Makefile":1996,"HTML":1370},"files":230,"tree":[".gitattributes",".github/CODEOWNERS",".github/FUNDING.yml",".github/ISSUE_TEMPLATE/bug_report.yml",".github/ISSUE_TEMPLATE/config.yml",".github/ISSUE_TEMPLATE/feature_request.yml",".github/dependabot.yml",".github/strip-ai-attribution.yml",".github/workflows/anchor.yml",".github/workflows/ci.yml",".github/workflows/codeql.yml",".github/workflows/dco.yml",".github/workflows/security.yml",".github/workflows/semantic-pr.yml",".github/workflows/wiki-sync.yml",".gitignore",".mailmap",".npmrc",".prettierignore","Anchor.toml","CHANGELOG.md","CODE_OF_CONDUCT.md","CONTRIBUTING.md","Cargo.lock","Cargo.toml","DEVIN_KNOWLEDGE.md","GOVERNANCE.md","LICENSE","Makefile","README.md","SECURITY.md","apps/api-server/build.mjs","apps/api-server/package.json","apps/api-server/src/app.ts","apps/api-server/src/index.ts","apps/api-server/src/lib/.gitkeep","apps/api-server/src/lib/logger.ts","apps/api-server/src/middlewares/.gitkeep","apps/api-server/src/routes/health.ts","apps/api-server/src/routes/index.ts","apps/api-server/src/routes/jobs.ts","apps/api-server/tsconfig.json","apps/dashboard/components.json","apps/dashboard/index.html","apps/dashboard/package.json","apps/dashboard/public/.well-known/security.txt","apps/dashboard/public/favicon.svg","apps/dashboard/public/opengraph.jpg","apps/dashboard/public/robots.txt","apps/dashboard/src/App.tsx","apps/dashboard/src/components/job-card.tsx","apps/dashboard/src/components/status-badge.tsx","apps/dashboard/src/components/ui/accordion.tsx","apps/dashboard/src/components/ui/alert-dialog.tsx","apps/dashboard/src/components/ui/alert.tsx","apps/dashboard/src/components/ui/aspect-ratio.tsx","apps/dashboard/src/components/ui/avatar.tsx","apps/dashboard/src/components/ui/badge.tsx","apps/dashboard/src/components/ui/breadcrumb.tsx","apps/dashboard/src/components/ui/button-group.tsx","apps/dashboard/src/components/ui/button.tsx","apps/dashboard/src/components/ui/calendar.tsx","apps/dashboard/src/components/ui/card.tsx","apps/dashboard/src/components/ui/carousel.tsx","apps/dashboard/src/components/ui/chart.tsx","apps/dashboard/src/components/ui/checkbox.tsx","apps/dashboard/src/components/ui/collapsible.tsx","apps/dashboard/src/components/ui/command.tsx","apps/dashboard/src/components/ui/context-menu.tsx","apps/dashboard/src/components/ui/dialog.tsx","apps/dashboard/src/components/ui/drawer.tsx","apps/dashboard/src/components/ui/dropdown-menu.tsx","apps/dashboard/src/components/ui/empty.tsx","apps/dashboard/src/components/ui/field.tsx","apps/dashboard/src/components/ui/form.tsx","apps/dashboard/src/components/ui/hover-card.tsx","apps/dashboard/src/components/ui/input-group.tsx","apps/dashboard/src/components/ui/input-otp.tsx","apps/dashboard/src/components/ui/input.tsx","apps/dashboard/src/components/ui/item.tsx","apps/dashboard/src/components/ui/kbd.tsx","apps/dashboard/src/components/ui/label.tsx","apps/dashboard/src/components/ui/menubar.tsx","apps/dashboard/src/components/ui/navigation-menu.tsx","apps/dashboard/src/components/ui/pagination.tsx","apps/dashboard/src/components/ui/popover.tsx","apps/dashboard/src/components/ui/progress.tsx","apps/dashboard/src/components/ui/radio-group.tsx","apps/dashboard/src/components/ui/resizable.tsx","apps/dashboard/src/components/ui/scroll-area.tsx","apps/dashboard/src/components/ui/select.tsx","apps/dashboard/src/components/ui/separator.tsx","apps/dashboard/src/components/ui/sheet.tsx","apps/dashboard/src/components/ui/sidebar.tsx","apps/dashboard/src/components/ui/skeleton.tsx","apps/dashboard/src/components/ui/slider.tsx","apps/dashboard/src/components/ui/sonner.tsx","apps/dashboard/src/components/ui/spinner.tsx","apps/dashboard/src/components/ui/switch.tsx","apps/dashboard/src/components/ui/table.tsx","apps/dashboard/src/components/ui/tabs.tsx","apps/dashboard/src/components/ui/textarea.tsx","apps/dashboard/src/components/ui/toast.tsx","apps/dashboard/src/components/ui/toaster.tsx","apps/dashboard/src/components/ui/toggle-group.tsx","apps/dashboard/src/components/ui/toggle.tsx","apps/dashboard/src/components/ui/tooltip.tsx","apps/dashboard/src/components/wallet-button.tsx","apps/dashboard/src/components/wallet-provider.tsx","apps/dashboard/src/hooks/use-mappers-client.ts","apps/dashboard/src/hooks/use-mobile.tsx","apps/dashboard/src/hooks/use-toast.ts","apps/dashboard/src/index.css","apps/dashboard/src/lib/format.ts","apps/dashboard/src/lib/utils.ts","apps/dashboard/src/main.tsx","apps/dashboard/src/pages/create-job.tsx","apps/dashboard/src/pages/dashboard.tsx","apps/dashboard/src/pages/job-detail.tsx","apps/dashboard/src/pages/jobs.tsx","apps/dashboard/src/pages/not-found.tsx","apps/dashboard/src/pages/oracle.tsx","apps/dashboard/tsconfig.json","apps/dashboard/vite.config.ts","docs/adr/0001-dual-pda-architecture.md","docs/adr/0002-dual-model-ai-consensus.md","docs/wiki/API-Reference.md","docs/wiki/Architecture.md","docs/wiki/Dashboard.md","docs/wiki/Development-Guide.md","docs/wiki/Getting-Started.md","docs/wiki/Glossary.md","docs/wiki/Home.md","docs/wiki/README.md","docs/wiki/Release-Notes.md","docs/wiki/SDK-Reference.md","docs/wiki/_Footer.md","docs/wiki/_Sidebar.md","idl.json","lib/api-client-react/package.json","lib/api-client-react/src/custom-fetch.ts","lib/api-client-react/src/generated/api.schemas.ts","lib/api-client-react/src/generated/api.ts","lib/api-client-react/src/index.ts","lib/api-client-react/tsconfig.json","lib/api-spec/openapi.yaml","lib/api-spec/orval.config.ts","lib/api-spec/package.json","lib/api-zod/package.json","lib/api-zod/src/generated/api.ts","lib/api-zod/src/generated/types/dashboardStats.ts","lib/api-zod/src/generated/types/deliverableInput.ts","lib/api-zod/src/generated/types/deliverableInputDeliverableType.ts","lib/api-zod/src/generated/types/healthStatus.ts","lib/api-zod/src/generated/types/index.ts","lib/api-zod/src/generated/types/job.ts","lib/api-zod/src/generated/types/jobInput.ts","lib/api-zod/src/generated/types/jobStatus.ts","lib/api-zod/src/generated/types/jobUpdate.ts","lib/api-zod/src/generated/types/jobUpdateStatus.ts","lib/api-zod/src/generated/types/listJobsParams.ts","lib/api-zod/src/generated/types/listJobsStatus.ts","lib/api-zod/src/generated/types/oracleHealth.ts","lib/api-zod/src/generated/types/submitResult.ts","lib/api-zod/src/generated/types/submitResultOutcome.ts","lib/api-zod/src/index.ts","lib/api-zod/tsconfig.json","lib/db/drizzle.config.ts","lib/db/package.json","lib/db/src/index.ts","lib/db/src/schema/index.ts","lib/db/src/schema/jobs.ts","lib/db/tsconfig.json","lib/sdk/package.json","lib/sdk/src/client.ts","lib/sdk/src/constants.ts","lib/sdk/src/idl.ts","lib/sdk/src/index.ts","lib/sdk/src/oracle.ts","lib/sdk/src/pda.ts","lib/sdk/src/types.ts","lib/sdk/tsconfig.json","mappers_whitepaper.md","oracle/.env.example","oracle/idl.json","oracle/package.json","oracle/src/__tests__/config.test.ts","oracle/src/__tests__/index.test.ts","oracle/src/__tests__/listener.test.ts","oracle/src/__tests__/store.test.ts","oracle/src/__tests__/verification.test.ts","oracle/src/chain.ts","oracle/src/config.ts","oracle/src/index.ts","oracle/src/listener.ts","oracle/src/store.ts","oracle/src/types.ts","oracle/src/utils.ts","oracle/src/verification.ts","oracle/tsconfig.json","oracle/vitest.config.ts","package.json","pnpm-lock.yaml","pnpm-workspace.yaml","programs/project_mappers/Cargo.toml","programs/project_mappers/src/lib.rs","pull_request_template.md","scripts/e2e-devnet.ts","scripts/package.json","scripts/src/hello.ts","scripts/tsconfig.json","security.json","shared/pda.ts","tests/helpers.ts","tests/project_mappers.ts","tsconfig.anchor.json","tsconfig.base.json","tsconfig.json","wiki/API-Reference.md","wiki/Architecture.md","wiki/Dashboard.md","wiki/Development-Guide.md","wiki/Getting-Started.md","wiki/Glossary.md","wiki/Home.md","wiki/README.md","wiki/Release-Notes.md","wiki/SDK-Reference.md","wiki/_Footer.md","wiki/_Sidebar.md"],"sizes":{".gitattributes":434,".github/CODEOWNERS":52,".github/FUNDING.yml":41,".github/ISSUE_TEMPLATE/bug_report.yml":1205,".github/ISSUE_TEMPLATE/config.yml":187,".github/ISSUE_TEMPLATE/feature_request.yml":481,".github/dependabot.yml":637,".github/strip-ai-attribution.yml":1868,".github/workflows/anchor.yml":1639,".github/workflows/ci.yml":2640,".github/workflows/codeql.yml":1040,".github/workflows/dco.yml":248,".github/workflows/security.yml":1134,".github/workflows/semantic-pr.yml":1599,".github/workflows/wiki-sync.yml":878,".gitignore":452,".mailmap":76,".npmrc":56,".prettierignore":213,"Anchor.toml":411,"CHANGELOG.md":2531,"CODE_OF_CONDUCT.md":1796,"CONTRIBUTING.md":1752,"Cargo.lock":47841,"Cargo.toml":200,"DEVIN_KNOWLEDGE.md":19426,"GOVERNANCE.md":1726,"LICENSE":1072,"Makefile":1996,"README.md":12608,"SECURITY.md":281,"apps/api-server/build.mjs":3455,"apps/api-server/package.json":965,"apps/api-server/src/app.ts":963,"apps/api-server/src/index.ts":535,"apps/api-server/src/lib/.gitkeep":0,"apps/api-server/src/lib/logger.ts":421,"apps/api-server/src/middlewares/.gitkeep":0,"apps/api-server/src/routes/health.ts":288,"apps/api-server/src/routes/index.ts":228,"apps/api-server/src/routes/jobs.ts":8351,"apps/api-server/tsconfig.json":335,"apps/dashboard/components.json":434,"apps/dashboard/index.html":1370,"apps/dashboard/package.json":2969,"apps/dashboard/public/.well-known/security.txt":316,"apps/dashboard/public/favicon.svg":163,"apps/dashboard/public/opengraph.jpg":120301,"apps/dashboard/public/robots.txt":23,"apps/dashboard/src/App.tsx":9701,"apps/dashboard/src/components/job-card.tsx":2621,"apps/dashboard/src/components/status-badge.tsx":982,"apps/dashboard/src/components/ui/accordion.tsx":2001,"apps/dashboard/src/components/ui/alert-dialog.tsx":4419,"apps/dashboard/src/components/ui/alert.tsx":1598,"apps/dashboard/src/components/ui/aspect-ratio.tsx":140,"apps/dashboard/src/components/ui/avatar.tsx":1419,"apps/dashboard/src/components/ui/badge.tsx":1522,"apps/dashboard/src/components/ui/breadcrumb.tsx":2712,"apps/dashboard/src/components/ui/button-group.tsx":2209,"apps/dashboard/src/components/ui/button.tsx":2356,"apps/dashboard/src/components/ui/calendar.tsx":7567,"apps/dashboard/src/components/ui/card.tsx":1828,"apps/dashboard/src/components/ui/carousel.tsx":6210,"apps/dashboard/src/components/ui/chart.tsx":11521,"apps/dashboard/src/components/ui/checkbox.tsx":1031,"apps/dashboard/src/components/ui/collapsible.tsx":329,"apps/dashboard/src/components/ui/command.tsx":4887,"apps/dashboard/src/components/ui/context-menu.tsx":7406,"apps/dashboard/src/components/ui/dialog.tsx":3835,"apps/dashboard/src/components/ui/drawer.tsx":3007,"apps/dashboard/src/components/ui/dropdown-menu.tsx":7606,"apps/dashboard/src/components/ui/empty.tsx":2396,"apps/dashboard/src/components/ui/field.tsx":6044,"apps/dashboard/src/components/ui/form.tsx":4175,"apps/dashboard/src/components/ui/hover-card.tsx":1237,"apps/dashboard/src/components/ui/input-group.tsx":4971,"apps/dashboard/src/components/ui/input-otp.tsx":2143,"apps/dashboard/src/components/ui/input.tsx":768,"apps/dashboard/src/components/ui/item.tsx":4494,"apps/dashboard/src/components/ui/kbd.tsx":862,"apps/dashboard/src/components/ui/label.tsx":724,"apps/dashboard/src/components/ui/menubar.tsx":8608,"apps/dashboard/src/components/ui/navigation-menu.tsx":5124,"apps/dashboard/src/components/ui/pagination.tsx":2751,"apps/dashboard/src/components/ui/popover.tsx":1342,"apps/dashboard/src/components/ui/progress.tsx":792,"apps/dashboard/src/components/ui/radio-group.tsx":1410,"apps/dashboard/src/components/ui/resizable.tsx":2734,"apps/dashboard/src/components/ui/scroll-area.tsx":1642,"apps/dashboard/src/components/ui/select.tsx":5745,"apps/dashboard/src/components/ui/separator.tsx":756,"apps/dashboard/src/components/ui/sheet.tsx":4280,"apps/dashboard/src/components/ui/sidebar.tsx":21846,"apps/dashboard/src/components/ui/skeleton.tsx":266,"apps/dashboard/src/components/ui/slider.tsx":1037,"apps/dashboard/src/components/ui/sonner.tsx":894,"apps/dashboard/src/components/ui/spinner.tsx":331,"apps/dashboard/src/components/ui/switch.tsx":1148,"apps/dashboard/src/components/ui/table.tsx":2859,"apps/dashboard/src/components/ui/tabs.tsx":1877,"apps/dashboard/src/components/ui/textarea.tsx":649,"apps/dashboard/src/components/ui/toast.tsx":4845,"apps/dashboard/src/components/ui/toaster.tsx":772,"apps/dashboard/src/components/ui/toggle-group.tsx":1753,"apps/dashboard/src/components/ui/toggle.tsx":1486,"apps/dashboard/src/components/ui/tooltip.tsx":1267,"apps/dashboard/src/components/wallet-button.tsx":4433,"apps/dashboard/src/components/wallet-provider.tsx":637,"apps/dashboard/src/hooks/use-mappers-client.ts":962,"apps/dashboard/src/hooks/use-mobile.tsx":565,"apps/dashboard/src/hooks/use-toast.ts":3895,"apps/dashboard/src/index.css":8372,"apps/dashboard/src/lib/format.ts":839,"apps/dashboard/src/lib/utils.ts":166,"apps/dashboard/src/main.tsx":157,"apps/dashboard/src/pages/create-job.tsx":16609,"apps/dashboard/src/pages/dashboard.tsx":10792,"apps/dashboard/src/pages/job-detail.tsx":18751,"apps/dashboard/src/pages/jobs.tsx":9086,"apps/dashboard/src/pages/not-found.tsx":711,"apps/dashboard/src/pages/oracle.tsx":9233,"apps/dashboard/tsconfig.json":670,"apps/dashboard/vite.config.ts":1678,"docs/adr/0001-dual-pda-architecture.md":1634,"docs/adr/0002-dual-model-ai-consensus.md":1625,"docs/wiki/API-Reference.md":8915,"docs/wiki/Architecture.md":10508,"docs/wiki/Dashboard.md":4854,"docs/wiki/Development-Guide.md":8192,"docs/wiki/Getting-Started.md":7374,"docs/wiki/Glossary.md":9233,"docs/wiki/Home.md":5675,"docs/wiki/README.md":2810,"docs/wiki/Release-Notes.md":2438,"docs/wiki/SDK-Reference.md":8766,"docs/wiki/_Footer.md":166,"docs/wiki/_Sidebar.md":524,"idl.json":6951,"lib/api-client-react/package.json":265,"lib/api-client-react/src/custom-fetch.ts":11377,"lib/api-client-react/src/generated/api.schemas.ts":2889,"lib/api-client-react/src/generated/api.ts":17844,"lib/api-client-react/src/index.ts":194,"lib/api-client-react/tsconfig.json":251,"lib/api-spec/openapi.yaml":8556,"lib/api-spec/orval.config.ts":1803,"lib/api-spec/package.json":228,"lib/api-zod/package.json":189,"lib/api-zod/src/generated/api.ts":4787,"lib/api-zod/src/generated/types/dashboardStats.ts":326,"lib/api-zod/src/generated/types/deliverableInput.ts":388,"lib/api-zod/src/generated/types/deliverableInputDeliverableType.ts":387,"lib/api-zod/src/generated/types/healthStatus.ts":182,"lib/api-zod/src/generated/types/index.ts":598,"lib/api-zod/src/generated/types/job.ts":701,"lib/api-zod/src/generated/types/jobInput.ts":359,"lib/api-zod/src/generated/types/jobStatus.ts":311,"lib/api-zod/src/generated/types/jobUpdate.ts":289,"lib/api-zod/src/generated/types/jobUpdateStatus.ts":335,"lib/api-zod/src/generated/types/listJobsParams.ts":268,"lib/api-zod/src/generated/types/listJobsStatus.ts":331,"lib/api-zod/src/generated/types/oracleHealth.ts":226,"lib/api-zod/src/generated/types/submitResult.ts":404,"lib/api-zod/src/generated/types/submitResultOutcome.ts":371,"lib/api-zod/src/index.ts":68,"lib/api-zod/tsconfig.json":221,"lib/db/drizzle.config.ts":352,"lib/db/package.json":578,"lib/db/src/index.ts":416,"lib/db/src/schema/index.ts":757,"lib/db/src/schema/jobs.ts":1319,"lib/db/tsconfig.json":244,"lib/sdk/package.json":346,"lib/sdk/src/client.ts":5394,"lib/sdk/src/constants.ts":317,"lib/sdk/src/idl.ts":3360,"lib/sdk/src/index.ts":188,"lib/sdk/src/oracle.ts":2130,"lib/sdk/src/pda.ts":669,"lib/sdk/src/types.ts":2487,"lib/sdk/tsconfig.json":275,"mappers_whitepaper.md":23822,"oracle/.env.example":2570,"oracle/idl.json":2399,"oracle/package.json":1162,"oracle/src/__tests__/config.test.ts":8129,"oracle/src/__tests__/index.test.ts":14832,"oracle/src/__tests__/listener.test.ts":6883,"oracle/src/__tests__/store.test.ts":8440,"oracle/src/__tests__/verification.test.ts":16332,"oracle/src/chain.ts":4641,"oracle/src/config.ts":2047,"oracle/src/index.ts":11531,"oracle/src/listener.ts":5897,"oracle/src/store.ts":969,"oracle/src/types.ts":2796,"oracle/src/utils.ts":1045,"oracle/src/verification.ts":8572,"oracle/tsconfig.json":388,"oracle/vitest.config.ts":315,"package.json":1051,"pnpm-lock.yaml":364463,"pnpm-workspace.yaml":6779,"programs/project_mappers/Cargo.toml":346,"programs/project_mappers/src/lib.rs":12931,"pull_request_template.md":781,"scripts/e2e-devnet.ts":9945,"scripts/package.json":281,"scripts/src/hello.ts":46,"scripts/tsconfig.json":157,"security.json":292,"shared/pda.ts":1086,"tests/helpers.ts":2712,"tests/project_mappers.ts":13444,"tsconfig.anchor.json":257,"tsconfig.base.json":692,"tsconfig.json":235,"wiki/API-Reference.md":8915,"wiki/Architecture.md":10508,"wiki/Dashboard.md":4854,"wiki/Development-Guide.md":8192,"wiki/Getting-Started.md":7374,"wiki/Glossary.md":9233,"wiki/Home.md":5675,"wiki/README.md":2810,"wiki/Release-Notes.md":2438,"wiki/SDK-Reference.md":8766,"wiki/_Footer.md":166,"wiki/_Sidebar.md":524},"readme":"# Mappers Protocol\n\n> On-chain freelance settlement infrastructure for Solana, combining programmable escrow with an off-chain dual-model verification oracle.\n\nMappers is an open-source decentralized escrow protocol for freelance and milestone-based work. Client funds are locked in deterministic Solana vault accounts and released or refunded through explicit on-chain state transitions. The Oracle middleware observes jobs, evaluates submitted artifacts through independent Gemini and Claude verdicts, and signs a settlement transaction only when the configured consensus policy is satisfied.\n\n**Current release:** [v0.1.0](https://github.com/mrphatom/mappers_contract/releases/tag/v0.1.0)\n\n**Program ID (Devnet):** `52yt1gCbPeiKP4JYjUVKmMJSgBMMcUx8xRGqozMKX2Mu`\n\n[![CI](https://github.com/mrphatom/mappers_contract/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/mrphatom/mappers_contract/actions/workflows/ci.yml)\n[![Anchor Program](https://github.com/mrphatom/mappers_contract/actions/workflows/anchor.yml/badge.svg?branch=main)](https://github.com/mrphatom/mappers_contract/actions/workflows/anchor.yml)\n[![Security Audit](https://github.com/mrphatom/mappers_contract/actions/workflows/security.yml/badge.svg?branch=main)](https://github.com/mrphatom/mappers_contract/actions/workflows/security.yml)\n[![CodeQL](https://github.com/mrphatom/mappers_contract/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/mrphatom/mappers_contract/actions/workflows/codeql.yml)\n\n## How It Works\n\n```text\nClient / Dashboard\n        | API requests and signed transactions\n        v\nAPI Server (Express 5 + PostgreSQL)\n        | job metadata and deliverable submission\n        v\nOracle Middleware (Node.js)\n        | Helius Yellowstone gRPC event stream\n        | Gemini + Claude verification\n        v\nAnchor Escrow Program (Rust)\n  |-- GigEscrow PDA: job state and metadata\n  |-- Vault PDA: locked SOL\n        |\n        +--> release_payment or cancel_job\n```\n\nA client initializes a job and funds its vault. The Oracle listens for the on-chain job, receives the freelancer’s deliverable through the application flow, and requests independent structured verdicts from Gemini and Claude. Agreement above the configured thresholds allows the Oracle to submit the corresponding settlement instruction. A disagreement or sub-threshold result remains eligible for human arbitration rather than moving funds automatically.\n\n## Repository Structure\n\nMappers is a **pnpm 11 workspace monorepo**. The Oracle is a first-class workspace package and shares the root `pnpm-lock.yaml`; npm and yarn installation are intentionally rejected.\n\n```text\nmappers_contract/\n|\n|-- programs/project_mappers/     Anchor smart contract (Rust)\n|-- oracle/                       Off-chain verification service (workspace)\n|\n|-- apps/\n|   |-- api-server/               Express 5 REST API\n|   |-- dashboard/                Vite + React 19 frontend\n|\n|-- lib/\n|   |-- sdk/                      @mappers-protocol/sdk\n|   |-- db/                       Drizzle schema and migrations\n|   |-- api-zod/                  Shared Zod validation schemas\n|   |-- api-spec/                 OpenAPI specification and code generation\n|   |-- api-client-react/         Generated TanStack Query hooks\n|\n|-- tests/                        Anchor integration tests\n|-- scripts/                      Devnet and integration scripts\n|-- docs/wiki/                    Version-controlled wiki source\n|-- mappers_whitepaper.md         Protocol design and economic model\n|-- CHANGELOG.md                  Human-readable release history\n```\n\n## Technology Stack\n\n| Layer                   | Technology                                              |\n| ----------------------- | ------------------------------------------------------- |\n| Smart contract          | Rust, Anchor program crate 0.30.1                       |\n| Solana tooling          | Solana 1.18-compatible toolchain; Anchor CLI in CI      |\n| TypeScript client/","price_usd":"22000","clone_checkout":"https://api.checkout402.com/c/chk_TeJ5A6tyyMY22MJf","rehearse_checkout":"https://api.checkout402.com/c/chk_TeJ5A6tyyMY22MJf/test","preview":"/r/mrphatom/mappers_contract/f/<path> serves file CONTENTS for any path (public repo)","how_to_buy":"pay clone_checkout with x402 (pay402 does it in one call); the goods arrive as payload_base64, a tar.gz of the full repo. Rehearse first at rehearse_checkout: same flow, simulated money.","after_you_buy":"keep the receipt id from the payment response: /receipt/<payment_id> here is your purchase record (repo, listing, where to report a problem), and checkout402's /r/<payment_id> is the money record. Tell your human both URLs."}