Skip to content

Commit

Permalink
feat: add base (#425)
Browse files Browse the repository at this point in the history
# Description

Add Base

Pending re-generating types from cow-sdk until
cowprotocol/cow-sdk#223 is merged

# Changes

- [x] Mention TWAP part amount
- [x] Contracts on CORE
- [x] Contracts on PERIPHERY
- [x] Solver rewards
- [x] Signing schemes
- [x] Custom links
- [x] Native tokens
- [x] Tutorials TWAP
- [x] Tutorials Hook dapp
- [x] Tutorials solvers
- [x] Tutorials widget
- [x] Governance token
  • Loading branch information
alfetopito authored Dec 19, 2024
1 parent a23edb6 commit 71b00b7
Show file tree
Hide file tree
Showing 12 changed files with 147 additions and 136 deletions.
8 changes: 5 additions & 3 deletions docs/cow-protocol/concepts/order-types/twap-orders.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,17 @@ TWAP orders are ideal for executing big trades with minimal price impact.

TWAP orders split up a large order into a series of normal limit orders that trade at fixed intervals. When setting up a TWAP order, users specify how many parts they'd like to split their trade into, as well as the total duration of the order (can be hours, days, weeks, or even months).

TWAP orders on CoW Protocol require several inputs:
TWAP orders on CoW Protocol require several inputs:

- **Assets**: Just like you would with a regular swap, begin by specifying the assets you want to swap
- **Price Protection**: One of the unique parts of TWAP orders on CoW Protocol is the "price protection" option which allows you to specify the minimum market price you'd be willing to take for your order. If the price of the asset you're buying falls below what you specify for any, that part of the TWAP order will not execute until the price recovers above your threshold
- **Number of Parts**: Here you specify how many parts you'd like to split your large order into
- **Total Duration**: Specify the total length of time that you want all parts of your order to execute over

## Benefits
TWAP orders provide a number of benefits, especially when it comes to large orders:

TWAP orders provide a number of benefits, especially when it comes to large orders:

- **Lower slippage**: Breaking up a large order into smaller pieces allows users to set a smaller slippage tolerance for each piece than if they had executed the large order as one
- **Lower price impact**: As with slippage, breaking up a large order into small pieces allows users to spread their liquidity needs over time, reducing price impact
- **100% of order surplus**: On CoW Swap, all order surplus is forwarded to the user. If an order executes for a price better than the quoted price - thanks to [Coincidences of Wants](../how-it-works/coincidence-of-wants) or any other price improvement that solvers are able to find - the extra price improvement will be forwarded to the user
Expand All @@ -30,7 +32,7 @@ TWAP orders provide a number of benefits, especially when it comes to large orde

There are also several requirements for placing TWAP orders through CoW Protocol

- Trades on Ethereum Mainnet must be a minimum of \$1,000 (the minimum is only $5 for trades on Gnosis chain and Arbitrum One)
- Trades on Ethereum Mainnet must be a minimum of \$1,000 (the minimum is only $5 for trades on Gnosis chain, Arbitrum One and Base)
- Users must have a [Safe wallet](https://safe.global/wallet) with an [upgraded fallback handler](https://blog.cow.fi/all-you-need-to-know-about-cow-swaps-new-safe-fallback-handler-8ef0439925d1)

## Getting started
Expand Down
6 changes: 3 additions & 3 deletions docs/cow-protocol/reference/contracts/core/README.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ Take care when [signing](../core/signing-schemes), ensuring that the `EIP-712` d

| **Contracts** | **Address / Chains** |
|---|---|
| [`GPv2Settlement`](core/settlement)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2Settlement.sol) | `0x9008D19f58AAbD9eD0D60971565AA8510560ab41`<br />- [Ethereum mainnet](https://etherscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code)<br />- [Gnosis chain](https://gnosisscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code)<br/>- [Arbitrum one](https://arbiscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code) |
| [`GPv2AllowListAuthentication`](core/allowlist)<br />Upgradeable: Yes ⚠️<br />[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2AllowListAuthentication.sol) | `0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE`<br />- [Ethereum mainnet](https://etherscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code)<br />- [Gnosis chain](https://gnosisscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code)<br/>- [Arbitrum one](https://arbiscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code) |
| [`GPv2VaultRelayer`](core/vault-relayer)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2VaultRelayer.sol) | `0xC92E8bdf79f0507f65a392b0ab4667716BFE0110`<br />- [Ethereum mainnet](https://etherscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code)<br />- [Gnosis chain](https://gnosisscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code)<br/>- [Arbitrum one](https://arbiscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code) |
| [`GPv2Settlement`](core/settlement)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2Settlement.sol) | `0x9008D19f58AAbD9eD0D60971565AA8510560ab41`<br />- [Ethereum mainnet](https://etherscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code)<br />- [Gnosis chain](https://gnosisscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code)<br/>- [Arbitrum one](https://arbiscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code)<br/>- [Base](https://basescan.org/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41/#code) |
| [`GPv2AllowListAuthentication`](core/allowlist)<br />Upgradeable: Yes ⚠️<br />[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2AllowListAuthentication.sol) | `0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE`<br />- [Ethereum mainnet](https://etherscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code)<br />- [Gnosis chain](https://gnosisscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code)<br/>- [Arbitrum one](https://arbiscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code)<br/>- [Base](https://basescan.org/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE/#code) |
| [`GPv2VaultRelayer`](core/vault-relayer)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2VaultRelayer.sol) | `0xC92E8bdf79f0507f65a392b0ab4667716BFE0110`<br />- [Ethereum mainnet](https://etherscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code)<br />- [Gnosis chain](https://gnosisscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code)<br/>- [Arbitrum one](https://arbiscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code)<br/>- [Base](https://basescan.org/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0xC92E8bdf79f0507f65a392b0ab4667716BFE0110/#code) |

<details close>
<summary>Upgradeable allow-list</summary>
Expand Down
6 changes: 3 additions & 3 deletions docs/cow-protocol/reference/contracts/periphery/README.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ CoW Protocol contracts are generally deployed to the same addresses on their res

| **Contracts** | **Address / Chains** |
|---|---|
| [`EthFlow`](periphery/eth-flow)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/ethflowcontract/blob/main/src/CoWSwapEthFlow.sol) | Production: `0x40A50cf069e992AA4536211B23F286eF88752187`, Staging: `0xD02De8Da0B71E1B59489794F423FaBBa2AdC4d93` on the following networks:<br />- Ethereum mainnet: [Production](https://etherscan.io/address/0x40A50cf069e992AA4536211B23F286eF88752187), [Staging](https://etherscan.io/address/0xD02De8Da0B71E1B59489794F423FaBBa2AdC4d93)<br />- Gnosis chain: [Production](https://gnosisscan.io/address/0x40A50cf069e992AA4536211B23F286eF88752187), [Staging](https://gnosisscan.io/address/0xD02De8Da0B71E1B59489794F423FaBBa2AdC4d93)<br /><br />Production: `0x552fcecc218158fff20e505c8f3ad24f8e1dd33c`, Staging: `0x6dfe75b5ddce1ade279d4fa6bd6aef3cbb6f49db` on the following networks:<br />- Arbitrum one: [Production](https://arbiscan.io/address/0x552fcecc218158fff20e505c8f3ad24f8e1dd33c), [Staging](https://arbiscan.io/address/0x6dfe75b5ddce1ade279d4fa6bd6aef3cbb6f49db)<br /><br />Production: `0x0b7795E18767259CC253a2dF471db34c72B49516`, Staging: `0x2671994c7D224ac4799ac2cf6Ef9EF187d42C69f` on the following networks:<br />- Sepolia: [Production](https://sepolia.etherscan.io/address/0x0b7795E18767259CC253a2dF471db34c72B49516), [Staging](https://sepolia.etherscan.io/address/0x2671994c7D224ac4799ac2cf6Ef9EF187d42C69f)<br /> |
| [`HooksTrampoline`](periphery/hooks-trampoline)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/hooks-trampoline/blob/main/src/HooksTrampoline.sol) | `0x01DcB88678aedD0C4cC9552B20F4718550250574`<br />- [Ethereum mainnet](https://etherscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574)<br />- [Gnosis chain](https://gnosisscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574)<br/>- [Arbitrum one](https://arbiscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574) |
| [`ComposableCoW`](periphery/composable-cow)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/composable-cow/blob/main/src/ComposableCoW.sol) | `0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74`<br />- [Ethereum mainnet](https://etherscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74)<br />- [Gnosis chain](https://gnosisscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74)<br/>- [Arbitrum one](https://arbiscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74) |
| [`EthFlow`](periphery/eth-flow)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/ethflowcontract/blob/main/src/CoWSwapEthFlow.sol) | Production: `0x40A50cf069e992AA4536211B23F286eF88752187`, Staging: `0xD02De8Da0B71E1B59489794F423FaBBa2AdC4d93` on the following networks:<br />- Ethereum mainnet: [Production](https://etherscan.io/address/0x40A50cf069e992AA4536211B23F286eF88752187), [Staging](https://etherscan.io/address/0xD02De8Da0B71E1B59489794F423FaBBa2AdC4d93)<br />- Gnosis chain: [Production](https://gnosisscan.io/address/0x40A50cf069e992AA4536211B23F286eF88752187), [Staging](https://gnosisscan.io/address/0xD02De8Da0B71E1B59489794F423FaBBa2AdC4d93)<br /><br />Production: `0x552fcecc218158fff20e505c8f3ad24f8e1dd33c`, Staging: `0x6dfe75b5ddce1ade279d4fa6bd6aef3cbb6f49db` on the following networks:<br />- Arbitrum one: [Production](https://arbiscan.io/address/0x552fcecc218158fff20e505c8f3ad24f8e1dd33c), [Staging](https://arbiscan.io/address/0x6dfe75b5ddce1ade279d4fa6bd6aef3cbb6f49db)<br /><br />Production: `0x3d1b389f1707DB3d4c5344d5669DBda6b5D6Ab51`, Staging: `0x3C3eA1829891BC9bEC3d06A81d5d169e52a415e3` on the following networks:<br />- Base: [Production](https://basescan.org/address/0x3d1b389f1707DB3d4c5344d5669DBda6b5D6Ab51), [Staging](https://basescan.org/address/0x3C3eA1829891BC9bEC3d06A81d5d169e52a415e3)<br /><br />Production: `0x0b7795E18767259CC253a2dF471db34c72B49516`, Staging: `0x2671994c7D224ac4799ac2cf6Ef9EF187d42C69f` on the following networks:<br />- Sepolia: [Production](https://sepolia.etherscan.io/address/0x0b7795E18767259CC253a2dF471db34c72B49516), [Staging](https://sepolia.etherscan.io/address/0x2671994c7D224ac4799ac2cf6Ef9EF187d42C69f)<br /> |
| [`HooksTrampoline`](periphery/hooks-trampoline)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/hooks-trampoline/blob/main/src/HooksTrampoline.sol) | `0x01DcB88678aedD0C4cC9552B20F4718550250574`<br />- [Ethereum mainnet](https://etherscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574)<br />- [Gnosis chain](https://gnosisscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574)<br/>- [Arbitrum one](https://arbiscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574)<br/>- [Base](https://basescan.org/address/0x01DcB88678aedD0C4cC9552B20F4718550250574)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0x01DcB88678aedD0C4cC9552B20F4718550250574) |
| [`ComposableCoW`](periphery/composable-cow)<br />Upgradeable: No ❎<br />[GitHub](https://github.com/cowprotocol/composable-cow/blob/main/src/ComposableCoW.sol) | `0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74`<br />- [Ethereum mainnet](https://etherscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74)<br />- [Gnosis chain](https://gnosisscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74)<br/>- [Arbitrum one](https://arbiscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74)<br/>- [Base](https://basescan.org/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74)<br/>- [Sepolia](https://sepolia.etherscan.io/address/0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74) |
9 changes: 4 additions & 5 deletions docs/cow-protocol/reference/core/auctions/rewards.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ sidebar_position: 3

The protocol is currently subsidizing the solver competition on all chains it operates on, by rewarding solvers on a weekly basis (currently, every Tuesday) with rewards paid in COW. Solvers are rewarded based on their performance as solvers (i.e., when participating in the standard solver competition) as specified by [CIP-20](https://snapshot.org/#/cow.eth/proposal/0x2d3f9bd1ea72dca84b03e97dda3efc1f4a42a772c54bd2037e8b62e7d09a491f), [CIP-36](https://snapshot.org/#/cow.eth/proposal/0x4e58f9c1208121c0e06282b5541b458bc8c8b76090263e25448848f3194df986), [CIP-38](https://snapshot.org/#/cow.eth/proposal/0xfb81daea9be89f4f1c251d53fd9d1481129b97c6f38caaddc42af7f3ce5a52ec), [CIP-48](https://snapshot.org/#/cow.eth/proposal/0x563ab9a66265ad72c47a8e55f620f927685dd07d4d49f6d1812905c683f05805) and [CIP-57](https://snapshot.box/#/s:cow.eth/proposal/0x46d4fea1492207cf400fcb7a01141a7d4c730791d658cc77236941fc9eb7dccb). Solver rewards for participating in the price estimation competition and providing quotes that are needed for the gas estimates and limit price computations of market orders are specified in [CIP-27](https://snapshot.org/#/cow.eth/proposal/0x64e061568e86e8d2eec344d4a892e4126172b992cabe59a0b24c51c4c7e6cc33) and [CIP-36](https://snapshot.org/#/cow.eth/proposal/0x4e58f9c1208121c0e06282b5541b458bc8c8b76090263e25448848f3194df986).


:::note

For the interested reader, the main source of truth for the weekly payments to solvers is this [Dune dashboard](https://dune.com/cowprotocol/cow-solver-rewards). The dashboard is populated with data aggregated by scripts within the [solver-rewards](https://github.com/cowprotocol/solver-rewards) repository.
Expand Down Expand Up @@ -38,19 +37,18 @@ The payment calculation can result in a negative figure, in which case the solve
:::

The payment is capped from above and below using the function $$\textrm{cap}(x) = \max(-c_l, \min(c_u, x))$$ that is chain-specific, and is determined by the following values:

- Ethereum mainnet and Arbitrum: $$c_l = 0.010 \;\textrm{ETH}$$ and $$c_u = 0.012 \;\textrm{ETH}$$,
- Gnosis Chain: $$c_l = c_u = 10 \;\textrm{xDAI}$$.

Submitted scores that are non-positive will be ignored. If only one solution is submitted, $$\textrm{referenceQuality}$$ is set to zero. Formally, this corresponds to always considering the empty solution which does not settle any trades and has quality zero as part of the submitted solutions.
Submitted scores that are non-positive will be ignored. If only one solution is submitted, $$\textrm{referenceQuality}$$ is set to zero. Formally, this corresponds to always considering the empty solution which does not settle any trades and has quality zero as part of the submitted solutions.

:::note

There is no guarantee that the per-auction rewards are greater than the gas costs of executing a transaction. Hence, solvers cover these costs by adjusting their reported quality. Of course, a solver who adjusts quality downward too aggressively is then at a disadvantage in the auction. The mechanism, therefore, incentivizes the accurate estimation of gas costs.

:::



### Additional solver costs (slippage)

In addition to paying for gas, the winning solver might incur additional costs, such as, for example, negative slippage once a solution is settled on chain. These costs are not an explicit element of the mechanism, but they are relevant in determining the solver's optimal strategy. More precisely, per [CIP-17](https://snapshot.org/#/cow.eth/proposal/0xf9c98a2710dc72c906bbeab9b8fe169c1ed2e9af6a67776cc29b8b4eb44d0fb2), solvers are responsible for managing potential slippage incurred by the settlements they settle. This is a component that affects payouts, but can be treated completely separately, and we do so in [slippage accounting](slippage).
Expand All @@ -75,13 +73,14 @@ a solver wins if and only if $$\textrm{referenceQuality}$$ is such that the solv

The presence of the cap on rewards $$c_u$$, however, makes the problem more complex as it introduces a "first-price auction" logic: if the difference between the best and second-best solution is very large, then the winning solver wins more when it underreports its quality. However, determining the optimal amount of underreporting is very complex, and requires each solver to make strong assumptions regarding the performance of competing solvers.

To summarize, there is a simple strategy that guarantees positive expected profits to solvers. This strategy may not be optimal in uncompetitive auctions when the difference between the best and second best solution may be large. However, in these cases, deriving the optimal strategy is a very complex problem. We conclude by noting that most CoW Protocol batches are very competitive: the cap of on rewards is binding only in about 9% of auctions.
To summarize, there is a simple strategy that guarantees positive expected profits to solvers. This strategy may not be optimal in uncompetitive auctions when the difference between the best and second best solution may be large. However, in these cases, deriving the optimal strategy is a very complex problem. We conclude by noting that most CoW Protocol batches are very competitive: the cap of on rewards is binding only in about 9% of auctions.

## Price estimation competition rewards (CIPs 27, 57)

The price estimation competition is a separate competition where solvers compete to provide the best response to a quote request. Quote requests look almost identical to single-order batch auctions, where there is only one order with a trivial limit price, and solvers propose executions of this order with the goal to maximize "out amount minus gas costs", in the case of a sell request, or minimize "in amount + gas costs" in the case of a buy request.

As specified in [CIP-27](https://snapshot.org/#/cow.eth/proposal/0x64e061568e86e8d2eec344d4a892e4126172b992cabe59a0b24c51c4c7e6cc33), [CIP-36](https://snapshot.org/#/cow.eth/proposal/0x4e58f9c1208121c0e06282b5541b458bc8c8b76090263e25448848f3194df986) and [CIP-57](https://snapshot.box/#/s:cow.eth/proposal/0x46d4fea1492207cf400fcb7a01141a7d4c730791d658cc77236941fc9eb7dccb), solvers that participate in the price estimation competition are rewarded for each order that is within the market price, is associated with a quote that was computed as part of the price estimation competition, and was used in order to compute the limit price of the order. The protocol keeps track of the quote associated with each created order and the corresponding solver that provided the quote. If and when the order gets executed, the solver that provided the quote (which can be different than the solver that ended up executing the order) gets rewarded as follows:

- Ethereum mainnet: $$\min\{0.0006 ~\textrm{ETH}, 6 ~\textrm{COW}\}$$,
- Arbitrum: $$\min\{0.0002 ~\textrm{ETH}, 6 ~\textrm{COW}\}$$,
- Gnosis Chain: $$\min\{0.15 ~\textrm{xDAI}, 6 ~\textrm{COW}\}$$,
Expand Down
1 change: 1 addition & 0 deletions docs/cow-protocol/reference/core/signing_schemes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ For convenience, the domain separator is exposed as a public view function in th
* [Ethereum mainnet](https://etherscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41#readContract#F2)
* [Gnosis chain](https://gnosisscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41#readContract#F2)
* [Arbitrum one](https://arbiscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41#readContract#F2)
* [Base](https://basescan.org/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41#readContract#F2)
* [Sepolia](https://sepolia.etherscan.io/address/0x9008D19f58AAbD9eD0D60971565AA8510560ab41#readContract#F2)

:::
Expand Down
Loading

0 comments on commit 71b00b7

Please sign in to comment.