120 lines
2.9 KiB
TypeScript
120 lines
2.9 KiB
TypeScript
import { getNumberFormat } from '@vegaprotocol/utils';
|
|
import { addDays } from 'date-fns';
|
|
import sortBy from 'lodash/sortBy';
|
|
import omit from 'lodash/omit';
|
|
import { useReferralProgramQuery } from './__generated__/CurrentReferralProgram';
|
|
|
|
const STAKING_TIERS_MAPPING: Record<number, string> = {
|
|
1: 'Tradestarter',
|
|
2: 'Mid level degen',
|
|
3: 'Reward hoarder',
|
|
};
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
const MOCK = {
|
|
data: {
|
|
currentReferralProgram: {
|
|
id: 'abc',
|
|
version: 1,
|
|
endOfProgramTimestamp: addDays(new Date(), 10).toISOString(),
|
|
windowLength: 10,
|
|
benefitTiers: [
|
|
{
|
|
minimumEpochs: 5,
|
|
minimumRunningNotionalTakerVolume: '30000',
|
|
referralDiscountFactor: '0.01',
|
|
referralRewardFactor: '0.01',
|
|
},
|
|
{
|
|
minimumEpochs: 5,
|
|
minimumRunningNotionalTakerVolume: '20000',
|
|
referralDiscountFactor: '0.05',
|
|
referralRewardFactor: '0.05',
|
|
},
|
|
{
|
|
minimumEpochs: 5,
|
|
minimumRunningNotionalTakerVolume: '10000',
|
|
referralDiscountFactor: '0.001',
|
|
referralRewardFactor: '0.001',
|
|
},
|
|
],
|
|
stakingTiers: [
|
|
{
|
|
minimumStakedTokens: '10000',
|
|
referralRewardMultiplier: '1',
|
|
},
|
|
{
|
|
minimumStakedTokens: '20000',
|
|
referralRewardMultiplier: '2',
|
|
},
|
|
{
|
|
minimumStakedTokens: '30000',
|
|
referralRewardMultiplier: '3',
|
|
},
|
|
],
|
|
},
|
|
},
|
|
loading: false,
|
|
error: undefined,
|
|
};
|
|
|
|
export const useReferralProgram = () => {
|
|
const { data, loading, error } = useReferralProgramQuery({
|
|
fetchPolicy: 'cache-and-network',
|
|
});
|
|
|
|
if (!data || !data.currentReferralProgram) {
|
|
return {
|
|
benefitTiers: [],
|
|
stakingTiers: [],
|
|
details: undefined,
|
|
loading,
|
|
error,
|
|
};
|
|
}
|
|
|
|
const benefitTiers = sortBy(data.currentReferralProgram.benefitTiers, (t) =>
|
|
Number(t.referralRewardFactor)
|
|
)
|
|
.reverse()
|
|
.map((t, i) => {
|
|
return {
|
|
tier: i + 1,
|
|
rewardFactor: Number(t.referralRewardFactor),
|
|
commission: Number(t.referralRewardFactor) * 100 + '%',
|
|
discountFactor: Number(t.referralDiscountFactor),
|
|
discount: Number(t.referralDiscountFactor) * 100 + '%',
|
|
minimumVolume: Number(t.minimumRunningNotionalTakerVolume),
|
|
volume: getNumberFormat(0).format(
|
|
Number(t.minimumRunningNotionalTakerVolume)
|
|
),
|
|
epochs: Number(t.minimumEpochs),
|
|
};
|
|
});
|
|
|
|
const stakingTiers = sortBy(
|
|
data.currentReferralProgram.stakingTiers,
|
|
(t) => t.referralRewardMultiplier
|
|
).map((t, i) => {
|
|
return {
|
|
tier: i + 1,
|
|
label: STAKING_TIERS_MAPPING[i + 1],
|
|
...t,
|
|
};
|
|
});
|
|
|
|
const details = omit(
|
|
data.currentReferralProgram,
|
|
'benefitTiers',
|
|
'stakingTiers'
|
|
);
|
|
|
|
return {
|
|
benefitTiers,
|
|
stakingTiers,
|
|
details,
|
|
loading,
|
|
error,
|
|
};
|
|
};
|