Skip to content

Commit

Permalink
refactor: clean up the bridge routes library
Browse files Browse the repository at this point in the history
  • Loading branch information
fluffywaffles committed Jun 7, 2024
1 parent 9087095 commit 907ca6f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 64 deletions.
110 changes: 47 additions & 63 deletions src/builder/BridgeRoutes.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,99 +2,83 @@
pragma solidity ^0.8.23;

import {CCTPBridgeActions} from "../BridgeScripts.sol";

import "./Strings.sol";

library BridgeRoutes {
enum BridgeType {
NONE,
CCTP
}

error BridgeNotFound(uint256 srcChainId, uint256 dstChainId, string assetSymbol);

struct Bridge {
uint256 chainId;
address bridgeAddress;
BridgeType bridgeType;
}

function hasBridge(uint256 srcChainId, uint256 dstChainId, string memory assetSymbol)
function canBridge(uint256 srcChainId, uint256 dstChainId, string memory assetSymbol)
internal
pure
returns (bool)
{
if (getBridge(srcChainId, dstChainId, assetSymbol).bridgeType == BridgeType.NONE) {
return false;
} else {
return true;
}
}

// TODO: actually consider dstChainId before returning a bridge?
// TODO: resolve assetSymbol to address before trying to bridge?
// TODO: how do we represent the constant information about existing bridges? without mappings, etc.
function getBridge(uint256 srcChainId, uint256 /*dstChainId*/, string memory assetSymbol)
internal
pure
returns (Bridge memory bridge)
{
if (CCTP.canBridge(srcChainId, assetSymbol)) {
bridge = Bridge({
chainId: srcChainId,
bridgeAddress: CCTP.knownbridgeAddress(srcChainId),
bridgeType: BridgeType.CCTP
});
}
return CCTP.canBridge(srcChainId, dstChainId, assetSymbol);
}
}

// NOTE: this library would be generated by a network crawler script.
library CCTP {
// IDEA: input this into codegen, get out knownDomainId and knownbridgeAddress functions?
struct Roots {
error NoKnownBridge(string bridgeType, uint256 srcChainId);
error NoKnownDomainId(string bridgeType, uint256 dstChainId);

struct CCTPChain {
uint256 chainId;
uint256 domainId;
address bridgeAddress;
uint32 domainId;
address bridge;
}

error NoKnownBridge(string bridgeType, uint256 chainId);
error NoKnownDomainId(string bridgeType, uint256 chainId);
function knownChains() internal pure returns (CCTPChain[] memory) {
CCTPChain[] memory chains = new CCTPChain[](2);
chains[0] = CCTPChain({chainId: 1, domainId: 0, bridge: 0xBd3fa81B58Ba92a82136038B25aDec7066af3155});
chains[1] = CCTPChain({chainId: 8453, domainId: 6, bridge: 0x1682Ae6375C4E4A97e4B583BC394c861A46D8962});
return chains;
}

function knownDomainId(uint256 chainId) internal pure returns (uint32) {
if (chainId == 1) {
return 0;
} else if (chainId == 8453) {
return 6;
} else {
revert NoKnownDomainId("CCTP", chainId);
function knownChain(uint256 chainId) internal pure returns (CCTPChain memory found) {
CCTPChain[] memory cctpChains = knownChains();
for (uint256 i = 0; i < cctpChains.length; ++i) {
if (cctpChains[i].chainId == chainId) {
return found = cctpChains[i];
}
}
}

function knownbridgeAddress(uint256 chainId) internal pure returns (address) {
if (chainId == 1) {
return 0xBd3fa81B58Ba92a82136038B25aDec7066af3155;
} else if (chainId == 8453) {
return 0x1682Ae6375C4E4A97e4B583BC394c861A46D8962;
function canBridge(uint256 srcChainId, uint256 dstChainId, string memory assetSymbol) internal pure returns (bool) {
return Strings.stringEqIgnoreCase(assetSymbol, "USDC")
&& knownChain(srcChainId).bridge != address(0)
&& knownChain(dstChainId).chainId == dstChainId;
}

function knownDomainId(uint256 dstChainId) internal pure returns (uint32) {
CCTPChain memory chain = knownChain(dstChainId);
if (chain.chainId != 0) {
return chain.domainId;
} else {
revert NoKnownBridge("CCTP", chainId);
revert NoKnownDomainId("CCTP", dstChainId);
}
}

function canBridge(uint256 chainId, string memory assetSymbol) internal pure returns (bool) {
return Strings.stringEqIgnoreCase(assetSymbol, "USDC")
&& knownbridgeAddress(chainId) != address(0);
function knownBridge(uint256 srcChainId) internal pure returns (address) {
CCTPChain memory chain = knownChain(srcChainId);
if (chain.bridge != address(0)) {
return chain.bridge;
} else {
revert NoKnownBridge("CCTP", srcChainId);
}
}

function encodeBridgeUSDC(
uint256 originChainId,
uint256 destChainId,
uint256 amount,
address recipient,
address usdc
address usdcAddress
) internal pure returns (bytes memory) {
return abi.encodeCall(
CCTPBridgeActions.bridgeUSDC,
(knownbridgeAddress(originChainId), amount, knownDomainId(destChainId), bytes32(uint256(uint160(recipient))), usdc)
return abi.encodeWithSelector(
CCTPBridgeActions.bridgeUSDC.selector,
knownBridge(originChainId),
amount,
knownDomainId(destChainId),
bytes32(uint256(uint160(recipient))),
usdcAddress
);
}
}
2 changes: 1 addition & 1 deletion src/builder/QuarkBuilder.sol
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ contract QuarkBuilder {
chainAccountsList[i].assetPositionsList
);
for (uint256 j = 0; j < positions.accountBalances.length; ++j) {
if (BridgeRoutes.hasBridge(chainAccountsList[i].chainId, transferInput.chainId, transferInput.assetSymbol)) {
if (BridgeRoutes.canBridge(chainAccountsList[i].chainId, transferInput.chainId, transferInput.assetSymbol)) {
aggregateTransferAssetAvailableBalance += positions.accountBalances[j].balance;
}
}
Expand Down

0 comments on commit 907ca6f

Please sign in to comment.