Skip to content

Commit

Permalink
Initializes contracts with provider instead of signer and improves or…
Browse files Browse the repository at this point in the history
…ders query (#1884)
  • Loading branch information
avclarke authored Jan 13, 2023
1 parent a1be24a commit d71badc
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 85 deletions.
44 changes: 3 additions & 41 deletions queries/futures/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,19 @@ import { BigNumber } from '@ethersproject/bignumber';
import { ContractsMap, NetworkId } from '@synthetixio/contracts-interface';
import Wei, { wei } from '@synthetixio/wei';
import { utils } from 'ethers';
import { parseBytes32String } from 'ethers/lib/utils';
import { chain } from 'wagmi';

import { ETH_UNIT } from 'constants/network';
import { MarketClosureReason } from 'hooks/useMarketClosed';
import { SynthsTrades, SynthsVolumes } from 'queries/synths/type';
import { FuturesOrder, FuturesOrderTypeDisplay } from 'sdk/types/futures';
import { formatCurrency, formatDollars, weiFromWei } from 'utils/formatters/number';
import {
FuturesMarketAsset,
FuturesMarketKey,
getDisplayAsset,
getMarketName,
MarketAssetByKey,
MarketKeyByAsset,
} from 'utils/futures';
import { FuturesOrderTypeDisplay } from 'sdk/types/futures';
import { formatDollars, weiFromWei } from 'utils/formatters/number';
import { FuturesMarketAsset } from 'utils/futures';

import { SECONDS_PER_DAY, FUTURES_ENDPOINTS } from './constants';
import {
CrossMarginAccountTransferResult,
FuturesMarginTransferResult,
FuturesOrderResult,
FuturesOrderType,
FuturesPositionResult,
FuturesTradeResult,
Expand Down Expand Up @@ -54,35 +45,6 @@ const mapOrderType = (orderType: Partial<FuturesOrderType>): FuturesOrderTypeDis
return orderType === 'StopMarket' ? 'Stop Market' : orderType;
};

export const mapFuturesOrders = (o: FuturesOrderResult): FuturesOrder => {
// TODO: Why has asset changed to key here?
const key = parseBytes32String(o.asset) as FuturesMarketKey;
const asset = MarketAssetByKey[key];
const size = weiFromWei(o.size);
const targetPrice = weiFromWei(o.targetPrice ?? 0);
const targetRoundId = new Wei(o.targetRoundId, 0);
const marginDelta = weiFromWei(o.marginDelta);
return {
...o,
asset,
targetRoundId,
marginDelta,
targetPrice: targetPrice.gt(0) ? targetPrice : null,
size: size,
market: getMarketName(asset),
marketKey: MarketKeyByAsset[asset],
orderType: mapOrderType(o.orderType),
sizeTxt: formatCurrency(asset, size.abs(), {
currencyKey: getDisplayAsset(asset) ?? '',
minDecimals: size.abs().lt(0.01) ? 4 : 2,
}),
targetPriceTxt: formatDollars(targetPrice),
side: size.gt(0) ? PositionSide.LONG : PositionSide.SHORT,
isStale: false,
isExecutable: false,
};
};

type MarketSizes = {
short: BigNumber;
long: BigNumber;
Expand Down
6 changes: 2 additions & 4 deletions sdk/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export default class Context implements IContext {
this.setSigner(context.signer);
}

this.contracts = getContractsByNetwork(context.networkId, context.signer ?? context.provider);
this.contracts = getContractsByNetwork(context.networkId, context.provider);
this.multicallContracts = getMulticallContractsByNetwork(context.networkId);
}

Expand Down Expand Up @@ -85,14 +85,12 @@ export default class Context implements IContext {

public setNetworkId(networkId: NetworkId) {
this.context.networkId = networkId;
this.contracts = getContractsByNetwork(networkId, this.context.signer ?? this.provider);
this.contracts = getContractsByNetwork(networkId, this.provider);
this.multicallContracts = getMulticallContractsByNetwork(networkId);
}

public async setSigner(signer: ethers.Signer) {
this.context.walletAddress = await signer.getAddress();
this.context.signer = signer;
// Reinit contracts with signer when connected
this.contracts = getContractsByNetwork(this.networkId, signer);
}
}
2 changes: 1 addition & 1 deletion sdk/contracts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export type AllContractsMap = Record<

export const getContractsByNetwork = (
networkId: NetworkId,
provider: ethers.providers.Provider | ethers.Signer
provider: ethers.providers.Provider
) => {
return {
Exchanger: ADDRESSES.Exchanger[networkId]
Expand Down
40 changes: 18 additions & 22 deletions sdk/services/futures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -385,36 +385,32 @@ export default class FuturesService {
}

public async getOpenOrders(account: string) {
if (!this.sdk.context.signer) return [];

const crossMarginBaseMultiCall = new EthCallContract(account, CrossMarginBaseABI);
const crossMarginBaseContract = CrossMarginBase__factory.connect(
account,
this.sdk.context.signer
this.sdk.context.provider
);
const accountFilter = crossMarginBaseContract.filters.OrderPlaced(account);

const orders = [];

if (accountFilter) {
const logs = await crossMarginBaseContract.queryFilter(accountFilter);
if (logs.length) {
const orderCalls = logs.map((l) => crossMarginBaseMultiCall.orders(l.args.orderId));
const contractOrders = (await this.sdk.context.multicallProvider.all(orderCalls)) as any;
for (let i = 0; i < logs.length; i++) {
const log = logs[i];
const contractOrder = contractOrders[i];
// Checks if the order is still pending
// Orders are never removed but all values set to zero so we check a zero value on price to filter pending
if (contractOrder && contractOrder.targetPrice.gt(0)) {
const block = await log.getBlock();
const order = mapFuturesOrderFromEvent(log, account, wei(block.timestamp));
orders.push(order);
}
}
const orderIdBigNum = await crossMarginBaseContract.orderId();
const orderId = orderIdBigNum.toNumber();

const orderCalls = Array(orderId)
.fill(0)
.map((_, i) => crossMarginBaseMultiCall.orders(i));
const contractOrders = (await this.sdk.context.multicallProvider.all(orderCalls)) as any;
for (let i = 0; i < orderId; i++) {
const contractOrder = contractOrders[i];
// Checks if the order is still pending
// Orders are never removed but all values set to zero so we check a zero value on price to filter pending
if (contractOrder && contractOrder.targetPrice.gt(0)) {
const order = mapFuturesOrderFromEvent({ ...contractOrder, id: i }, account);
orders.push(order);
}
}

return orderBy(orders, ['timestamp'], 'desc');
return orderBy(orders, ['contractId'], 'desc');
}

public async getCrossMarginSettings() {
Expand All @@ -438,7 +434,7 @@ export default class FuturesService {
sizeDelta: Wei,
leverageSide: PositionSide
) {
const market = FuturesMarket__factory.connect(marketAddress, this.sdk.context.signer);
const market = FuturesMarket__factory.connect(marketAddress, this.sdk.context.provider);
const details = await market.postTradeDetails(
wei(sizeDelta).toBN(),
this.sdk.context.walletAddress
Expand Down
2 changes: 1 addition & 1 deletion sdk/types/futures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ export type FuturesOrderTypeDisplay = 'Limit' | 'Stop Market' | 'Market' | 'Liqu

export type FuturesOrder<T = Wei> = {
id: string;
contractId: number;
account: string;
asset: FuturesMarketAsset;
market: string;
Expand All @@ -178,7 +179,6 @@ export type FuturesOrder<T = Wei> = {
targetPrice: T | null;
marginDelta: T;
targetRoundId: T | null;
timestamp: T;
orderType: FuturesOrderTypeDisplay;
sizeTxt?: string;
targetPriceTxt?: string;
Expand Down
30 changes: 18 additions & 12 deletions sdk/utils/futures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { ETH_UNIT } from 'constants/network';
import { FuturesAggregateStatResult } from 'queries/futures/subgraph';
import { FUTURES_ENDPOINTS, MAINNET_MARKETS, TESTNET_MARKETS } from 'sdk/constants/futures';
import { SECONDS_PER_DAY } from 'sdk/constants/period';
import { OrderPlacedEvent } from 'sdk/contracts/types/CrossMarginBase';
import {
FundingRateUpdate,
FuturesMarketAsset,
Expand Down Expand Up @@ -291,27 +290,34 @@ export const calculateCrossMarginFee = (
};

export const mapFuturesOrderFromEvent = (
o: OrderPlacedEvent,
account: string,
timestamp: Wei
orderDetails: {
id: number;
marketKey: string;
orderType: number;
targetPrice: BigNumber;
sizeDelta: BigNumber;
marginDelta: BigNumber;
},
account: string
): FuturesOrder => {
const marketKey = parseBytes32String(o.args.marketKey) as FuturesMarketKey;
const marketKey = parseBytes32String(orderDetails.marketKey) as FuturesMarketKey;
const asset = MarketAssetByKey[marketKey];
const sizeDelta = wei(o.args.sizeDelta);
const sizeDelta = wei(orderDetails.sizeDelta);

const size = sizeDelta.abs();
return {
id: `CM-${account}-${o.args.orderId}`,
contractId: orderDetails.id,
id: `CM-${account}-${orderDetails.id}`,
account: account,
size: sizeDelta,
marginDelta: wei(o.args.marginDelta),
orderType: o.args.orderType === 0 ? 'Limit' : 'Stop Market',
targetPrice: wei(o.args.targetPrice),
marginDelta: wei(orderDetails.marginDelta),
orderType: orderDetails.orderType === 0 ? 'Limit' : 'Stop Market',
targetPrice: wei(orderDetails.targetPrice),
sizeTxt: formatCurrency(asset, size, {
currencyKey: getDisplayAsset(asset) ?? '',
minDecimals: size.lt(0.01) ? 4 : 2,
}),
targetPriceTxt: formatDollars(wei(o.args.targetPrice)),
timestamp: timestamp,
targetPriceTxt: formatDollars(wei(orderDetails.targetPrice)),
marketKey: marketKey,
market: getMarketName(asset),
asset: asset,
Expand Down
4 changes: 2 additions & 2 deletions state/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export const usePollAction = (
const startPolling = useStartPollingAction();

useEffect(() => {
if (!options?.disabled) {
if (!options?.disabled && providerReady) {
startPolling(actionName, action, options?.intervalTime || DEFAULT_INTERVAL);
}
// eslint-disable-next-line
Expand All @@ -90,7 +90,7 @@ export const useFetchAction = (
const dispatch = useAppDispatch();

useEffect(() => {
if (!options?.disabled) {
if (!options?.disabled && providerReady) {
dispatch(action());
}
// eslint-disable-next-line
Expand Down
2 changes: 0 additions & 2 deletions utils/futures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,6 @@ export const serializeFuturesOrders = (orders: FuturesOrder[]): FuturesOrder<str
targetPrice: o.targetPrice?.toString() ?? null,
marginDelta: o.marginDelta.toString(),
targetRoundId: o.targetRoundId?.toString() ?? null,
timestamp: o.timestamp.toString(),
}));
};

Expand All @@ -513,7 +512,6 @@ export const unserializeFuturesOrders = (orders: FuturesOrder<string>[]): Future
targetPrice: o.targetPrice ? wei(o.targetPrice) : null,
marginDelta: wei(o.marginDelta),
targetRoundId: o.targetRoundId ? wei(o.targetRoundId) : null,
timestamp: wei(o.timestamp),
}));
};

Expand Down

0 comments on commit d71badc

Please sign in to comment.