Compare commits

..

No commits in common. "main" and "release-v0.1.13" have entirely different histories.

10 changed files with 117 additions and 299 deletions

View File

@ -12,12 +12,6 @@
yarn
```
* Run build:
```bash
yarn build
```
* Create a postgres12 database for the watcher:
```bash

View File

@ -10,6 +10,7 @@
checkpointInterval = 2000
# Enable state creation
# CAUTION: Disable only if state creation is not desired or can be filled subsequently
enableState = false
subgraphPath = "./subgraph-build"
@ -23,7 +24,7 @@
# Flag to specify whether RPC endpoint supports block hash as block tag parameter
rpcSupportsBlockHashParam = false
# GQL server config
# Server GQL config
[server.gql]
path = "/graphql"
@ -45,14 +46,6 @@
maxAge = 15
timeTravelMaxAge = 86400 # 1 day
# ETH RPC server config
[server.ethRPC]
enabled = true
path = "/rpc"
# Max number of logs that can be returned in a single getLogs request (default: 10000)
getLogsResultLimit = 10000
[metrics]
host = "127.0.0.1"
port = 9000
@ -86,10 +79,6 @@
# Boolean flag to filter event logs by topics
filterLogsByTopics = true
# Switch clients if eth_getLogs call takes more than threshold (in secs)
# Set to 0 for disabling switching
getLogsClientSwitchThresholdInSecs = 30
[upstream.cache]
name = "requests"
enabled = false

View File

@ -1,6 +1,6 @@
{
"name": "@cerc-io/ajna-watcher-ts",
"version": "0.1.17",
"version": "0.1.13",
"description": "ajna-watcher-ts",
"private": true,
"main": "dist/index.js",
@ -25,8 +25,7 @@
"import-state": "DEBUG=vulcanize:* node --enable-source-maps dist/cli/import-state.js",
"import-state:dev": "DEBUG=vulcanize:* ts-node src/cli/import-state.ts",
"inspect-cid": "DEBUG=vulcanize:* ts-node src/cli/inspect-cid.ts",
"index-block": "DEBUG=vulcanize:* ts-node src/cli/index-block.ts",
"backfill-events-data": "DEBUG=vulcanize:* YARN_CHILD_PROCESS=true node --enable-source-maps dist/cli/backfill-events-data.js"
"index-block": "DEBUG=vulcanize:* ts-node src/cli/index-block.ts"
},
"repository": {
"type": "git",
@ -40,11 +39,11 @@
"homepage": "https://github.com/cerc-io/watcher-ts#readme",
"dependencies": {
"@apollo/client": "^3.3.19",
"@cerc-io/cli": "^0.2.108",
"@cerc-io/ipld-eth-client": "^0.2.108",
"@cerc-io/solidity-mapper": "^0.2.108",
"@cerc-io/util": "^0.2.108",
"@cerc-io/graph-node": "^0.2.108",
"@cerc-io/cli": "^0.2.98",
"@cerc-io/ipld-eth-client": "^0.2.98",
"@cerc-io/solidity-mapper": "^0.2.98",
"@cerc-io/util": "^0.2.98",
"@cerc-io/graph-node": "^0.2.98",
"@ethersproject/providers": "^5.4.4",
"debug": "^4.3.1",
"decimal.js": "^10.3.1",

View File

@ -1,26 +0,0 @@
//
// Copyright 2024 Vulcanize, Inc.
//
import 'reflect-metadata';
import debug from 'debug';
import { BackfillEventsDataCmd } from '@cerc-io/cli';
import { Database } from '../database';
import { Event } from '../entity/Event';
const log = debug('vulcanize:backfill-events-data');
const main = async (): Promise<void> => {
const backFillCmd = new BackfillEventsDataCmd();
await backFillCmd.init(Database);
await backFillCmd.exec(Event);
};
main().catch(err => {
log(err);
}).finally(() => {
process.exit(0);
});

View File

@ -214,12 +214,6 @@ export class Database implements DatabaseInterface {
return this._baseDatabase.getEventsInRange(repo, fromBlockNumber, toBlockNumber);
}
async getEvents (options: FindManyOptions<Event>): Promise<Array<Event>> {
const repo = this._conn.getRepository(Event);
return this._baseDatabase.getEvents(repo, options);
}
async saveEventEntity (queryRunner: QueryRunner, entity: Event): Promise<Event> {
const repo = queryRunner.manager.getRepository(Event);
return this._baseDatabase.saveEventEntity(repo, entity);

View File

@ -5,7 +5,7 @@
import { Entity, PrimaryGeneratedColumn, Column, Index } from 'typeorm';
@Entity()
@Index(['address', 'kind'], { unique: true })
@Index(['address'], { unique: true })
export class Contract {
@PrimaryGeneratedColumn()
id!: number;

View File

@ -27,21 +27,6 @@ export class Event {
@Column('varchar', { length: 256 })
eventName!: string;
@Column('varchar', { length: 66 })
topic0!: string;
@Column('varchar', { length: 66, nullable: true })
topic1!: string | null;
@Column('varchar', { length: 66, nullable: true })
topic2!: string | null;
@Column('varchar', { length: 66, nullable: true })
topic3!: string | null;
@Column('varchar')
data!: string;
@Column('text')
eventInfo!: string;

View File

@ -5,10 +5,11 @@
import assert from 'assert';
import { DeepPartial, FindConditions, FindManyOptions, ObjectLiteral } from 'typeorm';
import debug from 'debug';
import { ethers, constants, providers } from 'ethers';
import { ethers, constants } from 'ethers';
import { GraphQLResolveInfo } from 'graphql';
import { JsonFragment } from '@ethersproject/abi';
import { BaseProvider } from '@ethersproject/providers';
import { MappingKey, StorageLayout } from '@cerc-io/solidity-mapper';
import {
Indexer as BaseIndexer,
@ -35,7 +36,6 @@ import {
EthFullTransaction,
ExtraEventData
} from '@cerc-io/util';
import { initClients } from '@cerc-io/cli';
import { GraphWatcher } from '@cerc-io/graph-node';
import PositionManagerArtifacts from './artifacts/PositionManager.json';
@ -148,7 +148,7 @@ const KIND_ERC721POOL = 'ERC721Pool';
export class Indexer implements IndexerInterface {
_db: Database;
_ethClient: EthClient;
_ethProvider: providers.JsonRpcProvider;
_ethProvider: BaseProvider;
_baseIndexer: BaseIndexer;
_serverConfig: ServerConfig;
_upstreamConfig: UpstreamConfig;
@ -171,7 +171,7 @@ export class Indexer implements IndexerInterface {
},
db: DatabaseInterface,
clients: Clients,
ethProvider: providers.JsonRpcProvider,
ethProvider: BaseProvider,
jobQueue: JobQueue,
graphWatcher?: GraphWatcherInterface
) {
@ -317,10 +317,6 @@ export class Indexer implements IndexerInterface {
return this._storageLayoutMap;
}
get contractMap (): Map<string, ethers.utils.Interface> {
return this._contractMap;
}
get graphWatcher (): GraphWatcher {
return this._graphWatcher;
}
@ -330,17 +326,13 @@ export class Indexer implements IndexerInterface {
await this._baseIndexer.fetchStateStatus();
}
async switchClients (): Promise<void> {
const { ethClient, ethProvider } = await this._baseIndexer.switchClients(initClients);
switchClients ({ ethClient, ethProvider }: { ethClient: EthClient, ethProvider: BaseProvider }): void {
this._ethClient = ethClient;
this._ethProvider = ethProvider;
this._baseIndexer.switchClients({ ethClient, ethProvider });
this._graphWatcher.switchClients({ ethClient, ethProvider });
}
async isGetLogsRequestsSlow (): Promise<boolean> {
return this._baseIndexer.isGetLogsRequestsSlow();
}
async getMetaData (block: BlockHeight): Promise<ResultMeta | null> {
return this._baseIndexer.getMetaData(block);
}
@ -528,27 +520,23 @@ export class Indexer implements IndexerInterface {
console.timeEnd('time:indexer#processBlockAfterEvents-dump_subgraph_state');
}
parseEventNameAndArgs (watchedContracts: Contract[], logObj: any): { eventParsed: boolean, eventDetails: any } {
parseEventNameAndArgs (kind: string, logObj: any): { eventParsed: boolean, eventDetails: any } {
const { topics, data } = logObj;
let logDescription: ethers.utils.LogDescription | undefined;
for (const watchedContract of watchedContracts) {
const contract = this._contractMap.get(watchedContract.kind);
assert(contract);
const contract = this._contractMap.get(kind);
assert(contract);
try {
logDescription = contract.parseLog({ data, topics });
break;
} catch (err) {
// Continue loop only if no matching event found
if (!((err as Error).message.includes('no matching event'))) {
throw err;
}
let logDescription: ethers.utils.LogDescription;
try {
logDescription = contract.parseLog({ data, topics });
} catch (err) {
// Return if no matching event found
if ((err as Error).message.includes('no matching event')) {
log(`WARNING: Skipping event for contract ${kind} as no matching event found in the ABI`);
return { eventParsed: false, eventDetails: {} };
}
}
if (!logDescription) {
return { eventParsed: false, eventDetails: {} };
throw err;
}
const { eventName, eventInfo, eventSignature } = this._baseIndexer.parseEvent(logDescription);
@ -632,10 +620,6 @@ export class Indexer implements IndexerInterface {
return this._baseIndexer.watchContract(address, kind, checkpoint, startingBlock, context);
}
async removeContract (address: string, kind: string): Promise<void> {
return this._baseIndexer.removeContract(address, kind);
}
updateStateStatusMap (address: string, stateStatus: StateStatus): void {
this._baseIndexer.updateStateStatusMap(address, stateStatus);
}
@ -656,8 +640,8 @@ export class Indexer implements IndexerInterface {
return this._baseIndexer.getEventsByFilter(blockHash, contract, name);
}
isContractAddressWatched (address : string): Contract[] | undefined {
return this._baseIndexer.isContractAddressWatched(address);
isWatchedContract (address : string): Contract | undefined {
return this._baseIndexer.isWatchedContract(address);
}
getWatchedContracts (): Contract[] {
@ -676,10 +660,6 @@ export class Indexer implements IndexerInterface {
return this._baseIndexer.getEventsInRange(fromBlockNumber, toBlockNumber, this._serverConfig.gql.maxEventsBlockRange);
}
async getEvents (options: FindManyOptions<Event>): Promise<Array<Event>> {
return this._db.getEvents(options);
}
async getSyncStatus (): Promise<SyncStatus | undefined> {
return this._baseIndexer.getSyncStatus();
}
@ -688,10 +668,6 @@ export class Indexer implements IndexerInterface {
return this._baseIndexer.getBlocks(blockFilter);
}
async getBlockByHash (blockHash?: string): Promise<{ block: any }> {
return this._baseIndexer.getBlockByHash(blockHash);
}
async updateSyncStatusIndexedBlock (blockHash: string, blockNumber: number, force = false): Promise<SyncStatus> {
return this._baseIndexer.updateSyncStatusIndexedBlock(blockHash, blockNumber, force);
}
@ -1572,7 +1548,6 @@ export class Indexer implements IndexerInterface {
});
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
_populateRelationsMap (): void {
this._relationsMap.set(Token, {
pools: {
@ -2303,18 +2278,7 @@ export class Indexer implements IndexerInterface {
assert(blockHash);
assert(blockNumber);
let dbEvents: DeepPartial<Event>[] = [];
let transactions: EthFullTransaction[] = [];
// Fetch events and txs only if subgraph config has any event handlers
if (this._graphWatcher.eventHandlerExists) {
({ events: dbEvents, transactions } = await this._baseIndexer.fetchEvents(
blockHash,
blockNumber,
this.eventSignaturesMap,
this.parseEventNameAndArgs.bind(this)
));
}
const { events: dbEvents, transactions } = await this._baseIndexer.fetchEvents(blockHash, blockNumber, this.eventSignaturesMap, this.parseEventNameAndArgs.bind(this));
const dbTx = await this._db.createTransactionRunner();
try {

View File

@ -10080,7 +10080,7 @@ type Token {
decimals: Int
tokenType: String!
poolCount: BigInt!
pools(where: Pool_filter, orderBy: Pool_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Pool!]!
pools: [Pool!]!
totalSupply: BigInt
txCount: BigInt!
}
@ -10117,12 +10117,12 @@ type Pool {
claimableReservesRemaining: BigDecimal!
burnEpoch: BigInt!
totalAjnaBurned: BigDecimal!
reserveAuctions(where: ReserveAuction_filter, orderBy: ReserveAuction_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [ReserveAuction!]!
reserveAuctions: [ReserveAuction!]!
minDebtAmount: BigDecimal!
actualUtilization: BigDecimal!
targetUtilization: BigDecimal!
totalBondEscrowed: BigDecimal!
liquidationAuctions(where: LiquidationAuction_filter, orderBy: LiquidationAuction_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [LiquidationAuction!]!
liquidationAuctions: [LiquidationAuction!]!
quoteTokenBalance: BigDecimal!
collateralBalance: BigDecimal!
subsetHash: Bytes!
@ -10138,7 +10138,7 @@ type ReserveAuction {
lastTakePrice: BigDecimal!
burnEpoch: BigInt!
kick: ReserveAuctionKick!
takes(where: ReserveAuctionTake_filter, orderBy: ReserveAuctionTake_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [ReserveAuctionTake!]!
takes: [ReserveAuctionTake!]!
ajnaBurned: BigDecimal!
}
@ -10181,9 +10181,9 @@ type LiquidationAuction {
kicker: Bytes!
kick: Kick!
kickTime: BigInt!
takes(where: Take_filter, orderBy: Take_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Take!]!
bucketTakes(where: BucketTake_filter, orderBy: BucketTake_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [BucketTake!]!
settles(where: Settle_filter, orderBy: Settle_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Settle!]!
takes: [Take!]!
bucketTakes: [BucketTake!]!
settles: [Settle!]!
settle: AuctionSettle
settleTime: BigInt
settled: Boolean!
@ -10301,7 +10301,7 @@ type PoolFactory {
id: Bytes!
poolType: String!
poolCount: BigInt!
pools(where: Pool_filter, orderBy: Pool_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Pool!]!
pools: [Pool!]!
txCount: BigInt!
}
@ -10315,8 +10315,8 @@ type Bucket {
collateral: BigDecimal!
deposit: BigDecimal!
lpb: BigDecimal!
lends(where: Lend_filter, orderBy: Lend_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Lend!]!
positionLends(where: PositionLend_filter, orderBy: PositionLend_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [PositionLend!]!
lends: [Lend!]!
positionLends: [PositionLend!]!
}
type Lend {
@ -10343,21 +10343,21 @@ type PositionLend {
type Account {
id: Bytes!
pools(where: Pool_filter, orderBy: Pool_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Pool!]!
kicks(where: Kick_filter, orderBy: Kick_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Kick!]!
lends(where: Lend_filter, orderBy: Lend_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Lend!]!
loans(where: Loan_filter, orderBy: Loan_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Loan!]!
settles(where: Settle_filter, orderBy: Settle_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Settle!]!
takes(where: Take_filter, orderBy: Take_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Take!]!
reserveAuctions(where: ReserveAuction_filter, orderBy: ReserveAuction_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [ReserveAuction!]!
proposalsCreated(where: Proposal_filter, orderBy: Proposal_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Proposal!]!
proposalsExecuted(where: Proposal_filter, orderBy: Proposal_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Proposal!]!
pools: [Pool!]!
kicks: [Kick!]!
lends: [Lend!]!
loans: [Loan!]!
settles: [Settle!]!
takes: [Take!]!
reserveAuctions: [ReserveAuction!]!
proposalsCreated: [Proposal!]!
proposalsExecuted: [Proposal!]!
delegatedTo: Account
delegatedFrom(where: Account_filter, orderBy: Account_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Account!]!
delegatedFrom: [Account!]!
rewardsClaimed: BigDecimal!
distributionPeriodVotes(where: DistributionPeriodVote_filter, orderBy: DistributionPeriodVote_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [DistributionPeriodVote!]!
distributionPeriodVotes: [DistributionPeriodVote!]!
tokensDelegated: BigDecimal!
positions(where: Position_filter, orderBy: Position_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Position!]!
positions: [Position!]!
txCount: BigInt!
}
@ -10372,7 +10372,7 @@ type Proposal {
fundingVotesNegative: BigDecimal!
fundingVotesPositive: BigDecimal!
totalTokensRequested: BigDecimal!
params(where: ProposalParams_filter, orderBy: ProposalParams_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [ProposalParams!]!
params: [ProposalParams!]!
}
type DistributionPeriod {
@ -10381,20 +10381,20 @@ type DistributionPeriod {
startBlock: BigInt!
endBlock: BigInt!
topSlate: FundedSlate
slatesSubmitted(where: FundedSlate_filter, orderBy: FundedSlate_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [FundedSlate!]!
slatesSubmitted: [FundedSlate!]!
fundsAvailable: BigDecimal!
delegationRewardsClaimed: BigDecimal!
fundingVotePowerUsed: BigDecimal!
screeningVotesCast: BigDecimal!
votes(where: DistributionPeriodVote_filter, orderBy: DistributionPeriodVote_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [DistributionPeriodVote!]!
proposals(where: Proposal_filter, orderBy: Proposal_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Proposal!]!
votes: [DistributionPeriodVote!]!
proposals: [Proposal!]!
totalTokensDistributed: BigDecimal!
}
type FundedSlate {
id: Bytes!
distribution: DistributionPeriod!
proposals(where: Proposal_filter, orderBy: Proposal_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [Proposal!]!
proposals: [Proposal!]!
totalTokensRequested: BigDecimal!
totalFundingVotesReceived: BigDecimal!
updateBlock: BigInt!
@ -10408,8 +10408,8 @@ type DistributionPeriodVote {
remainingFundingStageVotingPowerRecordedPostVote: BigDecimal!
initialScreeningStageVotingPowerRecordedPostVote: BigDecimal!
remainingScreeningStageVotingPowerRecordedPostVote: BigDecimal!
screeningVotes(where: ScreeningVote_filter, orderBy: ScreeningVote_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [ScreeningVote!]!
fundingVotes(where: FundingVote_filter, orderBy: FundingVote_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [FundingVote!]!
screeningVotes: [ScreeningVote!]!
fundingVotes: [FundingVote!]!
}
type ScreeningVote {
@ -10418,7 +10418,7 @@ type ScreeningVote {
voter: Account!
proposal: Proposal!
totalVotesCast: BigDecimal!
votesCast(where: VoteCast_filter, orderBy: VoteCast_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [VoteCast!]!
votesCast: [VoteCast!]!
}
type VoteCast {
@ -10440,7 +10440,7 @@ type FundingVote {
proposal: Proposal!
totalVotesCast: BigDecimal!
votingPowerUsed: BigDecimal!
votesCast(where: VoteCast_filter, orderBy: VoteCast_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [VoteCast!]!
votesCast: [VoteCast!]!
}
type ProposalParams {
@ -10455,7 +10455,7 @@ type ProposalParams {
type Position {
id: Bytes!
tokenId: BigInt
indexes(where: PositionLend_filter, orderBy: PositionLend_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [PositionLend!]!
indexes: [PositionLend!]!
owner: Bytes!
pool: Pool!
token: Token!
@ -10480,7 +10480,7 @@ type LPAllowanceList {
pool: Pool!
lender: Bytes!
spender: Bytes!
allowances(where: LPAllowance_filter, orderBy: LPAllowance_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [LPAllowance!]!
allowances: [LPAllowance!]!
}
type AddCollateral {
@ -10797,7 +10797,7 @@ type RedeemPosition {
type GrantFund {
id: Bytes!
treasury: BigDecimal!
distributionPeriods(where: DistributionPeriod_filter, orderBy: DistributionPeriod_orderBy, orderDirection: OrderDirection, first: Int = 100, skip: Int = 0): [DistributionPeriod!]!
distributionPeriods: [DistributionPeriod!]!
totalDelegationRewardsClaimed: BigDecimal!
}

185
yarn.lock
View File

@ -199,10 +199,10 @@
binaryen "101.0.0-nightly.20210723"
long "^4.0.0"
"@cerc-io/cache@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcache/-/0.2.108/cache-0.2.108.tgz#92ed16720bbc542ce5101da5dcd6ad5f82848076"
integrity sha512-oIrIDn5161si5657F0GDyabx8IpUPngur5mplS1vlyVp6SwBzt+rlSM32S26CR0p8kJRwKFEgJDGxU1yxLUcwA==
"@cerc-io/cache@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcache/-/0.2.98/cache-0.2.98.tgz#acbd54b0e3b0379652020f3dac832ed04cf392dc"
integrity sha512-scrDlufZIs0DDehEUL+eaab4Rz2r4G2fgvy2USeY3AnItreXMgUwTUAR7pXqh3FOCuj9crNfysH09Et+49/F/w==
dependencies:
canonical-json "^0.0.4"
debug "^4.3.1"
@ -210,19 +210,19 @@
fs-extra "^10.0.0"
level "^7.0.0"
"@cerc-io/cli@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcli/-/0.2.108/cli-0.2.108.tgz#28dd548114cffbf6bbfa268acafef712236a1948"
integrity sha512-x847X4+6k0JxRDXlkT8xgsBLuF7jDEhlUkEKoihVjQcGPcAAZQ8P1OkkXw56Mo3p/CaoP6oTTsd11CJxuLLN5Q==
"@cerc-io/cli@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fcli/-/0.2.98/cli-0.2.98.tgz#b29046fe48260e3e465c240d0aa64da84ad2338d"
integrity sha512-d79Gm3YOLn+CEidPBHaQhm1zu873O75LnFyH7fbIOubC4cBDWQk+RdH5U+8jU4b54EPZeVRotSoo7rQ5V8HsDg==
dependencies:
"@apollo/client" "^3.7.1"
"@cerc-io/cache" "^0.2.108"
"@cerc-io/ipld-eth-client" "^0.2.108"
"@cerc-io/cache" "^0.2.98"
"@cerc-io/ipld-eth-client" "^0.2.98"
"@cerc-io/libp2p" "^0.42.2-laconic-0.1.4"
"@cerc-io/nitro-node" "^0.1.15"
"@cerc-io/peer" "^0.2.108"
"@cerc-io/rpc-eth-client" "^0.2.108"
"@cerc-io/util" "^0.2.108"
"@cerc-io/peer" "^0.2.98"
"@cerc-io/rpc-eth-client" "^0.2.98"
"@cerc-io/util" "^0.2.98"
"@ethersproject/providers" "^5.4.4"
"@graphql-tools/utils" "^9.1.1"
"@ipld/dag-cbor" "^8.0.0"
@ -243,16 +243,16 @@
typeorm "0.2.37"
yargs "^17.0.1"
"@cerc-io/graph-node@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fgraph-node/-/0.2.108/graph-node-0.2.108.tgz#75e4936e26989e075c1c9fb25e5162e384914a3f"
integrity sha512-sSZHfTtswGDOlMGo//ezCdinpZTqcDCdiLVhxCYL2i86xvmS8lir0ho93jmfqUSomHLNZkMODiwtkli+qW8pUg==
"@cerc-io/graph-node@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fgraph-node/-/0.2.98/graph-node-0.2.98.tgz#06b7eb0feb1e1c4ae4e203b6007b8f0c0ac3c218"
integrity sha512-6PGVnPyRihW1f+yyU2TL61ALnsVN1f5MffmHxiJ+Co02F5t/RP7sfYjJPdT63S+W6mlwpnnmGyX0LuklOXpezQ==
dependencies:
"@apollo/client" "^3.3.19"
"@cerc-io/assemblyscript" "0.19.10-watcher-ts-0.1.2"
"@cerc-io/cache" "^0.2.108"
"@cerc-io/ipld-eth-client" "^0.2.108"
"@cerc-io/util" "^0.2.108"
"@cerc-io/cache" "^0.2.98"
"@cerc-io/ipld-eth-client" "^0.2.98"
"@cerc-io/util" "^0.2.98"
"@types/json-diff" "^0.5.2"
"@types/yargs" "^17.0.0"
bn.js "^4.11.9"
@ -269,14 +269,14 @@
typeorm-naming-strategies "^2.0.0"
yargs "^17.0.1"
"@cerc-io/ipld-eth-client@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fipld-eth-client/-/0.2.108/ipld-eth-client-0.2.108.tgz#455bd5d0cbe129ed266a7377246989d68d85a6a3"
integrity sha512-GwfPaWzhmYhPtu0S2vFQe8w9OTIMD007hhLl6myIsOTdHbVJtGj3RpzXQXmvs9NCpOj66YcFhGJ2YbV52hdUXg==
"@cerc-io/ipld-eth-client@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fipld-eth-client/-/0.2.98/ipld-eth-client-0.2.98.tgz#c1a7128be1e81fb4d1ec9a9888b7e5e94ae710ac"
integrity sha512-qCnz7foqf+9+X/zEGAu5HGXlvzNwahcsKu6Rtreh8bxhR5VTuuF3KrEeFcQeL1Bhv5+w7KXs5I+ivEgo4ZvHSA==
dependencies:
"@apollo/client" "^3.7.1"
"@cerc-io/cache" "^0.2.108"
"@cerc-io/util" "^0.2.108"
"@cerc-io/cache" "^0.2.98"
"@cerc-io/util" "^0.2.98"
cross-fetch "^3.1.4"
debug "^4.3.1"
ethers "^5.4.4"
@ -399,10 +399,10 @@
lodash "^4.17.21"
uint8arrays "^4.0.3"
"@cerc-io/peer@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.108/peer-0.2.108.tgz#327b86581d6750f21bd22105be0ecb39dcde5b6e"
integrity sha512-ywXetDME6JmfPRiOEI6N1R7j2p0Eo0OWbmumeNVuDhmsrkENwFUDu32PsOp3oomBHndgmcFhGQlppPWFxwUggg==
"@cerc-io/peer@^0.2.65":
version "0.2.82"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.82/peer-0.2.82.tgz#e27a1cafd06c25f9c4e02d49d4615f45a76ce22b"
integrity sha512-wKkBXO7hxuN13Av60otDj+2O7nyoogYp+n8uTKNU9cv6J87OLRUZZAuGb5FggUONgDqxS3cyaXD6vqLpkhbbIA==
dependencies:
"@cerc-io/libp2p" "^0.42.2-laconic-0.1.4"
"@cerc-io/prometheus-metrics" "1.1.4"
@ -429,10 +429,10 @@
unique-names-generator "^4.7.1"
yargs "^17.0.1"
"@cerc-io/peer@^0.2.65":
version "0.2.82"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.82/peer-0.2.82.tgz#e27a1cafd06c25f9c4e02d49d4615f45a76ce22b"
integrity sha512-wKkBXO7hxuN13Av60otDj+2O7nyoogYp+n8uTKNU9cv6J87OLRUZZAuGb5FggUONgDqxS3cyaXD6vqLpkhbbIA==
"@cerc-io/peer@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fpeer/-/0.2.98/peer-0.2.98.tgz#650c771be2a3767456f38c93cb86e6667f2867ec"
integrity sha512-b8sCTzFxfTgrlscNutBzML0y4rzkZvzjCpHDEp3P4fMRHIK9SM5o8yYaPS9g1NwoedjbLKCnCDrmaIGpLEbmqA==
dependencies:
"@cerc-io/libp2p" "^0.42.2-laconic-0.1.4"
"@cerc-io/prometheus-metrics" "1.1.4"
@ -471,23 +471,23 @@
it-stream-types "^1.0.4"
promjs "^0.4.2"
"@cerc-io/rpc-eth-client@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Frpc-eth-client/-/0.2.108/rpc-eth-client-0.2.108.tgz#1cc68a9296cd21aa7578b89bea8886b46ef986ed"
integrity sha512-+gVTshn0fvEytYkYqwrrlsSQZadw48+vTWTLCx1tbUpMJkCfzFhj9dbzvYV/1FkTkKmAAbrG05Bf7r2elW5Hqw==
"@cerc-io/rpc-eth-client@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Frpc-eth-client/-/0.2.98/rpc-eth-client-0.2.98.tgz#005546cf25a245e60fa00b0c972239748ac1c29e"
integrity sha512-SjR621w5WxrhLsXyy17mTXo1UwvcPz9QPL4/mwQcwsvzDXoFff1bgxR7UGKInQG5QzGgwTJjAaozVqxQA1X3+g==
dependencies:
"@cerc-io/cache" "^0.2.108"
"@cerc-io/ipld-eth-client" "^0.2.108"
"@cerc-io/util" "^0.2.108"
"@cerc-io/cache" "^0.2.98"
"@cerc-io/ipld-eth-client" "^0.2.98"
"@cerc-io/util" "^0.2.98"
chai "^4.3.4"
ethers "^5.4.4"
left-pad "^1.3.0"
mocha "^8.4.0"
"@cerc-io/solidity-mapper@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fsolidity-mapper/-/0.2.108/solidity-mapper-0.2.108.tgz#6a49da90afdcd096cf75ce8c8a15a97130f931eb"
integrity sha512-bT5X4ySqAwoOzMbN7Q+HgpJWTcTLcg2KHdiEbyFXO9jBA2ByKx2jQoCnb5BkDjvF9yGQ1fUiAv5oSVSw8DF4JA==
"@cerc-io/solidity-mapper@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fsolidity-mapper/-/0.2.98/solidity-mapper-0.2.98.tgz#6fc8dfcaf872e31964a6cca1ea9fbd7900119f8a"
integrity sha512-RmGmcgN0fZEZU0r4q14qPm2hVHUK/OQVPIEgyLEbcStHXupYLaTn79li1WpURI7yeVuJ7mFVaauviWA2DeG7dw==
dependencies:
dotenv "^10.0.0"
@ -496,15 +496,15 @@
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Fts-channel/-/1.0.3-ts-nitro-0.1.1/ts-channel-1.0.3-ts-nitro-0.1.1.tgz#0768781313a167295c0bf21307f47e02dc17e936"
integrity sha512-2jFICUSyffuZ+8+qRhXuLSJq4GJ6Y02wxiXoubH0Kzv2lIKkJtWICY1ZQQhtXAvP0ncAQB85WJHqtqwH8l7J3Q==
"@cerc-io/util@^0.2.108":
version "0.2.108"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Futil/-/0.2.108/util-0.2.108.tgz#411aa58ca4694d38b13d8e619cf9707e3b50e073"
integrity sha512-ZslsRMaJ1EiDjy7GpK6iHjzq8a69QTzJe2TIeQBbWXRlsvZ2/Qca8Y39BzfVbgZ6cgnh+hclzwprtitzrqPvwQ==
"@cerc-io/util@^0.2.98":
version "0.2.98"
resolved "https://git.vdb.to/api/packages/cerc-io/npm/%40cerc-io%2Futil/-/0.2.98/util-0.2.98.tgz#0bed961a20d43c8973d5b86b400086caa76d2d0a"
integrity sha512-s1St/bD9OjD3NIfx3gj1tDELgpiyxGl6le3mCs77jHM4KbEHW7pFjhe/5YsLXRvc5cIHwNsrCdOuSAIyVUtC2Q==
dependencies:
"@apollo/utils.keyvaluecache" "^1.0.1"
"@cerc-io/nitro-node" "^0.1.15"
"@cerc-io/peer" "^0.2.108"
"@cerc-io/solidity-mapper" "^0.2.108"
"@cerc-io/peer" "^0.2.98"
"@cerc-io/solidity-mapper" "^0.2.98"
"@cerc-io/ts-channel" "1.0.3-ts-nitro-0.1.1"
"@ethersproject/properties" "^5.7.0"
"@ethersproject/providers" "^5.4.4"
@ -533,7 +533,6 @@
it-length-prefixed "^8.0.4"
it-pipe "^2.0.5"
it-pushable "^3.1.2"
jayson "^4.1.2"
js-yaml "^4.1.0"
json-bigint "^1.0.0"
lodash "^4.17.21"
@ -2122,7 +2121,7 @@
"@types/connect" "*"
"@types/node" "*"
"@types/connect@*", "@types/connect@^3.4.33":
"@types/connect@*":
version "3.4.38"
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858"
integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==
@ -2246,11 +2245,6 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==
"@types/node@^12.12.54":
version "12.20.55"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240"
integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
"@types/normalize-package-data@^2.4.3":
version "2.4.4"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
@ -2293,13 +2287,6 @@
resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c"
integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==
"@types/ws@^7.4.4":
version "7.4.7"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702"
integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==
dependencies:
"@types/node" "*"
"@types/yargs-parser@*":
version "21.0.3"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
@ -2446,14 +2433,6 @@
dependencies:
tslib "^2.3.0"
JSONStream@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
dependencies:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
abortable-iterator@^4.0.2:
version "4.0.3"
resolved "https://registry.yarnpkg.com/abortable-iterator/-/abortable-iterator-4.0.3.tgz#432570d8256dbad2cef4f129312b651c5ffcdd0f"
@ -3684,18 +3663,6 @@ es5-ext@0.8.x:
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.8.2.tgz#aba8d9e1943a895ac96837a62a39b3f55ecd94ab"
integrity sha512-H19ompyhnKiBdjHR1DPHvf5RHgHPmJaY9JNzFGbMbPgdsUkvnUCN1Ke8J4Y0IMyTwFM2M9l4h2GoHwzwpSmXbA==
es6-promise@^4.0.3:
version "4.2.8"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==
dependencies:
es6-promise "^4.0.3"
escalade@^3.1.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
@ -4039,11 +4006,6 @@ express@^4.18.2:
utils-merge "1.0.1"
vary "~1.1.2"
eyes@^0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@ -5034,11 +4996,6 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
isomorphic-ws@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
it-all@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335"
@ -5268,24 +5225,6 @@ iterall@^1.3.0:
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
jayson@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.2.tgz#443c26a8658703e0b2e881117b09395d88b6982e"
integrity sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==
dependencies:
"@types/connect" "^3.4.33"
"@types/node" "^12.12.54"
"@types/ws" "^7.4.4"
JSONStream "^1.3.5"
commander "^2.20.3"
delay "^5.0.0"
es6-promisify "^5.0.0"
eyes "^0.1.8"
isomorphic-ws "^4.0.1"
json-stringify-safe "^5.0.1"
uuid "^8.3.2"
ws "^7.5.10"
js-sha3@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
@ -5346,11 +5285,6 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
json-stringify-safe@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
json5@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
@ -5367,11 +5301,6 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==
keyv@^4.5.3:
version "4.5.4"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
@ -7152,11 +7081,6 @@ through2@^2.0.1:
readable-stream "~2.3.6"
xtend "~4.0.1"
"through@>=2.2.7 <3":
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
timeout-abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz#dd57ffca041652c03769904f8d95afd93fb95595"
@ -7656,11 +7580,6 @@ ws@7.4.6:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
ws@^7.5.10:
version "7.5.10"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
ws@^8.11.0, ws@^8.12.1, ws@^8.4.0:
version "8.16.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"