Skip to content

Commit

Permalink
new col for lamports
Browse files Browse the repository at this point in the history
  • Loading branch information
yurushao committed Aug 28, 2024
1 parent 3546eb2 commit 775bbb9
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 10 deletions.
46 changes: 46 additions & 0 deletions anchor/src/client/marinade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,52 @@ export class MarinadeClient {
return accounts.map((a) => a.pubkey);
}

async getTickets(fundPDA: PublicKey): Promise<
{
address: PublicKey;
lamports: number;
createdEpoch: number;
isDue: boolean;
}[]
> {
// TicketAccount {
// stateAddress: web3.PublicKey; // offset 8
// beneficiary: web3.PublicKey; // offset 40
// lamportsAmount: BN; // offset 72
// createdEpoch: BN;
// }
const accounts =
await this.base.provider.connection.getParsedProgramAccounts(
MARINADE_PROGRAM_ID,
{
filters: [
{
dataSize: 88,
},
{
memcmp: {
offset: 40,
bytes: this.base.getTreasuryPDA(fundPDA).toBase58(),
},
},
],
}
);
const currentEpoch = await this.base.provider.connection.getEpochInfo();
return accounts.map((a) => {
const lamports = Number((a.account.data as Buffer).readBigInt64LE(72));
const createdEpoch = Number(
(a.account.data as Buffer).readBigInt64LE(80)
);
return {
address: a.pubkey,
lamports,
createdEpoch,
isDue: currentEpoch.epoch > createdEpoch,
};
});
}

getMarinadeState(): any {
// The addresses are the same in mainnet and devnet:
// https://docs.marinade.finance/developers/contract-addresses
Expand Down
2 changes: 1 addition & 1 deletion api/src/routers/fund.ts
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ router.get("/funds/:pubkey/perf", async (req, res) => {

router.get("/funds/:pubkey/tickets", async (req, res) => {
const fund = validatePubkey(req.params.pubkey);
const tickets = await req.client.marinade.getExistingTickets(fund);
const tickets = await req.client.marinade.getTickets(fund);
res.set("content-type", "application/json");
res.send({ tickets });
});
Expand Down
16 changes: 15 additions & 1 deletion playground/src/app/stake/components/columns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,20 @@ export const columns: ColumnDef<TicketOrStake>[] = [
enableSorting: false,
enableHiding: false,
},
{
accessorKey: "lamports",
header: ({ column }) => (
<DataTableColumnHeader column={column} title="Lamports" />
),
cell: ({ row }) => {
const formatted = new Intl.NumberFormat("en-US").format(
row.getValue("lamports")
);
return <p>{formatted}</p>;
},
enableSorting: false,
enableHiding: false,
},
{
accessorKey: "label",
header: ({ column }) => (
Expand Down Expand Up @@ -83,7 +97,7 @@ export const columns: ColumnDef<TicketOrStake>[] = [
}

return (
<div className="flex w-[100px] items-center">
<div className="flex w-[120px] items-center">
{status.icon && (
<status.icon className="mr-2 h-4 w-4 text-muted-foreground" />
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ interface DataTableRowActionsProps<TData> {
export function DataTableRowActions<TData>({
row,
}: DataTableRowActionsProps<TData>) {
const ticket = ticketOrStakeSchema.parse(row.original);
const isClaimable = ticket.status === "claimable";
const ticketOrStake = ticketOrStakeSchema.parse(row.original);
const isClaimable =
ticketOrStake.status === "claimable" || ticketOrStake.status === "inactive";

const { glamClient, fund: fundPDA } = useGlam();

Expand All @@ -29,7 +30,7 @@ export function DataTableRowActions<TData>({
}

try {
const ticketPublicKey = new PublicKey(ticket.publicKey);
const ticketPublicKey = new PublicKey(ticketOrStake.publicKey);
console.log("Deactivating stake account:", ticketPublicKey.toBase58());

const txId = await glamClient.staking.deactivateStakeAccounts(fundPDA, [
Expand Down
6 changes: 4 additions & 2 deletions playground/src/app/stake/components/data-table-toolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ export function DataTableToolbar<TData>({
<div className="flex items-center justify-between">
<div className="flex flex-1 items-center space-x-2">
<Input
placeholder="Filter tickets..."
value={(table.getColumn("publicKey")?.getFilterValue() as string) ?? ""}
placeholder="Filter tickets and stakes ..."
value={
(table.getColumn("publicKey")?.getFilterValue() as string) ?? ""
}
onChange={(event) =>
table.getColumn("publicKey")?.setFilterValue(event.target.value)
}
Expand Down
1 change: 1 addition & 0 deletions playground/src/app/stake/data/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export const stakeServiceSchema = z.object({

export const ticketOrStakeSchema = z.object({
publicKey: z.string(),
lamports: z.number().nonnegative(),
service: z.string(),
status: z.string(),
label: z.string(),
Expand Down
8 changes: 5 additions & 3 deletions playground/src/app/stake/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,16 +66,18 @@ export default function Stake() {
);
const transformedStakes = stakes.map((stakeAccount) => ({
publicKey: stakeAccount.address.toBase58(),
lamports: stakeAccount.lamports,
service: "native",
status: stakeAccount.state,
label: "stake",
}));

const tickets = await glamClient.marinade.getExistingTickets(fundPDA);
const tickets = await glamClient.marinade.getTickets(fundPDA);
const transformedTickets = tickets.map((ticket) => ({
publicKey: ticket.toBase58(),
publicKey: ticket.address.toBase58(),
lamports: ticket.lamports,
service: "marinade",
status: "pending",
status: ticket.isDue ? "claimable" : "pending",
label: "ticket",
}));

Expand Down

0 comments on commit 775bbb9

Please sign in to comment.