Skip to content

Commit

Permalink
Merge pull request balancer#57 from balancer-labs/develop
Browse files Browse the repository at this point in the history
add tokens, updated maxBalancers
  • Loading branch information
mikemcdonald authored Jun 10, 2020
2 parents 8e3e633 + b67d523 commit eefa9cb
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 51 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"@babel/plugin-proposal-decorators": "^7.6.0",
"@babel/plugin-transform-react-jsx": "^7.3.0",
"@babel/types": "^7.7.4",
"@balancer-labs/sor": "0.2.4-5",
"@balancer-labs/sor": "^0.2.8",
"@material-ui/core": "^4.5.0",
"@material-ui/icons": "^4.4.3",
"@material-ui/lab": "^4.0.0-alpha.28",
Expand Down
1 change: 1 addition & 0 deletions src/allPublicPools.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/components/Switch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const Switch = () => {
} else {
return swapFormStore.setExchangeRateInput(true);
}

// swapFormStore.clearInputs();
};

Expand Down
46 changes: 44 additions & 2 deletions src/deployed.json
Original file line number Diff line number Diff line change
Expand Up @@ -272,9 +272,51 @@
},
{
"symbol": "PNK",
"address": "0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d",
"address": "0x93ED3FBe21207Ec2E8f2d3c3de6e058Cb73Bc04d",
"decimals": 18,
"iconAddress": "0x93ed3fbe21207ec2e8f2d3c3de6e058cb73bc04d",
"iconAddress": "0x93ED3FBe21207Ec2E8f2d3c3de6e058Cb73Bc04d",
"precision": 2
},
{
"symbol": "AST",
"address": "0x27054b13b1B798B345b591a4d22e6562d47eA75a",
"decimals": 4,
"iconAddress": "0x27054b13b1B798B345b591a4d22e6562d47eA75a",
"precision": 2
},
{
"symbol": "LRC",
"address": "0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD",
"decimals": 18,
"iconAddress": "0xBBbbCA6A901c926F240b89EacB641d8Aec7AEafD",
"precision": 2
},
{
"symbol": "REN",
"address": "0x408e41876cCCDC0F92210600ef50372656052a38",
"decimals": 18,
"iconAddress": "0x408e41876cCCDC0F92210600ef50372656052a38",
"precision": 2
},
{
"symbol": "RPL",
"address": "0xB4EFd85c19999D84251304bDA99E90B92300Bd93",
"decimals": 18,
"iconAddress": "0xB4EFd85c19999D84251304bDA99E90B92300Bd93",
"precision": 2
},
{
"symbol": "LEND",
"address": "0x80fB784B7eD66730e8b1DBd9820aFD29931aab03",
"decimals": 18,
"iconAddress": "0x80fB784B7eD66730e8b1DBd9820aFD29931aab03",
"precision": 2
},
{
"symbol": "KNC",
"address": "0xdd974D5C2e2928deA5F71b9825b8b646686BD200",
"decimals": 18,
"iconAddress": "0xdd974D5C2e2928deA5F71b9825b8b646686BD200",
"precision": 2
}
]
Expand Down
14 changes: 9 additions & 5 deletions src/stores/Proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ export default class ProxyStore {
): Promise<ExactAmountInPreview> => {
try {
this.setPreviewPending(true);
const { contractMetadataStore } = this.rootStore;
const { contractMetadataStore, providerStore } = this.rootStore;

const tokenAmountIn = scale(bnum(inputAmount), inputDecimals);

Expand All @@ -290,7 +290,9 @@ export default class ProxyStore {

const poolData = await findPoolsWithTokens(
tokenInToFind,
tokenOutToFind
tokenOutToFind,
providerStore.providerStatus.library,
contractMetadataStore.getMultiAddress()
);

const costOutputToken = this.costCalculator.getCostOutputToken();
Expand All @@ -299,7 +301,7 @@ export default class ProxyStore {
poolData,
SwapMethods.EXACT_IN,
tokenAmountIn,
20,
4,
costOutputToken
);

Expand Down Expand Up @@ -379,7 +381,7 @@ export default class ProxyStore {
): Promise<ExactAmountOutPreview> => {
try {
this.setPreviewPending(true);
const { contractMetadataStore } = this.rootStore;
const { contractMetadataStore, providerStore } = this.rootStore;

const tokenAmountOut = scale(bnum(outputAmount), outputDecimals);

Expand All @@ -398,7 +400,9 @@ export default class ProxyStore {

const poolData = await findPoolsWithTokens(
tokenInToFind,
tokenOutToFind
tokenOutToFind,
providerStore.providerStatus.library,
contractMetadataStore.getMultiAddress()
);
const costOutputToken = this.costCalculator.getCostOutputToken();

Expand Down
13 changes: 8 additions & 5 deletions src/stores/SwapForm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -396,11 +396,14 @@ export default class SwapFormStore {
}

@action switchInputOutputValues() {
const { providerStore } = this.rootStore;
const account = providerStore.providerStatus.account;

this.setSelectedInputToken(this.outputToken.address, account);
this.setSelectedOutputToken(this.inputToken.address, account);
[this.inputToken, this.outputToken] = [
this.outputToken,
this.inputToken,
];
[this.inputs.inputAmount, this.inputs.outputAmount] = [
this.inputs.outputAmount,
this.inputs.inputAmount,
];
this.switchSwapMethod();
this.setInputFocus(InputFocus.NONE);
}
Expand Down
92 changes: 92 additions & 0 deletions src/utils/poolsBackup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { Web3Provider } from 'ethers/providers';
import { parsePoolDataOnChain } from '@balancer-labs/sor';
import { Pool } from '../stores/Proxy';
import { toChecksum } from './helpers';
import * as allPools from 'allPublicPools.json';

// Replicates Subgraph Subgraph getPoolsWithTokens retrieval using allPublicPools.json
function getPoolsWithTokensBackup(tokenIn: string, tokenOut: string): any {
let poolData = { pools: [] };

allPools.pools.forEach(p => {
let tI: any = p.tokens.find(
t => toChecksum(t.address) === toChecksum(tokenIn)
);
let tO: any = p.tokens.find(
t => toChecksum(t.address) === toChecksum(tokenOut)
);

if (tI && tO && p.finalized) poolData.pools.push(p);
});

return poolData;
}

export async function findPoolsWithTokensBackup(
tokenIn: string,
tokenOut: string,
provider: Web3Provider,
multiAddress: string
): Promise<Pool[]> {
const pools = getPoolsWithTokensBackup(tokenIn, tokenOut);

let poolsWithTokens = await parsePoolDataOnChain(
pools.pools,
tokenIn,
tokenOut,
multiAddress,
provider
);

let poolsWithBalances = [];

// Current SOR doesn't return decimals or check balances so filter locally
poolsWithTokens.forEach(pool => {
if (pool.balanceIn.gt(0) && pool.balanceOut.gt(0)) {
let subgraphPool = pools.pools.find(
p => toChecksum(p.id) === toChecksum(pool.id)
);

let tI: any = subgraphPool.tokens.find(
t => toChecksum(t.address) === toChecksum(tokenIn)
);
let tO: any = subgraphPool.tokens.find(
t => toChecksum(t.address) === toChecksum(tokenOut)
);

let obj: Pool = {
id: toChecksum(pool.id),
decimalsIn: tI.decimals,
decimalsOut: tO.decimals,
balanceIn: pool.balanceIn,
balanceOut: pool.balanceOut,
weightIn: pool.weightIn,
weightOut: pool.weightOut,
swapFee: pool.swapFee,
};

poolsWithBalances.push(obj);
}
});

return poolsWithBalances;
}

// Replicates Subgraph Subgraph getTokenPairs retrieval using allPublicPools.json
export function getTokenPairsBackup(token: string): any {
let poolData = { pools: [] };

allPools.pools.forEach(p => {
if (p.publicSwap && p.finalized) {
let tI: any = p.tokensList.find(
t => toChecksum(t) === toChecksum(token)
);

if (tI) {
poolData.pools.push({ tokensList: p.tokensList });
}
}
});

return poolData;
}
94 changes: 60 additions & 34 deletions src/utils/sorWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import { SwapMethods } from '../stores/SwapForm';
import { Pool, SorSwap, Swap } from '../stores/Proxy';
import { TokenPairs } from '../stores/Pool';
import { EtherKey } from '../stores/Token';
import { getTokenPairsBackup, findPoolsWithTokensBackup } from './poolsBackup';
import { Web3Provider } from 'ethers/providers';

export const formatSwapsExactAmountIn = (
sorSwaps: SorSwap[],
Expand Down Expand Up @@ -60,43 +62,61 @@ export const formatSwapsExactAmountOut = (

export const findPoolsWithTokens = async (
tokenIn: string,
tokenOut: string
tokenOut: string,
provider: Web3Provider,
multiAddress: string
): Promise<Pool[]> => {
let pools = await getPoolsWithTokens(tokenIn, tokenOut);
let poolData: Pool[] = [];

if (pools.pools.length === 0)
throw Error('There are no pools with selected tokens');
// If Subgraph fails getPoolsWithTokens will throw error
try {
let pools = await getPoolsWithTokens(tokenIn, tokenOut);

let poolData: Pool[] = [];
pools.pools.forEach(p => {
let tI: any = p.tokens.find(
t => helpers.toChecksum(t.address) === helpers.toChecksum(tokenIn)
);
let tO: any = p.tokens.find(
t => helpers.toChecksum(t.address) === helpers.toChecksum(tokenOut)
);
if (pools.pools.length === 0)
throw Error('There are no pools with selected tokens');

if (tI.balance > 0 && tO.balance > 0) {
let obj: Pool = {
id: helpers.toChecksum(p.id),
decimalsIn: tI.decimals,
decimalsOut: tO.decimals,
balanceIn: scale(bnum(tI.balance), tI.decimals),
balanceOut: scale(bnum(tO.balance), tO.decimals),
weightIn: scale(
bnum(tI.denormWeight).div(bnum(p.totalWeight)),
18
),
weightOut: scale(
bnum(tO.denormWeight).div(bnum(p.totalWeight)),
18
),
swapFee: scale(bnum(p.swapFee), 18),
};

poolData.push(obj);
}
});
pools.pools.forEach(p => {
let tI: any = p.tokens.find(
t =>
helpers.toChecksum(t.address) ===
helpers.toChecksum(tokenIn)
);
let tO: any = p.tokens.find(
t =>
helpers.toChecksum(t.address) ===
helpers.toChecksum(tokenOut)
);

if (tI.balance > 0 && tO.balance > 0) {
let obj: Pool = {
id: helpers.toChecksum(p.id),
decimalsIn: tI.decimals,
decimalsOut: tO.decimals,
balanceIn: scale(bnum(tI.balance), tI.decimals),
balanceOut: scale(bnum(tO.balance), tO.decimals),
weightIn: scale(
bnum(tI.denormWeight).div(bnum(p.totalWeight)),
18
),
weightOut: scale(
bnum(tO.denormWeight).div(bnum(p.totalWeight)),
18
),
swapFee: scale(bnum(p.swapFee), 18),
};

poolData.push(obj);
}
});
} catch (err) {
console.log(`[SOR] Subgraph call error. Using backup pools.`);
poolData = await findPoolsWithTokensBackup(
tokenIn,
tokenOut,
provider,
multiAddress
);
}
return poolData;
};

Expand Down Expand Up @@ -152,7 +172,13 @@ export const sorTokenPairs = async (
tokenAddress: string,
wethAddress: string
): Promise<TokenPairs> => {
const pools = await getTokenPairs(tokenAddress);
let pools;
try {
pools = await getTokenPairs(tokenAddress);
} catch (err) {
console.log(`[SOR] Subgraph call error. Using backup pools.`);
pools = getTokenPairsBackup(tokenAddress);
}

let tokenPairs: TokenPairs = new Set<string>();
if (pools.pools.length === 0) return tokenPairs;
Expand Down
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1025,10 +1025,10 @@
lodash "^4.17.13"
to-fast-properties "^2.0.0"

"@balancer-labs/[email protected].4-5":
version "0.2.4-5"
resolved "https://registry.yarnpkg.com/@balancer-labs/sor/-/sor-0.2.4-5.tgz#63d47976c154a223ced29e3e0f60e0acd981cd3b"
integrity sha512-nsli5CiskNs6wJDdytblQibgeMqtAgJCZW5Xnz2uc5Kkuxzu4AvKueV3CFLkNbqg8VnVmEPUtmYRfO9liCCjwQ==
"@balancer-labs/sor@^0.2.8":
version "0.2.8"
resolved "https://registry.yarnpkg.com/@balancer-labs/sor/-/sor-0.2.8.tgz#bbff3627ea1d9faa74955dbb61f6e40359ebef09"
integrity sha512-WIdlpOuf+V6aEs8S4M0LVcxHx0MXtSxCo2Z7acxHsS6sSwLMyhk80/om/OwZJ4L9+zmpiX5DoUlTcj7DM1Mc3w==
dependencies:
bignumber.js "^9.0.0"
ethers "^4.0.39"
Expand Down

0 comments on commit eefa9cb

Please sign in to comment.