Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/buildonpolygon/zkevm-dai
Polygon zkEVM's DAI Bridge
https://github.com/buildonpolygon/zkevm-dai
erc20 ethereum polygon-zkevm smart-contracts
Last synced: 1 day ago
JSON representation
Polygon zkEVM's DAI Bridge
- Host: GitHub
- URL: https://github.com/buildonpolygon/zkevm-dai
- Owner: BuildOnPolygon
- Created: 2023-07-14T10:21:09.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-05-10T10:42:33.000Z (8 months ago)
- Last Synced: 2024-05-10T11:36:32.803Z (8 months ago)
- Topics: erc20, ethereum, polygon-zkevm, smart-contracts
- Language: Solidity
- Homepage:
- Size: 496 KB
- Stars: 2
- Watchers: 3
- Forks: 3
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Audit: audit/Polygon_Technology__Aug23Public.pdf
Awesome Lists containing this project
README
## Polygon zkEVM DAI Bridge
### Introduction
Native DAI implementation is consist of two smart contracts:
1. **L1Escrow**: This contract is deployed on Ethereum mainnet and interact
directly with Spark protocol.
2. **L2Dai**: This contract is deployed on Polygon zkEVM.With Native DAI, user can do the following:
1. Bridge DAI from Ethereum mainnet to Polygon zkEVM via `L1Escrow` contract.
2. Bridge DAI from Polygon zkEVM to Ethereum mainnet via `L2Dai` contract.## Get started
### Requirements
This repository is using foundry. You can install foundry via
[foundryup](https://book.getfoundry.sh/getting-started/installation).### Setup
Clone the repository:
```sh
git clone [email protected]:pyk/zkevm-dai.git
cd zkevm-dai/
```Install the dependencies:
```sh
forge install
```### Tests
Create `.env` with the following contents:
```
ETH_RPC_URL=""
ZKEVM_RPC_URL="https://zkevm-rpc.com"
ETHERSCAN_API_KEY=""
```Use the following command to run the test:
```sh
forge test
```You can also run individual test using the following command:
```sh
forge test --fork-url $ETH_RPC_URL --match-test testSendExcessYield -vvvvforge test --fork-url "https://zkevm-rpc.com" --match-path test/L2Dai.t.sol --match-test testBridgeWithMockedBridge -vvvv
```> **Note**
> You can set `ETHERSCAN_API_KEY` to helps you debug the call trace.## Deployment
Use the following command to deploy on Goerli:
```sh
forge script ...
```## Contract addresses
| Smart contract | Network | Address |
| -------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| DAI | Mainnet | [0x6B175474E89094C44Da98b954EedeAC495271d0F](https://etherscan.io/address/0x6B175474E89094C44Da98b954EedeAC495271d0F) |
| sDAI | Mainnet | [0x83f20f44975d03b1b09e64809b757c47f942beea](https://etherscan.io/token/0x83f20f44975d03b1b09e64809b757c47f942beea#code) |
| Polygon ZkEVM Bridge | Mainnet | [0x2a3dd3eb832af982ec71669e178424b10dca2ede](https://etherscan.io/address/0x2a3dd3eb832af982ec71669e178424b10dca2ede) |
| | zkEVM Mainnet | [0x2a3dd3eb832af982ec71669e178424b10dca2ede](https://zkevm.polygonscan.com/address/0x2a3dd3eb832af982ec71669e178424b10dca2ede) |
| L1Escrow | Mainnet | [0x4a27ac91c5cd3768f140ecabde3fc2b2d92edb98](https://etherscan.io/address/0x4a27ac91c5cd3768f140ecabde3fc2b2d92edb98) |
| L2Dai | zkEVM Mainnet | [0x744c5860ba161b5316f7e80d9ec415e2727e5bd5](https://zkevm.polygonscan.com/address/0x744c5860ba161b5316f7e80d9ec415e2727e5bd5) |## Testnet Contract addresses
| Smart contract | Network | Address |
| -------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| DAI | Goerli | [0x11fE4B6AE13d2a6055C8D9cF65c55bac32B5d844](https://goerli.etherscan.io/address/0x11fE4B6AE13d2a6055C8D9cF65c55bac32B5d844) |
| sDAI | Goerli | [0xD8134205b0328F5676aaeFb3B2a0DC15f4029d8C](https://goerli.etherscan.io/address/0xD8134205b0328F5676aaeFb3B2a0DC15f4029d8C) |
| Polygon ZkEVM Bridge | Goerli | [0xF6BEEeBB578e214CA9E23B0e9683454Ff88Ed2A7](https://goerli.etherscan.io/address/0xF6BEEeBB578e214CA9E23B0e9683454Ff88Ed2A7) |
| | zkEVM Testnet | [0xF6BEEeBB578e214CA9E23B0e9683454Ff88Ed2A7](https://testnet-zkevm.polygonscan.com/address/0xF6BEEeBB578e214CA9E23B0e9683454Ff88Ed2A7) |
| L1Escrow | Goerli | [0x2929b2635E51f2dA1373A76F166A237322694fA6](https://goerli.etherscan.io/address/0x2929b2635E51f2dA1373A76F166A237322694fA6) |
| L2Dai | zkEVM Testnet | [0x755CB8A808c99706afAA34547204f17cD33C6316](https://testnet-zkevm.polygonscan.com/address/0x755CB8A808c99706afAA34547204f17cD33C6316#code) |## Known Issues
### Rounding Issue
When we deposit `x` amount of DAI to sDAI, we will get `y` amount of sDAI based
on the current exchange rate `r`. Due to how `y` is rounded down by sDAI, there
is possibility that when we redeem `y` amount of sDAI we will get `x' = x - 1`
amount of DAI.For, example:
```solidity
uint256 x = 1000000000000000001;
uint256 y = sdai.deposit(x);
uint255 x_ = sdai.redeem(y); // x_ = 1000000000000000000
```> **Note**
> See [sDAI.t.sol](./test/sDAI.t.sol) for more details.Ofcourse, `r` will be increased over time and this 1 wei will be covered.
To make sure that bridged DAI is always 1:1, it is advised to donate small
amount of DAI on `L1Escrow` on the first time it get deployed (e.g. 0.01 DAI).`sendExcessYield` will send excess yield if the total yield is more than
0.05 DAI and will leave 0.01 DAI from the yield in L1Escrow.### Locked DAI in L1Escrow may greater than totalProtocolDAI
Currently there is no way to check the maximum deposit amount of sDAI.
`sdai.maxDeposit(address)` is hardcoded to `type(uint256).max`.`sdai.deposit(amount, recipient)` may reverted and it is possible that total
amount of locked DAI in the `L1Escrow` is greater than the specified
`totalProtocolDAI`.