@strobelabs/perpcity-sdk 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -179,7 +179,8 @@ var PerpManager = class {
|
|
|
179
179
|
abi: this.context.perpManagerAbi,
|
|
180
180
|
functionName: "createPerp",
|
|
181
181
|
args: [sqrtPriceX96, params.beacon],
|
|
182
|
-
account: this.context.walletClient.account
|
|
182
|
+
account: this.context.walletClient.account,
|
|
183
|
+
chain: this.context.walletClient.chain
|
|
183
184
|
});
|
|
184
185
|
await this.context.walletClient.writeContract(request);
|
|
185
186
|
return new Perp(this.context, result[0]);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/context.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/entities/position.ts","../src/entities/perp.ts","../src/entities/perp-collection.ts","../src/entities/perp-manager.ts"],"sourcesContent":["export * from './context';\nexport * from './entities';\nexport * from './utils';","import type { PublicClient, WalletClient, Abi, Address} from \"viem\";\nimport { GraphQLClient } from 'graphql-request'\n\nexport type PerpCityContextConfig = {\n publicClient: PublicClient;\n walletClient: WalletClient;\n goldskyEndpoint: string;\n perpManagerAddress: Address;\n perpManagerAbi: Abi;\n beaconAbi: Abi;\n}\n\nexport class PerpCityContext {\n public readonly publicClient: PublicClient;\n public readonly walletClient: WalletClient;\n // below will be hard-coded in addresses.ts, abis.ts, and endpoints.ts once they are frozen\n // they are currently being rapidly redeployed so can be specified by the sdk consumer for now\n public readonly goldskyClient: GraphQLClient;\n public readonly perpManagerAddress: Address;\n public readonly perpManagerAbi: Abi;\n public readonly beaconAbi: Abi;\n\n constructor(config: PerpCityContextConfig) {\n this.publicClient = config.publicClient;\n this.walletClient = config.walletClient;\n this.goldskyClient = new GraphQLClient(config.goldskyEndpoint);\n this.perpManagerAddress = config.perpManagerAddress;\n this.perpManagerAbi = config.perpManagerAbi;\n this.beaconAbi = config.beaconAbi;\n }\n}","export const DECIMAL_PRECISION_6: number = 1000000; // 1e6\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n","import { DECIMAL_PRECISION_6, Q96 } from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error('Price too large');\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * DECIMAL_PRECISION_6;\n return BigInt(Math.floor(scaledSqrtPrice)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}\n\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / DECIMAL_PRECISION_6) {\n throw new Error('Amount too large');\n }\n\n return BigInt(Math.floor(amount * DECIMAL_PRECISION_6));\n}\n\nexport function scaleX96(amount: number): bigint {\n return BigInt(scale6Decimals(amount)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}","import type { Hex } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals } from \"../utils\";\n\nexport type ClosePositionParams = {\n minAmt0Out: number;\n minAmt1Out: number;\n maxAmt1In: number;\n }\n\nexport class Position {\n private readonly context: PerpCityContext;\n private readonly perpId: Hex;\n public readonly positionId: bigint;\n\n constructor(context: PerpCityContext, perpId: Hex, positionId: bigint) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n }\n\n async closePosition(params: ClosePositionParams): Promise<Position | null> {\n const contractParams = {\n positionId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'closePosition',\n args: [this.perpId, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n const takerPositionId: bigint = result[0];\n\n if (takerPositionId === 0n) {\n return null;\n }\n \n return new Position(this.context, this.perpId, takerPositionId);\n }\n}","import type {Hex} from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { Position } from \"./position\";\nimport { scale6Decimals, scaleX96 } from \"../utils\";\n\nexport type OpenMakerPositionParams = {\n margin: number;\n liquidity: number;\n tickLower: number;\n tickUpper: number;\n maxAmt0In: number;\n maxAmt1In: number;\n}\n\nexport type OpenTakerPositionParams = {\n isLong: boolean;\n margin: number;\n leverage: number;\n unspecifiedAmountLimit: number;\n \n}\n\nexport class Perp {\n private readonly context: PerpCityContext;\n public readonly id: Hex;\n\n constructor(context: PerpCityContext, id: Hex) {\n this.context = context;\n this.id = id;\n }\n\n // READS\n\n // WRITES\n\n // TODO: read tickspacing from perp to adjust tickLower and tickUpper\n async openMakerPosition(params: OpenMakerPositionParams): Promise<Position> {\n const contractParams = {\n margin: scale6Decimals(params.margin),\n liquidity: BigInt(params.liquidity),\n tickLower: BigInt(params.tickLower),\n tickUpper: BigInt(params.tickUpper),\n maxAmt0In: scale6Decimals(params.maxAmt0In),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openMakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n\n async openTakerPosition(params: OpenTakerPositionParams): Promise<Position> {\n const contractParams = {\n isLong: params.isLong,\n margin: scale6Decimals(params.margin),\n leverage: scaleX96(params.leverage),\n unspecifiedAmountLimit: scale6Decimals(params.unspecifiedAmountLimit),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openTakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\n\n// In the future, this is where multicalls are used to fetch data across many perps\nexport class PerpCollection {\n private readonly context: PerpCityContext;\n public readonly perps: Perp[];\n\n constructor(context: PerpCityContext, perps: Perp[]) {\n this.context = context;\n this.perps = perps;\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\nimport { priceToSqrtPriceX96 } from \"../utils\";\nimport { PerpCollection } from \"./perp-collection\";\nimport type { Address, Hex } from \"viem\";\nimport { gql } from \"graphql-request\";\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { parse } from 'graphql';\n\nexport type CreatePerpParams = {\n startingPrice: number;\n beacon: Address;\n}\n\nexport class PerpManager {\n private readonly context: PerpCityContext;\n \n constructor(context: PerpCityContext) {\n this.context = context;\n }\n\n // READS\n\n async getPerps(): Promise<PerpCollection> {\n const query: TypedDocumentNode<{ perps: { id: Hex }[] }, Record<any, never>> = parse(gql`\n {\n perps {\n id\n }\n }\n `)\n\n const response = await this.context.goldskyClient.request(query);\n \n const perps = response.perps.map((perpData: { id: Hex }) => \n new Perp(this.context, perpData.id as Hex)\n );\n\n return new PerpCollection(this.context, perps);\n }\n\n // WRITES\n\n async createPerp(params: CreatePerpParams): Promise<Perp> {\n const sqrtPriceX96: bigint = priceToSqrtPriceX96(params.startingPrice);\n\n // const contractParams = {\n // startingSqrtPriceX96: sqrtPriceX96,\n // beacon: params.beacon,\n // };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'createPerp',\n args: [sqrtPriceX96, params.beacon],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Perp(this.context, result[0] as Hex);\n }\n}"],"mappings":"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","names":["import_graphql_request"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/context.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/entities/position.ts","../src/entities/perp.ts","../src/entities/perp-collection.ts","../src/entities/perp-manager.ts"],"sourcesContent":["export * from './context';\nexport * from './entities';\nexport * from './utils';","import type { PublicClient, WalletClient, Abi, Address} from \"viem\";\nimport { GraphQLClient } from 'graphql-request'\n\nexport type PerpCityContextConfig = {\n publicClient: PublicClient;\n walletClient: WalletClient;\n goldskyEndpoint: string;\n perpManagerAddress: Address;\n perpManagerAbi: Abi;\n beaconAbi: Abi;\n}\n\nexport class PerpCityContext {\n public readonly publicClient: PublicClient;\n public readonly walletClient: WalletClient;\n // below will be hard-coded in addresses.ts, abis.ts, and endpoints.ts once they are frozen\n // they are currently being rapidly redeployed so can be specified by the sdk consumer for now\n public readonly goldskyClient: GraphQLClient;\n public readonly perpManagerAddress: Address;\n public readonly perpManagerAbi: Abi;\n public readonly beaconAbi: Abi;\n\n constructor(config: PerpCityContextConfig) {\n this.publicClient = config.publicClient;\n this.walletClient = config.walletClient;\n this.goldskyClient = new GraphQLClient(config.goldskyEndpoint);\n this.perpManagerAddress = config.perpManagerAddress;\n this.perpManagerAbi = config.perpManagerAbi;\n this.beaconAbi = config.beaconAbi;\n }\n}","export const DECIMAL_PRECISION_6: number = 1000000; // 1e6\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n","import { DECIMAL_PRECISION_6, Q96 } from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error('Price too large');\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * DECIMAL_PRECISION_6;\n return BigInt(Math.floor(scaledSqrtPrice)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}\n\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / DECIMAL_PRECISION_6) {\n throw new Error('Amount too large');\n }\n\n return BigInt(Math.floor(amount * DECIMAL_PRECISION_6));\n}\n\nexport function scaleX96(amount: number): bigint {\n return BigInt(scale6Decimals(amount)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}","import type { Hex } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals } from \"../utils\";\n\nexport type ClosePositionParams = {\n minAmt0Out: number;\n minAmt1Out: number;\n maxAmt1In: number;\n }\n\nexport class Position {\n private readonly context: PerpCityContext;\n private readonly perpId: Hex;\n public readonly positionId: bigint;\n\n constructor(context: PerpCityContext, perpId: Hex, positionId: bigint) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n }\n\n async closePosition(params: ClosePositionParams): Promise<Position | null> {\n const contractParams = {\n positionId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'closePosition',\n args: [this.perpId, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n const takerPositionId: bigint = result[0];\n\n if (takerPositionId === 0n) {\n return null;\n }\n \n return new Position(this.context, this.perpId, takerPositionId);\n }\n}","import type {Hex} from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { Position } from \"./position\";\nimport { scale6Decimals, scaleX96 } from \"../utils\";\n\nexport type OpenMakerPositionParams = {\n margin: number;\n liquidity: number;\n tickLower: number;\n tickUpper: number;\n maxAmt0In: number;\n maxAmt1In: number;\n}\n\nexport type OpenTakerPositionParams = {\n isLong: boolean;\n margin: number;\n leverage: number;\n unspecifiedAmountLimit: number;\n \n}\n\nexport class Perp {\n private readonly context: PerpCityContext;\n public readonly id: Hex;\n\n constructor(context: PerpCityContext, id: Hex) {\n this.context = context;\n this.id = id;\n }\n\n // READS\n\n // WRITES\n\n // TODO: read tickspacing from perp to adjust tickLower and tickUpper\n async openMakerPosition(params: OpenMakerPositionParams): Promise<Position> {\n const contractParams = {\n margin: scale6Decimals(params.margin),\n liquidity: BigInt(params.liquidity),\n tickLower: BigInt(params.tickLower),\n tickUpper: BigInt(params.tickUpper),\n maxAmt0In: scale6Decimals(params.maxAmt0In),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openMakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n\n async openTakerPosition(params: OpenTakerPositionParams): Promise<Position> {\n const contractParams = {\n isLong: params.isLong,\n margin: scale6Decimals(params.margin),\n leverage: scaleX96(params.leverage),\n unspecifiedAmountLimit: scale6Decimals(params.unspecifiedAmountLimit),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openTakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\n\n// In the future, this is where multicalls are used to fetch data across many perps\nexport class PerpCollection {\n private readonly context: PerpCityContext;\n public readonly perps: Perp[];\n\n constructor(context: PerpCityContext, perps: Perp[]) {\n this.context = context;\n this.perps = perps;\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\nimport { priceToSqrtPriceX96 } from \"../utils\";\nimport { PerpCollection } from \"./perp-collection\";\nimport type { Address, Hex } from \"viem\";\nimport { gql } from \"graphql-request\";\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { parse } from 'graphql';\n\nexport type CreatePerpParams = {\n startingPrice: number;\n beacon: Address;\n}\n\nexport class PerpManager {\n private readonly context: PerpCityContext;\n \n constructor(context: PerpCityContext) {\n this.context = context;\n }\n\n // READS\n\n async getPerps(): Promise<PerpCollection> {\n const query: TypedDocumentNode<{ perps: { id: Hex }[] }, Record<any, never>> = parse(gql`\n {\n perps {\n id\n }\n }\n `)\n\n const response = await this.context.goldskyClient.request(query);\n \n const perps = response.perps.map((perpData: { id: Hex }) => \n new Perp(this.context, perpData.id as Hex)\n );\n\n return new PerpCollection(this.context, perps);\n }\n\n // WRITES\n\n async createPerp(params: CreatePerpParams): Promise<Perp> {\n const sqrtPriceX96: bigint = priceToSqrtPriceX96(params.startingPrice);\n\n // const contractParams = {\n // startingSqrtPriceX96: sqrtPriceX96,\n // beacon: params.beacon,\n // };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'createPerp',\n args: [sqrtPriceX96, params.beacon],\n account: this.context.walletClient.account,\n chain: this.context.walletClient.chain,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Perp(this.context, result[0] as Hex);\n }\n}"],"mappings":"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","names":["import_graphql_request"]}
|
package/dist/index.mjs
CHANGED
|
@@ -148,7 +148,8 @@ var PerpManager = class {
|
|
|
148
148
|
abi: this.context.perpManagerAbi,
|
|
149
149
|
functionName: "createPerp",
|
|
150
150
|
args: [sqrtPriceX96, params.beacon],
|
|
151
|
-
account: this.context.walletClient.account
|
|
151
|
+
account: this.context.walletClient.account,
|
|
152
|
+
chain: this.context.walletClient.chain
|
|
152
153
|
});
|
|
153
154
|
await this.context.walletClient.writeContract(request);
|
|
154
155
|
return new Perp(this.context, result[0]);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/entities/position.ts","../src/entities/perp.ts","../src/entities/perp-collection.ts","../src/entities/perp-manager.ts"],"sourcesContent":["import type { PublicClient, WalletClient, Abi, Address} from \"viem\";\nimport { GraphQLClient } from 'graphql-request'\n\nexport type PerpCityContextConfig = {\n publicClient: PublicClient;\n walletClient: WalletClient;\n goldskyEndpoint: string;\n perpManagerAddress: Address;\n perpManagerAbi: Abi;\n beaconAbi: Abi;\n}\n\nexport class PerpCityContext {\n public readonly publicClient: PublicClient;\n public readonly walletClient: WalletClient;\n // below will be hard-coded in addresses.ts, abis.ts, and endpoints.ts once they are frozen\n // they are currently being rapidly redeployed so can be specified by the sdk consumer for now\n public readonly goldskyClient: GraphQLClient;\n public readonly perpManagerAddress: Address;\n public readonly perpManagerAbi: Abi;\n public readonly beaconAbi: Abi;\n\n constructor(config: PerpCityContextConfig) {\n this.publicClient = config.publicClient;\n this.walletClient = config.walletClient;\n this.goldskyClient = new GraphQLClient(config.goldskyEndpoint);\n this.perpManagerAddress = config.perpManagerAddress;\n this.perpManagerAbi = config.perpManagerAbi;\n this.beaconAbi = config.beaconAbi;\n }\n}","export const DECIMAL_PRECISION_6: number = 1000000; // 1e6\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n","import { DECIMAL_PRECISION_6, Q96 } from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error('Price too large');\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * DECIMAL_PRECISION_6;\n return BigInt(Math.floor(scaledSqrtPrice)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}\n\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / DECIMAL_PRECISION_6) {\n throw new Error('Amount too large');\n }\n\n return BigInt(Math.floor(amount * DECIMAL_PRECISION_6));\n}\n\nexport function scaleX96(amount: number): bigint {\n return BigInt(scale6Decimals(amount)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}","import type { Hex } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals } from \"../utils\";\n\nexport type ClosePositionParams = {\n minAmt0Out: number;\n minAmt1Out: number;\n maxAmt1In: number;\n }\n\nexport class Position {\n private readonly context: PerpCityContext;\n private readonly perpId: Hex;\n public readonly positionId: bigint;\n\n constructor(context: PerpCityContext, perpId: Hex, positionId: bigint) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n }\n\n async closePosition(params: ClosePositionParams): Promise<Position | null> {\n const contractParams = {\n positionId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'closePosition',\n args: [this.perpId, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n const takerPositionId: bigint = result[0];\n\n if (takerPositionId === 0n) {\n return null;\n }\n \n return new Position(this.context, this.perpId, takerPositionId);\n }\n}","import type {Hex} from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { Position } from \"./position\";\nimport { scale6Decimals, scaleX96 } from \"../utils\";\n\nexport type OpenMakerPositionParams = {\n margin: number;\n liquidity: number;\n tickLower: number;\n tickUpper: number;\n maxAmt0In: number;\n maxAmt1In: number;\n}\n\nexport type OpenTakerPositionParams = {\n isLong: boolean;\n margin: number;\n leverage: number;\n unspecifiedAmountLimit: number;\n \n}\n\nexport class Perp {\n private readonly context: PerpCityContext;\n public readonly id: Hex;\n\n constructor(context: PerpCityContext, id: Hex) {\n this.context = context;\n this.id = id;\n }\n\n // READS\n\n // WRITES\n\n // TODO: read tickspacing from perp to adjust tickLower and tickUpper\n async openMakerPosition(params: OpenMakerPositionParams): Promise<Position> {\n const contractParams = {\n margin: scale6Decimals(params.margin),\n liquidity: BigInt(params.liquidity),\n tickLower: BigInt(params.tickLower),\n tickUpper: BigInt(params.tickUpper),\n maxAmt0In: scale6Decimals(params.maxAmt0In),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openMakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n\n async openTakerPosition(params: OpenTakerPositionParams): Promise<Position> {\n const contractParams = {\n isLong: params.isLong,\n margin: scale6Decimals(params.margin),\n leverage: scaleX96(params.leverage),\n unspecifiedAmountLimit: scale6Decimals(params.unspecifiedAmountLimit),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openTakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\n\n// In the future, this is where multicalls are used to fetch data across many perps\nexport class PerpCollection {\n private readonly context: PerpCityContext;\n public readonly perps: Perp[];\n\n constructor(context: PerpCityContext, perps: Perp[]) {\n this.context = context;\n this.perps = perps;\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\nimport { priceToSqrtPriceX96 } from \"../utils\";\nimport { PerpCollection } from \"./perp-collection\";\nimport type { Address, Hex } from \"viem\";\nimport { gql } from \"graphql-request\";\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { parse } from 'graphql';\n\nexport type CreatePerpParams = {\n startingPrice: number;\n beacon: Address;\n}\n\nexport class PerpManager {\n private readonly context: PerpCityContext;\n \n constructor(context: PerpCityContext) {\n this.context = context;\n }\n\n // READS\n\n async getPerps(): Promise<PerpCollection> {\n const query: TypedDocumentNode<{ perps: { id: Hex }[] }, Record<any, never>> = parse(gql`\n {\n perps {\n id\n }\n }\n `)\n\n const response = await this.context.goldskyClient.request(query);\n \n const perps = response.perps.map((perpData: { id: Hex }) => \n new Perp(this.context, perpData.id as Hex)\n );\n\n return new PerpCollection(this.context, perps);\n }\n\n // WRITES\n\n async createPerp(params: CreatePerpParams): Promise<Perp> {\n const sqrtPriceX96: bigint = priceToSqrtPriceX96(params.startingPrice);\n\n // const contractParams = {\n // startingSqrtPriceX96: sqrtPriceX96,\n // beacon: params.beacon,\n // };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'createPerp',\n args: [sqrtPriceX96, params.beacon],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Perp(this.context, result[0] as Hex);\n }\n}"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/context.ts","../src/utils/constants.ts","../src/utils/conversions.ts","../src/entities/position.ts","../src/entities/perp.ts","../src/entities/perp-collection.ts","../src/entities/perp-manager.ts"],"sourcesContent":["import type { PublicClient, WalletClient, Abi, Address} from \"viem\";\nimport { GraphQLClient } from 'graphql-request'\n\nexport type PerpCityContextConfig = {\n publicClient: PublicClient;\n walletClient: WalletClient;\n goldskyEndpoint: string;\n perpManagerAddress: Address;\n perpManagerAbi: Abi;\n beaconAbi: Abi;\n}\n\nexport class PerpCityContext {\n public readonly publicClient: PublicClient;\n public readonly walletClient: WalletClient;\n // below will be hard-coded in addresses.ts, abis.ts, and endpoints.ts once they are frozen\n // they are currently being rapidly redeployed so can be specified by the sdk consumer for now\n public readonly goldskyClient: GraphQLClient;\n public readonly perpManagerAddress: Address;\n public readonly perpManagerAbi: Abi;\n public readonly beaconAbi: Abi;\n\n constructor(config: PerpCityContextConfig) {\n this.publicClient = config.publicClient;\n this.walletClient = config.walletClient;\n this.goldskyClient = new GraphQLClient(config.goldskyEndpoint);\n this.perpManagerAddress = config.perpManagerAddress;\n this.perpManagerAbi = config.perpManagerAbi;\n this.beaconAbi = config.beaconAbi;\n }\n}","export const DECIMAL_PRECISION_6: number = 1000000; // 1e6\n\nexport const Q96: bigint = 79228162514264337593543950336n; // 2^96\n","import { DECIMAL_PRECISION_6, Q96 } from \"./constants\";\n\nexport function priceToSqrtPriceX96(price: number): bigint {\n if (price > Number.MAX_SAFE_INTEGER) {\n throw new Error('Price too large');\n }\n\n const scaledSqrtPrice: number = Math.sqrt(price) * DECIMAL_PRECISION_6;\n return BigInt(Math.floor(scaledSqrtPrice)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}\n\nexport function scale6Decimals(amount: number): bigint {\n if (amount > Number.MAX_SAFE_INTEGER / DECIMAL_PRECISION_6) {\n throw new Error('Amount too large');\n }\n\n return BigInt(Math.floor(amount * DECIMAL_PRECISION_6));\n}\n\nexport function scaleX96(amount: number): bigint {\n return BigInt(scale6Decimals(amount)) * Q96 / BigInt(DECIMAL_PRECISION_6);\n}","import type { Hex } from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { scale6Decimals } from \"../utils\";\n\nexport type ClosePositionParams = {\n minAmt0Out: number;\n minAmt1Out: number;\n maxAmt1In: number;\n }\n\nexport class Position {\n private readonly context: PerpCityContext;\n private readonly perpId: Hex;\n public readonly positionId: bigint;\n\n constructor(context: PerpCityContext, perpId: Hex, positionId: bigint) {\n this.context = context;\n this.perpId = perpId;\n this.positionId = positionId;\n }\n\n async closePosition(params: ClosePositionParams): Promise<Position | null> {\n const contractParams = {\n positionId: this.positionId,\n minAmt0Out: scale6Decimals(params.minAmt0Out),\n minAmt1Out: scale6Decimals(params.minAmt1Out),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'closePosition',\n args: [this.perpId, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n const takerPositionId: bigint = result[0];\n\n if (takerPositionId === 0n) {\n return null;\n }\n \n return new Position(this.context, this.perpId, takerPositionId);\n }\n}","import type {Hex} from \"viem\";\nimport { PerpCityContext } from \"../context\";\nimport { Position } from \"./position\";\nimport { scale6Decimals, scaleX96 } from \"../utils\";\n\nexport type OpenMakerPositionParams = {\n margin: number;\n liquidity: number;\n tickLower: number;\n tickUpper: number;\n maxAmt0In: number;\n maxAmt1In: number;\n}\n\nexport type OpenTakerPositionParams = {\n isLong: boolean;\n margin: number;\n leverage: number;\n unspecifiedAmountLimit: number;\n \n}\n\nexport class Perp {\n private readonly context: PerpCityContext;\n public readonly id: Hex;\n\n constructor(context: PerpCityContext, id: Hex) {\n this.context = context;\n this.id = id;\n }\n\n // READS\n\n // WRITES\n\n // TODO: read tickspacing from perp to adjust tickLower and tickUpper\n async openMakerPosition(params: OpenMakerPositionParams): Promise<Position> {\n const contractParams = {\n margin: scale6Decimals(params.margin),\n liquidity: BigInt(params.liquidity),\n tickLower: BigInt(params.tickLower),\n tickUpper: BigInt(params.tickUpper),\n maxAmt0In: scale6Decimals(params.maxAmt0In),\n maxAmt1In: scale6Decimals(params.maxAmt1In),\n };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openMakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n\n async openTakerPosition(params: OpenTakerPositionParams): Promise<Position> {\n const contractParams = {\n isLong: params.isLong,\n margin: scale6Decimals(params.margin),\n leverage: scaleX96(params.leverage),\n unspecifiedAmountLimit: scale6Decimals(params.unspecifiedAmountLimit),\n };\n \n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'openTakerPosition',\n args: [this.id, contractParams],\n account: this.context.walletClient.account,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Position(this.context, this.id, result[0] as bigint);\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\n\n// In the future, this is where multicalls are used to fetch data across many perps\nexport class PerpCollection {\n private readonly context: PerpCityContext;\n public readonly perps: Perp[];\n\n constructor(context: PerpCityContext, perps: Perp[]) {\n this.context = context;\n this.perps = perps;\n }\n}","import { PerpCityContext } from \"../context\";\nimport { Perp } from \"./perp\";\nimport { priceToSqrtPriceX96 } from \"../utils\";\nimport { PerpCollection } from \"./perp-collection\";\nimport type { Address, Hex } from \"viem\";\nimport { gql } from \"graphql-request\";\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { parse } from 'graphql';\n\nexport type CreatePerpParams = {\n startingPrice: number;\n beacon: Address;\n}\n\nexport class PerpManager {\n private readonly context: PerpCityContext;\n \n constructor(context: PerpCityContext) {\n this.context = context;\n }\n\n // READS\n\n async getPerps(): Promise<PerpCollection> {\n const query: TypedDocumentNode<{ perps: { id: Hex }[] }, Record<any, never>> = parse(gql`\n {\n perps {\n id\n }\n }\n `)\n\n const response = await this.context.goldskyClient.request(query);\n \n const perps = response.perps.map((perpData: { id: Hex }) => \n new Perp(this.context, perpData.id as Hex)\n );\n\n return new PerpCollection(this.context, perps);\n }\n\n // WRITES\n\n async createPerp(params: CreatePerpParams): Promise<Perp> {\n const sqrtPriceX96: bigint = priceToSqrtPriceX96(params.startingPrice);\n\n // const contractParams = {\n // startingSqrtPriceX96: sqrtPriceX96,\n // beacon: params.beacon,\n // };\n\n const { result, request } = await this.context.publicClient.simulateContract({\n address: this.context.perpManagerAddress,\n abi: this.context.perpManagerAbi,\n functionName: 'createPerp',\n args: [sqrtPriceX96, params.beacon],\n account: this.context.walletClient.account,\n chain: this.context.walletClient.chain,\n });\n\n await this.context.walletClient.writeContract(request);\n\n return new Perp(this.context, result[0] as Hex);\n }\n}"],"mappings":"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","names":[]}
|
package/package.json
CHANGED