Create & update entities
Ponder's entity store API is inspired by the Prisma Client API (opens in a new tab). The entity store API currently supports five methods:
create
create inserts an entity into the store.
Options
| name | type | |
|---|---|---|
| id | string | number | bigint | ID of the new entity |
| data | Omit<TEntity, 'id'> | Data for all required fields of the new entity |
Returns
Promise<TEntity>
Example
schema.graphql
type Token @entity {
id: Int!
mintedBy: String!
mintedAt: Int!
}src/index.ts
ponder.on("Blitmap:Mint", async ({ event, context }) => {
const { Token } = context.entities;
const token = await Token.create({
id: event.params.tokenId,
data: {
mintedBy: event.params.to,
mintedAt: event.block.timestamp
}
});
// { id: 7777, mintedBy: "0x7Df1...", mintedAt: 1679507353 }
});update
update updates an existing entity in the store.
Options
| name | type | |
|---|---|---|
| id | string | number | bigint | ID of the updated entity |
| data | Omit<Partial<TEntity>, 'id'> | Data for all updated fields of the entity |
Returns
Promise<TEntity>
Example
schema.graphql
type Token @entity {
id: Int!
ownedBy: String!
metadataUpdatedAt: Int!
}src/index.ts
ponder.on("Blitmap:MetadataUpdate", async ({ event, context }) => {
const { Token } = context.entities;
const token = await Token.update({
id: event.params.tokenId,
data: {
metadataUpdatedAt: event.block.timestamp
}
});
// { id: 7777, mintedBy: "0x1bA3...", updatedAt: 1679507354 }
});upsert
upsert updates an entity if one already exists with the specified id, or creates a new entity.
Options
| name | type | |
|---|---|---|
| id | string | number | bigint | ID of the entity to create or update |
| create | Omit<TEntity, 'id'> | Data for all required fields of a new entity |
| update | Omit<Partial<TEntity>, 'id'> | Data for all updated fields of an existing entity |
Returns
Promise<TEntity>
Example
upsert can be useful for events like the ERC721 Transfer event, which is emitted when a token is minted and whenever a token is transferred.
schema.graphql
type Token @entity {
id: Int!
mintedBy: String!
ownedBy: String!
}src/index.ts
ponder.on("Blitmap:Transfer", async ({ event, context }) => {
const { Token } = context.entities;
const token = await Token.upsert({
id: event.params.tokenId,
create: {
mintedBy: event.params.to,
ownedBy: event.params.to
},
update: {
ownedBy: event.params.to
}
});
// { id: 7777, mintedBy: "0x1bA3...", ownedBy: "0x7F4d..." }
});findUnique
findUnique finds and returns an entity by id.
Options
| name | type | |
|---|---|---|
| id | string | number | bigint | ID of the entity to find and return |
Returns
Promise<TEntity | null>
Example
schema.graphql
type Player @entity {
id: String!
age: Int!
}src/index.ts
await Player.create({ id: "Jim", age: 34 });
const jim = await Player.findUnique({ id: "Jim" });
// { id: "Jim", age: 34 }
const sara = await Player.findUnique({ id: "Sara" });
// nulldelete
findUnique deletes an entity by id.
Options
| name | type | |
|---|---|---|
| id | string | number | bigint | ID of the entity to delete |
Returns
Promise<boolean> (true if an entity was deleted, false if it was not found)
Example
schema.graphql
type Player @entity {
id: String!
age: Int!
}src/index.ts
await Player.create({ id: "Jim", age: 34 });
const isDeleted = await Player.delete({ id: "Jim" });
// true
const jim = await Player.findUnique({ id: "Jim" });
// null