From 05596041f8eb6bb60ccf71cc471807eff22c1551 Mon Sep 17 00:00:00 2001 From: vikas kashyap Date: Tue, 11 Feb 2025 16:52:36 +0530 Subject: [PATCH 01/10] fix: graph client version and naming --- bun.lockb | Bin 361814 -> 363073 bytes packages/graph-client/.graphclient/index.ts | 4 ++-- .../introspectionSchema.ts | 0 .../{Tenderize => lpEth}/schema.graphql | 0 .../sources/{Tenderize => lpEth}/types.ts | 4 ++-- packages/graph-client/.graphclientrc.yml | 2 +- packages/graph-client/package.json | 8 ++++---- 7 files changed, 9 insertions(+), 9 deletions(-) rename packages/graph-client/.graphclient/sources/{Tenderize => lpEth}/introspectionSchema.ts (100%) rename packages/graph-client/.graphclient/sources/{Tenderize => lpEth}/schema.graphql (100%) rename packages/graph-client/.graphclient/sources/{Tenderize => lpEth}/types.ts (99%) diff --git a/bun.lockb b/bun.lockb index dfddc3041f1768d83a269f8206eb3e825c454ddc..50b884da261e7273fdaf9f0e636aca83956ed040 100755 GIT binary patch delta 39265 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 PHDUJn`5QZg$}Rd|nO^)2 delta 38785 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 hugcByM_smQ%lFg##Gbf%ONUwR?3=c = T | null; export type InputMaybe = Maybe; export type Exact = { [K in keyof T]: T[K] }; @@ -2735,7 +2735,7 @@ export type DirectiveResolvers = ResolversObject<{ derivedFrom?: derivedFromDirectiveResolver; }>; -export type MeshContext = TenderizeTypes.Context & BaseMeshContext; +export type MeshContext = LpEthTypes.Context & BaseMeshContext; import { fileURLToPath } from '@graphql-mesh/utils'; diff --git a/packages/graph-client/.graphclient/sources/Tenderize/introspectionSchema.ts b/packages/graph-client/.graphclient/sources/lpEth/introspectionSchema.ts similarity index 100% rename from packages/graph-client/.graphclient/sources/Tenderize/introspectionSchema.ts rename to packages/graph-client/.graphclient/sources/lpEth/introspectionSchema.ts diff --git a/packages/graph-client/.graphclient/sources/Tenderize/schema.graphql b/packages/graph-client/.graphclient/sources/lpEth/schema.graphql similarity index 100% rename from packages/graph-client/.graphclient/sources/Tenderize/schema.graphql rename to packages/graph-client/.graphclient/sources/lpEth/schema.graphql diff --git a/packages/graph-client/.graphclient/sources/Tenderize/types.ts b/packages/graph-client/.graphclient/sources/lpEth/types.ts similarity index 99% rename from packages/graph-client/.graphclient/sources/Tenderize/types.ts rename to packages/graph-client/.graphclient/sources/lpEth/types.ts index 55305a5..5788f1d 100644 --- a/packages/graph-client/.graphclient/sources/Tenderize/types.ts +++ b/packages/graph-client/.graphclient/sources/lpEth/types.ts @@ -3,7 +3,7 @@ import { InContextSdkMethod } from '@graphql-mesh/types'; import { MeshContext } from '@graphql-mesh/runtime'; -export namespace TenderizeTypes { +export namespace LpEthTypes { export type Maybe = T | null; export type InputMaybe = Maybe; export type Exact = { [K in keyof T]: T[K] }; @@ -2334,7 +2334,7 @@ export type _SubgraphErrorPolicy_ = }; export type Context = { - ["Tenderize"]: { Query: QuerySdk, Mutation: MutationSdk, Subscription: SubscriptionSdk }, + ["lpEth"]: { Query: QuerySdk, Mutation: MutationSdk, Subscription: SubscriptionSdk }, }; } diff --git a/packages/graph-client/.graphclientrc.yml b/packages/graph-client/.graphclientrc.yml index b9b2606..7915b17 100644 --- a/packages/graph-client/.graphclientrc.yml +++ b/packages/graph-client/.graphclientrc.yml @@ -1,5 +1,5 @@ sources: - - name: Tenderize + - name: lpEth handler: graphql: endpoint: "https://api.studio.thegraph.com/query/93675/lpeth/version/latest" diff --git a/packages/graph-client/package.json b/packages/graph-client/package.json index e8f758b..3ebf08f 100644 --- a/packages/graph-client/package.json +++ b/packages/graph-client/package.json @@ -14,11 +14,11 @@ "prettier:write": "prettier --write \"**/*.{ts,md,yaml,gql}\"" }, "peerDependencies": { - "typescript": "^5.6.3" + "typescript": "^5.1.6" }, "dependencies": { - "@graphprotocol/client-cli": "^3.0.7", - "@types/node": "^22.9.0", - "ts-node": "^10.9.2" + "@graphprotocol/client-cli": "^3.0.0", + "@types/node": "^20.3.3", + "ts-node": "^10.9.1" } } \ No newline at end of file From d5fc2e9d4b471c81ba8b5fb9879781feffa6b56e Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Tue, 11 Feb 2025 12:27:40 +0100 Subject: [PATCH 02/10] sync dependenceis --- packages/graph-client/package.json | 31 +++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/packages/graph-client/package.json b/packages/graph-client/package.json index 3ebf08f..fe410c9 100644 --- a/packages/graph-client/package.json +++ b/packages/graph-client/package.json @@ -2,9 +2,6 @@ "name": "graph-client", "module": "index.ts", "type": "module", - "devDependencies": { - "@types/bun": "latest" - }, "scripts": { "start": "ts-node index.ts --transpileOnly", "build": "graphclient build && tsc", @@ -17,8 +14,32 @@ "typescript": "^5.1.6" }, "dependencies": { - "@graphprotocol/client-cli": "^3.0.0", + "@graphprotocol/client-cli": "3.0.0", + "@graphql-mesh/cache-localforage": "0.94.1", + "@graphql-mesh/cross-helpers": "0.4.0", + "@graphql-mesh/graphql": "0.94.2", + "@graphql-mesh/http": "0.94.4", + "@graphql-mesh/merger-stitching": "0.94.1", + "@graphql-mesh/runtime": "0.94.1", + "@graphql-mesh/store": "0.94.1", + "@graphql-mesh/transform-filter-schema": "0.94.1", + "@graphql-mesh/transform-prefix": "0.94.2", + "@graphql-mesh/transform-prune": "0.94.1", + "@graphql-mesh/transform-rename": "0.94.2", + "@graphql-mesh/transform-type-merging": "0.94.1", + "@graphql-mesh/types": "0.94.1", + "@graphql-mesh/utils": "0.94.1", + "@graphql-tools/merge": "9.0.0" + }, + "devDependencies": { + "@types/bun": "latest", "@types/node": "^20.3.3", - "ts-node": "^10.9.1" + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", + "eslint": "^8.42.0", + "eslint-config-prettier": "^8.8.0", + "prettier": "^2.8.8", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" } } \ No newline at end of file From d28faefae102a8608d43d721dbf20befe442fc54 Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Wed, 12 Feb 2025 10:03:07 +0100 Subject: [PATCH 03/10] add prelaunch call handlers --- packages/subgraph/abis/Prelaunch.json | 1 + .../subgraph/generated/PreLaunch/PreLaunch.ts | 761 ++++++++++++++++++ packages/subgraph/generated/schema.ts | 198 ++++- packages/subgraph/schema.graphql | 17 +- packages/subgraph/src/mappings/lpeth.ts | 56 +- packages/subgraph/src/mappings/prelaunch.ts | 185 +++++ packages/subgraph/subgraph.yaml | 28 + 7 files changed, 1212 insertions(+), 34 deletions(-) create mode 100644 packages/subgraph/abis/Prelaunch.json create mode 100644 packages/subgraph/generated/PreLaunch/PreLaunch.ts create mode 100644 packages/subgraph/src/mappings/prelaunch.ts diff --git a/packages/subgraph/abis/Prelaunch.json b/packages/subgraph/abis/Prelaunch.json new file mode 100644 index 0000000..812b2eb --- /dev/null +++ b/packages/subgraph/abis/Prelaunch.json @@ -0,0 +1 @@ +[{ "inputs": [{ "components": [{ "internalType": "uint256", "name": "cap", "type": "uint256" }, { "internalType": "uint256", "name": "deadline", "type": "uint256" }, { "internalType": "uint256", "name": "minLockup", "type": "uint256" }, { "internalType": "uint256", "name": "maxLockup", "type": "uint256" }, { "internalType": "uint256", "name": "epochLength", "type": "uint256" }, { "internalType": "UD60x18", "name": "minMultiplier", "type": "uint256" }, { "internalType": "UD60x18", "name": "maxMultiplier", "type": "uint256" }, { "internalType": "UD60x18", "name": "slope", "type": "uint256" }], "internalType": "struct Config", "name": "_config", "type": "tuple" }], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [{ "internalType": "address", "name": "target", "type": "address" }], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [], "name": "CapExceeded", "type": "error" }, { "inputs": [{ "internalType": "address", "name": "implementation", "type": "address" }], "name": "ERC1967InvalidImplementation", "type": "error" }, { "inputs": [], "name": "ERC1967NonPayable", "type": "error" }, { "inputs": [], "name": "FailedInnerCall", "type": "error" }, { "inputs": [], "name": "Inactive", "type": "error" }, { "inputs": [], "name": "InvalidDuration", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [], "name": "NotClaimable", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], "name": "OwnableInvalidOwner", "type": "error" }, { "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], "name": "OwnableUnauthorizedAccount", "type": "error" }, { "inputs": [{ "internalType": "uint256", "name": "x", "type": "uint256" }, { "internalType": "uint256", "name": "y", "type": "uint256" }], "name": "PRBMath_MulDiv18_Overflow", "type": "error" }, { "inputs": [{ "internalType": "uint256", "name": "x", "type": "uint256" }, { "internalType": "uint256", "name": "y", "type": "uint256" }, { "internalType": "uint256", "name": "denominator", "type": "uint256" }], "name": "PRBMath_MulDiv_Overflow", "type": "error" }, { "inputs": [{ "internalType": "UD60x18", "name": "x", "type": "uint256" }], "name": "PRBMath_UD60x18_Exp2_InputTooBig", "type": "error" }, { "inputs": [{ "internalType": "UD60x18", "name": "x", "type": "uint256" }], "name": "PRBMath_UD60x18_Log_InputTooSmall", "type": "error" }, { "inputs": [], "name": "UUPSUnauthorizedCallContext", "type": "error" }, { "inputs": [{ "internalType": "bytes32", "name": "slot", "type": "bytes32" }], "name": "UUPSUnsupportedProxiableUUID", "type": "error" }, { "anonymous": false, "inputs": [{ "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" }], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" }], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [{ "indexed": true, "internalType": "address", "name": "implementation", "type": "address" }], "name": "Upgraded", "type": "event" }, { "inputs": [], "name": "UPGRADE_INTERFACE_VERSION", "outputs": [{ "internalType": "string", "name": "", "type": "string" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "epochs", "type": "uint256" }], "name": "calculateWeightedDeposit", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "cap", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "uint256", "name": "duration", "type": "uint256" }], "name": "changeLockup", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "claimVeTokens", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "claimableTimestamp", "outputs": [{ "internalType": "uint96", "name": "", "type": "uint96" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "deadline", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "uint256", "name": "duration", "type": "uint256" }], "name": "depositETH", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "duration", "type": "uint256" }], "name": "depositWETH", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "isActive", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "isClaimable", "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], "name": "lockup", "outputs": [{ "components": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "duration", "type": "uint256" }], "internalType": "struct Lockup", "name": "", "type": "tuple" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "uint256", "name": "minLpShares", "type": "uint256" }], "name": "mintLpEth", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proxiableUUID", "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address payable", "name": "_lpEth", "type": "address" }], "name": "setLpEth", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "_votingEscrow", "type": "address" }], "name": "setVotingEscrow", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "totalDeposits", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalWeightedDeposits", "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [{ "internalType": "address", "name": "newImplementation", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" }], "name": "upgradeToAndCall", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "votingEscrow", "outputs": [{ "internalType": "address", "name": "", "type": "address" }], "stateMutability": "view", "type": "function" }, { "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }] \ No newline at end of file diff --git a/packages/subgraph/generated/PreLaunch/PreLaunch.ts b/packages/subgraph/generated/PreLaunch/PreLaunch.ts new file mode 100644 index 0000000..b25cb8a --- /dev/null +++ b/packages/subgraph/generated/PreLaunch/PreLaunch.ts @@ -0,0 +1,761 @@ +// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + +import { + ethereum, + JSONValue, + TypedMap, + Entity, + Bytes, + Address, + BigInt, +} from "@graphprotocol/graph-ts"; + +export class Initialized extends ethereum.Event { + get params(): Initialized__Params { + return new Initialized__Params(this); + } +} + +export class Initialized__Params { + _event: Initialized; + + constructor(event: Initialized) { + this._event = event; + } + + get version(): BigInt { + return this._event.parameters[0].value.toBigInt(); + } +} + +export class OwnershipTransferred extends ethereum.Event { + get params(): OwnershipTransferred__Params { + return new OwnershipTransferred__Params(this); + } +} + +export class OwnershipTransferred__Params { + _event: OwnershipTransferred; + + constructor(event: OwnershipTransferred) { + this._event = event; + } + + get previousOwner(): Address { + return this._event.parameters[0].value.toAddress(); + } + + get newOwner(): Address { + return this._event.parameters[1].value.toAddress(); + } +} + +export class Upgraded extends ethereum.Event { + get params(): Upgraded__Params { + return new Upgraded__Params(this); + } +} + +export class Upgraded__Params { + _event: Upgraded; + + constructor(event: Upgraded) { + this._event = event; + } + + get implementation(): Address { + return this._event.parameters[0].value.toAddress(); + } +} + +export class PreLaunch__lockupResultValue0Struct extends ethereum.Tuple { + get amount(): BigInt { + return this[0].toBigInt(); + } + + get duration(): BigInt { + return this[1].toBigInt(); + } +} + +export class PreLaunch extends ethereum.SmartContract { + static bind(address: Address): PreLaunch { + return new PreLaunch("PreLaunch", address); + } + + UPGRADE_INTERFACE_VERSION(): string { + let result = super.call( + "UPGRADE_INTERFACE_VERSION", + "UPGRADE_INTERFACE_VERSION():(string)", + [], + ); + + return result[0].toString(); + } + + try_UPGRADE_INTERFACE_VERSION(): ethereum.CallResult { + let result = super.tryCall( + "UPGRADE_INTERFACE_VERSION", + "UPGRADE_INTERFACE_VERSION():(string)", + [], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toString()); + } + + calculateWeightedDeposit(amount: BigInt, epochs: BigInt): BigInt { + let result = super.call( + "calculateWeightedDeposit", + "calculateWeightedDeposit(uint256,uint256):(uint256)", + [ + ethereum.Value.fromUnsignedBigInt(amount), + ethereum.Value.fromUnsignedBigInt(epochs), + ], + ); + + return result[0].toBigInt(); + } + + try_calculateWeightedDeposit( + amount: BigInt, + epochs: BigInt, + ): ethereum.CallResult { + let result = super.tryCall( + "calculateWeightedDeposit", + "calculateWeightedDeposit(uint256,uint256):(uint256)", + [ + ethereum.Value.fromUnsignedBigInt(amount), + ethereum.Value.fromUnsignedBigInt(epochs), + ], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBigInt()); + } + + cap(): BigInt { + let result = super.call("cap", "cap():(uint256)", []); + + return result[0].toBigInt(); + } + + try_cap(): ethereum.CallResult { + let result = super.tryCall("cap", "cap():(uint256)", []); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBigInt()); + } + + claimableTimestamp(): BigInt { + let result = super.call( + "claimableTimestamp", + "claimableTimestamp():(uint96)", + [], + ); + + return result[0].toBigInt(); + } + + try_claimableTimestamp(): ethereum.CallResult { + let result = super.tryCall( + "claimableTimestamp", + "claimableTimestamp():(uint96)", + [], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBigInt()); + } + + deadline(): BigInt { + let result = super.call("deadline", "deadline():(uint256)", []); + + return result[0].toBigInt(); + } + + try_deadline(): ethereum.CallResult { + let result = super.tryCall("deadline", "deadline():(uint256)", []); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBigInt()); + } + + isActive(): boolean { + let result = super.call("isActive", "isActive():(bool)", []); + + return result[0].toBoolean(); + } + + try_isActive(): ethereum.CallResult { + let result = super.tryCall("isActive", "isActive():(bool)", []); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBoolean()); + } + + isClaimable(): boolean { + let result = super.call("isClaimable", "isClaimable():(bool)", []); + + return result[0].toBoolean(); + } + + try_isClaimable(): ethereum.CallResult { + let result = super.tryCall("isClaimable", "isClaimable():(bool)", []); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBoolean()); + } + + lockup(account: Address): PreLaunch__lockupResultValue0Struct { + let result = super.call("lockup", "lockup(address):((uint256,uint256))", [ + ethereum.Value.fromAddress(account), + ]); + + return changetype(result[0].toTuple()); + } + + try_lockup( + account: Address, + ): ethereum.CallResult { + let result = super.tryCall( + "lockup", + "lockup(address):((uint256,uint256))", + [ethereum.Value.fromAddress(account)], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue( + changetype(value[0].toTuple()), + ); + } + + owner(): Address { + let result = super.call("owner", "owner():(address)", []); + + return result[0].toAddress(); + } + + try_owner(): ethereum.CallResult
{ + let result = super.tryCall("owner", "owner():(address)", []); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toAddress()); + } + + proxiableUUID(): Bytes { + let result = super.call("proxiableUUID", "proxiableUUID():(bytes32)", []); + + return result[0].toBytes(); + } + + try_proxiableUUID(): ethereum.CallResult { + let result = super.tryCall( + "proxiableUUID", + "proxiableUUID():(bytes32)", + [], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBytes()); + } + + totalDeposits(): BigInt { + let result = super.call("totalDeposits", "totalDeposits():(uint256)", []); + + return result[0].toBigInt(); + } + + try_totalDeposits(): ethereum.CallResult { + let result = super.tryCall( + "totalDeposits", + "totalDeposits():(uint256)", + [], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBigInt()); + } + + totalWeightedDeposits(): BigInt { + let result = super.call( + "totalWeightedDeposits", + "totalWeightedDeposits():(uint256)", + [], + ); + + return result[0].toBigInt(); + } + + try_totalWeightedDeposits(): ethereum.CallResult { + let result = super.tryCall( + "totalWeightedDeposits", + "totalWeightedDeposits():(uint256)", + [], + ); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toBigInt()); + } + + votingEscrow(): Address { + let result = super.call("votingEscrow", "votingEscrow():(address)", []); + + return result[0].toAddress(); + } + + try_votingEscrow(): ethereum.CallResult
{ + let result = super.tryCall("votingEscrow", "votingEscrow():(address)", []); + if (result.reverted) { + return new ethereum.CallResult(); + } + let value = result.value; + return ethereum.CallResult.fromValue(value[0].toAddress()); + } +} + +export class ConstructorCall extends ethereum.Call { + get inputs(): ConstructorCall__Inputs { + return new ConstructorCall__Inputs(this); + } + + get outputs(): ConstructorCall__Outputs { + return new ConstructorCall__Outputs(this); + } +} + +export class ConstructorCall__Inputs { + _call: ConstructorCall; + + constructor(call: ConstructorCall) { + this._call = call; + } + + get _config(): ConstructorCall_configStruct { + return changetype( + this._call.inputValues[0].value.toTuple(), + ); + } +} + +export class ConstructorCall__Outputs { + _call: ConstructorCall; + + constructor(call: ConstructorCall) { + this._call = call; + } +} + +export class ConstructorCall_configStruct extends ethereum.Tuple { + get cap(): BigInt { + return this[0].toBigInt(); + } + + get deadline(): BigInt { + return this[1].toBigInt(); + } + + get minLockup(): BigInt { + return this[2].toBigInt(); + } + + get maxLockup(): BigInt { + return this[3].toBigInt(); + } + + get epochLength(): BigInt { + return this[4].toBigInt(); + } + + get minMultiplier(): BigInt { + return this[5].toBigInt(); + } + + get maxMultiplier(): BigInt { + return this[6].toBigInt(); + } + + get slope(): BigInt { + return this[7].toBigInt(); + } +} + +export class ChangeLockupCall extends ethereum.Call { + get inputs(): ChangeLockupCall__Inputs { + return new ChangeLockupCall__Inputs(this); + } + + get outputs(): ChangeLockupCall__Outputs { + return new ChangeLockupCall__Outputs(this); + } +} + +export class ChangeLockupCall__Inputs { + _call: ChangeLockupCall; + + constructor(call: ChangeLockupCall) { + this._call = call; + } + + get duration(): BigInt { + return this._call.inputValues[0].value.toBigInt(); + } +} + +export class ChangeLockupCall__Outputs { + _call: ChangeLockupCall; + + constructor(call: ChangeLockupCall) { + this._call = call; + } +} + +export class ClaimVeTokensCall extends ethereum.Call { + get inputs(): ClaimVeTokensCall__Inputs { + return new ClaimVeTokensCall__Inputs(this); + } + + get outputs(): ClaimVeTokensCall__Outputs { + return new ClaimVeTokensCall__Outputs(this); + } +} + +export class ClaimVeTokensCall__Inputs { + _call: ClaimVeTokensCall; + + constructor(call: ClaimVeTokensCall) { + this._call = call; + } +} + +export class ClaimVeTokensCall__Outputs { + _call: ClaimVeTokensCall; + + constructor(call: ClaimVeTokensCall) { + this._call = call; + } +} + +export class DepositETHCall extends ethereum.Call { + get inputs(): DepositETHCall__Inputs { + return new DepositETHCall__Inputs(this); + } + + get outputs(): DepositETHCall__Outputs { + return new DepositETHCall__Outputs(this); + } +} + +export class DepositETHCall__Inputs { + _call: DepositETHCall; + + constructor(call: DepositETHCall) { + this._call = call; + } + + get duration(): BigInt { + return this._call.inputValues[0].value.toBigInt(); + } +} + +export class DepositETHCall__Outputs { + _call: DepositETHCall; + + constructor(call: DepositETHCall) { + this._call = call; + } +} + +export class DepositWETHCall extends ethereum.Call { + get inputs(): DepositWETHCall__Inputs { + return new DepositWETHCall__Inputs(this); + } + + get outputs(): DepositWETHCall__Outputs { + return new DepositWETHCall__Outputs(this); + } +} + +export class DepositWETHCall__Inputs { + _call: DepositWETHCall; + + constructor(call: DepositWETHCall) { + this._call = call; + } + + get amount(): BigInt { + return this._call.inputValues[0].value.toBigInt(); + } + + get duration(): BigInt { + return this._call.inputValues[1].value.toBigInt(); + } +} + +export class DepositWETHCall__Outputs { + _call: DepositWETHCall; + + constructor(call: DepositWETHCall) { + this._call = call; + } +} + +export class InitializeCall extends ethereum.Call { + get inputs(): InitializeCall__Inputs { + return new InitializeCall__Inputs(this); + } + + get outputs(): InitializeCall__Outputs { + return new InitializeCall__Outputs(this); + } +} + +export class InitializeCall__Inputs { + _call: InitializeCall; + + constructor(call: InitializeCall) { + this._call = call; + } +} + +export class InitializeCall__Outputs { + _call: InitializeCall; + + constructor(call: InitializeCall) { + this._call = call; + } +} + +export class MintLpEthCall extends ethereum.Call { + get inputs(): MintLpEthCall__Inputs { + return new MintLpEthCall__Inputs(this); + } + + get outputs(): MintLpEthCall__Outputs { + return new MintLpEthCall__Outputs(this); + } +} + +export class MintLpEthCall__Inputs { + _call: MintLpEthCall; + + constructor(call: MintLpEthCall) { + this._call = call; + } + + get minLpShares(): BigInt { + return this._call.inputValues[0].value.toBigInt(); + } +} + +export class MintLpEthCall__Outputs { + _call: MintLpEthCall; + + constructor(call: MintLpEthCall) { + this._call = call; + } +} + +export class RenounceOwnershipCall extends ethereum.Call { + get inputs(): RenounceOwnershipCall__Inputs { + return new RenounceOwnershipCall__Inputs(this); + } + + get outputs(): RenounceOwnershipCall__Outputs { + return new RenounceOwnershipCall__Outputs(this); + } +} + +export class RenounceOwnershipCall__Inputs { + _call: RenounceOwnershipCall; + + constructor(call: RenounceOwnershipCall) { + this._call = call; + } +} + +export class RenounceOwnershipCall__Outputs { + _call: RenounceOwnershipCall; + + constructor(call: RenounceOwnershipCall) { + this._call = call; + } +} + +export class SetLpEthCall extends ethereum.Call { + get inputs(): SetLpEthCall__Inputs { + return new SetLpEthCall__Inputs(this); + } + + get outputs(): SetLpEthCall__Outputs { + return new SetLpEthCall__Outputs(this); + } +} + +export class SetLpEthCall__Inputs { + _call: SetLpEthCall; + + constructor(call: SetLpEthCall) { + this._call = call; + } + + get _lpEth(): Address { + return this._call.inputValues[0].value.toAddress(); + } +} + +export class SetLpEthCall__Outputs { + _call: SetLpEthCall; + + constructor(call: SetLpEthCall) { + this._call = call; + } +} + +export class SetVotingEscrowCall extends ethereum.Call { + get inputs(): SetVotingEscrowCall__Inputs { + return new SetVotingEscrowCall__Inputs(this); + } + + get outputs(): SetVotingEscrowCall__Outputs { + return new SetVotingEscrowCall__Outputs(this); + } +} + +export class SetVotingEscrowCall__Inputs { + _call: SetVotingEscrowCall; + + constructor(call: SetVotingEscrowCall) { + this._call = call; + } + + get _votingEscrow(): Address { + return this._call.inputValues[0].value.toAddress(); + } +} + +export class SetVotingEscrowCall__Outputs { + _call: SetVotingEscrowCall; + + constructor(call: SetVotingEscrowCall) { + this._call = call; + } +} + +export class TransferOwnershipCall extends ethereum.Call { + get inputs(): TransferOwnershipCall__Inputs { + return new TransferOwnershipCall__Inputs(this); + } + + get outputs(): TransferOwnershipCall__Outputs { + return new TransferOwnershipCall__Outputs(this); + } +} + +export class TransferOwnershipCall__Inputs { + _call: TransferOwnershipCall; + + constructor(call: TransferOwnershipCall) { + this._call = call; + } + + get newOwner(): Address { + return this._call.inputValues[0].value.toAddress(); + } +} + +export class TransferOwnershipCall__Outputs { + _call: TransferOwnershipCall; + + constructor(call: TransferOwnershipCall) { + this._call = call; + } +} + +export class UpgradeToAndCallCall extends ethereum.Call { + get inputs(): UpgradeToAndCallCall__Inputs { + return new UpgradeToAndCallCall__Inputs(this); + } + + get outputs(): UpgradeToAndCallCall__Outputs { + return new UpgradeToAndCallCall__Outputs(this); + } +} + +export class UpgradeToAndCallCall__Inputs { + _call: UpgradeToAndCallCall; + + constructor(call: UpgradeToAndCallCall) { + this._call = call; + } + + get newImplementation(): Address { + return this._call.inputValues[0].value.toAddress(); + } + + get data(): Bytes { + return this._call.inputValues[1].value.toBytes(); + } +} + +export class UpgradeToAndCallCall__Outputs { + _call: UpgradeToAndCallCall; + + constructor(call: UpgradeToAndCallCall) { + this._call = call; + } +} + +export class WithdrawCall extends ethereum.Call { + get inputs(): WithdrawCall__Inputs { + return new WithdrawCall__Inputs(this); + } + + get outputs(): WithdrawCall__Outputs { + return new WithdrawCall__Outputs(this); + } +} + +export class WithdrawCall__Inputs { + _call: WithdrawCall; + + constructor(call: WithdrawCall) { + this._call = call; + } + + get amount(): BigInt { + return this._call.inputValues[0].value.toBigInt(); + } +} + +export class WithdrawCall__Outputs { + _call: WithdrawCall; + + constructor(call: WithdrawCall) { + this._call = call; + } +} diff --git a/packages/subgraph/generated/schema.ts b/packages/subgraph/generated/schema.ts index 5cddefc..2c55b62 100644 --- a/packages/subgraph/generated/schema.ts +++ b/packages/subgraph/generated/schema.ts @@ -1688,7 +1688,7 @@ export class Withdraw extends Entity { } } -export class SwapLPTokenTransfer extends Entity { +export class SwapLPTokenTransferEvent extends Entity { constructor(id: string) { super(); this.set("id", Value.fromString(id)); @@ -1696,25 +1696,28 @@ export class SwapLPTokenTransfer extends Entity { save(): void { let id = this.get("id"); - assert(id != null, "Cannot save SwapLPTokenTransfer entity without an ID"); + assert( + id != null, + "Cannot save SwapLPTokenTransferEvent entity without an ID", + ); if (id) { assert( id.kind == ValueKind.STRING, - `Entities of type SwapLPTokenTransfer must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + `Entities of type SwapLPTokenTransferEvent must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, ); - store.set("SwapLPTokenTransfer", id.toString(), this); + store.set("SwapLPTokenTransferEvent", id.toString(), this); } } - static loadInBlock(id: string): SwapLPTokenTransfer | null { - return changetype( - store.get_in_block("SwapLPTokenTransfer", id), + static loadInBlock(id: string): SwapLPTokenTransferEvent | null { + return changetype( + store.get_in_block("SwapLPTokenTransferEvent", id), ); } - static load(id: string): SwapLPTokenTransfer | null { - return changetype( - store.get("SwapLPTokenTransfer", id), + static load(id: string): SwapLPTokenTransferEvent | null { + return changetype( + store.get("SwapLPTokenTransferEvent", id), ); } @@ -1954,6 +1957,181 @@ export class LiquidityPosition extends Entity { } } +export class PreLaunchPosition extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save PreLaunchPosition entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type PreLaunchPosition must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("PreLaunchPosition", id.toString(), this); + } + } + + static loadInBlock(id: string): PreLaunchPosition | null { + return changetype( + store.get_in_block("PreLaunchPosition", id), + ); + } + + static load(id: string): PreLaunchPosition | null { + return changetype( + store.get("PreLaunchPosition", id), + ); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get account(): Bytes { + let value = this.get("account"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBytes(); + } + } + + set account(value: Bytes) { + this.set("account", Value.fromBytes(value)); + } + + get amount(): BigInt { + let value = this.get("amount"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set amount(value: BigInt) { + this.set("amount", Value.fromBigInt(value)); + } + + get weightedAmount(): BigInt { + let value = this.get("weightedAmount"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set weightedAmount(value: BigInt) { + this.set("weightedAmount", Value.fromBigInt(value)); + } + + get duration(): BigInt { + let value = this.get("duration"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set duration(value: BigInt) { + this.set("duration", Value.fromBigInt(value)); + } + + get claimed(): boolean { + let value = this.get("claimed"); + if (!value || value.kind == ValueKind.NULL) { + return false; + } else { + return value.toBoolean(); + } + } + + set claimed(value: boolean) { + this.set("claimed", Value.fromBoolean(value)); + } +} + +export class PreLaunch extends Entity { + constructor(id: string) { + super(); + this.set("id", Value.fromString(id)); + } + + save(): void { + let id = this.get("id"); + assert(id != null, "Cannot save PreLaunch entity without an ID"); + if (id) { + assert( + id.kind == ValueKind.STRING, + `Entities of type PreLaunch must have an ID of type String but the id '${id.displayData()}' is of type ${id.displayKind()}`, + ); + store.set("PreLaunch", id.toString(), this); + } + } + + static loadInBlock(id: string): PreLaunch | null { + return changetype(store.get_in_block("PreLaunch", id)); + } + + static load(id: string): PreLaunch | null { + return changetype(store.get("PreLaunch", id)); + } + + get id(): string { + let value = this.get("id"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toString(); + } + } + + set id(value: string) { + this.set("id", Value.fromString(value)); + } + + get amount(): BigInt { + let value = this.get("amount"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set amount(value: BigInt) { + this.set("amount", Value.fromBigInt(value)); + } + + get weightedAmount(): BigInt { + let value = this.get("weightedAmount"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set weightedAmount(value: BigInt) { + this.set("weightedAmount", Value.fromBigInt(value)); + } +} + export class SwapPoolDayLoader extends Entity { _entity: string; _field: string; diff --git a/packages/subgraph/schema.graphql b/packages/subgraph/schema.graphql index 70ede0b..4cf24e6 100644 --- a/packages/subgraph/schema.graphql +++ b/packages/subgraph/schema.graphql @@ -139,7 +139,7 @@ type Withdraw @entity(immutable: true) { transactionHash: Bytes! } -type SwapLPTokenTransfer @entity(immutable: true) { +type SwapLPTokenTransferEvent @entity(immutable: true) { id: ID! timestamp: Int! blockNumber: BigInt! @@ -164,3 +164,18 @@ type LiquidityPosition @entity { shares: BigInt! netDeposits: BigInt! } + +type PreLaunchPosition @entity { + id: ID! # user address + account: Bytes! # user address + amount: BigInt! + weightedAmount: BigInt! + duration: BigInt! + claimed: Boolean! +} + +type PreLaunch @entity { + id: ID! # contract address + amount: BigInt! + weightedAmount: BigInt! +} \ No newline at end of file diff --git a/packages/subgraph/src/mappings/lpeth.ts b/packages/subgraph/src/mappings/lpeth.ts index 0994385..09ef3fe 100644 --- a/packages/subgraph/src/mappings/lpeth.ts +++ b/packages/subgraph/src/mappings/lpeth.ts @@ -20,7 +20,7 @@ import { LiquidityPosition, RelayerRewardsClaimed, Swap, - SwapLPTokenTransfer, + SwapLPTokenTransferEvent, SwapPool, SwapPoolDay, UnlockBought, @@ -39,6 +39,8 @@ import { initiatePoolDay, TEN_18, } from "./helpers"; + +const PRELAUNCH_ADDRESS = "0xcC73341a078761AB869D90030D6632F9ea139f2b".toLowerCase() export function handleInitialize(event: InitializedEvent): void { let pool = new SwapPool(event.address.toHex()); let lpTokenAddr = LpETH.bind(event.address).lpToken(); @@ -281,13 +283,18 @@ export function handleDeposit(event: DepositEvent): void { let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); - let from = event.params.from.toHex(); - let user = User.load(from); - if (user == null) { - user = new User(from); - user.save(); - } + poolDay.save(); + pool.save(); + + let from = event.params.from.toHex(); + if (from == PRELAUNCH_ADDRESS) return; + let user = User.load(from); + if (user == null) { + user = new User(from); + user.save(); + } + let lp = LiquidityPosition.load(from.concat("-").concat(pool.id)); if (lp == null) { lp = new LiquidityPosition(from.concat("-").concat(pool.id)); @@ -299,8 +306,7 @@ export function handleDeposit(event: DepositEvent): void { lp.shares = lp.shares.plus(event.params.lpSharesMinted); lp.netDeposits = lp.netDeposits.plus(event.params.amount); lp.save(); - poolDay.save(); - pool.save(); + } export function handleRelayerRewardsClaimed( @@ -421,6 +427,23 @@ export function handleLpETHTransfer(event: LpETHTransferEmitted): void { toUser.save(); } + let lpTo = LiquidityPosition.load(to.concat("-").concat(pool.id)); + if (lpTo == null) { + lpTo = new LiquidityPosition(to.concat("-").concat(pool.id)); + lpTo.user = to; + lpTo.pool = pool.id; + lpTo.shares = BI_ZERO; + lpTo.netDeposits = BI_ZERO; + } + let shares = event.params.value.times(pool.totalSupply).div(pool.liabilities); + lpTo.shares = lpTo.shares.plus(shares); + lpTo.netDeposits = lpTo.netDeposits.plus(event.params.value); + lpTo.save(); + + // If the transfer comes from the pre-launch contract + // We simply return and can treat this as a mint of LP Tokens instead. + if (from == PRELAUNCH_ADDRESS) return; + let lp = LiquidityPosition.load(from.concat("-").concat(pool.id)); if (lp != null) { let totalSupply = pool.totalSupply; @@ -436,20 +459,7 @@ export function handleLpETHTransfer(event: LpETHTransferEmitted): void { lp.save(); } - let lpTo = LiquidityPosition.load(to.concat("-").concat(pool.id)); - if (lpTo == null) { - lpTo = new LiquidityPosition(to.concat("-").concat(pool.id)); - lpTo.user = to; - lpTo.pool = pool.id; - lpTo.shares = BI_ZERO; - lpTo.netDeposits = BI_ZERO; - } - let shares = event.params.value.times(pool.totalSupply).div(pool.liabilities); - lpTo.shares = lpTo.shares.plus(shares); - lpTo.netDeposits = lpTo.netDeposits.plus(event.params.value); - lpTo.save(); - - let transfer = new SwapLPTokenTransfer( + let transfer = new SwapLPTokenTransferEvent( event.transaction.hash.toHex().concat("-").concat(event.logIndex.toString()) ); transfer.timestamp = event.block.timestamp.toI32(); diff --git a/packages/subgraph/src/mappings/prelaunch.ts b/packages/subgraph/src/mappings/prelaunch.ts new file mode 100644 index 0000000..455c4e8 --- /dev/null +++ b/packages/subgraph/src/mappings/prelaunch.ts @@ -0,0 +1,185 @@ +import { BigDecimal, BigInt } from "@graphprotocol/graph-ts" +import {DepositETHCall, DepositWETHCall, WithdrawCall, ClaimVeTokensCall, ChangeLockupCall} from "../../generated/PreLaunch/PreLaunch" +import {Deposit, Withdraw, PreLaunchPosition, PreLaunch} from "../../generated/schema" +import { BI_ZERO, TEN_18 } from "./helpers" + +const LPETH_ADDRESS = "0xF3a75E087A92770b4150fFF14c6d36FB07796252".toLowerCase() + +const DEADLINE = 1728746087 +const MIN_LOCKUP = TEN_18 +const MAX_LOCKUP = BigInt.fromI32(52).times(TEN_18) +const EPOCH_LENGTH = 604800 +const MIN_MULTIPLIER = BigInt.fromString("100000000000000000") +const MAX_MULTIPLIER = BigInt.fromString("5000000000000000000") +const SLOPE = BigInt.fromString("2500000000000000000") + +// const calculateWeightedDeposit = (amount: BigInt, epochs: BigInt):BigInt => { +// if (epochs.lt(MIN_LOCKUP)) { +// return BI_ZERO +// } +// return amount.times(MIN_MULTIPLIER.plus(MAX_MULTIPLIER.minus(MIN_MULTIPLIER)).times( +// epochs.minus(MIN_LOCKUP).div(MAX_LOCKUP.minus(MIN_LOCKUP)).pow(SLOPE) +// )) +// } + +const calculateWeightedDeposit = (amount: BigInt, epochs: BigInt): BigInt => { + let x = parseFloat(amount.toBigDecimal().div(TEN_18.toBigDecimal()).toString()) + let e = parseInt(epochs.toString(), 10) + + let w = (x * (1 + (5 - 1)) * (e - 1) / (52 - 1)) ** 2.5 + + return BigInt.fromString(BigDecimal.fromString(w.toString()).times(TEN_18.toBigDecimal()).toString()) +} + +export function handleDepositETH(call: DepositETHCall):void { + let amount = call.transaction.value + + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + } + + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position == null) { + position = new PreLaunchPosition(call.from.toHexString()) + position.amount = amount + position.duration = call.inputs.duration + position.account = call.from + } else { + position.amount = position.amount.plus(amount) + position.duration = call.inputs.duration + + // subtract the current weighted amount from the total + // we will add it back after we calculate the new weighted amount + // in case the duration changed + preLaunch.amount = preLaunch.amount.minus(position.weightedAmount) + } + + let weighted = calculateWeightedDeposit(position.amount, position.duration) + position.weightedAmount = weighted + position.save() + + preLaunch.amount = preLaunch.amount.plus(amount) + preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) + preLaunch.save() + + let deposit = new Deposit( + call.transaction.hash.concatI32(0) + ) + deposit.from = call.from + deposit.amount = amount + deposit.lpSharesMinted = amount + deposit.blockTimestamp = call.block.timestamp + deposit.blockNumber = call.block.number + deposit.transactionHash = call.transaction.hash + deposit.save() +} + +export function handleDepositWETH(call: DepositWETHCall):void { + let amount = call.inputs.amount + + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + } + + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position == null) { + position = new PreLaunchPosition(call.from.toHexString()) + position.amount = amount + position.duration = call.inputs.duration + position.account = call.from + } else { + position.amount = position.amount.plus(amount) + position.duration = call.inputs.duration + + // subtract the current weighted amount from the total + // we will add it back after we calculate the new weighted amount + // in case the duration changed + preLaunch.amount = preLaunch.amount.minus(position.weightedAmount) + } + + let weighted = calculateWeightedDeposit(position.amount, position.duration) + position.weightedAmount = weighted + position.save() + + preLaunch.amount = preLaunch.amount.plus(amount) + preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) + preLaunch.save() + + let deposit = new Deposit( + call.transaction.hash.concatI32(0) + ) + deposit.from = call.from + deposit.amount = amount + deposit.lpSharesMinted = amount + deposit.blockTimestamp = call.block.timestamp + deposit.blockNumber = call.block.number + deposit.transactionHash = call.transaction.hash + deposit.save() +} + +export function handleWithdraw(call: WithdrawCall):void { + let amount = call.inputs.amount + + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + } + + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position != null) { + position.amount = position.amount.minus(amount) + + let weighted = calculateWeightedDeposit(amount, position.duration) + position.weightedAmount = position.weightedAmount.minus(weighted) + position.save() + + preLaunch.amount = preLaunch.amount.minus(amount) + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(weighted) + preLaunch.save() + } + + let withdraw = new Withdraw(call.transaction.hash.concatI32(0)) + withdraw.amount = call.inputs.amount + withdraw.lpSharesBurnt = call.inputs.amount + withdraw.to = call.from + withdraw.blockTimestamp = call.block.timestamp + withdraw.blockNumber = call.block.number + withdraw.transactionHash = call.transaction.hash + + withdraw.save() +} + +export function handleClaim (call: ClaimVeTokensCall):void { + // convert prelaunch into LiquidityPosition + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position == null) { + return + } + position.claimed = true + + // liquidity position and user is created by the LP token transfer event from the pre-launch contract to this one +} + +export function handleChangeLockup (call: ChangeLockupCall):void { + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + } + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position != null) { + let oldWeighted = calculateWeightedDeposit(position.amount, position.duration) + // subtract the current weighted amount from the total + // we will add it back after we calculate the new weighted amount + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(oldWeighted) + + let weighted = calculateWeightedDeposit(position.amount, call.inputs.duration) + position.weightedAmount = weighted + position.duration = call.inputs.duration + position.save() + + preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) + preLaunch.save() + } +} \ No newline at end of file diff --git a/packages/subgraph/subgraph.yaml b/packages/subgraph/subgraph.yaml index d0b726b..b74f4a2 100644 --- a/packages/subgraph/subgraph.yaml +++ b/packages/subgraph/subgraph.yaml @@ -4,6 +4,34 @@ indexerHints: schema: file: ./schema.graphql dataSources: + - kind: ethereum/contract + name: PreLaunch + network: mainnet + source: + address: "0xcC73341a078761AB869D90030D6632F9ea139f2b" + abi: PreLaunch + mapping: + kind: ethereum/events + apiVersion: 0.0.7 + language: wasm/assemblyscript + entities: + - Deposit + - LiquidityPosition + abis: + - name: PreLaunch + file: ./abis/Prelaunch.json + callHandlers: + - function: depositETH(uint256) + handler: handleDepositETH + - function: depositWETH(uint256,uint256) + handler: handleDepositWETH + - function: withdraw(uint256) + handler: handleWithdraw + - function: claimVeTokens() + handler: handleClaim + - function: changeLockup(uint256) + handler: handleChangeLockup + file: ./src/mappings/prelaunch.ts - kind: ethereum name: lpeth network: mainnet From 0db56c12eded0c37a538c89be2902db1eb4dd040 Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Wed, 12 Feb 2025 10:48:18 +0100 Subject: [PATCH 04/10] fix missing claimed field --- packages/subgraph/src/mappings/prelaunch.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/subgraph/src/mappings/prelaunch.ts b/packages/subgraph/src/mappings/prelaunch.ts index 455c4e8..fa955d8 100644 --- a/packages/subgraph/src/mappings/prelaunch.ts +++ b/packages/subgraph/src/mappings/prelaunch.ts @@ -42,6 +42,7 @@ export function handleDepositETH(call: DepositETHCall):void { let position = PreLaunchPosition.load(call.from.toHexString()) if (position == null) { position = new PreLaunchPosition(call.from.toHexString()) + position.claimed = false position.amount = amount position.duration = call.inputs.duration position.account = call.from @@ -86,6 +87,7 @@ export function handleDepositWETH(call: DepositWETHCall):void { let position = PreLaunchPosition.load(call.from.toHexString()) if (position == null) { position = new PreLaunchPosition(call.from.toHexString()) + position.claimed = false position.amount = amount position.duration = call.inputs.duration position.account = call.from @@ -158,6 +160,7 @@ export function handleClaim (call: ClaimVeTokensCall):void { return } position.claimed = true + position.save() // liquidity position and user is created by the LP token transfer event from the pre-launch contract to this one } From 4dfebc55437289de34f6481e258d3bb03010695a Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Tue, 18 Feb 2025 10:47:13 +0100 Subject: [PATCH 05/10] hats counting fixes --- packages/subgraph/generated/schema.ts | 38 ++++++++++++-- packages/subgraph/schema.graphql | 6 ++- packages/subgraph/src/mappings/lpeth.ts | 55 ++++++++++++--------- packages/subgraph/src/mappings/prelaunch.ts | 47 +++++------------- packages/subgraph/subgraph.yaml | 1 + 5 files changed, 84 insertions(+), 63 deletions(-) diff --git a/packages/subgraph/generated/schema.ts b/packages/subgraph/generated/schema.ts index 2c55b62..fb5dcdd 100644 --- a/packages/subgraph/generated/schema.ts +++ b/packages/subgraph/generated/schema.ts @@ -1786,8 +1786,8 @@ export class SwapLPTokenTransferEvent extends Entity { this.set("to", Value.fromString(value)); } - get amount(): BigInt { - let value = this.get("amount"); + get shares(): BigInt { + let value = this.get("shares"); if (!value || value.kind == ValueKind.NULL) { throw new Error("Cannot return null for a required field."); } else { @@ -1795,8 +1795,21 @@ export class SwapLPTokenTransferEvent extends Entity { } } - set amount(value: BigInt) { - this.set("amount", Value.fromBigInt(value)); + set shares(value: BigInt) { + this.set("shares", Value.fromBigInt(value)); + } + + get value(): BigInt { + let value = this.get("value"); + if (!value || value.kind == ValueKind.NULL) { + throw new Error("Cannot return null for a required field."); + } else { + return value.toBigInt(); + } + } + + set value(value: BigInt) { + this.set("value", Value.fromBigInt(value)); } get SwapPool(): string { @@ -2064,6 +2077,23 @@ export class PreLaunchPosition extends Entity { set claimed(value: boolean) { this.set("claimed", Value.fromBoolean(value)); } + + get claimedAt(): BigInt | null { + let value = this.get("claimedAt"); + if (!value || value.kind == ValueKind.NULL) { + return null; + } else { + return value.toBigInt(); + } + } + + set claimedAt(value: BigInt | null) { + if (!value) { + this.unset("claimedAt"); + } else { + this.set("claimedAt", Value.fromBigInt(value)); + } + } } export class PreLaunch extends Entity { diff --git a/packages/subgraph/schema.graphql b/packages/subgraph/schema.graphql index 4cf24e6..a66da12 100644 --- a/packages/subgraph/schema.graphql +++ b/packages/subgraph/schema.graphql @@ -146,7 +146,8 @@ type SwapLPTokenTransferEvent @entity(immutable: true) { from: String! to: String! - amount: BigInt! + shares: BigInt! + value: BigInt! # Relational fields SwapPool: SwapPool! @@ -172,10 +173,11 @@ type PreLaunchPosition @entity { weightedAmount: BigInt! duration: BigInt! claimed: Boolean! + claimedAt: BigInt } type PreLaunch @entity { id: ID! # contract address amount: BigInt! weightedAmount: BigInt! -} \ No newline at end of file +} diff --git a/packages/subgraph/src/mappings/lpeth.ts b/packages/subgraph/src/mappings/lpeth.ts index 09ef3fe..5d15364 100644 --- a/packages/subgraph/src/mappings/lpeth.ts +++ b/packages/subgraph/src/mappings/lpeth.ts @@ -31,6 +31,7 @@ import { import { SwapPoolToken } from "../../generated/templates"; import { Transfer as LpETHTransferEmitted } from "../../generated/templates/SwapPoolToken/ERC20"; import { + ADDRESS_ZERO, BD_ZERO, BI_ZERO, calculateDayID, @@ -41,6 +42,8 @@ import { } from "./helpers"; const PRELAUNCH_ADDRESS = "0xcC73341a078761AB869D90030D6632F9ea139f2b".toLowerCase() +const LPETH_ADDRESS = "0xF3a75E087A92770b4150fFF14c6d36FB07796252".toLowerCase() + export function handleInitialize(event: InitializedEvent): void { let pool = new SwapPool(event.address.toHex()); let lpTokenAddr = LpETH.bind(event.address).lpToken(); @@ -236,7 +239,7 @@ export function handleWithdraw(event: WithdrawEvent): void { let user = event.params.to.toHex(); let lp = LiquidityPosition.load(user.concat("-").concat(pool.id)); if (lp != null) { - let bal = lp.shares.times(pool.liabilities.div(pool.totalSupply)); + let bal = lp.shares.times(pool.liabilities).div(pool.totalSupply); let amount = event.params.amount; if (bal.minus(lp.netDeposits).lt(amount)) { // if rewards less than amount, set net deposits @@ -416,7 +419,11 @@ export function handleUnlockRedeemed(event: UnlockRedeemedEvent): void { } export function handleLpETHTransfer(event: LpETHTransferEmitted): void { - let pool = SwapPool.load(event.address.toHex()); + // burn + if (event.params.to.toHex() == "0x0000000000000000000000000000000000000000") return; + // mint + if (event.params.from.toHex() == "0x0000000000000000000000000000000000000000") return; + let pool = SwapPool.load(LPETH_ADDRESS); if (pool == null) return; let from = event.params.from.toHex(); @@ -435,38 +442,42 @@ export function handleLpETHTransfer(event: LpETHTransferEmitted): void { lpTo.shares = BI_ZERO; lpTo.netDeposits = BI_ZERO; } - let shares = event.params.value.times(pool.totalSupply).div(pool.liabilities); + let shares = event.params.value; + let value = shares.times(pool.liabilities).div(pool.totalSupply); lpTo.shares = lpTo.shares.plus(shares); - lpTo.netDeposits = lpTo.netDeposits.plus(event.params.value); + lpTo.netDeposits = lpTo.netDeposits.plus(value); lpTo.save(); - // If the transfer comes from the pre-launch contract - // We simply return and can treat this as a mint of LP Tokens instead. + let transfer = new SwapLPTokenTransferEvent( + event.transaction.hash.toHex().concat("-").concat(event.logIndex.toString()) + ); + transfer.timestamp = event.block.timestamp.toI32(); + transfer.blockNumber = event.block.number; + transfer.from = from; + transfer.to = to; + transfer.shares = shares; + transfer.value = value; + transfer.SwapPool = pool.id; + transfer.save(); + if (from == PRELAUNCH_ADDRESS) return; let lp = LiquidityPosition.load(from.concat("-").concat(pool.id)); if (lp != null) { + lp.shares = lp.shares.minus(event.params.value); let totalSupply = pool.totalSupply; let bal = lp.shares - .times(pool.liabilities.times(TEN_18).div(totalSupply)) - .div(TEN_18); - let amount = event.params.value; - if (bal.minus(lp.netDeposits).lt(amount)) { + .times(pool.liabilities).div(totalSupply); + if (bal.minus(lp.netDeposits).lt(value)) { // if rewards less than amount, set net deposits // to balance minus what wasnt subtracted from the rewards - lp.netDeposits = bal.minus(amount); + let remainder = value.minus(bal.minus(lp.netDeposits)); + if (remainder.lt(lp.netDeposits)) { + lp.netDeposits = bal.minus(remainder); + } else { + lp.netDeposits = BI_ZERO; + } } lp.save(); } - - let transfer = new SwapLPTokenTransferEvent( - event.transaction.hash.toHex().concat("-").concat(event.logIndex.toString()) - ); - transfer.timestamp = event.block.timestamp.toI32(); - transfer.blockNumber = event.block.number; - transfer.from = from; - transfer.to = to; - transfer.amount = event.params.value; - transfer.SwapPool = pool.id; - transfer.save(); } diff --git a/packages/subgraph/src/mappings/prelaunch.ts b/packages/subgraph/src/mappings/prelaunch.ts index fa955d8..a460fb2 100644 --- a/packages/subgraph/src/mappings/prelaunch.ts +++ b/packages/subgraph/src/mappings/prelaunch.ts @@ -2,6 +2,7 @@ import { BigDecimal, BigInt } from "@graphprotocol/graph-ts" import {DepositETHCall, DepositWETHCall, WithdrawCall, ClaimVeTokensCall, ChangeLockupCall} from "../../generated/PreLaunch/PreLaunch" import {Deposit, Withdraw, PreLaunchPosition, PreLaunch} from "../../generated/schema" import { BI_ZERO, TEN_18 } from "./helpers" +import { log } from "@graphprotocol/graph-ts" const LPETH_ADDRESS = "0xF3a75E087A92770b4150fFF14c6d36FB07796252".toLowerCase() @@ -27,8 +28,9 @@ const calculateWeightedDeposit = (amount: BigInt, epochs: BigInt): BigInt => { let e = parseInt(epochs.toString(), 10) let w = (x * (1 + (5 - 1)) * (e - 1) / (52 - 1)) ** 2.5 + w = Math.floor(w * 10 ** 18) - return BigInt.fromString(BigDecimal.fromString(w.toString()).times(TEN_18.toBigDecimal()).toString()) + return BigInt.fromString(BigDecimal.fromString(w.toString()).toString()) } export function handleDepositETH(call: DepositETHCall):void { @@ -37,6 +39,8 @@ export function handleDepositETH(call: DepositETHCall):void { let preLaunch = PreLaunch.load(call.to.toHexString()) if (preLaunch == null) { preLaunch = new PreLaunch(call.to.toHexString()) + preLaunch.amount = BI_ZERO + preLaunch.weightedAmount = BI_ZERO } let position = PreLaunchPosition.load(call.from.toHexString()) @@ -53,27 +57,17 @@ export function handleDepositETH(call: DepositETHCall):void { // subtract the current weighted amount from the total // we will add it back after we calculate the new weighted amount // in case the duration changed - preLaunch.amount = preLaunch.amount.minus(position.weightedAmount) + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(position.weightedAmount) } let weighted = calculateWeightedDeposit(position.amount, position.duration) + log.debug("Weighted amount: {}", [weighted.toString()]) position.weightedAmount = weighted position.save() preLaunch.amount = preLaunch.amount.plus(amount) preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) preLaunch.save() - - let deposit = new Deposit( - call.transaction.hash.concatI32(0) - ) - deposit.from = call.from - deposit.amount = amount - deposit.lpSharesMinted = amount - deposit.blockTimestamp = call.block.timestamp - deposit.blockNumber = call.block.number - deposit.transactionHash = call.transaction.hash - deposit.save() } export function handleDepositWETH(call: DepositWETHCall):void { @@ -82,6 +76,8 @@ export function handleDepositWETH(call: DepositWETHCall):void { let preLaunch = PreLaunch.load(call.to.toHexString()) if (preLaunch == null) { preLaunch = new PreLaunch(call.to.toHexString()) + preLaunch.amount = BI_ZERO + preLaunch.weightedAmount = BI_ZERO } let position = PreLaunchPosition.load(call.from.toHexString()) @@ -98,7 +94,7 @@ export function handleDepositWETH(call: DepositWETHCall):void { // subtract the current weighted amount from the total // we will add it back after we calculate the new weighted amount // in case the duration changed - preLaunch.amount = preLaunch.amount.minus(position.weightedAmount) + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(position.weightedAmount) } let weighted = calculateWeightedDeposit(position.amount, position.duration) @@ -108,18 +104,8 @@ export function handleDepositWETH(call: DepositWETHCall):void { preLaunch.amount = preLaunch.amount.plus(amount) preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) preLaunch.save() +} - let deposit = new Deposit( - call.transaction.hash.concatI32(0) - ) - deposit.from = call.from - deposit.amount = amount - deposit.lpSharesMinted = amount - deposit.blockTimestamp = call.block.timestamp - deposit.blockNumber = call.block.number - deposit.transactionHash = call.transaction.hash - deposit.save() -} export function handleWithdraw(call: WithdrawCall):void { let amount = call.inputs.amount @@ -141,16 +127,6 @@ export function handleWithdraw(call: WithdrawCall):void { preLaunch.weightedAmount = preLaunch.weightedAmount.minus(weighted) preLaunch.save() } - - let withdraw = new Withdraw(call.transaction.hash.concatI32(0)) - withdraw.amount = call.inputs.amount - withdraw.lpSharesBurnt = call.inputs.amount - withdraw.to = call.from - withdraw.blockTimestamp = call.block.timestamp - withdraw.blockNumber = call.block.number - withdraw.transactionHash = call.transaction.hash - - withdraw.save() } export function handleClaim (call: ClaimVeTokensCall):void { @@ -160,6 +136,7 @@ export function handleClaim (call: ClaimVeTokensCall):void { return } position.claimed = true + position.claimedAt = call.block.timestamp position.save() // liquidity position and user is created by the LP token transfer event from the pre-launch contract to this one diff --git a/packages/subgraph/subgraph.yaml b/packages/subgraph/subgraph.yaml index b74f4a2..040bef8 100644 --- a/packages/subgraph/subgraph.yaml +++ b/packages/subgraph/subgraph.yaml @@ -10,6 +10,7 @@ dataSources: source: address: "0xcC73341a078761AB869D90030D6632F9ea139f2b" abi: PreLaunch + startBlock: 20692554 mapping: kind: ethereum/events apiVersion: 0.0.7 From 23c0883de334bc2650fa3b2c5e494e8228986ce9 Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Tue, 18 Feb 2025 10:47:24 +0100 Subject: [PATCH 06/10] updated client --- bun.lockb | Bin 363073 -> 527879 bytes packages/graph-client/.graphclient/index.ts | 480 ++- .../.graphclient/persisted_operations.json | 3 - .../graph-client/.graphclient/schema.graphql | 252 +- .../sources/lpEth/introspectionSchema.ts | 3237 +++++++++++++++-- .../.graphclient/sources/lpEth/schema.graphql | 252 +- .../.graphclient/sources/lpEth/types.ts | 250 +- packages/graph-client/.graphclientrc.yml | 2 - packages/graph-client/gql/Pool.gql | 75 - packages/graph-client/index.ts | 1 - packages/graph-client/package.json | 72 +- packages/graph-client/tsconfig.json | 31 +- 12 files changed, 3955 insertions(+), 700 deletions(-) delete mode 100644 packages/graph-client/.graphclient/persisted_operations.json delete mode 100644 packages/graph-client/gql/Pool.gql delete mode 100644 packages/graph-client/index.ts diff --git a/bun.lockb b/bun.lockb index 50b884da261e7273fdaf9f0e636aca83956ed040..abf20eaf3041afef488dcb263cb0fc5c73e38754 100755 GIT binary patch delta 173378 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 WC&n99Ac~hvHm9Uc-g95_wf_h7YWdXw delta 72873 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�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 diff --git a/packages/graph-client/.graphclient/index.ts b/packages/graph-client/.graphclient/index.ts index 4374234..d4eadcc 100644 --- a/packages/graph-client/.graphclient/index.ts +++ b/packages/graph-client/.graphclient/index.ts @@ -1,15 +1,23 @@ // @ts-nocheck import { GraphQLResolveInfo, SelectionSetNode, FieldNode, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; -import { gql } from '@graphql-mesh/utils'; - -import { findAndParseConfig } from '@graphql-mesh/cli'; +import type { GetMeshOptions } from '@graphql-mesh/runtime'; +import type { YamlConfig } from '@graphql-mesh/types'; +import { PubSub } from '@graphql-mesh/utils'; +import { DefaultLogger } from '@graphql-mesh/utils'; +import MeshCache from "@graphql-mesh/cache-localforage"; +import { fetch as fetchFn } from '@whatwg-node/fetch'; + +import { MeshResolvedSource } from '@graphql-mesh/runtime'; +import { MeshTransform, MeshPlugin } from '@graphql-mesh/types'; +import GraphqlHandler from "@graphql-mesh/graphql" +import BareMerger from "@graphql-mesh/merger-bare"; import { createMeshHTTPHandler, MeshHTTPHandler } from '@graphql-mesh/http'; import { getMesh, ExecuteMeshFn, SubscribeMeshFn, MeshContext as BaseMeshContext, MeshInstance } from '@graphql-mesh/runtime'; import { MeshStore, FsStoreStorageAdapter } from '@graphql-mesh/store'; import { path as pathModule } from '@graphql-mesh/cross-helpers'; import { ImportFn } from '@graphql-mesh/types'; import type { LpEthTypes } from './sources/lpEth/types'; +import * as importedModule$0 from "./sources/lpEth/introspectionSchema"; export type Maybe = T | null; export type InputMaybe = Maybe; export type Exact = { [K in keyof T]: T[K] }; @@ -545,6 +553,118 @@ export type OrderDirection = | 'asc' | 'desc'; +export type PreLaunch = { + id: Scalars['ID']['output']; + amount: Scalars['BigInt']['output']; + weightedAmount: Scalars['BigInt']['output']; +}; + +export type PreLaunchPosition = { + id: Scalars['ID']['output']; + account: Scalars['Bytes']['output']; + amount: Scalars['BigInt']['output']; + weightedAmount: Scalars['BigInt']['output']; + duration: Scalars['BigInt']['output']; + claimed: Scalars['Boolean']['output']; +}; + +export type PreLaunchPosition_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + account?: InputMaybe; + account_not?: InputMaybe; + account_gt?: InputMaybe; + account_lt?: InputMaybe; + account_gte?: InputMaybe; + account_lte?: InputMaybe; + account_in?: InputMaybe>; + account_not_in?: InputMaybe>; + account_contains?: InputMaybe; + account_not_contains?: InputMaybe; + amount?: InputMaybe; + amount_not?: InputMaybe; + amount_gt?: InputMaybe; + amount_lt?: InputMaybe; + amount_gte?: InputMaybe; + amount_lte?: InputMaybe; + amount_in?: InputMaybe>; + amount_not_in?: InputMaybe>; + weightedAmount?: InputMaybe; + weightedAmount_not?: InputMaybe; + weightedAmount_gt?: InputMaybe; + weightedAmount_lt?: InputMaybe; + weightedAmount_gte?: InputMaybe; + weightedAmount_lte?: InputMaybe; + weightedAmount_in?: InputMaybe>; + weightedAmount_not_in?: InputMaybe>; + duration?: InputMaybe; + duration_not?: InputMaybe; + duration_gt?: InputMaybe; + duration_lt?: InputMaybe; + duration_gte?: InputMaybe; + duration_lte?: InputMaybe; + duration_in?: InputMaybe>; + duration_not_in?: InputMaybe>; + claimed?: InputMaybe; + claimed_not?: InputMaybe; + claimed_in?: InputMaybe>; + claimed_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type PreLaunchPosition_orderBy = + | 'id' + | 'account' + | 'amount' + | 'weightedAmount' + | 'duration' + | 'claimed'; + +export type PreLaunch_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + amount?: InputMaybe; + amount_not?: InputMaybe; + amount_gt?: InputMaybe; + amount_lt?: InputMaybe; + amount_gte?: InputMaybe; + amount_lte?: InputMaybe; + amount_in?: InputMaybe>; + amount_not_in?: InputMaybe>; + weightedAmount?: InputMaybe; + weightedAmount_not?: InputMaybe; + weightedAmount_gt?: InputMaybe; + weightedAmount_lt?: InputMaybe; + weightedAmount_gte?: InputMaybe; + weightedAmount_lte?: InputMaybe; + weightedAmount_in?: InputMaybe>; + weightedAmount_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type PreLaunch_orderBy = + | 'id' + | 'amount' + | 'weightedAmount'; + export type Query = { batchUnlockBought?: Maybe; batchUnlockBoughts: Array; @@ -568,12 +688,16 @@ export type Query = { unlockRedeemeds: Array; withdraw?: Maybe; withdraws: Array; - swapLPTokenTransfer?: Maybe; - swapLPTokenTransfers: Array; + swapLPTokenTransferEvent?: Maybe; + swapLPTokenTransferEvents: Array; user?: Maybe; users: Array; liquidityPosition?: Maybe; liquidityPositions: Array; + preLaunchPosition?: Maybe; + preLaunchPositions: Array; + preLaunch?: Maybe; + preLaunches: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -777,19 +901,19 @@ export type QuerywithdrawsArgs = { }; -export type QueryswapLPTokenTransferArgs = { +export type QueryswapLPTokenTransferEventArgs = { id: Scalars['ID']['input']; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; -export type QueryswapLPTokenTransfersArgs = { +export type QueryswapLPTokenTransferEventsArgs = { skip?: InputMaybe; first?: InputMaybe; - orderBy?: InputMaybe; + orderBy?: InputMaybe; orderDirection?: InputMaybe; - where?: InputMaybe; + where?: InputMaybe; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; @@ -831,6 +955,42 @@ export type QueryliquidityPositionsArgs = { }; +export type QuerypreLaunchPositionArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerypreLaunchPositionsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerypreLaunchArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerypreLaunchesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Query_metaArgs = { block?: InputMaybe; }; @@ -936,12 +1096,16 @@ export type Subscription = { unlockRedeemeds: Array; withdraw?: Maybe; withdraws: Array; - swapLPTokenTransfer?: Maybe; - swapLPTokenTransfers: Array; + swapLPTokenTransferEvent?: Maybe; + swapLPTokenTransferEvents: Array; user?: Maybe; users: Array; liquidityPosition?: Maybe; liquidityPositions: Array; + preLaunchPosition?: Maybe; + preLaunchPositions: Array; + preLaunch?: Maybe; + preLaunches: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -1145,19 +1309,19 @@ export type SubscriptionwithdrawsArgs = { }; -export type SubscriptionswapLPTokenTransferArgs = { +export type SubscriptionswapLPTokenTransferEventArgs = { id: Scalars['ID']['input']; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; -export type SubscriptionswapLPTokenTransfersArgs = { +export type SubscriptionswapLPTokenTransferEventsArgs = { skip?: InputMaybe; first?: InputMaybe; - orderBy?: InputMaybe; + orderBy?: InputMaybe; orderDirection?: InputMaybe; - where?: InputMaybe; + where?: InputMaybe; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; @@ -1199,6 +1363,42 @@ export type SubscriptionliquidityPositionsArgs = { }; +export type SubscriptionpreLaunchPositionArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionpreLaunchPositionsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionpreLaunchArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionpreLaunchesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Subscription_metaArgs = { block?: InputMaybe; }; @@ -1217,7 +1417,7 @@ export type Swap = { transactionHash: Scalars['Bytes']['output']; }; -export type SwapLPTokenTransfer = { +export type SwapLPTokenTransferEvent = { id: Scalars['ID']['output']; timestamp: Scalars['Int']['output']; blockNumber: Scalars['BigInt']['output']; @@ -1227,7 +1427,7 @@ export type SwapLPTokenTransfer = { SwapPool: SwapPool; }; -export type SwapLPTokenTransfer_filter = { +export type SwapLPTokenTransferEvent_filter = { id?: InputMaybe; id_not?: InputMaybe; id_gt?: InputMaybe; @@ -1323,11 +1523,11 @@ export type SwapLPTokenTransfer_filter = { SwapPool_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; + and?: InputMaybe>>; + or?: InputMaybe>>; }; -export type SwapLPTokenTransfer_orderBy = +export type SwapLPTokenTransferEvent_orderBy = | 'id' | 'timestamp' | 'blockNumber' @@ -2330,6 +2530,12 @@ export type ResolversTypes = ResolversObject<{ LiquidityPosition_filter: LiquidityPosition_filter; LiquidityPosition_orderBy: LiquidityPosition_orderBy; OrderDirection: OrderDirection; + PreLaunch: ResolverTypeWrapper; + PreLaunchPosition: ResolverTypeWrapper; + PreLaunchPosition_filter: PreLaunchPosition_filter; + PreLaunchPosition_orderBy: PreLaunchPosition_orderBy; + PreLaunch_filter: PreLaunch_filter; + PreLaunch_orderBy: PreLaunch_orderBy; Query: ResolverTypeWrapper<{}>; RelayerRewardsClaimed: ResolverTypeWrapper; RelayerRewardsClaimed_filter: RelayerRewardsClaimed_filter; @@ -2337,9 +2543,9 @@ export type ResolversTypes = ResolversObject<{ String: ResolverTypeWrapper; Subscription: ResolverTypeWrapper<{}>; Swap: ResolverTypeWrapper; - SwapLPTokenTransfer: ResolverTypeWrapper; - SwapLPTokenTransfer_filter: SwapLPTokenTransfer_filter; - SwapLPTokenTransfer_orderBy: SwapLPTokenTransfer_orderBy; + SwapLPTokenTransferEvent: ResolverTypeWrapper; + SwapLPTokenTransferEvent_filter: SwapLPTokenTransferEvent_filter; + SwapLPTokenTransferEvent_orderBy: SwapLPTokenTransferEvent_orderBy; SwapPool: ResolverTypeWrapper; SwapPoolDay: ResolverTypeWrapper; SwapPoolDay_filter: SwapPoolDay_filter; @@ -2388,14 +2594,18 @@ export type ResolversParentTypes = ResolversObject<{ Int8: Scalars['Int8']['output']; LiquidityPosition: LiquidityPosition; LiquidityPosition_filter: LiquidityPosition_filter; + PreLaunch: PreLaunch; + PreLaunchPosition: PreLaunchPosition; + PreLaunchPosition_filter: PreLaunchPosition_filter; + PreLaunch_filter: PreLaunch_filter; Query: {}; RelayerRewardsClaimed: RelayerRewardsClaimed; RelayerRewardsClaimed_filter: RelayerRewardsClaimed_filter; String: Scalars['String']['output']; Subscription: {}; Swap: Swap; - SwapLPTokenTransfer: SwapLPTokenTransfer; - SwapLPTokenTransfer_filter: SwapLPTokenTransfer_filter; + SwapLPTokenTransferEvent: SwapLPTokenTransferEvent; + SwapLPTokenTransferEvent_filter: SwapLPTokenTransferEvent_filter; SwapPool: SwapPool; SwapPoolDay: SwapPoolDay; SwapPoolDay_filter: SwapPoolDay_filter; @@ -2503,6 +2713,23 @@ export type LiquidityPositionResolvers; }>; +export type PreLaunchResolvers = ResolversObject<{ + id?: Resolver; + amount?: Resolver; + weightedAmount?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type PreLaunchPositionResolvers = ResolversObject<{ + id?: Resolver; + account?: Resolver; + amount?: Resolver; + weightedAmount?: Resolver; + duration?: Resolver; + claimed?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + export type QueryResolvers = ResolversObject<{ batchUnlockBought?: Resolver, ParentType, ContextType, RequireFields>; batchUnlockBoughts?: Resolver, ParentType, ContextType, RequireFields>; @@ -2526,12 +2753,16 @@ export type QueryResolvers, ParentType, ContextType, RequireFields>; withdraw?: Resolver, ParentType, ContextType, RequireFields>; withdraws?: Resolver, ParentType, ContextType, RequireFields>; - swapLPTokenTransfer?: Resolver, ParentType, ContextType, RequireFields>; - swapLPTokenTransfers?: Resolver, ParentType, ContextType, RequireFields>; + swapLPTokenTransferEvent?: Resolver, ParentType, ContextType, RequireFields>; + swapLPTokenTransferEvents?: Resolver, ParentType, ContextType, RequireFields>; user?: Resolver, ParentType, ContextType, RequireFields>; users?: Resolver, ParentType, ContextType, RequireFields>; liquidityPosition?: Resolver, ParentType, ContextType, RequireFields>; liquidityPositions?: Resolver, ParentType, ContextType, RequireFields>; + preLaunchPosition?: Resolver, ParentType, ContextType, RequireFields>; + preLaunchPositions?: Resolver, ParentType, ContextType, RequireFields>; + preLaunch?: Resolver, ParentType, ContextType, RequireFields>; + preLaunches?: Resolver, ParentType, ContextType, RequireFields>; _meta?: Resolver, ParentType, ContextType, Partial>; }>; @@ -2568,12 +2799,16 @@ export type SubscriptionResolvers, "unlockRedeemeds", ParentType, ContextType, RequireFields>; withdraw?: SubscriptionResolver, "withdraw", ParentType, ContextType, RequireFields>; withdraws?: SubscriptionResolver, "withdraws", ParentType, ContextType, RequireFields>; - swapLPTokenTransfer?: SubscriptionResolver, "swapLPTokenTransfer", ParentType, ContextType, RequireFields>; - swapLPTokenTransfers?: SubscriptionResolver, "swapLPTokenTransfers", ParentType, ContextType, RequireFields>; + swapLPTokenTransferEvent?: SubscriptionResolver, "swapLPTokenTransferEvent", ParentType, ContextType, RequireFields>; + swapLPTokenTransferEvents?: SubscriptionResolver, "swapLPTokenTransferEvents", ParentType, ContextType, RequireFields>; user?: SubscriptionResolver, "user", ParentType, ContextType, RequireFields>; users?: SubscriptionResolver, "users", ParentType, ContextType, RequireFields>; liquidityPosition?: SubscriptionResolver, "liquidityPosition", ParentType, ContextType, RequireFields>; liquidityPositions?: SubscriptionResolver, "liquidityPositions", ParentType, ContextType, RequireFields>; + preLaunchPosition?: SubscriptionResolver, "preLaunchPosition", ParentType, ContextType, RequireFields>; + preLaunchPositions?: SubscriptionResolver, "preLaunchPositions", ParentType, ContextType, RequireFields>; + preLaunch?: SubscriptionResolver, "preLaunch", ParentType, ContextType, RequireFields>; + preLaunches?: SubscriptionResolver, "preLaunches", ParentType, ContextType, RequireFields>; _meta?: SubscriptionResolver, "_meta", ParentType, ContextType, Partial>; }>; @@ -2592,7 +2827,7 @@ export type SwapResolvers; }>; -export type SwapLPTokenTransferResolvers = ResolversObject<{ +export type SwapLPTokenTransferEventResolvers = ResolversObject<{ id?: Resolver; timestamp?: Resolver; blockNumber?: Resolver; @@ -2713,11 +2948,13 @@ export type Resolvers = ResolversObject<{ Deposit?: DepositResolvers; Int8?: GraphQLScalarType; LiquidityPosition?: LiquidityPositionResolvers; + PreLaunch?: PreLaunchResolvers; + PreLaunchPosition?: PreLaunchPositionResolvers; Query?: QueryResolvers; RelayerRewardsClaimed?: RelayerRewardsClaimedResolvers; Subscription?: SubscriptionResolvers; Swap?: SwapResolvers; - SwapLPTokenTransfer?: SwapLPTokenTransferResolvers; + SwapLPTokenTransferEvent?: SwapLPTokenTransferEventResolvers; SwapPool?: SwapPoolResolvers; SwapPoolDay?: SwapPoolDayResolvers; Timestamp?: GraphQLScalarType; @@ -2738,12 +2975,14 @@ export type DirectiveResolvers = ResolversObject<{ export type MeshContext = LpEthTypes.Context & BaseMeshContext; -import { fileURLToPath } from '@graphql-mesh/utils'; -const baseDir = pathModule.join(pathModule.dirname(fileURLToPath(import.meta.url)), '..'); +const baseDir = pathModule.join(typeof __dirname === 'string' ? __dirname : '/', '..'); const importFn: ImportFn = (moduleId: string) => { const relativeModuleId = (pathModule.isAbsolute(moduleId) ? pathModule.relative(baseDir, moduleId) : moduleId).split('\\').join('/').replace(baseDir + '/', ''); switch(relativeModuleId) { + case ".graphclient/sources/lpEth/introspectionSchema": + return Promise.resolve(importedModule$0) as T; + default: return Promise.reject(new Error(`Cannot find module '${relativeModuleId}'.`)); } @@ -2758,15 +2997,64 @@ const rootStore = new MeshStore('.graphclient', new FsStoreStorageAdapter({ validate: false }); -export function getMeshOptions() { - console.warn('WARNING: These artifacts are built for development mode. Please run "graphclient build" to build production artifacts'); - return findAndParseConfig({ - dir: baseDir, - artifactsDir: ".graphclient", - configName: "graphclient", - additionalPackagePrefixes: ["@graphprotocol/client-"], - initialLoggerPrefix: "GraphClient", - }); +export const rawServeConfig: YamlConfig.Config['serve'] = undefined as any +export async function getMeshOptions(): Promise { +const pubsub = new PubSub(); +const sourcesStore = rootStore.child('sources'); +const logger = new DefaultLogger("GraphClient"); +const cache = new (MeshCache as any)({ + ...({} as any), + importFn, + store: rootStore.child('cache'), + pubsub, + logger, + } as any) + +const sources: MeshResolvedSource[] = []; +const transforms: MeshTransform[] = []; +const additionalEnvelopPlugins: MeshPlugin[] = []; +const lpEthTransforms = []; +const additionalTypeDefs = [] as any[]; +const lpEthHandler = new GraphqlHandler({ + name: "lpEth", + config: {"endpoint":"https://api.studio.thegraph.com/query/93675/lpeth/version/latest"}, + baseDir, + cache, + pubsub, + store: sourcesStore.child("lpEth"), + logger: logger.child("lpEth"), + importFn, + }); +sources[0] = { + name: 'lpEth', + handler: lpEthHandler, + transforms: lpEthTransforms + } +const additionalResolvers = [] as any[] +const merger = new(BareMerger as any)({ + cache, + pubsub, + logger: logger.child('bareMerger'), + store: rootStore.child('bareMerger') + }) + + return { + sources, + transforms, + additionalTypeDefs, + additionalResolvers, + cache, + pubsub, + merger, + logger, + additionalEnvelopPlugins, + get documents() { + return [ + + ]; + }, + fetchFn, + }; } export function createBuiltMeshHTTPHandler(): MeshHTTPHandler { @@ -2777,6 +3065,7 @@ export function createBuiltMeshHTTPHandler(): MeshHTTPHandl }) } + let meshInstance$: Promise | undefined; export const pollingInterval = null; @@ -2810,107 +3099,4 @@ export function getBuiltGraphClient(): Promise { export const execute: ExecuteMeshFn = (...args) => getBuiltGraphClient().then(({ execute }) => execute(...args)); -export const subscribe: SubscribeMeshFn = (...args) => getBuiltGraphClient().then(({ subscribe }) => subscribe(...args)); -export function getBuiltGraphSDK(globalContext?: TGlobalContext) { - const sdkRequester$ = getBuiltGraphClient().then(({ sdkRequesterFactory }) => sdkRequesterFactory(globalContext)); - return getSdk((...args) => sdkRequester$.then(sdkRequester => sdkRequester(...args))); -} -export type getPoolsQueryVariables = Exact<{ - dateFilter?: InputMaybe; - first?: InputMaybe; - skip?: InputMaybe; -}>; - - -export type getPoolsQuery = { swapPools: Array<( - Pick - & { poolDays: Array> } - )> }; - -export type getPoolQueryVariables = Exact<{ - id: Scalars['ID']['input']; - dateFilter?: InputMaybe; -}>; - - -export type getPoolQuery = { swapPool?: Maybe<( - Pick - & { poolDays: Array> } - )> }; - - -export const getPoolsDocument = gql` - query getPools($dateFilter: Int = 0, $first: Int = 1000, $skip: Int = 0) { - swapPools { - id - lpToken - liabilities - totalSupply - unlocking - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - poolDays(where: {date_gte: $dateFilter}, orderBy: date, orderDirection: desc) { - date - id - liabilities - totalSupply - unlocking - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - } - } -} - ` as unknown as DocumentNode; -export const getPoolDocument = gql` - query getPool($id: ID!, $dateFilter: Int = 0) { - swapPool(id: $id) { - id - lpToken - liabilities - totalSupply - unlocking - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - poolDays(where: {date_gte: $dateFilter}, orderBy: date, orderDirection: desc) { - date - id - liabilities - totalSupply - unlocking - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - } - } -} - ` as unknown as DocumentNode; - - - -export type Requester = (doc: DocumentNode, vars?: V, options?: C) => Promise | AsyncIterable -export function getSdk(requester: Requester) { - return { - getPools(variables?: getPoolsQueryVariables, options?: C): Promise { - return requester(getPoolsDocument, variables, options) as Promise; - }, - getPool(variables: getPoolQueryVariables, options?: C): Promise { - return requester(getPoolDocument, variables, options) as Promise; - } - }; -} -export type Sdk = ReturnType; \ No newline at end of file +export const subscribe: SubscribeMeshFn = (...args) => getBuiltGraphClient().then(({ subscribe }) => subscribe(...args)); \ No newline at end of file diff --git a/packages/graph-client/.graphclient/persisted_operations.json b/packages/graph-client/.graphclient/persisted_operations.json deleted file mode 100644 index b388728..0000000 --- a/packages/graph-client/.graphclient/persisted_operations.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "98c63358415be36b74d4c017fc8198b826be5620510a9413d010570af1b4c69f": "query getPools($dateFilter: Int = 0, $first: Int = 1000, $skip: Int = 0) {\n swapPools {\n id\n lpToken\n liabilities\n totalSupply\n unlocking\n volume\n volumeUSD\n fees\n feesUSD\n lpRewards\n lpRewardsUSD\n poolDays(where: {date_gte: $dateFilter}, orderBy: date, orderDirection: desc) {\n date\n id\n liabilities\n totalSupply\n unlocking\n volume\n volumeUSD\n fees\n feesUSD\n lpRewards\n lpRewardsUSD\n }\n }\n}\n\nquery getPool($id: ID!, $dateFilter: Int = 0) {\n swapPool(id: $id) {\n id\n lpToken\n liabilities\n totalSupply\n unlocking\n volume\n volumeUSD\n fees\n feesUSD\n lpRewards\n lpRewardsUSD\n poolDays(where: {date_gte: $dateFilter}, orderBy: date, orderDirection: desc) {\n date\n id\n liabilities\n totalSupply\n unlocking\n volume\n volumeUSD\n fees\n feesUSD\n lpRewards\n lpRewardsUSD\n }\n }\n}" -} \ No newline at end of file diff --git a/packages/graph-client/.graphclient/schema.graphql b/packages/graph-client/.graphclient/schema.graphql index 22e29a3..d2d5a8e 100644 --- a/packages/graph-client/.graphclient/schema.graphql +++ b/packages/graph-client/.graphclient/schema.graphql @@ -545,6 +545,120 @@ enum OrderDirection { desc } +type PreLaunch { + id: ID! + amount: BigInt! + weightedAmount: BigInt! +} + +type PreLaunchPosition { + id: ID! + account: Bytes! + amount: BigInt! + weightedAmount: BigInt! + duration: BigInt! + claimed: Boolean! +} + +input PreLaunchPosition_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + account: Bytes + account_not: Bytes + account_gt: Bytes + account_lt: Bytes + account_gte: Bytes + account_lte: Bytes + account_in: [Bytes!] + account_not_in: [Bytes!] + account_contains: Bytes + account_not_contains: Bytes + amount: BigInt + amount_not: BigInt + amount_gt: BigInt + amount_lt: BigInt + amount_gte: BigInt + amount_lte: BigInt + amount_in: [BigInt!] + amount_not_in: [BigInt!] + weightedAmount: BigInt + weightedAmount_not: BigInt + weightedAmount_gt: BigInt + weightedAmount_lt: BigInt + weightedAmount_gte: BigInt + weightedAmount_lte: BigInt + weightedAmount_in: [BigInt!] + weightedAmount_not_in: [BigInt!] + duration: BigInt + duration_not: BigInt + duration_gt: BigInt + duration_lt: BigInt + duration_gte: BigInt + duration_lte: BigInt + duration_in: [BigInt!] + duration_not_in: [BigInt!] + claimed: Boolean + claimed_not: Boolean + claimed_in: [Boolean!] + claimed_not_in: [Boolean!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [PreLaunchPosition_filter] + or: [PreLaunchPosition_filter] +} + +enum PreLaunchPosition_orderBy { + id + account + amount + weightedAmount + duration + claimed +} + +input PreLaunch_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + amount: BigInt + amount_not: BigInt + amount_gt: BigInt + amount_lt: BigInt + amount_gte: BigInt + amount_lte: BigInt + amount_in: [BigInt!] + amount_not_in: [BigInt!] + weightedAmount: BigInt + weightedAmount_not: BigInt + weightedAmount_gt: BigInt + weightedAmount_lt: BigInt + weightedAmount_gte: BigInt + weightedAmount_lte: BigInt + weightedAmount_in: [BigInt!] + weightedAmount_not_in: [BigInt!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [PreLaunch_filter] + or: [PreLaunch_filter] +} + +enum PreLaunch_orderBy { + id + amount + weightedAmount +} + type Query { batchUnlockBought( id: ID! @@ -832,7 +946,7 @@ type Query { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [Withdraw!]! - swapLPTokenTransfer( + swapLPTokenTransferEvent( id: ID! """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. @@ -842,13 +956,13 @@ type Query { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): SwapLPTokenTransfer - swapLPTokenTransfers( + ): SwapLPTokenTransferEvent + swapLPTokenTransferEvents( skip: Int = 0 first: Int = 100 - orderBy: SwapLPTokenTransfer_orderBy + orderBy: SwapLPTokenTransferEvent_orderBy orderDirection: OrderDirection - where: SwapLPTokenTransfer_filter + where: SwapLPTokenTransferEvent_filter """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. """ @@ -857,7 +971,7 @@ type Query { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): [SwapLPTokenTransfer!]! + ): [SwapLPTokenTransferEvent!]! user( id: ID! """ @@ -910,6 +1024,58 @@ type Query { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [LiquidityPosition!]! + preLaunchPosition( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunchPosition + preLaunchPositions( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunchPosition_orderBy + orderDirection: OrderDirection + where: PreLaunchPosition_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunchPosition!]! + preLaunch( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunch + preLaunches( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunch_orderBy + orderDirection: OrderDirection + where: PreLaunch_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunch!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } @@ -1280,7 +1446,7 @@ type Subscription { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [Withdraw!]! - swapLPTokenTransfer( + swapLPTokenTransferEvent( id: ID! """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. @@ -1290,13 +1456,13 @@ type Subscription { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): SwapLPTokenTransfer - swapLPTokenTransfers( + ): SwapLPTokenTransferEvent + swapLPTokenTransferEvents( skip: Int = 0 first: Int = 100 - orderBy: SwapLPTokenTransfer_orderBy + orderBy: SwapLPTokenTransferEvent_orderBy orderDirection: OrderDirection - where: SwapLPTokenTransfer_filter + where: SwapLPTokenTransferEvent_filter """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. """ @@ -1305,7 +1471,7 @@ type Subscription { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): [SwapLPTokenTransfer!]! + ): [SwapLPTokenTransferEvent!]! user( id: ID! """ @@ -1358,6 +1524,58 @@ type Subscription { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [LiquidityPosition!]! + preLaunchPosition( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunchPosition + preLaunchPositions( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunchPosition_orderBy + orderDirection: OrderDirection + where: PreLaunchPosition_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunchPosition!]! + preLaunch( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunch + preLaunches( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunch_orderBy + orderDirection: OrderDirection + where: PreLaunch_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunch!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } @@ -1376,7 +1594,7 @@ type Swap { transactionHash: Bytes! } -type SwapLPTokenTransfer { +type SwapLPTokenTransferEvent { id: ID! timestamp: Int! blockNumber: BigInt! @@ -1386,7 +1604,7 @@ type SwapLPTokenTransfer { SwapPool: SwapPool! } -input SwapLPTokenTransfer_filter { +input SwapLPTokenTransferEvent_filter { id: ID id_not: ID id_gt: ID @@ -1482,11 +1700,11 @@ input SwapLPTokenTransfer_filter { SwapPool_: SwapPool_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter - and: [SwapLPTokenTransfer_filter] - or: [SwapLPTokenTransfer_filter] + and: [SwapLPTokenTransferEvent_filter] + or: [SwapLPTokenTransferEvent_filter] } -enum SwapLPTokenTransfer_orderBy { +enum SwapLPTokenTransferEvent_orderBy { id timestamp blockNumber diff --git a/packages/graph-client/.graphclient/sources/lpEth/introspectionSchema.ts b/packages/graph-client/.graphclient/sources/lpEth/introspectionSchema.ts index 2b8c1e3..0de16c9 100644 --- a/packages/graph-client/.graphclient/sources/lpEth/introspectionSchema.ts +++ b/packages/graph-client/.graphclient/sources/lpEth/introspectionSchema.ts @@ -7499,14 +7499,2065 @@ const schemaAST = { "kind": "ObjectTypeDefinition", "name": { "kind": "Name", - "value": "Query" + "value": "PreLaunch" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "amount" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "PreLaunchPosition" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "account" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "amount" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "duration" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "claimed" + }, + "arguments": [], + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + }, + "directives": [] + } + ], + "interfaces": [], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "PreLaunchPosition_filter" }, "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "account_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "duration_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "claimed" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "claimed_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "claimed_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "claimed_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Boolean" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "PreLaunchPosition_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "PreLaunchPosition_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "PreLaunchPosition_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "account" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "amount" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "duration" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "claimed" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "InputObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "PreLaunch_filter" + }, + "fields": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "amount_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_not" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BigInt" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "PreLaunch_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "PreLaunch_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "PreLaunch_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "amount" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "weightedAmount" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Query" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "batchUnlockBought" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockBought" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "batchUnlockBoughts" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockBought_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockBought_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockBought" + } + } + } + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "batchUnlockRedeemed" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockRedeemed" + } + }, + "directives": [] + }, + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "batchUnlockRedeemeds" + }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockRedeemed_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockRedeemed_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], + "type": { + "kind": "NonNullType", + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockRedeemed" + } + } + } + } + }, + "directives": [] + }, { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockBought" + "value": "claimWithdrawRequest" }, "arguments": [ { @@ -7579,7 +9630,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought" + "value": "ClaimWithdrawRequest" } }, "directives": [] @@ -7588,7 +9639,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockBoughts" + "value": "claimWithdrawRequests" }, "arguments": [ { @@ -7639,7 +9690,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought_orderBy" + "value": "ClaimWithdrawRequest_orderBy" } }, "directives": [] @@ -7669,7 +9720,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought_filter" + "value": "ClaimWithdrawRequest_filter" } }, "directives": [] @@ -7732,7 +9783,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought" + "value": "ClaimWithdrawRequest" } } } @@ -7744,7 +9795,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockRedeemed" + "value": "swap" }, "arguments": [ { @@ -7817,7 +9868,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed" + "value": "Swap" } }, "directives": [] @@ -7826,7 +9877,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockRedeemeds" + "value": "swaps" }, "arguments": [ { @@ -7877,7 +9928,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed_orderBy" + "value": "Swap_orderBy" } }, "directives": [] @@ -7907,7 +9958,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed_filter" + "value": "Swap_filter" } }, "directives": [] @@ -7970,7 +10021,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed" + "value": "Swap" } } } @@ -7982,7 +10033,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claimWithdrawRequest" + "value": "deposit" }, "arguments": [ { @@ -8055,7 +10106,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest" + "value": "Deposit" } }, "directives": [] @@ -8064,7 +10115,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claimWithdrawRequests" + "value": "deposits" }, "arguments": [ { @@ -8115,7 +10166,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest_orderBy" + "value": "Deposit_orderBy" } }, "directives": [] @@ -8145,7 +10196,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest_filter" + "value": "Deposit_filter" } }, "directives": [] @@ -8208,7 +10259,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest" + "value": "Deposit" } } } @@ -8220,7 +10271,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swap" + "value": "relayerRewardsClaimed" }, "arguments": [ { @@ -8293,7 +10344,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap" + "value": "RelayerRewardsClaimed" } }, "directives": [] @@ -8302,7 +10353,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swaps" + "value": "relayerRewardsClaimeds" }, "arguments": [ { @@ -8353,7 +10404,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap_orderBy" + "value": "RelayerRewardsClaimed_orderBy" } }, "directives": [] @@ -8383,7 +10434,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap_filter" + "value": "RelayerRewardsClaimed_filter" } }, "directives": [] @@ -8446,7 +10497,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap" + "value": "RelayerRewardsClaimed" } } } @@ -8458,7 +10509,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "deposit" + "value": "swapPool" }, "arguments": [ { @@ -8531,7 +10582,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit" + "value": "SwapPool" } }, "directives": [] @@ -8540,7 +10591,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "deposits" + "value": "swapPools" }, "arguments": [ { @@ -8591,7 +10642,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit_orderBy" + "value": "SwapPool_orderBy" } }, "directives": [] @@ -8621,7 +10672,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit_filter" + "value": "SwapPool_filter" } }, "directives": [] @@ -8684,7 +10735,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit" + "value": "SwapPool" } } } @@ -8696,7 +10747,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "relayerRewardsClaimed" + "value": "swapPoolDay" }, "arguments": [ { @@ -8769,7 +10820,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed" + "value": "SwapPoolDay" } }, "directives": [] @@ -8778,7 +10829,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "relayerRewardsClaimeds" + "value": "swapPoolDays" }, "arguments": [ { @@ -8829,7 +10880,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed_orderBy" + "value": "SwapPoolDay_orderBy" } }, "directives": [] @@ -8859,7 +10910,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed_filter" + "value": "SwapPoolDay_filter" } }, "directives": [] @@ -8922,7 +10973,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed" + "value": "SwapPoolDay" } } } @@ -8934,7 +10985,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPool" + "value": "unlockBought" }, "arguments": [ { @@ -9007,7 +11058,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool" + "value": "UnlockBought" } }, "directives": [] @@ -9016,7 +11067,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPools" + "value": "unlockBoughts" }, "arguments": [ { @@ -9067,7 +11118,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool_orderBy" + "value": "UnlockBought_orderBy" } }, "directives": [] @@ -9097,7 +11148,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool_filter" + "value": "UnlockBought_filter" } }, "directives": [] @@ -9160,7 +11211,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool" + "value": "UnlockBought" } } } @@ -9172,7 +11223,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPoolDay" + "value": "unlockRedeemed" }, "arguments": [ { @@ -9245,7 +11296,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay" + "value": "UnlockRedeemed" } }, "directives": [] @@ -9254,7 +11305,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPoolDays" + "value": "unlockRedeemeds" }, "arguments": [ { @@ -9305,7 +11356,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay_orderBy" + "value": "UnlockRedeemed_orderBy" } }, "directives": [] @@ -9335,7 +11386,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay_filter" + "value": "UnlockRedeemed_filter" } }, "directives": [] @@ -9398,7 +11449,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay" + "value": "UnlockRedeemed" } } } @@ -9410,7 +11461,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockBought" + "value": "withdraw" }, "arguments": [ { @@ -9483,7 +11534,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought" + "value": "Withdraw" } }, "directives": [] @@ -9492,7 +11543,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockBoughts" + "value": "withdraws" }, "arguments": [ { @@ -9543,7 +11594,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought_orderBy" + "value": "Withdraw_orderBy" } }, "directives": [] @@ -9573,7 +11624,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought_filter" + "value": "Withdraw_filter" } }, "directives": [] @@ -9636,7 +11687,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought" + "value": "Withdraw" } } } @@ -9648,7 +11699,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockRedeemed" + "value": "swapLPTokenTransferEvent" }, "arguments": [ { @@ -9721,7 +11772,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed" + "value": "SwapLPTokenTransferEvent" } }, "directives": [] @@ -9730,7 +11781,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockRedeemeds" + "value": "swapLPTokenTransferEvents" }, "arguments": [ { @@ -9781,7 +11832,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed_orderBy" + "value": "SwapLPTokenTransferEvent_orderBy" } }, "directives": [] @@ -9811,7 +11862,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed_filter" + "value": "SwapLPTokenTransferEvent_filter" } }, "directives": [] @@ -9874,7 +11925,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed" + "value": "SwapLPTokenTransferEvent" } } } @@ -9886,7 +11937,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "withdraw" + "value": "user" }, "arguments": [ { @@ -9959,7 +12010,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw" + "value": "User" } }, "directives": [] @@ -9968,7 +12019,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "withdraws" + "value": "users" }, "arguments": [ { @@ -10019,7 +12070,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw_orderBy" + "value": "User_orderBy" } }, "directives": [] @@ -10049,7 +12100,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw_filter" + "value": "User_filter" } }, "directives": [] @@ -10112,7 +12163,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw" + "value": "User" } } } @@ -10124,7 +12175,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapLPTokenTransfer" + "value": "liquidityPosition" }, "arguments": [ { @@ -10197,7 +12248,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer" + "value": "LiquidityPosition" } }, "directives": [] @@ -10206,7 +12257,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapLPTokenTransfers" + "value": "liquidityPositions" }, "arguments": [ { @@ -10257,7 +12308,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_orderBy" + "value": "LiquidityPosition_orderBy" } }, "directives": [] @@ -10287,7 +12338,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_filter" + "value": "LiquidityPosition_filter" } }, "directives": [] @@ -10350,7 +12401,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer" + "value": "LiquidityPosition" } } } @@ -10362,7 +12413,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "user" + "value": "preLaunchPosition" }, "arguments": [ { @@ -10435,7 +12486,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User" + "value": "PreLaunchPosition" } }, "directives": [] @@ -10444,7 +12495,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "users" + "value": "preLaunchPositions" }, "arguments": [ { @@ -10495,7 +12546,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User_orderBy" + "value": "PreLaunchPosition_orderBy" } }, "directives": [] @@ -10525,7 +12576,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User_filter" + "value": "PreLaunchPosition_filter" } }, "directives": [] @@ -10588,7 +12639,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User" + "value": "PreLaunchPosition" } } } @@ -10600,7 +12651,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "liquidityPosition" + "value": "preLaunch" }, "arguments": [ { @@ -10673,7 +12724,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition" + "value": "PreLaunch" } }, "directives": [] @@ -10682,7 +12733,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "liquidityPositions" + "value": "preLaunches" }, "arguments": [ { @@ -10733,7 +12784,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition_orderBy" + "value": "PreLaunch_orderBy" } }, "directives": [] @@ -10763,7 +12814,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition_filter" + "value": "PreLaunch_filter" } }, "directives": [] @@ -10826,7 +12877,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition" + "value": "PreLaunch" } } } @@ -11758,80 +13809,493 @@ const schemaAST = { "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lt" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_gte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_lte" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_in" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "transactionHash_not_contains" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Bytes" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Filter for the block changed event.", + "block": true + }, + "name": { + "kind": "Name", + "value": "_change_block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BlockChangedFilter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "and" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "RelayerRewardsClaimed_filter" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "or" + }, + "type": { + "kind": "ListType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "RelayerRewardsClaimed_filter" + } + } + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "EnumTypeDefinition", + "name": { + "kind": "Name", + "value": "RelayerRewardsClaimed_orderBy" + }, + "values": [ + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", + "name": { + "kind": "Name", + "value": "relayer" + }, + "directives": [] + }, + { + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "transactionHash_gt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } + "value": "rewards" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "transactionHash_lt" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } + "value": "blockNumber" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "transactionHash_gte" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } + "value": "blockTimestamp" }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "EnumValueDefinition", "name": { "kind": "Name", - "value": "transactionHash_lte" + "value": "transactionHash" + }, + "directives": [] + } + ], + "directives": [] + }, + { + "kind": "ObjectTypeDefinition", + "name": { + "kind": "Name", + "value": "Subscription" + }, + "fields": [ + { + "kind": "FieldDefinition", + "name": { + "kind": "Name", + "value": "batchUnlockBought" }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "BatchUnlockBought" } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "transactionHash_in" + "value": "batchUnlockBoughts" }, + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockBought_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockBought_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] + } + ], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NonNullType", + "kind": "ListType", "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockBought" + } } } } @@ -11839,185 +14303,248 @@ const schemaAST = { "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "transactionHash_not_in" + "value": "batchUnlockRedeemed" }, - "type": { - "kind": "ListType", - "type": { - "kind": "NonNullType", + "arguments": [ + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "id" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "ID" + } + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "Bytes" + "value": "Block_height" } - } - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "transactionHash_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" - } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "transactionHash_not_contains" - }, - "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "Bytes" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "description": { - "kind": "StringValue", - "value": "Filter for the block changed event.", - "block": true - }, - "name": { - "kind": "Name", - "value": "_change_block" - }, + ], "type": { "kind": "NamedType", "name": { "kind": "Name", - "value": "BlockChangedFilter" + "value": "BatchUnlockRedeemed" } }, "directives": [] }, { - "kind": "InputValueDefinition", + "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "and" + "value": "batchUnlockRedeemeds" }, - "type": { - "kind": "ListType", - "type": { - "kind": "NamedType", + "arguments": [ + { + "kind": "InputValueDefinition", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed_filter" - } + "value": "skip" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "0" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "first" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Int" + } + }, + "defaultValue": { + "kind": "IntValue", + "value": "100" + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderBy" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockRedeemed_orderBy" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "orderDirection" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "OrderDirection" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "name": { + "kind": "Name", + "value": "where" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockRedeemed_filter" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted.", + "block": true + }, + "name": { + "kind": "Name", + "value": "block" + }, + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "Block_height" + } + }, + "directives": [] + }, + { + "kind": "InputValueDefinition", + "description": { + "kind": "StringValue", + "value": "Set to `allow` to receive data even if the subgraph has skipped over errors while syncing.", + "block": true + }, + "name": { + "kind": "Name", + "value": "subgraphError" + }, + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "_SubgraphErrorPolicy_" + } + } + }, + "defaultValue": { + "kind": "EnumValue", + "value": "deny" + }, + "directives": [] } - }, - "directives": [] - }, - { - "kind": "InputValueDefinition", - "name": { - "kind": "Name", - "value": "or" - }, + ], "type": { - "kind": "ListType", + "kind": "NonNullType", "type": { - "kind": "NamedType", - "name": { - "kind": "Name", - "value": "RelayerRewardsClaimed_filter" + "kind": "ListType", + "type": { + "kind": "NonNullType", + "type": { + "kind": "NamedType", + "name": { + "kind": "Name", + "value": "BatchUnlockRedeemed" + } + } } } }, "directives": [] - } - ], - "directives": [] - }, - { - "kind": "EnumTypeDefinition", - "name": { - "kind": "Name", - "value": "RelayerRewardsClaimed_orderBy" - }, - "values": [ - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "id" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "relayer" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "rewards" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "blockNumber" - }, - "directives": [] - }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "blockTimestamp" - }, - "directives": [] }, - { - "kind": "EnumValueDefinition", - "name": { - "kind": "Name", - "value": "transactionHash" - }, - "directives": [] - } - ], - "directives": [] - }, - { - "kind": "ObjectTypeDefinition", - "name": { - "kind": "Name", - "value": "Subscription" - }, - "fields": [ { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockBought" + "value": "claimWithdrawRequest" }, "arguments": [ { @@ -12090,7 +14617,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought" + "value": "ClaimWithdrawRequest" } }, "directives": [] @@ -12099,7 +14626,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockBoughts" + "value": "claimWithdrawRequests" }, "arguments": [ { @@ -12150,7 +14677,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought_orderBy" + "value": "ClaimWithdrawRequest_orderBy" } }, "directives": [] @@ -12180,7 +14707,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought_filter" + "value": "ClaimWithdrawRequest_filter" } }, "directives": [] @@ -12243,7 +14770,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockBought" + "value": "ClaimWithdrawRequest" } } } @@ -12255,7 +14782,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockRedeemed" + "value": "swap" }, "arguments": [ { @@ -12328,7 +14855,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed" + "value": "Swap" } }, "directives": [] @@ -12337,7 +14864,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "batchUnlockRedeemeds" + "value": "swaps" }, "arguments": [ { @@ -12388,7 +14915,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed_orderBy" + "value": "Swap_orderBy" } }, "directives": [] @@ -12418,7 +14945,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed_filter" + "value": "Swap_filter" } }, "directives": [] @@ -12481,7 +15008,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "BatchUnlockRedeemed" + "value": "Swap" } } } @@ -12493,7 +15020,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claimWithdrawRequest" + "value": "deposit" }, "arguments": [ { @@ -12566,7 +15093,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest" + "value": "Deposit" } }, "directives": [] @@ -12575,7 +15102,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "claimWithdrawRequests" + "value": "deposits" }, "arguments": [ { @@ -12626,7 +15153,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest_orderBy" + "value": "Deposit_orderBy" } }, "directives": [] @@ -12656,7 +15183,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest_filter" + "value": "Deposit_filter" } }, "directives": [] @@ -12719,7 +15246,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "ClaimWithdrawRequest" + "value": "Deposit" } } } @@ -12731,7 +15258,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swap" + "value": "relayerRewardsClaimed" }, "arguments": [ { @@ -12804,7 +15331,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap" + "value": "RelayerRewardsClaimed" } }, "directives": [] @@ -12813,7 +15340,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swaps" + "value": "relayerRewardsClaimeds" }, "arguments": [ { @@ -12864,7 +15391,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap_orderBy" + "value": "RelayerRewardsClaimed_orderBy" } }, "directives": [] @@ -12894,7 +15421,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap_filter" + "value": "RelayerRewardsClaimed_filter" } }, "directives": [] @@ -12957,7 +15484,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Swap" + "value": "RelayerRewardsClaimed" } } } @@ -12969,7 +15496,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "deposit" + "value": "swapPool" }, "arguments": [ { @@ -13042,7 +15569,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit" + "value": "SwapPool" } }, "directives": [] @@ -13051,7 +15578,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "deposits" + "value": "swapPools" }, "arguments": [ { @@ -13102,7 +15629,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit_orderBy" + "value": "SwapPool_orderBy" } }, "directives": [] @@ -13132,7 +15659,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit_filter" + "value": "SwapPool_filter" } }, "directives": [] @@ -13195,7 +15722,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Deposit" + "value": "SwapPool" } } } @@ -13207,7 +15734,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "relayerRewardsClaimed" + "value": "swapPoolDay" }, "arguments": [ { @@ -13280,7 +15807,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed" + "value": "SwapPoolDay" } }, "directives": [] @@ -13289,7 +15816,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "relayerRewardsClaimeds" + "value": "swapPoolDays" }, "arguments": [ { @@ -13340,7 +15867,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed_orderBy" + "value": "SwapPoolDay_orderBy" } }, "directives": [] @@ -13370,7 +15897,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed_filter" + "value": "SwapPoolDay_filter" } }, "directives": [] @@ -13433,7 +15960,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "RelayerRewardsClaimed" + "value": "SwapPoolDay" } } } @@ -13445,7 +15972,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPool" + "value": "unlockBought" }, "arguments": [ { @@ -13518,7 +16045,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool" + "value": "UnlockBought" } }, "directives": [] @@ -13527,7 +16054,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPools" + "value": "unlockBoughts" }, "arguments": [ { @@ -13578,7 +16105,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool_orderBy" + "value": "UnlockBought_orderBy" } }, "directives": [] @@ -13608,7 +16135,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool_filter" + "value": "UnlockBought_filter" } }, "directives": [] @@ -13671,7 +16198,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPool" + "value": "UnlockBought" } } } @@ -13683,7 +16210,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPoolDay" + "value": "unlockRedeemed" }, "arguments": [ { @@ -13756,7 +16283,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay" + "value": "UnlockRedeemed" } }, "directives": [] @@ -13765,7 +16292,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapPoolDays" + "value": "unlockRedeemeds" }, "arguments": [ { @@ -13816,7 +16343,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay_orderBy" + "value": "UnlockRedeemed_orderBy" } }, "directives": [] @@ -13846,7 +16373,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay_filter" + "value": "UnlockRedeemed_filter" } }, "directives": [] @@ -13909,7 +16436,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapPoolDay" + "value": "UnlockRedeemed" } } } @@ -13921,7 +16448,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockBought" + "value": "withdraw" }, "arguments": [ { @@ -13994,7 +16521,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought" + "value": "Withdraw" } }, "directives": [] @@ -14003,7 +16530,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockBoughts" + "value": "withdraws" }, "arguments": [ { @@ -14054,7 +16581,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought_orderBy" + "value": "Withdraw_orderBy" } }, "directives": [] @@ -14084,7 +16611,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought_filter" + "value": "Withdraw_filter" } }, "directives": [] @@ -14147,7 +16674,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockBought" + "value": "Withdraw" } } } @@ -14159,7 +16686,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockRedeemed" + "value": "swapLPTokenTransferEvent" }, "arguments": [ { @@ -14232,7 +16759,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed" + "value": "SwapLPTokenTransferEvent" } }, "directives": [] @@ -14241,7 +16768,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "unlockRedeemeds" + "value": "swapLPTokenTransferEvents" }, "arguments": [ { @@ -14292,7 +16819,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed_orderBy" + "value": "SwapLPTokenTransferEvent_orderBy" } }, "directives": [] @@ -14322,7 +16849,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed_filter" + "value": "SwapLPTokenTransferEvent_filter" } }, "directives": [] @@ -14385,7 +16912,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "UnlockRedeemed" + "value": "SwapLPTokenTransferEvent" } } } @@ -14397,7 +16924,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "withdraw" + "value": "user" }, "arguments": [ { @@ -14470,7 +16997,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw" + "value": "User" } }, "directives": [] @@ -14479,7 +17006,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "withdraws" + "value": "users" }, "arguments": [ { @@ -14530,7 +17057,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw_orderBy" + "value": "User_orderBy" } }, "directives": [] @@ -14560,7 +17087,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw_filter" + "value": "User_filter" } }, "directives": [] @@ -14623,7 +17150,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "Withdraw" + "value": "User" } } } @@ -14635,7 +17162,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapLPTokenTransfer" + "value": "liquidityPosition" }, "arguments": [ { @@ -14708,7 +17235,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer" + "value": "LiquidityPosition" } }, "directives": [] @@ -14717,7 +17244,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "swapLPTokenTransfers" + "value": "liquidityPositions" }, "arguments": [ { @@ -14768,7 +17295,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_orderBy" + "value": "LiquidityPosition_orderBy" } }, "directives": [] @@ -14798,7 +17325,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_filter" + "value": "LiquidityPosition_filter" } }, "directives": [] @@ -14861,7 +17388,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer" + "value": "LiquidityPosition" } } } @@ -14873,7 +17400,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "user" + "value": "preLaunchPosition" }, "arguments": [ { @@ -14946,7 +17473,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User" + "value": "PreLaunchPosition" } }, "directives": [] @@ -14955,7 +17482,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "users" + "value": "preLaunchPositions" }, "arguments": [ { @@ -15006,7 +17533,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User_orderBy" + "value": "PreLaunchPosition_orderBy" } }, "directives": [] @@ -15036,7 +17563,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User_filter" + "value": "PreLaunchPosition_filter" } }, "directives": [] @@ -15099,7 +17626,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "User" + "value": "PreLaunchPosition" } } } @@ -15111,7 +17638,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "liquidityPosition" + "value": "preLaunch" }, "arguments": [ { @@ -15184,7 +17711,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition" + "value": "PreLaunch" } }, "directives": [] @@ -15193,7 +17720,7 @@ const schemaAST = { "kind": "FieldDefinition", "name": { "kind": "Name", - "value": "liquidityPositions" + "value": "preLaunches" }, "arguments": [ { @@ -15244,7 +17771,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition_orderBy" + "value": "PreLaunch_orderBy" } }, "directives": [] @@ -15274,7 +17801,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition_filter" + "value": "PreLaunch_filter" } }, "directives": [] @@ -15337,7 +17864,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "LiquidityPosition" + "value": "PreLaunch" } } } @@ -15610,7 +18137,7 @@ const schemaAST = { "kind": "ObjectTypeDefinition", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer" + "value": "SwapLPTokenTransferEvent" }, "fields": [ { @@ -15754,7 +18281,7 @@ const schemaAST = { "kind": "InputObjectTypeDefinition", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_filter" + "value": "SwapLPTokenTransferEvent_filter" }, "fields": [ { @@ -17268,7 +19795,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_filter" + "value": "SwapLPTokenTransferEvent_filter" } } }, @@ -17286,7 +19813,7 @@ const schemaAST = { "kind": "NamedType", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_filter" + "value": "SwapLPTokenTransferEvent_filter" } } }, @@ -17299,7 +19826,7 @@ const schemaAST = { "kind": "EnumTypeDefinition", "name": { "kind": "Name", - "value": "SwapLPTokenTransfer_orderBy" + "value": "SwapLPTokenTransferEvent_orderBy" }, "values": [ { diff --git a/packages/graph-client/.graphclient/sources/lpEth/schema.graphql b/packages/graph-client/.graphclient/sources/lpEth/schema.graphql index 22e29a3..d2d5a8e 100644 --- a/packages/graph-client/.graphclient/sources/lpEth/schema.graphql +++ b/packages/graph-client/.graphclient/sources/lpEth/schema.graphql @@ -545,6 +545,120 @@ enum OrderDirection { desc } +type PreLaunch { + id: ID! + amount: BigInt! + weightedAmount: BigInt! +} + +type PreLaunchPosition { + id: ID! + account: Bytes! + amount: BigInt! + weightedAmount: BigInt! + duration: BigInt! + claimed: Boolean! +} + +input PreLaunchPosition_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + account: Bytes + account_not: Bytes + account_gt: Bytes + account_lt: Bytes + account_gte: Bytes + account_lte: Bytes + account_in: [Bytes!] + account_not_in: [Bytes!] + account_contains: Bytes + account_not_contains: Bytes + amount: BigInt + amount_not: BigInt + amount_gt: BigInt + amount_lt: BigInt + amount_gte: BigInt + amount_lte: BigInt + amount_in: [BigInt!] + amount_not_in: [BigInt!] + weightedAmount: BigInt + weightedAmount_not: BigInt + weightedAmount_gt: BigInt + weightedAmount_lt: BigInt + weightedAmount_gte: BigInt + weightedAmount_lte: BigInt + weightedAmount_in: [BigInt!] + weightedAmount_not_in: [BigInt!] + duration: BigInt + duration_not: BigInt + duration_gt: BigInt + duration_lt: BigInt + duration_gte: BigInt + duration_lte: BigInt + duration_in: [BigInt!] + duration_not_in: [BigInt!] + claimed: Boolean + claimed_not: Boolean + claimed_in: [Boolean!] + claimed_not_in: [Boolean!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [PreLaunchPosition_filter] + or: [PreLaunchPosition_filter] +} + +enum PreLaunchPosition_orderBy { + id + account + amount + weightedAmount + duration + claimed +} + +input PreLaunch_filter { + id: ID + id_not: ID + id_gt: ID + id_lt: ID + id_gte: ID + id_lte: ID + id_in: [ID!] + id_not_in: [ID!] + amount: BigInt + amount_not: BigInt + amount_gt: BigInt + amount_lt: BigInt + amount_gte: BigInt + amount_lte: BigInt + amount_in: [BigInt!] + amount_not_in: [BigInt!] + weightedAmount: BigInt + weightedAmount_not: BigInt + weightedAmount_gt: BigInt + weightedAmount_lt: BigInt + weightedAmount_gte: BigInt + weightedAmount_lte: BigInt + weightedAmount_in: [BigInt!] + weightedAmount_not_in: [BigInt!] + """Filter for the block changed event.""" + _change_block: BlockChangedFilter + and: [PreLaunch_filter] + or: [PreLaunch_filter] +} + +enum PreLaunch_orderBy { + id + amount + weightedAmount +} + type Query { batchUnlockBought( id: ID! @@ -832,7 +946,7 @@ type Query { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [Withdraw!]! - swapLPTokenTransfer( + swapLPTokenTransferEvent( id: ID! """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. @@ -842,13 +956,13 @@ type Query { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): SwapLPTokenTransfer - swapLPTokenTransfers( + ): SwapLPTokenTransferEvent + swapLPTokenTransferEvents( skip: Int = 0 first: Int = 100 - orderBy: SwapLPTokenTransfer_orderBy + orderBy: SwapLPTokenTransferEvent_orderBy orderDirection: OrderDirection - where: SwapLPTokenTransfer_filter + where: SwapLPTokenTransferEvent_filter """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. """ @@ -857,7 +971,7 @@ type Query { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): [SwapLPTokenTransfer!]! + ): [SwapLPTokenTransferEvent!]! user( id: ID! """ @@ -910,6 +1024,58 @@ type Query { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [LiquidityPosition!]! + preLaunchPosition( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunchPosition + preLaunchPositions( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunchPosition_orderBy + orderDirection: OrderDirection + where: PreLaunchPosition_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunchPosition!]! + preLaunch( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunch + preLaunches( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunch_orderBy + orderDirection: OrderDirection + where: PreLaunch_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunch!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } @@ -1280,7 +1446,7 @@ type Subscription { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [Withdraw!]! - swapLPTokenTransfer( + swapLPTokenTransferEvent( id: ID! """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. @@ -1290,13 +1456,13 @@ type Subscription { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): SwapLPTokenTransfer - swapLPTokenTransfers( + ): SwapLPTokenTransferEvent + swapLPTokenTransferEvents( skip: Int = 0 first: Int = 100 - orderBy: SwapLPTokenTransfer_orderBy + orderBy: SwapLPTokenTransferEvent_orderBy orderDirection: OrderDirection - where: SwapLPTokenTransfer_filter + where: SwapLPTokenTransferEvent_filter """ The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. """ @@ -1305,7 +1471,7 @@ type Subscription { Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. """ subgraphError: _SubgraphErrorPolicy_! = deny - ): [SwapLPTokenTransfer!]! + ): [SwapLPTokenTransferEvent!]! user( id: ID! """ @@ -1358,6 +1524,58 @@ type Subscription { """ subgraphError: _SubgraphErrorPolicy_! = deny ): [LiquidityPosition!]! + preLaunchPosition( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunchPosition + preLaunchPositions( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunchPosition_orderBy + orderDirection: OrderDirection + where: PreLaunchPosition_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunchPosition!]! + preLaunch( + id: ID! + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): PreLaunch + preLaunches( + skip: Int = 0 + first: Int = 100 + orderBy: PreLaunch_orderBy + orderDirection: OrderDirection + where: PreLaunch_filter + """ + The block at which the query should be executed. Can either be a `{ hash: Bytes }` value containing a block hash, a `{ number: Int }` containing the block number, or a `{ number_gte: Int }` containing the minimum block number. In the case of `number_gte`, the query will be executed on the latest block only if the subgraph has progressed to or past the minimum block number. Defaults to the latest block when omitted. + """ + block: Block_height + """ + Set to `allow` to receive data even if the subgraph has skipped over errors while syncing. + """ + subgraphError: _SubgraphErrorPolicy_! = deny + ): [PreLaunch!]! """Access to subgraph metadata""" _meta(block: Block_height): _Meta_ } @@ -1376,7 +1594,7 @@ type Swap { transactionHash: Bytes! } -type SwapLPTokenTransfer { +type SwapLPTokenTransferEvent { id: ID! timestamp: Int! blockNumber: BigInt! @@ -1386,7 +1604,7 @@ type SwapLPTokenTransfer { SwapPool: SwapPool! } -input SwapLPTokenTransfer_filter { +input SwapLPTokenTransferEvent_filter { id: ID id_not: ID id_gt: ID @@ -1482,11 +1700,11 @@ input SwapLPTokenTransfer_filter { SwapPool_: SwapPool_filter """Filter for the block changed event.""" _change_block: BlockChangedFilter - and: [SwapLPTokenTransfer_filter] - or: [SwapLPTokenTransfer_filter] + and: [SwapLPTokenTransferEvent_filter] + or: [SwapLPTokenTransferEvent_filter] } -enum SwapLPTokenTransfer_orderBy { +enum SwapLPTokenTransferEvent_orderBy { id timestamp blockNumber diff --git a/packages/graph-client/.graphclient/sources/lpEth/types.ts b/packages/graph-client/.graphclient/sources/lpEth/types.ts index 5788f1d..2bc0fbf 100644 --- a/packages/graph-client/.graphclient/sources/lpEth/types.ts +++ b/packages/graph-client/.graphclient/sources/lpEth/types.ts @@ -535,6 +535,118 @@ export type OrderDirection = | 'asc' | 'desc'; +export type PreLaunch = { + id: Scalars['ID']['output']; + amount: Scalars['BigInt']['output']; + weightedAmount: Scalars['BigInt']['output']; +}; + +export type PreLaunchPosition = { + id: Scalars['ID']['output']; + account: Scalars['Bytes']['output']; + amount: Scalars['BigInt']['output']; + weightedAmount: Scalars['BigInt']['output']; + duration: Scalars['BigInt']['output']; + claimed: Scalars['Boolean']['output']; +}; + +export type PreLaunchPosition_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + account?: InputMaybe; + account_not?: InputMaybe; + account_gt?: InputMaybe; + account_lt?: InputMaybe; + account_gte?: InputMaybe; + account_lte?: InputMaybe; + account_in?: InputMaybe>; + account_not_in?: InputMaybe>; + account_contains?: InputMaybe; + account_not_contains?: InputMaybe; + amount?: InputMaybe; + amount_not?: InputMaybe; + amount_gt?: InputMaybe; + amount_lt?: InputMaybe; + amount_gte?: InputMaybe; + amount_lte?: InputMaybe; + amount_in?: InputMaybe>; + amount_not_in?: InputMaybe>; + weightedAmount?: InputMaybe; + weightedAmount_not?: InputMaybe; + weightedAmount_gt?: InputMaybe; + weightedAmount_lt?: InputMaybe; + weightedAmount_gte?: InputMaybe; + weightedAmount_lte?: InputMaybe; + weightedAmount_in?: InputMaybe>; + weightedAmount_not_in?: InputMaybe>; + duration?: InputMaybe; + duration_not?: InputMaybe; + duration_gt?: InputMaybe; + duration_lt?: InputMaybe; + duration_gte?: InputMaybe; + duration_lte?: InputMaybe; + duration_in?: InputMaybe>; + duration_not_in?: InputMaybe>; + claimed?: InputMaybe; + claimed_not?: InputMaybe; + claimed_in?: InputMaybe>; + claimed_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type PreLaunchPosition_orderBy = + | 'id' + | 'account' + | 'amount' + | 'weightedAmount' + | 'duration' + | 'claimed'; + +export type PreLaunch_filter = { + id?: InputMaybe; + id_not?: InputMaybe; + id_gt?: InputMaybe; + id_lt?: InputMaybe; + id_gte?: InputMaybe; + id_lte?: InputMaybe; + id_in?: InputMaybe>; + id_not_in?: InputMaybe>; + amount?: InputMaybe; + amount_not?: InputMaybe; + amount_gt?: InputMaybe; + amount_lt?: InputMaybe; + amount_gte?: InputMaybe; + amount_lte?: InputMaybe; + amount_in?: InputMaybe>; + amount_not_in?: InputMaybe>; + weightedAmount?: InputMaybe; + weightedAmount_not?: InputMaybe; + weightedAmount_gt?: InputMaybe; + weightedAmount_lt?: InputMaybe; + weightedAmount_gte?: InputMaybe; + weightedAmount_lte?: InputMaybe; + weightedAmount_in?: InputMaybe>; + weightedAmount_not_in?: InputMaybe>; + /** Filter for the block changed event. */ + _change_block?: InputMaybe; + and?: InputMaybe>>; + or?: InputMaybe>>; +}; + +export type PreLaunch_orderBy = + | 'id' + | 'amount' + | 'weightedAmount'; + export type Query = { batchUnlockBought?: Maybe; batchUnlockBoughts: Array; @@ -558,12 +670,16 @@ export type Query = { unlockRedeemeds: Array; withdraw?: Maybe; withdraws: Array; - swapLPTokenTransfer?: Maybe; - swapLPTokenTransfers: Array; + swapLPTokenTransferEvent?: Maybe; + swapLPTokenTransferEvents: Array; user?: Maybe; users: Array; liquidityPosition?: Maybe; liquidityPositions: Array; + preLaunchPosition?: Maybe; + preLaunchPositions: Array; + preLaunch?: Maybe; + preLaunches: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -767,19 +883,19 @@ export type QuerywithdrawsArgs = { }; -export type QueryswapLPTokenTransferArgs = { +export type QueryswapLPTokenTransferEventArgs = { id: Scalars['ID']['input']; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; -export type QueryswapLPTokenTransfersArgs = { +export type QueryswapLPTokenTransferEventsArgs = { skip?: InputMaybe; first?: InputMaybe; - orderBy?: InputMaybe; + orderBy?: InputMaybe; orderDirection?: InputMaybe; - where?: InputMaybe; + where?: InputMaybe; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; @@ -821,6 +937,42 @@ export type QueryliquidityPositionsArgs = { }; +export type QuerypreLaunchPositionArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerypreLaunchPositionsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerypreLaunchArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type QuerypreLaunchesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Query_metaArgs = { block?: InputMaybe; }; @@ -926,12 +1078,16 @@ export type Subscription = { unlockRedeemeds: Array; withdraw?: Maybe; withdraws: Array; - swapLPTokenTransfer?: Maybe; - swapLPTokenTransfers: Array; + swapLPTokenTransferEvent?: Maybe; + swapLPTokenTransferEvents: Array; user?: Maybe; users: Array; liquidityPosition?: Maybe; liquidityPositions: Array; + preLaunchPosition?: Maybe; + preLaunchPositions: Array; + preLaunch?: Maybe; + preLaunches: Array; /** Access to subgraph metadata */ _meta?: Maybe<_Meta_>; }; @@ -1135,19 +1291,19 @@ export type SubscriptionwithdrawsArgs = { }; -export type SubscriptionswapLPTokenTransferArgs = { +export type SubscriptionswapLPTokenTransferEventArgs = { id: Scalars['ID']['input']; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; -export type SubscriptionswapLPTokenTransfersArgs = { +export type SubscriptionswapLPTokenTransferEventsArgs = { skip?: InputMaybe; first?: InputMaybe; - orderBy?: InputMaybe; + orderBy?: InputMaybe; orderDirection?: InputMaybe; - where?: InputMaybe; + where?: InputMaybe; block?: InputMaybe; subgraphError?: _SubgraphErrorPolicy_; }; @@ -1189,6 +1345,42 @@ export type SubscriptionliquidityPositionsArgs = { }; +export type SubscriptionpreLaunchPositionArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionpreLaunchPositionsArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionpreLaunchArgs = { + id: Scalars['ID']['input']; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + +export type SubscriptionpreLaunchesArgs = { + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; + subgraphError?: _SubgraphErrorPolicy_; +}; + + export type Subscription_metaArgs = { block?: InputMaybe; }; @@ -1207,7 +1399,7 @@ export type Swap = { transactionHash: Scalars['Bytes']['output']; }; -export type SwapLPTokenTransfer = { +export type SwapLPTokenTransferEvent = { id: Scalars['ID']['output']; timestamp: Scalars['Int']['output']; blockNumber: Scalars['BigInt']['output']; @@ -1217,7 +1409,7 @@ export type SwapLPTokenTransfer = { SwapPool: SwapPool; }; -export type SwapLPTokenTransfer_filter = { +export type SwapLPTokenTransferEvent_filter = { id?: InputMaybe; id_not?: InputMaybe; id_gt?: InputMaybe; @@ -1313,11 +1505,11 @@ export type SwapLPTokenTransfer_filter = { SwapPool_?: InputMaybe; /** Filter for the block changed event. */ _change_block?: InputMaybe; - and?: InputMaybe>>; - or?: InputMaybe>>; + and?: InputMaybe>>; + or?: InputMaybe>>; }; -export type SwapLPTokenTransfer_orderBy = +export type SwapLPTokenTransferEvent_orderBy = | 'id' | 'timestamp' | 'blockNumber' @@ -2253,9 +2445,9 @@ export type _SubgraphErrorPolicy_ = /** null **/ withdraws: InContextSdkMethod, /** null **/ - swapLPTokenTransfer: InContextSdkMethod, + swapLPTokenTransferEvent: InContextSdkMethod, /** null **/ - swapLPTokenTransfers: InContextSdkMethod, + swapLPTokenTransferEvents: InContextSdkMethod, /** null **/ user: InContextSdkMethod, /** null **/ @@ -2264,6 +2456,14 @@ export type _SubgraphErrorPolicy_ = liquidityPosition: InContextSdkMethod, /** null **/ liquidityPositions: InContextSdkMethod, + /** null **/ + preLaunchPosition: InContextSdkMethod, + /** null **/ + preLaunchPositions: InContextSdkMethod, + /** null **/ + preLaunch: InContextSdkMethod, + /** null **/ + preLaunches: InContextSdkMethod, /** Access to subgraph metadata **/ _meta: InContextSdkMethod }; @@ -2318,9 +2518,9 @@ export type _SubgraphErrorPolicy_ = /** null **/ withdraws: InContextSdkMethod, /** null **/ - swapLPTokenTransfer: InContextSdkMethod, + swapLPTokenTransferEvent: InContextSdkMethod, /** null **/ - swapLPTokenTransfers: InContextSdkMethod, + swapLPTokenTransferEvents: InContextSdkMethod, /** null **/ user: InContextSdkMethod, /** null **/ @@ -2329,6 +2529,14 @@ export type _SubgraphErrorPolicy_ = liquidityPosition: InContextSdkMethod, /** null **/ liquidityPositions: InContextSdkMethod, + /** null **/ + preLaunchPosition: InContextSdkMethod, + /** null **/ + preLaunchPositions: InContextSdkMethod, + /** null **/ + preLaunch: InContextSdkMethod, + /** null **/ + preLaunches: InContextSdkMethod, /** Access to subgraph metadata **/ _meta: InContextSdkMethod }; diff --git a/packages/graph-client/.graphclientrc.yml b/packages/graph-client/.graphclientrc.yml index 7915b17..c15f446 100644 --- a/packages/graph-client/.graphclientrc.yml +++ b/packages/graph-client/.graphclientrc.yml @@ -3,7 +3,5 @@ sources: handler: graphql: endpoint: "https://api.studio.thegraph.com/query/93675/lpeth/version/latest" -documents: - - ./gql/**/*.gql # TODO: replace the END point with ethsubraph url :) diff --git a/packages/graph-client/gql/Pool.gql b/packages/graph-client/gql/Pool.gql deleted file mode 100644 index e3ec438..0000000 --- a/packages/graph-client/gql/Pool.gql +++ /dev/null @@ -1,75 +0,0 @@ -query getPools($dateFilter: Int = 0, $first: Int = 1000, $skip: Int = 0) { - swapPools { - id - lpToken - - liabilities - totalSupply - unlocking - - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - - poolDays( - where: { date_gte: $dateFilter } - orderBy: date - orderDirection: desc - ) { - date - id - - liabilities - totalSupply - unlocking - - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - } - } -} - -query getPool($id: ID!, $dateFilter: Int = 0) { - swapPool(id: $id) { - id - lpToken - - liabilities - totalSupply - unlocking - - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - - poolDays( - where: { date_gte: $dateFilter } - orderBy: date - orderDirection: desc - ) { - date - id - - liabilities - totalSupply - unlocking - - volume - volumeUSD - fees - feesUSD - lpRewards - lpRewardsUSD - } - } -} diff --git a/packages/graph-client/index.ts b/packages/graph-client/index.ts deleted file mode 100644 index f67b2c6..0000000 --- a/packages/graph-client/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello via Bun!"); \ No newline at end of file diff --git a/packages/graph-client/package.json b/packages/graph-client/package.json index fe410c9..13778a1 100644 --- a/packages/graph-client/package.json +++ b/packages/graph-client/package.json @@ -1,45 +1,41 @@ { "name": "graph-client", - "module": "index.ts", - "type": "module", - "scripts": { - "start": "ts-node index.ts --transpileOnly", - "build": "graphclient build && tsc", - "codegen": "graphclient build", - "dev": "graphclient serve-dev", - "prettier:check": "prettier --check \"**/*.{ts,md,yaml,gql}\"", - "prettier:write": "prettier --write \"**/*.{ts,md,yaml,gql}\"" - }, - "peerDependencies": { - "typescript": "^5.1.6" - }, + "author": "Tenderize Labs Ltd", + "license": "MIT", "dependencies": { - "@graphprotocol/client-cli": "3.0.0", - "@graphql-mesh/cache-localforage": "0.94.1", - "@graphql-mesh/cross-helpers": "0.4.0", - "@graphql-mesh/graphql": "0.94.2", - "@graphql-mesh/http": "0.94.4", - "@graphql-mesh/merger-stitching": "0.94.1", - "@graphql-mesh/runtime": "0.94.1", - "@graphql-mesh/store": "0.94.1", - "@graphql-mesh/transform-filter-schema": "0.94.1", - "@graphql-mesh/transform-prefix": "0.94.2", - "@graphql-mesh/transform-prune": "0.94.1", - "@graphql-mesh/transform-rename": "0.94.2", - "@graphql-mesh/transform-type-merging": "0.94.1", - "@graphql-mesh/types": "0.94.1", - "@graphql-mesh/utils": "0.94.1", - "@graphql-tools/merge": "9.0.0" + "@graphprotocol/client-cli": "^3.0.0", + "@graphql-mesh/cache-localforage": "0.94.1", + "@graphql-mesh/cross-helpers": "0.4.0", + "@graphql-mesh/graphql": "0.94.2", + "@graphql-mesh/http": "0.94.4", + "@graphql-mesh/merger-stitching": "0.94.1", + "@graphql-mesh/runtime": "0.94.1", + "@graphql-mesh/store": "0.94.1", + "@graphql-mesh/transform-filter-schema": "0.94.1", + "@graphql-mesh/transform-prefix": "0.94.2", + "@graphql-mesh/transform-prune": "0.94.1", + "@graphql-mesh/transform-rename": "0.94.2", + "@graphql-mesh/transform-type-merging": "0.94.1", + "@graphql-mesh/types": "0.94.1", + "@graphql-mesh/utils": "0.94.1", + "@graphql-tools/merge": "9.0.0" }, + "main": "index.js", "devDependencies": { - "@types/bun": "latest", - "@types/node": "^20.3.3", - "@typescript-eslint/eslint-plugin": "^5.59.11", - "@typescript-eslint/parser": "^5.59.11", - "eslint": "^8.42.0", - "eslint-config-prettier": "^8.8.0", - "prettier": "^2.8.8", - "ts-node": "^10.9.1", - "typescript": "^5.1.6" + "@types/node": "^20.3.3", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", + "eslint": "^8.42.0", + "eslint-config-prettier": "^8.8.0", + "prettier": "^2.8.8", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "scripts": { + "build": "graphclient build && tsc", + "codegen": "graphclient build", + "dev": "graphclient serve-dev", + "prettier:check": "prettier --check \"**/*.{ts,md,yaml,gql}\"", + "prettier:write": "prettier --write \"**/*.{ts,md,yaml,gql}\"" } } \ No newline at end of file diff --git a/packages/graph-client/tsconfig.json b/packages/graph-client/tsconfig.json index 238655f..a7085fe 100644 --- a/packages/graph-client/tsconfig.json +++ b/packages/graph-client/tsconfig.json @@ -1,27 +1,10 @@ { "compilerOptions": { - // Enable latest features - "lib": ["ESNext", "DOM"], - "target": "ESNext", - "module": "ESNext", - "moduleDetection": "force", - "jsx": "react-jsx", - "allowJs": true, - - // Bundler mode - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "noEmit": true, - - // Best practices - "strict": true, - "skipLibCheck": true, - "noFallthroughCasesInSwitch": true, - - // Some stricter flags (disabled by default) - "noUnusedLocals": false, - "noUnusedParameters": false, - "noPropertyAccessFromIndexSignature": false + "target": "ES6", + "module": "NodeNext", + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true } -} +} \ No newline at end of file From da7152fdaedd74d6d4d9b24b6179cd02cc105187 Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Tue, 18 Feb 2025 10:51:16 +0100 Subject: [PATCH 07/10] chore: lint --- bun.lockb | Bin 527879 -> 528087 bytes packages/subgraph/.eslintrc | 11 + packages/subgraph/.prettierignore | 4 + packages/subgraph/.prettierrc | 5 + packages/subgraph/package.json | 11 +- packages/subgraph/src/mappings/helpers.ts | 166 ++--- packages/subgraph/src/mappings/lpeth.ts | 706 ++++++++++---------- packages/subgraph/src/mappings/prelaunch.ts | 267 ++++---- packages/subgraph/tests/lp-eth-utils.ts | 239 ++----- packages/subgraph/tests/lp-eth.test.ts | 91 +-- 10 files changed, 654 insertions(+), 846 deletions(-) create mode 100644 packages/subgraph/.eslintrc create mode 100644 packages/subgraph/.prettierignore create mode 100644 packages/subgraph/.prettierrc diff --git a/bun.lockb b/bun.lockb index abf20eaf3041afef488dcb263cb0fc5c73e38754..db7af651f65d403d686d8dd94161a754c6ed1821 100755 GIT binary patch delta 104502 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 delta 105824 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 diff --git a/packages/subgraph/.eslintrc b/packages/subgraph/.eslintrc new file mode 100644 index 0000000..113f303 --- /dev/null +++ b/packages/subgraph/.eslintrc @@ -0,0 +1,11 @@ +{ + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "plugin:@typescript-eslint/recommended", + "prettier", + "prettier/@typescript-eslint" + ] +} \ No newline at end of file diff --git a/packages/subgraph/.prettierignore b/packages/subgraph/.prettierignore new file mode 100644 index 0000000..97b5117 --- /dev/null +++ b/packages/subgraph/.prettierignore @@ -0,0 +1,4 @@ +src/types +generated +build +abis \ No newline at end of file diff --git a/packages/subgraph/.prettierrc b/packages/subgraph/.prettierrc new file mode 100644 index 0000000..d9e642c --- /dev/null +++ b/packages/subgraph/.prettierrc @@ -0,0 +1,5 @@ +{ + "semi": false, + "singleQuote": true, + "printWidth": 120 +} \ No newline at end of file diff --git a/packages/subgraph/package.json b/packages/subgraph/package.json index c51c06a..d7d6df1 100644 --- a/packages/subgraph/package.json +++ b/packages/subgraph/package.json @@ -2,6 +2,8 @@ "name": "lpeth-subgraph", "license": "UNLICENSED", "scripts": { + "prettier:check": "prettier --check \"**/*.{ts,md,graphql}\"", + "prettier:write": "prettier --write \"**/*.{ts,md,graphql}\"", "clean" : "rm -rf build", "auth": "graph auth", "codegen": "graph codegen", @@ -17,6 +19,13 @@ "@graphprotocol/graph-ts": "0.32.0" }, "devDependencies": { - "matchstick-as": "0.5.0" + "matchstick-as": "0.5.0", + "prettier": "^2.8.8", + "typescript": "^5.1.3", + "@types/node": "^20.3.1", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", + "eslint": "^8.42.0", + "eslint-config-prettier": "^8.8.0" } } \ No newline at end of file diff --git a/packages/subgraph/src/mappings/helpers.ts b/packages/subgraph/src/mappings/helpers.ts index 21cd734..d7f1062 100644 --- a/packages/subgraph/src/mappings/helpers.ts +++ b/packages/subgraph/src/mappings/helpers.ts @@ -1,46 +1,27 @@ -import { - Address, - BigDecimal, - BigInt, - Bytes, - ethereum, -} from "@graphprotocol/graph-ts"; -import { UniswapQuoter } from "../../generated/LpETH/UniswapQuoter"; -import { SwapPool, SwapPoolDay } from "../../generated/schema"; - -export const ADDRESS_ZERO = Address.fromString( - "0x0000000000000000000000000000000000000000" -); - -export const BD_ZERO = BigDecimal.fromString("0"); -export const BI_ZERO = BigInt.fromI32(0); -export const BI_ONE = BigInt.fromI32(1); -export const BD_ONE = BigDecimal.fromString("1"); -export const BI_18 = BigInt.fromI32(18); -export const TEN_18 = BigInt.fromU32(10).pow(18); -export const TEN_6 = BigInt.fromU32(10).pow(6); -export const TEN_24 = TEN_18.times(TEN_6); // 18 decimals for normal tokens and 6 decimals for USDC - -export const QUOTER = Address.fromString( - "0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6" -); -export const WETH9_ARBITRUM = Address.fromString( - "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1" -); -export const USDC_ARBITRUM = Address.fromString( - "0xaf88d065e77c8cC2239327C5EDb3A432268e5831" -); -export const USDC_MAINNET = Address.fromString( - "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" -); -export const WETH_MAINNET = Address.fromString( - "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" -); -const REBASE_TOPIC = - "0x11c6bf55864ff83827df712625d7a80e5583eef0264921025e7cd22003a21511"; +import { Address, BigDecimal, BigInt, Bytes, ethereum } from '@graphprotocol/graph-ts' +import { UniswapQuoter } from '../../generated/LpETH/UniswapQuoter' +import { SwapPool, SwapPoolDay } from '../../generated/schema' + +export const ADDRESS_ZERO = Address.fromString('0x0000000000000000000000000000000000000000') + +export const BD_ZERO = BigDecimal.fromString('0') +export const BI_ZERO = BigInt.fromI32(0) +export const BI_ONE = BigInt.fromI32(1) +export const BD_ONE = BigDecimal.fromString('1') +export const BI_18 = BigInt.fromI32(18) +export const TEN_18 = BigInt.fromU32(10).pow(18) +export const TEN_6 = BigInt.fromU32(10).pow(6) +export const TEN_24 = TEN_18.times(TEN_6) // 18 decimals for normal tokens and 6 decimals for USDC + +export const QUOTER = Address.fromString('0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6') +export const WETH9_ARBITRUM = Address.fromString('0x82aF49447D8a07e3bd95BD0d56f35241523fBab1') +export const USDC_ARBITRUM = Address.fromString('0xaf88d065e77c8cC2239327C5EDb3A432268e5831') +export const USDC_MAINNET = Address.fromString('0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48') +export const WETH_MAINNET = Address.fromString('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2') +const REBASE_TOPIC = '0x11c6bf55864ff83827df712625d7a80e5583eef0264921025e7cd22003a21511' export const ETHUSD = (): BigDecimal => { - const quoter = UniswapQuoter.bind(QUOTER); + const quoter = UniswapQuoter.bind(QUOTER) // Call Uniswap's quoteExactInputSingle to get the ETH/USDC price const ethUsd = quoter.try_quoteExactInputSingle( @@ -49,98 +30,95 @@ export const ETHUSD = (): BigDecimal => { 3000, // Pool fee (adjust according to the pool you're using) TEN_18, // Amount of ETH (scaled by 10^18 since ETH has 18 decimals) BI_ZERO // Zero for sqrtPriceLimitX96 (no limit) - ); + ) // If the call reverted, return zero - if (ethUsd.reverted) return BD_ZERO; + if (ethUsd.reverted) return BD_ZERO // Convert the result to a decimal and adjust for USDC decimals (6 decimals) - return ethUsd.value.toBigDecimal().div(TEN_6.toBigDecimal()); -}; + return ethUsd.value.toBigDecimal().div(TEN_6.toBigDecimal()) +} export function exponentToBigDecimal(decimals: BigInt): BigDecimal { - let bd = BigDecimal.fromString("1"); + let bd = BigDecimal.fromString('1') for (let i = BI_ZERO; i.lt(decimals as BigInt); i = i.plus(BI_ONE)) { - bd = bd.times(BigDecimal.fromString("10")); + bd = bd.times(BigDecimal.fromString('10')) } - return bd; + return bd } export function convertToDecimal(eth: BigInt): BigDecimal { - return eth.toBigDecimal().div(exponentToBigDecimal(BI_18)); + return eth.toBigDecimal().div(exponentToBigDecimal(BI_18)) } export const calculateDayID = (timestamp: BigInt): BigInt => { - return timestamp.div(BigInt.fromI32(86400)).times(BigInt.fromI32(86400)); -}; + return timestamp.div(BigInt.fromI32(86400)).times(BigInt.fromI32(86400)) +} // Define the return type class DecodedTokenId { - tenderizer: string; - id: BigInt; + tenderizer: string + id: BigInt constructor(tenderizer: string, id: BigInt) { - this.tenderizer = tenderizer; - this.id = id; + this.tenderizer = tenderizer + this.id = id } } export const decodeTokenId = (tokenId: BigInt): DecodedTokenId => { - let hexId = tokenId.toHexString(); - let address = "0x" + hexId.substring(0, 20); - let uint96 = BigInt.fromUnsignedBytes( - Bytes.fromHexString(hexId.substring(20, 32)) - ); + let hexId = tokenId.toHexString() + let address = '0x' + hexId.substring(0, 20) + let uint96 = BigInt.fromUnsignedBytes(Bytes.fromHexString(hexId.substring(20, 32))) // Return the decoded values - return new DecodedTokenId(address, uint96); -}; + return new DecodedTokenId(address, uint96) +} export function findClosestRebaseEvent( receipt: ethereum.TransactionReceipt | null, contractAddress: Address, logIndex: BigInt ): BigDecimal | null { - if (receipt == null) return null; - if (logIndex == BI_ZERO) return null; + if (receipt == null) return null + if (logIndex == BI_ZERO) return null for (let i = receipt.logs.length - 1; i >= 0; i--) { - let log = receipt.logs[i]; - if (log.logIndex.ge(logIndex)) continue; + let log = receipt.logs[i] + if (log.logIndex.ge(logIndex)) continue // Check if the log is from the correct contract - if (log.address != contractAddress) continue; - if (log.topics.length == 0 || log.topics[0].toHexString() != REBASE_TOPIC) - continue; + if (log.address != contractAddress) continue + if (log.topics.length == 0 || log.topics[0].toHexString() != REBASE_TOPIC) continue // Check if the log is a Rebase event - let decoded = ethereum.decode("(uint256,uint256)", log.data); - if (decoded == null) return null; - const t = decoded.toTuple(); - return convertToDecimal(t[0].toBigInt()); + let decoded = ethereum.decode('(uint256,uint256)', log.data) + if (decoded == null) return null + const t = decoded.toTuple() + return convertToDecimal(t[0].toBigInt()) } - return null; + return null } export const initiatePoolDay = (pool: SwapPool, dayID: BigInt): SwapPoolDay => { - const poolDay = new SwapPoolDay(pool.id.concat("-").concat(dayID.toString())); - - poolDay.date = dayID.toI32(); - poolDay.pool = pool.id; - - poolDay.totalSupply = pool.totalSupply; - poolDay.liabilities = pool.liabilities; - poolDay.unlocking = pool.unlocking; - - poolDay.volume = BI_ZERO; - poolDay.volumeUSD = BD_ZERO; - poolDay.fees = BI_ZERO; - poolDay.feesUSD = BD_ZERO; - poolDay.lpRewards = BI_ZERO; - poolDay.lpRewardsUSD = BD_ZERO; - poolDay.treasuryCut = BI_ZERO; - poolDay.treasuryCutUSD = BD_ZERO; - - return poolDay; -}; + const poolDay = new SwapPoolDay(pool.id.concat('-').concat(dayID.toString())) + + poolDay.date = dayID.toI32() + poolDay.pool = pool.id + + poolDay.totalSupply = pool.totalSupply + poolDay.liabilities = pool.liabilities + poolDay.unlocking = pool.unlocking + + poolDay.volume = BI_ZERO + poolDay.volumeUSD = BD_ZERO + poolDay.fees = BI_ZERO + poolDay.feesUSD = BD_ZERO + poolDay.lpRewards = BI_ZERO + poolDay.lpRewardsUSD = BD_ZERO + poolDay.treasuryCut = BI_ZERO + poolDay.treasuryCutUSD = BD_ZERO + + return poolDay +} diff --git a/packages/subgraph/src/mappings/lpeth.ts b/packages/subgraph/src/mappings/lpeth.ts index 5d15364..85c4b8a 100644 --- a/packages/subgraph/src/mappings/lpeth.ts +++ b/packages/subgraph/src/mappings/lpeth.ts @@ -1,4 +1,4 @@ -import { BigInt } from "@graphprotocol/graph-ts"; +import { BigInt } from '@graphprotocol/graph-ts' import { BatchUnlockBought as BatchUnlockBoughtEvent, BatchUnlockRedeemed as BatchUnlockRedeemedEvent, @@ -11,7 +11,7 @@ import { UnlockBought as UnlockBoughtEvent, UnlockRedeemed as UnlockRedeemedEvent, Withdraw as WithdrawEvent, -} from "../../generated/LpETH/LpETH"; +} from '../../generated/LpETH/LpETH' import { BatchUnlockBought, BatchUnlockRedeemed, @@ -27,9 +27,9 @@ import { UnlockRedeemed, User, Withdraw, -} from "../../generated/schema"; -import { SwapPoolToken } from "../../generated/templates"; -import { Transfer as LpETHTransferEmitted } from "../../generated/templates/SwapPoolToken/ERC20"; +} from '../../generated/schema' +import { SwapPoolToken } from '../../generated/templates' +import { Transfer as LpETHTransferEmitted } from '../../generated/templates/SwapPoolToken/ERC20' import { ADDRESS_ZERO, BD_ZERO, @@ -39,445 +39,409 @@ import { ETHUSD, initiatePoolDay, TEN_18, -} from "./helpers"; +} from './helpers' -const PRELAUNCH_ADDRESS = "0xcC73341a078761AB869D90030D6632F9ea139f2b".toLowerCase() -const LPETH_ADDRESS = "0xF3a75E087A92770b4150fFF14c6d36FB07796252".toLowerCase() +const PRELAUNCH_ADDRESS = '0xcC73341a078761AB869D90030D6632F9ea139f2b'.toLowerCase() +const LPETH_ADDRESS = '0xF3a75E087A92770b4150fFF14c6d36FB07796252'.toLowerCase() export function handleInitialize(event: InitializedEvent): void { - let pool = new SwapPool(event.address.toHex()); - let lpTokenAddr = LpETH.bind(event.address).lpToken(); - - pool.totalSupply = BI_ZERO; - pool.liabilities = BI_ZERO; - pool.volume = BI_ZERO; - pool.volumeUSD = BD_ZERO; - pool.lpRewards = BI_ZERO; - pool.lpRewardsUSD = BD_ZERO; - pool.fees = BI_ZERO; - pool.feesUSD = BD_ZERO; - pool.treasuryCut = BI_ZERO; - pool.treasuryCutUSD = BD_ZERO; - pool.unlocking = BI_ZERO; - pool.id = event.address.toHex(); - pool.numSwaps = BI_ZERO; - pool.lpToken = lpTokenAddr; - pool.save(); - SwapPoolToken.create(lpTokenAddr); + let pool = new SwapPool(event.address.toHex()) + let lpTokenAddr = LpETH.bind(event.address).lpToken() + + pool.totalSupply = BI_ZERO + pool.liabilities = BI_ZERO + pool.volume = BI_ZERO + pool.volumeUSD = BD_ZERO + pool.lpRewards = BI_ZERO + pool.lpRewardsUSD = BD_ZERO + pool.fees = BI_ZERO + pool.feesUSD = BD_ZERO + pool.treasuryCut = BI_ZERO + pool.treasuryCutUSD = BD_ZERO + pool.unlocking = BI_ZERO + pool.id = event.address.toHex() + pool.numSwaps = BI_ZERO + pool.lpToken = lpTokenAddr + pool.save() + SwapPoolToken.create(lpTokenAddr) } export function handleBatchUnlockBought(event: BatchUnlockBoughtEvent): void { - let entity = new BatchUnlockBought( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.caller = event.params.caller; - entity.amount = event.params.amount; - entity.reward = event.params.reward; - entity.lpFees = event.params.lpFees; - entity.tokenIds = event.params.tokenIds; - - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; - - entity.save(); - let pool = SwapPool.load(event.address.toHex()); - if (!pool) return; - - const usdPrice = ETHUSD(); - - const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)); - const treasuryCut = event.params.amount - .minus(event.params.lpFees) - .minus(event.params.reward); - const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)); - - pool.unlocking = pool.unlocking.minus(event.params.amount); - pool.lpRewards = pool.lpRewards.plus(event.params.lpFees); - pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD); - pool.treasuryCut = pool.treasuryCut.plus(treasuryCut); - pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD); - pool.liabilities = pool.liabilities.plus(event.params.lpFees); - pool.save(); - - let dayID = calculateDayID(event.block.timestamp); - let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); - if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); - poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees); - poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD); - poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut); - poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD); - poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees); - poolDay.save(); + let entity = new BatchUnlockBought(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.caller = event.params.caller + entity.amount = event.params.amount + entity.reward = event.params.reward + entity.lpFees = event.params.lpFees + entity.tokenIds = event.params.tokenIds + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() + let pool = SwapPool.load(event.address.toHex()) + if (!pool) return + + const usdPrice = ETHUSD() + + const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)) + const treasuryCut = event.params.amount.minus(event.params.lpFees).minus(event.params.reward) + const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)) + + pool.unlocking = pool.unlocking.minus(event.params.amount) + pool.lpRewards = pool.lpRewards.plus(event.params.lpFees) + pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD) + pool.treasuryCut = pool.treasuryCut.plus(treasuryCut) + pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD) + pool.liabilities = pool.liabilities.plus(event.params.lpFees) + pool.save() + + let dayID = calculateDayID(event.block.timestamp) + let poolDay = SwapPoolDay.load(pool.id.concat('-').concat(dayID.toString())) + if (poolDay == null) poolDay = initiatePoolDay(pool, dayID) + poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees) + poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD) + poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut) + poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD) + poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees) + poolDay.save() } -export function handleBatchUnlockRedeemed( - event: BatchUnlockRedeemedEvent -): void { - let entity = new BatchUnlockRedeemed( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.relayer = event.params.relayer; - entity.amount = event.params.amount; - entity.reward = event.params.reward; - entity.lpFees = event.params.lpFees; - entity.tokenIds = event.params.tokenIds; - - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; - - entity.save(); - let pool = SwapPool.load(event.address.toHex()); - if (!pool) return; - - const usdPrice = ETHUSD(); - const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)); - - const treasuryCut = event.params.amount - .minus(event.params.lpFees) - .minus(event.params.reward); - const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)); - - pool.unlocking = pool.unlocking.minus(event.params.amount); - pool.lpRewards = pool.lpRewards.plus(event.params.lpFees); - pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD); - pool.treasuryCut = pool.treasuryCut.plus(treasuryCut); - pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD); - pool.liabilities = pool.liabilities.plus(event.params.lpFees); - pool.save(); - - let dayID = calculateDayID(event.block.timestamp); - let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); - if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); - poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees); - poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD); - poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut); - poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD); - poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees); - poolDay.save(); +export function handleBatchUnlockRedeemed(event: BatchUnlockRedeemedEvent): void { + let entity = new BatchUnlockRedeemed(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.relayer = event.params.relayer + entity.amount = event.params.amount + entity.reward = event.params.reward + entity.lpFees = event.params.lpFees + entity.tokenIds = event.params.tokenIds + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() + let pool = SwapPool.load(event.address.toHex()) + if (!pool) return + + const usdPrice = ETHUSD() + const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)) + + const treasuryCut = event.params.amount.minus(event.params.lpFees).minus(event.params.reward) + const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)) + + pool.unlocking = pool.unlocking.minus(event.params.amount) + pool.lpRewards = pool.lpRewards.plus(event.params.lpFees) + pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD) + pool.treasuryCut = pool.treasuryCut.plus(treasuryCut) + pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD) + pool.liabilities = pool.liabilities.plus(event.params.lpFees) + pool.save() + + let dayID = calculateDayID(event.block.timestamp) + let poolDay = SwapPoolDay.load(pool.id.concat('-').concat(dayID.toString())) + if (poolDay == null) poolDay = initiatePoolDay(pool, dayID) + poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees) + poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD) + poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut) + poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD) + poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees) + poolDay.save() } -export function handleClaimWithdrawRequest( - event: ClaimWithdrawRequestEvent -): void { - let entity = new ClaimWithdrawRequest( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.requestId = event.params.requestId; - entity.to = event.params.to; - entity.amount = event.params.amount; - - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; - - entity.save(); +export function handleClaimWithdrawRequest(event: ClaimWithdrawRequestEvent): void { + let entity = new ClaimWithdrawRequest(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.requestId = event.params.requestId + entity.to = event.params.to + entity.amount = event.params.amount + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() } export function handleSwap(event: SwapEvent): void { - let pool = SwapPool.load(event.address.toHex()); - if (pool == null) return; - - const usdPrice = ETHUSD(); - const amountInUSD = usdPrice.times(convertToDecimal(event.params.amountIn)); - const feeInUSD = usdPrice.times(convertToDecimal(event.params.fee)); - let numSwaps = pool.numSwaps.plus(BigInt.fromI32(1)); - let swapId = event.params.caller - .toHex() - .concat("-") - .concat(numSwaps.toString()); - let swap = new Swap(swapId); - swap.pool = pool.id; - swap.amount = event.params.amountIn; - swap.amountUSD = amountInUSD; - swap.fee = event.params.fee; - swap.feeUSD = feeInUSD; - swap.asset = event.params.asset; - swap.from = event.params.caller; - swap.blockNumber = event.block.number; - swap.blockTimestamp = event.block.timestamp; - swap.transactionHash = event.transaction.hash; - swap.save(); - - pool.unlocking = pool.unlocking.plus(event.params.amountIn); - pool.volume = pool.volume.plus(event.params.amountIn); - pool.volumeUSD = pool.volumeUSD.plus(amountInUSD); - pool.fees = pool.fees.plus(event.params.fee); - pool.feesUSD = pool.feesUSD.plus(feeInUSD); - pool.numSwaps = numSwaps; - pool.save(); - - let dayID = calculateDayID(event.block.timestamp); - let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); - if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); - poolDay.volume = poolDay.volume.plus(event.params.amountIn); - poolDay.volumeUSD = poolDay.volumeUSD.plus(amountInUSD); - poolDay.fees = poolDay.fees.plus(event.params.fee); - poolDay.feesUSD = poolDay.feesUSD.plus(feeInUSD); - poolDay.save(); + let pool = SwapPool.load(event.address.toHex()) + if (pool == null) return + + const usdPrice = ETHUSD() + const amountInUSD = usdPrice.times(convertToDecimal(event.params.amountIn)) + const feeInUSD = usdPrice.times(convertToDecimal(event.params.fee)) + let numSwaps = pool.numSwaps.plus(BigInt.fromI32(1)) + let swapId = event.params.caller.toHex().concat('-').concat(numSwaps.toString()) + let swap = new Swap(swapId) + swap.pool = pool.id + swap.amount = event.params.amountIn + swap.amountUSD = amountInUSD + swap.fee = event.params.fee + swap.feeUSD = feeInUSD + swap.asset = event.params.asset + swap.from = event.params.caller + swap.blockNumber = event.block.number + swap.blockTimestamp = event.block.timestamp + swap.transactionHash = event.transaction.hash + swap.save() + + pool.unlocking = pool.unlocking.plus(event.params.amountIn) + pool.volume = pool.volume.plus(event.params.amountIn) + pool.volumeUSD = pool.volumeUSD.plus(amountInUSD) + pool.fees = pool.fees.plus(event.params.fee) + pool.feesUSD = pool.feesUSD.plus(feeInUSD) + pool.numSwaps = numSwaps + pool.save() + + let dayID = calculateDayID(event.block.timestamp) + let poolDay = SwapPoolDay.load(pool.id.concat('-').concat(dayID.toString())) + if (poolDay == null) poolDay = initiatePoolDay(pool, dayID) + poolDay.volume = poolDay.volume.plus(event.params.amountIn) + poolDay.volumeUSD = poolDay.volumeUSD.plus(amountInUSD) + poolDay.fees = poolDay.fees.plus(event.params.fee) + poolDay.feesUSD = poolDay.feesUSD.plus(feeInUSD) + poolDay.save() } export function handleWithdraw(event: WithdrawEvent): void { - let entity = new Withdraw( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.to = event.params.to; - entity.amount = event.params.amount; - entity.lpSharesBurnt = event.params.lpSharesBurnt; - entity.requestId = event.params.requestId; + let entity = new Withdraw(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.to = event.params.to + entity.amount = event.params.amount + entity.lpSharesBurnt = event.params.lpSharesBurnt + entity.requestId = event.params.requestId - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash - entity.save(); + entity.save() - let pool = SwapPool.load(event.address.toHex()); - if (pool == null) return; + let pool = SwapPool.load(event.address.toHex()) + if (pool == null) return - let user = event.params.to.toHex(); - let lp = LiquidityPosition.load(user.concat("-").concat(pool.id)); + let user = event.params.to.toHex() + let lp = LiquidityPosition.load(user.concat('-').concat(pool.id)) if (lp != null) { - let bal = lp.shares.times(pool.liabilities).div(pool.totalSupply); - let amount = event.params.amount; + let bal = lp.shares.times(pool.liabilities).div(pool.totalSupply) + let amount = event.params.amount if (bal.minus(lp.netDeposits).lt(amount)) { // if rewards less than amount, set net deposits // to balance minus what wasnt subtracted from the rewards - lp.netDeposits = bal.minus(amount); + lp.netDeposits = bal.minus(amount) } else { // withdrawn rewards, do nothing } - lp.shares = lp.shares.minus(event.params.lpSharesBurnt); - lp.save(); + lp.shares = lp.shares.minus(event.params.lpSharesBurnt) + lp.save() } - pool.totalSupply = pool.totalSupply.minus(event.params.lpSharesBurnt); - pool.liabilities = pool.liabilities.minus(event.params.amount); + pool.totalSupply = pool.totalSupply.minus(event.params.lpSharesBurnt) + pool.liabilities = pool.liabilities.minus(event.params.amount) - let dayID = calculateDayID(event.block.timestamp); - let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); - if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); + let dayID = calculateDayID(event.block.timestamp) + let poolDay = SwapPoolDay.load(pool.id.concat('-').concat(dayID.toString())) + if (poolDay == null) poolDay = initiatePoolDay(pool, dayID) - poolDay.save(); - pool.save(); + poolDay.save() + pool.save() } export function handleDeposit(event: DepositEvent): void { - let entity = new Deposit( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.from = event.params.from; - entity.amount = event.params.amount; - entity.lpSharesMinted = event.params.lpSharesMinted; + let entity = new Deposit(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.from = event.params.from + entity.amount = event.params.amount + entity.lpSharesMinted = event.params.lpSharesMinted - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash - entity.save(); + entity.save() - let pool = SwapPool.load(event.address.toHex()); - if (pool == null) return; + let pool = SwapPool.load(event.address.toHex()) + if (pool == null) return - pool.totalSupply = pool.totalSupply.plus(event.params.lpSharesMinted); - pool.liabilities = pool.liabilities.plus(event.params.amount); + pool.totalSupply = pool.totalSupply.plus(event.params.lpSharesMinted) + pool.liabilities = pool.liabilities.plus(event.params.amount) - let dayID = calculateDayID(event.block.timestamp); - let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); - if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); + let dayID = calculateDayID(event.block.timestamp) + let poolDay = SwapPoolDay.load(pool.id.concat('-').concat(dayID.toString())) + if (poolDay == null) poolDay = initiatePoolDay(pool, dayID) + poolDay.save() + pool.save() - poolDay.save(); - pool.save(); + let from = event.params.from.toHex() + if (from == PRELAUNCH_ADDRESS) return + let user = User.load(from) + if (user == null) { + user = new User(from) + user.save() + } - let from = event.params.from.toHex(); - if (from == PRELAUNCH_ADDRESS) return; - let user = User.load(from); - if (user == null) { - user = new User(from); - user.save(); - } - - let lp = LiquidityPosition.load(from.concat("-").concat(pool.id)); + let lp = LiquidityPosition.load(from.concat('-').concat(pool.id)) if (lp == null) { - lp = new LiquidityPosition(from.concat("-").concat(pool.id)); - lp.user = from; - lp.pool = pool.id; - lp.shares = BI_ZERO; - lp.netDeposits = BI_ZERO; + lp = new LiquidityPosition(from.concat('-').concat(pool.id)) + lp.user = from + lp.pool = pool.id + lp.shares = BI_ZERO + lp.netDeposits = BI_ZERO } - lp.shares = lp.shares.plus(event.params.lpSharesMinted); - lp.netDeposits = lp.netDeposits.plus(event.params.amount); - lp.save(); - + lp.shares = lp.shares.plus(event.params.lpSharesMinted) + lp.netDeposits = lp.netDeposits.plus(event.params.amount) + lp.save() } -export function handleRelayerRewardsClaimed( - event: RelayerRewardsClaimedEvent -): void { - let entity = new RelayerRewardsClaimed( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.relayer = event.params.relayer; - entity.rewards = event.params.rewards; +export function handleRelayerRewardsClaimed(event: RelayerRewardsClaimedEvent): void { + let entity = new RelayerRewardsClaimed(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.relayer = event.params.relayer + entity.rewards = event.params.rewards - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash - entity.save(); + entity.save() } export function handleUnlockBought(event: UnlockBoughtEvent): void { - let entity = new UnlockBought( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.caller = event.params.caller; - entity.tokenId = event.params.tokenId; - entity.amount = event.params.amount; - entity.reward = event.params.reward; - entity.lpFees = event.params.lpFees; - - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; - - entity.save(); - let pool = SwapPool.load(event.address.toHex()); - if (!pool) return; - - const usdPrice = ETHUSD(); - - const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)); - const treasuryCut = event.params.amount - .minus(event.params.lpFees) - .minus(event.params.reward); - const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)); - - pool.unlocking = pool.unlocking.minus(event.params.amount); - pool.lpRewards = pool.lpRewards.plus(event.params.lpFees); - pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD); - pool.treasuryCut = pool.treasuryCut.plus(treasuryCut); - pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD); - pool.liabilities = pool.liabilities.plus(event.params.lpFees); - pool.save(); - - let dayID = calculateDayID(event.block.timestamp); - let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); - if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); - poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees); - poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD); - poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut); - poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD); - poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees); - poolDay.save(); + let entity = new UnlockBought(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.caller = event.params.caller + entity.tokenId = event.params.tokenId + entity.amount = event.params.amount + entity.reward = event.params.reward + entity.lpFees = event.params.lpFees + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() + let pool = SwapPool.load(event.address.toHex()) + if (!pool) return + + const usdPrice = ETHUSD() + + const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)) + const treasuryCut = event.params.amount.minus(event.params.lpFees).minus(event.params.reward) + const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)) + + pool.unlocking = pool.unlocking.minus(event.params.amount) + pool.lpRewards = pool.lpRewards.plus(event.params.lpFees) + pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD) + pool.treasuryCut = pool.treasuryCut.plus(treasuryCut) + pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD) + pool.liabilities = pool.liabilities.plus(event.params.lpFees) + pool.save() + + let dayID = calculateDayID(event.block.timestamp) + let poolDay = SwapPoolDay.load(pool.id.concat('-').concat(dayID.toString())) + if (poolDay == null) poolDay = initiatePoolDay(pool, dayID) + poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees) + poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD) + poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut) + poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD) + poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees) + poolDay.save() } export function handleUnlockRedeemed(event: UnlockRedeemedEvent): void { - let entity = new UnlockRedeemed( - event.transaction.hash.concatI32(event.logIndex.toI32()) - ); - entity.relayer = event.params.relayer; - entity.tokenId = event.params.tokenId; - entity.amount = event.params.amount; - entity.reward = event.params.reward; - entity.lpFees = event.params.lpFees; - - entity.blockNumber = event.block.number; - entity.blockTimestamp = event.block.timestamp; - entity.transactionHash = event.transaction.hash; - - entity.save(); - let pool = SwapPool.load(event.address.toHex()); - if (!pool) return; - - const usdPrice = ETHUSD(); - const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)); - - const treasuryCut = event.params.amount - .minus(event.params.lpFees) - .minus(event.params.reward); - const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)); - - pool.unlocking = pool.unlocking.minus(event.params.amount); - pool.lpRewards = pool.lpRewards.plus(event.params.lpFees); - pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD); - pool.treasuryCut = pool.treasuryCut.plus(treasuryCut); - pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD); - pool.liabilities = pool.liabilities.plus(event.params.lpFees); - pool.save(); - - let dayID = calculateDayID(event.block.timestamp); - let poolDay = SwapPoolDay.load(pool.id.concat("-").concat(dayID.toString())); - if (poolDay == null) poolDay = initiatePoolDay(pool, dayID); - poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees); - poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD); - poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut); - poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD); - poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees); - poolDay.save(); + let entity = new UnlockRedeemed(event.transaction.hash.concatI32(event.logIndex.toI32())) + entity.relayer = event.params.relayer + entity.tokenId = event.params.tokenId + entity.amount = event.params.amount + entity.reward = event.params.reward + entity.lpFees = event.params.lpFees + + entity.blockNumber = event.block.number + entity.blockTimestamp = event.block.timestamp + entity.transactionHash = event.transaction.hash + + entity.save() + let pool = SwapPool.load(event.address.toHex()) + if (!pool) return + + const usdPrice = ETHUSD() + const lpRewardsInUSD = usdPrice.times(convertToDecimal(event.params.lpFees)) + + const treasuryCut = event.params.amount.minus(event.params.lpFees).minus(event.params.reward) + const treasuryCutInUSD = usdPrice.times(convertToDecimal(treasuryCut)) + + pool.unlocking = pool.unlocking.minus(event.params.amount) + pool.lpRewards = pool.lpRewards.plus(event.params.lpFees) + pool.lpRewardsUSD = pool.lpRewardsUSD.plus(lpRewardsInUSD) + pool.treasuryCut = pool.treasuryCut.plus(treasuryCut) + pool.treasuryCutUSD = pool.treasuryCutUSD.plus(treasuryCutInUSD) + pool.liabilities = pool.liabilities.plus(event.params.lpFees) + pool.save() + + let dayID = calculateDayID(event.block.timestamp) + let poolDay = SwapPoolDay.load(pool.id.concat('-').concat(dayID.toString())) + if (poolDay == null) poolDay = initiatePoolDay(pool, dayID) + poolDay.lpRewards = poolDay.lpRewards.plus(event.params.lpFees) + poolDay.lpRewardsUSD = poolDay.lpRewardsUSD.plus(lpRewardsInUSD) + poolDay.treasuryCut = poolDay.treasuryCut.plus(treasuryCut) + poolDay.treasuryCutUSD = poolDay.treasuryCutUSD.plus(treasuryCutInUSD) + poolDay.liabilities = poolDay.liabilities.plus(event.params.lpFees) + poolDay.save() } export function handleLpETHTransfer(event: LpETHTransferEmitted): void { // burn - if (event.params.to.toHex() == "0x0000000000000000000000000000000000000000") return; + if (event.params.to.toHex() == '0x0000000000000000000000000000000000000000') return // mint - if (event.params.from.toHex() == "0x0000000000000000000000000000000000000000") return; - let pool = SwapPool.load(LPETH_ADDRESS); - if (pool == null) return; + if (event.params.from.toHex() == '0x0000000000000000000000000000000000000000') return + let pool = SwapPool.load(LPETH_ADDRESS) + if (pool == null) return - let from = event.params.from.toHex(); - let to = event.params.to.toHex(); - let toUser = User.load(to); + let from = event.params.from.toHex() + let to = event.params.to.toHex() + let toUser = User.load(to) if (toUser == null) { - toUser = new User(to); - toUser.save(); + toUser = new User(to) + toUser.save() } - let lpTo = LiquidityPosition.load(to.concat("-").concat(pool.id)); + let lpTo = LiquidityPosition.load(to.concat('-').concat(pool.id)) if (lpTo == null) { - lpTo = new LiquidityPosition(to.concat("-").concat(pool.id)); - lpTo.user = to; - lpTo.pool = pool.id; - lpTo.shares = BI_ZERO; - lpTo.netDeposits = BI_ZERO; + lpTo = new LiquidityPosition(to.concat('-').concat(pool.id)) + lpTo.user = to + lpTo.pool = pool.id + lpTo.shares = BI_ZERO + lpTo.netDeposits = BI_ZERO } - let shares = event.params.value; - let value = shares.times(pool.liabilities).div(pool.totalSupply); - lpTo.shares = lpTo.shares.plus(shares); - lpTo.netDeposits = lpTo.netDeposits.plus(value); - lpTo.save(); + let shares = event.params.value + let value = shares.times(pool.liabilities).div(pool.totalSupply) + lpTo.shares = lpTo.shares.plus(shares) + lpTo.netDeposits = lpTo.netDeposits.plus(value) + lpTo.save() let transfer = new SwapLPTokenTransferEvent( - event.transaction.hash.toHex().concat("-").concat(event.logIndex.toString()) - ); - transfer.timestamp = event.block.timestamp.toI32(); - transfer.blockNumber = event.block.number; - transfer.from = from; - transfer.to = to; - transfer.shares = shares; - transfer.value = value; - transfer.SwapPool = pool.id; - transfer.save(); - - if (from == PRELAUNCH_ADDRESS) return; - - let lp = LiquidityPosition.load(from.concat("-").concat(pool.id)); + event.transaction.hash.toHex().concat('-').concat(event.logIndex.toString()) + ) + transfer.timestamp = event.block.timestamp.toI32() + transfer.blockNumber = event.block.number + transfer.from = from + transfer.to = to + transfer.shares = shares + transfer.value = value + transfer.SwapPool = pool.id + transfer.save() + + if (from == PRELAUNCH_ADDRESS) return + + let lp = LiquidityPosition.load(from.concat('-').concat(pool.id)) if (lp != null) { - lp.shares = lp.shares.minus(event.params.value); - let totalSupply = pool.totalSupply; - let bal = lp.shares - .times(pool.liabilities).div(totalSupply); + lp.shares = lp.shares.minus(event.params.value) + let totalSupply = pool.totalSupply + let bal = lp.shares.times(pool.liabilities).div(totalSupply) if (bal.minus(lp.netDeposits).lt(value)) { // if rewards less than amount, set net deposits // to balance minus what wasnt subtracted from the rewards - let remainder = value.minus(bal.minus(lp.netDeposits)); + let remainder = value.minus(bal.minus(lp.netDeposits)) if (remainder.lt(lp.netDeposits)) { - lp.netDeposits = bal.minus(remainder); + lp.netDeposits = bal.minus(remainder) } else { - lp.netDeposits = BI_ZERO; + lp.netDeposits = BI_ZERO } } - lp.save(); + lp.save() } } diff --git a/packages/subgraph/src/mappings/prelaunch.ts b/packages/subgraph/src/mappings/prelaunch.ts index a460fb2..9fab189 100644 --- a/packages/subgraph/src/mappings/prelaunch.ts +++ b/packages/subgraph/src/mappings/prelaunch.ts @@ -1,18 +1,24 @@ -import { BigDecimal, BigInt } from "@graphprotocol/graph-ts" -import {DepositETHCall, DepositWETHCall, WithdrawCall, ClaimVeTokensCall, ChangeLockupCall} from "../../generated/PreLaunch/PreLaunch" -import {Deposit, Withdraw, PreLaunchPosition, PreLaunch} from "../../generated/schema" -import { BI_ZERO, TEN_18 } from "./helpers" -import { log } from "@graphprotocol/graph-ts" - -const LPETH_ADDRESS = "0xF3a75E087A92770b4150fFF14c6d36FB07796252".toLowerCase() +import { BigDecimal, BigInt } from '@graphprotocol/graph-ts' +import { + DepositETHCall, + DepositWETHCall, + WithdrawCall, + ClaimVeTokensCall, + ChangeLockupCall, +} from '../../generated/PreLaunch/PreLaunch' +import { Deposit, Withdraw, PreLaunchPosition, PreLaunch } from '../../generated/schema' +import { BI_ZERO, TEN_18 } from './helpers' +import { log } from '@graphprotocol/graph-ts' + +const LPETH_ADDRESS = '0xF3a75E087A92770b4150fFF14c6d36FB07796252'.toLowerCase() const DEADLINE = 1728746087 const MIN_LOCKUP = TEN_18 const MAX_LOCKUP = BigInt.fromI32(52).times(TEN_18) const EPOCH_LENGTH = 604800 -const MIN_MULTIPLIER = BigInt.fromString("100000000000000000") -const MAX_MULTIPLIER = BigInt.fromString("5000000000000000000") -const SLOPE = BigInt.fromString("2500000000000000000") +const MIN_MULTIPLIER = BigInt.fromString('100000000000000000') +const MAX_MULTIPLIER = BigInt.fromString('5000000000000000000') +const SLOPE = BigInt.fromString('2500000000000000000') // const calculateWeightedDeposit = (amount: BigInt, epochs: BigInt):BigInt => { // if (epochs.lt(MIN_LOCKUP)) { @@ -24,142 +30,141 @@ const SLOPE = BigInt.fromString("2500000000000000000") // } const calculateWeightedDeposit = (amount: BigInt, epochs: BigInt): BigInt => { - let x = parseFloat(amount.toBigDecimal().div(TEN_18.toBigDecimal()).toString()) - let e = parseInt(epochs.toString(), 10) + let x = parseFloat(amount.toBigDecimal().div(TEN_18.toBigDecimal()).toString()) + let e = parseInt(epochs.toString(), 10) - let w = (x * (1 + (5 - 1)) * (e - 1) / (52 - 1)) ** 2.5 - w = Math.floor(w * 10 ** 18) + let w = ((x * (1 + (5 - 1)) * (e - 1)) / (52 - 1)) ** 2.5 + w = Math.floor(w * 10 ** 18) - return BigInt.fromString(BigDecimal.fromString(w.toString()).toString()) + return BigInt.fromString(BigDecimal.fromString(w.toString()).toString()) } -export function handleDepositETH(call: DepositETHCall):void { - let amount = call.transaction.value - - let preLaunch = PreLaunch.load(call.to.toHexString()) - if (preLaunch == null) { - preLaunch = new PreLaunch(call.to.toHexString()) - preLaunch.amount = BI_ZERO - preLaunch.weightedAmount = BI_ZERO - } - - let position = PreLaunchPosition.load(call.from.toHexString()) - if (position == null) { - position = new PreLaunchPosition(call.from.toHexString()) - position.claimed = false - position.amount = amount - position.duration = call.inputs.duration - position.account = call.from - } else { - position.amount = position.amount.plus(amount) - position.duration = call.inputs.duration - - // subtract the current weighted amount from the total - // we will add it back after we calculate the new weighted amount - // in case the duration changed - preLaunch.weightedAmount = preLaunch.weightedAmount.minus(position.weightedAmount) - } - - let weighted = calculateWeightedDeposit(position.amount, position.duration) - log.debug("Weighted amount: {}", [weighted.toString()]) - position.weightedAmount = weighted - position.save() - - preLaunch.amount = preLaunch.amount.plus(amount) - preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) - preLaunch.save() +export function handleDepositETH(call: DepositETHCall): void { + let amount = call.transaction.value + + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + preLaunch.amount = BI_ZERO + preLaunch.weightedAmount = BI_ZERO + } + + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position == null) { + position = new PreLaunchPosition(call.from.toHexString()) + position.claimed = false + position.amount = amount + position.duration = call.inputs.duration + position.account = call.from + } else { + position.amount = position.amount.plus(amount) + position.duration = call.inputs.duration + + // subtract the current weighted amount from the total + // we will add it back after we calculate the new weighted amount + // in case the duration changed + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(position.weightedAmount) + } + + let weighted = calculateWeightedDeposit(position.amount, position.duration) + log.debug('Weighted amount: {}', [weighted.toString()]) + position.weightedAmount = weighted + position.save() + + preLaunch.amount = preLaunch.amount.plus(amount) + preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) + preLaunch.save() } -export function handleDepositWETH(call: DepositWETHCall):void { - let amount = call.inputs.amount - - let preLaunch = PreLaunch.load(call.to.toHexString()) - if (preLaunch == null) { - preLaunch = new PreLaunch(call.to.toHexString()) - preLaunch.amount = BI_ZERO - preLaunch.weightedAmount = BI_ZERO - } - - let position = PreLaunchPosition.load(call.from.toHexString()) - if (position == null) { - position = new PreLaunchPosition(call.from.toHexString()) - position.claimed = false - position.amount = amount - position.duration = call.inputs.duration - position.account = call.from - } else { - position.amount = position.amount.plus(amount) - position.duration = call.inputs.duration - - // subtract the current weighted amount from the total - // we will add it back after we calculate the new weighted amount - // in case the duration changed - preLaunch.weightedAmount = preLaunch.weightedAmount.minus(position.weightedAmount) - } - - let weighted = calculateWeightedDeposit(position.amount, position.duration) - position.weightedAmount = weighted - position.save() +export function handleDepositWETH(call: DepositWETHCall): void { + let amount = call.inputs.amount + + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + preLaunch.amount = BI_ZERO + preLaunch.weightedAmount = BI_ZERO + } + + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position == null) { + position = new PreLaunchPosition(call.from.toHexString()) + position.claimed = false + position.amount = amount + position.duration = call.inputs.duration + position.account = call.from + } else { + position.amount = position.amount.plus(amount) + position.duration = call.inputs.duration + + // subtract the current weighted amount from the total + // we will add it back after we calculate the new weighted amount + // in case the duration changed + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(position.weightedAmount) + } + + let weighted = calculateWeightedDeposit(position.amount, position.duration) + position.weightedAmount = weighted + position.save() + + preLaunch.amount = preLaunch.amount.plus(amount) + preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) + preLaunch.save() +} - preLaunch.amount = preLaunch.amount.plus(amount) - preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) - preLaunch.save() -} +export function handleWithdraw(call: WithdrawCall): void { + let amount = call.inputs.amount + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + } -export function handleWithdraw(call: WithdrawCall):void { - let amount = call.inputs.amount + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position != null) { + position.amount = position.amount.minus(amount) - let preLaunch = PreLaunch.load(call.to.toHexString()) - if (preLaunch == null) { - preLaunch = new PreLaunch(call.to.toHexString()) - } + let weighted = calculateWeightedDeposit(amount, position.duration) + position.weightedAmount = position.weightedAmount.minus(weighted) + position.save() - let position = PreLaunchPosition.load(call.from.toHexString()) - if (position != null) { - position.amount = position.amount.minus(amount) + preLaunch.amount = preLaunch.amount.minus(amount) + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(weighted) + preLaunch.save() + } +} - let weighted = calculateWeightedDeposit(amount, position.duration) - position.weightedAmount = position.weightedAmount.minus(weighted) - position.save() +export function handleClaim(call: ClaimVeTokensCall): void { + // convert prelaunch into LiquidityPosition + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position == null) { + return + } + position.claimed = true + position.claimedAt = call.block.timestamp + position.save() - preLaunch.amount = preLaunch.amount.minus(amount) - preLaunch.weightedAmount = preLaunch.weightedAmount.minus(weighted) - preLaunch.save() - } + // liquidity position and user is created by the LP token transfer event from the pre-launch contract to this one } -export function handleClaim (call: ClaimVeTokensCall):void { - // convert prelaunch into LiquidityPosition - let position = PreLaunchPosition.load(call.from.toHexString()) - if (position == null) { - return - } - position.claimed = true - position.claimedAt = call.block.timestamp +export function handleChangeLockup(call: ChangeLockupCall): void { + let preLaunch = PreLaunch.load(call.to.toHexString()) + if (preLaunch == null) { + preLaunch = new PreLaunch(call.to.toHexString()) + } + let position = PreLaunchPosition.load(call.from.toHexString()) + if (position != null) { + let oldWeighted = calculateWeightedDeposit(position.amount, position.duration) + // subtract the current weighted amount from the total + // we will add it back after we calculate the new weighted amount + preLaunch.weightedAmount = preLaunch.weightedAmount.minus(oldWeighted) + + let weighted = calculateWeightedDeposit(position.amount, call.inputs.duration) + position.weightedAmount = weighted + position.duration = call.inputs.duration position.save() - // liquidity position and user is created by the LP token transfer event from the pre-launch contract to this one + preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) + preLaunch.save() + } } - -export function handleChangeLockup (call: ChangeLockupCall):void { - let preLaunch = PreLaunch.load(call.to.toHexString()) - if (preLaunch == null) { - preLaunch = new PreLaunch(call.to.toHexString()) - } - let position = PreLaunchPosition.load(call.from.toHexString()) - if (position != null) { - let oldWeighted = calculateWeightedDeposit(position.amount, position.duration) - // subtract the current weighted amount from the total - // we will add it back after we calculate the new weighted amount - preLaunch.weightedAmount = preLaunch.weightedAmount.minus(oldWeighted) - - let weighted = calculateWeightedDeposit(position.amount, call.inputs.duration) - position.weightedAmount = weighted - position.duration = call.inputs.duration - position.save() - - preLaunch.weightedAmount = preLaunch.weightedAmount.plus(weighted) - preLaunch.save() - } -} \ No newline at end of file diff --git a/packages/subgraph/tests/lp-eth-utils.ts b/packages/subgraph/tests/lp-eth-utils.ts index bc869cf..f6cf271 100644 --- a/packages/subgraph/tests/lp-eth-utils.ts +++ b/packages/subgraph/tests/lp-eth-utils.ts @@ -1,5 +1,5 @@ -import { newMockEvent } from "matchstick-as" -import { ethereum, Address, BigInt } from "@graphprotocol/graph-ts" +import { newMockEvent } from 'matchstick-as' +import { ethereum, Address, BigInt } from '@graphprotocol/graph-ts' import { BatchUnlockBought, BatchUnlockRedeemed, @@ -12,8 +12,8 @@ import { UnlockBought, UnlockRedeemed, Upgraded, - Withdraw -} from "../generated/LpETH/LpETH" + Withdraw, +} from '../generated/LpETH/LpETH' export function createBatchUnlockBoughtEvent( caller: Address, @@ -26,23 +26,12 @@ export function createBatchUnlockBoughtEvent( batchUnlockBoughtEvent.parameters = new Array() + batchUnlockBoughtEvent.parameters.push(new ethereum.EventParam('caller', ethereum.Value.fromAddress(caller))) + batchUnlockBoughtEvent.parameters.push(new ethereum.EventParam('amount', ethereum.Value.fromUnsignedBigInt(amount))) + batchUnlockBoughtEvent.parameters.push(new ethereum.EventParam('reward', ethereum.Value.fromUnsignedBigInt(reward))) + batchUnlockBoughtEvent.parameters.push(new ethereum.EventParam('lpFees', ethereum.Value.fromUnsignedBigInt(lpFees))) batchUnlockBoughtEvent.parameters.push( - new ethereum.EventParam("caller", ethereum.Value.fromAddress(caller)) - ) - batchUnlockBoughtEvent.parameters.push( - new ethereum.EventParam("amount", ethereum.Value.fromUnsignedBigInt(amount)) - ) - batchUnlockBoughtEvent.parameters.push( - new ethereum.EventParam("reward", ethereum.Value.fromUnsignedBigInt(reward)) - ) - batchUnlockBoughtEvent.parameters.push( - new ethereum.EventParam("lpFees", ethereum.Value.fromUnsignedBigInt(lpFees)) - ) - batchUnlockBoughtEvent.parameters.push( - new ethereum.EventParam( - "tokenIds", - ethereum.Value.fromUnsignedBigIntArray(tokenIds) - ) + new ethereum.EventParam('tokenIds', ethereum.Value.fromUnsignedBigIntArray(tokenIds)) ) return batchUnlockBoughtEvent @@ -59,75 +48,42 @@ export function createBatchUnlockRedeemedEvent( batchUnlockRedeemedEvent.parameters = new Array() + batchUnlockRedeemedEvent.parameters.push(new ethereum.EventParam('relayer', ethereum.Value.fromAddress(relayer))) + batchUnlockRedeemedEvent.parameters.push(new ethereum.EventParam('amount', ethereum.Value.fromUnsignedBigInt(amount))) + batchUnlockRedeemedEvent.parameters.push(new ethereum.EventParam('reward', ethereum.Value.fromUnsignedBigInt(reward))) + batchUnlockRedeemedEvent.parameters.push(new ethereum.EventParam('lpFees', ethereum.Value.fromUnsignedBigInt(lpFees))) batchUnlockRedeemedEvent.parameters.push( - new ethereum.EventParam("relayer", ethereum.Value.fromAddress(relayer)) - ) - batchUnlockRedeemedEvent.parameters.push( - new ethereum.EventParam("amount", ethereum.Value.fromUnsignedBigInt(amount)) - ) - batchUnlockRedeemedEvent.parameters.push( - new ethereum.EventParam("reward", ethereum.Value.fromUnsignedBigInt(reward)) - ) - batchUnlockRedeemedEvent.parameters.push( - new ethereum.EventParam("lpFees", ethereum.Value.fromUnsignedBigInt(lpFees)) - ) - batchUnlockRedeemedEvent.parameters.push( - new ethereum.EventParam( - "tokenIds", - ethereum.Value.fromUnsignedBigIntArray(tokenIds) - ) + new ethereum.EventParam('tokenIds', ethereum.Value.fromUnsignedBigIntArray(tokenIds)) ) return batchUnlockRedeemedEvent } -export function createClaimWithdrawRequestEvent( - requestId: BigInt, - to: Address, - amount: BigInt -): ClaimWithdrawRequest { - let claimWithdrawRequestEvent = changetype( - newMockEvent() - ) +export function createClaimWithdrawRequestEvent(requestId: BigInt, to: Address, amount: BigInt): ClaimWithdrawRequest { + let claimWithdrawRequestEvent = changetype(newMockEvent()) claimWithdrawRequestEvent.parameters = new Array() claimWithdrawRequestEvent.parameters.push( - new ethereum.EventParam( - "requestId", - ethereum.Value.fromUnsignedBigInt(requestId) - ) + new ethereum.EventParam('requestId', ethereum.Value.fromUnsignedBigInt(requestId)) ) + claimWithdrawRequestEvent.parameters.push(new ethereum.EventParam('to', ethereum.Value.fromAddress(to))) claimWithdrawRequestEvent.parameters.push( - new ethereum.EventParam("to", ethereum.Value.fromAddress(to)) - ) - claimWithdrawRequestEvent.parameters.push( - new ethereum.EventParam("amount", ethereum.Value.fromUnsignedBigInt(amount)) + new ethereum.EventParam('amount', ethereum.Value.fromUnsignedBigInt(amount)) ) return claimWithdrawRequestEvent } -export function createDepositEvent( - from: Address, - amount: BigInt, - lpSharesMinted: BigInt -): Deposit { +export function createDepositEvent(from: Address, amount: BigInt, lpSharesMinted: BigInt): Deposit { let depositEvent = changetype(newMockEvent()) depositEvent.parameters = new Array() + depositEvent.parameters.push(new ethereum.EventParam('from', ethereum.Value.fromAddress(from))) + depositEvent.parameters.push(new ethereum.EventParam('amount', ethereum.Value.fromUnsignedBigInt(amount))) depositEvent.parameters.push( - new ethereum.EventParam("from", ethereum.Value.fromAddress(from)) - ) - depositEvent.parameters.push( - new ethereum.EventParam("amount", ethereum.Value.fromUnsignedBigInt(amount)) - ) - depositEvent.parameters.push( - new ethereum.EventParam( - "lpSharesMinted", - ethereum.Value.fromUnsignedBigInt(lpSharesMinted) - ) + new ethereum.EventParam('lpSharesMinted', ethereum.Value.fromUnsignedBigInt(lpSharesMinted)) ) return depositEvent @@ -138,57 +94,32 @@ export function createInitializedEvent(version: BigInt): Initialized { initializedEvent.parameters = new Array() - initializedEvent.parameters.push( - new ethereum.EventParam( - "version", - ethereum.Value.fromUnsignedBigInt(version) - ) - ) + initializedEvent.parameters.push(new ethereum.EventParam('version', ethereum.Value.fromUnsignedBigInt(version))) return initializedEvent } -export function createOwnershipTransferredEvent( - previousOwner: Address, - newOwner: Address -): OwnershipTransferred { - let ownershipTransferredEvent = changetype( - newMockEvent() - ) +export function createOwnershipTransferredEvent(previousOwner: Address, newOwner: Address): OwnershipTransferred { + let ownershipTransferredEvent = changetype(newMockEvent()) ownershipTransferredEvent.parameters = new Array() ownershipTransferredEvent.parameters.push( - new ethereum.EventParam( - "previousOwner", - ethereum.Value.fromAddress(previousOwner) - ) - ) - ownershipTransferredEvent.parameters.push( - new ethereum.EventParam("newOwner", ethereum.Value.fromAddress(newOwner)) + new ethereum.EventParam('previousOwner', ethereum.Value.fromAddress(previousOwner)) ) + ownershipTransferredEvent.parameters.push(new ethereum.EventParam('newOwner', ethereum.Value.fromAddress(newOwner))) return ownershipTransferredEvent } -export function createRelayerRewardsClaimedEvent( - relayer: Address, - rewards: BigInt -): RelayerRewardsClaimed { - let relayerRewardsClaimedEvent = changetype( - newMockEvent() - ) +export function createRelayerRewardsClaimedEvent(relayer: Address, rewards: BigInt): RelayerRewardsClaimed { + let relayerRewardsClaimedEvent = changetype(newMockEvent()) relayerRewardsClaimedEvent.parameters = new Array() + relayerRewardsClaimedEvent.parameters.push(new ethereum.EventParam('relayer', ethereum.Value.fromAddress(relayer))) relayerRewardsClaimedEvent.parameters.push( - new ethereum.EventParam("relayer", ethereum.Value.fromAddress(relayer)) - ) - relayerRewardsClaimedEvent.parameters.push( - new ethereum.EventParam( - "rewards", - ethereum.Value.fromUnsignedBigInt(rewards) - ) + new ethereum.EventParam('rewards', ethereum.Value.fromUnsignedBigInt(rewards)) ) return relayerRewardsClaimedEvent @@ -205,27 +136,11 @@ export function createSwapEvent( swapEvent.parameters = new Array() - swapEvent.parameters.push( - new ethereum.EventParam("caller", ethereum.Value.fromAddress(caller)) - ) - swapEvent.parameters.push( - new ethereum.EventParam("asset", ethereum.Value.fromAddress(asset)) - ) - swapEvent.parameters.push( - new ethereum.EventParam( - "amountIn", - ethereum.Value.fromUnsignedBigInt(amountIn) - ) - ) - swapEvent.parameters.push( - new ethereum.EventParam("fee", ethereum.Value.fromUnsignedBigInt(fee)) - ) - swapEvent.parameters.push( - new ethereum.EventParam( - "unlockId", - ethereum.Value.fromUnsignedBigInt(unlockId) - ) - ) + swapEvent.parameters.push(new ethereum.EventParam('caller', ethereum.Value.fromAddress(caller))) + swapEvent.parameters.push(new ethereum.EventParam('asset', ethereum.Value.fromAddress(asset))) + swapEvent.parameters.push(new ethereum.EventParam('amountIn', ethereum.Value.fromUnsignedBigInt(amountIn))) + swapEvent.parameters.push(new ethereum.EventParam('fee', ethereum.Value.fromUnsignedBigInt(fee))) + swapEvent.parameters.push(new ethereum.EventParam('unlockId', ethereum.Value.fromUnsignedBigInt(unlockId))) return swapEvent } @@ -241,24 +156,11 @@ export function createUnlockBoughtEvent( unlockBoughtEvent.parameters = new Array() - unlockBoughtEvent.parameters.push( - new ethereum.EventParam("caller", ethereum.Value.fromAddress(caller)) - ) - unlockBoughtEvent.parameters.push( - new ethereum.EventParam( - "tokenId", - ethereum.Value.fromUnsignedBigInt(tokenId) - ) - ) - unlockBoughtEvent.parameters.push( - new ethereum.EventParam("amount", ethereum.Value.fromUnsignedBigInt(amount)) - ) - unlockBoughtEvent.parameters.push( - new ethereum.EventParam("reward", ethereum.Value.fromUnsignedBigInt(reward)) - ) - unlockBoughtEvent.parameters.push( - new ethereum.EventParam("lpFees", ethereum.Value.fromUnsignedBigInt(lpFees)) - ) + unlockBoughtEvent.parameters.push(new ethereum.EventParam('caller', ethereum.Value.fromAddress(caller))) + unlockBoughtEvent.parameters.push(new ethereum.EventParam('tokenId', ethereum.Value.fromUnsignedBigInt(tokenId))) + unlockBoughtEvent.parameters.push(new ethereum.EventParam('amount', ethereum.Value.fromUnsignedBigInt(amount))) + unlockBoughtEvent.parameters.push(new ethereum.EventParam('reward', ethereum.Value.fromUnsignedBigInt(reward))) + unlockBoughtEvent.parameters.push(new ethereum.EventParam('lpFees', ethereum.Value.fromUnsignedBigInt(lpFees))) return unlockBoughtEvent } @@ -274,24 +176,11 @@ export function createUnlockRedeemedEvent( unlockRedeemedEvent.parameters = new Array() - unlockRedeemedEvent.parameters.push( - new ethereum.EventParam("relayer", ethereum.Value.fromAddress(relayer)) - ) - unlockRedeemedEvent.parameters.push( - new ethereum.EventParam( - "tokenId", - ethereum.Value.fromUnsignedBigInt(tokenId) - ) - ) - unlockRedeemedEvent.parameters.push( - new ethereum.EventParam("amount", ethereum.Value.fromUnsignedBigInt(amount)) - ) - unlockRedeemedEvent.parameters.push( - new ethereum.EventParam("reward", ethereum.Value.fromUnsignedBigInt(reward)) - ) - unlockRedeemedEvent.parameters.push( - new ethereum.EventParam("lpFees", ethereum.Value.fromUnsignedBigInt(lpFees)) - ) + unlockRedeemedEvent.parameters.push(new ethereum.EventParam('relayer', ethereum.Value.fromAddress(relayer))) + unlockRedeemedEvent.parameters.push(new ethereum.EventParam('tokenId', ethereum.Value.fromUnsignedBigInt(tokenId))) + unlockRedeemedEvent.parameters.push(new ethereum.EventParam('amount', ethereum.Value.fromUnsignedBigInt(amount))) + unlockRedeemedEvent.parameters.push(new ethereum.EventParam('reward', ethereum.Value.fromUnsignedBigInt(reward))) + unlockRedeemedEvent.parameters.push(new ethereum.EventParam('lpFees', ethereum.Value.fromUnsignedBigInt(lpFees))) return unlockRedeemedEvent } @@ -301,44 +190,22 @@ export function createUpgradedEvent(implementation: Address): Upgraded { upgradedEvent.parameters = new Array() - upgradedEvent.parameters.push( - new ethereum.EventParam( - "implementation", - ethereum.Value.fromAddress(implementation) - ) - ) + upgradedEvent.parameters.push(new ethereum.EventParam('implementation', ethereum.Value.fromAddress(implementation))) return upgradedEvent } -export function createWithdrawEvent( - to: Address, - amount: BigInt, - lpSharesBurnt: BigInt, - requestId: BigInt -): Withdraw { +export function createWithdrawEvent(to: Address, amount: BigInt, lpSharesBurnt: BigInt, requestId: BigInt): Withdraw { let withdrawEvent = changetype(newMockEvent()) withdrawEvent.parameters = new Array() + withdrawEvent.parameters.push(new ethereum.EventParam('to', ethereum.Value.fromAddress(to))) + withdrawEvent.parameters.push(new ethereum.EventParam('amount', ethereum.Value.fromUnsignedBigInt(amount))) withdrawEvent.parameters.push( - new ethereum.EventParam("to", ethereum.Value.fromAddress(to)) - ) - withdrawEvent.parameters.push( - new ethereum.EventParam("amount", ethereum.Value.fromUnsignedBigInt(amount)) - ) - withdrawEvent.parameters.push( - new ethereum.EventParam( - "lpSharesBurnt", - ethereum.Value.fromUnsignedBigInt(lpSharesBurnt) - ) - ) - withdrawEvent.parameters.push( - new ethereum.EventParam( - "requestId", - ethereum.Value.fromUnsignedBigInt(requestId) - ) + new ethereum.EventParam('lpSharesBurnt', ethereum.Value.fromUnsignedBigInt(lpSharesBurnt)) ) + withdrawEvent.parameters.push(new ethereum.EventParam('requestId', ethereum.Value.fromUnsignedBigInt(requestId))) return withdrawEvent } diff --git a/packages/subgraph/tests/lp-eth.test.ts b/packages/subgraph/tests/lp-eth.test.ts index 23fdf89..e6e55d3 100644 --- a/packages/subgraph/tests/lp-eth.test.ts +++ b/packages/subgraph/tests/lp-eth.test.ts @@ -1,80 +1,45 @@ -import { Address, BigInt } from "@graphprotocol/graph-ts"; -import { - afterAll, - assert, - beforeAll, - clearStore, - describe, - test, -} from "matchstick-as/assembly/index"; -import { handleBatchUnlockBought } from "../packages/subgraph/src/lp-eth"; -import { createBatchUnlockBoughtEvent } from "./lp-eth-utils"; +import { Address, BigInt } from '@graphprotocol/graph-ts' +import { afterAll, assert, beforeAll, clearStore, describe, test } from 'matchstick-as/assembly/index' +import { handleBatchUnlockBought } from '../packages/subgraph/src/lp-eth' +import { createBatchUnlockBoughtEvent } from './lp-eth-utils' // Tests structure (matchstick-as >=0.5.0) // https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0 -describe("Describe entity assertions", () => { +describe('Describe entity assertions', () => { beforeAll(() => { - let caller = Address.fromString( - "0x0000000000000000000000000000000000000001" - ); - let amount = BigInt.fromI32(234); - let reward = BigInt.fromI32(234); - let lpFees = BigInt.fromI32(234); - let tokenIds = [BigInt.fromI32(234)]; - let newBatchUnlockBoughtEvent = createBatchUnlockBoughtEvent( - caller, - amount, - reward, - lpFees, - tokenIds - ); - handleBatchUnlockBought(newBatchUnlockBoughtEvent); - }); + let caller = Address.fromString('0x0000000000000000000000000000000000000001') + let amount = BigInt.fromI32(234) + let reward = BigInt.fromI32(234) + let lpFees = BigInt.fromI32(234) + let tokenIds = [BigInt.fromI32(234)] + let newBatchUnlockBoughtEvent = createBatchUnlockBoughtEvent(caller, amount, reward, lpFees, tokenIds) + handleBatchUnlockBought(newBatchUnlockBoughtEvent) + }) afterAll(() => { - clearStore(); - }); + clearStore() + }) // For more test scenarios, see: // https://thegraph.com/docs/en/developer/matchstick/#write-a-unit-test - test("BatchUnlockBought created and stored", () => { - assert.entityCount("BatchUnlockBought", 1); + test('BatchUnlockBought created and stored', () => { + assert.entityCount('BatchUnlockBought', 1) // 0xa16081f360e3847006db660bae1c6d1b2e17ec2a is the default address used in newMockEvent() function assert.fieldEquals( - "BatchUnlockBought", - "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1", - "caller", - "0x0000000000000000000000000000000000000001" - ); - assert.fieldEquals( - "BatchUnlockBought", - "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1", - "amount", - "234" - ); - assert.fieldEquals( - "BatchUnlockBought", - "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1", - "reward", - "234" - ); - assert.fieldEquals( - "BatchUnlockBought", - "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1", - "lpFees", - "234" - ); - assert.fieldEquals( - "BatchUnlockBought", - "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1", - "tokenIds", - "[234]" - ); + 'BatchUnlockBought', + '0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1', + 'caller', + '0x0000000000000000000000000000000000000001' + ) + assert.fieldEquals('BatchUnlockBought', '0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1', 'amount', '234') + assert.fieldEquals('BatchUnlockBought', '0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1', 'reward', '234') + assert.fieldEquals('BatchUnlockBought', '0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1', 'lpFees', '234') + assert.fieldEquals('BatchUnlockBought', '0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1', 'tokenIds', '[234]') // More assert options: // https://thegraph.com/docs/en/developer/matchstick/#asserts - }); -}); + }) +}) From b7706eaf3f226951bbbd7ce88901a3a8d5449dc0 Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Tue, 18 Feb 2025 11:15:42 +0100 Subject: [PATCH 08/10] chore: ci & lint --- .github/workflows/ci.yaml | 61 +++++++++++++++++++++++ packages/graph-client/.eslintrc | 11 ++++ packages/graph-client/.graphclientrc.yaml | 10 ++++ packages/graph-client/.prettierignore | 1 + 4 files changed, 83 insertions(+) create mode 100644 .github/workflows/ci.yaml create mode 100644 packages/graph-client/.eslintrc create mode 100644 packages/graph-client/.graphclientrc.yaml create mode 100644 packages/graph-client/.prettierignore diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..63bb90a --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,61 @@ +name: Bun CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.17.x] + + steps: + - uses: actions/checkout@v2 + + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + # Removed yarn cache since we are using bun + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + + # --- Subgraph Workspace --- + - name: Install dependencies in subgraph workspace + run: bun install + working-directory: packages/subgraph + + - name: Run subgraph prettier:check + run: bun run prettier:check + working-directory: packages/subgraph + + - name: Run subgraph prepare:mainnet + run: bun run prepare:mainnet + working-directory: packages/subgraph + + - name: Run subgraph codegen + run: bun run codegen + working-directory: packages/subgraph + + - name: Run subgraph build + run: bun run build + working-directory: packages/subgraph + + # --- Client Workspace --- + - name: Install dependencies in client workspace + run: bun install + working-directory: packages/graph-client + + - name: Run client prettier:check + run: bun run prettier:check + working-directory: packages/graph-client + + - name: Run client codegen + run: bun run codegen + working-directory: packages/graph-client diff --git a/packages/graph-client/.eslintrc b/packages/graph-client/.eslintrc new file mode 100644 index 0000000..113f303 --- /dev/null +++ b/packages/graph-client/.eslintrc @@ -0,0 +1,11 @@ +{ + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "plugin:@typescript-eslint/recommended", + "prettier", + "prettier/@typescript-eslint" + ] +} \ No newline at end of file diff --git a/packages/graph-client/.graphclientrc.yaml b/packages/graph-client/.graphclientrc.yaml new file mode 100644 index 0000000..6d8460d --- /dev/null +++ b/packages/graph-client/.graphclientrc.yaml @@ -0,0 +1,10 @@ +sources: + - name: Tenderize + handler: + graphql: + endpoint: "https://api.studio.thegraph.com/query/93675/tenderize-v2-arbitrum/version/latest" +documents: + - ./gql/**/*.gql +# 1bebc8cea3046e82264ffadc0e36e3f4 +# mainnet https://gateway-arbitrum.network.thegraph.com/api/1bebc8cea3046e82264ffadc0e36e3f4/subgraphs/id/FNGU4YKPjuy5sayHT6c5xt3EXzZE5fnUwcjFXKLgudBi +# arbitrum https://gateway-arbitrum.network.thegraph.com/api/1bebc8cea3046e82264ffadc0e36e3f4/subgraphs/id/2ygWAHMhm9tKXm59DN8DdSJ7VNpxrKMkA39Krij4b4tu diff --git a/packages/graph-client/.prettierignore b/packages/graph-client/.prettierignore new file mode 100644 index 0000000..e6c8309 --- /dev/null +++ b/packages/graph-client/.prettierignore @@ -0,0 +1 @@ +.graphclient \ No newline at end of file From 1b88576f7d361b75529ed1a82eb7f393e39f3a17 Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Tue, 18 Feb 2025 11:22:18 +0100 Subject: [PATCH 09/10] fix ci --- .github/workflows/ci.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 63bb90a..18a9bfb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -35,10 +35,6 @@ jobs: run: bun run prettier:check working-directory: packages/subgraph - - name: Run subgraph prepare:mainnet - run: bun run prepare:mainnet - working-directory: packages/subgraph - - name: Run subgraph codegen run: bun run codegen working-directory: packages/subgraph From 1070595a35954f5453ef017d2c80714e8dcde119 Mon Sep 17 00:00:00 2001 From: kyriediculous Date: Tue, 18 Feb 2025 12:00:16 +0100 Subject: [PATCH 10/10] remove duplicient client yaml file --- packages/graph-client/.graphclientrc.yaml | 5 ----- packages/graph-client/.graphclientrc.yml | 7 ------- 2 files changed, 12 deletions(-) delete mode 100644 packages/graph-client/.graphclientrc.yml diff --git a/packages/graph-client/.graphclientrc.yaml b/packages/graph-client/.graphclientrc.yaml index 6d8460d..bfb6305 100644 --- a/packages/graph-client/.graphclientrc.yaml +++ b/packages/graph-client/.graphclientrc.yaml @@ -3,8 +3,3 @@ sources: handler: graphql: endpoint: "https://api.studio.thegraph.com/query/93675/tenderize-v2-arbitrum/version/latest" -documents: - - ./gql/**/*.gql -# 1bebc8cea3046e82264ffadc0e36e3f4 -# mainnet https://gateway-arbitrum.network.thegraph.com/api/1bebc8cea3046e82264ffadc0e36e3f4/subgraphs/id/FNGU4YKPjuy5sayHT6c5xt3EXzZE5fnUwcjFXKLgudBi -# arbitrum https://gateway-arbitrum.network.thegraph.com/api/1bebc8cea3046e82264ffadc0e36e3f4/subgraphs/id/2ygWAHMhm9tKXm59DN8DdSJ7VNpxrKMkA39Krij4b4tu diff --git a/packages/graph-client/.graphclientrc.yml b/packages/graph-client/.graphclientrc.yml deleted file mode 100644 index c15f446..0000000 --- a/packages/graph-client/.graphclientrc.yml +++ /dev/null @@ -1,7 +0,0 @@ -sources: - - name: lpEth - handler: - graphql: - endpoint: "https://api.studio.thegraph.com/query/93675/lpeth/version/latest" - - # TODO: replace the END point with ethsubraph url :)