harb/web-app/src/composables/useAdjustTaxRates.ts
johba 6cbb1781ce tax rate, version and compose (#70)
resolves #67

Co-authored-by: johba <johba@harb.eth>
Reviewed-on: https://codeberg.org/johba/harb/pulls/70
2025-10-07 19:26:08 +02:00

84 lines
2.4 KiB
TypeScript

import { ref, reactive, computed, type ComputedRef } from 'vue';
import * as StakeContract from '@/contracts/stake';
import { waitForTransactionReceipt, type Config } from '@wagmi/core';
import { config } from '@/wagmi';
// import { compactNumber, formatBigIntDivision } from "@/utils/helper";
import { useContractToast } from './useContractToast';
import { TAX_RATE_OPTIONS } from 'kraiken-lib/taxRates';
const contractToast = useContractToast();
enum State {
SignTransaction = 'SignTransaction',
Waiting = 'Waiting',
Action = 'Action',
}
export const taxRates = TAX_RATE_OPTIONS.map(({ index, year, daily, decimal }) => ({
index,
year,
daily,
decimal,
}));
const taxRateIndexByDecimal = new Map<number, number>();
for (const option of taxRates) {
taxRateIndexByDecimal.set(option.decimal, option.index);
}
export function getTaxRateOptionByIndex(index: number) {
return taxRates[index];
}
export function getTaxRateIndexByDecimal(decimal: number) {
return taxRateIndexByDecimal.get(decimal);
}
export function useAdjustTaxRate() {
const loading = ref();
const waiting = ref();
const state: ComputedRef<State> = computed(() => {
if (loading.value) {
return State.SignTransaction;
} else if (waiting.value) {
return State.Waiting;
} else {
return State.Action;
}
});
async function changeTax(positionId: bigint, taxRateIndex: number) {
try {
// console.log("changeTax", { positionId, taxRate });
loading.value = true;
const option = getTaxRateOptionByIndex(taxRateIndex);
if (!option) {
throw new Error(`Invalid tax rate index: ${taxRateIndex}`);
}
const hash = await StakeContract.changeTax(positionId, option.index);
// console.log("hash", hash);
loading.value = false;
waiting.value = true;
await waitForTransactionReceipt(config as Config, {
hash: hash,
});
contractToast.showSuccessToast(option.year.toString(), 'Success!', 'You adjusted your position tax to', '', '%');
waiting.value = false;
} catch (error: unknown) {
// console.error("error", error);
// console.log(JSON.stringify(error, (_, v) => (typeof v === "bigint" ? v.toString() : v)));
contractToast.showFailToast((error as { shortMessage?: string })?.shortMessage ?? 'Transaction failed');
} finally {
loading.value = false;
waiting.value = false;
}
}
return reactive({ state, taxRates, changeTax });
}