assembly/composables/useTenderly.ts
2021-09-06 01:37:07 +03:00

120 lines
2.9 KiB
TypeScript

import { useContext, ref, onMounted, computed } from "@nuxtjs/composition-api";
import axios from "axios";
import { activeNetwork, useNetwork } from "./useNetwork";
import { useWeb3 } from "@instadapp/vue-web3";
import Web3 from "web3";
import { useDSA } from "./useDSA";
const forkId = ref(null);
export function useTenderly() {
const { $config } = useContext();
const { activate, deactivate, connector, library } = useWeb3();
const { accounts, refreshAccounts } = useDSA();
const canSimulate = computed(
() => $config.TENDERLY_FORK_PATH && $config.TENDERLY_KEY
);
const loading = ref(false);
onMounted(() => {
if (!canSimulate.value) {
return;
}
setTimeout(() => {
setForkId(window.localStorage.getItem("forkId"), true);
}, 1000);
});
const startSimulation = async () => {
loading.value = true;
try {
const { data } = await axios({
method: "post",
url: `https://api.tenderly.co/api/v1/account/${$config.TENDERLY_FORK_PATH}/fork`,
headers: {
"X-Access-key": $config.TENDERLY_KEY,
"Content-Type": "application/json"
},
data: JSON.stringify({
network_id: activeNetwork.value.chainId.toString()
})
});
await setForkId(data?.simulation_fork?.id);
if (data?.simulation_fork?.id) {
await addBalance();
await refreshAccounts();
}
} catch (error) {
await stopSimulation();
}
loading.value = false;
};
const stopSimulation = async (silent = false) => {
loading.value = true;
try {
if (forkId.value) {
await axios({
method: "delete",
url: `https://api.tenderly.co/api/v1/account/${$config.TENDERLY_FORK_PATH}/fork/${forkId.value}`,
headers: {
"X-Access-key": $config.TENDERLY_KEY,
"Content-Type": "application/json"
}
});
}
} catch (error) {}
forkId.value = null;
window.localStorage.removeItem("forkId");
if (!silent && connector.value) {
deactivate();
activate(connector.value);
}
loading.value = false;
};
const setForkId = async (fork, silent = false) => {
if (!fork) {
stopSimulation(silent);
return;
}
forkId.value = fork;
library.value = new Web3(
new Web3.providers.HttpProvider(
`https://rpc.tenderly.co/fork/${forkId.value}`
)
);
window.localStorage.setItem("forkId", forkId.value);
};
const addBalance = async () => {
await axios({
method: "post",
url: `https://api.tenderly.co/api/v1/account/${$config.TENDERLY_FORK_PATH}/fork/${forkId.value}/balance`,
headers: {
"X-Access-key": $config.TENDERLY_KEY,
"Content-Type": "application/json"
},
data: JSON.stringify({
accounts: accounts.value.map(a => a.address)
})
});
};
return {
forkId,
canSimulate,
startSimulation,
stopSimulation,
loading
};
}