diff --git a/docs/cow-protocol/reference/contracts/core/README.mdx b/docs/cow-protocol/reference/contracts/core/README.mdx
index a4a28369c..47527bd8f 100644
--- a/docs/cow-protocol/reference/contracts/core/README.mdx
+++ b/docs/cow-protocol/reference/contracts/core/README.mdx
@@ -44,9 +44,9 @@ Take care when [signing](../core/signing-schemes), ensuring that the `EIP-712` d
| **Contracts** | **Address / Chains** |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| [`GPv2Settlement`](core/settlement)
Upgradeable: No ❎
[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2Settlement.sol) | `0x9008D19f58AAbD9eD0D60971565AA8510560ab41`
{explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","Plasma","Lens","Linea","BNB","Sepolia"], "0x9008D19f58AAbD9eD0D60971565AA8510560ab41", {separator:
})} |
-| [`GPv2AllowListAuthentication`](core/allowlist)
Upgradeable: Yes ⚠️
[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2AllowListAuthentication.sol) | `0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE`
{explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","Plasma","Lens","Linea","BNB","Sepolia"], "0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE", {separator:
})} |
-| [`GPv2VaultRelayer`](core/vault-relayer)
Upgradeable: No ❎
[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2VaultRelayer.sol) | `0xC92E8bdf79f0507f65a392b0ab4667716BFE0110`
{explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","Plasma","Lens","Linea","BNB","Sepolia"], "0xC92E8bdf79f0507f65a392b0ab4667716BFE0110", {separator:
})} |
+| [`GPv2Settlement`](core/settlement)
Upgradeable: No ❎
[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2Settlement.sol) | `0x9008D19f58AAbD9eD0D60971565AA8510560ab41`
{explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","Plasma","Lens","Linea","BNB","Ink","Sepolia"], "0x9008D19f58AAbD9eD0D60971565AA8510560ab41", {separator:
})} |
+| [`GPv2AllowListAuthentication`](core/allowlist)
Upgradeable: Yes ⚠️
[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2AllowListAuthentication.sol) | `0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE`
{explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","Plasma","Lens","Linea","BNB","Ink","Sepolia"], "0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE", {separator:
})} |
+| [`GPv2VaultRelayer`](core/vault-relayer)
Upgradeable: No ❎
[GitHub](https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2VaultRelayer.sol) | `0xC92E8bdf79f0507f65a392b0ab4667716BFE0110`
{explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","Plasma","Lens","Linea","BNB","Ink","Sepolia"], "0xC92E8bdf79f0507f65a392b0ab4667716BFE0110", {separator:
})} |
Upgradeable allow-list
diff --git a/docs/cow-protocol/reference/contracts/periphery/README.mdx b/docs/cow-protocol/reference/contracts/periphery/README.mdx
index 0bccf89dd..7bc7319ef 100644
--- a/docs/cow-protocol/reference/contracts/periphery/README.mdx
+++ b/docs/cow-protocol/reference/contracts/periphery/README.mdx
@@ -14,8 +14,8 @@ Peripheral contracts are those that are not necessary for CoW Protocol to functi
| Environment | Address | Networks |
| ------------------------ | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Production (most chains) | `0xbA3cB449bD2B4ADddBc894D8697F5170800EAdeC` | {explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","BNB","Linea","Plasma","Sepolia"], "0xbA3cB449bD2B4ADddBc894D8697F5170800EAdeC")}, but not Lens! |
-| Staging (most chains) | `0x04501b9b1D52e67f6862d157E00D13419D2D6E95` | {explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","BNB","Linea","Plasma","Sepolia"], "0x04501b9b1D52e67f6862d157E00D13419D2D6E95")}, but not Lens! |
+| Production (most chains) | `0xbA3cB449bD2B4ADddBc894D8697F5170800EAdeC` | {explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","BNB","Linea","Plasma","Ink","Sepolia"], "0xbA3cB449bD2B4ADddBc894D8697F5170800EAdeC")}, but not Lens! |
+| Staging (most chains) | `0x04501b9b1D52e67f6862d157E00D13419D2D6E95` | {explorerLinks(["Ethereum","Gnosis","Arbitrum One","Base","Avalanche","Polygon","BNB","Linea","Plasma","Ink","Sepolia"], "0x04501b9b1D52e67f6862d157E00D13419D2D6E95")}, but not Lens! |
| Production (Lens) | `0x5A5b8aE7a0b4C0EAf453d10DCcfbA413f07ebdC2` | {explorerLinks("Lens", "0x5A5b8aE7a0b4C0EAf453d10DCcfbA413f07ebdC2")} only! |
| Staging (Lens) | `0xFb337f8a725A142f65fb9ff4902d41cc901de222` | {explorerLinks("Lens", "0xFb337f8a725A142f65fb9ff4902d41cc901de222")} only! |
@@ -43,18 +43,19 @@ You should not assume that the HooksTrampoline contract address will remain fixe
#### Networks
{explorerLinks([
-"Ethereum",
-"Sepolia",
-"Gnosis",
-"Base",
"Arbitrum One",
"Avalanche",
-"Polygon",
-"Lens",
+"Base",
"BNB",
+"Ethereum",
+"Gnosis",
+"Ink"
+"Lens",
"Linea",
-"Plasma",
"Optimism"
+"Plasma",
+"Polygon",
+"Sepolia",
], "0x60Bf78233f48eC42eE3F101b9a05eC7878728006")}
@@ -69,16 +70,17 @@ You should not assume that the HooksTrampoline contract address will remain fixe
**Networks**:
{explorerLinks([
-"Ethereum",
-"Gnosis",
"Arbitrum One",
-"Base",
"Avalanche",
-"Polygon",
-"Lens",
+"Base",
"BNB",
+"Ethereum",
+"Gnosis",
+"Ink",
+"Lens",
"Linea",
"Plasma",
+"Polygon",
"Sepolia",
], "0xfdaFc9d1902f4e0b84f65F49f244b32b31013b74")}
diff --git a/docs/cow-protocol/reference/core/auctions/rewards.md b/docs/cow-protocol/reference/core/auctions/rewards.md
index 9cecd290c..2d51741ca 100644
--- a/docs/cow-protocol/reference/core/auctions/rewards.md
+++ b/docs/cow-protocol/reference/core/auctions/rewards.md
@@ -39,7 +39,7 @@ 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))$$, where $$c_u$$ is the protocol fee (excluding partner fees) that the protocol earned from the trades in all solutions supplied by the solver in that auction and $$c_l$$ is chain-specific, determined by the following values:
-- Ethereum mainnet, Arbitrum, and Base chain: $$0.010 \;\textrm{ETH}$$
+- Ethereum mainnet, Arbitrum, Base and Ink chain: $$0.010 \;\textrm{ETH}$$
- Gnosis Chain: $$10 \;\textrm{xDAI}$$
- Avalanche: $$0.3 \;\textrm{AVAX}$$
- Polygon: $$30 \;\textrm{POL}$$
@@ -97,5 +97,6 @@ The current rewards for eligible quotes are as follows:
- BNB Chain: $$\min\{0.001 ~\textrm{BNB}, 6 ~\textrm{COW}\}$$
- Linea: $$\min\{0.00003 ~\textrm{ETH}, 6 ~\textrm{COW}\}$$.
- Plasma: $$\min\{0.6 ~\textrm{XPL}, 6 ~\textrm{COW}\}$$.
+- Ink: $$\min\{X.X ~\textrm{XPL}, 6 ~\textrm{COW}\}$$.
where, again, the conversion from native token to COW is done by using an up-to-date price (specifically, the average native token/COW Dune prices of the past 24h before the payout are used to determine these exchange rates).
diff --git a/docs/cow-protocol/reference/core/signing_schemes.mdx b/docs/cow-protocol/reference/core/signing_schemes.mdx
index cce5f728f..002b444fc 100644
--- a/docs/cow-protocol/reference/core/signing_schemes.mdx
+++ b/docs/cow-protocol/reference/core/signing_schemes.mdx
@@ -37,16 +37,17 @@ The actual domain separator is the result of hashing the previous `EIP712Domain`
For convenience, the domain separator is exposed as a public view function in the settlement contract:
{explorerLinks([
-"Ethereum",
-"Gnosis",
"Arbitrum One",
-"Base",
"Avalanche",
-"Polygon",
-"Lens",
+"Base",
"BNB",
+"Ethereum",
+"Gnosis",
+"Ink",
+"Lens",
"Linea",
"Plasma",
+"Polygon",
"Sepolia",
], "0x9008D19f58AAbD9eD0D60971565AA8510560ab41", {separator:
, urlTrailing: "#readContract#F2"})}
@@ -136,6 +137,7 @@ For convenience, we also deployed a small helper contract that makes it easy to
- BNB N/A
- Linea N/A
- Plasma N/A
+- Ink N/A
- {explorerLinks("Sepolia", "0x59Ffd6c1823F212D49887230f155A35451FdDbfa", {urlTrailing: "#readContract#F1"})}
## Supported schemes
diff --git a/docs/cow-protocol/tutorials/cow-swap/custom-links.md b/docs/cow-protocol/tutorials/cow-swap/custom-links.md
index 6846a4494..e5a6eb9bc 100644
--- a/docs/cow-protocol/tutorials/cow-swap/custom-links.md
+++ b/docs/cow-protocol/tutorials/cow-swap/custom-links.md
@@ -78,6 +78,7 @@ Native and wrapped tokens per chain:
- BNB: [`WBNB`](https://bscscan.com/address/0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c) - wrapped `BNB`
- Linea: [`WETH`](https://lineascan.build/token/0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f) - wrapped `ETH`
- Plasma: [`WXPL`](https://plasmascan.to/token/0x6100E367285b01F48D07953803A2d8dCA5D19873) - wrapped `XPL`
+- Ink: [`WETH`](https://explorer.inkonchain.com/token/0x4200000000000000000000000000000000000006) - wrapped `ETH`
- Sepolia: [`WETH`](https://sepolia.etherscan.io/address/0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14) - wrapped `ETH`
:::
diff --git a/docs/cow-protocol/tutorials/solvers/local_test.md b/docs/cow-protocol/tutorials/solvers/local_test.md
index 05f254230..cd879603b 100644
--- a/docs/cow-protocol/tutorials/solvers/local_test.md
+++ b/docs/cow-protocol/tutorials/solvers/local_test.md
@@ -66,5 +66,7 @@ Once the above are set up and running, one can then start testing their solver e
| | Linea | Production |
| | Plasma | Staging |
| | Plasma | Production |
+| | Ink | Staging |
+| | Ink | Production |
| | Sepolia | Staging |
| | Sepolia | Production |
diff --git a/docs/governance/token.md b/docs/governance/token.md
index b16f01a77..388bba8f5 100644
--- a/docs/governance/token.md
+++ b/docs/governance/token.md
@@ -22,6 +22,7 @@ At the core of CoW Protocol lies the COW token, which serves as a governance tok
| BNB | N/A |
| Linea | N/A |
| Plasma | N/A |
+| Ink | N/A |
[^bridgedTokens]:
These contracts were not developed nor deployed by CoW DAO, however, they are the bridged versions of the canonical token from Ethereum, using the official bridges.
@@ -41,6 +42,7 @@ At the core of CoW Protocol lies the COW token, which serves as a governance tok
| BNB | N/A |
| Linea | N/A |
| Plasma | N/A |
+| Ink | N/A |
## Supply & Inflation Schedule
diff --git a/src/components/contract-addresses/index.tsx b/src/components/contract-addresses/index.tsx
index dd7d7e7ed..6874cc07d 100644
--- a/src/components/contract-addresses/index.tsx
+++ b/src/components/contract-addresses/index.tsx
@@ -14,8 +14,11 @@ export const explorerByChain = {
"Linea": "https://lineascan.build",
"Plasma": "https://plasmascan.to",
"Optimism": "https://optimistic.etherscan.io",
+ "Ink": "https://explorer.inkonchain.com",
} as const;
+export type ChainName = keyof typeof explorerByChain;
+
interface ExplorerUrlOptions {
/**
* Which parameters to append after the Explorer URL. For example, #code
@@ -23,7 +26,7 @@ interface ExplorerUrlOptions {
*/
urlTrailing?: string | undefined,
}
-export function explorerUrl(chain: string, address: string, params?: ExplorerUrlOptions) {
+export function explorerUrl(chain: ChainName, address: string, params?: ExplorerUrlOptions) {
const urlTrailing = params?.urlTrailing ?? "";
if (!(chain in explorerByChain)) {
throw new Error(`Explorer URL for chain ${chain} is not known`);
@@ -49,8 +52,8 @@ interface ExplorerLinksOptions {
* chains separated by a comma. All chain names are links to that chain's
* explorer for the given address.
*/
-export function explorerLinks(chains: string[] | string, address: string, options?: ExplorerLinksOptions): React.ReactNode {
- chains = (typeof chains == "string") ? [chains] : chains;
+export function explorerLinks(chainsParam: ChainName[] | ChainName, address: string, options?: ExplorerLinksOptions): React.ReactNode {
+ const chains = asArray(chainsParam);
const separator = options?.separator ?? ", ";
const urlTrailing = options?.urlTrailing ?? "#code";
return chains.reduce(
@@ -63,3 +66,7 @@ export function explorerLinks(chains: string[] | string, address: string, option
}
, []);
}
+
+function asArray(arr: T | T[]): T[] {
+ return Array.isArray(arr) ? arr : [arr];
+}
\ No newline at end of file