diff --git a/.gitignore b/.gitignore
index 21b7b2b68..5d3774297 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,7 @@
/node_modules
/venv
natspec/lib/*
-venv-py312
+/venv-py312
# Production
/build
diff --git a/README.md b/README.md
index f5c14ed5f..bc7cd6f05 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,8 @@ The Yearn Docs [website](https://docs.yearn.fi/) is built using [Docusaurus](htt
2. Install Python/Vyper dependencies for natspec docs generation (You can skip this step if you aren't working on smart contract documentation)
This assumes you are using linux and will use the apt package manager. If not, other OSes have their own package manager that will have Python and Vyper.
+ The pinned `vyper==0.3.7` dependency in `requirements.txt` only supports Python `>=3.7,<3.11`,
+ so use Python `3.10.x` for this setup.
2a. update the apt package manager
@@ -44,22 +46,36 @@ The Yearn Docs [website](https://docs.yearn.fi/) is built using [Docusaurus](htt
sudo apt update
```
- 2b. Install Python 3
+ 2b. Install Python 3.10
```bash
- sudo apt install python3
+ sudo apt install python3.10 python3.10-venv
+ ```
+
+ If `python3.10` is not available from `apt` on your distro (for example Ubuntu 24.04),
+ install it with a version manager such as `uv` instead:
+
+ ```bash
+ uv python install 3.10
```
2c. Verify the installation
```bash
- python3 --version
+ python3.10 --version
```
2d. Create and initialize python virtual environment
```bash
- python3 -m venv venv
+ python3.10 -m venv venv
+ source venv/bin/activate
+ ```
+
+ If you installed Python 3.10 with `uv`, create the environment with:
+
+ ```bash
+ uv venv --python 3.10 --seed venv
source venv/bin/activate
```
@@ -239,9 +255,17 @@ For reference, these are the addresses for the different submodules:
- [yearn/yearn-ERC4626-Router](https://github.com/yearn/Yearn-ERC4626-Router)
2. If you haven't already, create a python virtual environment and initialize.
+ Use Python `3.10.x` here as well, since `vyper==0.3.7` does not install on Python `3.11+`.
+ If you installed Python 3.10 with `uv`, use the `uv venv` command below so `pip` is
+ seeded in the environment.
+
+```bash
+python3.10 -m venv venv
+source venv/bin/activate
+```
```bash
-python3 -m venv venv
+uv venv --python 3.10 --seed venv
source venv/bin/activate
```
diff --git a/bun.lock b/bun.lock
index 588a7a898..1375d5720 100644
--- a/bun.lock
+++ b/bun.lock
@@ -1,5 +1,6 @@
{
"lockfileVersion": 1,
+ "configVersion": 0,
"workspaces": {
"": {
"name": "yearn-devdocs",
@@ -2941,7 +2942,7 @@
"vscode-uri": ["vscode-uri@3.0.8", "", {}, "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="],
- "vydoc": ["vydoc@github:rossgalloway/vydoc#f684cc3", { "dependencies": { "chalk": "^4.1.0", "cli-progress": "^3.9.0", "cli-table": "^0.3.6", "ejs": "^3.1.6", "ramda": "^0.27.1", "ramda-async": "^1.1.2", "yargs": "^16.2.0" }, "bin": { "vydoc": "./lib/bin/vydoc.js" } }, "rossgalloway-vydoc-f684cc3"],
+ "vydoc": ["vydoc@github:rossgalloway/vydoc#f684cc3", { "dependencies": { "chalk": "^4.1.0", "cli-progress": "^3.9.0", "cli-table": "^0.3.6", "ejs": "^3.1.6", "ramda": "^0.27.1", "ramda-async": "^1.1.2", "yargs": "^16.2.0" }, "bin": { "vydoc": "./lib/bin/vydoc.js" } }, "rossgalloway-vydoc-f684cc3", "sha512-gCa2UmH+32V7Q33ObkmACl8S2OZCcXIcp3E1cc6B/17z6rAlAw4LHpf1dbaOB3H9OEs9JDGmMpvbfxgQApqK1w=="],
"watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="],
diff --git a/docs/developers/addresses/core-contracts.md b/docs/developers/addresses/core-contracts.md
index 23c09e61c..f415af520 100644
--- a/docs/developers/addresses/core-contracts.md
+++ b/docs/developers/addresses/core-contracts.md
@@ -78,7 +78,6 @@ See all stYFI contracts [on this page](./styfi-contracts.md)
| --------------------- | ------------------------------------------ |
| kChad multisig | [0xe6ad5A88f5da0F276C903d9Ac2647A937c917162](https://katanascan.com/address/0xe6ad5A88f5da0F276C903d9Ac2647A937c917162) |
| Strategist multisig | [0xBe7c7efc1ef3245d37E3157F76A512108D6D7aE6](https://katanascan.com/address/0xBe7c7efc1ef3245d37E3157F76A512108D6D7aE6) |
-| V3 multisig | [0x33333333D5eFb92f19a5F94a43456b3cec2797AE](https://katanascan.com/address/0x33333333D5eFb92f19a5F94a43456b3cec2797AE) |
| Timelock | [0x88Ba032be87d5EF1fbE87336B7090767F367BF73](https://katanascan.com/address/0x88Ba032be87d5EF1fbE87336B7090767F367BF73) |
| Timelock Executor | [0xF8f60BF9456A6e0141149Db2DD6f02C60da5779B](https://katanascan.com/address/0xF8f60BF9456A6e0141149Db2DD6f02C60da5779B) |
diff --git a/docs/developers/addresses/v3-contracts.md b/docs/developers/addresses/v3-contracts.md
index 924626ba4..a1d8fe2c5 100644
--- a/docs/developers/addresses/v3-contracts.md
+++ b/docs/developers/addresses/v3-contracts.md
@@ -66,7 +66,9 @@ All generic periphery contracts and factories can be retrieved onchain from the
| **Debt Allocator Factory**
| |
| **Registry Factory**
| |
| **Splitter Factory**
| |
+| **Auction Registry**
| |
| **Auction Factory**
| |
+| **Dumper**
| |
| **Keeper**
| |
| **Base Fee Provider**
| |
@@ -84,6 +86,7 @@ These addresses are consistent across all EVM chains.
| Name / ENS | Contract Address |
| ---------------------- | ---------------------- |
+| **V3 Deployer Multisig**
registry.v3.ychad.eth | |
| **Current V3 Registry**
registry.v3.ychad.eth | |
| **Legacy V3 Registry**
| |
@@ -95,6 +98,7 @@ Ethereum-specific Yearn addresses
| ---------------------- | ---------------------- |
| **Role Manager**
role-manager.v3.ychad.eth | |
| **Accountant**
accountant.v3.ychad.eth | |
+| **Debt Allocator**
| |
### Optimism (10) Addresses
@@ -122,6 +126,7 @@ Base-specific Yearn addresses
| ---------------------- | ---------------------- |
| **Role Manager**
| |
| **Accountant**
| |
+| **Debt Allocator**
| |
### Arbitrum (42161) Addresses
@@ -131,6 +136,7 @@ Arbitrum-specific Yearn addresses
| ---------------------- | ---------------------- |
| **Role Manager**
| |
| **Accountant**
| |
+| **Debt Allocator**
| |
### Katana (747474) Addresses
diff --git a/docs/developers/smart-contracts/V3/Periphery/AuctionFactory.md b/docs/developers/smart-contracts/V3/Periphery/AuctionFactory.md
new file mode 100644
index 000000000..40fe43dad
--- /dev/null
+++ b/docs/developers/smart-contracts/V3/Periphery/AuctionFactory.md
@@ -0,0 +1,199 @@
+
+# AuctionFactory
+
+[Git Source](https://github.com/yearn/tokenized-strategy-periphery/blob/c0dfe4a563a45efb72718547e840429b3a6092e6/src/Auctions/AuctionFactory.sol)
+
+**Inherits:** ClonableCreate2
+
+**Title:**
+AuctionFactory
+
+Deploy a new Auction.
+
+## State Variables
+
+### DEFAULT_STARTING_PRICE
+
+The amount to start the auction with.
+
+```solidity
+uint256 public constant DEFAULT_STARTING_PRICE = 1_000_000
+```
+
+### auctions
+
+Full array of all auctions deployed through this factory.
+
+```solidity
+address[] public auctions
+```
+
+## Functions
+
+### constructor
+
+```solidity
+constructor() ;
+```
+
+### version
+
+```solidity
+function version() external pure returns (string memory);
+```
+
+### createNewAuction
+
+Creates a new auction contract.
+
+```solidity
+function createNewAuction(address _want) external returns (address);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_want`|`address`|Address of the token users will bid with.|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`address`|_newAuction Address of the newly created auction contract.|
+
+### createNewAuction
+
+Creates a new auction contract.
+
+```solidity
+function createNewAuction(address _want, address _receiver) external returns (address);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_want`|`address`|Address of the token users will bid with.|
+|`_receiver`|`address`|Address that will receive the funds in the auction.|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`address`|_newAuction Address of the newly created auction contract.|
+
+### createNewAuction
+
+Creates a new auction contract.
+
+```solidity
+function createNewAuction(address _want, address _receiver, address _governance) external returns (address);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_want`|`address`|Address of the token users will bid with.|
+|`_receiver`|`address`|Address that will receive the funds in the auction.|
+|`_governance`|`address`|Address allowed to enable and disable auctions.|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`address`|_newAuction Address of the newly created auction contract.|
+
+### createNewAuction
+
+Creates a new auction contract.
+
+```solidity
+function createNewAuction(address _want, address _receiver, address _governance, uint256 _startingPrice)
+ external
+ returns (address);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_want`|`address`|Address of the token users will bid with.|
+|`_receiver`|`address`|Address that will receive the funds in the auction.|
+|`_governance`|`address`|Address allowed to enable and disable auctions.|
+|`_startingPrice`|`uint256`|Starting price for the auction (no decimals). NOTE: The starting price should be without decimals (1k == 1_000).|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`address`|_newAuction Address of the newly created auction contract.|
+
+### createNewAuction
+
+Creates a new auction contract.
+
+```solidity
+function createNewAuction(
+ address _want,
+ address _receiver,
+ address _governance,
+ uint256 _startingPrice,
+ bytes32 _salt
+) external returns (address);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_want`|`address`|Address of the token users will bid with.|
+|`_receiver`|`address`|Address that will receive the funds in the auction.|
+|`_governance`|`address`|Address allowed to enable and disable auctions.|
+|`_startingPrice`|`uint256`|Starting price for the auction (no decimals).|
+|`_salt`|`bytes32`|The salt to use for deterministic deployment.|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`address`|_newAuction Address of the newly created auction contract.|
+
+### _createNewAuction
+
+Deploys and initializes a new Auction
+
+```solidity
+function _createNewAuction(
+ address _want,
+ address _receiver,
+ address _governance,
+ uint256 _startingPrice,
+ bytes32 _salt
+) internal returns (address _newAuction);
+```
+
+### getAllAuctions
+
+Get the full list of auctions deployed through this factory.
+
+```solidity
+function getAllAuctions() external view returns (address[] memory);
+```
+
+### numberOfAuctions
+
+Get the total number of auctions deployed through this factory.
+
+```solidity
+function numberOfAuctions() external view returns (uint256);
+```
+
+## Events
+
+### DeployedNewAuction
+
+```solidity
+event DeployedNewAuction(address indexed auction, address indexed want);
+```
diff --git a/docs/developers/smart-contracts/V3/Periphery/AuctionRegistry.md b/docs/developers/smart-contracts/V3/Periphery/AuctionRegistry.md
new file mode 100644
index 000000000..7305d8c67
--- /dev/null
+++ b/docs/developers/smart-contracts/V3/Periphery/AuctionRegistry.md
@@ -0,0 +1,223 @@
+
+# AuctionRegistry
+
+[Git Source](https://github.com/yearn/tokenized-strategy-periphery/blob/c0dfe4a563a45efb72718547e840429b3a6092e6/src/Auctions/AuctionRegistry.sol)
+
+**Inherits:** Governance2Step
+
+**Title:**
+AuctionRegistry
+
+Registry contract that manages released and endorsed auction factory addresses
+
+Provides on-chain discovery and verification of official auction factories
+
+## State Variables
+
+### factories
+
+Array of all registered factories
+
+```solidity
+address[] public factories
+```
+
+### factoryInfo
+
+Mapping from factory address to its index in the factories array
+
+```solidity
+mapping(address => FactoryInfo) public factoryInfo
+```
+
+### versionToFactory
+
+Mapping from version string to factory address
+
+```solidity
+mapping(string => address) public versionToFactory
+```
+
+## Functions
+
+### constructor
+
+Initialize the registry with known factory addresses
+
+```solidity
+constructor(address _governance, address[] memory _knownFactories, string[] memory _versions)
+ Governance2Step(_governance);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_governance`|`address`|The address that will have governance rights|
+|`_knownFactories`|`address[]`|Array of known factory addresses to register|
+|`_versions`|`string[]`|Array of version strings corresponding to the factories|
+
+### getLatestFactory
+
+Get the latest endorsed auction factory address
+
+```solidity
+function getLatestFactory() external view returns (address factory);
+```
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`factory`|`address`|The address of the latest endorsed factory|
+
+### getFactory
+
+Get a factory by its version string
+
+```solidity
+function getFactory(string memory _version) external view returns (address factory);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_version`|`string`|The version string of the factory|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`factory`|`address`|The address of the factory|
+
+### getFactoryInfo
+
+Get factory information by address
+
+```solidity
+function getFactoryInfo(address _factory) external view returns (FactoryInfo memory info);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_factory`|`address`|The address of the factory|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`info`|`FactoryInfo`|The factory information struct|
+
+### getAllFactories
+
+Get all registered factories
+
+```solidity
+function getAllFactories() external view returns (address[] memory);
+```
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`address[]`|All factory information|
+
+### numberOfFactories
+
+Get the total number of registered factories
+
+```solidity
+function numberOfFactories() external view returns (uint256);
+```
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`uint256`|The number of registered factories|
+
+### isRegisteredFactory
+
+Check if a factory is endorsed
+
+```solidity
+function isRegisteredFactory(address _factory) public view returns (bool);
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_factory`|`address`|The address to check|
+
+**Returns**
+
+|Name|Type|Description|
+|----|----|-----------|
+|``|`bool`|True if the factory is endorsed|
+
+### registerNewFactory
+
+Release a new factory
+
+```solidity
+function registerNewFactory(address _factory, string memory _version) external onlyGovernance;
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_factory`|`address`|The address of the factory|
+|`_version`|`string`|The version string of the factory|
+
+### retireFactory
+
+Revoke endorsement from a factory
+
+```solidity
+function retireFactory(address _factory) external onlyGovernance;
+```
+
+**Parameters**
+
+|Name|Type|Description|
+|----|----|-----------|
+|`_factory`|`address`|The address of the factory|
+
+### _registerFactory
+
+Internal function to register a factory
+
+```solidity
+function _registerFactory(address _factory, string memory _version) internal;
+```
+
+## Events
+
+### FactoryRegistered
+
+```solidity
+event FactoryRegistered(address indexed factory, string version, uint256 index);
+```
+
+### FactoryRetired
+
+```solidity
+event FactoryRetired(address indexed factory);
+```
+
+## Structs
+
+### FactoryInfo
+
+```solidity
+struct FactoryInfo {
+ string version;
+ uint256 index;
+ bool isRetired;
+}
+```
diff --git a/docs/developers/smart-contracts/V3/Periphery/Keeper.md b/docs/developers/smart-contracts/V3/Periphery/Keeper.md
new file mode 100644
index 000000000..52c0ed082
--- /dev/null
+++ b/docs/developers/smart-contracts/V3/Periphery/Keeper.md
@@ -0,0 +1,37 @@
+
+# Keeper
+
+[Git Source](https://github.com/yearn/vault-periphery/blob/bc4eee4051e3319427012e65296110bbdc00488d/src/Keeper.sol)
+
+**Title:**
+Keeper
+
+To allow permissionless reporting on V3 vaults and strategies.
+This will do low level calls so that in can be used without reverting
+it the roles have not been set or the functions are not available.
+
+## Functions
+
+### report
+
+Reports on a strategy.
+
+```solidity
+function report(address _strategy) external returns (uint256, uint256);
+```
+
+### tend
+
+Tends a strategy.
+
+```solidity
+function tend(address _strategy) external;
+```
+
+### process_report
+
+Report strategy profits on a vault.
+
+```solidity
+function process_report(address _vault, address _strategy) external returns (uint256, uint256);
+```
diff --git a/docs/developers/v3/Integrating_v3.md b/docs/developers/v3/Integrating_v3.md
index e87bea5f9..a13d92654 100644
--- a/docs/developers/v3/Integrating_v3.md
+++ b/docs/developers/v3/Integrating_v3.md
@@ -16,8 +16,6 @@ token.approve(vault, amount)
vault.deposit(amount, receiver)
```
-There is also a [4626 Router](/developers/smart-contracts/V3/Periphery/Yearn4626Router) available to make multi-step user flows easier.
-
The max amount that a vault will accept from an address can be returned using the [`maxDeposit`](https://eips.ethereum.org/EIPS/eip-4626#maxdeposit) function.
### Withdrawals
diff --git a/natspec/lib/tokenized-strategy-periphery b/natspec/lib/tokenized-strategy-periphery
index f70e702c3..c0dfe4a56 160000
--- a/natspec/lib/tokenized-strategy-periphery
+++ b/natspec/lib/tokenized-strategy-periphery
@@ -1 +1 @@
-Subproject commit f70e702c378fa41e52c46acf3da8b4e90c6a0ff8
+Subproject commit c0dfe4a563a45efb72718547e840429b3a6092e6
diff --git a/natspec/lib/vault-periphery b/natspec/lib/vault-periphery
index 329c63c18..bc4eee405 160000
--- a/natspec/lib/vault-periphery
+++ b/natspec/lib/vault-periphery
@@ -1 +1 @@
-Subproject commit 329c63c187d13c1e1443571238f6144b1ee0726f
+Subproject commit bc4eee4051e3319427012e65296110bbdc00488d
diff --git a/requirements.txt b/requirements.txt
index ff32abfa1..cca8dfc34 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-asttokens==3.0.1
+asttokens==2.0.5
certifi==2025.11.12
charset-normalizer==3.4.4
idna==3.11
@@ -9,5 +9,5 @@ semantic-version==2.10.0
six==1.17.0
solc-select==1.1.0
urllib3==2.6.0
-vyper==0.4.3
+vyper==0.3.7
# ypricemagic==4.10.10
diff --git a/scripts/fetchedAddressData.json b/scripts/fetchedAddressData.json
index bb4271299..bf2b35fe4 100644
--- a/scripts/fetchedAddressData.json
+++ b/scripts/fetchedAddressData.json
@@ -1,5 +1,5 @@
{
- "timeLastChecked": 1773343605,
+ "timeLastChecked": 1775507802,
"addressesData": {
"v3ContractAddresses": {
"topLevel": {
@@ -117,7 +117,8 @@
"aprOracleCheck": true,
"routerCheck": true,
"reportTriggerCheck": true,
- "roleManagerFactoryCheck": true
+ "roleManagerFactoryCheck": true,
+ "auctionFactoryCheck": true
},
"releaseRegistry": {
"hasLatestRelease": true,
@@ -138,7 +139,8 @@
"accountantCheck": true,
"registryCheck": true,
"debtAllocatorCheck": true,
- "daddyCheck": true
+ "daddyCheck": true,
+ "feeRecipientCheck": true
}
},
"veYfiChecks": {
diff --git a/smartContracts.json b/smartContracts.json
index 9235f1742..c718a0616 100644
--- a/smartContracts.json
+++ b/smartContracts.json
@@ -43,6 +43,18 @@
"type": "file",
"git": "https://github.com/yearn/vault-periphery"
},
+ "Keeper.sol": {
+ "type": "file",
+ "git": "https://github.com/yearn/vault-periphery"
+ },
+ "AuctionRegistry.sol": {
+ "type": "file",
+ "git": "https://github.com/yearn/tokenized-strategy-periphery"
+ },
+ "AuctionFactory.sol": {
+ "type": "file",
+ "git": "https://github.com/yearn/tokenized-strategy-periphery"
+ },
"Auction.sol": {
"type": "file",
"git": "https://github.com/yearn/tokenized-strategy-periphery"
diff --git a/src/ethereum/ABIs/accountantABI.ts b/src/ethereum/ABIs/accountantABI.ts
new file mode 100644
index 000000000..6e5e66fb5
--- /dev/null
+++ b/src/ethereum/ABIs/accountantABI.ts
@@ -0,0 +1,9 @@
+export const accountantABI = [
+ {
+ stateMutability: 'view',
+ type: 'function',
+ name: 'feeRecipient',
+ inputs: [],
+ outputs: [{ name: '', type: 'address' }],
+ },
+] as const
diff --git a/src/ethereum/ABIs/auctionRegistryABI.ts b/src/ethereum/ABIs/auctionRegistryABI.ts
new file mode 100644
index 000000000..1f0b37f9e
--- /dev/null
+++ b/src/ethereum/ABIs/auctionRegistryABI.ts
@@ -0,0 +1,9 @@
+export const auctionRegistryABI = [
+ {
+ stateMutability: 'view',
+ type: 'function',
+ name: 'getLatestFactory',
+ inputs: [],
+ outputs: [{ name: '', type: 'address' }],
+ },
+] as const
diff --git a/src/ethereum/ABIs/index.ts b/src/ethereum/ABIs/index.ts
index ab19c5d7e..e226bca5f 100644
--- a/src/ethereum/ABIs/index.ts
+++ b/src/ethereum/ABIs/index.ts
@@ -16,3 +16,5 @@ export * from './veyfiABI'
export * from './yPoolsGenericGovernorABI'
export * from './yPoolsInclusionVoteABI'
export * from './gnosisSafeABI'
+export * from './auctionRegistryABI'
+export * from './accountantABI'
diff --git a/src/ethereum/constants.ts b/src/ethereum/constants.ts
index 2d46c00e0..49108bd23 100644
--- a/src/ethereum/constants.ts
+++ b/src/ethereum/constants.ts
@@ -185,7 +185,9 @@ export const protocolPeriphery = {
aprOracle: '0x1981AD9F44F2EA9aDd2dC4AD7D075c102C70aF92',
baseFeeProvider: '0xe0514dd71cfdc30147e76f65c30bdf60bfd437c3',
commonReportTrigger: '0xf8dF17a35c88AbB25e83C92f9D293B4368b9D52D',
- auctionFactory: '0xbC587a495420aBB71Bbd40A0e291B64e80117526',
+ auctionRegistry: '0x94F44706A61845a4f9e59c4Bc08cEA4503e48D12',
+ auctionFactory: '0xbA7FCb508c7195eE5AE823F37eE2c11D7ED52F8e',
+ dumper: '0x590Dd9399bB53f1085097399C3265C7137c1C4Cf',
splitterFactory: '0xe28fCC9FB2998ba57754789F6666DAa8C815614D',
registryFactory: '0x3A0fa8aac82aD94048098D6af6e8eB36c98816A1',
debtAllocatorFactory: '0x03D43dF6FF894C848fC6F1A0a7E8a539Ef9A4C18',
@@ -198,6 +200,7 @@ export const protocolPeriphery = {
* Queried from the Yearn Role Manager
*/
export const yearnV3ContractsStable = {
+ v3Deployer: '0x33333333D5eFb92f19a5F94a43456b3cec2797AE',
registryENS: 'registry.v3.ychad.eth',
registry: '0xd40ecF29e001c76Dcc4cC0D9cd50520CE845B038',
legacyRegistry1: '0xff31A1B020c868F6eA3f61Eb953344920EeCA3af',
diff --git a/src/ethereum/v3Calls.ts b/src/ethereum/v3Calls.ts
index 0be640a66..5cfcef677 100644
--- a/src/ethereum/v3Calls.ts
+++ b/src/ethereum/v3Calls.ts
@@ -5,6 +5,8 @@ import {
v3VaultFactoryABI,
yearnV3RoleManagerABI,
v3VaultFactoryBlueprintABI,
+ auctionRegistryABI,
+ accountantABI,
} from './ABIs'
import { V3ReleaseDataMap } from './types'
@@ -159,3 +161,39 @@ export const readYearnRoleManager = async (
yearnRegistry,
}
}
+
+export const getAuctionFactoryFromRegistry = async (
+ auctionRegistryAddress: Address,
+ publicClient: PublicClient
+) => {
+ const contract = getContract({
+ address: auctionRegistryAddress,
+ abi: auctionRegistryABI,
+ client: publicClient,
+ })
+ console.log('Fetching auction factory from auction registry...')
+ const auctionFactory = await contract.read.getLatestFactory().catch(() => {
+ console.warn('auctionFactory not found in auction registry')
+ return undefined
+ })
+ console.log('Auction factory address fetched from registry.')
+ return auctionFactory
+}
+
+export const getFeeRecipientFromAccountant = async (
+ accountantAddress: Address,
+ publicClient: PublicClient
+) => {
+ const contract = getContract({
+ address: accountantAddress,
+ abi: accountantABI,
+ client: publicClient,
+ })
+ console.log('Fetching fee recipient from accountant...')
+ const feeRecipient = await contract.read.feeRecipient().catch(() => {
+ console.warn('feeRecipient not found in accountant')
+ return undefined
+ })
+ console.log('Fee recipient address fetched from accountant.')
+ return feeRecipient
+}
diff --git a/src/ethereum/v3Checks.ts b/src/ethereum/v3Checks.ts
index 41c7a48e5..7f0bfc1d7 100644
--- a/src/ethereum/v3Checks.ts
+++ b/src/ethereum/v3Checks.ts
@@ -3,6 +3,8 @@ import {
getProtocolContractAddresses,
readReleaseRegistryAll,
readYearnRoleManager,
+ getAuctionFactoryFromRegistry,
+ getFeeRecipientFromAccountant,
} from './v3Calls'
import { Address, PublicClient, getAddress } from 'viem'
import { V3ReleaseDataMap, V3ReleaseData } from './types'
@@ -186,12 +188,27 @@ export const fetchAndCheckProtocolAddresses = async (
roleManagerFactory,
failedChecks
)
+
+ // Fetch auctionFactory from auctionRegistry
+ const auctionRegistryAddress = constants.protocolPeriphery.auctionRegistry as Address
+ const auctionFactoryFromRegistry = await getAuctionFactoryFromRegistry(
+ auctionRegistryAddress,
+ publicClient
+ )
+ const auctionFactoryCheck = await validateAddress(
+ constants.protocolPeriphery.auctionFactory,
+ 'v3AuctionFactory',
+ auctionFactoryFromRegistry || '0x0000000000000000000000000000000000000000',
+ failedChecks
+ )
+
if (
!aprOracleCheck ||
!aprOracleENSCheck ||
!routerCheck ||
!reportTriggerCheck ||
- !roleManagerFactoryCheck
+ !roleManagerFactoryCheck ||
+ !auctionFactoryCheck
) {
checkFlag = false
}
@@ -200,6 +217,7 @@ export const fetchAndCheckProtocolAddresses = async (
routerCheck,
reportTriggerCheck,
roleManagerFactoryCheck,
+ auctionFactoryCheck,
}
console.log('V3 protocol address validation complete. \n')
return {
@@ -357,13 +375,27 @@ export const fetchAndCheckYearnV3Addresses = async (
failedChecks
)
+ // Fetch feeRecipient from Accountant and validate against dumper
+ const accountantAddress = constants.yearnV3ContractsMainnet.accountant as Address
+ const feeRecipientFromAccountant = await getFeeRecipientFromAccountant(
+ accountantAddress,
+ publicClient
+ )
+ const feeRecipientCheck = await validateAddress(
+ constants.protocolPeriphery.dumper,
+ 'yearnV3FeeRecipient (Dumper)',
+ feeRecipientFromAccountant || '0x0000000000000000000000000000000000000000',
+ failedChecks
+ )
+
if (
!accountantCheck ||
!accountantENSCheck ||
!registryCheck ||
!registryENSCheck ||
!debtAllocatorCheck ||
- !daddyCheck
+ !daddyCheck ||
+ !feeRecipientCheck
) {
checkFlag = false
}
@@ -373,6 +405,7 @@ export const fetchAndCheckYearnV3Addresses = async (
registryCheck,
debtAllocatorCheck,
daddyCheck,
+ feeRecipientCheck,
}
console.log('Yearn V3 Periphery address validation complete. \n')
return { addresses, checks, checkFlag }