44434a7d39
Co-authored-by: Matthew Russell <mattrussell36@gmail.com>
134 lines
3.1 KiB
TypeScript
134 lines
3.1 KiB
TypeScript
import { gql, useQuery } from '@apollo/client';
|
|
import { getNumberFormat } from '@vegaprotocol/utils';
|
|
import { addDays } from 'date-fns';
|
|
import sortBy from 'lodash/sortBy';
|
|
import omit from 'lodash/omit';
|
|
|
|
// TODO: Generate query
|
|
// eslint-disable-next-line
|
|
const REFERRAL_PROGRAM_QUERY = gql`
|
|
query ReferralProgram {
|
|
currentReferralProgram {
|
|
id
|
|
version
|
|
endOfProgramTimestamp
|
|
windowLength
|
|
endedAt
|
|
benefitTiers {
|
|
minimumEpochs
|
|
minimumRunningNotionalTakerVolume
|
|
referralDiscountFactor
|
|
referralRewardFactor
|
|
}
|
|
stakingTiers {
|
|
minimumStakedTokens
|
|
referralRewardMultiplier
|
|
}
|
|
}
|
|
}
|
|
`;
|
|
|
|
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 } = useQuery(REFERRAL_PROGRAM_QUERY, {
|
|
fetchPolicy: 'cache-and-network',
|
|
});
|
|
|
|
if (!data) {
|
|
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,
|
|
commission: Number(t.referralRewardFactor) * 100 + '%',
|
|
discount: Number(t.referralDiscountFactor) * 100 + '%',
|
|
volume: getNumberFormat(0).format(
|
|
Number(t.minimumRunningNotionalTakerVolume)
|
|
),
|
|
};
|
|
});
|
|
|
|
const stakingTiers = sortBy(
|
|
data.currentReferralProgram.stakingTiers,
|
|
(t) => t.referralRewardMultiplier
|
|
).map((t, i) => {
|
|
return {
|
|
tier: i + 1,
|
|
label: STAKING_TIERS_MAPPING[i + 1],
|
|
...t,
|
|
};
|
|
});
|
|
|
|
return {
|
|
benefitTiers,
|
|
stakingTiers,
|
|
details: omit(data.currentReferralProgram, 'benefitTiers', 'stakingTiers'),
|
|
loading,
|
|
error,
|
|
};
|
|
};
|