Skip to content

Commit

Permalink
feat(whitelist-house): extend house contract to use whitelist feature
Browse files Browse the repository at this point in the history
  • Loading branch information
kinrezC committed Jul 12, 2021
1 parent 0cb7242 commit 00a5db0
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 21 deletions.
6 changes: 4 additions & 2 deletions contracts/Admin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ contract Admin is IAdmin {
_;
}

constructor() {}

/// @param _admin The address receiving the admin rights
constructor(address _admin) {
admin = _admin;
function initializeAdmin(address _admin) internal {
admin = _admin;
}

/// @inheritdoc IAdmin
Expand Down
26 changes: 15 additions & 11 deletions contracts/PrimitiveHouse.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
pragma solidity 0.8.0;

import "./interfaces/IPrimitiveHouse.sol";
import "./Whitelist.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol";
import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol";
Expand All @@ -10,7 +11,10 @@ import "@primitivefinance/primitive-v2-core/contracts/interfaces/engine/IPrimiti
import "@primitivefinance/primitive-v2-core/contracts/libraries/Margin.sol";
import "@primitivefinance/primitive-v2-core/contracts/libraries/Position.sol";

contract PrimitiveHouse is IPrimitiveHouse {
contract PrimitiveHouse is
Whitelist,
IPrimitiveHouse
{
using SafeERC20 for IERC20;
using Margin for mapping(address => Margin.Data);
using Margin for Margin.Data;
Expand All @@ -29,7 +33,7 @@ contract PrimitiveHouse is IPrimitiveHouse {
mapping(address => Margin.Data) _margins;
mapping(bytes32 => Position.Data) _positions;

constructor() {}
constructor() Whitelist() {}

modifier lock() {
require(reentrant != 1, "locked");
Expand Down Expand Up @@ -57,7 +61,7 @@ contract PrimitiveHouse is IPrimitiveHouse {
uint64 sigma,
uint32 time,
uint riskyPrice
) external override lock {
) external override lock onlyWhitelisted {
IPrimitiveEngineActions(engine).create(
strike,
sigma,
Expand All @@ -72,7 +76,7 @@ contract PrimitiveHouse is IPrimitiveHouse {
address owner,
uint256 delRisky,
uint256 delStable
) external override lock {
) external override lock onlyWhitelisted {
IPrimitiveEngineActions(engine).deposit(
address(this),
delRisky,
Expand All @@ -88,7 +92,7 @@ contract PrimitiveHouse is IPrimitiveHouse {
function withdraw(
uint256 delRisky,
uint256 delStable
) external override lock {
) external override lock onlyWhitelisted {
IPrimitiveEngineActions(engine).withdraw(delRisky, delStable);

_margins.withdraw(delRisky, delStable);
Expand All @@ -102,7 +106,7 @@ contract PrimitiveHouse is IPrimitiveHouse {
address owner,
uint256 delLiquidity,
bool fromMargin
) external override lock {
) external override lock onlyWhitelisted {
(uint256 delRisky, uint256 delStable) = IPrimitiveEngineActions(engine).allocate(
poolId,
address(this),
Expand All @@ -126,7 +130,7 @@ contract PrimitiveHouse is IPrimitiveHouse {
address owner,
uint256 delLiquidity,
uint256 maxPremium
) external override lock {
) external override lock onlyWhitelisted {
IPrimitiveEngineActions(engine).borrow(
poolId,
delLiquidity,
Expand All @@ -142,7 +146,7 @@ contract PrimitiveHouse is IPrimitiveHouse {
address owner,
uint256 delLiquidity,
bool fromMargin
) external override lock {
) external override lock onlyWhitelisted {
bytes memory data = '0x';
(uint256 delRisky, uint256 delStable, uint256 premium) = IPrimitiveEngineActions(engine).repay(
poolId,
Expand All @@ -167,21 +171,21 @@ contract PrimitiveHouse is IPrimitiveHouse {
uint256 deltaOut,
uint256 deltaInMax,
bytes calldata data
) external override lock {
) external override lock onlyWhitelisted {
IPrimitiveEngineActions(engine).swap(poolId, addXRemoveY, deltaOut, deltaInMax, true, data);
}

function swapXForY(
bytes32 poolId,
uint256 deltaOut
) external override lock {
) external override lock onlyWhitelisted {
IPrimitiveEngineActions(engine).swap(poolId, true, deltaOut, type(uint256).max, true, new bytes(0));
}

function swapYForX(
bytes32 poolId,
uint256 deltaOut
) external override lock {
) external override lock onlyWhitelisted {
IPrimitiveEngineActions(engine).swap(poolId, false, deltaOut, type(uint256).max, true, new bytes(0));
}

Expand Down
2 changes: 2 additions & 0 deletions contracts/PrimitiveHouseFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import "./interfaces/IPrimitiveHouseFactory.sol";
import "./PrimitiveHouse.sol";
import "./interfaces/IAdmin.sol";

contract PrimitiveHouseFactory is IPrimitiveHouseFactory {
/// @inheritdoc IPrimitiveHouseFactory
Expand All @@ -29,6 +30,7 @@ contract PrimitiveHouseFactory is IPrimitiveHouseFactory {
require(engine != address(0), "Cannot be same token");
house = deploy(address(this), engine);
getHouse[engine] = house;
IAdmin(house).setAdmin(msg.sender);
emit Deployed(msg.sender, engine, house);
}

Expand Down
8 changes: 4 additions & 4 deletions contracts/Whitelist.sol
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ contract Whitelist is IWhitelist, Admin {
}


/// EFFECT FUNCTIONS ///

/// @param _admin The address of the admin
constructor(address _admin) Admin(_admin) { }
constructor() {
initializeAdmin(msg.sender);
}


/// @inheritdoc IWhitelist
function addKeys(bytes32[] memory hashes) external override onlyAdmin() {
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@primitivefinance/primitive-v2-periphery",
"version": "0.0.1",
"version": "0.1.1",
"description": "Primitive V2 periphery smart contracts.",
"main": "index.js",
"keywords": [
Expand All @@ -12,6 +12,8 @@
"contracts",
"artifacts/contracts/PrimitiveEngine.sol/PrimitiveHouse.json",
"artifacts/contracts/PrimitiveFactory.sol/PrimitiveHouseFactory.json",
"artifacts/contracts/Admin.sol/Admin.json",
"artifacts/contracts/Whitelist.sol/Whitelist.json",
"artifacts/contracts/interfaces/**/*.json",
"!artifacts/contracts/interfaces/**/*.dbg.json"
],
Expand Down
8 changes: 5 additions & 3 deletions test/unit/createTestContracts.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import hre, { ethers } from 'hardhat'
import { Wallet, Contract } from 'ethers'
import { Wallet, Contract, utils } from 'ethers'
import { Contracts } from '../../types'
import { deployContract } from 'ethereum-waffle'
import * as ContractTypes from '../../typechain'
Expand Down Expand Up @@ -34,8 +34,10 @@ async function initializeBaseContracts(deployer: Wallet): Promise<BaseContracts>
await houseFactory.deploy(engine.address)
const houseAddr = await houseFactory.getHouse(engine.address)
const house = (await ethers.getContractAt(PrimitiveHouseAbi, houseAddr)) as unknown as ContractTypes.PrimitiveHouse
const admin = (await deploy('Admin', deployer, [deployer.address])) as ContractTypes.Admin
const whitelist = (await deploy('Whitelist', deployer, [deployer.address])) as ContractTypes.Whitelist
await house.addKeys([utils.solidityKeccak256(['string'], ['wentoken'])])
await house.useKey('wentoken', deployer.address)
const admin = (await deploy('Admin', deployer)) as ContractTypes.Admin
const whitelist = (await deploy('Whitelist', deployer)) as ContractTypes.Whitelist
return { factory, engine, stable, risky, house, houseFactory, admin, whitelist }
}

Expand Down

0 comments on commit 00a5db0

Please sign in to comment.