diff --git a/deployments/mainnet.json b/deployments/mainnet.json index 0681dca..970749f 100644 --- a/deployments/mainnet.json +++ b/deployments/mainnet.json @@ -1,5 +1,6 @@ { "SocketVerifier": "0xa27A3f5A96DF7D8Be26EE2790999860C00eb688D", "CCTPVerification": "0x978aF9cAD9b1808895e71BDcF5Ea420a1CAAA9b0", - "AcrossV3Verification": "0x4A9a81a78DCA81F2Fd5bEf12223D3e29727c1bEE" + "AcrossV3Verification": "0x4A9a81a78DCA81F2Fd5bEf12223D3e29727c1bEE", + "GnosisBridgeRouterVerification": "0xF8C868f37b1A26e15Ab9dA53b1853a222125a4b6" } \ No newline at end of file diff --git a/scripts/addVerifier.ts b/scripts/addVerifier.ts index d046431..9bb9b03 100644 --- a/scripts/addVerifier.ts +++ b/scripts/addVerifier.ts @@ -39,7 +39,8 @@ export const addVerifier = async () => { // config // const VerifierName: VerifierName = "AcrossV3Verification"; - const VerifierName = "CCTPVerification"; + // const VerifierName = "CCTPVerification"; + const VerifierName = "GnosisBridgeRouterVerification"; const verifierAddress = deployment[VerifierName]; if (!verifierAddress) { throw new Error(`${VerifierName} not deployed`); diff --git a/scripts/config.ts b/scripts/config.ts index 43ed5da..8b0297e 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -1,11 +1,14 @@ export const create3Factory = "0xf2b6544589ab65e731883a0244cbefe5735322c5"; -export type VerifierName = "AcrossV3Verification" | "CCTPVerification"; +export type VerifierName = + | "AcrossV3Verification" + | "CCTPVerification" + | "GnosisBridgeRouterVerification"; // https://github.com/SocketDotTech/ll-core-v2/blob/main/src/addresses/index.ts export const routeIdConfigs: Record< string, - Record + Partial> > = { avalanche: { AcrossV3Verification: undefined, // across not supported on avalanche @@ -22,6 +25,7 @@ export const routeIdConfigs: Record< mainnet: { AcrossV3Verification: 429, CCTPVerification: 407, + GnosisBridgeRouterVerification: 444, }, arbitrum: { AcrossV3Verification: 415, diff --git a/scripts/deployGnosisBridgeRouterVerifier.ts b/scripts/deployGnosisBridgeRouterVerifier.ts new file mode 100644 index 0000000..a3a212a --- /dev/null +++ b/scripts/deployGnosisBridgeRouterVerifier.ts @@ -0,0 +1,77 @@ +import fs from "fs"; +import { ethers, run } from "hardhat"; +import path from "path"; + +const hre = require("hardhat"); +const CONTRACT_NAME = "GnosisBridgeRouterVerification"; + +export const deployGnosisBridgeRouterVerification = async () => { + try { + const { deployments, getNamedAccounts, network } = hre; + const { deployer } = await getNamedAccounts(); + const owner = deployer; + const networkName = network.name; + const networkFilePath = path.join( + __dirname, + `../deployments/${networkName}.json` + ); + // check if the contract is already deployed in deployments folder in json + let deployment_json = undefined; + deployment_json = fs.readFileSync(networkFilePath, "utf-8"); + const deployment = JSON.parse(deployment_json); + + // check if the contract is already deployed + const ContractAddress = deployment[CONTRACT_NAME]; + if (ContractAddress) { + console.log(`${CONTRACT_NAME} already deployed to:`, ContractAddress); + return { + success: true, + address: ContractAddress, + }; + } + + const factory = await ethers.getContractFactory(CONTRACT_NAME); + const Contract = await factory.deploy(); + console.log(`about to deploy ${CONTRACT_NAME}`); + await Contract.deployed(); + console.log(`${CONTRACT_NAME} deployed to:`, Contract.address); + + // save the contract address in deployments folder + const newDeployment = { + ...deployment, + [CONTRACT_NAME]: Contract.address, + }; + + fs.writeFileSync( + networkFilePath, + JSON.stringify(newDeployment, null, 2), + "utf-8" + ); + + // verify the contract on etherscan + await run("verify:verify", { + address: Contract.address, + constructorArguments: [], + }); + + return { + success: true, + address: Contract.address, + }; + } catch (error) { + console.log(`Error in deploying ${CONTRACT_NAME}`, error); + return { + success: false, + }; + } +}; + +deployGnosisBridgeRouterVerification() + .then(() => { + console.log(`✅ finished running the deployment of ${CONTRACT_NAME}`); + process.exit(0); + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); diff --git a/src/bridges/gnosis-bridge-router/GnosisBridgeRouterVerification.sol b/src/bridges/gnosis-bridge-router/GnosisBridgeRouterVerification.sol new file mode 100644 index 0000000..4eeb315 --- /dev/null +++ b/src/bridges/gnosis-bridge-router/GnosisBridgeRouterVerification.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {BaseVerifier} from "../BaseVerification.sol"; + +contract GnosisBridgeRouterVerification is BaseVerifier { + address public constant NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + + function bridgeERC20To( + bytes32 metadata, + address receiverAddress, + address fromTokenAddress, + uint256 toChainId, + uint256 amount + ) external returns (SocketRequest memory) { + return SocketRequest({ + amount: amount, + recipient: receiverAddress, + toChainId: toChainId, + token: fromTokenAddress, + signature: msg.sig + }); + } + + function bridgeNativeTo(bytes32 metadata, address receiverAddress, uint256 toChainId, uint256 amount) + external + returns (SocketRequest memory) + { + return SocketRequest({ + amount: amount, + recipient: receiverAddress, + toChainId: toChainId, + token: NATIVE_TOKEN_ADDRESS, + signature: msg.sig + }); + } + + receive() external payable {} + + // Fallback function is called when msg.data is not empty + fallback() external payable {} +} diff --git a/test/SocketVerifier.t.sol b/test/SocketVerifier.t.sol index 06c0681..44ed8c5 100644 --- a/test/SocketVerifier.t.sol +++ b/test/SocketVerifier.t.sol @@ -7,6 +7,8 @@ import {HopL2Verifier} from "../src/bridges/hop/HopL2Verification.sol"; import {AnyswapV4Verification} from "../src/bridges/anyswap/AnyswapV4Verification.sol"; import {AcrossV3Verification} from "../src/bridges/across/AcrossV3Verification.sol"; import {CCTPVerification} from "../src/bridges/cctp/CCTPVerification.sol"; +import {GnosisBridgeRouterVerification} from "../src/bridges/gnosis-bridge-router/GnosisBridgeRouterVerification.sol"; + contract SocketVerifierTest is Test { SocketVerifier public socketVerifier; @@ -14,11 +16,14 @@ contract SocketVerifierTest is Test { uint32 public constant ANYSWAP_V4_ROUTE_ID = 6; uint32 public constant ACROSS_V3_ROUTE_ID = 429; uint32 public constant CCTP_ROUTE_ID = 396; + uint32 public constant GNOSIS_ROUTE_ID = 444; + // bridges HopL2Verifier public hopVerifier = new HopL2Verifier(); AnyswapV4Verification public anyswapVerifier = new AnyswapV4Verification(); AcrossV3Verification public acrossV3Verifier = new AcrossV3Verification(); CCTPVerification public cctpVerifier = new CCTPVerification(); + GnosisBridgeRouterVerification public gnosisVerifier = new GnosisBridgeRouterVerification(); function setUp() public { socketVerifier = new SocketVerifier(address(this), 0x3a23F943181408EAC424116Af7b7790c94Cb97a5); @@ -26,11 +31,12 @@ contract SocketVerifierTest is Test { socketVerifier.addVerifier(ANYSWAP_V4_ROUTE_ID, address(anyswapVerifier)); socketVerifier.addVerifier(ACROSS_V3_ROUTE_ID, address(acrossV3Verifier)); socketVerifier.addVerifier(CCTP_ROUTE_ID, address(cctpVerifier)); + socketVerifier.addVerifier(GNOSIS_ROUTE_ID, address(gnosisVerifier)); } function testHopERC20Verification() public { - bytes - memory exampledata = hex"00000013b8fc75e100000000000000000000000032a80b98e33c3a0e57d635c56707208d29f970a20000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000076b22b8c1079a44f1211d867d68b1eda76a635a700000000000000000000000000000000000000000000000000000000004c4b400000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000003d54c0000000000000000000000000000000000000000000000000000000000480c3b00000000000000000000000000000000000000000000000000000187d705ae4b0000000000000000000000000000000000000000000000000000000000480c3b00000000000000000000000000000000000000000000000000000187d705ae4b00000000000000000000000000000000000000000000000000000000000000cd"; + bytes memory exampledata = + hex"00000013b8fc75e100000000000000000000000032a80b98e33c3a0e57d635c56707208d29f970a20000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000076b22b8c1079a44f1211d867d68b1eda76a635a700000000000000000000000000000000000000000000000000000000004c4b400000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000003d54c0000000000000000000000000000000000000000000000000000000000480c3b00000000000000000000000000000000000000000000000000000187d705ae4b0000000000000000000000000000000000000000000000000000000000480c3b00000000000000000000000000000000000000000000000000000187d705ae4b00000000000000000000000000000000000000000000000000000000000000cd"; // should not throw errors socketVerifier.validateRotueId(exampledata, HOP_L2_ROUTE_ID); @@ -42,14 +48,14 @@ contract SocketVerifierTest is Test { signature: 0xb8fc75e1 }); - SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = SocketVerifier - .UserRequestValidation(HOP_L2_ROUTE_ID, _expectedSocketRequest); + SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = + SocketVerifier.UserRequestValidation(HOP_L2_ROUTE_ID, _expectedSocketRequest); socketVerifier.validateSocketRequest(exampledata, _expectedUserRequestValidation); } function testAnyswapERC20Verifier() public { - bytes - memory exampledata = hex"00000006f443318a0000000000000000000000000000000000000000000000000000000005390cf2000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e530000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174000000000000000000000000d69b31c3225728cc57ddaf9be532a4ee1620be51"; + bytes memory exampledata = + hex"00000006f443318a0000000000000000000000000000000000000000000000000000000005390cf2000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e530000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174000000000000000000000000d69b31c3225728cc57ddaf9be532a4ee1620be51"; // should not throw errors socketVerifier.validateRotueId(exampledata, ANYSWAP_V4_ROUTE_ID); @@ -61,14 +67,14 @@ contract SocketVerifierTest is Test { signature: 0xf443318a }); - SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = SocketVerifier - .UserRequestValidation(ANYSWAP_V4_ROUTE_ID, _expectedSocketRequest); + SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = + SocketVerifier.UserRequestValidation(ANYSWAP_V4_ROUTE_ID, _expectedSocketRequest); socketVerifier.validateSocketRequest(exampledata, _expectedUserRequestValidation); } function testAcrossV3ERC20Verifier() public { - bytes - memory exampledata = hex"000001ad792ebcb90000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000002a1f00000000000000000000000000000000000000000000000000000000000000cd0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f0000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c335900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000005f5b6e1000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000067e68cff0000000000000000000000000000000000000000000000000000000067e6e105d00dfeeddeadbeef765753be7f7a64d5509974b0d678e1e3149b02f4"; + bytes memory exampledata = + hex"000001ad792ebcb90000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000002a1f00000000000000000000000000000000000000000000000000000000000000cd0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f0000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000003c499c542cef5e3811e1192ce70d8cc03d5c335900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000005f5b6e1000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000067e68cff0000000000000000000000000000000000000000000000000000000067e6e105d00dfeeddeadbeef765753be7f7a64d5509974b0d678e1e3149b02f4"; // should not throw errors socketVerifier.validateRotueId(exampledata, ACROSS_V3_ROUTE_ID); @@ -80,14 +86,14 @@ contract SocketVerifierTest is Test { signature: 0x792ebcb9 }); - SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = SocketVerifier - .UserRequestValidation(ACROSS_V3_ROUTE_ID, _expectedSocketRequest); + SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = + SocketVerifier.UserRequestValidation(ACROSS_V3_ROUTE_ID, _expectedSocketRequest); socketVerifier.validateSocketRequest(exampledata, _expectedUserRequestValidation); } function testAcrossV3NativeVerifier() public { - bytes - memory exampledata = hex"000001ade421f3520000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000042000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000007379557d4cab0000000000000000000000000000000000000000000000000000000000000a2d0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f0000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0433a51e6b355000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000687a7d9b00000000000000000000000000000000000000000000000000000000687ad1a1d00dfeeddeadbeef765753be7f7a64d5509974b0d678e1e3149b02f4"; + bytes memory exampledata = + hex"000001ade421f3520000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000042000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000007379557d4cab0000000000000000000000000000000000000000000000000000000000000a2d0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f0000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000de0433a51e6b355000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000687a7d9b00000000000000000000000000000000000000000000000000000000687ad1a1d00dfeeddeadbeef765753be7f7a64d5509974b0d678e1e3149b02f4"; // should not throw errors socketVerifier.validateRotueId(exampledata, ACROSS_V3_ROUTE_ID); @@ -99,14 +105,14 @@ contract SocketVerifierTest is Test { signature: 0xe421f352 }); - SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = SocketVerifier - .UserRequestValidation(ACROSS_V3_ROUTE_ID, _expectedSocketRequest); + SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = + SocketVerifier.UserRequestValidation(ACROSS_V3_ROUTE_ID, _expectedSocketRequest); socketVerifier.validateSocketRequest(exampledata, _expectedUserRequestValidation); } function testCCTPERC20Verifier() public { - bytes - memory exampledata = hex"0000018cb7dfe9d000000000000000000000000000000000000000000000000000000000004c4b400000000000000000000000000000000000000000000000000000000000001b3b000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f0000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000000000000000000000000000210500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000030d40"; + bytes memory exampledata = + hex"0000018cb7dfe9d000000000000000000000000000000000000000000000000000000000004c4b400000000000000000000000000000000000000000000000000000000000001b3b000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f0000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000000000000000000000000000000000000000210500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000030d40"; // should not throw errors socketVerifier.validateRotueId(exampledata, CCTP_ROUTE_ID); @@ -118,8 +124,46 @@ contract SocketVerifierTest is Test { signature: 0xb7dfe9d0 }); - SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = SocketVerifier - .UserRequestValidation(CCTP_ROUTE_ID, _expectedSocketRequest); + SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = + SocketVerifier.UserRequestValidation(CCTP_ROUTE_ID, _expectedSocketRequest); + socketVerifier.validateSocketRequest(exampledata, _expectedUserRequestValidation); + } + + function testGnosisERC20Verifier() public { + bytes memory exampledata = + hex"000001bc3bf5c22800000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f00000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000f4240"; + // should not throw errors + socketVerifier.validateRotueId(exampledata, GNOSIS_ROUTE_ID); + + SocketVerifier.SocketRequest memory _expectedSocketRequest = SocketVerifier.SocketRequest({ + amount: 1000000, + recipient: 0xDaeE4D2156DE6fe6f7D50cA047136D758f96A6f0, + toChainId: 100, + token: 0x6B175474E89094C44Da98b954EedeAC495271d0F, + signature: 0x3bf5c228 + }); + + SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = + SocketVerifier.UserRequestValidation(GNOSIS_ROUTE_ID, _expectedSocketRequest); + socketVerifier.validateSocketRequest(exampledata, _expectedUserRequestValidation); + } + + function testGnosisNativeVerifier() public { + bytes memory exampledata = + hex"000001bcfcb23eb000000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000daee4d2156de6fe6f7d50ca047136d758f96a6f000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000de0b6b3a7640000"; + // should not throw errors + socketVerifier.validateRotueId(exampledata, GNOSIS_ROUTE_ID); + + SocketVerifier.SocketRequest memory _expectedSocketRequest = SocketVerifier.SocketRequest({ + amount: 1000000000000000000, + recipient: 0xDaeE4D2156DE6fe6f7D50cA047136D758f96A6f0, + toChainId: 100, + token: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE, + signature: 0xfcb23eb0 + }); + + SocketVerifier.UserRequestValidation memory _expectedUserRequestValidation = + SocketVerifier.UserRequestValidation(GNOSIS_ROUTE_ID, _expectedSocketRequest); socketVerifier.validateSocketRequest(exampledata, _expectedUserRequestValidation); } }