diff --git a/README.md b/README.md index 267fb59d6c7c7963dac0da1221bf83adb383c9df..cee255c4f7c9092453d4db3634c7efd1ba1bb8ac 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 58666b96496d3179304193a4c6b8f289a6208d9b..584b345dc6cb87147d37e6d9971289e8ad7fb114 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 95ee7fe3b61ec63921da9442827e5ae3067d7643..51707302224c82c96b81c255a66031bbfefa81c5 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 3222780ef5e45486e5328fc744836ad33599071e..3eea6005ce1f581112d2f4fabf2bb09cd69aa6be 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 b2c4ef01427bb850e6101fb2eb296a6a5f657c03..244aa291f45785c4d02ad8f67dedb5a493cf7d43 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 1120465d992e6674e21abb77ad0aca9ae30ab3c5..6dd258f45cf3c3647297089b3b9d3c5e6438ecef 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 0000000000000000000000000000000000000000..ae951ee6eafe77a75006f42a2c73f3372c6e3647 --- /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 0000000000000000000000000000000000000000..866b76fcba635a76f9f0e7d6a63e0fd9da64e808 --- /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 1abb30a9a7773fa177386c1ab6780de04f111c8c..9730c901dc0258da0377af62841609fccb8268a5 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 318f67bd157a4fc726217b9c29d0f6ed3d41b5c9..0cc7cf77ff41a442b002eb7bb672804538c12291 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 0000000000000000000000000000000000000000..5a66880ed31d6c3dea36d63030fac4e689ef2cde --- /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 0000000000000000000000000000000000000000..ee9c280bf3711a4aaaebdf4c870b4abb9a7abfa3 --- /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 0000000000000000000000000000000000000000..d9214b08170afff03757ae10eba69f4b0e6f3689 --- /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 0000000000000000000000000000000000000000..bbb6514938ddbd6941d5ec8ef05a65f62d461c1c --- /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 dfd6803f971a99130057f729d6d80826771c9aeb..c4f3bab3a5f957ef677335bb66a32b7f874c801d 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 96c32d36067876d2cebc1150bbb30090dd61d4da..1466c12987636e0272c4164c1d359e3b21103929 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 79d8b78a7dc610c45d73bd093e0dc0d43b094d22..edd290ec3256924d5bf54eca2e7f57011df40158 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 37e5a29a596a55e5bcf0bbbed3bd17766febf720..16055d3b8b6bb5bb066c16ed6ef908b44e06a226 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 091110bfeb92ef34ce5f52b624b88ec32671b425..958738c1a6f5bbc3b9c3517911bd863c1f82e910 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,