mirror of
				https://github.com/Instadapp/assembly.git
				synced 2024-07-29 22:37:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			197 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div>
 | |
|     <div>
 | |
|       <nuxt-link
 | |
|         to="/"
 | |
|         class="text-[#C0C5D7] text-lg font-semibold flex items-center"
 | |
|       >
 | |
|         <BackIcon class="w-4 h-4 mr-3" />
 | |
|         Apps
 | |
|       </nuxt-link>
 | |
|     </div>
 | |
| 
 | |
|     <div class="mt-10 flex items-center">
 | |
|       <div class="flex items-center">
 | |
|         <div
 | |
|           style="background: radial-gradient(42.15% 42.15% at 48.94% 48.94%, #D6DAE0 75.67%, #F0F3F9 100%), #C4C4C4;"
 | |
|           class="w-16 h-16 rounded-full flex items-center justify-center border border-[#CCDCF3]"
 | |
|         >
 | |
|           <div
 | |
|             class="w-12 h-12 rounded-full flex items-center justify-center bg-[#1874FF]"
 | |
|           >
 | |
|             <OneInchIcon Icon class="w-8 h-8 text-white" />
 | |
|           </div>
 | |
|         </div>
 | |
|         <h1 class="ml-4 text-primary-black text-2xl font-semibold">1Inch</h1>
 | |
|       </div>
 | |
|     </div>
 | |
| 
 | |
|     <div class="mx-auto w-[512px] shadow rounded-[10px] px-8 py-12">
 | |
|       <swap-card
 | |
|         :on-swap="swap"
 | |
|         @token0="sellToken = $event"
 | |
|         @token1="buyToken = $event"
 | |
|         @slippage="slippage = $event"
 | |
|         :token1Amount="buyToken ? buyToken.amount : '0'"
 | |
|       />
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script lang="ts">
 | |
| import {
 | |
|   defineComponent,
 | |
|   onBeforeUnmount,
 | |
|   onMounted,
 | |
|   ref,
 | |
|   watch
 | |
| } from "@nuxtjs/composition-api";
 | |
| import BackIcon from "~/assets/icons/back.svg?inline";
 | |
| import OneInchIcon from "~/assets/icons/1inch.svg?inline";
 | |
| import SwapCard from "~/components/swap/SwapCard.vue";
 | |
| import wait from "waait";
 | |
| import axios from "axios";
 | |
| import { useToken } from "~/composables/useToken";
 | |
| import { useBigNumber } from "~/composables/useBigNumber";
 | |
| import { useNetwork } from "~/composables/useNetwork";
 | |
| import { useDSA } from "~/composables/useDSA";
 | |
| import { use1InchSwap } from "~/composables/swap/use1InchSwap";
 | |
| import { useWeb3 } from "~/composables/useWeb3";
 | |
| import { useNotification } from "~/composables/useNotification";
 | |
| import { useBalances } from "~/composables/useBalances";
 | |
| 
 | |
| export default defineComponent({
 | |
|   components: {
 | |
|     BackIcon,
 | |
|     OneInchIcon,
 | |
|     SwapCard
 | |
|   },
 | |
|   setup() {
 | |
|     const { toBN, pow, div } = useBigNumber();
 | |
|     const { activeNetwork } = useNetwork();
 | |
|     const { dsa } = useDSA();
 | |
|     const { getSellSpell } = use1InchSwap();
 | |
|     const { account } = useWeb3();
 | |
|     const { fetchBalances } = useBalances();
 | |
|     const { showPendingTransaction, showConfirmedTransaction, showWarning } = useNotification();
 | |
|     const { valInt } = useToken();
 | |
|     const sellToken = ref();
 | |
|     const buyToken = ref();
 | |
|     const slippage = ref("3.0");
 | |
| 
 | |
|     function caculateUnitAmt() {
 | |
|       let unitAmt: any = toBN(buyToken.value.amount).dividedBy(
 | |
|         toBN(sellToken.value.amount)
 | |
|       );
 | |
|       unitAmt = unitAmt.multipliedBy((100 - 0.3) / 100);
 | |
|       unitAmt = unitAmt.multipliedBy(1e18).toFixed(0);
 | |
| 
 | |
|       return unitAmt;
 | |
|     }
 | |
| 
 | |
|     const swap = async () => {
 | |
|       const result = await fetchSwapData();
 | |
| 
 | |
|       const spells = dsa.value.Spell();
 | |
| 
 | |
|       spells.add(
 | |
|         getSellSpell({
 | |
|           buyAddr: buyToken.value.address,
 | |
|           sellAddr: sellToken.value.address,
 | |
|           sellAmt: valInt(sellToken.value.amount, sellToken.value.decimals),
 | |
|           unitAmt: caculateUnitAmt(),
 | |
|           calldata: result.tx.data,
 | |
|           setId: 0
 | |
|         })
 | |
|       );
 | |
| 
 | |
|       try {
 | |
|         const txHash = await dsa.value.cast({
 | |
|           spells,
 | |
|           from: account.value,
 | |
|           onReceipt: async receipt => {
 | |
|             showConfirmedTransaction(receipt.transactionHash);
 | |
| 
 | |
|             await fetchBalances(true);
 | |
|           }
 | |
|         });
 | |
| 
 | |
|         showPendingTransaction(txHash);
 | |
|       } catch (error) {
 | |
|         showWarning(error.message);
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     const fetchSwapQuote = async () => {
 | |
|       if (!sellToken.value || !buyToken.value) return;
 | |
| 
 | |
|       if (!sellToken.value.amount || sellToken.value.amount === "0") {
 | |
|         buyToken.value.amount = "0";
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       const { data } = await axios.get(
 | |
|         `https://api.1inch.exchange/v3.0/${activeNetwork.value.chainId}/quote`,
 | |
|         {
 | |
|           params: {
 | |
|             fromTokenAddress: sellToken.value.address,
 | |
|             toTokenAddress: buyToken.value.address,
 | |
|             amount: valInt(sellToken.value.amount, sellToken.value.decimals)
 | |
|           }
 | |
|         }
 | |
|       );
 | |
| 
 | |
|       const num = toBN(data.toTokenAmount);
 | |
|       const multiplier = pow(10, buyToken.value.decimals);
 | |
| 
 | |
|       buyToken.value.amount = div(num, multiplier).toFixed(7);
 | |
|     };
 | |
| 
 | |
|     const fetchSwapData = async () => {
 | |
|       if (!sellToken.value || !buyToken.value) return;
 | |
| 
 | |
|       if (!sellToken.value.amount || sellToken.value.amount === "0") {
 | |
|         buyToken.value.amount = "0";
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       const { data } = await axios.get(
 | |
|         `https://api.1inch.exchange/v3.0/${activeNetwork.value.chainId}/swap`,
 | |
|         {
 | |
|           params: {
 | |
|             fromTokenAddress: sellToken.value.address.toLowerCase(),
 | |
|             toTokenAddress: buyToken.value.address.toLowerCase(),
 | |
|             amount: valInt(sellToken.value.amount, sellToken.value.decimals),
 | |
|             fromAddress: dsa.value.instance.address.toLowerCase(),
 | |
|             slippage: slippage.value,
 | |
|             disableEstimate: true
 | |
|           }
 | |
|         }
 | |
|       );
 | |
| 
 | |
|       return data;
 | |
|     };
 | |
| 
 | |
|     watch([sellToken, buyToken, slippage], fetchSwapQuote);
 | |
|     let interval;
 | |
| 
 | |
|     onMounted(() => {
 | |
|       interval = setInterval(fetchSwapQuote, 10000);
 | |
|     });
 | |
| 
 | |
|     onBeforeUnmount(() => {
 | |
|       if (interval) {
 | |
|         clearInterval(interval);
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     return {
 | |
|       swap,
 | |
|       slippage,
 | |
|       sellToken,
 | |
|       buyToken
 | |
|     };
 | |
|   }
 | |
| });
 | |
| </script>
 | 
