Skip to content
Draft
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
80 changes: 0 additions & 80 deletions src/ConstantSum/ConstantSum.sol
Original file line number Diff line number Diff line change
Expand Up @@ -89,86 +89,6 @@ contract ConstantSum is Strategy {
return (valid, invariant, reserves, totalLiquidity);
}

function validateAllocate(
address,
uint256 poolId,
Pool memory pool,
bytes calldata data
)
external
view
override
returns (
bool valid,
int256 invariant,
uint256[] memory deltas,
uint256 deltaLiquidity
)
{
(uint256 deltaX, uint256 deltaY, uint256 minDeltaL) =
abi.decode(data, (uint256, uint256, uint256));

deltaLiquidity = computeDeltaLiquidityRoundDown(
deltaX, deltaY, internalParams[poolId].price
);
if (deltaLiquidity < minDeltaL) revert InvalidDeltaLiquidity();

deltas = new uint256[](2);
deltas[0] = deltaX;
deltas[1] = deltaY;

pool.reserves[0] += deltaX;
pool.reserves[1] += deltaY;

invariant = tradingFunction(
pool.reserves,
pool.totalLiquidity + deltaLiquidity,
getPoolParams(poolId)
);

valid = invariant >= 0;
}

function validateDeallocate(
address,
uint256 poolId,
Pool memory pool,
bytes calldata data
)
external
view
override
returns (
bool valid,
int256 invariant,
uint256[] memory deltas,
uint256 deltaLiquidity
)
{
(uint256 deltaX, uint256 deltaY, uint256 maxDeltaL) =
abi.decode(data, (uint256, uint256, uint256));

deltaLiquidity = computeDeltaLiquidityRoundUp(
deltaX, deltaY, internalParams[poolId].price
);
if (deltaLiquidity > maxDeltaL) revert InvalidDeltaLiquidity();

deltas = new uint256[](2);
deltas[0] = deltaX;
deltas[1] = deltaY;

pool.reserves[0] -= deltaX;
pool.reserves[1] -= deltaY;

invariant = tradingFunction(
pool.reserves,
pool.totalLiquidity - deltaLiquidity,
getPoolParams(poolId)
);

valid = invariant >= 0;
}

/// @inheritdoc IStrategy
function update(
address sender,
Expand Down
21 changes: 19 additions & 2 deletions src/ConstantSum/ConstantSumSolver.sol
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,33 @@ contract ConstantSumSolver is ISolver {

ConstantSumParams memory params = getPoolParams(poolId);

uint256 deltaLiquidity =
computeDeltaLiquidityRoundDown(deltas[0], deltas[1], params.price);

return abi.encode(deltas, deltaLiquidity);
}

/// @inheritdoc ISolver
function prepareAllocationProportional(
uint256 poolId,
uint256[] memory deltas
) external view returns (bytes memory) {
if (deltas.length != 2) revert InvalidDeltasLength();

ConstantSumParams memory params = getPoolParams(poolId);

uint256 deltaLGivenDeltaX =
computeDeltaLiquidityRoundDown(deltas[0], 0, params.price);

uint256 deltaLGivenDeltaY =
computeDeltaLiquidityRoundDown(0, deltas[1], params.price);

if (deltaLGivenDeltaX < deltaLGivenDeltaY) {
return abi.encode(deltas[0], 0, deltaLGivenDeltaX);
deltas[1] = 0;
return abi.encode(deltas, deltaLGivenDeltaX);
} else {
return abi.encode(0, deltas[1], deltaLGivenDeltaY);
deltas[0] = 0;
return abi.encode(deltas, deltaLGivenDeltaY);
}
}

Expand Down
43 changes: 3 additions & 40 deletions src/CoveredCall/CoveredCall.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity 0.8.22;

import { Pool } from "src/interfaces/IDFMM.sol";
import { PairStrategy, IStrategy } from "src/PairStrategy.sol";
import { Strategy, IStrategy } from "src/Strategy.sol";
import { IDFMM } from "src/interfaces/IDFMM.sol";
import { DynamicParamLib, DynamicParam } from "src/lib/DynamicParamLib.sol";
import {
Expand Down Expand Up @@ -67,7 +67,7 @@ uint256 constant MAX_MEAN = uint256(type(int256).max);
* @title CoveredCall Strategy for DFMM.
* @author Primitive
*/
contract CoveredCall is PairStrategy {
contract CoveredCall is Strategy {
using DynamicParamLib for DynamicParam;

/// @inheritdoc IStrategy
Expand All @@ -76,7 +76,7 @@ contract CoveredCall is PairStrategy {
mapping(uint256 => InternalParams) public internalParams;

/// @param dfmm_ Address of the DFMM contract.
constructor(address dfmm_) PairStrategy(dfmm_) { }
constructor(address dfmm_) Strategy(dfmm_) { }

/// @inheritdoc IStrategy
function init(
Expand Down Expand Up @@ -240,43 +240,6 @@ contract CoveredCall is PairStrategy {
);
}

/// @inheritdoc PairStrategy
function _computeAllocateDeltasGivenDeltaL(
uint256 deltaLiquidity,
Pool memory pool,
bytes memory
) internal pure override returns (uint256[] memory) {
uint256[] memory deltas = new uint256[](2);

deltas[0] = computeDeltaGivenDeltaLRoundUp(
pool.reserves[0], deltaLiquidity, pool.totalLiquidity
);

deltas[1] = computeDeltaGivenDeltaLRoundUp(
pool.reserves[1], deltaLiquidity, pool.totalLiquidity
);

return deltas;
}

/// @inheritdoc PairStrategy
function _computeDeallocateDeltasGivenDeltaL(
uint256 deltaLiquidity,
Pool memory pool,
bytes memory
) internal pure override returns (uint256[] memory) {
uint256[] memory deltas = new uint256[](2);

deltas[0] = computeDeltaGivenDeltaLRoundDown(
pool.reserves[0], deltaLiquidity, pool.totalLiquidity
);

deltas[1] = computeDeltaGivenDeltaLRoundDown(
pool.reserves[1], deltaLiquidity, pool.totalLiquidity
);
return deltas;
}

function _computeSwapDeltaLiquidity(
Pool memory pool,
bytes memory params,
Expand Down
37 changes: 34 additions & 3 deletions src/CoveredCall/CoveredCallSolver.sol
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,30 @@ contract CoveredCallSolver is ISolver {
) public view returns (bytes memory) {
if (deltas.length != 2) revert InvalidDeltasLength();

(uint256[] memory reserves, uint256 totalLiquidity) =
getReservesAndLiquidity(poolId);

CoveredCallParams memory params = getPoolParams(poolId);
int256 lastInvariant = computeTradingFunction(
reserves[0], reserves[1], totalLiquidity, params
);

uint256 nextReserveX = reserves[0] + deltas[0];
uint256 nextReserveY = reserves[1] + deltas[1];
uint256 nextLiquidity = computeNextLiquidity(
nextReserveX, nextReserveY, lastInvariant, totalLiquidity, params
);
uint256 deltaLiquidity = nextLiquidity - totalLiquidity;

return abi.encode(deltas, deltaLiquidity);
}

function prepareAllocationProportional(
uint256 poolId,
uint256[] calldata deltas
) public view returns (bytes memory) {
if (deltas.length != 2) revert InvalidDeltasLength();

(uint256[] memory reserves, uint256 totalLiquidity) =
getReservesAndLiquidity(poolId);

Expand All @@ -156,10 +180,13 @@ contract CoveredCallSolver is ISolver {
deltaLGivenDeltaY, totalLiquidity, reserves[0]
);

uint256[] memory allocateDeltas = deltas;
if (deltaLGivenDeltaX < deltaLGivenDeltaY) {
return abi.encode(deltas[0], deltaYGivenDeltaX, deltaLGivenDeltaX);
allocateDeltas[1] = deltaYGivenDeltaX;
return abi.encode(allocateDeltas, deltaLGivenDeltaX);
} else {
return abi.encode(deltaXGivenDeltaL, deltas[1], deltaLGivenDeltaY);
allocateDeltas[0] = deltaXGivenDeltaL;
return abi.encode(allocateDeltas, deltaLGivenDeltaY);
}
}

Expand All @@ -176,7 +203,11 @@ contract CoveredCallSolver is ISolver {
uint256 deltaY =
computeDeltaYGivenDeltaL(deltaLiquidity, liquidity, reserves[1]);

return abi.encode(deltaX, deltaY, deltaLiquidity);
uint256[] memory deltas = new uint256[](reserves.length);
deltas[0] = deltaX;
deltas[1] = deltaY;

return abi.encode(deltas, deltaLiquidity);
}

struct SimulateSwapState {
Expand Down
31 changes: 28 additions & 3 deletions src/GeometricMean/GeometricMeanSolver.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
computePrice,
computeSwapDeltaLiquidity,
computeDeltaGivenDeltaLRoundUp,
computeL,
ONE
} from "./G3MMath.sol";
import {
Expand Down Expand Up @@ -62,6 +63,24 @@ contract GeometricMeanSolver is ISolver {
) external view returns (bytes memory) {
if (deltas.length != 2) revert InvalidDeltasLength();

(uint256[] memory reserves, uint256 totalLiquidity) =
getReservesAndLiquidity(poolId);

GeometricMeanParams memory params = getPoolParams(poolId);

uint256 deltaLiquidity =
computeL(reserves[0] + deltas[0], reserves[1] + deltas[1], params) - totalLiquidity;

return abi.encode(deltas, deltaLiquidity);
}

/// @inheritdoc ISolver
function prepareAllocationProportional(
uint256 poolId,
uint256[] memory deltas
) external view returns (bytes memory) {
if (deltas.length != 2) revert InvalidDeltasLength();

(uint256[] memory reserves, uint256 totalLiquidity) =
getReservesAndLiquidity(poolId);

Expand All @@ -76,9 +95,11 @@ contract GeometricMeanSolver is ISolver {
);

if (deltaLGivenX < deltaLGivenY) {
return abi.encode(deltas[0], deltaYGivenX, deltaLGivenX);
deltas[1] = deltaYGivenX;
return abi.encode(deltas, deltaLGivenX);
} else {
return abi.encode(deltaXGivenY, deltas[1], deltaLGivenY);
deltas[0] = deltaXGivenY;
return abi.encode(deltas, deltaLGivenY);
}
}

Expand All @@ -98,7 +119,11 @@ contract GeometricMeanSolver is ISolver {
reserves[1], deltaLiquidity, liquidity
);

return abi.encode(deltaX, deltaY, deltaLiquidity);
uint[] memory deltas = new uint[](reserves.length);
deltas[0] = deltaX;
deltas[1] = deltaY;

return abi.encode(deltas, deltaLiquidity);
}

struct SimulateSwapState {
Expand Down
37 changes: 31 additions & 6 deletions src/LogNormal/LogNormalSolver.sol
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,31 @@ contract LogNormalSolver is ISolver {
) external view override returns (bytes memory) {
if (deltas.length != 2) revert InvalidDeltasLength();

(uint256[] memory reserves, uint256 totalLiquidity) =
getReservesAndLiquidity(poolId);

LogNormalParams memory params = getPoolParams(poolId);
int256 lastInvariant = computeTradingFunction(
reserves[0], reserves[1], totalLiquidity, params
);

uint256 nextReserveX = reserves[0] + deltas[0];
uint256 nextReserveY = reserves[1] + deltas[1];
uint256 nextLiquidity = computeNextLiquidity(
nextReserveX, nextReserveY, lastInvariant, totalLiquidity, params
);
uint deltaLiquidity = nextLiquidity - totalLiquidity;

return abi.encode(deltas, deltaLiquidity);
}

/// @inheritdoc ISolver
function prepareAllocationProportional(
uint256 poolId,
uint256[] calldata deltas
) external view override returns (bytes memory) {
if (deltas.length != 2) revert InvalidDeltasLength();

(uint256[] memory reserves, uint256 totalLiquidity) =
getReservesAndLiquidity(poolId);

Expand Down Expand Up @@ -117,7 +142,11 @@ contract LogNormalSolver is ISolver {
uint256 deltaY =
computeDeltaYGivenDeltaL(deltaLiquidity, liquidity, reserves[1]);

return abi.encode(deltaX, deltaY, deltaLiquidity);
uint256[] memory deltas = new uint256[](reserves.length);
deltas[0] = deltaX;
deltas[1] = deltaY;

return abi.encode(deltas, deltaLiquidity);
}

struct SimulateSwapState {
Expand Down Expand Up @@ -220,11 +249,7 @@ contract LogNormalSolver is ISolver {
address(this), poolId, pool, swapData
);

return (
valid,
state.amountOut,
swapData
);
return (valid, state.amountOut, swapData);
}

/// @inheritdoc ISolver
Expand Down
Loading