diff --git a/assembly/panoptic/host.ts b/assembly/panoptic/host.ts index 94d8ea8..1f25500 100644 --- a/assembly/panoptic/host.ts +++ b/assembly/panoptic/host.ts @@ -45,8 +45,10 @@ import { PanopticSdkRecordEnvelopeDto, PanopticStringEnvelopeDto, PanopticTokenIdAddLegRequestDto, + PanopticTokenIdBuildCallRequestDto, PanopticTokenIdBuildEnvelopeDto, PanopticTokenIdBuildLegsRequestDto, + PanopticTokenIdBuildOperationDto, PanopticTokenIdBuildOperationsRequestDto, PanopticTokenIdClassifyEnvelopeDto, PanopticTokenIdCountLegsEnvelopeDto, @@ -258,6 +260,22 @@ export function panopticTokenIdBuildFromOperations(request: PanopticTokenIdBuild return callPanoptic(PanopticMethods.PANOPTIC_TOKEN_ID_BUILD, request); } +export function panopticTokenIdBuildCall(request: PanopticTokenIdBuildCallRequestDto): PanopticTokenIdBuildEnvelopeDto { + const operation = new PanopticTokenIdBuildOperationDto(); + operation.kind = "call"; + operation.asset = request.args.call.asset; + operation.optionRatio = request.args.call.optionRatio; + operation.isLong = request.args.call.isLong; + operation.riskPartner = request.args.call.riskPartner; + operation.strike = request.args.call.strike; + operation.width = request.args.call.width; + + const operationsRequest = new PanopticTokenIdBuildOperationsRequestDto(); + operationsRequest.args.poolId = request.args.poolId; + operationsRequest.args.operations = [operation]; + return panopticTokenIdBuildFromOperations(operationsRequest); +} + export function panopticTokenIdBuildUniqueLoan(request: PanopticTokenIdUniqueLoanRequestDto): PanopticTokenIdUniqueLoanEnvelopeDto { return callPanoptic(PanopticMethods.PANOPTIC_TOKEN_ID_BUILD_UNIQUE_LOAN, request); } diff --git a/assembly/panoptic/types.ts b/assembly/panoptic/types.ts index 4558dfa..f39d76c 100644 --- a/assembly/panoptic/types.ts +++ b/assembly/panoptic/types.ts @@ -293,6 +293,27 @@ export class PanopticTokenIdBuildOperationDto { width: string = ""; } +@serializable +export class PanopticTokenIdBuildCallDto { + asset: string = ""; + optionRatio: string = ""; + isLong: bool = false; + riskPartner: string = ""; + strike: string = ""; + width: string = ""; +} + +@serializable +export class PanopticTokenIdBuildCallArgsDto { + poolId: string = ""; + call: PanopticTokenIdBuildCallDto = new PanopticTokenIdBuildCallDto(); +} + +@serializable +export class PanopticTokenIdBuildCallRequestDto { + args: PanopticTokenIdBuildCallArgsDto = new PanopticTokenIdBuildCallArgsDto(); +} + @serializable export class PanopticTokenIdBuildLegsArgsDto { poolId: string = ""; diff --git a/tests/fixtures/panoptic-consumer.ts b/tests/fixtures/panoptic-consumer.ts index 1094459..ac073ec 100644 --- a/tests/fixtures/panoptic-consumer.ts +++ b/tests/fixtures/panoptic-consumer.ts @@ -1,6 +1,7 @@ import { DynamicJobFragmentDto, Erc20ApproveFragmentRequestDto, + PanopticTokenIdBuildCallRequestDto, PanopticTokenIdBuildLegDto, PanopticTokenIdBuildLegsRequestDto, PanopticTokenIdBuildOperationDto, @@ -9,6 +10,7 @@ import { PanopticTokenIdValueRequestDto, PanopticMethods, erc20ApproveFragment, + panopticTokenIdBuildCall, panopticTokenIdBuildFromLegs, panopticTokenIdBuildFromOperations, panopticTokenIdBuildUniqueLoan, @@ -62,13 +64,23 @@ export function compileTypedPanopticWrapper(): string { operationsRequest.args.operations = [operation]; const builtFromOperations = panopticTokenIdBuildFromOperations(operationsRequest); + const callRequest = new PanopticTokenIdBuildCallRequestDto(); + callRequest.args.poolId = "300"; + callRequest.args.call.asset = "1"; + callRequest.args.call.optionRatio = "1"; + callRequest.args.call.isLong = true; + callRequest.args.call.riskPartner = "0"; + callRequest.args.call.strike = "20"; + callRequest.args.call.width = "1"; + const builtFromCall = panopticTokenIdBuildCall(callRequest); + const uniqueLoanRequest = new PanopticTokenIdUniqueLoanRequestDto(); uniqueLoanRequest.args.poolId = "100"; uniqueLoanRequest.args.asset = "0"; uniqueLoanRequest.args.tokenType = "1"; uniqueLoanRequest.args.currentTick = "-10"; uniqueLoanRequest.args.tickSpacing = "10"; - uniqueLoanRequest.args.existingPositionIds = [built.result.tokenId, builtFromOperations.result.tokenId]; + uniqueLoanRequest.args.existingPositionIds = [built.result.tokenId, builtFromOperations.result.tokenId, builtFromCall.result.tokenId]; uniqueLoanRequest.args.positionSize = "1000"; const uniqueLoan = panopticTokenIdBuildUniqueLoan(uniqueLoanRequest); diff --git a/tests/index.test.ts b/tests/index.test.ts index eb8de95..1ca830d 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -23,6 +23,15 @@ describe('AssemblyScript package surface', () => { ); }); + it('keeps the semantic call TokenId wrapper on the existing operation build method', () => { + const hostSource = fs.readFileSync(path.resolve(__dirname, '../assembly/panoptic/host.ts'), 'utf8'); + + expect(hostSource).toContain('export function panopticTokenIdBuildCall(request: PanopticTokenIdBuildCallRequestDto)'); + expect(hostSource).toContain('operation.kind = "call"'); + expect(hostSource).toContain('operationsRequest.args.operations = [operation]'); + expect(hostSource).toContain('return panopticTokenIdBuildFromOperations(operationsRequest)'); + }); + it('preserves json-as runtime compatibility for legacy prices and dynamic Merkle proof keys', () => { const repoRoot = path.resolve(__dirname, '..'); const wasmPath = path.join(os.tmpdir(), 'strategy-utils-json-compat.fixture.wasm');