Skip to content

Commit

Permalink
Merge pull request #297 from balancer-labs/develop
Browse files Browse the repository at this point in the history
Release 4.0.1-beta.6
  • Loading branch information
John Grant authored Oct 21, 2022
2 parents 95856d1 + 203e6e1 commit 21d9b34
Show file tree
Hide file tree
Showing 8 changed files with 212 additions and 136 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@balancer-labs/sor",
"version": "4.0.1-beta.5",
"version": "4.0.1-beta.6",
"license": "GPL-3.0-only",
"main": "dist/index.js",
"module": "dist/index.esm.js",
Expand Down
140 changes: 75 additions & 65 deletions src/pools/gyro2Pool/gyro2Pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -361,79 +361,89 @@ export class Gyro2Pool implements PoolBase {
poolPairData: Gyro2PoolPairData,
amount: OldBigNumber
): OldBigNumber {
const balances = [poolPairData.balanceIn, poolPairData.balanceOut];
const normalizedBalances = _normalizeBalances(
balances,
poolPairData.decimalsIn,
poolPairData.decimalsOut
);
const invariant = _calculateInvariant(
normalizedBalances,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const [virtualParamIn, virtualParamOut] = _findVirtualParams(
invariant,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const inAmount = parseFixed(amount.toString(), 18);
const inAmountLessFee = _reduceFee(inAmount, poolPairData.swapFee);
const outAmount = _calcOutGivenIn(
normalizedBalances[0],
normalizedBalances[1],
inAmountLessFee,
virtualParamIn,
virtualParamOut
);
const derivative = _derivativeSpotPriceAfterSwapExactTokenInForTokenOut(
normalizedBalances,
outAmount,
virtualParamOut
);
try {
const balances = [poolPairData.balanceIn, poolPairData.balanceOut];
const normalizedBalances = _normalizeBalances(
balances,
poolPairData.decimalsIn,
poolPairData.decimalsOut
);
const invariant = _calculateInvariant(
normalizedBalances,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const [virtualParamIn, virtualParamOut] = _findVirtualParams(
invariant,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const inAmount = parseFixed(amount.toString(), 18);
const inAmountLessFee = _reduceFee(inAmount, poolPairData.swapFee);
const outAmount = _calcOutGivenIn(
normalizedBalances[0],
normalizedBalances[1],
inAmountLessFee,
virtualParamIn,
virtualParamOut
);
const derivative =
_derivativeSpotPriceAfterSwapExactTokenInForTokenOut(
normalizedBalances,
outAmount,
virtualParamOut
);

return bnum(formatFixed(derivative, 18));
return bnum(formatFixed(derivative, 18));
} catch (error) {
return bnum(0);
}
}

_derivativeSpotPriceAfterSwapTokenInForExactTokenOut(
poolPairData: Gyro2PoolPairData,
amount: OldBigNumber
): OldBigNumber {
const outAmount = parseFixed(amount.toString(), 18);
const balances = [poolPairData.balanceIn, poolPairData.balanceOut];
const normalizedBalances = _normalizeBalances(
balances,
poolPairData.decimalsIn,
poolPairData.decimalsOut
);
const invariant = _calculateInvariant(
normalizedBalances,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const [virtualParamIn, virtualParamOut] = _findVirtualParams(
invariant,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const inAmountLessFee = _calcInGivenOut(
normalizedBalances[0],
normalizedBalances[1],
outAmount,
virtualParamIn,
virtualParamOut
);
const inAmount = _addFee(inAmountLessFee, poolPairData.swapFee);
try {
const outAmount = parseFixed(amount.toString(), 18);
const balances = [poolPairData.balanceIn, poolPairData.balanceOut];
const normalizedBalances = _normalizeBalances(
balances,
poolPairData.decimalsIn,
poolPairData.decimalsOut
);
const invariant = _calculateInvariant(
normalizedBalances,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const [virtualParamIn, virtualParamOut] = _findVirtualParams(
invariant,
poolPairData.sqrtAlpha,
poolPairData.sqrtBeta
);
const inAmountLessFee = _calcInGivenOut(
normalizedBalances[0],
normalizedBalances[1],
outAmount,
virtualParamIn,
virtualParamOut
);
const inAmount = _addFee(inAmountLessFee, poolPairData.swapFee);

const derivative = _derivativeSpotPriceAfterSwapTokenInForExactTokenOut(
normalizedBalances,
inAmount,
outAmount,
virtualParamIn,
virtualParamOut,
poolPairData.swapFee
);
const derivative =
_derivativeSpotPriceAfterSwapTokenInForExactTokenOut(
normalizedBalances,
inAmount,
outAmount,
virtualParamIn,
virtualParamOut,
poolPairData.swapFee
);

return bnum(formatFixed(derivative, 18));
return bnum(formatFixed(derivative, 18));
} catch (error) {
return bnum(0);
}
}
}
136 changes: 73 additions & 63 deletions src/pools/gyro3Pool/gyro3Pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,83 +387,93 @@ export class Gyro3Pool implements PoolBase {
poolPairData: Gyro3PoolPairData,
amount: OldBigNumber
): OldBigNumber {
const balances = [
poolPairData.balanceIn,
poolPairData.balanceOut,
poolPairData.balanceTertiary,
];
const decimals = [
poolPairData.decimalsIn,
poolPairData.decimalsOut,
poolPairData.decimalsTertiary,
];
const normalizedBalances = _normalizeBalances(balances, decimals);

const invariant = _calculateInvariant(
normalizedBalances,
this.root3Alpha
);
try {
const balances = [
poolPairData.balanceIn,
poolPairData.balanceOut,
poolPairData.balanceTertiary,
];
const decimals = [
poolPairData.decimalsIn,
poolPairData.decimalsOut,
poolPairData.decimalsTertiary,
];
const normalizedBalances = _normalizeBalances(balances, decimals);

const virtualOffsetInOut = mulDown(invariant, this.root3Alpha);
const invariant = _calculateInvariant(
normalizedBalances,
this.root3Alpha
);

const inAmount = parseFixed(amount.toString(), 18);
const inAmountLessFee = _reduceFee(inAmount, poolPairData.swapFee);
const virtualOffsetInOut = mulDown(invariant, this.root3Alpha);

const outAmount = _calcOutGivenIn(
normalizedBalances[0],
normalizedBalances[1],
inAmountLessFee,
virtualOffsetInOut
);
const derivative = _derivativeSpotPriceAfterSwapExactTokenInForTokenOut(
normalizedBalances,
outAmount,
virtualOffsetInOut
);
const inAmount = parseFixed(amount.toString(), 18);
const inAmountLessFee = _reduceFee(inAmount, poolPairData.swapFee);

return bnum(formatFixed(derivative, 18));
const outAmount = _calcOutGivenIn(
normalizedBalances[0],
normalizedBalances[1],
inAmountLessFee,
virtualOffsetInOut
);
const derivative =
_derivativeSpotPriceAfterSwapExactTokenInForTokenOut(
normalizedBalances,
outAmount,
virtualOffsetInOut
);

return bnum(formatFixed(derivative, 18));
} catch (error) {
return bnum(0);
}
}

_derivativeSpotPriceAfterSwapTokenInForExactTokenOut(
poolPairData: Gyro3PoolPairData,
amount: OldBigNumber
): OldBigNumber {
const outAmount = parseFixed(amount.toString(), 18);
const balances = [
poolPairData.balanceIn,
poolPairData.balanceOut,
poolPairData.balanceTertiary,
];
const decimals = [
poolPairData.decimalsIn,
poolPairData.decimalsOut,
poolPairData.decimalsTertiary,
];
const normalizedBalances = _normalizeBalances(balances, decimals);
try {
const outAmount = parseFixed(amount.toString(), 18);
const balances = [
poolPairData.balanceIn,
poolPairData.balanceOut,
poolPairData.balanceTertiary,
];
const decimals = [
poolPairData.decimalsIn,
poolPairData.decimalsOut,
poolPairData.decimalsTertiary,
];
const normalizedBalances = _normalizeBalances(balances, decimals);

const invariant = _calculateInvariant(
normalizedBalances,
this.root3Alpha
);
const invariant = _calculateInvariant(
normalizedBalances,
this.root3Alpha
);

const virtualOffsetInOut = mulDown(invariant, this.root3Alpha);
const virtualOffsetInOut = mulDown(invariant, this.root3Alpha);

const inAmountLessFee = _calcInGivenOut(
normalizedBalances[0],
normalizedBalances[1],
outAmount,
virtualOffsetInOut
);
const inAmount = _addFee(inAmountLessFee, poolPairData.swapFee);
const inAmountLessFee = _calcInGivenOut(
normalizedBalances[0],
normalizedBalances[1],
outAmount,
virtualOffsetInOut
);
const inAmount = _addFee(inAmountLessFee, poolPairData.swapFee);

const derivative = _derivativeSpotPriceAfterSwapTokenInForExactTokenOut(
normalizedBalances,
inAmount,
outAmount,
virtualOffsetInOut,
poolPairData.swapFee
);
const derivative =
_derivativeSpotPriceAfterSwapTokenInForExactTokenOut(
normalizedBalances,
inAmount,
outAmount,
virtualOffsetInOut,
poolPairData.swapFee
);

return bnum(formatFixed(derivative, 18));
return bnum(formatFixed(derivative, 18));
} catch (error) {
return bnum(0);
}
}
}
15 changes: 13 additions & 2 deletions src/router/helpersClass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,12 @@ export function EVMgetOutputAmountSwap(
swapType: SwapTypes,
amount: OldBigNumber
): OldBigNumber {
//we recalculate the pool pair data since balance updates are not reflected immediately in cached poolPairData
poolPairData = pool.parsePoolPairData(
poolPairData.tokenIn,
poolPairData.tokenOut
);

const { balanceIn, balanceOut, tokenIn, tokenOut } = poolPairData;

let returnAmount: OldBigNumber;
Expand Down Expand Up @@ -356,12 +362,17 @@ export function EVMgetOutputAmountSwap(
throw Error('Unsupported swap');
}
}

const amountIn = swapType === SwapTypes.SwapExactIn ? amount : returnAmount;
const amountOut =
swapType === SwapTypes.SwapExactIn ? returnAmount : amount;

// Update balances of tokenIn and tokenOut
pool.updateTokenBalanceForPool(
tokenIn,
balanceIn.add(
parseFixed(
returnAmount.dp(poolPairData.decimalsIn).toString(),
amountIn.dp(poolPairData.decimalsIn).toString(),
poolPairData.decimalsIn
)
)
Expand All @@ -370,7 +381,7 @@ export function EVMgetOutputAmountSwap(
tokenOut,
balanceOut.sub(
parseFixed(
amount.dp(poolPairData.decimalsOut).toString(),
amountOut.dp(poolPairData.decimalsOut).toString(),
poolPairData.decimalsOut
)
)
Expand Down
10 changes: 10 additions & 0 deletions test/testScripts/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,16 @@ export const ADDRESSES = {
decimals: 18,
symbol: 'bb-a-dai2',
},
RPL: {
address: '0xD33526068D116cE69F19A9ee46F0bd304F21A51f',
decimals: 18,
symbol: 'RPL',
},
rETH: {
address: '0xae78736Cd615f374D3085123A210448E74Fc6393',
decimals: 18,
symbol: 'rETH',
},
},
[Network.KOVAN]: {
// Visit https://balancer-faucet.on.fleek.co/#/faucet for test tokens
Expand Down
8 changes: 4 additions & 4 deletions test/testScripts/swapExample.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,10 @@ export async function swap(): Promise<void> {
const gasPrice = BigNumber.from('40000000000');
// This determines the max no of pools the SOR will use to swap.
const maxPools = 4;
const tokenIn = ADDRESSES[networkId].DAI;
const tokenOut = ADDRESSES[networkId].USDC;
const swapType: SwapTypes = SwapTypes.SwapExactIn;
const swapAmount = parseFixed('0.001', 18);
const tokenIn = ADDRESSES[networkId].USDC;
const tokenOut = ADDRESSES[networkId].WETH;
const swapType: SwapTypes = SwapTypes.SwapExactOut;
const swapAmount = parseFixed('1.7', 18);

const sor = setUp(networkId, provider);

Expand Down
Loading

0 comments on commit 21d9b34

Please sign in to comment.