Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# soldeer dependencies
dependencies/

node_modules/

# forge cache
cache/
out/
Expand Down
26 changes: 26 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"overrides": [
{
"files": "*.sol",
"options": {
"printWidth": 120,
"tabWidth": 4,
"useTabs": false,
"singleQuote": false,
"bracketSpacing": true,
"explicitTypes": "always"
}
},
{
"files": "*.{js,json,yml,yaml}",
"options": {
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"singleQuote": true,
"bracketSpacing": true,
"arrowParens": "avoid"
}
}
]
}
10 changes: 10 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"[solidity]": {
"editor.defaultFormatter": "JuanBlanco.solidity",
"editor.formatOnSave": true
},
"editor.formatOnSave": true,
"editor.detectIndentation": false,
"editor.insertSpaces": true,
"editor.tabSize": 4
}
71 changes: 1 addition & 70 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,78 +1,9 @@
# BurrBear Oracle Registry

Each Burr Pool requires 2 oracles, a base token oracle and a quote token oracle.
For example, for the [NECT/HONEY](https://bartio.beratrail.io/address/0x39fca0a506d01ff9cb727fe8edf088e10f6b431a) pool, we have a NECT/USD and a HONEY/USD oracle.

The Oracle Registry serves 2 purposes:

- It acts as a registry of curated oracles that can be used to deploy new BurrPools permissionlessly
- It allows new projects to suggest new base token oracles to be whitelisted

## Proposing a new oracle for a token

To have an oracle approved by the registry, call the `suggestFeed` function:

```solidity
function suggestFeed(
address quoteToken, // The quote token (e.g., HONEY) that this feed will be used with
address feedAddress, // The address of the Chainlink-compatible price feed
address[] calldata baseTokens // One or more base tokens that will use this feed
) external
```

For example, if you want to deploy a `NECT/HONEY` Burr Pool, you would first suggest the NECT/USD feed:

```solidity
address honey = 0x0E4aaF1351de4c0264C5c7056Ef3777b41BD8e03;
address nectFeed = 0x...; // The NECT/USD chainlink-compatible feed
address[] memory baseTokens = new address[](1);
baseTokens[0] = 0xf5AFCF50006944d17226978e594D4D25f4f92B40; // NECT token address
registry.suggestFeed(honey, nectFeed, baseTokens);
```

Note: The feed must be approved by the registry owner before it can be used.

### Suggesting a new base token for an existing oracle

If an oracle feed is already approved and you want to use it for another base token, you can call the `suggestBaseToken` function:

```solidity
function suggestBaseToken(
address quoteToken, // The quote token (e.g., HONEY)
address baseFeed, // The already approved oracle feed address
address baseToken // The new base token to associate with this feed
) external
```

## Feed requirements

A feed must meet the following requirements to be approved:

1. Its code must be verified (on etherscan or equivalent block explorer)
2. It must implement the [AggregatorV3Interface](./src/interfaces/AggregatorV3Interface.sol) interface and successfully return data via `latestRoundData()`
3. It must be decentralized: there should be no permissioned actions or actors that can alter the value of the price feed
4. The feed must not be pausable or cancellable
5. If its data comes from a decentralized protocol, it must use a TWAP source rather than spot price
6. Both the feed address and any associated base tokens must be valid addresses (non-zero)
7. All base tokens must implement the ERC20 interface

## Deployed feeds

| Chain | Feed Registry Address |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Berachain bArtio | [0x952c430dCC00f623708d1CbBECe3A6f5741b1384](https://bartio.beratrail.io/address/0x952c430dCC00f623708d1CbBECe3A6f5741b1384) |

## Setup

```bash
forge soldeer install
npm install
forge build
```

## Q&A

Q: Why not allow BurrPools to be deployed with any base token oracles?

A: Unlike standard AMMs that don't require oracles, a BurrPool can be compromised if the oracle feed is manipulated to reflect an incorrect price for the token. Therefore, we only whitelist oracle aggregator contracts that are decentralized and resilient to such attacks.

Have questions? Reach us on Discord: https://discord.gg/zZh57URFCu
732 changes: 0 additions & 732 deletions broadcast/DeployFeedRegistry.s.sol/80084/deployBartio-latest.json

This file was deleted.

This file was deleted.

732 changes: 0 additions & 732 deletions broadcast/DeployFeedRegistry.s.sol/80084/run-1736838906.json

This file was deleted.

642 changes: 0 additions & 642 deletions broadcast/DeployFeedRegistry.s.sol/80084/run-1736843717.json

This file was deleted.

738 changes: 0 additions & 738 deletions broadcast/DeployFeedRegistry.s.sol/80084/run-1736843893.json

This file was deleted.

28 changes: 10 additions & 18 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,29 @@
src = "src"
out = "out"
libs = ["dependencies"]
remappings = [
"@openzeppelin/contracts=dependencies/@openzeppelin-contracts-5.2.0-rc.1/",
"@openzeppelin-upgradeable/contracts=dependencies/@openzeppelin-contracts-upgradeable-5.2.0-rc.1/",
"forge-std=dependencies/forge-std-1.9.5/src/",
remappings = [
"forge-std/=dependencies/forge-std-1.9.5/src/",
"amm-contracts/=dependencies/amm-contracts-0.0.1/contracts/",
"@balancer-labs/=node_modules/@balancer-labs/",
"@openzeppelin/=node_modules/@openzeppelin/"
]
solc_version = "0.8.28+commit.7893614a"
solc_version = "0.7.6"
evm_version = "cancun"
optimizer = true
optimizer_runs = 200

berachain = { key = "verifyContract", chain = 80094, url = "https://api.routescan.io/v2/network/mainnet/evm/80094/etherscan" }
ignored_warnings_from=["dependencies/amm-contracts-0.0.1","node_modules/@openzeppelin"]



[soldeer]
# whether soldeer manages remappings
remappings_generate = true
# whether soldeer re-generates all remappings when installing, updating or uninstalling deps
remappings_regenerate = true
# whether to suffix the remapping with the version: `name-a.b.c`
remappings_version = false
# a prefix to add to the remappings ("@" would give `@name`)
remappings_prefix = ""
# where to store the remappings ("txt" for `remappings.txt` or "config" for `foundry.toml`)
# ignored when `soldeer.toml` is used as config (uses `remappings.txt`)
remappings_location = "txt"
recursive_deps = true

[dependencies]
forge-std = "1.9.5"
"@openzeppelin-contracts" = "5.2.0-rc.1"
"@openzeppelin-contracts-upgradeable" = "5.2.0-rc.1"
openzeppelin-foundry-upgrades = "0.3.6"

# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
forge-std = {version = "1.9.5" }
amm-contracts = { git = "https://github.com/xave-finance/amm-contracts.git", branch = "master", version = "0.0.1" }
187 changes: 187 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "feed-registry",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@balancer-labs/v2-pool-utils": "^2.0.1",
"@balancer-labs/v2-vault": "^2.0.0",
"@openzeppelin/contracts": "^3.4.2",
"@openzeppelin/contracts-upgradeable": "^3.4.2"
},
"devDependencies": {
"prettier-plugin-solidity": "^1.4.2"
}
}
15 changes: 4 additions & 11 deletions remappings.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-5.2.0-rc.1/
@openzeppelin-upgradeable/contracts/=dependencies/@openzeppelin-contracts-upgradeable-5.2.0-rc.1/
forge-std/=dependencies/forge-std-1.9.5/src/
@openzeppelin-contracts-5.2.0-rc.1/=dependencies/@openzeppelin-contracts-5.2.0-rc.1/
@openzeppelin-contracts-upgradeable-5.2.0-rc.1/=dependencies/@openzeppelin-contracts-upgradeable-5.2.0-rc.1/
ds-test/=dependencies/openzeppelin-foundry-upgrades-0.3.6/lib/solidity-stringutils/lib/ds-test/src/
forge-std-1.9.5/=dependencies/forge-std-1.9.5/src/
forge-std/=dependencies/openzeppelin-foundry-upgrades-0.3.6/lib/forge-std/src/
openzeppelin-foundry-upgrades-0.3.6/=dependencies/openzeppelin-foundry-upgrades-0.3.6/src/
openzeppelin-foundry-upgrades/=dependencies/openzeppelin-foundry-upgrades-0.3.6/src/
solidity-stringutils/=dependencies/openzeppelin-foundry-upgrades-0.3.6/lib/solidity-stringutils/
amm-contracts/=dependencies/amm-contracts-0.0.1/
forge-std/=dependencies/forge-std-1.9.5/
@balancer-labs/=node_modules/@balancer-labs/
@openzeppelin/=node_modules/@openzeppelin/
Loading