assembly/composables/useTenderly.ts

114 lines
2.8 KiB
TypeScript
Raw Permalink Normal View History

2021-08-18 20:20:45 +00:00
import { useContext, ref, onMounted, computed } from "@nuxtjs/composition-api";
import axios from "axios";
import { activeNetwork, useNetwork } from "./useNetwork";
import { useWeb3 } from "./useWeb3";
import Web3 from "web3";
import { useDSA } from "./useDSA";
const forkId = ref(null);
export function useTenderly() {
const { $config } = useContext();
const { setWeb3, refreshWeb3 } = useWeb3();
2021-08-21 11:33:31 +00:00
const { accounts, refreshAccounts } = useDSA();
2021-08-18 20:20:45 +00:00
const canSimulate = computed(
() => $config.TENDERLY_FORK_PATH && $config.TENDERLY_KEY
);
2021-08-19 16:28:25 +00:00
const loading = ref(false);
2021-08-18 20:20:45 +00:00
onMounted(() => {
if (!canSimulate.value) {
return;
}
setTimeout(() => {
setForkId(window.localStorage.getItem("forkId"));
}, 1000);
});
const startSimulation = async () => {
2021-08-19 16:28:25 +00:00
loading.value = true;
2021-08-18 20:20:45 +00:00
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()
})
});
2021-08-21 11:33:31 +00:00
await setForkId(data?.simulation_fork?.id);
2021-08-18 20:20:45 +00:00
if (data?.simulation_fork?.id) {
2021-08-21 11:33:31 +00:00
await addBalance();
await refreshAccounts();
2021-08-18 20:20:45 +00:00
}
} catch (error) {
2021-08-21 11:33:31 +00:00
await stopSimulation();
2021-08-18 20:20:45 +00:00
}
2021-08-19 16:28:25 +00:00
loading.value = false;
2021-08-18 20:20:45 +00:00
};
const stopSimulation = async () => {
2021-08-19 16:28:25 +00:00
loading.value = true;
2021-08-18 20:20:45 +00:00
try {
2021-08-26 22:27:26 +00:00
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"
}
});
}
2021-08-18 20:20:45 +00:00
} catch (error) {}
forkId.value = null;
window.localStorage.removeItem("forkId");
2021-08-21 11:33:31 +00:00
await refreshWeb3();
2021-08-19 16:28:25 +00:00
loading.value = false;
2021-08-18 20:20:45 +00:00
};
const setForkId = fork => {
if (!fork) {
stopSimulation();
return;
}
forkId.value = fork;
setWeb3(
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,
2021-08-19 16:28:25 +00:00
stopSimulation,
2021-08-26 22:27:26 +00:00
loading
2021-08-18 20:20:45 +00:00
};
}