Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions deployments/dev/42161/deployments.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"addresses": {
"RoleRegistry": "0xf8D1e66850888b97A99c482862211F043E2eC530",
"TopUpSourceFactory": "0xaCC35D469C54b71980E153Ea95296a95045826a1",
"CCTPAdapter": "0xa4e036da438Bd6d866E0484B651d4b2d43eF957F"
}
}

3 changes: 2 additions & 1 deletion deployments/mainnet/42161/deployments.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"addresses": {
"RoleRegistry": "0x55963de88267Aa3D1D995c359e8068D0Df34BEBb",
"TopUpSourceFactory": "0xF4e147Db314947fC1275a8CbB6Cde48c510cd8CF"
"TopUpSourceFactory": "0xF4e147Db314947fC1275a8CbB6Cde48c510cd8CF",
"CCTPAdapter": "0x53a327cce6edd6a887169fa658271ff3588a383e"
}
}
14 changes: 14 additions & 0 deletions output/ConfigureCCTPAdapterArbitrum.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"chainId": "42161",
"safeAddress": "0xa6cf33124cb342d1c604cac87986b965f428aac4",
"meta": {
"txBuilderVersion": "1.16.5"
},
"transactions": [
{
"to": "0xf4e147db314947fc1275a8cbb6cde48c510cd8cf",
"value": "0",
"data": "0x19b86590000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e58310000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000053a327cce6edd6a887169fa658271ff3588a383e000000000000000000000000f4e147db314947fc1275a8cbb6cde48c510cd8cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000006000000000000000000000000028b5a0e9c621a5badaa536219b3a228c8168cf5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d0"
}
]
}
78 changes: 78 additions & 0 deletions scripts/gnosis-txs/ConfigureCCTPAdapterArbitrum.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {stdJson} from "forge-std/StdJson.sol";
import {Test} from "forge-std/Test.sol";

import {Utils} from "../utils/Utils.sol";
import {GnosisHelpers} from "../utils/GnosisHelpers.sol";
import {TopUpFactory} from "../../src/top-up/TopUpFactory.sol";

/**
* @title DeployAndConfigureCCTPAdapterArbitrum
* @notice Configures USDC with CCTP adapter in TopUpFactory on Arbitrum
* @dev Generates Gnosis Safe transaction JSON for configuration
*/
contract DeployAndConfigureCCTPAdapterArbitrum is GnosisHelpers, Utils, Test {

address constant ARBITRUM_USDC = 0xaf88d065e77c8cC2239327C5EDb3A432268e5831;
address constant CCTP_TOKEN_MESSENGER = 0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d;

address constant cashControllerSafe = 0xA6cf33124cb342D1c604cAC87986B965F428AAC4;

function run() public {

vm.createSelectFork("https://arb1.arbitrum.io/rpc");

string memory deployments = readTopUpSourceDeployment();

address topUpFactoryAddress = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "TopUpSourceFactory")
);

address cctpAdapter = stdJson.readAddress(
deployments,
string.concat(".", "addresses", ".", "CCTPAdapter")
);

address[] memory tokens = new address[](1);
TopUpFactory.TokenConfig[] memory tokenConfig = new TopUpFactory.TokenConfig[](1);

tokens[0] = ARBITRUM_USDC;
tokenConfig[0].recipientOnDestChain = topUpFactoryAddress;
tokenConfig[0].maxSlippageInBps = 0;
tokenConfig[0].bridgeAdapter = cctpAdapter;
tokenConfig[0].additionalData = abi.encode(CCTP_TOKEN_MESSENGER, uint256(0), uint32(2000));

string memory chainId = vm.toString(block.chainid);
string memory txs = _getGnosisHeader(chainId, addressToHex(cashControllerSafe));

bytes memory setTokenConfigData = abi.encodeWithSelector(
TopUpFactory.setTokenConfig.selector,
tokens,
tokenConfig
);
string memory setTokenConfigHex = iToHex(setTokenConfigData);

txs = string(abi.encodePacked(
txs,
_getGnosisTransaction(addressToHex(topUpFactoryAddress), setTokenConfigHex, "0", true)
));


vm.writeFile("./output/ConfigureCCTPAdapterArbitrum.json", txs);

executeGnosisTransactionBundle("./output/ConfigureCCTPAdapterArbitrum.json");

TopUpFactory topUpFactory = TopUpFactory(payable(topUpFactoryAddress));
uint256 amount = 1000e6;
deal(ARBITRUM_USDC, address(topUpFactory), amount);
(, uint256 fee) = topUpFactory.getBridgeFee(ARBITRUM_USDC, amount);
deal(address(vm.addr(1)), fee);
vm.prank(address(vm.addr(1)));
topUpFactory.bridge{value: fee}(ARBITRUM_USDC, amount);

}
}

29 changes: 29 additions & 0 deletions scripts/top-up/DeployCCTPAdapterArbitrum.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {Utils} from "../utils/Utils.sol";
import {CCTPAdapter} from "../../src/top-up/bridge/CCTPAdapter.sol";

/**
* @title DeployCCTPAdapterArbitrum
* @notice Deploys CCTP adapter on Arbitrum using CREATE3 for deterministic addresses
* @dev Deployment-only script, configuration is handled separately
*/
contract DeployCCTPAdapterArbitrum is Utils {
CCTPAdapter public cctpAdapter;

function run() public {

vm.startBroadcast();

cctpAdapter = CCTPAdapter(
deployWithCreate3(
abi.encodePacked(type(CCTPAdapter).creationCode),
getSalt(CCTP_ADAPTER)
)
);

vm.stopBroadcast();
}
}

27 changes: 27 additions & 0 deletions test/upgrade-bytecode-verification/CCTPAdapterArbitrum.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import { Test, console } from "forge-std/Test.sol";
import { ContractCodeChecker } from "../../scripts/utils/ContractCodeChecker.sol";

import { CCTPAdapter } from "../../src/top-up/bridge/CCTPAdapter.sol";

contract CCTPAdapterArbitrumVerifyBytecode is ContractCodeChecker, Test {
address cctpAdapterDeployment = 0x53A327cce6eDD6A887169Fa658271ff3588a383e;

function setUp() public {
string memory arbitrumRpc = vm.envString("ARBITRUM_RPC");
if (bytes(arbitrumRpc).length == 0) arbitrumRpc = "https://arb1.arbitrum.io/rpc";
vm.createSelectFork(arbitrumRpc);
}

function test_cctpAdapterArbitrum_verifyBytecode() public {
CCTPAdapter cctpAdapter = new CCTPAdapter();

console.log("-------------- CCTPAdapter ----------------");
emit log_named_address("New deploy", address(cctpAdapter));
emit log_named_address("Verifying contract", address(cctpAdapterDeployment));
verifyContractByteCodeMatch(address(cctpAdapterDeployment), address(cctpAdapter));
}
}

Loading