-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
set solc version of VRF V2 Plus related contracts to 0.8.19 #12479
Changes from 9 commits
edeb8d9
39a8573
7aa6524
e131272
78893da
7280834
6a444f0
b8eff1e
faffa56
d49ad14
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
"chainlink": patch | ||
--- | ||
|
||
update solc version for vrf v2.5 coordinators |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
"@chainlink/contracts": patch | ||
--- | ||
|
||
upgrade solc version to 0.8.19 for vrf v2.5 contracts |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity 0.8.6; | ||
|
||
import {ArbSys} from "./vendor/@arbitrum/nitro-contracts/src/precompiles/ArbSys.sol"; | ||
import {ArbGasInfo} from "./vendor/@arbitrum/nitro-contracts/src/precompiles/ArbGasInfo.sol"; | ||
import {OVM_GasPriceOracle} from "./vendor/@eth-optimism/contracts/v0.8.6/contracts/L2/predeploys/OVM_GasPriceOracle.sol"; | ||
|
||
/// @dev A library that abstracts out opcodes that behave differently across chains. | ||
/// @dev The methods below return values that are pertinent to the given chain. | ||
/// @dev For instance, ChainSpecificUtil.getBlockNumber() returns L2 block number in L2 chains | ||
library ChainSpecificUtil { | ||
// ------------ Start Arbitrum Constants ------------ | ||
|
||
/// @dev ARBSYS_ADDR is the address of the ArbSys precompile on Arbitrum. | ||
/// @dev reference: https://github.com/OffchainLabs/nitro/blob/v2.0.14/contracts/src/precompiles/ArbSys.sol#L10 | ||
address private constant ARBSYS_ADDR = address(0x0000000000000000000000000000000000000064); | ||
ArbSys private constant ARBSYS = ArbSys(ARBSYS_ADDR); | ||
|
||
/// @dev ARBGAS_ADDR is the address of the ArbGasInfo precompile on Arbitrum. | ||
/// @dev reference: https://github.com/OffchainLabs/nitro/blob/v2.0.14/contracts/src/precompiles/ArbGasInfo.sol#L10 | ||
address private constant ARBGAS_ADDR = address(0x000000000000000000000000000000000000006C); | ||
ArbGasInfo private constant ARBGAS = ArbGasInfo(ARBGAS_ADDR); | ||
|
||
uint256 private constant ARB_MAINNET_CHAIN_ID = 42161; | ||
uint256 private constant ARB_GOERLI_TESTNET_CHAIN_ID = 421613; | ||
uint256 private constant ARB_SEPOLIA_TESTNET_CHAIN_ID = 421614; | ||
|
||
// ------------ End Arbitrum Constants ------------ | ||
|
||
// ------------ Start Optimism Constants ------------ | ||
/// @dev L1_FEE_DATA_PADDING includes 35 bytes for L1 data padding for Optimism | ||
bytes internal constant L1_FEE_DATA_PADDING = | ||
"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; | ||
/// @dev OVM_GASPRICEORACLE_ADDR is the address of the OVM_GasPriceOracle precompile on Optimism. | ||
/// @dev reference: https://community.optimism.io/docs/developers/build/transaction-fees/#estimating-the-l1-data-fee | ||
address private constant OVM_GASPRICEORACLE_ADDR = address(0x420000000000000000000000000000000000000F); | ||
OVM_GasPriceOracle private constant OVM_GASPRICEORACLE = OVM_GasPriceOracle(OVM_GASPRICEORACLE_ADDR); | ||
|
||
uint256 private constant OP_MAINNET_CHAIN_ID = 10; | ||
uint256 private constant OP_GOERLI_CHAIN_ID = 420; | ||
uint256 private constant OP_SEPOLIA_CHAIN_ID = 11155420; | ||
|
||
/// @dev Base is a OP stack based rollup and follows the same L1 pricing logic as Optimism. | ||
uint256 private constant BASE_MAINNET_CHAIN_ID = 8453; | ||
uint256 private constant BASE_GOERLI_CHAIN_ID = 84531; | ||
|
||
// ------------ End Optimism Constants ------------ | ||
|
||
/** | ||
* @notice Returns the blockhash for the given blockNumber. | ||
* @notice If the blockNumber is more than 256 blocks in the past, returns the empty string. | ||
* @notice When on a known Arbitrum chain, it uses ArbSys.arbBlockHash to get the blockhash. | ||
* @notice Otherwise, it uses the blockhash opcode. | ||
* @notice Note that the blockhash opcode will return the L2 blockhash on Optimism. | ||
*/ | ||
function _getBlockhash(uint64 blockNumber) internal view returns (bytes32) { | ||
uint256 chainid = block.chainid; | ||
if (_isArbitrumChainId(chainid)) { | ||
if ((_getBlockNumber() - blockNumber) > 256 || blockNumber >= _getBlockNumber()) { | ||
return ""; | ||
} | ||
return ARBSYS.arbBlockHash(blockNumber); | ||
} | ||
return blockhash(blockNumber); | ||
} | ||
|
||
/** | ||
* @notice Returns the block number of the current block. | ||
* @notice When on a known Arbitrum chain, it uses ArbSys.arbBlockNumber to get the block number. | ||
* @notice Otherwise, it uses the block.number opcode. | ||
* @notice Note that the block.number opcode will return the L2 block number on Optimism. | ||
*/ | ||
function _getBlockNumber() internal view returns (uint256) { | ||
uint256 chainid = block.chainid; | ||
if (_isArbitrumChainId(chainid)) { | ||
return ARBSYS.arbBlockNumber(); | ||
} | ||
return block.number; | ||
} | ||
|
||
/** | ||
* @notice Returns the L1 fees that will be paid for the current transaction, given any calldata | ||
* @notice for the current transaction. | ||
* @notice When on a known Arbitrum chain, it uses ArbGas.getCurrentTxL1GasFees to get the fees. | ||
* @notice On Arbitrum, the provided calldata is not used to calculate the fees. | ||
* @notice On Optimism, the provided calldata is passed to the OVM_GasPriceOracle predeploy | ||
* @notice and getL1Fee is called to get the fees. | ||
*/ | ||
function _getCurrentTxL1GasFees(bytes memory txCallData) internal view returns (uint256) { | ||
uint256 chainid = block.chainid; | ||
if (_isArbitrumChainId(chainid)) { | ||
return ARBGAS.getCurrentTxL1GasFees(); | ||
} else if (_isOptimismChainId(chainid)) { | ||
return OVM_GASPRICEORACLE.getL1Fee(bytes.concat(txCallData, L1_FEE_DATA_PADDING)); | ||
} | ||
return 0; | ||
} | ||
|
||
/** | ||
* @notice Returns the gas cost in wei of calldataSizeBytes of calldata being posted | ||
* @notice to L1. | ||
*/ | ||
function _getL1CalldataGasCost(uint256 calldataSizeBytes) internal view returns (uint256) { | ||
uint256 chainid = block.chainid; | ||
if (_isArbitrumChainId(chainid)) { | ||
(, uint256 l1PricePerByte, , , , ) = ARBGAS.getPricesInWei(); | ||
// see https://developer.arbitrum.io/devs-how-tos/how-to-estimate-gas#where-do-we-get-all-this-information-from | ||
// for the justification behind the 140 number. | ||
return l1PricePerByte * (calldataSizeBytes + 140); | ||
} else if (_isOptimismChainId(chainid)) { | ||
return _calculateOptimismL1DataFee(calldataSizeBytes); | ||
} | ||
return 0; | ||
} | ||
|
||
/** | ||
* @notice Return true if and only if the provided chain ID is an Arbitrum chain ID. | ||
*/ | ||
function _isArbitrumChainId(uint256 chainId) internal pure returns (bool) { | ||
return | ||
chainId == ARB_MAINNET_CHAIN_ID || | ||
chainId == ARB_GOERLI_TESTNET_CHAIN_ID || | ||
chainId == ARB_SEPOLIA_TESTNET_CHAIN_ID; | ||
} | ||
|
||
/** | ||
* @notice Return true if and only if the provided chain ID is an Optimism chain ID. | ||
* @notice Note that optimism chain id's are also OP stack chain id's. | ||
*/ | ||
function _isOptimismChainId(uint256 chainId) internal pure returns (bool) { | ||
return | ||
chainId == OP_MAINNET_CHAIN_ID || | ||
chainId == OP_GOERLI_CHAIN_ID || | ||
chainId == OP_SEPOLIA_CHAIN_ID || | ||
chainId == BASE_MAINNET_CHAIN_ID || | ||
chainId == BASE_GOERLI_CHAIN_ID; | ||
} | ||
|
||
function _calculateOptimismL1DataFee(uint256 calldataSizeBytes) internal view returns (uint256) { | ||
// from: https://community.optimism.io/docs/developers/build/transaction-fees/#the-l1-data-fee | ||
// l1_data_fee = l1_gas_price * (tx_data_gas + fixed_overhead) * dynamic_overhead | ||
// tx_data_gas = count_zero_bytes(tx_data) * 4 + count_non_zero_bytes(tx_data) * 16 | ||
// note we conservatively assume all non-zero bytes. | ||
uint256 l1BaseFeeWei = OVM_GASPRICEORACLE.l1BaseFee(); | ||
uint256 numZeroBytes = 0; | ||
uint256 numNonzeroBytes = calldataSizeBytes - numZeroBytes; | ||
uint256 txDataGas = numZeroBytes * 4 + numNonzeroBytes * 16; | ||
uint256 fixedOverhead = OVM_GASPRICEORACLE.overhead(); | ||
|
||
// The scalar is some value like 0.684, but is represented as | ||
// that times 10 ^ number of scalar decimals. | ||
// e.g scalar = 0.684 * 10^6 | ||
// The divisor is used to divide that and have a net result of the true scalar. | ||
uint256 scalar = OVM_GASPRICEORACLE.scalar(); | ||
uint256 scalarDecimals = OVM_GASPRICEORACLE.decimals(); | ||
uint256 divisor = 10 ** scalarDecimals; | ||
|
||
uint256 l1DataFee = (l1BaseFeeWei * (txDataGas + fixedOverhead) * scalar) / divisor; | ||
return l1DataFee; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
pragma solidity 0.8.6; | ||
pragma solidity 0.8.19; | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do these files need to be updated in this change? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. not necessary but automations team agreed to it . https://chainlink-core.slack.com/archives/C033D4HSSQJ/p1710877172545099 |
||
import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol"; | ||
import {AutomationCompatibleInterface} from "../interfaces/AutomationCompatibleInterface.sol"; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity 0.8.6; | ||
pragma solidity ^0.8.6; | ||
|
||
/** | ||
* @title VRFTypes | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this work with v0.8.19
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yes OVM_GasPriceOracle works with anything above v0.8.9