{
  "version": 3,
  "sources": ["../../src/Diviner.ts", "../../src/index.ts"],
  "sourcesContent": ["import type { Hash } from '@ariestools/sdk'\nimport { assertEx, exists } from '@ariestools/sdk'\nimport type { AddressHistoryDivinerParams } from '@xyo-network/diviner-address-history-model'\nimport { AddressHistoryDivinerConfigSchema } from '@xyo-network/diviner-address-history-model'\nimport { isArchivistInstance } from '@xyo-network/sdk/archivist-model'\nimport { AbstractDiviner } from '@xyo-network/sdk/diviner-abstract'\nimport {\n  type BoundWitness, isBoundWitness,\n  isStorageMeta, type Payload, type Schema, type XyoAddress, type XyoQuantAddress,\n} from '@xyo-network/sdk-protocol'\nimport {\n  BoundWitnessBuilder, PayloadBuilder, PayloadWrapper,\n} from '@xyo-network/sdk-protocol'\n\n// This diviner returns the most recent boundwitness signed by the address that can be found\n// if multiple broken chains are found, all the heads are returned\n\nexport class AddressHistoryDiviner<TParams extends AddressHistoryDivinerParams = AddressHistoryDivinerParams> extends AbstractDiviner<TParams> {\n  static override readonly configSchemas: Schema[] = [...super.configSchemas, AddressHistoryDivinerConfigSchema]\n  static override readonly defaultConfigSchema: Schema = AddressHistoryDivinerConfigSchema\n\n  get queryAddress(): (Lowercase<string> & {\n    readonly __hex: true\n  } & {\n    readonly __address: true\n  }) | XyoQuantAddress {\n    return assertEx(this.config.address, () => 'Missing address')\n  }\n\n  protected override async divineHandler(payloads: Payload[] = []): Promise<Payload[]> {\n    assertEx(payloads.length === 0, () => 'MemoryAddressHistoryDiviner.divine does not allow payloads to be sent')\n\n    const allBoundWitnesses = await this.allBoundWitnesses()\n    const bwRecords = await PayloadBuilder.toDataHashMap(allBoundWitnesses)\n    const chains = Object.values(this.buildAddressChains(this.queryAddress, bwRecords))\n\n    // Return the heads of each chain (get the last bw on each chain)\n    return chains.map(chain => assertEx(PayloadWrapper.unwrap(chain.shift())))\n  }\n\n  private async allBoundWitnesses() {\n    const archivists = (await this.resolve('*')).filter(isArchivistInstance)\n    assertEx(archivists.length > 0, () => 'Did not find any archivists')\n    return (\n      await Promise.all(\n        archivists.map(async (archivist) => {\n          const all = await archivist.next({ limit: 10_000 })\n          return all?.filter(x => isBoundWitness(x) && isStorageMeta(x))\n        }),\n      )\n    )\n      .flat()\n      .filter(exists)\n  }\n\n  private buildAddressChains(address: XyoAddress, bwRecords: Record<Hash, BoundWitness>): Record<string, BoundWitness[]> {\n    const arrayedResult = Object.entries(bwRecords).reduce<Record<string, BoundWitness[]>>((prev, [key, value]) => {\n      prev[key] = [value]\n      return prev\n    }, {})\n\n    return Object.entries(bwRecords).reduce<Record<string, BoundWitness[]>>((prev, [key, value]) => {\n      // check if key is still there (may have been deleted as prevHash)\n      if (prev[key]) {\n        const previousHash = BoundWitnessBuilder.previousHash(value, address)\n        if (\n          previousHash // if we have the previousHash, move this bw to its chain\n          && prev[previousHash]\n        ) {\n          prev[key].push(...prev[previousHash])\n          delete prev[previousHash]\n        }\n      }\n      return prev\n    }, arrayedResult)\n  }\n}\n", "export * from './Diviner.ts'\nexport * from '@xyo-network/diviner-address-history-model'\n"],
  "mappings": ";AACA,SAAS,UAAU,cAAc;AAEjC,SAAS,yCAAyC;AAClD,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC;AAAA,EACqB;AAAA,EACnB;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAAqB;AAAA,EAAgB;AAAA,OAChC;AAKA,IAAM,wBAAN,cAA+G,gBAAyB;AAAA,EAC7I,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,iCAAiC;AAAA,EAC7G,OAAyB,sBAA8B;AAAA,EAEvD,IAAI,eAIiB;AACnB,WAAO,SAAS,KAAK,OAAO,SAAS,MAAM,iBAAiB;AAAA,EAC9D;AAAA,EAEA,MAAyB,cAAc,WAAsB,CAAC,GAAuB;AACnF,aAAS,SAAS,WAAW,GAAG,MAAM,uEAAuE;AAE7G,UAAM,oBAAoB,MAAM,KAAK,kBAAkB;AACvD,UAAM,YAAY,MAAM,eAAe,cAAc,iBAAiB;AACtE,UAAM,SAAS,OAAO,OAAO,KAAK,mBAAmB,KAAK,cAAc,SAAS,CAAC;AAGlF,WAAO,OAAO,IAAI,WAAS,SAAS,eAAe,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAc,oBAAoB;AAChC,UAAM,cAAc,MAAM,KAAK,QAAQ,GAAG,GAAG,OAAO,mBAAmB;AACvE,aAAS,WAAW,SAAS,GAAG,MAAM,6BAA6B;AACnE,YACE,MAAM,QAAQ;AAAA,MACZ,WAAW,IAAI,OAAO,cAAc;AAClC,cAAM,MAAM,MAAM,UAAU,KAAK,EAAE,OAAO,IAAO,CAAC;AAClD,eAAO,KAAK,OAAO,OAAK,eAAe,CAAC,KAAK,cAAc,CAAC,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH,GAEC,KAAK,EACL,OAAO,MAAM;AAAA,EAClB;AAAA,EAEQ,mBAAmB,SAAqB,WAAuE;AACrH,UAAM,gBAAgB,OAAO,QAAQ,SAAS,EAAE,OAAuC,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM;AAC7G,WAAK,GAAG,IAAI,CAAC,KAAK;AAClB,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAEL,WAAO,OAAO,QAAQ,SAAS,EAAE,OAAuC,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM;AAE9F,UAAI,KAAK,GAAG,GAAG;AACb,cAAM,eAAe,oBAAoB,aAAa,OAAO,OAAO;AACpE,YACE,gBACG,KAAK,YAAY,GACpB;AACA,eAAK,GAAG,EAAE,KAAK,GAAG,KAAK,YAAY,CAAC;AACpC,iBAAO,KAAK,YAAY;AAAA,QAC1B;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,aAAa;AAAA,EAClB;AACF;;;AC3EA,cAAc;",
  "names": []
}
