https://github.com/balancer/balancer-sor-v1
Legacy SOR for V1
https://github.com/balancer/balancer-sor-v1
Last synced: about 1 year ago
JSON representation
Legacy SOR for V1
- Host: GitHub
- URL: https://github.com/balancer/balancer-sor-v1
- Owner: balancer
- Created: 2021-08-18T10:32:13.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2021-08-18T10:32:32.000Z (almost 5 years ago)
- Last Synced: 2025-03-28T02:38:52.793Z (about 1 year ago)
- Language: TypeScript
- Size: 540 KB
- Stars: 3
- Watchers: 6
- Forks: 6
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Smart Order Router (SOR)
Smart Order Router, or SOR, is an off-chain linear optimization of routing orders across pools for best price execution.
SOR exists in the Bronze release as a way to aggregate liquidity across all Balancer pools. Future releases of Balancer will accomplish this on-chain and allow aggregate contract fillable liquidity.
Liquidity aggregators are free to use the SOR npm package or create their own order routing across pools.
[Read More](https://docs.balancer.finance/protocol/sor)
## Overview Of Use And Example
There are two types of swap available:
**swapExactIn** - i.e. You want to swap exactly 1 ETH as input and SOR will calculate X amount of BAL you receive in return.
or
**swapExactOut** - i.e. You want to receive exactly 1 BAL and SOR will calculate X amount of ETH you must input.
The SOR will return totalReturn/totalInput as well as a list swaps to achieve the total. Swaps can be through direct pools, i.e. A > POOL1 > B, or via a multihop pool, i.e. A > POOL1 > C > POOL2 > B. The swaps can be executed directly on-chain or with something like the [ExchangeProxy](https://github.com/balancer-labs/balancer-registry/blob/master/contracts/ExchangeProxy.sol).
Example Output:
```js
// Following is output for 1USDC->WETH swapExactIn
[
swaps,
amountOut,
] = await SOR.getSwaps(....
console.log(
`USDC>WETH, SwapExactIn, 1USDC, Total WETH Return: ${amountOut.toString()}`
);
// USDC>WETH, SwapExactIn, 1USDC, Total WETH Return: 3090385829490120 - This is the total amount of WETH received for 1USDC
console.log(`Swaps: `);
console.log(swaps);
/*
This demonstrates a multihop swap going:
USDC -> BTC++ via pool 0x75286...
Then BTC++ -> WETH via pool 0xd4dbf...
*/
[
// Multihop swap
[
// First sequence in swap
{
pool: '0x75286e183d923a5f52f52be205e358c5c9101b09',
tokenIn: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
tokenOut: '0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd',
swapAmount: '1000000',
limitReturnAmount: '0',
maxPrice: '115792089237316195423570985008687907853269984665640564039457584007913129639935'
},
// Second sequence in swap
{
pool: '0xd4dbf96db2fdf8ed40296d8d104b371adf7dee12',
tokenIn: '0x0327112423f3a68efdf1fcf402f6c5cb9f7c33fd',
tokenOut: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
swapAmount: '89403274570637',
limitReturnAmount: '0',
maxPrice:'115792089237316195423570985008687907853269984665640564039457584007913129639935'
}
]
]
```
The file: [example-swapExactIn.ts](test/testScripts/example-swapExactIn.ts), shows full examples with comments for various swaps.
To Run:
Create a .env file in root dir with your infura provider key: `INFURA=your_key`
Install dependencies: `$ yarn install`
Run example: `$ ts-node ./test/testScripts/example-swapExactIn.ts`