fetch data
```javascript=
// requestCounts: 14
async getPoolByIndex(index) {
// requestCounts: 1
const poolContract = await this.getPoolContractByIndex(index);
// requestCounts: 1
const token0Contract = await this.getPoolTokenContract(0, poolContract);
// requestCounts: 1
const token1Contract = await this.getPoolTokenContract(1, poolContract);
// requestCounts: 11
const _pool = {
id: randomID(6),
contract: poolContract,
token0: {
contract: token0Contract,
},
token1: {
contract: token1Contract,
},
};
const pool = await this.getPoolDetail(_pool);
// requestCounts: 4
await this.getTokenByContract(token0Contract);
// requestCounts: 4
await this.getTokenByContract(token1Contract);
return pool;
}
```
```javascript=
async getPoolContractByIndex(index) {
const indexData = index.toString(16).padStart(64, "0");
if (!this.factoryContract) {
this.getFactoryContract();
}
const result = await this.getData(
`allPairs(uint256)`,
indexData,
this.factoryContract
);
return `0x${result.slice(26, 66)}`;
}
async getFactoryContract() {
const contract = await this.getData(`factory()`, null, this.routerContract);
this.factoryContract = `0x${contract.slice(26, 66)}`;
console.log(`this.factoryContract`, this.factoryContract);
}
async getPoolTokenContract(index, poolContract) {
const result = await this.getData(`token${index}()`, null, poolContract);
const token = `0x${result.slice(26, 66)}`;
return token;
}
```
```javascript=
// requestCounts: 4
async getPoolDetail(pool) {
// requestCounts: 1
const reserveData = await this.getData(
`getReserves()`,
null,
pool.contract
);
const reserve = sliceData(reserveData.replace("0x", ""), 64);
const poolBalanceOfToken0 = SafeMath.toCurrencyUint(
SafeMath.toBn(reserve[0]),
this.assetList[pool.token0.contract].decimals
);
const poolBalanceOfToken1 = SafeMath.toCurrencyUint(
SafeMath.toBn(reserve[1]),
this.assetList[pool.token1.contract].decimals
);
console.log(`reserve`, reserve);
console.log(`poolBalanceOfToken0`, poolBalanceOfToken0);
console.log(`poolBalanceOfToken1`, poolBalanceOfToken1);
// requestCounts: 1
const decimalsResult = await this.getData(
`decimals()`,
null,
pool.contract
);
const decimals = parseInt(decimalsResult, 16);
// requestCounts: 1
const totalSupplyResult = await this.getData(
`totalSupply()`,
null,
pool.contract
);
const totalSupply = SafeMath.toCurrencyUint(
parseInt(totalSupplyResult, 16),
decimals
);
const _pool = {
...pool,
decimals,
totalSupply,
token0: {
...pool.token0,
poolBalanceOfToken: poolBalanceOfToken0,
},
token1: {
...pool.token1,
poolBalanceOfToken: poolBalanceOfToken1,
},
};
// requestCounts: 1
return await this.updatePools(_pool);
}
```
```javascript=
async getTokenByContract(tokenContract) {
let symbol, decimals, totalSupply, name;
let token = this.assetList[tokenContract];
if (!token) {
// requestCounts: 4
try {
const result = await this.lunar.getAsset({
contract: tokenContract,
});
symbol = result.symbol;
decimals = result.decimals;
totalSupply = result.totalSupply;
name = result.name;
} catch (error) {
const symbolResult = await this.getData(
`symbol()`,
null,
tokenContract
);
symbol = hexToAscii(sliceData(symbolResult)[2]);
const decimalsResult = await this.getData(
`decimals()`,
null,
tokenContract
);
decimals = parseInt(decimalsResult, 16);
const totalSupplyResult = await this.getData(
`totalSupply()`,
null,
tokenContract
);
totalSupply = parseInt(totalSupplyResult, 16);
const nameResult = await this.getData(`name()`, null, tokenContract);
name = hexToAscii(sliceData(nameResult)[2]);
}
token = {
id: randomID(6),
contract: tokenContract,
iconSrc: erc20,
name,
symbol,
decimals,
totalSupply,
};
}
// requestCounts: 1
return await this.updateAssets(token);
}
```
```javascript=
async updatePools(pool, [force = false]) {
// TODO get pool price and volume
let updatePool;
if (
SafeMath.gt(
SafeMath.minus(Date.now(), this.lastSyncTime),
this.syncInterval
) ||
force
)
updatePool = {
...pool,
liquidity: "--",
yield: "--",
volume: {
value: `${(Math.random() * 10).toFixed(2)}m`,
change: `${Math.random() * 1 > 0.5 ? "+" : "-"}${(
Math.random() * 1
).toFixed(2)}`,
},
tvl: {
value: `${(Math.random() * 10).toFixed(2)}m`,
change: `${Math.random() * 1 > 0.5 ? "+" : "-"}${(
Math.random() * 1
).toFixed(2)}`,
},
irr: "3",
interest24: `${(Math.random() * 10).toFixed(2)}m`,
};
else updatePool = { ...pool };
if (this.isConnected && this.connectedAccount) {
updatePool = await this.getPoolBalanceOf(updatePool);
}
this.poolList[updatePool.contract] = updatePool;
return updatePool;
}
```
```javascript=
async updateAssets(token, [force = false]) {
// TODO get token price and volume
let updateToken;
if (
SafeMath.gt(
SafeMath.minus(Date.now(), this.lastSyncTime),
this.syncInterval
) ||
force
)
updateToken = {
...token,
balance: "--",
price: {
value: `${(Math.random() * 100000).toFixed(2)}m`,
change: `${Math.random() * 1 > 0.5 ? "+" : "-"}${(
Math.random() * 1
).toFixed(2)}`,
},
volume: {
value: `${(Math.random() * 10).toFixed(2)}m`,
change: `${Math.random() * 1 > 0.5 ? "+" : "-"}${(
Math.random() * 1
).toFixed(2)}`,
},
};
else updateToken = { ...token };
if (this.isConnected && this.connectedAccount) {
updateToken = await this.getAssetBalanceOf(updateToken);
}
this.assetList[updateToken.contract] = updateToken;
return updateToken;
}
```
```javascript=
// requestCounts: 6
async addToken(contract) {
// if (/^0x[a-fA-F0-9]{40}$/.test(contract)) return null;
let token = this.assetList[contract];
if (token) return token;
token = await this.getTokenByContract(contract);
if (this.isConnected && this.connectedAccount) {
token = await this.getAssetBalanceOf(token);
}
// const
return token;
}
```
```javascript=
async getSelectedPool(supportedPools, active, passive) {
if (!active || !passive) return;
const index = supportedPools.findIndex(
(pool) =>
(active.contract === pool.token0.contract ||
active.contract === pool.token1.contract) &&
(passive.contract === pool.token0.contract ||
passive.contract === pool.token1.contract)
);
console.log(`getSelectedPool findIndex`, index);
if (index === -1) {
const poolContract = await this.getPoolContractByTokens(
active.contract,
passive.contract
);
console.log(`poolContract `, poolContract);
if (SafeMath.gt(parseInt(poolContract, 16), "0")) {
// requestCounts: 1
const token0Contract = await this.getPoolTokenContract(0, poolContract);
// requestCounts: 1
const token1Contract = await this.getPoolTokenContract(1, poolContract);
const pool = await this.getPoolDetail(
poolContract,
token0Contract,
token1Contract
);
return pool;
} else return null;
}
console.log(`supportedPools[index] `, supportedPools[index]);
return supportedPools[index];
}
```