diff --git a/README.md b/README.md
index 6d758e3..a9c131b 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,7 @@
## Intro to monorepo
The monorepo consists of three main parts:
+
* [Contracts](packages/contracts)
* [Dapp](packages/dapp)
* [Subgraphs](packages/subgraphs)
@@ -18,10 +19,10 @@ pnpm lint
## Deployed contracts and EAS schemas
-### EESCore deployed contracts:
+### EESCore deployed contracts
* Mainnet: TODO
-* Base: TODO
+* Base: [0x6BbcC7D0E661a4f5441F74Dc0Ab324ac4327D940](https://basescan.org/address/0x6bbcc7d0e661a4f5441f74dc0ab324ac4327d940)
* Sepolia: [0x306aa8b6640A4Ef12919Ed97b5d85c006DD68796](https://sepolia.etherscan.io/address/0x306aa8b6640A4Ef12919Ed97b5d85c006DD68796)
* Base Sepolia: [0x63F610a03Caa82ca32386BDb6F447a93d4D6F6e7](https://sepolia.basescan.org/address/0x63F610a03Caa82ca32386BDb6F447a93d4D6F6e7)
diff --git a/packages/contracts/scripts/deployCore.ts b/packages/contracts/scripts/deployCore.ts
index 313fdec..b1c2bcf 100644
--- a/packages/contracts/scripts/deployCore.ts
+++ b/packages/contracts/scripts/deployCore.ts
@@ -13,7 +13,7 @@ const networkToSchemaUid = {
mainnet: 'not-yet-deployed',
sepolia: '0x28bb35c3774b2963e8703dccbe93a3d1620ddf91ee3eee4678cdb8fb8e1a8bbb',
local: '0x28bb35c3774b2963e8703dccbe93a3d1620ddf91ee3eee4678cdb8fb8e1a8bbb',
- base: 'not-yet-deployed',
+ base: '0xc15bb007fcd98a5a99c0fd98286fba2f62f997de62c11ea24dfd30d274eef99f',
baseSepolia:
'0xc15bb007fcd98a5a99c0fd98286fba2f62f997de62c11ea24dfd30d274eef99f',
};
@@ -44,12 +44,12 @@ async function main() {
);
await deployment.waitForDeployment();
+ console.log('EESCore deployed to: ', await deployment.getAddress());
if (hre.network.name !== 'local') {
await run('verify:verify', {
address: await deployment.getAddress(),
});
}
- console.log('EESCore deployed to: ', await deployment.getAddress());
}
main().catch((error) => {
diff --git a/packages/dapp/.env.example b/packages/dapp/.env.example
index 5e61eaf..f362191 100644
--- a/packages/dapp/.env.example
+++ b/packages/dapp/.env.example
@@ -1,7 +1,12 @@
-# GraphQL API endpoints
-NEXT_PUBLIC_EES_BASE_GRAPHQL_ENDPOINT=
-NEXT_PUBLIC_EES_BASE_SEPOLIA_GRAPHQL_ENDPOINT=
-NEXT_PUBLIC_EES_SEPOLIA_GRAPHQL_ENDPOINT=
+# GraphQL API endpoints (Alchemy + The Graph Network)
+# Alchemy
+EES_BASE_GRAPHQL_ENDPOINT_ALCHEMY=
+EES_BASE_SEPOLIA_GRAPHQL_ENDPOINT_ALCHEMY=
+EES_SEPOLIA_GRAPHQL_ENDPOINT_ALCHEMY=
+# Graph network
+EES_BASE_GRAPHQL_ENDPOINT_GRAPH_NETWORK=
+EES_BASE_SEPOLIA_GRAPHQL_ENDPOINT_GRAPH_NETWORK=
+EES_SEPOLIA_GRAPHQL_ENDPOINT_GRAPH_NETWORK=
# Coinbase API Secrets
COINBASE_API_KEY_NAME=
@@ -14,3 +19,11 @@ NEXT_PUBLIC_APP_ENV=
NEXT_PUBLIC_BASE_ENDPOINT=
NEXT_PUBLIC_BASE_SEPOLIA_ENDPOINT=
NEXT_PUBLIC_SEPOLIA_ENDPOINT=
+
+# Airstack
+AIRSTACK_API_URL=
+AIRSTACK_API_KEY=
+
+# Next.js Vercel
+# Should be only set for local development, on Vercel it will be set automatically
+NEXT_PUBLIC_VERCEL_PROJECT_PRODUCTION_URL=
diff --git a/packages/dapp/codegen.ts b/packages/dapp/codegen.ts
index b6a007a..6f40919 100644
--- a/packages/dapp/codegen.ts
+++ b/packages/dapp/codegen.ts
@@ -2,22 +2,38 @@ import type { CodegenConfig } from '@graphql-codegen/cli';
const config: CodegenConfig = {
generates: {
- './src/__generated__/eas/': {
- documents: './src/lib/graphql/eas/**/*.graphql',
- schema: 'https://base.easscan.org/graphql',
+ // './src/__generated__/eas/': {
+ // documents: './src/lib/graphql/eas/**/*.graphql',
+ // schema: 'https://base.easscan.org/graphql',
+ // preset: 'client',
+ // plugins: [],
+ // presetConfig: {
+ // gqlTagName: 'gqlEAS',
+ // },
+ // },
+ './src/__generated__/ees/': {
+ documents: './src/lib/graphql/ees/**/*.graphql',
+ config: {
+ documentMode: 'string',
+ },
+ schema:
+ 'https://subgraph.satsuma-prod.com/9c8dcc2edf3c/martins-team--780110/ees-sepolia/api',
preset: 'client',
plugins: [],
presetConfig: {
- gqlTagName: 'gqlEAS',
+ gqlTagName: 'gqlEES',
},
},
- './src/__generated__/ees/': {
- documents: './src/lib/graphql/ees/**/*.graphql',
- schema: 'http://0.0.0.0:8000/subgraphs/name/ees',
+ './src/__generated__/airstack/': {
+ documents: './src/lib/graphql/airstack/**/*.graphql',
+ config: {
+ documentMode: 'string',
+ },
+ schema: 'https://api.airstack.xyz/graphql',
preset: 'client',
plugins: [],
presetConfig: {
- gqlTagName: 'gqlEES',
+ gqlTagName: 'gqlAirstack',
},
},
},
diff --git a/packages/dapp/next.config.js b/packages/dapp/next.config.js
index aa0a379..2267cb3 100644
--- a/packages/dapp/next.config.js
+++ b/packages/dapp/next.config.js
@@ -1,5 +1,10 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
+ logging: {
+ fetches: {
+ fullUrl: true,
+ },
+ },
images: {
remotePatterns: [
{
diff --git a/packages/dapp/package.json b/packages/dapp/package.json
index 1b95ee6..88c490b 100644
--- a/packages/dapp/package.json
+++ b/packages/dapp/package.json
@@ -27,17 +27,20 @@
"@rainbow-me/rainbowkit": "^2.1.2",
"@tanstack/react-query": "5.40.0",
"@tanstack/react-query-devtools": "^5.40.0",
+ "@vercel/analytics": "^1.3.1",
+ "@vercel/speed-insights": "^1.0.11",
"@wagmi/core": "^2.10.5",
+ "blo": "^1.2.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cmdk": "^1.0.0",
"framer-motion": "^11.2.10",
"jsonwebtoken": "^9.0.2",
"lucide-react": "^0.381.0",
- "next": "14.2.3",
+ "next": "14.3.0-canary.87",
"next-themes": "^0.3.0",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
+ "react": "19.0.0-rc.0",
+ "react-dom": "19.0.0-rc.0",
"react-inlinesvg": "^4.1.3",
"react-share": "^5.1.0",
"react-use": "^17.5.0",
diff --git a/packages/dapp/public/endorse.png b/packages/dapp/public/endorse.png
new file mode 100644
index 0000000..aa5d71c
Binary files /dev/null and b/packages/dapp/public/endorse.png differ
diff --git a/packages/dapp/public/icons/icon-gas.svg b/packages/dapp/public/icons/icon-gas.svg
new file mode 100644
index 0000000..cf51997
--- /dev/null
+++ b/packages/dapp/public/icons/icon-gas.svg
@@ -0,0 +1,14 @@
+
diff --git a/packages/dapp/src/__generated__/airstack/fragment-masking.ts b/packages/dapp/src/__generated__/airstack/fragment-masking.ts
new file mode 100644
index 0000000..cca7098
--- /dev/null
+++ b/packages/dapp/src/__generated__/airstack/fragment-masking.ts
@@ -0,0 +1,63 @@
+/* eslint-disable */
+import { ResultOf, DocumentTypeDecoration } from '@graphql-typed-document-node/core';
+import { Incremental, TypedDocumentString } from './graphql';
+
+
+export type FragmentType> = TDocumentType extends DocumentTypeDecoration<
+ infer TType,
+ any
+>
+ ? [TType] extends [{ ' $fragmentName'?: infer TKey }]
+ ? TKey extends string
+ ? { ' $fragmentRefs'?: { [key in TKey]: TType } }
+ : never
+ : never
+ : never;
+
+// return non-nullable if `fragmentType` is non-nullable
+export function useFragment(
+ _documentNode: DocumentTypeDecoration,
+ fragmentType: FragmentType>
+): TType;
+// return nullable if `fragmentType` is nullable
+export function useFragment(
+ _documentNode: DocumentTypeDecoration,
+ fragmentType: FragmentType> | null | undefined
+): TType | null | undefined;
+// return array of non-nullable if `fragmentType` is array of non-nullable
+export function useFragment(
+ _documentNode: DocumentTypeDecoration,
+ fragmentType: ReadonlyArray>>
+): ReadonlyArray;
+// return array of nullable if `fragmentType` is array of nullable
+export function useFragment(
+ _documentNode: DocumentTypeDecoration,
+ fragmentType: ReadonlyArray>> | null | undefined
+): ReadonlyArray | null | undefined;
+export function useFragment(
+ _documentNode: DocumentTypeDecoration,
+ fragmentType: FragmentType> | ReadonlyArray>> | null | undefined
+): TType | ReadonlyArray | null | undefined {
+ return fragmentType as any;
+}
+
+
+export function makeFragmentData<
+ F extends DocumentTypeDecoration,
+ FT extends ResultOf
+>(data: FT, _fragment: F): FragmentType {
+ return data as FragmentType;
+}
+export function isFragmentReady(
+ queryNode: TypedDocumentString,
+ fragmentNode: TypedDocumentString,
+ data: FragmentType, any>> | null | undefined
+): data is FragmentType {
+ const deferredFields = queryNode.__meta__?.deferredFields as Record;
+ const fragName = fragmentNode.__meta__?.fragmentName as string | undefined;
+
+ if (!deferredFields || !fragName) return true;
+
+ const fields = deferredFields[fragName] ?? [];
+ return fields.length > 0 && fields.every(field => data && field in data);
+}
diff --git a/packages/dapp/src/__generated__/airstack/gql.ts b/packages/dapp/src/__generated__/airstack/gql.ts
new file mode 100644
index 0000000..6039a00
--- /dev/null
+++ b/packages/dapp/src/__generated__/airstack/gql.ts
@@ -0,0 +1,48 @@
+/* eslint-disable */
+import * as types from './graphql';
+
+
+
+/**
+ * Map of all GraphQL operations in the project.
+ *
+ * This map has several performance disadvantages:
+ * 1. It is not tree-shakeable, so it will include all operations in the project.
+ * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
+ * 3. It does not support dead code elimination, so it will add unused operations.
+ *
+ * Therefore it is highly recommended to use the babel or swc plugin for production.
+ */
+const documents = {
+ "query GetMinimalProfileFromAddress($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n primaryDomain {\n name\n avatar\n tokenNft {\n contentValue {\n image {\n small\n }\n }\n }\n }\n }\n farcasterSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: farcaster}}, blockchain: ethereum, order: {followerCount: DESC}, limit: 1}\n ) {\n Social {\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n lensSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: lens}}, blockchain: ethereum, order: {followerCount: DESC}, limit: 1}\n ) {\n Social {\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}": types.GetMinimalProfileFromAddressDocument,
+ "query GetProfileFromEns($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n addresses\n primaryDomain {\n name\n avatar\n tokenNft {\n contentValue {\n image {\n small\n }\n }\n }\n }\n }\n}": types.GetProfileFromEnsDocument,
+ "query GetProfileFromFarcaster($identity: Identity!) {\n farcasterSocials: Socials(\n input: {limit: 1, filter: {identity: {_eq: $identity}, dappName: {_eq: farcaster}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n connectedAddresses {\n address\n }\n userAddress\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}": types.GetProfileFromFarcasterDocument,
+ "query GetProfileFromLens($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n addresses\n }\n lensSocials: Socials(\n input: {limit: 1, filter: {identity: {_eq: $identity}, dappName: {_eq: lens}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}": types.GetProfileFromLensDocument,
+ "query GetProfileInfo($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n addresses\n primaryDomain {\n name\n avatar\n tokenNft {\n contentValue {\n image {\n small\n }\n }\n }\n }\n }\n farcasterSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: farcaster}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n connectedAddresses {\n address\n }\n userAddress\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n lensSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: lens}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}": types.GetProfileInfoDocument,
+};
+
+/**
+ * The gqlAirstack function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function gqlAirstack(source: "query GetMinimalProfileFromAddress($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n primaryDomain {\n name\n avatar\n tokenNft {\n contentValue {\n image {\n small\n }\n }\n }\n }\n }\n farcasterSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: farcaster}}, blockchain: ethereum, order: {followerCount: DESC}, limit: 1}\n ) {\n Social {\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n lensSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: lens}}, blockchain: ethereum, order: {followerCount: DESC}, limit: 1}\n ) {\n Social {\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}"): typeof import('./graphql').GetMinimalProfileFromAddressDocument;
+/**
+ * The gqlAirstack function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function gqlAirstack(source: "query GetProfileFromEns($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n addresses\n primaryDomain {\n name\n avatar\n tokenNft {\n contentValue {\n image {\n small\n }\n }\n }\n }\n }\n}"): typeof import('./graphql').GetProfileFromEnsDocument;
+/**
+ * The gqlAirstack function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function gqlAirstack(source: "query GetProfileFromFarcaster($identity: Identity!) {\n farcasterSocials: Socials(\n input: {limit: 1, filter: {identity: {_eq: $identity}, dappName: {_eq: farcaster}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n connectedAddresses {\n address\n }\n userAddress\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}"): typeof import('./graphql').GetProfileFromFarcasterDocument;
+/**
+ * The gqlAirstack function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function gqlAirstack(source: "query GetProfileFromLens($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n addresses\n }\n lensSocials: Socials(\n input: {limit: 1, filter: {identity: {_eq: $identity}, dappName: {_eq: lens}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}"): typeof import('./graphql').GetProfileFromLensDocument;
+/**
+ * The gqlAirstack function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
+ */
+export function gqlAirstack(source: "query GetProfileInfo($identity: Identity!) {\n Wallet(input: {identity: $identity, blockchain: ethereum}) {\n addresses\n primaryDomain {\n name\n avatar\n tokenNft {\n contentValue {\n image {\n small\n }\n }\n }\n }\n }\n farcasterSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: farcaster}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n connectedAddresses {\n address\n }\n userAddress\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n lensSocials: Socials(\n input: {filter: {identity: {_eq: $identity}, dappName: {_eq: lens}}, blockchain: ethereum, order: {followerCount: DESC}}\n ) {\n Social {\n profileName\n profileDisplayName\n profileHandle\n profileBio\n profileImageContentValue {\n image {\n small\n }\n }\n }\n }\n}"): typeof import('./graphql').GetProfileInfoDocument;
+
+
+export function gqlAirstack(source: string) {
+ return (documents as any)[source] ?? {};
+}
diff --git a/packages/dapp/src/__generated__/airstack/graphql.ts b/packages/dapp/src/__generated__/airstack/graphql.ts
new file mode 100644
index 0000000..40b4a9c
--- /dev/null
+++ b/packages/dapp/src/__generated__/airstack/graphql.ts
@@ -0,0 +1,2520 @@
+/* eslint-disable */
+import { DocumentTypeDecoration } from '@graphql-typed-document-node/core';
+export type Maybe = T | null;
+export type InputMaybe = Maybe;
+export type Exact = { [K in keyof T]: T[K] };
+export type MakeOptional = Omit & { [SubKey in K]?: Maybe };
+export type MakeMaybe = Omit & { [SubKey in K]: Maybe };
+export type MakeEmpty = { [_ in K]?: never };
+export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };
+/** All built-in and custom scalars, mapped to their actual values */
+export type Scalars = {
+ ID: { input: string; output: string; }
+ String: { input: string; output: string; }
+ Boolean: { input: boolean; output: boolean; }
+ Int: { input: number; output: number; }
+ Float: { input: number; output: number; }
+ Address: { input: any; output: any; }
+ Any: { input: any; output: any; }
+ DateRange: { input: any; output: any; }
+ Identity: { input: any; output: any; }
+ IntString: { input: any; output: any; }
+ Map: { input: any; output: any; }
+ Range: { input: any; output: any; }
+ Time: { input: any; output: any; }
+ TimeRange: { input: any; output: any; }
+};
+
+/** Represents on-chain smart contract account */
+export type Account = {
+ __typename?: 'Account';
+ /** Nested query - on-chain wallet related information, including address, domains, social profile, other token balances, and transfer history */
+ address: Wallet;
+ /** Blockchain where account is created */
+ blockchain?: Maybe;
+ /** Block number of the account creation transaction */
+ createdAtBlockNumber?: Maybe;
+ /** Block timestamp of the account creation transaction */
+ createdAtBlockTimestamp?: Maybe;
+ /** Transaction Hash of the account creation transaction */
+ creationTransactionHash?: Maybe;
+ /** Address of deployer */
+ deployer?: Maybe;
+ /** Airstack unique identifier for the account */
+ id: Scalars['ID']['output'];
+ /** ERC6551 standard : Implementation address of on chain smart contract account */
+ implementation?: Maybe;
+ /** Token NFT associated with erc-6551 */
+ nft?: Maybe;
+ /** ERC6551 standard : Registry used to deploy smart contract wallet */
+ registry?: Maybe;
+ /** ERC6551 standard salt for account creation */
+ salt?: Maybe;
+ /** Standard of account- ERC6551, Safe etc */
+ standard: AccountStandard;
+ /** ERC6551 standard: Address of ERC721 token */
+ tokenAddress?: Maybe;
+ /** ERC6551 standard: tokenId of ERC721 token */
+ tokenId?: Maybe;
+ /** Block number of the account updation transaction */
+ updatedAtBlockNumber?: Maybe;
+ /** Block timestamp of the account updation transaction */
+ updatedAtBlockTimestamp?: Maybe;
+};
+
+export type AccountFilter = {
+ address?: InputMaybe;
+ createdAtBlockTimestamp?: InputMaybe;
+ implementation?: InputMaybe;
+ registry?: InputMaybe;
+ salt?: InputMaybe;
+ standard?: InputMaybe;
+ tokenAddress?: InputMaybe;
+ tokenId?: InputMaybe;
+};
+
+export type AccountOrderBy = {
+ createdAtBlockTimestamp?: InputMaybe;
+};
+
+export enum AccountStandard {
+ Erc6551 = 'ERC6551'
+}
+
+export type AccountStandard_Comparator_Exp = {
+ _eq?: InputMaybe;
+ _in?: InputMaybe>;
+};
+
+export type AccountsInput = {
+ blockchain: TokenBlockchain;
+ cursor?: InputMaybe;
+ filter?: InputMaybe;
+ limit?: InputMaybe;
+ order?: InputMaybe>;
+};
+
+export type AccountsNestedInput = {
+ blockchain?: InputMaybe;
+ filter?: InputMaybe;
+ limit?: InputMaybe;
+ order?: InputMaybe>>;
+ showOptimisticAddress?: InputMaybe;
+};
+
+export type AccountsOutput = {
+ __typename?: 'AccountsOutput';
+ Account?: Maybe>;
+ pageInfo?: Maybe;
+};
+
+export type Address_Comparator_Exp = {
+ _eq?: InputMaybe;
+ _in?: InputMaybe>;
+ _ne?: InputMaybe;
+ _nin?: InputMaybe>;
+};
+
+export type AnimationUrlVariants = {
+ __typename?: 'AnimationUrlVariants';
+ original?: Maybe;
+};
+
+export enum Audience {
+ All = 'all',
+ Farcaster = 'farcaster'
+}
+
+export type AudioVariants = {
+ __typename?: 'AudioVariants';
+ original?: Maybe;
+};
+
+export enum Blockchain {
+ Ethereum = 'ethereum'
+}
+
+export type Boolean_Comparator_Exp = {
+ _eq?: InputMaybe;
+};
+
+export type ConnectedAddress = {
+ __typename?: 'ConnectedAddress';
+ address?: Maybe;
+ blockchain?: Maybe;
+ chainId?: Maybe;
+ timestamp?: Maybe;
+};
+
+export type ContractMetadata = {
+ __typename?: 'ContractMetadata';
+ /** Description of the token, mirrored from the smart contract */
+ description?: Maybe;
+ externalLink?: Maybe;
+ /** Royalties recipient address, mirrored from the smart contract */
+ feeRecipient?: Maybe;
+ image?: Maybe;
+ /** Name of the token, mirrored from the smart contract */
+ name?: Maybe;
+ sellerFeeBasisPoints?: Maybe;
+};
+
+export type Date_Range_Comparator_Exp = {
+ _eq?: InputMaybe;
+};
+
+export type Domain = {
+ __typename?: 'Domain';
+ /** Avatar of the domain */
+ avatar?: Maybe;
+ /** Blockchain where the NFT sale took place */
+ blockchain: Blockchain;
+ /** Unique identifier for the blockchain */
+ chainId?: Maybe;
+ /** Block number when the domain was created */
+ createdAtBlockNumber?: Maybe;
+ /** Timestamp when the domain was created */
+ createdAtBlockTimestamp?: Maybe;
+ /** DApp name associated with the domain (e.g. ENS) */
+ dappName?: Maybe;
+ /** DApp slug (contract version) associated with the domain */
+ dappSlug?: Maybe;
+ /** Timestamp when the domain registration expires */
+ expiryTimestamp?: Maybe;
+ /** Domain registration cost in decimals */
+ formattedRegistrationCost?: Maybe;
+ /** Domain registration cost in native blockchain token in decimals */
+ formattedRegistrationCostInNativeToken?: Maybe;
+ /** Domain registration cost in USDC in decimals */
+ formattedRegistrationCostInUSDC?: Maybe;
+ /** Airstack unique identifier for the data point */
+ id?: Maybe;
+ /** Domain is name wrapped or not */
+ isNameWrapped?: Maybe;
+ /** Indicates if the domain is set to be primary - true or false */
+ isPrimary?: Maybe;
+ /** Airstack unique domain hash */
+ labelHash?: Maybe;
+ /** Domain name without the domain ending, e.g. vitalik instead of vitalik.eth */
+ labelName?: Maybe;
+ /** Block number when the domain was last updated */
+ lastUpdatedBlockNumber?: Maybe;
+ /** Timestamp when the domain was last updated */
+ lastUpdatedBlockTimestamp?: Maybe;
+ /** Manager of Domain */
+ manager: Scalars['Address']['output'];
+ /** Manager wallet related information, including address, domains, social profile, other token balances, and transfer history */
+ managerDetails?: Maybe;
+ /** Multichain associated with the domain */
+ multiChainAddresses?: Maybe>;
+ /** Full domain name, e.g. vitalik.eth */
+ name?: Maybe;
+ /** Owner of token associated with the domain */
+ owner: Scalars['Address']['output'];
+ /** Owner wallet related information, including address, domains, social profile, other token balances, and transfer history */
+ ownerDetails?: Maybe;
+ /** Parent domain name, if the entity is a subdomain */
+ parent?: Maybe;
+ /** Nested query - can retrieve payment token data (name, symbol, etc.) */
+ paymentToken?: Maybe;
+ /** payment amount in blockchain native token for the domain */
+ paymentTokenCostInNativeToken?: Maybe;
+ /** payment amount in USDC for the domain */
+ paymentTokenCostInUSDC?: Maybe;
+ /** Domain registration cost */
+ registrationCost?: Maybe;
+ /** Domain registration cost in blockchain native token */
+ registrationCostInNativeToken?: Maybe;
+ /** Domain registration cost in USDC */
+ registrationCostInUSDC?: Maybe;
+ /** Blockchain address to which the domain is resolved */
+ resolvedAddress?: Maybe;
+ /** Nested query - on-chain resolvedAddress wallet related information, including address, domains, social profile, other token balances, and transfer history */
+ resolvedAddressDetails?: Maybe;
+ /** Resolver address associated with Domain */
+ resolverAddress?: Maybe;
+ /** Count of subdomains linked to the domain */
+ subDomainCount?: Maybe;
+ /** Nested query allowing to retrieve subdomain information associated with the domain */
+ subDomains?: Maybe>>;
+ /** Texts associated with the domain */
+ texts?: Maybe>;
+ /** Token Address associated with the domain, if applicable */
+ tokenAddress: Scalars['Address']['output'];
+ /** Domain Token ID associated with the domain, if applicable */
+ tokenId?: Maybe;
+ /** Token nft associated with the domain, if applicable */
+ tokenNft?: Maybe;
+ /** Time-to-live value for the domain */
+ ttl?: Maybe;
+};
+
+
+export type DomainSubDomainsArgs = {
+ input?: InputMaybe;
+};
+
+export enum DomainDappName {
+ Ens = 'ens'
+}
+
+export type DomainDappName_Comparator_Exp = {
+ _eq?: InputMaybe;
+ _in?: InputMaybe>;
+};
+
+export enum DomainDappSlug {
+ EnsV1 = 'ens_v1'
+}
+
+export type DomainDappSlug_Comparator_Exp = {
+ _eq?: InputMaybe;
+ _in?: InputMaybe>;
+};
+
+export type DomainFilter = {
+ isPrimary?: InputMaybe;
+ lastUpdatedBlockTimestamp?: InputMaybe;
+ name?: InputMaybe;
+ owner?: InputMaybe;
+ resolvedAddress?: InputMaybe;
+};
+
+export type DomainMultiChainAddress = {
+ __typename?: 'DomainMultiChainAddress';
+ /** address */
+ address?: Maybe;
+ /** symbol according to SLIP-0044 */
+ symbol?: Maybe;
+};
+
+export type DomainOrderBy = {
+ createdAtBlockTimestamp?: InputMaybe;
+ expiryTimestamp?: InputMaybe;
+ lastUpdatedBlockTimestamp?: InputMaybe;
+};
+
+export type DomainTexts = {
+ __typename?: 'DomainTexts';
+ /** key of the text */
+ key?: Maybe;
+ /** value of the text */
+ value?: Maybe;
+};
+
+export type DomainsInput = {
+ blockchain: Blockchain;
+ cursor?: InputMaybe;
+ filter: DomainFilter;
+ limit?: InputMaybe;
+ order?: InputMaybe>;
+};
+
+export type DomainsNestedInput = {
+ blockchain?: InputMaybe;
+ filter?: InputMaybe;
+ limit?: InputMaybe;
+ order?: InputMaybe>>;
+};
+
+export type DomainsOutput = {
+ __typename?: 'DomainsOutput';
+ Domain?: Maybe>;
+ pageInfo?: Maybe;
+};
+
+export enum EveryBlockchain {
+ All = 'ALL'
+}
+
+export type FarcasterCast = {
+ __typename?: 'FarcasterCast';
+ castedAtTimestamp?: Maybe;
+ castedBy?: Maybe;
+ channel?: Maybe;
+ embeds?: Maybe>>;
+ fid?: Maybe;
+ frame?: Maybe;
+ hash?: Maybe;
+ id?: Maybe;
+ mentions?: Maybe>;
+ numberOfLikes?: Maybe;
+ numberOfRecasts?: Maybe;
+ numberOfReplies?: Maybe;
+ parentCast?: Maybe;
+ parentFid?: Maybe;
+ parentHash?: Maybe;
+ quotedCast?: Maybe>>;
+ rawText?: Maybe;
+ rootParentUrl?: Maybe;
+ socialCapitalValue?: Maybe;
+ text?: Maybe;
+ url?: Maybe;
+};
+
+export type FarcasterCastFilter = {
+ castedAtTimestamp?: InputMaybe;
+ castedBy?: InputMaybe;
+ frameUrl?: InputMaybe;
+ hasEmbeds?: InputMaybe;
+ hasFrames?: InputMaybe;
+ hasMentions?: InputMaybe;
+ hash?: InputMaybe;
+ rootParentUrl?: InputMaybe;
+ url?: InputMaybe;
+};
+
+export type FarcasterCastInput = {
+ blockchain: EveryBlockchain;
+ cursor?: InputMaybe;
+ filter: FarcasterCastFilter;
+ limit?: InputMaybe;
+};
+
+export type FarcasterCastOutput = {
+ __typename?: 'FarcasterCastOutput';
+ Cast?: Maybe>;
+ pageInfo?: Maybe;
+};
+
+export type FarcasterChannel = {
+ __typename?: 'FarcasterChannel';
+ channelId: Scalars['String']['output'];
+ createdAtTimestamp: Scalars['Time']['output'];
+ dappName: Scalars['String']['output'];
+ dappSlug: Scalars['String']['output'];
+ description: Scalars['String']['output'];
+ followerCount?: Maybe;
+ /** Airstack unique identifier for the data point */
+ id: Scalars['ID']['output'];
+ imageUrl: Scalars['String']['output'];
+ isModerationEnabled?: Maybe;
+ leadIds?: Maybe>;
+ leadProfiles?: Maybe>;
+ moderatorIds?: Maybe>;
+ moderatorProfiles?: Maybe>;
+ name: Scalars['String']['output'];
+ participants?: Maybe>;
+ url: Scalars['String']['output'];
+};
+
+
+export type FarcasterChannelLeadProfilesArgs = {
+ input?: InputMaybe;
+};
+
+
+export type FarcasterChannelModeratorProfilesArgs = {
+ input?: InputMaybe;
+};
+
+
+export type FarcasterChannelParticipantsArgs = {
+ input?: InputMaybe;
+};
+
+export enum FarcasterChannelActionType {
+ Cast = 'cast',
+ Follow = 'follow',
+ Reply = 'reply'
+}
+
+export type FarcasterChannelActionType_Comparator_Exp = {
+ _eq?: InputMaybe;
+ _in?: InputMaybe>;
+};
+
+export type FarcasterChannelFilter = {
+ channelId?: InputMaybe;
+ createdAtTimestamp?: InputMaybe;
+ leadId?: InputMaybe;
+ leadIdentity?: InputMaybe;
+ moderatorId?: InputMaybe;
+ moderatorIdentity?: InputMaybe;
+ name?: InputMaybe;
+};
+
+export type FarcasterChannelNestedInput = {
+ blockchain?: InputMaybe;
+ filter?: InputMaybe;
+ limit?: InputMaybe;
+ order?: InputMaybe>>;
+};
+
+export type FarcasterChannelOrderBy = {
+ createdAtTimestamp?: InputMaybe;
+ followerCount?: InputMaybe;
+};
+
+export type FarcasterChannelParticipant = {
+ __typename?: 'FarcasterChannelParticipant';
+ channel?: Maybe;
+ channelActions?: Maybe>;
+ channelId: Scalars['String']['output'];
+ channelName: Scalars['String']['output'];
+ dappName: Scalars['String']['output'];
+ dappSlug: Scalars['String']['output'];
+ /** Airstack unique identifier for the data point */
+ id?: Maybe;
+ lastActionTimestamp: Scalars['Time']['output'];
+ lastCastedTimestamp?: Maybe;
+ lastFollowedTimestamp?: Maybe;
+ lastRepliedTimestamp?: Maybe;
+ participant?: Maybe;
+ participantId: Scalars['String']['output'];
+};
+
+
+export type FarcasterChannelParticipantChannelArgs = {
+ input?: InputMaybe;
+};
+
+
+export type FarcasterChannelParticipantParticipantArgs = {
+ input?: InputMaybe;
+};
+
+export type FarcasterChannelParticipantFilter = {
+ channelActions?: InputMaybe;
+ channelId?: InputMaybe;
+ channelName?: InputMaybe;
+ lastActionTimestamp?: InputMaybe;
+ participant?: InputMaybe;
+};
+
+export type FarcasterChannelParticipantNestedInput = {
+ blockchain?: InputMaybe;
+ filter?: InputMaybe;
+ limit?: InputMaybe;
+ order?: InputMaybe>>;
+};
+
+export type FarcasterChannelParticipantOrderBy = {
+ lastActionTimestamp?: InputMaybe;
+};
+
+export type FarcasterChannelParticipantsInput = {
+ blockchain: EveryBlockchain;
+ cursor?: InputMaybe;
+ filter: FarcasterChannelParticipantFilter;
+ limit?: InputMaybe;
+ order?: InputMaybe>;
+};
+
+export type FarcasterChannelParticipantsOutput = {
+ __typename?: 'FarcasterChannelParticipantsOutput';
+ FarcasterChannelParticipant?: Maybe>;
+ pageInfo?: Maybe;
+};
+
+export type FarcasterChannelsInput = {
+ blockchain: EveryBlockchain;
+ cursor?: InputMaybe;
+ filter?: InputMaybe;
+ limit?: InputMaybe;
+ order?: InputMaybe>;
+};
+
+export type FarcasterChannelsOutput = {
+ __typename?: 'FarcasterChannelsOutput';
+ FarcasterChannel?: Maybe>;
+ pageInfo?: Maybe;
+};
+
+export type FarcasterFrame = {
+ __typename?: 'FarcasterFrame';
+ buttons?: Maybe>;
+ castedAtTimestamp?: Maybe;
+ frameHash?: Maybe;
+ frameUrl?: Maybe;
+ imageAspectRatio?: Maybe;
+ imageUrl?: Maybe;
+ inputText?: Maybe;
+ postUrl?: Maybe