const API_KEY = ''
const API_URL = 'https://trade-api.gateway.uniswap.org/v1'
const headers = {
  'x-api-key': API_KEY,
}
const signer = provider.getSigner()


// APPROVAL
const approvalResponse = await axios.post(
  `${API_URL}/check_approval`,
  {
    walletAddress: await signer.getAddress(),
    amount: BigNumber.from(amount).mul(2).toString(),
    token: tokenIn,
    chainId: 1,
    tokenOut: tokenOut,
    tokenOutChainId: 1,
  },
  {
    headers,
  }
)

if (approvalResponse.data.approval) {
  await signer.sendTransaction(approvalResponse.data.approval)
}

// QUOTE
const quoteResponse = await axios.post(
  `${API_URL}/quote`,
  {
    swapper: await signer.getAddress(),
    tokenInChainId: 1,
    tokenOutChainId: 1,
    tokenIn: tokenIn,
    tokenOut: tokenOut,
    amount: amount,
    routingPreference: routingPreference,
    type: 'EXACT_INPUT',
  },
  {
    headers,
  }
)

const { quote, permitData, routing } = quoteResponse.data

let signature
if (permitData) {
  signature = await signer._signTypedData(permitData.domain, permitData.types, permitData.values)
}

//ORDER
let postTransactionResponse
if (routing === 'CLASSIC' || routing === 'WRAP' || routing === 'UNWRAP' || routing === 'BRIDGE') {
  postTransactionResponse = await axios.post(
    `${API_URL}/swap`,
    {
      signature: signature,
      quote: quote,
      permitData: permitData,
    },
    {
      headers,
    }
  )
  await signer.sendTransaction(postTransactionResponse.data.swap)
} else if (routing === 'DUTCH_LIMIT' || routing === 'DUTCH_V2' || routing === 'DUTCH_V3' || routing === 'PRIORITY') {
  postTransactionResponse = await axios.post(
    `${API_URL}/order`,
    {
      signature: signature,
      quote: quote,
    },
    {
      headers,
    }
  )
}