Skip to content

Commit

Permalink
roll tokenized positions
Browse files Browse the repository at this point in the history
  • Loading branch information
kyscott18 committed Oct 2, 2023
1 parent aa85a70 commit a59f29d
Show file tree
Hide file tree
Showing 7 changed files with 211 additions and 41 deletions.
4 changes: 2 additions & 2 deletions packages/panoptic-sdk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Typescript SDK for Panoptic
- [ ] `calculateSFPMInitializeAMMPool`
- [ ] `calculateSFPMMintTokenizedPosition`
- [ ] `calculateSFPMBurnTokenizedPosition`
- [ ] `calculateSFPMRollTokenizedPosition`
- [ ] `calculateSFPMRollTokenizedPositions`

- Public Actions

Expand All @@ -59,7 +59,7 @@ Typescript SDK for Panoptic
- [x] `simulateSFPMInitializeAMMPool`
- [x] `simulateSFPMMintTokenizedPosition`
- [x] `simulateSFPMBurnTokenizedPosition`
- [ ] `simulateSFPMRollTokenizedPosition`
- [x] `simulateSFPMRollTokenizedPositions`

- Chains

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export const simulatePanopticSFPMBurnTokenizedPosition = <
address: position.pool.factory.semiFungiblePositionManager.address,
abi: semiFungiblePositionManagerABI,
functionName: "burnTokenizedPosition",
args: [[position.id], amount, MIN_TICK, MAX_TICK],
args: [position.id, amount, MIN_TICK, MAX_TICK],
...request,
} as unknown as SimulateContractParameters<
typeof semiFungiblePositionManagerABI,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export const simulatePanopticSFPMMintTokenizedPosition = <
address: position.pool.factory.semiFungiblePositionManager.address,
abi: semiFungiblePositionManagerABI,
functionName: "mintTokenizedPosition",
args: [[position.id], amount, MIN_TICK, MAX_TICK],
args: [position.id, amount, MIN_TICK, MAX_TICK],
...request,
} as unknown as SimulateContractParameters<
typeof semiFungiblePositionManagerABI,
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
import { getERC1155BalanceOf } from "reverse-mirage";
import { createUniswapV3Tick } from "uniswap-v3-sdk";
import { type Hex } from "viem";
import { simulateContract, writeContract } from "viem/actions";
import { sepolia } from "viem/chains";
import { beforeEach, expect, test } from "vitest";
import { ALICE } from "../_test/constants.js";
import {
deployPool,
publicClient,
testClient,
walletClient,
} from "../_test/utils.js";
import { mockErc20ABI } from "../generated.js";
import type { PanopticPool } from "../types/PanopticPool.js";
import type { PanopticPosition } from "../types/PanopticPosition.js";
import { createPanopticPosition } from "../utils/createPanopticPosition.js";
import { simulatePanopticSFPMInitializeAMMPool } from "./simulatePanopticSFPMInitializeAMMPool.js";
import { simulatePanopticSFPMMintTokenizedPosition } from "./simulatePanopticSFPMMintTokenizedPosition.js";
import { simulatePanopticSFPMRollTokenizedPositions } from "./simulatePanopticSFPMRollTokenizedPositions.js";

let id: Hex | undefined = undefined;

let pool: PanopticPool;

let position: PanopticPosition;

beforeEach(async () => {
if (id === undefined) {
pool = await deployPool();
const { request: initializeRequest } =
await simulatePanopticSFPMInitializeAMMPool(publicClient, {
args: {
pool: pool.uniswapPool,
sfpm: pool.factory.semiFungiblePositionManager,
},
});

const initializeHash = await walletClient.writeContract(initializeRequest);
await publicClient.waitForTransactionReceipt({ hash: initializeHash });

const { request: approveRequest } = await simulateContract(publicClient, {
address: pool.collateralTracker0.underlyingToken.address,
abi: mockErc20ABI,
functionName: "approve",
args: [pool.factory.semiFungiblePositionManager.address, 10n ** 24n],
account: ALICE,
});

const approveHash = await writeContract(walletClient, approveRequest);
await publicClient.waitForTransactionReceipt({ hash: approveHash });

position = createPanopticPosition(
ALICE,
pool,
[
{
asset: "token0",
optionRatio: 1,
position: "short",
tokenType: "token0",
riskPartnerIndex: 0,
tickLower: createUniswapV3Tick(0),
tickUpper: createUniswapV3Tick(10),
},
undefined,
undefined,
undefined,
],
sepolia.id,
);

const { request } = await simulatePanopticSFPMMintTokenizedPosition(
publicClient,
{
args: {
position,
amount: 10n ** 18n,
},
account: ALICE,
},
);
const hash = await walletClient.writeContract(request);
await publicClient.waitForTransactionReceipt({ hash });
} else {
await testClient.revert({ id });
}
id = await testClient.snapshot();
}, 100_000);

test("roll tokenized position", async () => {
const newPosition = createPanopticPosition(
ALICE,
pool,
[
{
asset: "token0",
optionRatio: 1,
position: "short",
tokenType: "token0",
riskPartnerIndex: 0,
tickLower: createUniswapV3Tick(10),
tickUpper: createUniswapV3Tick(20),
},
undefined,
undefined,
undefined,
],
sepolia.id,
);

const { request } = await simulatePanopticSFPMRollTokenizedPositions(
publicClient,
{
args: {
oldPosition: position,
newPosition,
amount: 10n ** 18n,
},
account: ALICE,
},
);
const hash = await walletClient.writeContract(request);
await publicClient.waitForTransactionReceipt({ hash });

const oldBalance = await getERC1155BalanceOf(publicClient, {
erc1155: position,
address: position.owner,
});

expect(oldBalance.amount).toBe(0n);

const newBalance = await getERC1155BalanceOf(publicClient, {
erc1155: newPosition,
address: position.owner,
});

expect(newBalance.amount).toBe(10n ** 18n);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { MAX_TICK, MIN_TICK } from "uniswap-v3-sdk";
import type {
Chain,
Client,
SimulateContractParameters,
SimulateContractReturnType,
Transport,
} from "viem";
import { simulateContract } from "viem/contract";
import { semiFungiblePositionManagerABI } from "../generated.js";
import type { PanopticPosition } from "../types/PanopticPosition.js";

export type PanopticSFPMRollTokenizedPositionsParameters = {
oldPosition: PanopticPosition;
newPosition: PanopticPosition;
amount: bigint;
};

export type SimulatePanopticSFPMRollTokenizedPositionsParameters<
TChain extends Chain | undefined = Chain,
TChainOverride extends Chain | undefined = Chain | undefined,
> = Omit<
SimulateContractParameters<
typeof semiFungiblePositionManagerABI,
"rollTokenizedPositions",
TChain,
TChainOverride
>,
"args" | "address" | "abi" | "functionName"
> & { args: PanopticSFPMRollTokenizedPositionsParameters };

export type SimulatePanopticSFPMRollTokenizedPositionsReturnType<
TChain extends Chain | undefined,
TChainOverride extends Chain | undefined = undefined,
> = SimulateContractReturnType<
typeof semiFungiblePositionManagerABI,
"rollTokenizedPositions",
TChain,
TChainOverride
>;

export const simulatePanopticSFPMRollTokenizedPositions = <
TChain extends Chain | undefined,
TChainOverride extends Chain | undefined,
>(
client: Client<Transport, TChain>,
{
args: { oldPosition, newPosition, amount },
...request
}: SimulatePanopticSFPMRollTokenizedPositionsParameters<
TChain,
TChainOverride
>,
): Promise<
SimulatePanopticSFPMRollTokenizedPositionsReturnType<TChain, TChainOverride>
> =>
simulateContract(client, {
address: newPosition.pool.factory.semiFungiblePositionManager.address,
abi: semiFungiblePositionManagerABI,
functionName: "rollTokenizedPositions",
args: [oldPosition.id, newPosition.id, amount, MIN_TICK, MAX_TICK],
...request,
} as unknown as SimulateContractParameters<
typeof semiFungiblePositionManagerABI,
"rollTokenizedPositions",
TChain,
TChainOverride
>);

0 comments on commit a59f29d

Please sign in to comment.