Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions contracts/WitPriceFeeds.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,6 @@ abstract contract WitPriceFeeds
type(IWitPriceFeeds).interfaceId
);
}

function witOracle() virtual override (IWitOracleConsumer, IWitPriceFeeds) external view returns (address);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,30 +16,45 @@ import {Slices} from "../libs/Slices.sol";
import {Ownable, Ownable2Step} from "../patterns/Ownable2Step.sol";
import {WitnetUpgradableBase} from "../core/WitnetUpgradableBase.sol";
import {WitPriceFeedsLegacyDataLib} from "../data/WitPriceFeedsLegacyDataLib.sol";
import {WitPriceFeedsLegacy, IWitOracleAppliance} from "../WitPriceFeedsLegacy.sol";
import {
IERC2362,
IWitOracleAppliance,
IWitPriceFeedsLegacyAdmin,
IWitPriceFeedsLegacySolverFactory
} from "../WitPriceFeedsLegacy.sol";


/// @title WitPriceFeeds: Price Feeds upgradable repository reliant on the Wit/Oracle blockchain.
/// @author Guillermo Díaz <[email protected]>

contract WitPriceFeedsLegacyBypassV3
contract WitPriceFeedsLegacyUpgradableBypass
is
Ownable2Step,
WitnetUpgradableBase
{
using Slices for string;
using Slices for Slices.Slice;

IWitPriceFeeds immutable public surrogate;
IWitOracleRadonRegistry immutable public registry;
IWitPriceFeeds immutable public surrogate;

struct BypassV2V3 {
mapping (IWitPriceFeedsTypes.ID4 => bytes4) v2Ids;
mapping (bytes4 => IWitPriceFeedsTypes.ID4) v3Ids;
}

function class() public pure returns (string memory) {
return type(WitPriceFeedsLegacyBypassV3).name;
return type(WitPriceFeedsLegacyUpgradableBypass).name;
}

function specs() public pure returns (bytes4) {
return (
type(IERC2362).interfaceId
^ type(IWitOracleAppliance).interfaceId
^ type(IWitPriceFeedsLegacy).interfaceId
^ type(IWitPriceFeedsLegacyAdmin).interfaceId
^ type(IWitPriceFeedsLegacySolverFactory).interfaceId
);
}

constructor(
Expand All @@ -54,11 +69,6 @@ contract WitPriceFeedsLegacyBypassV3
"io.witnet.proxiable.feeds.price"
)
{
_require(
_surrogate != address(0)
&& _surrogate.code.length > 0,
"invalid surrogate"
);
surrogate = IWitPriceFeeds(_surrogate);
registry = IWitOracleRadonRegistry(
IWitOracle(
Expand Down Expand Up @@ -289,6 +299,13 @@ contract WitPriceFeedsLegacyBypassV3
return IWitOracleAppliance(address(surrogate)).witOracle();
}

function witOracle()
external view
returns (address)
{
return IWitOracleAppliance(address(surrogate)).witOracle();
}


// ================================================================================================================
// --- Implements 'IWitPriceFeedsLegacyAdmin' -----------------------------------------------------------------------------
Expand Down
29 changes: 18 additions & 11 deletions contracts/apps/WitPriceFeedsV3.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
IWitPriceFeeds,
IWitPriceFeedsAdmin,
IWitPriceFeedsConsumer,
IWitOracleConsumer,
WitPriceFeeds
} from "../WitPriceFeeds.sol";

Expand Down Expand Up @@ -61,12 +62,16 @@ contract WitPriceFeedsV3
using WitPriceFeedsDataLib for UpdateConditions;
using WitPriceFeedsDataLib for WitPriceFeedsDataLib.PriceFeed;

address immutable public override witOracle;
address immutable public __WIT_ORACLE;

function class() virtual override public pure returns (string memory) {
return type(WitPriceFeedsV3).name;
}

function witOracle() virtual override external view returns (address) {
return __WIT_ORACLE;
}

constructor(
address _witOracle,
address _operator
Expand All @@ -83,7 +88,7 @@ contract WitPriceFeedsV3
|| _witOracleSpecs == type(IWitOracle).interfaceId ^ type(IWitOracleQueriable).interfaceId,
"uncompliant wit/oracle"
);
witOracle = _witOracle;
__WIT_ORACLE = _witOracle;
__storage().defaultUpdateConditions = UpdateConditions({
callbackGas: 1_000_000,
computeEma: false,
Expand Down Expand Up @@ -564,7 +569,7 @@ contract WitPriceFeedsV3
_symbol,
_radonBytecode,
_exponent,
IWitOracle(witOracle).registry()
IWitOracle(__WIT_ORACLE).registry()
)
returns (bytes4 _footprint, Witnet.RadonHash _radonHash) {
emit PriceFeedOracle(
Expand Down Expand Up @@ -600,7 +605,7 @@ contract WitPriceFeedsV3
_symbol,
_radonHash,
_exponent,
IWitOracle(witOracle).registry()
IWitOracle(__WIT_ORACLE).registry()
)
returns (bytes4 _footprint) {
emit PriceFeedOracle(
Expand Down Expand Up @@ -655,7 +660,7 @@ contract WitPriceFeedsV3
report.queryParams.witCommitteeSize >= _updateConditions.minWitnesses,
InvalidGovernanceTarget()
);
Witnet.DataResult memory _dataResult = IWitOracle(witOracle).pushDataReport(
Witnet.DataResult memory _dataResult = IWitOracle(__WIT_ORACLE).pushDataReport(
report,
proof
);
Expand All @@ -674,15 +679,16 @@ contract WitPriceFeedsV3
HotPrice()
);

int8 _exponent = __record.lastUpdate.exponent;
uint64 _deltaSecs = uint24(
Witnet.Timestamp.unwrap(__record.lastUpdate.timestamp)
- Witnet.Timestamp.unwrap(_dataResult.timestamp)
int8 _exponent = __record.exponent;
Witnet.Timestamp _lastTimestamp = __record.lastUpdate.timestamp;
uint64 _deltaSecs = _lastTimestamp.isZero() ? 0 : uint24(
Witnet.Timestamp.unwrap(_dataResult.timestamp)
- Witnet.Timestamp.unwrap(_lastTimestamp)
);
uint64 _lastPrice = __record.lastUpdate.price;
uint64 _nextPrice = _dataResult.fetchUint();
int56 _deltaPrice = int56(int64(_nextPrice) - int64(_lastPrice));
uint64 _deviation1000 = (
int56 _deltaPrice = _lastPrice == 0 ? int56(0) : int56(int64(_nextPrice) - int64(_lastPrice));
uint64 _deviation1000 = _lastPrice == 0 ? uint64(0) : (
_deltaPrice >= 0
? uint56(_deltaPrice * 1000) / _lastPrice
: uint56(-_deltaPrice * 1000) / _lastPrice
Expand All @@ -694,6 +700,7 @@ contract WitPriceFeedsV3
);

__record.lastUpdate.deltaPrice = _deltaPrice;
__record.lastUpdate.exponent = _exponent;
__record.lastUpdate.price = _nextPrice;
__record.lastUpdate.timestamp = _dataResult.timestamp;
__record.lastUpdate.trail = _dataResult.drTxHash;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pragma solidity >=0.8.0 <0.9.0;
import {WitPriceFeedsV3} from "./WitPriceFeedsV3.sol";
import {Upgradeable} from "../patterns/Upgradeable.sol";

/// @title WitPriceFeedsUpgradableV3: On-demand Price Feeds registry for EVM-compatible L1/L2 chains,
/// @title WitPriceFeedsV3Upgradable: On-demand Price Feeds registry for EVM-compatible L1/L2 chains,
/// natively powered by the Wit/Oracle blockchain, but yet capable of aggregating price
/// updates from other on-chain price-feed oracles too, if required.
///
Expand All @@ -26,15 +26,15 @@ import {Upgradeable} from "../patterns/Upgradeable.sol";
///
/// @author Guillermo Díaz <[email protected]>

contract WitPriceFeedsUpgradableV3
contract WitPriceFeedsV3Upgradable
is
Upgradeable,
WitPriceFeedsV3
{
bytes32 internal immutable __VERSION;

function class() virtual override public pure returns (string memory) {
return type(WitPriceFeedsUpgradableV3).name;
return type(WitPriceFeedsV3Upgradable).name;
}

constructor(
Expand Down
10 changes: 10 additions & 0 deletions contracts/data/WitPriceFeedsDataLib.sol
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,11 @@ library WitPriceFeedsDataLib {
address(this),
Witnet.RadonHash.unwrap(_radonHash)
);
require(
IWitPriceFeedsTypes.ID4.unwrap(data().reverseIds[_radonHash]) == bytes4(0),
"repeated rad hash"
);
data().reverseIds[_radonHash] = id4;
_footprint = settlePriceFeedFootprint();
}

Expand All @@ -434,6 +439,11 @@ library WitPriceFeedsDataLib {
address(this),
Witnet.RadonHash.unwrap(radonHash)
);
require(
IWitPriceFeedsTypes.ID4. unwrap(data().reverseIds[radonHash]) == bytes4(0),
"repeated rad hash"
);
data().reverseIds[radonHash] = id4;
return settlePriceFeedFootprint();
}

Expand Down
3 changes: 3 additions & 0 deletions contracts/interfaces/IWitOracleConsumer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,7 @@ interface IWitOracleConsumer {
/// @dev The referred `witOracle()` contract emits a `IWitOracle.DataReport` for
/// every `Witnet.DataPushReport` proven to be authentic.
function pushDataReport(Witnet.DataPushReport calldata report, bytes calldata proof) external;

/// Returns the address of the Wit/Oracle bridge that will be used to verify pushed data reprots.
function witOracle() external view returns (address);
}
18 changes: 8 additions & 10 deletions contracts/libs/Witnet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -772,17 +772,15 @@ library Witnet {
bytes7 private constant _CBOR_MAJOR_TYPE_TO_RADON_DATA_TYPES_MAP = 0x04040307010600;
function peekRadonDataType(WitnetCBOR.CBOR memory cbor) internal pure returns (RadonDataTypes _type) {
_type = RadonDataTypes.Any;
if (!cbor.eof()) {
if (cbor.majorType <= 6) {
return RadonDataTypes(uint8(bytes1(_CBOR_MAJOR_TYPE_TO_RADON_DATA_TYPES_MAP[cbor.majorType])));
if (cbor.majorType <= 6) {
return RadonDataTypes(uint8(bytes1(_CBOR_MAJOR_TYPE_TO_RADON_DATA_TYPES_MAP[cbor.majorType])));

} else if (cbor.majorType == 7) {
if (cbor.additionalInformation == 20 || cbor.additionalInformation == 21) {
return RadonDataTypes.Bool;

} else if (cbor.majorType == 7) {
if (cbor.additionalInformation == 20 || cbor.additionalInformation == 21) {
return RadonDataTypes.Bool;

} else if (cbor.additionalInformation >= 25 && cbor.additionalInformation <= 27) {
return RadonDataTypes.Float;
}
} else if (cbor.additionalInformation >= 25 && cbor.additionalInformation <= 27) {
return RadonDataTypes.Float;
}
}
}
Expand Down
54 changes: 30 additions & 24 deletions migrations/addresses.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,19 +82,19 @@
},
"celo:sepolia": {
"apps": {
"WitPriceFeedsUpgradableV3": "0x5484018D12F7d726df439Ae66B72b9BD0e143E6d"
"WitPriceFeedsV3Upgradable": "0x94b2237BFbc1c0C3cE60E03fBdaF9e23D0dCB441"
},
"core": {
"WitOracleRadonRegistryUpgradableDefault": "0x6e5Fe5e728139E44B07618C0feDb6ECdF619289B",
"WitOracleRadonRequestFactoryUpgradableDefault": "0xE435BC47535BE780e0FFF240BC2729c707EB8938",
"WitOracleTrustableDefault": "0x8a3a541296A2e7dfb53bDFf80DbAdA9735B9556B"
"WitOracleRadonRegistryUpgradableDefault": "0x5c6c6eE04B7E9b0a66cB0a7CCE3eDB19a05CD853",
"WitOracleRadonRequestFactoryUpgradableDefault": "0xD8D786D81a0E8Ca10BdF038E16eFd1bCCd701fE5",
"WitOracleTrustableDefault": "0x2027FfcFEE67800AB154B8827A10FEd0a978bBe2"
},
"libs": {
"WitOracleDataLib": "0xf6d52770453166de85B6B6260Cf22196bC460E88",
"WitOracleDataLib": "0xA8f0487eaf3640e30F472b815A45a7d4e96f18CB",
"WitOracleRadonEncodingLib": "0xB5447342cA17A40e59d410b340ba412E22e36201",
"WitOracleResultStatusLib": "0xc71A87657b13A370594967A04b4301a3AcEAF007",
"WitPriceFeedsDataLib": "0x705E076F3387cFd59708D8D8508CECe3e1C65C87",
"WitPriceFeedsLegacyDataLib": "0xa45206cC3Ae76630Cc4D47A730590Ff9B6d8Ee54"
"WitOracleResultStatusLib": "0x50AA08187D2F648Dd428784AF6489c3F12e942CC",
"WitPriceFeedsDataLib": "0x8D20457d968c937b7cb65be6B8cC766613fBcF28",
"WitPriceFeedsLegacyDataLib": "0xB772f86004330738C1529cC1b0327D24aeF8c370"
}
},
"celo:mainnet": {
Expand Down Expand Up @@ -202,22 +202,23 @@
},
"ethereum:sepolia": {
"libs": {
"WitOracleDataLib": "0x47ddB2e37A9f352a6dC2c4fEa348E272fd69d7E4",
"WitOracleRadonEncodingLib": "0xFf66F442a1F9449579B181b9D7e0A90022275235",
"WitOracleResultStatusLib": "0xc1D68961298c5F72c672A1519A42Edd1a9598c5c",
"WitPriceFeedsLegacyDataLib": "0x9e1c82ab0809A4996C36ef3dc646B07089F0B903",
"WitPriceFeedsDataLib": "0x9C3b7240ed85b3B88952D1e1d4DD108F85756E8d"
"WitOracleDataLib": "0xfC62b6B0ec3eCF1Fa031B31b468be51E025a36f1",
"WitOracleRadonEncodingLib": "0x12143b6c8E483c9ED438AB934c476432c684cF0F",
"WitOracleResultStatusLib": "0xd5Ef8E34a8e459110373eF2f8f141893921d367A",
"WitPriceFeedsLegacyDataLib": "0xA7389B84D6ABC46b40e88aAD2bbDAf9921649E9E",
"WitPriceFeedsDataLib": "0x58e5A7dbc8001d9400556163B02f08556ed9D2A2"
},
"core": {
"WitOracleTrustableDefault": "0x1C3E70e1dC654A2c62f2b2cEBc1E4A461c6AF231",
"WitOracleRadonRegistryUpgradableDefault": "0xE57814c74bb2419d23230DdB7573c7ab4f4d81B8",
"WitOracleTrustableDefault": "0x329f2A734fF246215922DB1dD6a7061Bc91D400E",
"WitOracleRadonRegistryUpgradableDefault": "0x471c2b44f96Ab95B7688FAaD6fC081f6f464cd93",
"WitOracleRadonRequestFactoryModalsDefault": "0xD28237c5d7C8C386377A13e6661642294657F35e",
"WitOracleRadonRequestFactoryTemplatesDefault": "0x300c8ccc9526495BB7e5911105f0663Cb4c3a137",
"WitOracleRadonRequestFactoryUpgradableDefault": "0xFf8c37Aa98736341bf392e867214661f4fdd0f02"
"WitOracleRadonRequestFactoryUpgradableDefault": "0x622400544d827043B9B064f29305f129C8c7ABA6"
},
"apps": {
"WitPriceFeedsLegacyUpgradable": "0x7c0e1686E88238e07cCda502320058480341Dc83",
"WitPriceFeedsUpgradableV3": "0xA4b96ef00244a99661851594Bd672B5D343c2Da4"
"WitPriceFeedsLegacyUpgradable": "0xb8776103adBfe48366E4B632d9b8cb322E3D524F",
"WitPriceFeedsV3Upgradable": "0xaa2A45356198A4B2f2fedABe60492C549EAFbCde",
"WitPriceFeedsLegacyUpgradableBypass": "0x53D8311197aF484aE65A8D81ba2bbE3A388FE779"
}
},
"gnosis:mainnet": {
Expand Down Expand Up @@ -445,15 +446,20 @@
},
"ten:testnet": {
"libs": {
"WitOracleDataLib": "0xf6d52770453166de85B6B6260Cf22196bC460E88",
"WitOracleDataLib": "0x620e20d91C9b0e11ecAE439E7b85138DA2a1003F",
"WitOracleRadonEncodingLib": "0xB5447342cA17A40e59d410b340ba412E22e36201",
"WitOracleResultStatusLib": "0xc71A87657b13A370594967A04b4301a3AcEAF007",
"WitPriceFeedsDataLib": "0x705E076F3387cFd59708D8D8508CECe3e1C65C87",
"WitPriceFeedsLegacyDataLib": "0xa45206cC3Ae76630Cc4D47A730590Ff9B6d8Ee54"
"WitOracleResultStatusLib": "0x6bF6F65Ad0859e9Ee869DAD252a29c9daAa27449",
"WitPriceFeedsDataLib": "0xB4f1f8E27799256ec95C5b5A8d2A5722Bd542E69",
"WitPriceFeedsLegacyDataLib": "0xdC101573cB42EB7006Ad6C7E08ce8C91fEAcB62C"
},
"apps": {
"WitPriceFeedsLegacyUpgradable": "0x5493D785EcF171B59eF042649c2D71ec62D40D67",
"WitPriceFeedsUpgradableV3": "0xd13c3F2FE72C2A742044699F95be69B9c7b2ad70"
"WitPriceFeedsLegacyUpgradable": "0x34dC777fE9f0128d252349F8130ad48257082eEC",
"WitPriceFeedsV3Upgradable": "0x03577823cFD3dAb66F2ebfCA859C8F7d13fD4C94"
},
"core": {
"WitOracleRadonRegistryUpgradableDefault": "0xA3996b86449c3b36b4Cc94Faa2885b4FeDe915B1",
"WitOracleTrustableObscuro": "0x0F27730943ab0D48D6E42Dc4D7733F67932c4584",
"WitOracleRadonRequestFactoryUpgradableDefault": "0xAef96881Bc0c8b9bc6418D20422DA2D31bF4f831"
}
},
"worldchain:mainnet": {},
Expand Down
Loading