这是indexloc提供的服务,不要输入任何密码
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"test:scripts": "jest -i --verbose ./test-scripts/*.test.ts"
},
"dependencies": {
"@chasevoorhees/osmonauts-math-decimal": "^1.7.1",
"@cosmjs/proto-signing": "^0.30.1",
"@cosmjs/stargate": "^0.30.1",
"@crocswap/sdk": "^2.4.5",
Expand Down Expand Up @@ -87,6 +88,8 @@
"minimist": "^1.2.6",
"morgan": "^1.10.0",
"near-api-js": "1.0.0",
"osmo-query": "^16.5.2",
"osmojs": "^16.5.1",
"promise-retry": "^2.0.1",
"quickswap-sdk": "^3.0.8",
"swagger-ui-express": "^4.1.6",
Expand Down
98 changes: 70 additions & 28 deletions src/amm/amm.controllers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ import {
PoolPriceResponse,
PerpBalanceRequest,
PerpBalanceResponse,
CosmosRemoveLiquidityRequest,
CosmosAddLiquidityRequest,
CosmosAddLiquidityResponse,
CosmosRemoveLiquidityResponse,
CosmosPoolPriceRequest,
CosmosPoolPriceResponse,
CosmosPoolPositionsRequest,
CosmosPoolPositionsResponse,
CosmosPriceResponse,
CosmosTradeResponse,
} from './amm.requests';
import {
price as uniswapPrice,
Expand Down Expand Up @@ -73,11 +83,18 @@ import { Algorand } from '../chains/algorand/algorand';
import { Tinyman } from '../connectors/tinyman/tinyman';
import { Plenty } from '../connectors/plenty/plenty';

export async function price(req: PriceRequest): Promise<PriceResponse> {
const chain = await getInitializedChain<Algorand | Ethereumish | Nearish | Tezosish>(
import { Osmosis } from '../chains/osmosis/osmosis';
import { COLLECTFEES_ENDPOINT_NOT_SUPPORTED_ERROR_CODE, COLLECTFEES_ENDPOINT_NOT_SUPPORTED_ERROR_MESSAGE, HttpException } from '../services/error-handler';

export async function price(req: PriceRequest): Promise<PriceResponse | CosmosPriceResponse> {
const chain = await getInitializedChain<Algorand | Ethereumish | Nearish | Tezosish | Osmosis>(
req.chain,
req.network
);
if (chain instanceof Osmosis){
return chain.controller.price(chain as unknown as Osmosis, req);
}

const connector: Uniswapish | RefAMMish | Tinyman | Plenty = await getConnector<
Uniswapish | RefAMMish | Tinyman | Plenty
>(req.chain, req.network, req.connector);
Expand All @@ -89,16 +106,21 @@ export async function price(req: PriceRequest): Promise<PriceResponse> {
return uniswapPrice(<Ethereumish>chain, connector, req);
} else if (connector instanceof Tinyman) {
return tinymanPrice(chain as unknown as Algorand, connector, req);
} else {
}
else {
return refPrice(<Nearish>chain, connector as RefAMMish, req);
}
}

export async function trade(req: TradeRequest): Promise<TradeResponse> {
const chain = await getInitializedChain<Algorand | Ethereumish | Nearish | Tezosish>(
export async function trade(req: TradeRequest): Promise<TradeResponse | CosmosTradeResponse> {
const chain = await getInitializedChain<Algorand | Ethereumish | Nearish | Tezosish | Osmosis>(
req.chain,
req.network
);
if (chain instanceof Osmosis){
return chain.controller.trade(chain as unknown as Osmosis, req);
}

const connector: Uniswapish | RefAMMish | Tinyman | Plenty = await getConnector<
Uniswapish | RefAMMish | Tinyman | Plenty
>(req.chain, req.network, req.connector);
Expand All @@ -116,35 +138,46 @@ export async function trade(req: TradeRequest): Promise<TradeResponse> {
}

export async function addLiquidity(
req: AddLiquidityRequest
): Promise<AddLiquidityResponse> {
const chain = await getInitializedChain<Ethereumish>(req.chain, req.network);
req: AddLiquidityRequest | CosmosAddLiquidityRequest
): Promise<AddLiquidityResponse | CosmosAddLiquidityResponse> {
const chain = await getInitializedChain<Ethereumish | Osmosis>(req.chain, req.network);
if (chain instanceof Osmosis){
return chain.controller.addLiquidity(chain as unknown as Osmosis, req as CosmosAddLiquidityRequest);
}
const connector: UniswapLPish = await getConnector<UniswapLPish>(
req.chain,
req.network,
req.connector
);

return uniswapV3AddLiquidity(chain, connector, req);
return uniswapV3AddLiquidity(chain as unknown as Ethereumish, connector, req as AddLiquidityRequest);
}

export async function reduceLiquidity(
req: RemoveLiquidityRequest
): Promise<RemoveLiquidityResponse> {
const chain = await getInitializedChain<Ethereumish>(req.chain, req.network);
const connector: UniswapLPish = await getConnector<UniswapLPish>(
req: RemoveLiquidityRequest | CosmosRemoveLiquidityRequest
): Promise<RemoveLiquidityResponse | CosmosRemoveLiquidityResponse> {
const chain = await getInitializedChain<Ethereumish | Osmosis>(req.chain, req.network);
if (chain instanceof Osmosis){
return chain.controller.removeLiquidity(chain as unknown as Osmosis, req as CosmosRemoveLiquidityRequest);
}
const connector: UniswapLPish= await getConnector<UniswapLPish>(
req.chain,
req.network,
req.connector
);

return uniswapV3RemoveLiquidity(chain, connector, req);
return uniswapV3RemoveLiquidity(chain as unknown as Ethereumish, connector, req as RemoveLiquidityRequest);
}

export async function collectFees(
req: CollectEarnedFeesRequest
): Promise<RemoveLiquidityResponse> {
const chain = await getInitializedChain<Ethereumish>(req.chain, req.network);
const chain = await getInitializedChain<Ethereumish | Osmosis>(req.chain, req.network);
if (chain instanceof Osmosis){
throw new HttpException(
500,
COLLECTFEES_ENDPOINT_NOT_SUPPORTED_ERROR_MESSAGE,
COLLECTFEES_ENDPOINT_NOT_SUPPORTED_ERROR_CODE
);
}
const connector: UniswapLPish = await getConnector<UniswapLPish>(
req.chain,
req.network,
Expand All @@ -154,36 +187,46 @@ export async function collectFees(
}

export async function positionInfo(
req: PositionRequest
): Promise<PositionResponse> {
const chain = await getInitializedChain<Ethereumish>(req.chain, req.network);
req: PositionRequest | CosmosPoolPositionsRequest
): Promise<PositionResponse | CosmosPoolPositionsResponse> {
const chain = await getInitializedChain<Ethereumish | Osmosis>(req.chain, req.network);
if (chain instanceof Osmosis){
return chain.controller.poolPositions(chain as unknown as Osmosis, req as CosmosPoolPositionsRequest);
}
const connector: UniswapLPish = await getConnector<UniswapLPish>(
req.chain,
req.network,
req.connector
);
return uniswapV3PositionInfo(chain, connector, req);
return uniswapV3PositionInfo(chain, connector, req as PositionRequest);
}

export async function poolPrice(
req: PoolPriceRequest
): Promise<PoolPriceResponse> {
const chain = await getInitializedChain<Ethereumish>(req.chain, req.network);
export async function poolPrice(
req: PoolPriceRequest | CosmosPoolPriceRequest
): Promise<PoolPriceResponse | CosmosPoolPriceResponse> {
const chain = await getInitializedChain<Ethereumish | Osmosis>(req.chain, req.network);
if (chain instanceof Osmosis){
return chain.controller.poolPrice(chain as unknown as Osmosis, req as CosmosPoolPriceRequest);
}
const connector: UniswapLPish = await getConnector<UniswapLPish>(
req.chain,
req.network,
req.connector
);
return uniswapV3PoolPrice(chain, connector, req);
return uniswapV3PoolPrice(chain, connector, req as PoolPriceRequest);
}

export async function estimateGas(
req: NetworkSelectionRequest
): Promise<EstimateGasResponse> {
const chain = await getInitializedChain<Algorand | Ethereumish | Nearish | Tezosish>(
const chain = await getInitializedChain<Algorand | Ethereumish | Nearish | Tezosish | Osmosis>(
req.chain,
req.network
);
if (chain instanceof Osmosis){
return chain.controller.estimateGas(chain as unknown as Osmosis);
}

const connector: Uniswapish | RefAMMish | Tinyman | Plenty = await getConnector<
Uniswapish | RefAMMish | Plenty
>(req.chain, req.network, req.connector);
Expand All @@ -200,7 +243,6 @@ export async function estimateGas(
}
}

// perp
export async function perpMarketPrices(
req: PriceRequest
): Promise<PerpPricesResponse> {
Expand Down
128 changes: 128 additions & 0 deletions src/amm/amm.requests.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { SerializableExtendedPool as CosmosSerializableExtendedPool } from '../chains/osmosis/osmosis.types';
import { PerpPosition } from '../connectors/perp/perp';
import {
NetworkSelectionRequest,
Expand Down Expand Up @@ -32,6 +33,22 @@ export interface PriceResponse {
gasCost: string;
}

export interface CosmosPriceResponse {
base: string;
quote: string;
amount: string;
rawAmount: string;
expectedAmount: string;
price: string;
network: string;
timestamp: number;
latency: number;
gasPrice: string;
gasLimit: string;
gasUsed: string;
gasWanted: string;
}

export interface PoolPriceRequest extends NetworkSelectionRequest {
token0: string;
token1: string;
Expand All @@ -40,6 +57,12 @@ export interface PoolPriceRequest extends NetworkSelectionRequest {
interval: number;
}

export interface CosmosPoolPriceRequest extends NetworkSelectionRequest {
address: string;
token0: string;
token1: string;
}

export interface PoolPriceResponse {
token0: string;
token1: string;
Expand All @@ -52,6 +75,27 @@ export interface PoolPriceResponse {
latency: number;
}

export interface CosmosPoolPriceResponse {
token0: string;
token1: string;
pools: CosmosSerializableExtendedPool[];
network: string;
timestamp: number;
latency: number;
}

export interface CosmosPoolPositionsRequest extends NetworkSelectionRequest {
address: string;
poolId?: string;
}

export interface CosmosPoolPositionsResponse {
pools: CosmosSerializableExtendedPool[];
network: string;
timestamp: number;
latency: number;
}

export interface TradeRequest extends NetworkSelectionRequest {
quote: string;
base: string;
Expand Down Expand Up @@ -84,6 +128,39 @@ export interface TradeResponse {
txHash: string | any | undefined;
}

export interface CosmosTradeResponse {
network: string;
timestamp: number;
latency: number;
base: string;
quote: string;
amount: string;
rawAmount: string;
expectedAmountReceived: string;
finalAmountReceived: string;
finalAmountReceived_basetoken: string;
expectedPrice: string;
finalPrice: string;
gasPrice: string;
gasLimit: string;
gasUsed: string;
gasWanted: string;
txHash: string;
}

export interface CosmosTransferResponse {
network: string;
timestamp: number;
latency: number;
amount: string;
gasPrice: string;
gasLimit: string;
gasUsed: string;
gasWanted: string;
txHash: string;
}


export interface AddLiquidityRequest extends NetworkSelectionRequest {
address: string;
token0: string;
Expand All @@ -99,6 +176,16 @@ export interface AddLiquidityRequest extends NetworkSelectionRequest {
maxPriorityFeePerGas?: string;
}

export interface CosmosAddLiquidityRequest extends NetworkSelectionRequest {
address: string;
token0: string;
token1: string;
amount0: string;
amount1: string;
poolId?: string; // will select one for you if not provided
allowedSlippage?: string;
}

export interface AddLiquidityResponse {
network: string;
timestamp: number;
Expand All @@ -115,6 +202,24 @@ export interface AddLiquidityResponse {
txHash: string | undefined;
}

export interface CosmosAddLiquidityResponse {
poolId: string;
poolAddress: string;
poolShares: string;
token0: string;
token0FinalAmount: string;
token1: string;
token1FinalAmount: string;
network: string;
timestamp: number;
latency: number;
gasPrice: string;
gasLimit: string;
gasUsed: string;
gasWanted: string;
txHash: string;
}

export interface CollectEarnedFeesRequest extends NetworkSelectionRequest {
address: string;
tokenId: number;
Expand All @@ -127,6 +232,13 @@ export interface RemoveLiquidityRequest extends CollectEarnedFeesRequest {
decreasePercent?: number;
}

export interface CosmosRemoveLiquidityRequest extends NetworkSelectionRequest {
address: string;
decreasePercent: number;
poolId: string; // required
allowedSlippage?: string;
}

export interface RemoveLiquidityResponse {
network: string;
timestamp: number;
Expand All @@ -140,6 +252,22 @@ export interface RemoveLiquidityResponse {
txHash: string | undefined;
}

export interface CosmosRemoveLiquidityResponse {
network: string;
timestamp: number;
latency: number;
poolId: string;
gasPrice: string;
gasLimit: string;
gasUsed: string;
gasWanted: string;
txHash: string;
token0: string;
token1: string;
amount0: string;
amount1: string;
}

export interface PositionRequest extends NetworkSelectionRequest {
tokenId: number;
}
Expand Down
Loading