diff --git a/contracts/test/NonfungiblePositionManagerPositionsGasTest.sol b/contracts/test/NonfungiblePositionManagerPositionsGasTest.sol new file mode 100644 index 000000000..07c13d12c --- /dev/null +++ b/contracts/test/NonfungiblePositionManagerPositionsGasTest.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity =0.7.6; + +import '../NonfungiblePositionManager.sol'; + +contract NonfungiblePositionManagerPositionsGasTest { + NonfungiblePositionManager immutable nonfungiblePositionManager; + + constructor(NonfungiblePositionManager _nonfungiblePositionManager) { + nonfungiblePositionManager = _nonfungiblePositionManager; + } + + function getGasCostOfPositions(uint256 tokenId) external view returns (uint256) { + uint256 gasBefore = gasleft(); + nonfungiblePositionManager.positions(tokenId); + return gasBefore - gasleft(); + } +} diff --git a/test/NonfungiblePositionManager.spec.ts b/test/NonfungiblePositionManager.spec.ts index 317a951b0..6bc982005 100644 --- a/test/NonfungiblePositionManager.spec.ts +++ b/test/NonfungiblePositionManager.spec.ts @@ -9,6 +9,7 @@ import { IWETH9, IUniswapV3Factory, SwapRouter, + NonfungiblePositionManagerPositionsGasTest, } from '../typechain' import completeFixture from './shared/completeFixture' import { computePoolAddress } from './shared/computePoolAddress' @@ -1165,6 +1166,38 @@ describe('NonfungiblePositionManager', () => { }) }) + describe('#positions', async () => { + it('gas', async () => { + const positionsGasTestFactory = await ethers.getContractFactory('NonfungiblePositionManagerPositionsGasTest') + const positionsGasTest = (await positionsGasTestFactory.deploy( + nft.address + )) as NonfungiblePositionManagerPositionsGasTest + + await nft.createAndInitializePoolIfNecessary( + tokens[0].address, + tokens[1].address, + FeeAmount.MEDIUM, + encodePriceSqrt(1, 1) + ) + + await nft.mint({ + token0: tokens[0].address, + token1: tokens[1].address, + tickLower: getMinTick(TICK_SPACINGS[FeeAmount.MEDIUM]), + tickUpper: getMaxTick(TICK_SPACINGS[FeeAmount.MEDIUM]), + fee: FeeAmount.MEDIUM, + recipient: other.address, + amount0Desired: 15, + amount1Desired: 15, + amount0Min: 0, + amount1Min: 0, + deadline: 10, + }) + + await snapshotGasCost(positionsGasTest.getGasCostOfPositions(1)) + }) + }) + describe('fees accounting', () => { beforeEach('create two positions', async () => { await nft.createAndInitializePoolIfNecessary( diff --git a/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap b/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap index 090c86dee..279d432d1 100644 --- a/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap +++ b/test/__snapshots__/NonfungiblePositionManager.spec.ts.snap @@ -30,6 +30,8 @@ exports[`NonfungiblePositionManager #permit owned by eoa gas 1`] = `64528`; exports[`NonfungiblePositionManager #permit owned by verifying contract gas 1`] = `68325`; +exports[`NonfungiblePositionManager #positions gas 1`] = `19890`; + exports[`NonfungiblePositionManager #transferFrom gas 1`] = `79091`; exports[`NonfungiblePositionManager #transferFrom gas comes from approved 1`] = `67491`;