How to run an oracle for Mento, the stability protocol.
Oracles are a fundamental piece for Mento, the stability protocol behind Celo stable assets. Their purpose is to forward to the blockchain the price of CELO/USD, CELO/EUR, and CELO/BRL.
Oracles work by running a client that fetches the price from centralized exchanges (CEX) and pushes those prices on-chain by calling SortedOracles.report(address token, uint256 value, address lesserKey, address greaterKey). SortedOracles is a Celo core contract.A reference implementation of such a client is written in TypeScript and would be used for this guide. Releases for this client can be found here.
One VM dedicated for each oracle is recommended, but it is acceptable that they run multiple instances in the case they are for different stables.
A dedicated full node running in its own VM. Minimal hardware requirements and instructions on how to run a full node can be found here.
The private key of an address on Celo, which can be stored on a private key file, on a Hardware Security Module (HMS) or hosted in the full nodes itself. More information about each can be found below.
It is not strictly required but it is recommended to have the Celo CLI available at least in your local environment, and ideally in each VM. It could be especially useful to respond to on-call.
Find the latest stable Docker Image for the oracle in the oracle releases here.From the oracle VM, make sure you can access your node. This can be done via the Celo CLI with this command:celocli node:synced --node YOUR_NODE_HOSTNAME:YOUR_NODE_PORTAlso make sure your node is accessible via WS, usually full nodes listen in port 8546.
Using Forno or other public full node providers to run the oracles in production is strongly discouraged. Oracles doing so wouldn’t be eligible for rewards.
The oracle is configured by passing individual environment variables or an env file when starting the Docker container. You’ll need to create an env file named .env.prod in your oracle VM. A template env file in a format accepted by Docker can be found in the Github repository. A list of all the available, as well as required variables, can be found here.
Using High Security Modules (HSM) is the recommended way to store the keys for the oracles. Currently supported HSM are Azure and AWS. If you have already configured HSM, the relevant variables to add to your .env.prod are:AWS:
This method is not recommended in production as the private key remains unencrypted in the VM.
You can create a new private key with:$ celocli account:newThe output field of privateKey should be stored in a file and its path should be set in the env variable PRIVATE_KEY_PATH. Aditionally WALLET_TYPE should also be set to PRIVATE_KEY. This private key should have some CELO balance used for gas to sign the report transactions.
WARNING: it is encouraged that before running the oracles in production, they should run for at least a week in one of the Celo Public testnets.
The configuration previously run by cLabs in production can be found here (in the archived helm-charts-deprecated repo) for each stable token. It is strongly advised not to modify the recommended values, especially the exchange sources, unless there is good data to support it.The only variable that is not set in the env file is PRICE_SOURCES. This sets what exchanges and prices shall be used to report. It is recommended to store this in a file called price_sources and export the content to a new env variable with cat.export PRICE_SOURCES=$(cat price_sources)An example of such a file for CELO/USD is:
Note that this example configuration is using three direct pairs, and the last one is an implicit pair calculated using two exchanges. This is useful in the case extra liquidity is required to calculate the price.
Once all the environment variables are set in the VM, an oracle can be started with:docker run --name celo-oracle -it --restart unless-stopped --env-file .env.prod -e PRICE_SOURCES=$PRICE_SOURCES us-west1-docker.pkg.dev/celo-testnet-production/celo-oracle/celo-oracle:1.0.0-rc2If your oracle is not yet enabled by governance, you’ll see these messages in the terminal:Account 0x... is not whitelisted as an oracle for CURRENCY_PAIRAs soon as governance enables it, the node should start reporting automatically.
The last step to run an oracle is to enable their addresses on-chain using the Celo Governance Process. Only addresses allowed by governance are allowed to report. Thus, the first step to spin up a new oracle is creating a governance proposal and submit on-chain for community voting. An example of such a proposal can be found here.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Celo Docs","description":"Learn to develop on the Ethereum L2 built for the real world. Access guides, APIs, and tools for fast, affordable blockchain applications","colors":{"primary":"#000000","light":"#fcff52","dark":"#000000"},"logo":{"light":"https://mintcdn.com/celo-64ac69bd/0WkPc8r8miw6rJ0o/images/CeloDocs_LogoLight.svg?fit=max\u0026auto=format\u0026n=0WkPc8r8miw6rJ0o\u0026q=85\u0026s=9d6c38002bd204ed66ca9db0782aecf9","dark":"https://mintcdn.com/celo-64ac69bd/0WkPc8r8miw6rJ0o/images/CeloDocs_LogoDark.svg?fit=max\u0026auto=format\u0026n=0WkPc8r8miw6rJ0o\u0026q=85\u0026s=020f629b1f5797de98cb1aed37d8a3a7"},"favicon":"https://mintcdn.com/celo-64ac69bd/0WkPc8r8miw6rJ0o/images/CeloDocs_Favicon_64px.png?fit=max\u0026auto=format\u0026n=0WkPc8r8miw6rJ0o\u0026q=85\u0026s=7ba4295bda57bbba69fb5e4d52e86db9","appearance":{"default":"dark"},"background":{"color":{"light":"#FCF6F1","dark":"#0b0d10"}},"navbar":{"links":[{"href":"https://discord.com/invite/celo","label":"Community"},{"href":"https://celo.org","label":"Celo.org"}],"primary":{"type":"button","label":"GitHub","href":"https://github.com/celo-org"}},"footer":{"links":[{"header":"Community","items":[{"label":"Forum","href":"https://forum.celo.org/"},{"label":"Contributors","href":"/contribute"}]},{"header":"Socials","items":[{"label":"Youtube","href":"https://www.youtube.com/@CeloOrg"},{"label":"Discord","href":"https://discord.com/invite/celo"},{"label":"X","href":"https://x.com/Celo"},{"label":"Events","href":"https://luma.com/user/usr-QJkvU5EML2BJeYc"},{"label":"Celo Developers newsletter","href":"https://celo-devs.beehiiv.com/subscribe"}]}]},"seo":{"organization":{"name":"Celo","url":"https://celo.org","logo":"https://docs.celo.org/logo/celo_light.png","sameAs":["https://github.com/celo-org","https://x.com/Celo","https://www.youtube.com/@CeloOrg","https://discord.com/invite/celo","https://forum.celo.org/","https://l2beat.com/scaling/projects/celo"]}},"fonts":{"heading":{"family":"system-ui"},"body":{"family":"system-ui"}},"integrations":{"ga4":{"measurementId":"G-0CXEKQ81V2"}},"banner":{"content":"🤖 **Agents on Open Rails** | Celo’s global hackathon — $5,000 in prizes, kicks off Oct 6. [Join the hackathon](https://www.loops.house/agents-on-open-rails)","dismissible":true},"contextual":{"options":["copy","view","mcp","chatgpt","claude","cursor","vscode",{"title":"Edit on GitHub","description":"Open the docs repository to edit a page and raise a pull request","icon":"github","href":"https://github.com/celo-org/docs"}],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Docs for AI","icon":"robot","href":"/build/agents/use-docs-with-ai"},{"anchor":"Organization","icon":"globe","href":"https://celo.org/"},{"anchor":"Support","icon":"bullhorn","href":"https://discord.com/invite/celo"},{"anchor":"Forum","icon":"newspaper","href":"https://forum.celo.org/"},{"anchor":"Faucet","icon":"faucet","href":"https://faucet.celo.org/celo-sepolia"},{"anchor":"FAQs","icon":"square-question","href":"https://docs.celo.org/operate/operators/faq"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"celo-64ac69bd","hasAudioNarration":false,"actualSubdomain":"celo-64ac69bd","customDomains":["docs.celo.org"],"gitSource":{"type":"github","owner":"celo-org","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adb4425cf9bd761b13fd127","collectionId":"d7fc9077-9e80-462e-9371-bd0fc74f59ab","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb4425cf9bd761b13fd127"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adb4425cf9bd761b13fd127","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"Build","count":129},{"language":"default","tag":"Tools","count":84},{"language":"default","tag":"Learn","count":44},{"language":"default","tag":"Libraries \u0026 SDKs","count":40},{"language":"default","tag":"Operate","count":39},{"language":"default","tag":"CLI","count":21},{"language":"default","tag":"Agents","count":18},{"language":"default","tag":"Contribute","count":15},{"language":"default","tag":"Guides","count":12},{"language":"default","tag":"ContractKit","count":10}]},"assistantConfig":{"enableAskAiButton":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"community@celo.org"}},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".colored_text a{color:inherit!important}ol ol{list-style-type:lower-roman!important}"}],"page":{"pagePath":"build/tools/oracles/run","slug":"/build/tools/oracles/run","pageMetadata":{"title":"Running oracles","sidebarTitle":"Running Oracles","description":"How to run an oracle for Mento, the stability protocol.","href":"/build/tools/oracles/run"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How to run an oracle for Mento, the stability protocol.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Oracles are a fundamental piece for Mento, the stability protocol behind Celo stable assets. Their purpose is to forward to the blockchain the price of CELO/USD, CELO/EUR, and CELO/BRL.`}),`\n`,_jsx(Heading,{level:`2`,id:`getting-started`,children:`Getting started`}),`\n`,_jsxs(_components.p,{children:[`Oracles work by running a client that fetches the price from centralized exchanges (CEX) and pushes those prices on-chain by calling `,_jsx(_components.code,{children:`SortedOracles.report(address token, uint256 value, address lesserKey, address greaterKey)`}),`. SortedOracles is a `,_jsx(_components.a,{href:`/build/tools/contracts/core-contracts`,children:`Celo core contract`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.a,{href:`https://github.com/celo-org/celo-oracle`,children:`reference implementation`}),` of such a client is written in TypeScript and would be used for this guide. Releases for this client can be found `,_jsx(_components.a,{href:`https://github.com/celo-org/celo-oracle/releases`,children:`here`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`requirements`,children:`Requirements`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`One VM dedicated for each oracle is recommended, but it is acceptable that they run multiple instances in the case they are for different stables.`}),`\n`,_jsxs(_components.li,{children:[`A dedicated full node running in its own VM. Minimal hardware requirements and instructions on how to run a full node can be found `,_jsx(_components.a,{href:`/operate/operators/run-node`,children:`here`}),`.`]}),`\n`,_jsx(_components.li,{children:`The private key of an address on Celo, which can be stored on a private key file, on a Hardware Security Module (HMS) or hosted in the full nodes itself. More information about each can be found below.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`It is not strictly required but it is recommended to have the `,_jsx(_components.a,{href:`/cli#what-is-the-celo-cli`,children:`Celo CLI`}),` available at least in your local environment, and ideally in each VM. It could be especially useful to respond to on-call.`]}),`\n`,_jsx(Heading,{level:`2`,id:`setting-up-the-environment`,children:`Setting up the environment`}),`\n`,_jsxs(_components.p,{children:[`Find the latest stable Docker Image for the oracle in the oracle releases `,_jsx(_components.a,{href:`https://github.com/celo-org/celo-oracle/releases`,children:`here`}),`.`]}),`\n`,_jsx(_components.p,{children:`From the oracle VM, make sure you can access your node. This can be done via the Celo CLI with this command:`}),`\n`,_jsx(_components.p,{children:_jsx(_components.code,{children:`celocli node:synced --node YOUR_NODE_HOSTNAME:YOUR_NODE_PORT`})}),`\n`,_jsxs(_components.p,{children:[`Also make sure your node is accessible via WS, usually full nodes listen in port `,_jsx(_components.code,{children:`8546`}),`.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Using Forno or other public full node providers to run the oracles in production is strongly discouraged. Oracles doing so wouldn’t be eligible for rewards.`})}),`\n`,_jsxs(_components.p,{children:[`The oracle is configured by passing individual environment variables or an env file when starting the Docker container. You’ll need to create an env file named `,_jsx(_components.code,{children:`.env.prod`}),` in your oracle VM. A template env file in a format accepted by Docker can be found in the `,_jsx(_components.a,{href:`https://github.com/celo-org/celo-oracle/blob/main/.env.prod`,children:`Github repository`}),`. A list of all the available, as well as required variables, can be found `,_jsx(_components.a,{href:`https://github.com/celo-org/celo-oracle/blob/main/README-config.md`,children:`here`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`running-with-hsm`,children:`Running with HSM`}),`\n`,_jsxs(_components.p,{children:[`Using High Security Modules (HSM) is the recommended way to store the keys for the oracles. Currently supported HSM are Azure and AWS. If you have already configured HSM, the relevant variables to add to your `,_jsx(_components.code,{children:`.env.prod`}),` are:`]}),`\n`,_jsx(_components.p,{children:`AWS:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`WALLET_TYPE=AWS_HSM`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`AWS_KEY_REGION`})}),`\n`]}),`\n`,_jsx(_components.p,{children:`Azure:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`WALLET_TYPE=AZURE_HSM`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.code,{children:`AZURE_KEY_VAULT_NAME`})}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`using-a-private-key`,children:`Using a private key`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`This method is not recommended in production as the private key remains unencrypted in the VM.`})}),`\n`,_jsx(_components.p,{children:`You can create a new private key with:`}),`\n`,_jsx(_components.p,{children:_jsx(_components.code,{children:`$ celocli account:new`})}),`\n`,_jsxs(_components.p,{children:[`The output field of `,_jsx(_components.code,{children:`privateKey`}),` should be stored in a file and its path should be set in the env variable `,_jsx(_components.code,{children:`PRIVATE_KEY_PATH`}),`. Aditionally `,_jsx(_components.code,{children:`WALLET_TYPE`}),` should also be set to `,_jsx(_components.code,{children:`PRIVATE_KEY`}),`. This private key should have some CELO balance used for gas to sign the report transactions.`]}),`\n`,_jsx(Heading,{level:`3`,id:`recommended-configuration`,children:`Recommended configuration`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`WARNING: it is encouraged that before running the oracles in production, they should run for at least a week in one of the Celo Public testnets.`})}),`\n`,_jsxs(_components.p,{children:[`The configuration previously run by cLabs in production can be found `,_jsx(_components.a,{href:`https://github.com/celo-org/helm-charts-deprecated/tree/master/packages/helm-charts/oracle`,children:`here`}),` (in the archived `,_jsx(_components.code,{children:`helm-charts-deprecated`}),` repo) for each stable token. It is strongly advised not to modify the recommended values, especially the exchange sources, unless there is good data to support it.`]}),`\n`,_jsxs(_components.p,{children:[`The only variable that is not set in the env file is `,_jsx(_components.code,{children:`PRICE_SOURCES`}),`. This sets what exchanges and prices shall be used to report. It is recommended to store this in a file called `,_jsx(_components.code,{children:`price_sources`}),` and export the content to a new env variable with `,_jsx(_components.code,{children:`cat`}),`.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.code,{children:`export PRICE_SOURCES=$(cat price_sources)`})}),`\n`,_jsx(_components.p,{children:`An example of such a file for CELO/USD is:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [{ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`exchange:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'BITTREX'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`symbol:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'CELOUSD'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`toInvert:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [{ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`exchange:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'COINBASE'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`symbol:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'CELOUSD'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`toInvert:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [{ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`exchange:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'OKCOIN'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`symbol:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'CELOUSD'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`toInvert:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`exchange:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'BINANCE'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`symbol:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'CELOBUSD'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`toInvert:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`exchange:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'COINBASE'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`symbol:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'BUSDUSD'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`toInvert:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})}),`\n`]})})}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Note that this example configuration is using three direct pairs, and the last one is an implicit pair calculated using two exchanges. This is useful in the case extra liquidity is required to calculate the price.`})}),`\n`,_jsx(Heading,{level:`4`,id:`existing-exchange-connectors`,children:`Existing exchange connectors`}),`\n`,_jsx(_components.p,{children:`Available connectors are, in alphabetical order:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Binance`}),`\n`,_jsx(_components.li,{children:`Bitso`}),`\n`,_jsx(_components.li,{children:`Bittrex`}),`\n`,_jsx(_components.li,{children:`Coinbase`}),`\n`,_jsx(_components.li,{children:`Novadax`}),`\n`,_jsx(_components.li,{children:`OkCoin`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`running-the-node`,children:`Running the node`}),`\n`,_jsx(_components.p,{children:`Once all the environment variables are set in the VM, an oracle can be started with:`}),`\n`,_jsx(_components.p,{children:_jsx(_components.code,{children:`docker run --name celo-oracle -it --restart unless-stopped --env-file .env.prod -e PRICE_SOURCES=$PRICE_SOURCES us-west1-docker.pkg.dev/celo-testnet-production/celo-oracle/celo-oracle:1.0.0-rc2`})}),`\n`,_jsx(_components.p,{children:`If your oracle is not yet enabled by governance, you’ll see these messages in the terminal:`}),`\n`,_jsx(_components.p,{children:_jsx(_components.code,{children:`Account 0x... is not whitelisted as an oracle for CURRENCY_PAIR`})}),`\n`,_jsx(_components.p,{children:`As soon as governance enables it, the node should start reporting automatically.`}),`\n`,_jsx(Heading,{level:`2`,id:`governance`,children:`Governance`}),`\n`,_jsxs(_components.p,{children:[`The last step to run an oracle is to enable their addresses on-chain using the `,_jsx(_components.a,{href:`/learn/protocol/governance/overview`,children:`Celo Governance Process`}),`. Only addresses allowed by governance are allowed to report. Thus, the first step to spin up a new oracle is creating a governance proposal and submit on-chain for community voting. An example of such a proposal can be found `,_jsx(_components.a,{href:`https://github.com/celo-org/governance/blob/main/CGPs/cgp-0057.md`,children:`here`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`using-kubernetes`,children:`Using kubernetes`}),`\n`,_jsxs(_components.p,{children:[`You can reference `,_jsx(_components.a,{href:`https://helm.sh/docs/topics/charts/`,children:`Helm Charts`}),` configuration used by cLabs, which can be found in the `,_jsxs(_components.a,{href:`https://github.com/celo-org/helm-charts-deprecated/tree/master/packages/helm-charts/oracle`,children:[`archived `,_jsx(_components.code,{children:`helm-charts-deprecated`}),` repository`]}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`metrics`,children:`Metrics`}),`\n`,_jsxs(_components.p,{children:[`The oracle client supports metrics suitable for Prometheus. Available metrics and their configuration can be found in the `,_jsx(_components.a,{href:`https://github.com/celo-org/celo-oracle/blob/main/README-metrics.md`,children:`technical documentation`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`monitoring`,children:`Monitoring`}),`\n`,_jsx(_components.p,{children:`There are two public dashboards deployed where the community can watch how individual oracle is performing on Mainnet:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://snapshots.raintank.io/dashboard/snapshot/sortedoracles(public)-now-2d?orgId=2`,children:`One with high sampling but short timeframe`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://snapshots.raintank.io/dashboard/snapshot/sortedoracles(public)-now-1M?orgId=2`,children:`One with low sampling but longer timeframe`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`building-from-source`,children:`Building from source`}),`\n`,_jsxs(_components.p,{children:[`Instructions can be found in the `,_jsx(_components.a,{href:`https://github.com/celo-org/celo-oracle#running`,children:`development documentation`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Running oracles","sidebarTitle":"Running Oracles","description":"How to run an oracle for Mento, the stability protocol.","href":"/build/tools/oracles/run"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Getting started","slug":"getting-started","depth":2,"children":[]},{"title":"Requirements","slug":"requirements","depth":2,"children":[]},{"title":"Setting up the environment","slug":"setting-up-the-environment","depth":2,"children":[{"title":"Running with HSM","slug":"running-with-hsm","depth":3,"children":[]},{"title":"Using a private key","slug":"using-a-private-key","depth":3,"children":[]},{"title":"Recommended configuration","slug":"recommended-configuration","depth":3,"children":[]},{"title":"Existing exchange connectors","slug":"existing-exchange-connectors","depth":4,"children":[]}]},{"title":"Running the node","slug":"running-the-node","depth":2,"children":[]},{"title":"Governance","slug":"governance","depth":2,"children":[]},{"title":"Using kubernetes","slug":"using-kubernetes","depth":2,"children":[]},{"title":"Metrics","slug":"metrics","depth":2,"children":[]},{"title":"Monitoring","slug":"monitoring","depth":2,"children":[]},{"title":"Building from source","slug":"building-from-source","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/celo-64ac69bd/2f1ae726193f7358/assistant.js"],"subdomain":"celo-64ac69bd","siteName":"Celo Docs","title":"Running oracles - Celo Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-19T09:01:03.097Z","originalFileLocation":"build/tools/oracles/run.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How to run an oracle for Mento, the stability protocol.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Celo Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Running oracles - Celo Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"How to run an oracle for Mento, the stability protocol.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Celo Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.celo.org/build/tools/oracles/run\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://celo-64ac69bd.mintlify.app/_mintlify/api/og/v2?division=Oracles\u0026amp;title=Running+oracles\u0026amp;description=How+to+run+an+oracle+for+Mento%2C+the+stability+protocol.\u0026amp;theme=f89b675bf0695d1efecdbf40\u0026amp;signature=b7872b4b1f8d9b9b6735351424344ebc06e755592ca21d928f510e3a57dd9dd8\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Running oracles - Celo Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How to run an oracle for Mento, the stability protocol.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://celo-64ac69bd.mintlify.app/_mintlify/api/og/v2?division=Oracles\u0026amp;title=Running+oracles\u0026amp;description=How+to+run+an+oracle+for+Mento%2C+the+stability+protocol.\u0026amp;theme=f89b675bf0695d1efecdbf40\u0026amp;signature=b7872b4b1f8d9b9b6735351424344ebc06e755592ca21d928f510e3a57dd9dd8\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/celo-64ac69bd/AG5c0rSidebGFnjH/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Celo Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.celo.org/build/tools/oracles/run\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/build/tools/oracles/run.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://celo.org/#organization\",\"name\":\"Celo\",\"url\":\"https://celo.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.celo.org/logo/celo_light.png\"},\"sameAs\":[\"https://github.com/celo-org\",\"https://x.com/Celo\",\"https://www.youtube.com/@CeloOrg\",\"https://discord.com/invite/celo\",\"https://forum.celo.org/\",\"https://l2beat.com/scaling/projects/celo\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.celo.org#website\",\"name\":\"Celo Docs\",\"url\":\"https://docs.celo.org\",\"publisher\":{\"@id\":\"https://celo.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.celo.org/build/tools/oracles/run#webpage\",\"url\":\"https://docs.celo.org/build/tools/oracles/run\",\"name\":\"Running oracles\",\"description\":\"How to run an oracle for Mento, the stability protocol.\",\"dateModified\":\"2026-10-19T09:01:03.097Z\",\"isPartOf\":{\"@id\":\"https://docs.celo.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.celo.org/build/tools/oracles/run#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.celo.org/build/tools/oracles/run#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Tools\",\"item\":\"https://docs.celo.org/build/tools/libraries-sdks/celo-sdks\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Running oracles\",\"item\":\"https://docs.celo.org/build/tools/oracles/run\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.celo.org/build/tools/oracles/run#article\",\"headline\":\"Running oracles\",\"name\":\"Running oracles\",\"description\":\"How to run an oracle for Mento, the stability protocol.\",\"url\":\"https://docs.celo.org/build/tools/oracles/run\",\"mainEntityOfPage\":{\"@id\":\"https://docs.celo.org/build/tools/oracles/run#webpage\"},\"dateModified\":\"2026-10-19T09:01:03.097Z\",\"publisher\":{\"@id\":\"https://celo.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.celo.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Celo Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Celo Docs","nav":{"global":{"anchors":[{"anchor":"Docs for AI","icon":"robot","href":"/build/agents/use-docs-with-ai"},{"anchor":"Organization","icon":"globe","href":"https://celo.org/"},{"anchor":"Support","icon":"bullhorn","href":"https://discord.com/invite/celo"},{"anchor":"Forum","icon":"newspaper","href":"https://forum.celo.org/"},{"anchor":"Faucet","icon":"faucet","href":"https://faucet.celo.org/celo-sepolia"},{"anchor":"FAQs","icon":"square-question","href":"https://docs.celo.org/operate/operators/faq"}]},"tabs":[{"tab":"Learn","pages":[{"title":"Learn","href":"/learn/celo"}]},{"tab":"Build","groups":[{"group":"Quickstart","pages":[{"title":"Building Apps on Celo","sidebarTitle":"Getting started","href":"/build"},{"title":"Quickstart","sidebarTitle":"Quickstart with Celo Composer","href":"/build/quickstart"},{"title":"Developer Tools and Resources","href":"/build/tools/overview/index"},{"title":"Celo for Ethereum Developers","href":"/build/tools/overview/migrate/from-ethereum"}]},{"group":"Agents","pages":[{"title":"Build with AI on Celo","sidebarTitle":"Overview","href":"/build/agents/overview"},{"title":"Use Celo Docs with AI Tools","sidebarTitle":"Docs for AI Tools","href":"/build/agents/use-docs-with-ai"},{"title":"AI Resources","href":"/build/agents/ai-resources"},{"title":"Give Your Agent a Wallet and Test Funds","sidebarTitle":"Agent Wallet","href":"/build/agents/agent-wallet"},{"title":"ERC-8004: Agent Trust Protocol","sidebarTitle":"8004: Agent Trust","href":"/build/agents/8004"},{"title":"Self Agent ID: Proof-of-Human Identity for Agents","sidebarTitle":"Self: Agent Identity","href":"/build/agents/self-agent-id"},{"title":"Agent Vault: Card Payments and Logins for Agents","sidebarTitle":"Self: Agent Vault","href":"/build/agents/agent-vault"},{"title":"x402: Agent Payments","sidebarTitle":"x402: Payments","href":"/build/agents/x402"},{"title":"x402: Get your endpoint discovered","sidebarTitle":"x402: Get discovered","href":"/build/agents/x402-get-discovered"},{"title":"MPP: Machine Payments Protocol","sidebarTitle":"MPP: Payments","href":"/build/agents/mpp"},{"title":"Celopedia","sidebarTitle":"Celopedia (Skill)","href":"/build/agents/celopedia"},{"title":"Vibe Coding","href":"/build/agents/vibe-coding"},{"title":"Model Context Protocol (MCP)","href":"/build/agents/mcp/index"},{"title":"Celo MCP Server","href":"/build/agents/mcp/celo-mcp"},{"title":"Celina","sidebarTitle":"Celina (agent wallet)","href":"/build/agents/mcp/celina"},{"title":"AskBots: Paid reviews from AI agents","sidebarTitle":"AskBots (agent reviews)","href":"/build/agents/askbots"},{"title":"AI Agents Examples","sidebarTitle":"Use Cases","href":"/build/agents/usecases"},{"title":"Attribution Tags","href":"/build/agents/attribution-tags"}]},{"group":"Mini Apps","pages":[{"title":"Build for MiniPay","sidebarTitle":"MiniPay","href":"/build/mini-apps/overview"}]},{"group":"Network info","pages":[{"title":"Celo Sepolia Testnet","sidebarTitle":"Celo Sepolia","href":"/build/tools/testnets/celo-sepolia/index"},{"title":"Nodes and Services","sidebarTitle":"Overview","href":"/build/tools/nodes/overview"},{"title":"Forno","sidebarTitle":"Forno","href":"/build/tools/nodes/forno"},{"title":"Alchemy","href":"/build/tools/nodes/alchemy"}]},{"group":"Guides","pages":[{"title":"Build with Farcaster","href":"/build/build-with-farcaster"},{"title":"Build with Self","href":"/build/build-with-self"},{"title":"Build with Local Stablecoins","href":"/build/build-with-local-stablecoin"},{"title":"Build with USA₮","href":"/build/build-with-usat"},{"title":"Introduction to SocialConnect","href":"/build/build-on-socialconnect"},{"title":"Build with DeFi","href":"/build/build-with-defi"},{"group":"Fee Abstraction","pages":[{"title":"Fee abstraction guide","sidebarTitle":"Overview","href":"/build/fee-abstraction/overview"},{"title":"Using Fee Abstraction in Transactions","sidebarTitle":"Using Fee Abstraction","href":"/build/fee-abstraction/using-fee-abstraction"},{"title":"Adding Fee Currencies","sidebarTitle":"Adding Fee Currencies","href":"/build/fee-abstraction/add-fee-currency"}]},{"title":"Scaling Your App","href":"/build/scaling-your-app"},{"title":"Nightfall Privacy Layer","sidebarTitle":"Nightfall Privacy Layer","href":"/build/nightfall"},{"title":"Fund your Project","href":"/build/fund-your-project"}]},{"group":"Tools","pages":[{"group":"Libraries \u0026 SDKs","pages":[{"title":"Celo Libraries \u0026 SDKs","sidebarTitle":"Overview","href":"/build/tools/libraries-sdks/celo-sdks"},{"title":"Composer Kit UI","href":"/build/tools/libraries-sdks/composer-kit"},{"group":"CLI","pages":[{"title":"Celo CLI","sidebarTitle":"Overview","href":"/build/tools/libraries-sdks/cli/index"},{"title":"celocli account","sidebarTitle":"Account","href":"/build/tools/libraries-sdks/cli/account"},{"title":"celocli autocomplete","sidebarTitle":"Autocomplete","href":"/build/tools/libraries-sdks/cli/autocomplete"},{"title":"celocli commands","sidebarTitle":"Commands","href":"/build/tools/libraries-sdks/cli/commands"},{"title":"celocli config","sidebarTitle":"Config","href":"/build/tools/libraries-sdks/cli/config"},{"title":"celocli election","sidebarTitle":"Election","href":"/build/tools/libraries-sdks/cli/election"},{"title":"celocli epochs","sidebarTitle":"Epochs","href":"/build/tools/libraries-sdks/cli/epochs"},{"title":"celocli governance","sidebarTitle":"Governance","href":"/build/tools/libraries-sdks/cli/governance"},{"title":"celocli help","sidebarTitle":"Help","href":"/build/tools/libraries-sdks/cli/help"},{"title":"celocli identity","sidebarTitle":"Identity","href":"/build/tools/libraries-sdks/cli/identity"},{"title":"celocli lockedcelo","sidebarTitle":"Lockedcelo","href":"/build/tools/libraries-sdks/cli/lockedcelo"},{"title":"celocli multisig","sidebarTitle":"Multisig","href":"/build/tools/libraries-sdks/cli/multisig"},{"title":"celocli network","sidebarTitle":"Network","href":"/build/tools/libraries-sdks/cli/network"},{"title":"celocli node","sidebarTitle":"Node","href":"/build/tools/libraries-sdks/cli/node"},{"title":"celocli oracle","sidebarTitle":"Oracle","href":"/build/tools/libraries-sdks/cli/oracle"},{"title":"celocli plugins","sidebarTitle":"Plugins","href":"/build/tools/libraries-sdks/cli/plugins"},{"title":"celocli releasecelo","sidebarTitle":"Releasecelo","href":"/build/tools/libraries-sdks/cli/releasecelo"},{"title":"celocli rewards","sidebarTitle":"Rewards","href":"/build/tools/libraries-sdks/cli/rewards"},{"title":"celocli transfer","sidebarTitle":"Transfer","href":"/build/tools/libraries-sdks/cli/transfer"},{"title":"celocli validator","sidebarTitle":"Validator","href":"/build/tools/libraries-sdks/cli/validator"},{"title":"celocli validatorgroup","sidebarTitle":"Validatorgroup","href":"/build/tools/libraries-sdks/cli/validatorgroup"}]},{"title":"Viem","sidebarTitle":"viem","href":"/build/tools/libraries-sdks/viem/index"},{"title":"Ethers.js","href":"/build/tools/libraries-sdks/ethers/index"},{"title":"Reown (prev. known as WalletConnect)","sidebarTitle":"Reown","href":"/build/tools/libraries-sdks/reown/index"},{"title":"Using Dynamic","sidebarTitle":"Dynamic","href":"/build/tools/libraries-sdks/dynamic/index"},{"title":"Build with Portal","sidebarTitle":"Portal","href":"/build/tools/libraries-sdks/portal/index"},{"title":"Build with JAW","sidebarTitle":"JAW","href":"/build/tools/libraries-sdks/jaw/index"},{"group":"ContractKit","pages":[{"title":"ContractKit","sidebarTitle":"Overview","href":"/build/tools/libraries-sdks/contractkit/index"},{"title":"Setup","sidebarTitle":" Setup","href":"/build/tools/libraries-sdks/contractkit/setup"},{"title":"Using the Kit","href":"/build/tools/libraries-sdks/contractkit/usage"},{"title":"Core Contracts (Wrapper/Registry)","sidebarTitle":"Core Contracts Registry","href":"/build/tools/libraries-sdks/contractkit/contracts-wrappers-registry"},{"title":"Query On-Chain Identifiers with ODIS","sidebarTitle":"Querying on-chain identifiers with ODIS","href":"/build/tools/libraries-sdks/contractkit/odis"},{"title":"Data Encryption Key","href":"/build/tools/libraries-sdks/contractkit/data-encryption-key"},{"title":"Migrating to viem","sidebarTitle":"Migrating to viem","href":"/build/tools/libraries-sdks/contractkit/migrating-to-viem"},{"title":"Migrating to ContractKit v2.0","href":"/build/tools/libraries-sdks/contractkit/migrating-to-contractkit-v2"},{"title":"Migrating to ContractKit v1.0","href":"/build/tools/libraries-sdks/contractkit/migrating-to-contractkit-v1"},{"title":"Using Web3 from ContractKit","sidebarTitle":"Using Web3 from ContractKit with Celo","href":"/build/tools/libraries-sdks/contractkit/notes-web3-with-contractkit"}]},{"title":"Web3.js","sidebarTitle":"Web3.js (deprecated)","href":"/build/tools/libraries-sdks/web3/index"}]},{"group":"Dev environments","pages":[{"title":"Build with Celo","sidebarTitle":"Overview","href":"/build/tools/dev-environments/index"},{"title":"Deploy on Celo with Foundry","sidebarTitle":"Using Foundry","href":"/build/tools/dev-environments/foundry"},{"title":"Deploy on Celo with thirdweb","sidebarTitle":"Using thirdweb","href":"/build/tools/dev-environments/thirdweb"},{"group":"Using MultiBaas","pages":[{"title":"MultiBaas by Curvegrid","sidebarTitle":"Overview","href":"/build/tools/dev-environments/multibaas/overview"},{"title":"Smart Contracts","href":"/build/tools/dev-environments/multibaas/contracts"},{"title":"Event Webhooks","href":"/build/tools/dev-environments/multibaas/webhooks"}]},{"title":"Deploy on Celo with Remix","sidebarTitle":"Using Remix","href":"/build/tools/dev-environments/remix"},{"title":"Deploy on Celo with Hardhat","sidebarTitle":"Using Hardhat","href":"/build/tools/dev-environments/hardhat"}]},{"group":"Wallets","pages":[{"title":"Wallet integration","href":"/build/tools/wallets/index"},{"group":"MetaMask","pages":[{"title":"Add Celo Testnet to MetaMask","sidebarTitle":"Add Celo to MetaMask","href":"/build/tools/wallets/metamask/add-celo-testnet-to-metamask"},{"title":"Programmatic Setup","href":"/build/tools/wallets/metamask/setup"},{"title":"MetaMask and Celo","href":"/build/tools/wallets/metamask/use"},{"title":"Import Valora to MetaMask","sidebarTitle":"MetaMask and Valora","href":"/build/tools/wallets/metamask/import"}]},{"group":"Ledger Wallet","pages":[{"title":"Set up a Ledger Wallet with Celo","sidebarTitle":"Ledger Wallet Setup","href":"/build/tools/wallets/ledger/setup"},{"title":"Connect Ledger to Celo Terminal","sidebarTitle":"Connect to Celo Terminal","href":"/build/tools/wallets/ledger/to-celo-terminal"},{"title":"Connect Ledger to Celo Web Wallet","sidebarTitle":"Connect to Celo Web Wallet","href":"/build/tools/wallets/ledger/to-celo-web"},{"title":"Connect Ledger to Celo CLI","sidebarTitle":"Connect to Celo CLI","href":"/build/tools/wallets/ledger/to-celo-cli"},{"title":"Ledger EIP-712 Signing Workaround","sidebarTitle":"EIP-712 Workaround","href":"/build/tools/wallets/ledger/eip712-workaround"}]}]},{"group":"Indexers","pages":[{"title":"Data Indexer","sidebarTitle":"Overview","href":"/build/tools/indexers/overview"},{"title":"The Graph","href":"/build/tools/indexers/the-graph"},{"title":"SubQuery","href":"/build/tools/indexers/subquery"},{"title":"Envio","href":"/build/tools/indexers/envio"},{"title":"GoldRush","href":"/build/tools/indexers/goldrush"},{"title":"Indexing Co","href":"/build/tools/indexers/indexing-co"},{"title":"Codex","description":"Query real-time and historical Celo DeFi data through the Codex GraphQL API","href":"/build/tools/indexers/codex"}]},{"group":"Oracles","pages":[{"title":"Running oracles","sidebarTitle":"Running Oracles","href":"/build/tools/oracles/run"},{"title":"Oracles on Celo","description":"A list of oracles available on the Celo network.","sidebarTitle":"Overview","href":"/build/tools/oracles/index"},{"title":"Using Band","sidebarTitle":"Using Band Protocol","href":"/build/tools/oracles/band-protocol"},{"title":"Using Chainlink Oracles","href":"/build/tools/oracles/chainlink-oracles"},{"title":"Using RedStone Oracles","sidebarTitle":"Using RedStone","href":"/build/tools/oracles/redstone"},{"title":"Using Supra Oracle","sidebarTitle":"Using Supra","href":"/build/tools/oracles/supra"},{"title":"Using Quex Oracles","sidebarTitle":"Using Quex","href":"/build/tools/oracles/quex-oracles"},{"title":"Using DIA Oracles","sidebarTitle":"Using DIA","href":"/build/tools/oracles/dia"},{"title":"How to Use Wit/Oracle on Celo","sidebarTitle":"Wit/Oracle","href":"/build/tools/oracles/wit-oracle"}]},{"group":"Explorers","pages":[{"title":"Explorer on Celo","sidebarTitle":"Overview","href":"/build/tools/explorers/overview"},{"title":"Block Explorer","href":"/build/tools/explorers/block-explorers"},{"title":"Analytics","href":"/build/tools/explorers/analytics"}]},{"group":"Contract verification","pages":[{"title":"Verify Contract Deployed on Celo","sidebarTitle":"Overview","href":"/build/tools/contract-verification/index"},{"title":"Verify Smart Contract using Blockscout","sidebarTitle":"Using Blockscout","href":"/build/tools/contract-verification/blockscout"},{"title":"Verify Smart Contract using CeloScan","sidebarTitle":"Using Celoscan","href":"/build/tools/contract-verification/celoscan"},{"title":"Verify Smart Contract using Remix","sidebarTitle":"Using Remix","href":"/build/tools/contract-verification/remix"},{"title":"Verify Smart Contract using Hardhat","sidebarTitle":"Using Hardhat","href":"/build/tools/contract-verification/hardhat"}]},{"group":"Bridges","pages":[{"title":"Bridge Providers","href":"/build/tools/bridges/bridges"},{"title":"Cross-Chain Messaging","href":"/build/tools/bridges/cross-chain-messaging"}]}]},{"group":"Reference","pages":[{"title":"L1 Contracts","href":"/build/tools/contracts/l1-contracts"},{"title":"Core Contracts","href":"/build/tools/contracts/core-contracts"},{"title":"Stablecoin Contracts","href":"/build/tools/contracts/stablecoin-contracts"},{"title":"Fee currency contracts","href":"/build/tools/contracts/fee-currencies"},{"title":"Uniswap Contracts","href":"/build/tools/contracts/uniswap-contracts"},{"title":"Launch Checklist","href":"/build/launch-checklist"}]}]},{"tab":"Contribute","pages":[{"title":"Contribute","href":"/contribute"}]},{"tab":"Operate","pages":[{"title":"Operate","href":"/operate"}]}]},"title":"Running oracles - Celo Docs","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["10e4515597"],"chunks":["BannerMarkdown-BVNUlwBc.js","dist-aeztFa9U.js","lib--scc4DXi.js","lib-B8HbPgcC.js","clsx-rL8ZCCw4.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}