From 5f7d6010aa02c46ec8523f16702043f651b94629 Mon Sep 17 00:00:00 2001
From: Hugo Trentesaux <hugo@trentesaux.fr>
Date: Sat, 25 Nov 2023 22:27:50 +0100
Subject: [PATCH] add cert events (renewal, removal)
---
README.md | 18 +-
...84897000-Data.js => 1700947757782-Data.js} | 18 +-
schema.graphql | 24 ++-
src/genesis.ts | 6 +-
src/main.ts | 181 ++++++++++++++----
src/model/generated/cert.model.ts | 22 ++-
src/model/generated/certRemoval.model.ts | 22 +++
src/model/generated/certRenewal.model.ts | 22 +++
src/model/generated/identity.model.ts | 3 +
src/model/generated/index.ts | 2 +
src/types/account/calls.ts | 12 ++
src/types/account/constants.ts | 15 ++
src/types/account/events.ts | 58 ++++++
src/types/account/storage.ts | 38 ++++
src/types/calls.ts | 1 +
src/types/constants.ts | 1 +
src/types/events.ts | 1 +
src/types/storage.ts | 1 +
typegen.json | 6 +
19 files changed, 405 insertions(+), 46 deletions(-)
rename db/migrations/{1700684897000-Data.js => 1700947757782-Data.js} (90%)
create mode 100644 src/model/generated/certRemoval.model.ts
create mode 100644 src/model/generated/certRenewal.model.ts
create mode 100644 src/types/account/calls.ts
create mode 100644 src/types/account/constants.ts
create mode 100644 src/types/account/events.ts
create mode 100644 src/types/account/storage.ts
diff --git a/README.md b/README.md
index 267fb59..cee255c 100644
--- a/README.md
+++ b/README.md
@@ -109,12 +109,20 @@ See https://duniter.org/wiki/duniter-v2/indexers/duniter-squid/
- [x] Refac way to process data from events (new, fetch needed...)
- [ ] Add events:
- - [ ] identity.IdtyCreated
- - [ ] identity.IdtyConfirmed
- - [ ] identity.IdtyValidated
+ - [x] identity.IdtyCreated
+ - [x] identity.IdtyConfirmed
+ - [ ] identity.IdtyValidated ?
- [x] identity.IdtyChangedOwnerKey
- [ ] identity.IdtyRemoved
- - [ ] cert.NewCert
- - [ ] cert.RenewedCert
+ - [ ] membership.MembershipAcquired
+ - [ ] membership.MembershipExpired
+ - [ ] membership.MembershipRenewed
+ - [ ] membership.MembershipRequested
+ - [ ] membership.MembershipRevoked
+ - [ ] membership.PendingMembershipExpired
+ - [ ] account.identity_linked
+ - [x] cert.NewCert
+ - [x] cert.RenewedCert
+ - [x] cert.RemovedCert
- [ ] smithCert.NewCert
- [ ] smithCert.RenewedCert
\ No newline at end of file
diff --git a/db/migrations/1700684897000-Data.js b/db/migrations/1700947757782-Data.js
similarity index 90%
rename from db/migrations/1700684897000-Data.js
rename to db/migrations/1700947757782-Data.js
index 58666b9..584b345 100644
--- a/db/migrations/1700684897000-Data.js
+++ b/db/migrations/1700947757782-Data.js
@@ -1,5 +1,5 @@
-module.exports = class Data1700684897000 {
- name = 'Data1700684897000'
+module.exports = class Data1700947757782 {
+ name = 'Data1700947757782'
async up(db) {
await db.query(`CREATE TABLE "event" ("id" character varying NOT NULL, "index" integer NOT NULL, "phase" text NOT NULL, "pallet" text NOT NULL, "name" text NOT NULL, "args" jsonb, "args_str" text array, "block_id" character varying, "extrinsic_id" character varying, "call_id" character varying, CONSTRAINT "PK_30c2f3bbaf6d34a55f8ae6e4614" PRIMARY KEY ("id"))`)
@@ -39,7 +39,11 @@ module.exports = class Data1700684897000 {
await db.query(`CREATE INDEX "IDX_0751309c66e97eac9ef1149362" ON "transfer" ("to_id") `)
await db.query(`CREATE INDEX "IDX_f4007436c1b546ede08a4fd7ab" ON "transfer" ("amount") `)
await db.query(`CREATE TABLE "account" ("id" character varying NOT NULL, CONSTRAINT "PK_54115ee388cdb6d86bb4bf5b2ea" PRIMARY KEY ("id"))`)
- await db.query(`CREATE TABLE "cert" ("id" character varying NOT NULL, "issuer_id" character varying, "receiver_id" character varying, CONSTRAINT "PK_6a0ce80cc860598b4f16c00998c" PRIMARY KEY ("id"))`)
+ await db.query(`CREATE TABLE "cert_renewal" ("id" character varying NOT NULL, "block_number" integer NOT NULL, "cert_id" character varying, CONSTRAINT "PK_2b8c3fc001515715892efe4fe3b" PRIMARY KEY ("id"))`)
+ await db.query(`CREATE INDEX "IDX_f1596a2147377881d3bd73dc18" ON "cert_renewal" ("cert_id") `)
+ await db.query(`CREATE TABLE "cert_removal" ("id" character varying NOT NULL, "block_number" integer NOT NULL, "cert_id" character varying, CONSTRAINT "PK_2b3e8cf035b04205a4b1f6a0acf" PRIMARY KEY ("id"))`)
+ await db.query(`CREATE INDEX "IDX_2efb6397676a3b82bde7631ed0" ON "cert_removal" ("cert_id") `)
+ await db.query(`CREATE TABLE "cert" ("id" character varying NOT NULL, "created_on" integer NOT NULL, "expire_on" integer NOT NULL, "issuer_id" character varying, "receiver_id" character varying, CONSTRAINT "PK_6a0ce80cc860598b4f16c00998c" PRIMARY KEY ("id"))`)
await db.query(`CREATE INDEX "IDX_70592e488b2e75cd8a2fa79826" ON "cert" ("issuer_id") `)
await db.query(`CREATE INDEX "IDX_262e29ab91c8ebc727cc518f2f" ON "cert" ("receiver_id") `)
await db.query(`CREATE TABLE "smith_cert" ("id" character varying NOT NULL, "issuer_id" character varying, "receiver_id" character varying, CONSTRAINT "PK_ae2ef36c9f6d40348c86230fd35" PRIMARY KEY ("id"))`)
@@ -65,6 +69,8 @@ module.exports = class Data1700684897000 {
await db.query(`ALTER TABLE "extrinsic" ADD CONSTRAINT "FK_824d47cc4b2cda726405aa507ca" FOREIGN KEY ("call_id") REFERENCES "call"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
await db.query(`ALTER TABLE "transfer" ADD CONSTRAINT "FK_76bdfed1a7eb27c6d8ecbb73496" FOREIGN KEY ("from_id") REFERENCES "account"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
await db.query(`ALTER TABLE "transfer" ADD CONSTRAINT "FK_0751309c66e97eac9ef11493623" FOREIGN KEY ("to_id") REFERENCES "account"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
+ await db.query(`ALTER TABLE "cert_renewal" ADD CONSTRAINT "FK_f1596a2147377881d3bd73dc182" FOREIGN KEY ("cert_id") REFERENCES "cert"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
+ await db.query(`ALTER TABLE "cert_removal" ADD CONSTRAINT "FK_2efb6397676a3b82bde7631ed03" FOREIGN KEY ("cert_id") REFERENCES "cert"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
await db.query(`ALTER TABLE "cert" ADD CONSTRAINT "FK_70592e488b2e75cd8a2fa798261" FOREIGN KEY ("issuer_id") REFERENCES "identity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
await db.query(`ALTER TABLE "cert" ADD CONSTRAINT "FK_262e29ab91c8ebc727cc518f2fb" FOREIGN KEY ("receiver_id") REFERENCES "identity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
await db.query(`ALTER TABLE "smith_cert" ADD CONSTRAINT "FK_ae67cbd087fcea0e1ec2f70cd04" FOREIGN KEY ("issuer_id") REFERENCES "identity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
@@ -112,6 +118,10 @@ module.exports = class Data1700684897000 {
await db.query(`DROP INDEX "public"."IDX_0751309c66e97eac9ef1149362"`)
await db.query(`DROP INDEX "public"."IDX_f4007436c1b546ede08a4fd7ab"`)
await db.query(`DROP TABLE "account"`)
+ await db.query(`DROP TABLE "cert_renewal"`)
+ await db.query(`DROP INDEX "public"."IDX_f1596a2147377881d3bd73dc18"`)
+ await db.query(`DROP TABLE "cert_removal"`)
+ await db.query(`DROP INDEX "public"."IDX_2efb6397676a3b82bde7631ed0"`)
await db.query(`DROP TABLE "cert"`)
await db.query(`DROP INDEX "public"."IDX_70592e488b2e75cd8a2fa79826"`)
await db.query(`DROP INDEX "public"."IDX_262e29ab91c8ebc727cc518f2f"`)
@@ -138,6 +148,8 @@ module.exports = class Data1700684897000 {
await db.query(`ALTER TABLE "extrinsic" DROP CONSTRAINT "FK_824d47cc4b2cda726405aa507ca"`)
await db.query(`ALTER TABLE "transfer" DROP CONSTRAINT "FK_76bdfed1a7eb27c6d8ecbb73496"`)
await db.query(`ALTER TABLE "transfer" DROP CONSTRAINT "FK_0751309c66e97eac9ef11493623"`)
+ await db.query(`ALTER TABLE "cert_renewal" DROP CONSTRAINT "FK_f1596a2147377881d3bd73dc182"`)
+ await db.query(`ALTER TABLE "cert_removal" DROP CONSTRAINT "FK_2efb6397676a3b82bde7631ed03"`)
await db.query(`ALTER TABLE "cert" DROP CONSTRAINT "FK_70592e488b2e75cd8a2fa798261"`)
await db.query(`ALTER TABLE "cert" DROP CONSTRAINT "FK_262e29ab91c8ebc727cc518f2fb"`)
await db.query(`ALTER TABLE "smith_cert" DROP CONSTRAINT "FK_ae67cbd087fcea0e1ec2f70cd04"`)
diff --git a/schema.graphql b/schema.graphql
index 95ee7fe..5170730 100644
--- a/schema.graphql
+++ b/schema.graphql
@@ -123,7 +123,6 @@ type Account @entity {
}
type Transfer @entity {
- id: ID!
blockNumber: Int! @index
timestamp: DateTime! @index
from: Account!
@@ -137,6 +136,8 @@ type Transfer @entity {
"Identity"
type Identity @entity {
+ "index in string format"
+ id: ID! # this is a limitation of @subsquid/typeorm-store
"Identity index"
index: Int! @index @unique
"Current account"
@@ -159,8 +160,25 @@ type Identity @entity {
"Certification"
type Cert @entity {
- issuer: Identity!
- receiver: Identity!
+ "issuerIndex-receiverIndex"
+ id: ID!
+ issuer: Identity! @index
+ receiver: Identity! @index
+ "first block"
+ createdOn: Int!
+ expireOn: Int!
+ renewal: [CertRenewal!] @derivedFrom(field: "cert")
+ removal: [CertRemoval!] @derivedFrom(field: "cert")
+}
+"Certification renewal"
+type CertRenewal @entity {
+ cert: Cert! @index
+ blockNumber: Int!
+}
+"Certification removal"
+type CertRemoval @entity {
+ cert: Cert! @index
+ blockNumber: Int!
}
"Smith certification"
diff --git a/src/genesis.ts b/src/genesis.ts
index 3222780..3eea600 100644
--- a/src/genesis.ts
+++ b/src/genesis.ts
@@ -125,9 +125,11 @@ export async function saveGenesis(ctx: ProcessorContext<StoreWithCache>) {
certs.push(
new Cert({
// cert id is different in genesis than in the rest of blockchain
- id: `genesis-${issuer_index}-${receiver_index}`,
+ id: `${issuer_index}-${receiver_index}`,
issuer: identities.get(parseInt(issuer_index)),
receiver: identities.get(parseInt(receiver_index)),
+ createdOn: 0,
+ expireOn: expiration_block as number,
})
);
}
@@ -138,7 +140,7 @@ export async function saveGenesis(ctx: ProcessorContext<StoreWithCache>) {
for (const [issuer_index, expiration_block] of Object.entries(certs_received)) {
smithCerts.push(
new SmithCert({
- id: `genesis-${issuer_index}-${receiver_index}`,
+ id: `${issuer_index}-${receiver_index}`,
issuer: identities.get(parseInt(issuer_index)),
receiver: identities.get(parseInt(receiver_index)),
})
diff --git a/src/main.ts b/src/main.ts
index b2c4ef0..244aa29 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -4,8 +4,8 @@ import * as ss58 from "@subsquid/ss58";
import assert from "assert";
import { processor, ProcessorContext } from "./processor";
-import { Account, Cert, Identity, Transfer } from "./model";
-import { events as events_t, calls as calls_t } from "./types";
+import { Account, Cert, CertRemoval, CertRenewal, Identity, Transfer } from "./model";
+import { events as events_t, calls as calls_t, constants } from "./types";
import { saveBlock, saveExtrinsic, saveCall, saveEvent } from "./giant-squid";
import { saveGenesis } from "./genesis";
@@ -39,10 +39,13 @@ processor.run(new TypeormDatabaseWithCache(), async (ctx) => {
// collect new data from events
let ndata: NewData = {
accounts: [],
- identities: [],
+ identitiesCreated: [],
+ identitiesConfirmed: [],
idtyChangedOwnerKey: [],
transfers: [],
- certs: [],
+ cert: [],
+ certRenewal: [],
+ certRemoval: [],
};
getNewData(ctx, ndata);
@@ -51,7 +54,9 @@ processor.run(new TypeormDatabaseWithCache(), async (ctx) => {
accounts: new Map(),
identities: new Map(),
transfers: [],
- certs: [],
+ cert: new Map(),
+ certRenewal: [],
+ certRemoval: [],
};
await prepareData(ctx, ndata, prepared);
@@ -59,6 +64,8 @@ processor.run(new TypeormDatabaseWithCache(), async (ctx) => {
await storeData(ctx, prepared);
});
+// =====================================================================================================
+
// type aliases
export type Address = string;
export type IdtyIndex = number;
@@ -68,10 +75,13 @@ type BlockNumber = number;
// this contains partial data to be turned into types
interface NewData {
accounts: Address[];
- identities: IdtyCreatedEvent[];
+ identitiesCreated: IdtyCreatedEvent[];
+ identitiesConfirmed: IdtyConfirmedEvent[];
idtyChangedOwnerKey: IdtyChangedOwnerKeyEvent[];
transfers: TransferEvent[];
- certs: CertEvent[];
+ cert: CertEvent[];
+ certRenewal: CertRenewalEvent[];
+ certRemoval: CertRemovalEvent[];
}
interface TransferEvent {
id: string;
@@ -83,15 +93,31 @@ interface TransferEvent {
}
interface CertEvent {
id: string;
- issuer: IdtyIndex;
- receiver: IdtyIndex;
- blockNumber: BlockNumber;
+ issuerId: IdtyIndex;
+ receiverId: IdtyIndex;
+ createdOn: BlockNumber;
+ expireOn: BlockNumber;
+}
+interface CertRenewalEvent {
+ id: string; // id of the event
+ certId: string; // id of the cert
+ blockNumber: BlockNumber; // block number
+}
+interface CertRemovalEvent {
+ id: string; // id of the event
+ certId: string; // id of the cert
+ blockNumber: BlockNumber; // block number
}
interface IdtyCreatedEvent {
id: string;
index: IdtyIndex;
account: Address;
}
+interface IdtyConfirmedEvent {
+ id: string;
+ index: IdtyIndex;
+ name: string;
+}
interface IdtyChangedOwnerKeyEvent {
id: string;
index: IdtyIndex;
@@ -103,9 +129,13 @@ interface PreparedData {
accounts: Map<Address, Account>;
identities: Map<IdtyIndex, Identity>;
transfers: Transfer[];
- certs: Cert[];
+ cert: Map<string, Cert>;
+ certRenewal: CertRenewal[];
+ certRemoval: CertRemoval[];
}
+// ================================================================================
+
/// fill data with data collected from events
function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
const silence_events = [
@@ -171,13 +201,28 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
} else {
throw new Error("Unsupported spec");
}
- ndata.identities.push({
+ ndata.identitiesCreated.push({
id: event.id,
index: newI.idtyIndex,
account: ss58.codec(42).encode(newI.ownerKey),
});
break;
+ // ===== Identity.IdtyConfirmed
+ case events_t.identity.idtyConfirmed.name:
+ let cI: { idtyIndex: IdtyIndex; ownerKey: Address; name: string };
+ if (events_t.identity.idtyConfirmed.v700.is(event)) {
+ cI = events_t.identity.idtyConfirmed.v700.decode(event);
+ } else {
+ throw new Error("Unsupported spec");
+ }
+ ndata.identitiesConfirmed.push({
+ id: event.id,
+ index: cI.idtyIndex,
+ name: cI.name,
+ });
+ break;
+
// ===== Identity.ChangeOwnerKey
case events_t.identity.idtyChangedOwnerKey.name:
let chok: { idtyIndex: IdtyIndex; newOwnerKey: Address };
@@ -193,6 +238,7 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
});
break;
+ // ====================================================== Cert
// ===== Cert.NewCert
case events_t.cert.newCert.name:
let cert: { issuer: IdtyIndex; receiver: IdtyIndex };
@@ -201,11 +247,12 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
} else {
throw new Error("Unsupported spec");
}
- ndata.certs.push({
- id: event.id,
- blockNumber: block.header.height,
- issuer: cert.issuer,
- receiver: cert.receiver,
+ ndata.cert.push({
+ id: `${cert.issuer}-${cert.receiver}`,
+ issuerId: cert.issuer,
+ receiverId: cert.receiver,
+ createdOn: block.header.height,
+ expireOn: block.header.height + constants.cert.validityPeriod.v700.get(event.block),
});
break;
@@ -217,11 +264,31 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
} else {
throw new Error("Unsupported spec");
}
- ndata.certs.push({
+ ndata.certRenewal.push({
id: event.id,
+ certId: `${recert.issuer}-${recert.receiver}`,
+ blockNumber: block.header.height,
+ });
+ break;
+
+ // ===== Cert.RemovedCert
+ case events_t.cert.removedCert.name:
+ let remcert: {
+ issuer: IdtyIndex;
+ issuerIssuedCount: number;
+ receiver: IdtyIndex;
+ receiverReceivedCount: number;
+ expiration: boolean;
+ };
+ if (events_t.cert.removedCert.v700.is(event)) {
+ remcert = events_t.cert.removedCert.v700.decode(event);
+ } else {
+ throw new Error("Unsupported spec");
+ }
+ ndata.certRemoval.push({
+ id: event.id,
+ certId: `${remcert.issuer}-${remcert.receiver}`,
blockNumber: block.header.height,
- issuer: recert.issuer,
- receiver: recert.receiver,
});
break;
@@ -232,28 +299,39 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
}
}
+// =============================================================================================================
+
/// prepare data for injection into database
async function prepareData(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
await createAccounts(ctx, newData, data);
await createIdentities(ctx, newData, data);
+ await confirmIdentities(ctx, newData, data);
await changeIdtyOwnerKey(ctx, newData, data);
await createTransfers(ctx, newData, data);
await createCerts(ctx, newData, data);
+ await createCertRenewals(ctx, newData, data);
+ await createCertRemovals(ctx, newData, data);
}
+// =============================================
+
/// store prepared data into database
async function storeData(ctx: ProcessorContext<StoreWithCache>, data: PreparedData) {
// UPSERT = update or insert if not existing
// account can have already existed, been killed, and recreated
await ctx.store.upsert([...data.accounts.values()]);
- // identities can have been changed (change owner key)
+ // identities can have been changed (confirmed, change owner key...) or added (created)
await ctx.store.upsert([...data.identities.values()]);
- // INSERT
+ // certs can have been changed (renewed, ...)
+ await ctx.store.upsert([...data.cert.values()]);
+
+ // INSERT = these object can not exist before
await ctx.store.insert(data.transfers);
- await ctx.store.insert(data.certs);
+ await ctx.store.insert(data.certRenewal);
+ await ctx.store.insert(data.certRemoval);
}
-// ===== create new instances if not existing in database =====
+// =============================================================================================================
async function createAccounts(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
// system will tell when accounts are created (but this should be added above)
@@ -265,7 +343,7 @@ async function createAccounts(ctx: ProcessorContext<StoreWithCache>, newData: Ne
}
async function createIdentities(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
- for (let i of newData.identities) {
+ for (let i of newData.identitiesCreated) {
let account = await ctx.store.getOrFail(Account, i.account);
let newI = new Identity({
id: String(i.index),
@@ -276,6 +354,14 @@ async function createIdentities(ctx: ProcessorContext<StoreWithCache>, newData:
}
}
+async function confirmIdentities(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
+ for (let i of newData.identitiesConfirmed) {
+ let idty = await ctx.store.getOrFail(Identity, String(i.index));
+ idty.name = i.name;
+ data.identities.set(i.index, idty);
+ }
+}
+
async function changeIdtyOwnerKey(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
for (let icok of newData.idtyChangedOwnerKey) {
let idty = await ctx.store.getOrFail(Identity, String(icok.index));
@@ -304,15 +390,46 @@ async function createTransfers(ctx: ProcessorContext<StoreWithCache>, newData: N
}
async function createCerts(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
- for (let c of newData.certs) {
- let { id, blockNumber, issuer, receiver } = c;
- let issuerIdty = data.identities.get(issuer) ?? await ctx.store.getOrFail(Identity, String(issuer));
- let receiverIdty = data.identities.get(receiver) ?? await ctx.store.getOrFail(Identity, String(receiver));
- data.certs.push(
+ for (let c of newData.cert) {
+ let { id, issuerId, receiverId, createdOn, expireOn } = c;
+ let issuer = data.identities.get(issuerId) ?? (await ctx.store.getOrFail(Identity, String(issuerId)));
+ let receiver = data.identities.get(receiverId) ?? (await ctx.store.getOrFail(Identity, String(receiverId)));
+ let cert =
+ (await ctx.store.get(Cert, id)) ??
new Cert({
id,
- issuer: issuerIdty,
- receiver: receiverIdty,
+ issuer,
+ receiver,
+ createdOn,
+ expireOn,
+ });
+ data.cert.set(id, cert);
+ }
+}
+
+async function createCertRenewals(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
+ for (let c of newData.certRenewal) {
+ let { id, certId, blockNumber } = c;
+ let cert = await ctx.store.getOrFail(Cert, certId);
+ data.certRenewal.push(
+ new CertRenewal({
+ id,
+ cert,
+ blockNumber,
+ })
+ );
+ }
+}
+
+async function createCertRemovals(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
+ for (let c of newData.certRemoval) {
+ let { id, certId, blockNumber } = c;
+ let cert = await ctx.store.getOrFail(Cert, certId);
+ data.certRenewal.push(
+ new CertRemoval({
+ id,
+ cert,
+ blockNumber,
})
);
}
diff --git a/src/model/generated/cert.model.ts b/src/model/generated/cert.model.ts
index 1120465..6dd258f 100644
--- a/src/model/generated/cert.model.ts
+++ b/src/model/generated/cert.model.ts
@@ -1,5 +1,7 @@
-import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_, OneToMany as OneToMany_} from "typeorm"
import {Identity} from "./identity.model"
+import {CertRenewal} from "./certRenewal.model"
+import {CertRemoval} from "./certRemoval.model"
/**
* Certification
@@ -10,6 +12,9 @@ export class Cert {
Object.assign(this, props)
}
+ /**
+ * issuerIndex-receiverIndex
+ */
@PrimaryColumn_()
id!: string
@@ -20,4 +25,19 @@ export class Cert {
@Index_()
@ManyToOne_(() => Identity, {nullable: true})
receiver!: Identity
+
+ /**
+ * first block
+ */
+ @Column_("int4", {nullable: false})
+ createdOn!: number
+
+ @Column_("int4", {nullable: false})
+ expireOn!: number
+
+ @OneToMany_(() => CertRenewal, e => e.cert)
+ renewal!: CertRenewal[]
+
+ @OneToMany_(() => CertRemoval, e => e.cert)
+ removal!: CertRemoval[]
}
diff --git a/src/model/generated/certRemoval.model.ts b/src/model/generated/certRemoval.model.ts
new file mode 100644
index 0000000..ae951ee
--- /dev/null
+++ b/src/model/generated/certRemoval.model.ts
@@ -0,0 +1,22 @@
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
+import {Cert} from "./cert.model"
+
+/**
+ * Certification removal
+ */
+@Entity_()
+export class CertRemoval {
+ constructor(props?: Partial<CertRemoval>) {
+ Object.assign(this, props)
+ }
+
+ @PrimaryColumn_()
+ id!: string
+
+ @Index_()
+ @ManyToOne_(() => Cert, {nullable: true})
+ cert!: Cert
+
+ @Column_("int4", {nullable: false})
+ blockNumber!: number
+}
diff --git a/src/model/generated/certRenewal.model.ts b/src/model/generated/certRenewal.model.ts
new file mode 100644
index 0000000..866b76f
--- /dev/null
+++ b/src/model/generated/certRenewal.model.ts
@@ -0,0 +1,22 @@
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
+import {Cert} from "./cert.model"
+
+/**
+ * Certification renewal
+ */
+@Entity_()
+export class CertRenewal {
+ constructor(props?: Partial<CertRenewal>) {
+ Object.assign(this, props)
+ }
+
+ @PrimaryColumn_()
+ id!: string
+
+ @Index_()
+ @ManyToOne_(() => Cert, {nullable: true})
+ cert!: Cert
+
+ @Column_("int4", {nullable: false})
+ blockNumber!: number
+}
diff --git a/src/model/generated/identity.model.ts b/src/model/generated/identity.model.ts
index 1abb30a..9730c90 100644
--- a/src/model/generated/identity.model.ts
+++ b/src/model/generated/identity.model.ts
@@ -14,6 +14,9 @@ export class Identity {
Object.assign(this, props)
}
+ /**
+ * index in string format
+ */
@PrimaryColumn_()
id!: string
diff --git a/src/model/generated/index.ts b/src/model/generated/index.ts
index 318f67b..0cc7cf7 100644
--- a/src/model/generated/index.ts
+++ b/src/model/generated/index.ts
@@ -10,6 +10,8 @@ export * from "./account.model"
export * from "./transfer.model"
export * from "./identity.model"
export * from "./cert.model"
+export * from "./certRenewal.model"
+export * from "./certRemoval.model"
export * from "./smithCert.model"
export * from "./membership.model"
export * from "./smithMembership.model"
diff --git a/src/types/account/calls.ts b/src/types/account/calls.ts
new file mode 100644
index 0000000..5a66880
--- /dev/null
+++ b/src/types/account/calls.ts
@@ -0,0 +1,12 @@
+import {sts, Block, Bytes, Option, Result, CallType, RuntimeCtx} from '../support'
+
+export const unlinkIdentity = {
+ name: 'Account.unlink_identity',
+ /**
+ * unlink the identity associated with the account
+ */
+ v700: new CallType(
+ 'Account.unlink_identity',
+ sts.unit()
+ ),
+}
diff --git a/src/types/account/constants.ts b/src/types/account/constants.ts
new file mode 100644
index 0000000..ee9c280
--- /dev/null
+++ b/src/types/account/constants.ts
@@ -0,0 +1,15 @@
+import {sts, Block, Bytes, Option, Result, ConstantType, RuntimeCtx} from '../support'
+
+export const maxNewAccountsPerBlock = {
+ v700: new ConstantType(
+ 'Account.MaxNewAccountsPerBlock',
+ sts.number()
+ ),
+}
+
+export const newAccountPrice = {
+ v700: new ConstantType(
+ 'Account.NewAccountPrice',
+ sts.bigint()
+ ),
+}
diff --git a/src/types/account/events.ts b/src/types/account/events.ts
new file mode 100644
index 0000000..d9214b0
--- /dev/null
+++ b/src/types/account/events.ts
@@ -0,0 +1,58 @@
+import {sts, Block, Bytes, Option, Result, EventType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const forceDestroy = {
+ name: 'Account.ForceDestroy',
+ /**
+ * Force the destruction of an account because its free balance is insufficient to pay
+ * the account creation price.
+ * [who, balance]
+ */
+ v700: new EventType(
+ 'Account.ForceDestroy',
+ sts.struct({
+ who: v700.AccountId32,
+ balance: sts.bigint(),
+ })
+ ),
+}
+
+export const randomIdAssigned = {
+ name: 'Account.RandomIdAssigned',
+ /**
+ * Random id assigned
+ * [account_id, random_id]
+ */
+ v700: new EventType(
+ 'Account.RandomIdAssigned',
+ sts.struct({
+ who: v700.AccountId32,
+ randomId: v700.H256,
+ })
+ ),
+}
+
+export const accountLinked = {
+ name: 'Account.AccountLinked',
+ /**
+ * account linked to identity
+ */
+ v700: new EventType(
+ 'Account.AccountLinked',
+ sts.struct({
+ who: v700.AccountId32,
+ identity: sts.number(),
+ })
+ ),
+}
+
+export const accountUnlinked = {
+ name: 'Account.AccountUnlinked',
+ /**
+ * account unlinked from identity
+ */
+ v700: new EventType(
+ 'Account.AccountUnlinked',
+ v700.AccountId32
+ ),
+}
diff --git a/src/types/account/storage.ts b/src/types/account/storage.ts
new file mode 100644
index 0000000..bbb6514
--- /dev/null
+++ b/src/types/account/storage.ts
@@ -0,0 +1,38 @@
+import {sts, Block, Bytes, Option, Result, StorageType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const pendingRandomIdAssignments = {
+ v700: new StorageType('Account.PendingRandomIdAssignments', 'Optional', [sts.bigint()], v700.AccountId32) as PendingRandomIdAssignmentsV700,
+}
+
+export interface PendingRandomIdAssignmentsV700 {
+ is(block: RuntimeCtx): boolean
+ get(block: Block, key: bigint): Promise<(v700.AccountId32 | undefined)>
+ getMany(block: Block, keys: bigint[]): Promise<(v700.AccountId32 | undefined)[]>
+ getKeys(block: Block): Promise<bigint[]>
+ getKeys(block: Block, key: bigint): Promise<bigint[]>
+ getKeysPaged(pageSize: number, block: Block): AsyncIterable<bigint[]>
+ getKeysPaged(pageSize: number, block: Block, key: bigint): AsyncIterable<bigint[]>
+ getPairs(block: Block): Promise<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+ getPairs(block: Block, key: bigint): Promise<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+ getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+ getPairsPaged(pageSize: number, block: Block, key: bigint): AsyncIterable<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+}
+
+export const pendingNewAccounts = {
+ v700: new StorageType('Account.PendingNewAccounts', 'Optional', [v700.AccountId32], sts.unit()) as PendingNewAccountsV700,
+}
+
+export interface PendingNewAccountsV700 {
+ is(block: RuntimeCtx): boolean
+ get(block: Block, key: v700.AccountId32): Promise<(null | undefined)>
+ getMany(block: Block, keys: v700.AccountId32[]): Promise<(null | undefined)[]>
+ getKeys(block: Block): Promise<v700.AccountId32[]>
+ getKeys(block: Block, key: v700.AccountId32): Promise<v700.AccountId32[]>
+ getKeysPaged(pageSize: number, block: Block): AsyncIterable<v700.AccountId32[]>
+ getKeysPaged(pageSize: number, block: Block, key: v700.AccountId32): AsyncIterable<v700.AccountId32[]>
+ getPairs(block: Block): Promise<[k: v700.AccountId32, v: (null | undefined)][]>
+ getPairs(block: Block, key: v700.AccountId32): Promise<[k: v700.AccountId32, v: (null | undefined)][]>
+ getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: v700.AccountId32, v: (null | undefined)][]>
+ getPairsPaged(pageSize: number, block: Block, key: v700.AccountId32): AsyncIterable<[k: v700.AccountId32, v: (null | undefined)][]>
+}
diff --git a/src/types/calls.ts b/src/types/calls.ts
index dfd6803..c4f3bab 100644
--- a/src/types/calls.ts
+++ b/src/types/calls.ts
@@ -1,4 +1,5 @@
export * as system from './system/calls'
+export * as account from './account/calls'
export * as timestamp from './timestamp/calls'
export * as balances from './balances/calls'
export * as authorityMembers from './authority-members/calls'
diff --git a/src/types/constants.ts b/src/types/constants.ts
index 96c32d3..1466c12 100644
--- a/src/types/constants.ts
+++ b/src/types/constants.ts
@@ -1,4 +1,5 @@
export * as system from './system/constants'
+export * as account from './account/constants'
export * as timestamp from './timestamp/constants'
export * as balances from './balances/constants'
export * as transactionPayment from './transaction-payment/constants'
diff --git a/src/types/events.ts b/src/types/events.ts
index 79d8b78..edd290e 100644
--- a/src/types/events.ts
+++ b/src/types/events.ts
@@ -1,4 +1,5 @@
export * as system from './system/events'
+export * as account from './account/events'
export * as balances from './balances/events'
export * as transactionPayment from './transaction-payment/events'
export * as quota from './quota/events'
diff --git a/src/types/storage.ts b/src/types/storage.ts
index 37e5a29..16055d3 100644
--- a/src/types/storage.ts
+++ b/src/types/storage.ts
@@ -1,4 +1,5 @@
export * as system from './system/storage'
+export * as account from './account/storage'
export * as timestamp from './timestamp/storage'
export * as balances from './balances/storage'
export * as transactionPayment from './transaction-payment/storage'
diff --git a/typegen.json b/typegen.json
index 091110b..958738c 100644
--- a/typegen.json
+++ b/typegen.json
@@ -38,6 +38,12 @@
"storage": true,
"constants": true
},
+ "Account": {
+ "events": true,
+ "calls": true,
+ "storage": true,
+ "constants": true
+ },
"Quota": {
"events": true,
"calls": true,
--
GitLab