| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // SPDX-License-Identifier: Apache 2
- pragma solidity ^0.8.0;
- import "./Pyth.sol";
- import "./PythInternalStructs.sol";
- import "./PythGetters.sol";
- import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
- import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
- import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
- import "./PythGovernance.sol";
- import "./Pyth.sol";
- import "@pythnetwork/pyth-sdk-solidity/PythErrors.sol";
- contract PythUpgradable is
- Initializable,
- OwnableUpgradeable,
- UUPSUpgradeable,
- Pyth,
- PythGovernance
- {
- function initialize(
- address wormhole,
- uint16[] calldata dataSourceEmitterChainIds,
- bytes32[] calldata dataSourceEmitterAddresses,
- uint16 governanceEmitterChainId,
- bytes32 governanceEmitterAddress,
- uint64 governanceInitialSequence,
- uint validTimePeriodSeconds,
- uint singleUpdateFeeInWei,
- address verifier
- ) public initializer {
- __Ownable_init();
- __UUPSUpgradeable_init();
- Pyth._initialize(
- wormhole,
- dataSourceEmitterChainIds,
- dataSourceEmitterAddresses,
- governanceEmitterChainId,
- governanceEmitterAddress,
- governanceInitialSequence,
- validTimePeriodSeconds,
- singleUpdateFeeInWei,
- verifier
- );
- renounceOwnership();
- }
- /// Ensures the contract cannot be uninitialized and taken over.
- /// @custom:oz-upgrades-unsafe-allow constructor
- constructor() initializer {}
- // Only allow the owner to upgrade the proxy to a new implementation.
- // The contract has no owner so this function will always revert
- // but UUPSUpgradeable expects this method to be implemented.
- function _authorizeUpgrade(address) internal override onlyOwner {}
- function pythUpgradableMagic() public pure returns (uint32) {
- return 0x97a6f304;
- }
- // Execute a UpgradeContract governance message
- function upgradeUpgradableContract(
- UpgradeContractPayload memory payload
- ) internal override {
- address oldImplementation = _getImplementation();
- _upgradeToAndCallUUPS(payload.newImplementation, new bytes(0), false);
- // Calling a method using `this.<method>` will cause a contract call that will use
- // the new contract. This call will fail if the method does not exists or the magic
- // is different.
- if (this.pythUpgradableMagic() != 0x97a6f304)
- revert PythErrors.InvalidGovernanceMessage();
- emit ContractUpgraded(oldImplementation, _getImplementation());
- }
- }
|