Skip to content

Commit

Permalink
Re-organize dependency tree and add Fund to oracleFactory (#37)
Browse files Browse the repository at this point in the history
* Change dependency tree

* Add 'fund' to OracleFactory
  • Loading branch information
arjun-io authored Jul 21, 2023
1 parent fe62ef1 commit 74c9e41
Show file tree
Hide file tree
Showing 41 changed files with 151 additions and 80 deletions.
2 changes: 1 addition & 1 deletion packages/perennial-oracle/contracts/Oracle.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
pragma solidity 0.8.19;

import "@equilibria/root-v2/contracts/Instance.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IOracleProviderFactory.sol";
import "./interfaces/IOracle.sol";
import "./interfaces/IOracleProviderFactory.sol";

/// @title Oracle
/// @notice The top-level oracle contract that implements an oracle provider interface.
Expand Down
9 changes: 8 additions & 1 deletion packages/perennial-oracle/contracts/OracleFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity 0.8.19;

import "@equilibria/root/token/types/Token18.sol";
import "@equilibria/root-v2/contracts/Factory.sol";
import "./interfaces/IOracleProviderFactory.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IOracleProviderFactory.sol";
import "./interfaces/IOracleFactory.sol";

/// @title OracleFactory
Expand Down Expand Up @@ -105,4 +105,11 @@ contract OracleFactory is IOracleFactory, Factory {
if (!callerFactory.instances(callerInstance)) return false;
return callers[callerFactory];
}

// @notice Claims the oracle's fee from the given market
/// @param market The market to claim from
function fund(IMarket market) external {
if (!instances(IInstance(address(market.oracle())))) revert FactoryNotInstanceError();
market.claimFee();
}
}
2 changes: 1 addition & 1 deletion packages/perennial-oracle/contracts/interfaces/IOracle.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity ^0.8.13;

import "@equilibria/root-v2/contracts/IInstance.sol";
import "./IOracleProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IOracleProvider.sol";

interface IOracle is IOracleProvider, IInstance {
error OracleOutOfSyncError();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ pragma solidity ^0.8.13;

import "@equilibria/root/token/types/Token18.sol";
import "@equilibria/root-v2/contracts/IFactory.sol";
import "./IOracleProviderFactory.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IOracleProviderFactory.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IMarket.sol";
import "./IOracle.sol";

interface IOracleFactory is IOracleProviderFactory, IFactory {
Expand All @@ -26,4 +27,5 @@ interface IOracleFactory is IOracleProviderFactory, IFactory {
function maxClaim() external view returns (UFixed6);
function claim(UFixed6 amount) external;
function callers(IFactory caller) external view returns (bool);
function fund(IMarket market) external;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity ^0.8.13;

import "@equilibria/root/token/types/Token18.sol";
import "@equilibria/root-v2/contracts/IFactory.sol";
import "./IOracleProviderFactory.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IOracleProviderFactory.sol";
import "./IPythOracle.sol";
import "./IOracleFactory.sol";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity ^0.8.13;

import "@equilibria/root-v2/contracts/IInstance.sol";
import "@equilibria/root-v2/contracts/IKept.sol";
import "./IOracleProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IOracleProvider.sol";

interface IPythOracle is IOracleProvider, IInstance, IKept {
error PythOracleInvalidPriceIdError(bytes32 id);
Expand Down
4 changes: 3 additions & 1 deletion packages/perennial-oracle/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,7 @@
},
"author": "",
"license": "APACHE-2.0",
"dependencies": {}
"dependencies": {
"@equilibria/perennial-v2": "1.0.0"
}
}
32 changes: 32 additions & 0 deletions packages/perennial-oracle/test/unit/oracle/OracleFactory.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
IFactory,
IInstance,
IOracle,
IMarket,
} from '../../../types/generated'
import { constants } from 'ethers'
import { parse6decimal } from '../../../../common/testutil/types'
Expand Down Expand Up @@ -294,4 +295,35 @@ describe('OracleFactory', () => {
expect(await factory.authorized(subInstance.address)).to.be.false
})
})

describe('#fund', () => {
let fakeMarket: FakeContract<IMarket>

beforeEach(async () => {
fakeMarket = await smock.fake<IMarket>('IMarket')
await factory.connect(owner).register(subOracleFactory.address)

subOracleFactory.oracles.whenCalledWith(PYTH_ETH_USD_PRICE_FEED).returns(subOracle.address)

const oracleAddress = await factory.callStatic.create(PYTH_ETH_USD_PRICE_FEED, subOracleFactory.address)
await factory.connect(owner).create(PYTH_ETH_USD_PRICE_FEED, subOracleFactory.address)

fakeMarket.oracle.returns(oracleAddress)
})

it('claims its fees', async () => {
await factory.connect(user).fund(fakeMarket.address)

expect(fakeMarket.claimFee).to.have.been.called
})

it('reverts if not an instance', async () => {
fakeMarket.oracle.reset()
fakeMarket.oracle.returns(user.address)
await expect(factory.connect(user).fund(fakeMarket.address)).to.be.revertedWithCustomError(
factory,
'FactoryNotInstanceError',
)
})
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity ^0.8.13;

import "@equilibria/root-v2/contracts/IFactory.sol";
import "./IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

interface IPayoffFactory is IFactory {
function initialize() external;
Expand Down
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/Giga.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract Giga is IPayoffProvider {
Fixed6 private constant MULTIPLICAND = Fixed6.wrap(1e15);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(MULTIPLICAND); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(MULTIPLICAND);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/Kilo.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract Kilo is IPayoffProvider {
Fixed6 private constant MULTIPLICAND = Fixed6.wrap(1e9);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(MULTIPLICAND); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(MULTIPLICAND);
}
}
8 changes: 6 additions & 2 deletions packages/perennial-payoff/contracts/payoff/KiloPowerHalf.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@
pragma solidity 0.8.19;

import "@openzeppelin/contracts/utils/math/Math.sol";
import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract KiloPowerHalf is IPayoffProvider {
uint256 private constant BASE = 1e6;
UFixed6 private constant MULTIPLICAND = UFixed6.wrap(1e9);

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return Fixed6Lib.from(UFixed6.wrap(Math.sqrt(UFixed6.unwrap(price.abs().mul(MULTIPLICAND).mul(MULTIPLICAND)) * BASE)));
return
Fixed6Lib.from(
UFixed6.wrap(Math.sqrt(UFixed6.unwrap(price.abs().mul(MULTIPLICAND).mul(MULTIPLICAND)) * BASE))
);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/KiloPowerTwo.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract KiloPowerTwo is IPayoffProvider {
Fixed6 private constant MULTIPLICAND = Fixed6.wrap(1e9);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(price).mul(MULTIPLICAND); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(price).mul(MULTIPLICAND);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/Mega.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract Mega is IPayoffProvider {
Fixed6 private constant MULTIPLICAND = Fixed6.wrap(1e12);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(MULTIPLICAND); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(MULTIPLICAND);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/MegaPowerTwo.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract MegaPowerTwo is IPayoffProvider {
Fixed6 private constant MULTIPLICAND = Fixed6.wrap(1e12);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(price).mul(MULTIPLICAND); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(price).mul(MULTIPLICAND);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/Micro.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract Micro is IPayoffProvider {
Fixed6 private constant DIVISOR = Fixed6.wrap(1e12);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.div(DIVISOR); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.div(DIVISOR);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/MicroPowerTwo.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract MicroPowerTwo is IPayoffProvider {
Fixed6 private constant DIVISOR = Fixed6.wrap(1e12);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(price).div(DIVISOR); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(price).div(DIVISOR);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/Milli.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract Milli is IPayoffProvider {
Fixed6 private constant DIVISOR = Fixed6.wrap(1e9);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.div(DIVISOR); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.div(DIVISOR);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
pragma solidity 0.8.19;

import "@openzeppelin/contracts/utils/math/Math.sol";
import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract MilliPowerHalf is IPayoffProvider {
uint256 private constant BASE = 1e6;
Fixed6 private constant DIVISOR = Fixed6.wrap(1e9);

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return Fixed6Lib.from(UFixed6.wrap(Math.sqrt(UFixed6.unwrap(price.abs()) * BASE))).div(DIVISOR);
}
Expand Down
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/MilliPowerTwo.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract MilliPowerTwo is IPayoffProvider {
Fixed6 private constant DIVISOR = Fixed6.wrap(1e9);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(price).div(DIVISOR); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(price).div(DIVISOR);
}
}
7 changes: 5 additions & 2 deletions packages/perennial-payoff/contracts/payoff/Nano.sol
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract Nano is IPayoffProvider {
Fixed6 private constant DIVISOR = Fixed6.wrap(1e15);
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.div(DIVISOR); }

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.div(DIVISOR);
}
}
3 changes: 2 additions & 1 deletion packages/perennial-payoff/contracts/payoff/PowerHalf.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
pragma solidity 0.8.19;

import "@openzeppelin/contracts/utils/math/Math.sol";
import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract PowerHalf is IPayoffProvider {
uint256 private constant BASE = 1e6;

function payoff(Fixed6 price) external pure override returns (Fixed6) {
return Fixed6Lib.from(UFixed6.wrap(Math.sqrt(UFixed6.unwrap(price.abs()) * BASE)));
}
Expand Down
6 changes: 4 additions & 2 deletions packages/perennial-payoff/contracts/payoff/PowerTwo.sol
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.19;

import "../interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2/contracts/interfaces/IPayoffProvider.sol";

contract PowerTwo is IPayoffProvider {
function payoff(Fixed6 price) external pure override returns (Fixed6) { return price.mul(price); }
function payoff(Fixed6 price) external pure override returns (Fixed6) {
return price.mul(price);
}
}
4 changes: 3 additions & 1 deletion packages/perennial-payoff/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@
},
"author": "",
"license": "APACHE-2.0",
"dependencies": {}
"dependencies": {
"@equilibria/perennial-v2": "1.0.0"
}
}
4 changes: 3 additions & 1 deletion packages/perennial-vault/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@
},
"author": "",
"license": "APACHE-2.0",
"dependencies": {}
"dependencies": {
"@equilibria/perennial-v2": "1.0.0"
}
}
4 changes: 2 additions & 2 deletions packages/perennial/contracts/MarketFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
pragma solidity 0.8.19;

import "@equilibria/root-v2/contracts/Factory.sol";
import "@equilibria/perennial-v2-payoff/contracts/interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2-oracle/contracts/interfaces/IOracleProvider.sol";
import "./interfaces/IPayoffProvider.sol";
import "./interfaces/IOracleProvider.sol";
import "./interfaces/IMarketFactory.sol";

/// @title MarketFactory
Expand Down
6 changes: 3 additions & 3 deletions packages/perennial/contracts/interfaces/IMarket.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ pragma solidity ^0.8.13;
import "@equilibria/root-v2/contracts/IInstance.sol";
import "@equilibria/root/number/types/UFixed6.sol";
import "@equilibria/root/token/types/Token18.sol";
import "@equilibria/perennial-v2-oracle/contracts/interfaces/IOracleProvider.sol";
import "@equilibria/perennial-v2-payoff/contracts/interfaces/IPayoffProvider.sol";
import "@equilibria/perennial-v2-oracle/contracts/types/OracleVersion.sol";
import "./IOracleProvider.sol";
import "./IPayoffProvider.sol";
import "../types/OracleVersion.sol";
import "../types/MarketParameter.sol";
import "../types/RiskParameter.sol";
import "../types/Version.sol";
Expand Down
Loading

0 comments on commit 74c9e41

Please sign in to comment.