(Deprecated)
# Before the upgrade
Caller: BridgeRouterOwner `0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6` (same as the bridge owner)
```
router.setRoute(DAI,address(XDaiBridgePeripheralForDaiPreUsdsUpgrade));
router.setRoute(USDS,address(XDaiBridgePeripheralForUsdsPreUsdsUpgrade));
```
### Relay tokens
```mermaid
graph TD
User([User]) -->|"relayTokens: DAI"| BridgeRouter
User -->|"relayTokens: USDS"| BridgeRouter
User -->|"relayTokens: Other ERC20"| BridgeRouter
User -->|"relayTokens: ETH"| BridgeRouter
subgraph "BridgeRouter Contract"
BridgeRouter[BridgeRouter]
end
subgraph "Pre-Upgrade Peripherals"
DaiPeripheral[XDaiBridgePeripheralForDaiPreUsdsUpgrade]
UsdsPeripheral[XDaiBridgePeripheralForUsdsPreUsdsUpgrade]
end
BridgeRouter -->|DAI| DaiPeripheral
BridgeRouter -->|USDS| UsdsPeripheral
BridgeRouter -->|Other ERC20| OmniBridge[Foreign OmniBridge]
BridgeRouter -->|ETH| WETHRouter[WETH OmniBridge Router]
DaiPeripheral --> XDaiForeignBridge
UsdsPeripheral -->|"Convert USDS to DAI"| XDaiForeignBridge
subgraph "Omnibridge contract"
OmniBridge --> OmniBridgeHome[Mint bridged token on Gnosis Chain]
WETHRouter --> OmniBridgeHome
end
subgraph "XDaiForeignBridge Contract (Pre-Upgrade)"
XDaiForeignBridge[XDaiForeignBridge] -->|"DAI as collateral"| GnosisChain[Mint xDAI on Gnosis Chain]
end
```
### To claim token
```mermaid
graph TD
subgraph "BridgeRouter Contract"
BridgeRouter[BridgeRouter]
end
subgraph "XDaiForeignBridge Contact"
XDaiForeignBridge[XDaiForeignBridge] -->|DAI as collateral| GnosisChain[unlock DAI to recipient]
end
subgraph "ForeignAMB Contract"
ForeignAMB[ForeignAMB] --> Action[Unlock token to recipient]
end
%% For claim operations (pre-upgrade)
User -->|executeSignatures| BridgeRouter
User -.->|revert executeSignaturesUSDS| BridgeRouter
User -->|safeExecuteSignaturesWithAutoGasLimit| BridgeRouter
BridgeRouter -->|executeSignatures| XDaiForeignBridge
BridgeRouter -->|safeExecuteSignaturesWithAutoGasLimit| ForeignAMB[Foreign AMB]
```
Relay DAI
1. DAI.approve(BridgeRouter, amount)
-> [BridgeRouter.relayTokens(DAI, receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L44)
-> [XDaiBridgePeripheralForDaiPreUsdsUpgrade.relayTokens(receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/XDaiBridgePeripheralForDaiPreUsdsUpgrade.sol#L36)
-> [xDAIForeignBridge.relayTokens(receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/xdaibridge/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol#L64)
Claim DAI:
1. [BridgeRouter.executeSignatures(message, signatures)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L81)
-> [xDAIForeignBridge.executeSignatures(message, signatures)](https://github.com/gnosischain/tokenbridge-contracts/blob/xdaibridge/contracts/upgradeable_contracts/BasicForeignBridge.sol#L22)
-> (internal) [onExecuteMessage](https://github.com/gnosischain/tokenbridge-contracts/blob/xdaibridge/contracts/upgradeable_contracts/erc20_to_native/XDaiForeignBridge.sol#L80-L91) |Here is where the DAI is transferred
Relay USDS:
1. USDS.approve(BridgeRouter, amount)
-> [BridgeRouter.relayTokens(USDS, receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L47)
-> [XDaiBridgePeripheralForUsdsPreUsdsUpgrade.relayTokens(receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/XDaiBridgePeripheralForUsdsPreUsdsUpgrade.sol#L36) |Here is where USDS is swap to DAI
-> [xDAIForeignBridge.relayTokens(receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/xdaibridge/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol#L64)
Claim USDS:
1. [BridgeRouter.executeSignaturesUSDS(message,signatures)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L105-L109)
-> revert
XDaiForeignBridge's current implementation: https://etherscan.io/address/0x166124b75c798cedf1b43655e9b5284ebd5203db
Code: https://github.com/gnosischain/tokenbridge-contracts/tree/xdaibridge/contracts/upgradeable_contracts/erc20_to_native
# Upgrade
```mermaid
graph TD
subgraph "Upgrade Step 2"
UpgradeBundledTx[Execute BundledSafeTx by bridge governors]
UpgradeBundledTx -->|Disable interest for DAI, Enable interest for USDS| XDaiForeignBridge
UpgradeBundledTx -->|Set USDS as collateral token| XDaiForeignBridge
UpgradeBundledTx -->|Set DAI route| BridgeRouter --> |DAI| XDaiBridgePeripheral
UpgradeBundledTx -->|Set USDS route| BridgeRouter --> |USDS| XDaiForeignBridge
end
subgraph "Pre upgrade configuration"
PreConfig[Pre-Upgrade Configuration]
PreConfig -->|Set DAI route to| BridgeRouterPreUpgrade[BridgeRouter] -->|DAI| DaiPeripheralPre[XDaiBridgePeripheralForDaiPreUsdsUpgrade]
PreConfig -->|Set USDS route to| BridgeRouterPreUpgrade[BridgeRouter] -->|USDS |UsdsPeripheralPre[XDaiBridgePeripheralForUsdsPreUsdsUpgrade]
PreConfig -->|DAI as collateral| XDaiForeignBridgeDaiCollateral[XDaiForeignBridge]
end
PreConfig -->|Upgrade| UpgradeBundledTx
```
Test for the upgrade is written in [here](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/test/foundry/BridgeRouter.t.sol#L531-L537)
## Function calls during the proxy upgrade
>> The function calls during the upgrade is a bundled Safe transaction, that will be signed by [bridge governors](https://docs.gnosischain.com/bridges/management/#bridge-governance).
### Call on xDAI Foreign Bridge contract
BRIDGE_PROXY=`0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016`
Caller: Bridge Owner `0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6`
```solidity
uint256 initialVersion = 8
address newImpl = # TODO: deploy
bridgeProxy.upgradeTo(initialVersion + 1, address(newImpl));
// disable interested for DAI and swap sDAI -> sUSDS
bridgeProxy.swapSDAIToUSDS();
bridgeProxy.initializeInterest(
address(USDS): 0xdC035D45d973E3EC169d2276DDab16f1e407384F,
minCashThreshold: 1000000000000000000000000,
minInterestPaid: 1000000000000000000000,
gnosisInterestReceiver: 0x670daeaF0F1a5e336090504C68179670B5059088
);
bridgeProxy.invest(address(USDS));
```
### Update routes on BridgeRouter
Caller: BridgeRouterOwner `0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6` (same as the bridge owner)
ROUTER_ADDRESS= # TODO deploy
XDAI_BRIDGE_PERIPHERAL= # TODO deploy
XDAI_FOREIGNBRIDGE_PROXY=`0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016`
```solidity
router.setRoute(address(DAI), address(xDAIBridgeperipheral));
router.setRoute(address(USDS), xDAIForeignBridgeProxy);
```
# After the upgrade
### Relay token
```mermaid
graph TD
User([User]) -->|"relayTokens: DAI"| BridgeRouter
User -->|"relayTokens: USDS"| BridgeRouter
User -->|"relayTokens: Other ERC20"| BridgeRouter
User -->|"relayTokens: ETH"| BridgeRouter
subgraph "BridgeRouter Contract"
BridgeRouter[BridgeRouter]
end
subgraph "Post-Upgrade Peripheral"
UsdsPeripheral[XDaiBridgePeripheral]
end
BridgeRouter -->|DAI| UsdsPeripheral
BridgeRouter -->|USDS| XDaiForeignBridge
BridgeRouter -->|Other ERC20| OmniBridge[Foreign OmniBridge]
BridgeRouter -->|ETH| WETHRouter[WETH OmniBridge Router]
UsdsPeripheral -->|"Convert DAI to USDS"| XDaiForeignBridge
subgraph "Omnibridge contract"
OmniBridge --> OmniBridgeHome[Mint bridged token on Gnosis Chain]
WETHRouter --> OmniBridgeHome
end
subgraph "XDaiForeignBridge Contract (Post-Upgrade)"
XDaiForeignBridge[XDaiForeignBridge] -->|"USDS as collateral"| GnosisChain[Mint xDAI on Gnosis Chain]
end
```
### To claim token
```mermaid
graph TD
subgraph "BridgeRouter Contract"
BridgeRouter[BridgeRouter]
end
subgraph "XDaiForeignBridge Contact"
XDaiForeignBridge[XDaiForeignBridge] -->|exeucteSignatures| DAI[unlock DAI to recipient]
XDaiForeignBridge[XDaiForeignBridge] -->|exeucteSignaturesUSDS| Ethereum[unlock USDS to recipient]
end
subgraph "ForeignAMB Contract"
ForeignAMB[ForeignAMB] --> Action[Unlock token to recipient]
end
%% For claim operations (pre-upgrade)
User -->|executeSignatures| BridgeRouter
User -->|executeSignaturesUSDS| BridgeRouter
User -->|safeExecuteSignaturesWithAutoGasLimit| BridgeRouter
BridgeRouter -->|executeSignatures| XDaiForeignBridge
BridgeRouter -->|executeSignaturesUSDS| XDaiForeignBridge
BridgeRouter -->|safeExecuteSignaturesWithAutoGasLimit| ForeignAMB[Foreign AMB]
```
Relay DAI:
1. DAI.approve(BridgeRouter, amount)
-> [BridgeRouter.relayTokens(DAI, receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L44)
-> [XDaiBridgePeripheral.relayTokens(receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/XDaiBridgePeripheral.sol#L35)
-> [xDAIForeignBridge.relayTokens(receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol#L64)
Claim DAI:
1. [BridgeRouter.executeSignatures(message, signatures)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L85)
-> [xDAIForeignBridge.executeSignatures(message, signatures)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/BasicForeignBridge.sol#L22)
-> (internal)[onExecuteMessage](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/XDaiForeignBridge.sol#L146-L156) |Here is where USDS is swap to DAI
Relay USDS:
1. USDS.approve(bridgeRouter, amount)
-> [BridgeRouter.relayTokens(USDS, receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L47)
-> [xDAIForeignBridge.relayTokens(receiver, amount)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol#L64)
Claim USDS:
1. [BridgeRouter.executeSignaturesUSDS(message, signatures)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/BridgeRouter.sol#L111)
-> [xDAIForeigbBridge.executeSignaturesUSDS(message,signatures)](https://github.com/gnosischain/tokenbridge-contracts/blob/feat/xdai-usds-migration/contracts/upgradeable_contracts/erc20_to_native/XDaiForeignBridge.sol#L113)