Deploy.s.sol 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // SPDX-License-Identifier: Apache-2.0
  2. pragma solidity ^0.8.0;
  3. import "forge-std/Script.sol";
  4. import "forge-std/console.sol";
  5. import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
  6. // Wormhole contracts
  7. import "../contracts/wormhole/Setup.sol";
  8. import "../contracts/wormhole/Implementation.sol";
  9. import "../contracts/wormhole/Wormhole.sol";
  10. // Pyth contracts
  11. import "../contracts/pyth/PythUpgradable.sol";
  12. contract DeployScript is Script {
  13. function run() external {
  14. uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
  15. vm.startBroadcast(deployerPrivateKey);
  16. // Deploy Wormhole first
  17. address wormholeAddress = deployWormhole();
  18. console.log("Wormhole deployed at:", wormholeAddress);
  19. // Deploy Pyth
  20. address pythAddress = deployPyth(wormholeAddress);
  21. console.log("Pyth deployed at:", pythAddress);
  22. vm.stopBroadcast();
  23. }
  24. function deployWormhole() internal returns (address) {
  25. // Read environment variables
  26. address[] memory initialSigners = vm.envAddress("INIT_SIGNERS", ",");
  27. uint16 chainId = uint16(vm.envUint("INIT_CHAIN_ID"));
  28. uint16 governanceChainId = uint16(vm.envUint("INIT_GOV_CHAIN_ID"));
  29. bytes32 governanceContract = vm.envBytes32("INIT_GOV_CONTRACT");
  30. console.log("Deploying Wormhole with chainId:", chainId);
  31. console.log("Governance chainId:", governanceChainId);
  32. // Deploy Setup contract
  33. Setup setup = new Setup();
  34. console.log("Setup deployed at:", address(setup));
  35. // Deploy Implementation contract
  36. Implementation implementation = new Implementation();
  37. console.log("Implementation deployed at:", address(implementation));
  38. // Encode initialization data
  39. bytes memory initData = abi.encodeWithSignature(
  40. "setup(address,address[],uint16,uint16,bytes32)",
  41. address(implementation),
  42. initialSigners,
  43. chainId,
  44. governanceChainId,
  45. governanceContract
  46. );
  47. // Deploy Wormhole proxy
  48. Wormhole wormhole = new Wormhole(address(setup), initData);
  49. return address(wormhole);
  50. }
  51. function deployPyth(address wormholeAddress) internal returns (address) {
  52. // Read environment variables
  53. uint16 pyth2WormholeChainId = uint16(vm.envUint("SOLANA_CHAIN_ID"));
  54. bytes32 pyth2WormholeEmitter = vm.envBytes32("SOLANA_EMITTER");
  55. uint16 governanceChainId = uint16(vm.envUint("GOVERNANCE_CHAIN_ID"));
  56. bytes32 governanceEmitter = vm.envBytes32("GOVERNANCE_EMITTER");
  57. uint64 governanceInitialSequence = uint64(
  58. vm.envOr("GOVERNANCE_INITIAL_SEQUENCE", uint256(0))
  59. );
  60. uint256 validTimePeriodSeconds = vm.envUint(
  61. "VALID_TIME_PERIOD_SECONDS"
  62. );
  63. uint256 singleUpdateFeeInWei = vm.envUint("SINGLE_UPDATE_FEE_IN_WEI");
  64. console.log("pyth2WormholeChainId:", pyth2WormholeChainId);
  65. console.log("pyth2WormholeEmitter:", uint256(pyth2WormholeEmitter));
  66. console.log("governanceEmitter:", uint256(governanceEmitter));
  67. console.log("governanceChainId:", governanceChainId);
  68. console.log("governanceInitialSequence:", governanceInitialSequence);
  69. console.log("validTimePeriodSeconds:", validTimePeriodSeconds);
  70. console.log("singleUpdateFeeInWei:", singleUpdateFeeInWei);
  71. // Deploy PythUpgradable implementation
  72. PythUpgradable pythImpl = new PythUpgradable();
  73. console.log(
  74. "PythUpgradable implementation deployed at:",
  75. address(pythImpl)
  76. );
  77. // Prepare initialization data
  78. uint16[] memory dataSourceChainIds = new uint16[](1);
  79. dataSourceChainIds[0] = pyth2WormholeChainId;
  80. bytes32[] memory dataSourceEmitterAddresses = new bytes32[](1);
  81. dataSourceEmitterAddresses[0] = pyth2WormholeEmitter;
  82. bytes memory pythInitData = abi.encodeWithSignature(
  83. "initialize(address,uint16[],bytes32[],uint16,bytes32,uint64,uint256,uint256)",
  84. wormholeAddress,
  85. dataSourceChainIds,
  86. dataSourceEmitterAddresses,
  87. governanceChainId,
  88. governanceEmitter,
  89. governanceInitialSequence,
  90. validTimePeriodSeconds,
  91. singleUpdateFeeInWei
  92. );
  93. // Deploy ERC1967 proxy
  94. ERC1967Proxy pythProxy = new ERC1967Proxy(
  95. address(pythImpl),
  96. pythInitData
  97. );
  98. return address(pythProxy);
  99. }
  100. }