Commit 802ed413 authored by Jordan Frankfurt's avatar Jordan Frankfurt Committed by GitHub

make computePairAddress available to users (#59)

* make computePairAddress available to users

* move sort check to computePairAddress
parent 70f39ab7
import { ChainId, Token, TokenAmount, WETH9, Price } from '@uniswap/sdk-core' import { ChainId, Token, TokenAmount, WETH9, Price } from '@uniswap/sdk-core'
import { InsufficientInputAmountError } from '../errors' import { InsufficientInputAmountError } from '../errors'
import { Pair } from './pair' import { computePairAddress, Pair } from './pair'
describe('computePairAddress', () => {
it('should correctly compute the pool address', () => {
const tokenA = new Token(ChainId.MAINNET, '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 18, 'USDC', 'USD Coin')
const tokenB = new Token(ChainId.MAINNET, '0x6B175474E89094C44Da98b954EedeAC495271d0F', 18, 'DAI', 'DAI Stablecoin')
const result = computePairAddress({
factoryAddress: '0x1111111111111111111111111111111111111111',
tokenA,
tokenB
})
expect(result).toEqual('0xb50b5182D6a47EC53a469395AF44e371d7C76ed4')
})
it('should give same result regardless of token order', () => {
const USDC = new Token(ChainId.MAINNET, '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 18, 'USDC', 'USD Coin')
const DAI = new Token(ChainId.MAINNET, '0x6B175474E89094C44Da98b954EedeAC495271d0F', 18, 'DAI', 'DAI Stablecoin')
let tokenA = USDC
let tokenB = DAI
const resultA = computePairAddress({
factoryAddress: '0x1111111111111111111111111111111111111111',
tokenA,
tokenB
})
tokenA = DAI
tokenB = USDC
const resultB = computePairAddress({
factoryAddress: '0x1111111111111111111111111111111111111111',
tokenA,
tokenB
})
expect(resultA).toEqual(resultB)
})
})
describe('Pair', () => { describe('Pair', () => {
const USDC = new Token(ChainId.MAINNET, '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 18, 'USDC', 'USD Coin') const USDC = new Token(ChainId.MAINNET, '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', 18, 'USDC', 'USD Coin')
......
...@@ -8,18 +8,28 @@ import babylonianSqrt from '../utils/babylonianSqrt' ...@@ -8,18 +8,28 @@ import babylonianSqrt from '../utils/babylonianSqrt'
import { FACTORY_ADDRESS, INIT_CODE_HASH, MINIMUM_LIQUIDITY, FIVE, _997, _1000, ONE, ZERO } from '../constants' import { FACTORY_ADDRESS, INIT_CODE_HASH, MINIMUM_LIQUIDITY, FIVE, _997, _1000, ONE, ZERO } from '../constants'
import { InsufficientReservesError, InsufficientInputAmountError } from '../errors' import { InsufficientReservesError, InsufficientInputAmountError } from '../errors'
export const computePairAddress = ({
factoryAddress,
tokenA,
tokenB
}: {
factoryAddress: string
tokenA: Token
tokenB: Token
}): string => {
const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA] // does safety checks
return getCreate2Address(
factoryAddress,
keccak256(['bytes'], [pack(['address', 'address'], [token0.address, token1.address])]),
INIT_CODE_HASH
)
}
export class Pair { export class Pair {
public readonly liquidityToken: Token public readonly liquidityToken: Token
private readonly tokenAmounts: [TokenAmount, TokenAmount] private readonly tokenAmounts: [TokenAmount, TokenAmount]
public static getAddress(tokenA: Token, tokenB: Token): string { public static getAddress(tokenA: Token, tokenB: Token): string {
const tokens = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA] // does safety checks return computePairAddress({ factoryAddress: FACTORY_ADDRESS, tokenA, tokenB })
return getCreate2Address(
FACTORY_ADDRESS,
keccak256(['bytes'], [pack(['address', 'address'], [tokens[0].address, tokens[1].address])]),
INIT_CODE_HASH
)
} }
public constructor(tokenAmountA: TokenAmount, tokenAmountB: TokenAmount) { public constructor(tokenAmountA: TokenAmount, tokenAmountB: TokenAmount) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment