Skip to content

Commit 104c7cf

Browse files
committed
Can redeem on front
1 parent b2cc3fb commit 104c7cf

File tree

4 files changed

+135
-8
lines changed

4 files changed

+135
-8
lines changed

packages/nextjs/components/kiddo-perks/ChildDashboard/PerksListGrid.tsx

+18-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
11
import { usePerksManager } from "~~/hooks/kiddo-perks";
2+
import { useDeployedContractInfo, useScaffoldWriteContract } from "~~/hooks/scaffold-eth";
3+
import { Perk } from "~~/types/kiddoPerks";
24

35
type PerksListGridProps = {
46
childTokens: number;
57
};
68

79
export const PerksListGrid = ({ childTokens }: PerksListGridProps) => {
8-
const { perks } = usePerksManager();
10+
const { writeContractAsync: writeTokenContractAsync } = useScaffoldWriteContract("KDOToken");
11+
const { data: kiddoPerksContractInfo } = useDeployedContractInfo("KiddoPerks");
12+
13+
const { perks, redeemPerk } = usePerksManager();
14+
15+
const handleRedeemPerk = async (perk: Perk) => {
16+
await writeTokenContractAsync({
17+
functionName: "approve",
18+
args: [kiddoPerksContractInfo?.address, BigInt(perk.tokensRequired)],
19+
});
20+
await redeemPerk(perk.id);
21+
};
922

1023
if (perks.length === 0) {
1124
return (
@@ -28,10 +41,12 @@ export const PerksListGrid = ({ childTokens }: PerksListGridProps) => {
2841
<h3 className="text-sm font-medium ">{perk.title}</h3>
2942
<p className="text-xs text-gray-600">Cost: {Number(perk.tokensRequired) / 10 ** 18} KDO</p>
3043
</div>
31-
{perk.redeemedBy ? (
44+
{perk.isRedeemed ? (
3245
<span className="text-xs bg-base px-2 py-1 rounded-full">Redeemed</span>
3346
) : childTokens >= Number(perk.tokensRequired) ? (
34-
<button className="btn btn-primary">Redeem</button>
47+
<button onClick={() => handleRedeemPerk(perk)} className="btn btn-primary">
48+
Redeem
49+
</button>
3550
) : (
3651
<span className="text-xs bg-accent text-accent-content px-2 py-1 rounded-full">Not Enough Points</span>
3752
)}

packages/nextjs/contracts/deployedContracts.ts

+95-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract";
77
const deployedContracts = {
88
31337: {
99
KDOToken: {
10-
address: "0x700b6a60ce7eaaea56f065753d8dcb9653dbad35",
10+
address: "0xf7cd8fa9b94db2aa972023b379c7f72c65e4de9d",
1111
abi: [
1212
{
1313
type: "constructor",
@@ -450,7 +450,7 @@ const deployedContracts = {
450450
},
451451
},
452452
KiddoPerks: {
453-
address: "0xa15bb66138824a1c7167f5e85b957d04dd34e468",
453+
address: "0x12975173b87f7595ee45dffb2ab812ece596bf84",
454454
abi: [
455455
{
456456
type: "constructor",
@@ -772,6 +772,19 @@ const deployedContracts = {
772772
],
773773
stateMutability: "view",
774774
},
775+
{
776+
type: "function",
777+
name: "redeemPerk",
778+
inputs: [
779+
{
780+
name: "perkId",
781+
type: "uint256",
782+
internalType: "uint256",
783+
},
784+
],
785+
outputs: [],
786+
stateMutability: "nonpayable",
787+
},
775788
{
776789
type: "function",
777790
name: "removeChild",
@@ -936,6 +949,30 @@ const deployedContracts = {
936949
],
937950
stateMutability: "view",
938951
},
952+
{
953+
type: "function",
954+
name: "s_perksRedeemedBy",
955+
inputs: [
956+
{
957+
name: "perkId",
958+
type: "uint256",
959+
internalType: "uint256",
960+
},
961+
{
962+
name: "by",
963+
type: "address",
964+
internalType: "address",
965+
},
966+
],
967+
outputs: [
968+
{
969+
name: "isRedeemed",
970+
type: "bool",
971+
internalType: "bool",
972+
},
973+
],
974+
stateMutability: "view",
975+
},
939976
{
940977
type: "function",
941978
name: "s_taskNextId",
@@ -1133,6 +1170,25 @@ const deployedContracts = {
11331170
],
11341171
anonymous: false,
11351172
},
1173+
{
1174+
type: "event",
1175+
name: "PerkRedeemed",
1176+
inputs: [
1177+
{
1178+
name: "perkId",
1179+
type: "uint256",
1180+
indexed: false,
1181+
internalType: "uint256",
1182+
},
1183+
{
1184+
name: "by",
1185+
type: "address",
1186+
indexed: false,
1187+
internalType: "address",
1188+
},
1189+
],
1190+
anonymous: false,
1191+
},
11361192
{
11371193
type: "event",
11381194
name: "PerkRemoved",
@@ -1238,6 +1294,27 @@ const deployedContracts = {
12381294
},
12391295
],
12401296
},
1297+
{
1298+
type: "error",
1299+
name: "KiddoPerks__NotEnoughTokenBalance",
1300+
inputs: [
1301+
{
1302+
name: "id",
1303+
type: "uint256",
1304+
internalType: "uint256",
1305+
},
1306+
{
1307+
name: "by",
1308+
type: "address",
1309+
internalType: "address",
1310+
},
1311+
{
1312+
name: "tokensRequired",
1313+
type: "uint256",
1314+
internalType: "uint256",
1315+
},
1316+
],
1317+
},
12411318
{
12421319
type: "error",
12431320
name: "KiddoPerks__NotValidId",
@@ -1249,6 +1326,22 @@ const deployedContracts = {
12491326
},
12501327
],
12511328
},
1329+
{
1330+
type: "error",
1331+
name: "KiddoPerks__PerkAlreadyRedemmed",
1332+
inputs: [
1333+
{
1334+
name: "id",
1335+
type: "uint256",
1336+
internalType: "uint256",
1337+
},
1338+
{
1339+
name: "by",
1340+
type: "address",
1341+
internalType: "address",
1342+
},
1343+
],
1344+
},
12521345
{
12531346
type: "error",
12541347
name: "KiddoPerks__PerkAlreadyRemoved",

packages/nextjs/hooks/kiddo-perks/usePerksManager.ts

+21-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const usePerksManager = () => {
2222
title: perk.title,
2323
removed: perk.removed,
2424
tokensRequired: perk.tokensRequired,
25+
isRedeemed: false,
2526
} as Perk),
2627
);
2728

@@ -34,7 +35,7 @@ export const usePerksManager = () => {
3435
functionName: "createPerk",
3536
args: [title, BigInt(tokensRequired)],
3637
});
37-
setPerks([...perks, { id: perks.length + 1, title, removed: false, tokensRequired }]);
38+
setPerks([...perks, { id: perks.length + 1, title, removed: false, tokensRequired, isRedeemed: false }]);
3839
};
3940

4041
const removePerk = async (perkId: number) => {
@@ -45,5 +46,23 @@ export const usePerksManager = () => {
4546
setPerks(perks.filter(perk => perk.id !== perkId));
4647
};
4748

48-
return { perks, addPerk, removePerk };
49+
const redeemPerk = async (perkId: number) => {
50+
await writeKiddoPerksContract({
51+
functionName: "redeemPerk",
52+
args: [BigInt(perkId)],
53+
});
54+
55+
const updatedPerks = perks.map(perk => {
56+
if (perk.id == perkId) {
57+
return {
58+
...perk,
59+
isRedeemed: true,
60+
};
61+
}
62+
return perk;
63+
});
64+
setPerks(updatedPerks);
65+
};
66+
67+
return { perks, addPerk, removePerk, redeemPerk };
4968
};

packages/nextjs/types/kiddoPerks.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export type Perk = {
1111
title: string;
1212
tokensRequired: bigint;
1313
removed: boolean;
14-
redeemedBy?: string[];
14+
isRedeemed: boolean;
1515
};
1616

1717
export type Task = {

0 commit comments

Comments
 (0)