Skip to content

Commit

Permalink
match some new codes with arbitrum pr
Browse files Browse the repository at this point in the history
  • Loading branch information
Hans Wang committed Jul 11, 2023
1 parent 931bd96 commit d468c9f
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 52 deletions.
12 changes: 10 additions & 2 deletions deployments/arbitrum-goerli/usdc.n/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,14 @@ export default async function deploy(deploymentManager: DeploymentManager, deplo
const LINK = await deploymentManager.existing('LINK', '0xbb7303602be1b9149b097aafb094ffce1860e532', 'arbitrum-goerli');
const WETH = await deploymentManager.existing('WETH', '0xe39ab88f8a4777030a534146a9ca3b52bd5d43a3', 'arbitrum-goerli');
const WBTC = await deploymentManager.existing('WBTC', '0x22d5e2dE578677791f6c90e0110Ec629be9d5Fb5', 'arbitrum-goerli');
const arbitrumCCTPTokenMinter = await deploymentManager.existing('arbitrumCCTPTokenMinter', '0xE997d7d2F6E065a9A93Fa2175E878Fb9081F1f0A', 'arbitrum-goerli');

// Import shared contracts from original usdc deployment
// Import shared contracts from cUSDCv3
const cometAdmin = await deploymentManager.fromDep('cometAdmin', 'arbitrum-goerli', 'usdc');
const cometFactory = await deploymentManager.fromDep('cometFactory', 'arbitrum-goerli', 'usdc');
const $configuratorImpl = await deploymentManager.fromDep('configurator:implementation', 'arbitrum-goerli', 'usdc');
const configurator = await deploymentManager.fromDep('configurator', 'arbitrum-goerli', 'usdc');
const rewards = await deploymentManager.fromDep('rewards', 'arbitrum-goerli', 'usdc');
const bulker = await deploymentManager.fromDep('bulker', 'arbitrum-goerli', 'usdc');
const localTimelock = await deploymentManager.fromDep('timelock', 'arbitrum-goerli', 'usdc');
const bridgeReceiver = await deploymentManager.fromDep('bridgeReceiver', 'arbitrum-goerli', 'usdc');
Expand All @@ -26,6 +32,8 @@ export default async function deploy(deploymentManager: DeploymentManager, deplo
return {
...deployed,
bridgeReceiver,
bulker
bulker,
rewards,
arbitrumCCTPTokenMinter
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export default migration('1687455833_configurate_and_ens', {
const ethers = deploymentManager.hre.ethers;
const { utils } = ethers;

const cometFactory = await deploymentManager.fromDep('cometFactory', 'arbitrum-goerli', 'usdc');
const {
bridgeReceiver,
timelock: l2Timelock,
Expand All @@ -40,11 +41,15 @@ export default migration('1687455833_configurate_and_ens', {
governor,
USDC,
COMP,
mainnetCCTPTokenMessenger,
} = await govDeploymentManager.getContracts();

const COMPAmountToBridge = exp(2_500, 18);
const compGatewayAddress = await arbitrumL1GatewayRouter.getGateway(COMP.address);
const refundAddress = l2Timelock.address;
const USDCAmountToBridge = exp(10, 6);
// CCTP destination domain for Arbitrum
const ArbitrumDestinationDomain = 3;

const compGasParams = await estimateTokenBridge(
{
Expand All @@ -70,17 +75,21 @@ export default migration('1687455833_configurate_and_ens', {
['address', 'address'],
[comet.address, arbitrumCOMPAddress]
);
const setFactoryCalldata = await calldata(
configurator.populateTransaction.setFactory(comet.address, cometFactory.address)
);
const l2ProposalData = utils.defaultAbiCoder.encode(
['address[]', 'uint256[]', 'string[]', 'bytes[]'],
[
[configurator.address, cometAdmin.address, rewards.address],
[0, 0, 0],
[configurator.address, configurator.address, cometAdmin.address, rewards.address],
[0, 0, 0, 0],
[
'setFactory(address,address)',
'setConfiguration(address,(address,address,address,address,address,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint104,uint104,uint104,(address,address,uint8,uint64,uint64,uint64,uint128)[]))',
'deployAndUpgradeTo(address,address)',
'setRewardConfig(address,address)'
],
[setConfigurationCalldata, deployAndUpgradeToCalldata, setRewardConfigCalldata]
[setFactoryCalldata, setConfigurationCalldata, deployAndUpgradeToCalldata, setRewardConfigCalldata]
]
);

Expand All @@ -106,7 +115,7 @@ export default migration('1687455833_configurate_and_ens', {
cometAddress: '0x1d573274E19174260c5aCE3f2251598959d24456',
},
{
baseSymbol: 'USDC.n',
baseSymbol: 'USDC',
cometAddress: comet.address,
}
],
Expand All @@ -129,29 +138,17 @@ export default migration('1687455833_configurate_and_ens', {
],
value: createRetryableTicketGasParams.deposit
},
// 2. Approve the COMP gateway to take Timelock's COMP for bridging
// 2. Approve USDC to CCTP
{
contract: COMP,
contract: USDC,
signature: 'approve(address,uint256)',
args: [compGatewayAddress, COMPAmountToBridge]
args: [mainnetCCTPTokenMessenger.address, USDCAmountToBridge]
},
// 3. Bridge COMP from mainnet to Arbitrum rewards
// 3. Burn USDC to Arbitrum via CCTP
{
contract: arbitrumL1GatewayRouter,
signature: 'outboundTransferCustomRefund(address,address,address,uint256,uint256,uint256,bytes)',
args: [
COMP.address, // address _token,
refundAddress, // address _refundTo,
rewards.address, // address _to,
COMPAmountToBridge, // uint256 _amount,
compGasParams.gasLimit, // uint256 _maxGas,
compGasParams.maxFeePerGas, // uint256 _gasPriceBid,
utils.defaultAbiCoder.encode(
['uint256', 'bytes'],
[compGasParams.maxSubmissionCost, '0x']
) // bytes calldata _data
],
value: compGasParams.deposit
contract: mainnetCCTPTokenMessenger,
signature: 'depositForBurn(uint256,uint32,bytes32,address)',
args: [USDCAmountToBridge, ArbitrumDestinationDomain, utils.hexZeroPad(comet.address, 32), USDC.address],
},
// 4. Update the list of official markets
{
Expand Down Expand Up @@ -187,37 +184,11 @@ export default migration('1687455833_configurate_and_ens', {
LINK
} = await deploymentManager.getContracts();

// 1.
// const stateChanges = await diffState(comet, getCometConfig, preMigrationBlockNumber);
// expect(stateChanges).to.deep.equal({
// LINK: {
// supplyCap: exp(5_000_000, 18)
// },
// WBTC: {
// supplyCap: exp(300, 8)
// },
// WETH: {
// supplyCap: exp(5_000, 18)
// }
// });

const config = await rewards.rewardConfig(comet.address);
expect(config.token).to.be.equal(arbitrumCOMPAddress);
expect(config.rescaleFactor).to.be.equal(exp(1, 12));
expect(config.shouldUpscale).to.be.equal(true);

// 2. & 3.
// expect(await comet.getReserves()).to.be.equal(exp(10, 6));

// 4. & 5.
const arbitrumCOMP = new Contract(
arbitrumCOMPAddress,
['function balanceOf(address account) external view returns (uint256)'],
deploymentManager.hre.ethers.provider
);
expect(await arbitrumCOMP.balanceOf(rewards.address)).to.be.equal(exp(2_500, 18));

// 6.
const ENSResolver = await govDeploymentManager.existing('ENSResolver', ENSResolverAddress);
const subdomainHash = ethers.utils.namehash(ENSSubdomain);
const officialMarketsJSON = await ENSResolver.text(subdomainHash, ENSTextRecordKey);
Expand Down Expand Up @@ -247,11 +218,18 @@ export default migration('1687455833_configurate_and_ens', {
cometAddress: '0x1d573274E19174260c5aCE3f2251598959d24456'
},
{
baseSymbol: 'USDC.n',
baseSymbol: 'USDC',
cometAddress: comet.address,
}
],

59140: [
{
baseSymbol: 'USDC',
cometAddress: '0xa84b24A43ba1890A165f94Ad13d0196E5fD1023a'
}
],

80001: [
{
baseSymbol: 'USDC',
Expand Down
111 changes: 111 additions & 0 deletions scenario/utils/relayArbitrumMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,115 @@ export default async function relayArbitrumMessage(
await bridgeReceiver.executeProposal(id, { gasPrice: 0 });
}
}

// CCTP relay
// L1 contracts
const MainnetTokenMessenger = await governanceDeploymentManager.getContractOrThrow('mainnetCCTPTokenMessenger');

Check failure on line 116 in scenario/utils/relayArbitrumMessage.ts

View workflow job for this annotation

GitHub Actions / Run ESLint

'MainnetTokenMessenger' is assigned a value but never used. Allowed unused vars must match /^_/u
const MainnetMessageTransmitter = await governanceDeploymentManager.getContractOrThrow('mainnetCCTPMessageTransmitter');
// Arbitrum TokenMinter which is L2 contracts
const TokenMinter = await bridgeDeploymentManager.getContractOrThrow('arbitrumCCTPTokenMinter');

const depositForBurnEvents: Log[] = await governanceDeploymentManager.hre.ethers.provider.getLogs({
fromBlock: startingBlockNumber,
toBlock: 'latest',
address: MainnetMessageTransmitter.address,
topics: [utils.id('MessageSent(bytes)')]
});

// Decode message body
const burnEvents = depositForBurnEvents.map(({ data }) => {
const dataBytes = utils.arrayify(data);
// Since data is encodePacked, so can't simply decode via AbiCoder.decode
const offset = 64;
const length = {
uint32: 4,
uint64: 8,
bytes32: 32,
uint256: 32,
};
let start = offset;
let end = start + length.uint32;
// msgVersion, skip won't use
start = end;
end = start + length.uint32;
// msgSourceDomain
const msgSourceDomain = BigNumber.from(dataBytes.slice(start, end)).toNumber();

start = end;
end = start + length.uint32;
// msgDestinationDomain, skip won't use

start = end;
end = start + length.uint64;
// msgNonce, skip won't use

start = end;
end = start + length.bytes32;
// msgSender, skip won't use

start = end;
end = start + length.bytes32;
// msgRecipient, skip won't use

start = end;
end = start + length.bytes32;
// msgDestination, skip won't use

start = end;
end = start + length.uint32;
// rawMsgBody version, skip won't use

start = end;
end = start + length.bytes32;
// rawMsgBody burnToken
const burnToken = utils.hexlify(dataBytes.slice(start, end));

start = end;
end = start + length.bytes32;
// rawMsgBody mintRecipient
const mintRecipient = utils.getAddress(utils.hexlify(dataBytes.slice(start, end)).slice(-40));

start = end;
end = start + length.uint256;

// rawMsgBody amount
const amount = BigNumber.from(dataBytes.slice(start, end)).toNumber();

start = end;
end = start + length.bytes32;
// rawMsgBody messageSender, skip won't use

return {
recipient: mintRecipient,
amount: amount,
sourceDomain: msgSourceDomain,
burnToken: burnToken
}

Check failure on line 196 in scenario/utils/relayArbitrumMessage.ts

View workflow job for this annotation

GitHub Actions / Run ESLint

Missing semicolon
});

// Impersonate the Arbitrum TokenMinter and mint token to recipient
const ImpersonateLocalTokenMessenger =
bridgeDeploymentManager.network === 'arbitrum' ? '0x19330d10d9cc8751218eaf51e8885d058642e08a' :
'arbitrum-goerli' ? '0x12dcfd3fe2e9eac2859fd1ed86d2ab8c5a2f9352': '0x0';

Check failure on line 202 in scenario/utils/relayArbitrumMessage.ts

View workflow job for this annotation

GitHub Actions / Run ESLint

Expected indentation of 6 spaces but found 40

Check failure on line 202 in scenario/utils/relayArbitrumMessage.ts

View workflow job for this annotation

GitHub Actions / Run ESLint

Unexpected constant condition
// Impersonate the Arbitrum TokenMinter and mint token to recipient
for (let burnEvent of burnEvents) {
const { recipient, amount, sourceDomain, burnToken } = burnEvent;
const localTokenMessengerSigner = await impersonateAddress(
bridgeDeploymentManager,
ImpersonateLocalTokenMessenger
);

const transactionRequest = await localTokenMessengerSigner.populateTransaction({
to: TokenMinter.address,
from: ImpersonateLocalTokenMessenger,
data: TokenMinter.interface.encodeFunctionData('mint', [sourceDomain, burnToken, utils.getAddress(recipient), amount]),
gasPrice: 0
});

await setNextBaseFeeToZero(bridgeDeploymentManager);

const tx = await (

Check failure on line 220 in scenario/utils/relayArbitrumMessage.ts

View workflow job for this annotation

GitHub Actions / Run ESLint

'tx' is assigned a value but never used. Allowed unused vars must match /^_/u
await localTokenMessengerSigner.sendTransaction(transactionRequest)
).wait();
}
}

0 comments on commit d468c9f

Please sign in to comment.