From c5ec6dd5b64228082cfaf6210793e4c9eede5885 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Mon, 7 Oct 2024 13:39:30 -0500 Subject: [PATCH 01/43] Remove unnecessary morpho hyperdrive --- .../src/hyperdrive/getReadHyperdrive.ts | 14 ----- .../src/hyperdrive/getReadWriteHyperdrive.ts | 8 --- .../src/exports/hyperdrive/model.ts | 4 -- .../src/exports/hyperdrive/rest.ts | 6 -- .../src/exports/v1.0.14/hyperdrive/model.ts | 3 - .../hyperdrive/base/ReadWriteHyperdrive.ts | 47 +++++++------- .../metamorpho/ReadMetaMorphoHyperdrive.ts | 56 ----------------- .../ReadWriteMetaMorphoHyperdrive.ts | 26 -------- .../src/hyperdrive/metamorpho/abi.ts | 61 ------------------- .../ReadMetaMorphoHyperdrive_v1_0_14.ts | 6 -- .../hyperdrive-viem/src/exports/hyperdrive.ts | 6 -- .../src/exports/v1.0.14/hyperdrive.ts | 3 - .../hyperdrive-viem/src/hyperdrive/morpho.ts | 11 ---- .../src/hyperdrive/v1.0.14/morpho.ts | 6 -- 14 files changed, 23 insertions(+), 234 deletions(-) delete mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts delete mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts delete mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts delete mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts delete mode 100644 packages/hyperdrive-viem/src/hyperdrive/morpho.ts delete mode 100644 packages/hyperdrive-viem/src/hyperdrive/v1.0.14/morpho.ts diff --git a/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts b/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts index 88883d4fa..e457da5c7 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts @@ -5,12 +5,10 @@ import { import { ReadHyperdrive, ReadHyperdriveOptions, - ReadMetaMorphoHyperdrive, ReadStEthHyperdrive, } from "@delvtech/hyperdrive-viem"; import { ReadHyperdrive_v1_0_14, - ReadMetaMorphoHyperdrive_v1_0_14, ReadStEthHyperdrive_v1_0_14, } from "@delvtech/hyperdrive-viem/v1.0.14"; import semver from "semver"; @@ -55,18 +53,6 @@ export async function getReadHyperdrive({ return hyperdrive; } - // morpho - if (hyperdriveConfig.kind === "MorphoBlueHyperdrive") { - hyperdrive = new ReadMetaMorphoHyperdrive(options); - - // <= v1.0.14 - if (await isV1_0_14(hyperdrive)) { - return new ReadMetaMorphoHyperdrive_v1_0_14(options); - } - - return hyperdrive; - } - // base hyperdrive = new ReadHyperdrive(options); diff --git a/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts b/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts index 64cd786fa..af33447d8 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts @@ -5,7 +5,6 @@ import { import { ReadWriteHyperdrive, ReadWriteHyperdriveOptions, - ReadWriteMetaMorphoHyperdrive, ReadWriteStEthHyperdrive, } from "@delvtech/hyperdrive-viem"; import { @@ -56,13 +55,6 @@ export async function getReadWriteHyperdrive({ return hyperdrive; } - // morpho - if (hyperdriveConfig.kind === "MorphoBlueHyperdrive") { - hyperdrive = new ReadWriteMetaMorphoHyperdrive(options); - - return hyperdrive; - } - // base hyperdrive = new ReadWriteHyperdrive(options); diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts index a0cfcf284..57bb07332 100644 --- a/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts +++ b/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts @@ -21,10 +21,6 @@ export { ReadWriteEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadWriteEzEthHyp export { ReadLsEthHyperdrive } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; export { ReadWriteLsEthHyperdrive } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; -// morpho -export { ReadMetaMorphoHyperdrive } from "src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive"; -export { ReadWriteMetaMorphoHyperdrive } from "src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive"; - // reth export { ReadREthHyperdrive } from "src/hyperdrive/reth/ReadREthHyperdrive"; export { ReadWriteREthHyperdrive } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts index 55a51a6e8..1970602a6 100644 --- a/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts +++ b/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts @@ -6,12 +6,6 @@ export { type EzEthHyperdriveAbi, } from "src/hyperdrive/ezeth/abi"; -// morpho -export { - metaMorphoSnippetsABI, - type MetaMorphoSnippetsABI, -} from "src/hyperdrive/metamorpho/abi"; - // pool export type { PoolConfig, PoolInfo } from "src/pool/types"; diff --git a/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts b/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts index d041c708d..ccd7f5935 100644 --- a/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts +++ b/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts @@ -16,9 +16,6 @@ export { ReadWriteEzEthHyperdrive_v1_0_14 } from "src/hyperdrive/ezeth/v1.0.14/R export { ReadLsEthHyperdrive_v1_0_14 } from "src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14"; export { ReadWriteLsEthHyperdrive_v1_0_14 } from "src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14"; -// morpho -export { ReadMetaMorphoHyperdrive_v1_0_14 } from "src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14"; - // reth export { ReadREthHyperdrive_v1_0_14 } from "src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14"; export { ReadWriteREthHyperdrive_v1_0_14 } from "src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14"; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts index 33c8a9c50..f232a12f1 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -1,10 +1,11 @@ import { - CachedReadWriteContract, ContractReadOptions, ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; -import { syncCacheWithTransaction } from "src/evm-client/syncCacheWithTransaction"; + Drift, + ReadWriteAdapter, + ReadWriteContract, +} from "@delvtech/drift"; +import { syncCacheWithTransaction } from "src/drift/syncCacheWithTransaction"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { NULL_BYTES } from "src/hyperdrive/constants"; @@ -22,8 +23,8 @@ export interface ReadWriteHyperdriveOptions extends ReadWriteContractModelOptions {} export class ReadWriteHyperdrive extends ReadHyperdrive { - declare contract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; + declare drift: Drift; + declare contract: ReadWriteContract; constructor(options: ReadWriteHyperdriveOptions) { super(options); @@ -35,14 +36,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { const address = await this.contract.read("baseToken", {}, options); return address === ReadWriteEth.address ? new ReadWriteEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }) : new ReadWriteErc20({ address, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } @@ -50,9 +50,8 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { const address = await this.contract.read("vaultSharesToken"); return new ReadWriteErc20({ address, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cacheNamespace: this.contract.cacheNamespace, }); } @@ -70,7 +69,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { { _checkpointTime: BigInt(time), _maxIterations: 4n }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -91,7 +90,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { { _status: paused }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -135,7 +134,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -177,7 +176,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -219,7 +218,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -261,7 +260,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -303,7 +302,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -349,7 +348,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, options, ); - return hash; + return hash as `0x${string}`; } /** @@ -390,7 +389,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { options, ); - return hash; + return hash as `0x${string}`; } /** @@ -429,6 +428,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, options, ); - return hash; + return hash as `0x${string}`; } } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts deleted file mode 100644 index 764e9fed1..000000000 --- a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { ReadContract } from "@delvtech/evm-client"; -import { Constructor } from "src/base/types"; -import { - ReadHyperdrive, - ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; -import { - MetaMorphoSnippetsABI, - metaMorphoSnippetsABI, -} from "src/hyperdrive/metamorpho/abi"; - -// See: https://www.notion.so/delv-tech/Testnet-Addresses-911a0f422f374059afa5c40d76373de6 -const SEPOLIA_METAMORPHO_SNIPPETS_ADDRESS = - "0xf5461A30b3723085F8E702fCc7461db85481c173"; - -export class ReadMetaMorphoHyperdrive extends readMetaMorphoHyperdriveMixin( - ReadHyperdrive, -) {} - -/** - * @internal - */ -export interface ReadMetaMorphoHyperdriveMixin { - metaMorphoContract: ReadContract; -} - -/** - * @internal - */ -export function readMetaMorphoHyperdriveMixin< - T extends Constructor, ->(Base: T): Constructor & T { - return class extends Base { - metaMorphoContract: ReadContract; - - constructor(...[options]: any[]) { - const { - debugName = "MetaMorpho Hyperdrive", - address, - cache, - namespace, - ...modelOptions - } = options as ReadHyperdriveOptions; - super({ debugName, address, cache, namespace, ...modelOptions }); - - this.metaMorphoContract = this.contractFactory({ - abi: metaMorphoSnippetsABI, - // TODO: Refactor to a switch/case on chainId once evm-client has chainId - // support on the Network interface - address: SEPOLIA_METAMORPHO_SNIPPETS_ADDRESS, - cache, - namespace, - }); - } - }; -} diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts deleted file mode 100644 index 76ab82dbb..000000000 --- a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ReadContract as ReadWriteContract } from "@delvtech/evm-client"; -import { Constructor } from "src/base/types"; -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; -import { MetaMorphoSnippetsABI } from "src/hyperdrive/metamorpho/abi"; - -export class ReadWriteMetaMorphoHyperdrive extends readWriteMetaMorphoHyperdriveMixin( - ReadWriteHyperdrive -) {} - -/** - * @internal - */ -export interface ReadWriteMetaMorphoHyperdriveMixin { - metaMorphoContract: ReadWriteContract; -} - -/** - * @internal - */ -export function readWriteMetaMorphoHyperdriveMixin< - T extends Constructor ->(Base: T): Constructor & T { - return class extends Base { - declare metaMorphoContract: ReadWriteContract; - }; -} diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts deleted file mode 100644 index 6b4f66e9f..000000000 --- a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts +++ /dev/null @@ -1,61 +0,0 @@ -export type MetaMorphoSnippetsABI = typeof metaMorphoSnippetsABI; -export const metaMorphoSnippetsABI = [ - { - inputs: [ - { - components: [ - { internalType: "address", name: "loanToken", type: "address" }, - { internalType: "address", name: "collateralToken", type: "address" }, - { internalType: "address", name: "oracle", type: "address" }, - { internalType: "address", name: "irm", type: "address" }, - { internalType: "uint256", name: "lltv", type: "uint256" }, - ], - internalType: "struct MarketParams", - name: "marketParams", - type: "tuple", - }, - { - components: [ - { - internalType: "uint128", - name: "totalSupplyAssets", - type: "uint128", - }, - { - internalType: "uint128", - name: "totalSupplyShares", - type: "uint128", - }, - { - internalType: "uint128", - name: "totalBorrowAssets", - type: "uint128", - }, - { - internalType: "uint128", - name: "totalBorrowShares", - type: "uint128", - }, - { internalType: "uint128", name: "lastUpdate", type: "uint128" }, - { internalType: "uint128", name: "fee", type: "uint128" }, - ], - internalType: "struct Market", - name: "market", - type: "tuple", - }, - ], - name: "supplyAPYMarket", - outputs: [{ internalType: "uint256", name: "supplyApy", type: "uint256" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [{ internalType: "address", name: "vault", type: "address" }], - name: "supplyAPYVault", - outputs: [ - { internalType: "uint256", name: "avgSupplyApy", type: "uint256" }, - ], - stateMutability: "view", - type: "function", - }, -] as const; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts deleted file mode 100644 index 333e8cfa1..000000000 --- a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; -import { readMetaMorphoHyperdriveMixin } from "src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive"; - -export class ReadMetaMorphoHyperdrive_v1_0_14 extends readMetaMorphoHyperdriveMixin( - ReadHyperdrive_v1_0_14 -) {} diff --git a/packages/hyperdrive-viem/src/exports/hyperdrive.ts b/packages/hyperdrive-viem/src/exports/hyperdrive.ts index dad0a95a8..69e50f8b5 100644 --- a/packages/hyperdrive-viem/src/exports/hyperdrive.ts +++ b/packages/hyperdrive-viem/src/exports/hyperdrive.ts @@ -26,12 +26,6 @@ export { ReadWriteLsEthHyperdrive, } from "src/hyperdrive/lseth"; -// morpho -export { - ReadMetaMorphoHyperdrive, - ReadWriteMetaMorphoHyperdrive, -} from "src/hyperdrive/morpho"; - // reth export { ReadREthHyperdrive, diff --git a/packages/hyperdrive-viem/src/exports/v1.0.14/hyperdrive.ts b/packages/hyperdrive-viem/src/exports/v1.0.14/hyperdrive.ts index e6b7dadc5..ba4875e5c 100644 --- a/packages/hyperdrive-viem/src/exports/v1.0.14/hyperdrive.ts +++ b/packages/hyperdrive-viem/src/exports/v1.0.14/hyperdrive.ts @@ -24,9 +24,6 @@ export { ReadWriteLsEthHyperdrive_v1_0_14, } from "src/hyperdrive/v1.0.14/lseth"; -// morpho -export { ReadMetaMorphoHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/morpho"; - // reth export { ReadREthHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-viem/src/hyperdrive/morpho.ts b/packages/hyperdrive-viem/src/hyperdrive/morpho.ts deleted file mode 100644 index 10a16b516..000000000 --- a/packages/hyperdrive-viem/src/hyperdrive/morpho.ts +++ /dev/null @@ -1,11 +0,0 @@ -import * as core from "@delvtech/hyperdrive-js-core"; -import { viemReadMixin } from "src/viem/viemReadMixin"; -import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; - -export class ReadMetaMorphoHyperdrive extends viemReadMixin( - core.ReadMetaMorphoHyperdrive -) {} - -export class ReadWriteMetaMorphoHyperdrive extends viemReadWriteMixin( - core.ReadWriteMetaMorphoHyperdrive -) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/morpho.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/morpho.ts deleted file mode 100644 index 0fe6d8da9..000000000 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/morpho.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as core from "@delvtech/hyperdrive-js-core/v1.0.14"; -import { viemReadMixin } from "src/viem/viemReadMixin"; - -export class ReadMetaMorphoHyperdrive_v1_0_14 extends viemReadMixin( - core.ReadMetaMorphoHyperdrive_v1_0_14 -) {} From 39b7839e5d014a38e25d82a9244c51350c5fbe0d Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Sat, 2 Nov 2024 19:07:28 -0500 Subject: [PATCH 02/43] Symlink drift packages --- packages/drift | 1 + packages/drift-viem | 1 + packages/typescript-config.drift | 1 + 3 files changed, 3 insertions(+) create mode 120000 packages/drift create mode 120000 packages/drift-viem create mode 120000 packages/typescript-config.drift diff --git a/packages/drift b/packages/drift new file mode 120000 index 000000000..b0ebb30d3 --- /dev/null +++ b/packages/drift @@ -0,0 +1 @@ +../../drift/packages/drift \ No newline at end of file diff --git a/packages/drift-viem b/packages/drift-viem new file mode 120000 index 000000000..efd26b159 --- /dev/null +++ b/packages/drift-viem @@ -0,0 +1 @@ +../../drift/packages/drift-viem \ No newline at end of file diff --git a/packages/typescript-config.drift b/packages/typescript-config.drift new file mode 120000 index 000000000..7ae9ea41f --- /dev/null +++ b/packages/typescript-config.drift @@ -0,0 +1 @@ +../../drift/packages/typescript-config \ No newline at end of file From bb0afeb3762bc3c4ea1af64e0101eacb46bd5bc6 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Sat, 2 Nov 2024 19:13:07 -0500 Subject: [PATCH 03/43] Add drift to SDK core --- packages/hyperdrive-js-core/package.json | 2 + yarn.lock | 534 ++++++++++++++++++++++- 2 files changed, 532 insertions(+), 4 deletions(-) diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index e33b074d3..ba8310505 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -11,6 +11,7 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { + "@delvtech/drift": "^0.0.1-beta.6", "@delvtech/evm-client": "^0.5.1" }, "dependencies": { @@ -21,6 +22,7 @@ "lodash.mapvalues": "^4.6.0" }, "devDependencies": { + "@delvtech/drift": "^0.0.1-beta.6", "@delvtech/evm-client": "^0.5.1", "@hyperdrive/eslint-config": "*", "@hyperdrive/prettier-config": "*", diff --git a/yarn.lock b/yarn.lock index 999e88963..db505174d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2088,6 +2088,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== +"@esbuild/aix-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" + integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== + "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" @@ -2108,6 +2113,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== +"@esbuild/android-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" + integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== + "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" @@ -2128,6 +2138,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== +"@esbuild/android-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" + integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== + "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" @@ -2148,6 +2163,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== +"@esbuild/android-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" + integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== + "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" @@ -2168,6 +2188,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== +"@esbuild/darwin-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" + integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== + "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" @@ -2188,6 +2213,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== +"@esbuild/darwin-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" + integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== + "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" @@ -2208,6 +2238,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== +"@esbuild/freebsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" + integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== + "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" @@ -2228,6 +2263,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== +"@esbuild/freebsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" + integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== + "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" @@ -2248,6 +2288,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== +"@esbuild/linux-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" + integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== + "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" @@ -2268,6 +2313,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== +"@esbuild/linux-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" + integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== + "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" @@ -2288,6 +2338,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== +"@esbuild/linux-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" + integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== + "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" @@ -2308,6 +2363,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== +"@esbuild/linux-loong64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" + integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== + "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" @@ -2328,6 +2388,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== +"@esbuild/linux-mips64el@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" + integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== + "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" @@ -2348,6 +2413,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== +"@esbuild/linux-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" + integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== + "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" @@ -2368,6 +2438,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== +"@esbuild/linux-riscv64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" + integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== + "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" @@ -2388,6 +2463,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== +"@esbuild/linux-s390x@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" + integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== + "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" @@ -2408,6 +2488,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== +"@esbuild/linux-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" + integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== + "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" @@ -2428,6 +2513,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== +"@esbuild/netbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" + integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== + "@esbuild/openbsd-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" @@ -2438,6 +2528,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== +"@esbuild/openbsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" + integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== + "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" @@ -2458,6 +2553,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== +"@esbuild/openbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" + integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== + "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" @@ -2478,6 +2578,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== +"@esbuild/sunos-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" + integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== + "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" @@ -2498,6 +2603,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== +"@esbuild/win32-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" + integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== + "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" @@ -2518,6 +2628,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== +"@esbuild/win32-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" + integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== + "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" @@ -2538,6 +2653,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== +"@esbuild/win32-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" + integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -2942,6 +3062,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3733,6 +3858,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz#7746deb85e4a8fb54fbfda8ac5c102692f102476" integrity sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww== +"@rollup/rollup-android-arm-eabi@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz#49a2a9808074f2683667992aa94b288e0b54fc82" + integrity sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ== + "@rollup/rollup-android-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" @@ -3748,6 +3878,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz#93de4d867709d3313794723b5afd91e1e174f906" integrity sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A== +"@rollup/rollup-android-arm64@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz#197e3bc01c228d3c23591e0fcedca91f8f398ec1" + integrity sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q== + "@rollup/rollup-darwin-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" @@ -3763,6 +3898,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz#e41e6a81673260ab196e0f59462b9940a6ac03cd" integrity sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q== +"@rollup/rollup-darwin-arm64@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz#16772c0309d0dc3cca716580cdac7a1c560ddf46" + integrity sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w== + "@rollup/rollup-darwin-x64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" @@ -3778,6 +3918,21 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz#2b0a0aef6e8c5317d494cfc9076d7a16b099bdcb" integrity sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA== +"@rollup/rollup-darwin-x64@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz#4e98120a1c4cda7d4043ccce72347cee53784140" + integrity sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow== + +"@rollup/rollup-freebsd-arm64@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz#27145e414986e216e0d9b9a8d488028f33c39566" + integrity sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A== + +"@rollup/rollup-freebsd-x64@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz#67e75fd87a903090f038b212273c492e5ca6b32f" + integrity sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg== + "@rollup/rollup-linux-arm-gnueabihf@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" @@ -3793,6 +3948,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz#e22319deb5367384ef315e66bc6de80d2bf2b3ae" integrity sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q== +"@rollup/rollup-linux-arm-gnueabihf@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz#bb45ebadbb9496298ab5461373bde357e8f33e88" + integrity sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A== + "@rollup/rollup-linux-arm-musleabihf@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz#4ba804a00b5e793196a622f6977e05f23e01f59a" @@ -3803,6 +3963,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz#d5dd68f5d7ae21b345a5c87208c94e5c813f54b8" integrity sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw== +"@rollup/rollup-linux-arm-musleabihf@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz#384276c23feb0a4d6ffa603a9a760decce8b4118" + integrity sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw== + "@rollup/rollup-linux-arm64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" @@ -3818,6 +3983,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz#1703d3a418d33f8f025acaf93f39ca1efcd5b645" integrity sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw== +"@rollup/rollup-linux-arm64-gnu@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz#89e5a4570ddd9eca908324a6de60bd64f904e3f0" + integrity sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ== + "@rollup/rollup-linux-arm64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" @@ -3833,6 +4003,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz#3f59c2c6e60f75ce8b1090bd841c555e3bb01f0e" integrity sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw== +"@rollup/rollup-linux-arm64-musl@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz#9ffd7cd6c6c6670d8c039056d6a49ad9f1f66949" + integrity sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw== + "@rollup/rollup-linux-powerpc64le-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz#1540b284d91c440bc9fa7a1714cfb71a5597e94d" @@ -3843,6 +4018,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz#3f99a0921596a6f539121a312df29af52a205f15" integrity sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ== +"@rollup/rollup-linux-powerpc64le-gnu@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz#4d32ce982e2d25e3b8116336ad5ce6e270b5a024" + integrity sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g== + "@rollup/rollup-linux-riscv64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" @@ -3858,6 +4038,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz#c08fb3e629d50d2eac31329347cfc559a1cf81d1" integrity sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A== +"@rollup/rollup-linux-riscv64-gnu@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz#f43d4e0572397e3d3acd82d77d79ce021dea3310" + integrity sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA== + "@rollup/rollup-linux-s390x-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz#579ca5f271421a961d3c73d221202c79e02ff03a" @@ -3868,6 +4053,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz#173722cd745779d730d4b24d21386185e0e12de8" integrity sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q== +"@rollup/rollup-linux-s390x-gnu@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz#264f8a4c206173945bdab2a676d638b7945106a9" + integrity sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw== + "@rollup/rollup-linux-x64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" @@ -3883,6 +4073,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz#0af2b6541ab0f4954d2c4f96bcdc7947420dd28c" integrity sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q== +"@rollup/rollup-linux-x64-gnu@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz#e86172a407b2edd41540ec2ae636e497fadccff6" + integrity sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ== + "@rollup/rollup-linux-x64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" @@ -3898,6 +4093,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz#f973f9552744764b221128f7c3629222216ace69" integrity sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q== +"@rollup/rollup-linux-x64-musl@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz#8ae9bf78986d1b16ccbc89ab6f2dfa96807d3178" + integrity sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw== + "@rollup/rollup-win32-arm64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" @@ -3913,6 +4113,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz#21ac5ed84d914bc31821fec3dd909f7257cfb17b" integrity sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA== +"@rollup/rollup-win32-arm64-msvc@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz#11d6a59f651a3c2a9e5eaab0a99367b77a29c319" + integrity sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA== + "@rollup/rollup-win32-ia32-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" @@ -3928,6 +4133,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz#0cfe740063b35dcd5a62c4e243226631a846ce11" integrity sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ== +"@rollup/rollup-win32-ia32-msvc@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz#7ff146e53dc6e388b60329b7ec3335501d2b0f98" + integrity sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ== + "@rollup/rollup-win32-x64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" @@ -3943,6 +4153,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz#5f2c40d3f1b53ede80fb4e6964f840c0f8936832" integrity sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg== +"@rollup/rollup-win32-x64-msvc@4.24.3": + version "4.24.3" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz#7687335781efe6bee14d6ed8eff9746a9f24c9cd" + integrity sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ== + "@safe-global/safe-apps-provider@0.18.1": version "0.18.1" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" @@ -4588,6 +4803,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/ethereumjs-util@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@types/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#f49fe8114789ec0871721392c09318c3eb56671b" @@ -5443,6 +5663,25 @@ chai "^5.1.1" tinyrainbow "^1.2.0" +"@vitest/expect@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.4.tgz#48f4f53a01092a3bdc118cff245f79ef388bdd8e" + integrity sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA== + dependencies: + "@vitest/spy" "2.1.4" + "@vitest/utils" "2.1.4" + chai "^5.1.2" + tinyrainbow "^1.2.0" + +"@vitest/mocker@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.4.tgz#0dc07edb9114f7f080a0181fbcdb16cd4a2d855d" + integrity sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ== + dependencies: + "@vitest/spy" "2.1.4" + estree-walker "^3.0.3" + magic-string "^0.30.12" + "@vitest/pretty-format@2.0.4", "@vitest/pretty-format@^2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.4.tgz#9a3934932e7f8ddd836b38c34ddaeec91bd0f82e" @@ -5450,6 +5689,13 @@ dependencies: tinyrainbow "^1.2.0" +"@vitest/pretty-format@2.1.4", "@vitest/pretty-format@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.4.tgz#fc31993bdc1ef5a6c1a4aa6844e7ba55658a4f9f" + integrity sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww== + dependencies: + tinyrainbow "^1.2.0" + "@vitest/runner@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.4.tgz#0b1edb8ab5f81a1c7dfd50090e5e7e971a117891" @@ -5458,6 +5704,14 @@ "@vitest/utils" "2.0.4" pathe "^1.1.2" +"@vitest/runner@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.4.tgz#f9346500bdd0be1c926daaac5d683bae87ceda2c" + integrity sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA== + dependencies: + "@vitest/utils" "2.1.4" + pathe "^1.1.2" + "@vitest/snapshot@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.4.tgz#7d7dea9df17c5c13386f1a7a433b99dc0ffe3c14" @@ -5467,6 +5721,15 @@ magic-string "^0.30.10" pathe "^1.1.2" +"@vitest/snapshot@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.4.tgz#ef8c3f605fbc23a32773256d37d3fdfd9b23d353" + integrity sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q== + dependencies: + "@vitest/pretty-format" "2.1.4" + magic-string "^0.30.12" + pathe "^1.1.2" + "@vitest/spy@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.4.tgz#19083386a741a158c2f142beffe43be68b1375cf" @@ -5474,6 +5737,13 @@ dependencies: tinyspy "^3.0.0" +"@vitest/spy@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.4.tgz#4e90f9783437c5841a27c80f8fd84d7289a6100a" + integrity sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg== + dependencies: + tinyspy "^3.0.2" + "@vitest/utils@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.4.tgz#2db1df35aaeb5caa932770a190df636a68d284d5" @@ -5484,6 +5754,15 @@ loupe "^3.1.1" tinyrainbow "^1.2.0" +"@vitest/utils@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.4.tgz#6d67ac966647a21ce8bc497472ce230de3b64537" + integrity sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg== + dependencies: + "@vitest/pretty-format" "2.1.4" + loupe "^3.1.2" + tinyrainbow "^1.2.0" + "@wagmi/connectors@4.1.18": version "4.1.18" resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-4.1.18.tgz#b95350ff2cb527093ff9dd11d382e0563ec546e3" @@ -5927,6 +6206,11 @@ abitype@^1.0.5: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== +abitype@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" + integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -6874,6 +7158,17 @@ chai@^5.1.1: loupe "^3.1.0" pathval "^2.0.0" +chai@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" + integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@5.3.0, chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -6971,6 +7266,13 @@ cheerio@^1.0.0-rc.12: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -7807,6 +8109,13 @@ debug@^4.3.5: dependencies: ms "2.1.2" +debug@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decache@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da" @@ -8575,6 +8884,36 @@ esbuild@^0.23.0: "@esbuild/win32-ia32" "0.23.0" "@esbuild/win32-x64" "0.23.0" +esbuild@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" + integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.24.0" + "@esbuild/android-arm" "0.24.0" + "@esbuild/android-arm64" "0.24.0" + "@esbuild/android-x64" "0.24.0" + "@esbuild/darwin-arm64" "0.24.0" + "@esbuild/darwin-x64" "0.24.0" + "@esbuild/freebsd-arm64" "0.24.0" + "@esbuild/freebsd-x64" "0.24.0" + "@esbuild/linux-arm" "0.24.0" + "@esbuild/linux-arm64" "0.24.0" + "@esbuild/linux-ia32" "0.24.0" + "@esbuild/linux-loong64" "0.24.0" + "@esbuild/linux-mips64el" "0.24.0" + "@esbuild/linux-ppc64" "0.24.0" + "@esbuild/linux-riscv64" "0.24.0" + "@esbuild/linux-s390x" "0.24.0" + "@esbuild/linux-x64" "0.24.0" + "@esbuild/netbsd-x64" "0.24.0" + "@esbuild/openbsd-arm64" "0.24.0" + "@esbuild/openbsd-x64" "0.24.0" + "@esbuild/sunos-x64" "0.24.0" + "@esbuild/win32-arm64" "0.24.0" + "@esbuild/win32-ia32" "0.24.0" + "@esbuild/win32-x64" "0.24.0" + esbuild@~0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" @@ -9157,6 +9496,11 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +expect-type@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" + integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== + express@^4.17.3: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" @@ -9248,7 +9592,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-gl merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -9316,6 +9660,11 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +fdir@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" @@ -11555,6 +11904,11 @@ loupe@^3.1.0, loupe@^3.1.1: dependencies: get-func-name "^2.0.1" +loupe@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" + integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -11618,6 +11972,13 @@ magic-string@^0.30.10: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +magic-string@^0.30.12: + version "0.30.12" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60" + integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + magic-string@^0.30.3: version "0.30.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" @@ -12597,7 +12958,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -12663,6 +13024,17 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +nise@^5.1.9: + version "5.1.9" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139" + integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/text-encoding" "^0.7.2" + just-extend "^6.2.0" + path-to-regexp "^6.2.1" + nise@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nise/-/nise-6.0.0.tgz#ae56fccb5d912037363c3b3f29ebbfa28bde8b48" @@ -13350,11 +13722,21 @@ picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pidtree@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -14461,6 +14843,11 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -14940,6 +15327,33 @@ rollup@^4.19.0: "@rollup/rollup-win32-x64-msvc" "4.19.1" fsevents "~2.3.2" +rollup@^4.24.0: + version "4.24.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.3.tgz#8b259063740af60b0030315f88665ba2041789b8" + integrity sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.24.3" + "@rollup/rollup-android-arm64" "4.24.3" + "@rollup/rollup-darwin-arm64" "4.24.3" + "@rollup/rollup-darwin-x64" "4.24.3" + "@rollup/rollup-freebsd-arm64" "4.24.3" + "@rollup/rollup-freebsd-x64" "4.24.3" + "@rollup/rollup-linux-arm-gnueabihf" "4.24.3" + "@rollup/rollup-linux-arm-musleabihf" "4.24.3" + "@rollup/rollup-linux-arm64-gnu" "4.24.3" + "@rollup/rollup-linux-arm64-musl" "4.24.3" + "@rollup/rollup-linux-powerpc64le-gnu" "4.24.3" + "@rollup/rollup-linux-riscv64-gnu" "4.24.3" + "@rollup/rollup-linux-s390x-gnu" "4.24.3" + "@rollup/rollup-linux-x64-gnu" "4.24.3" + "@rollup/rollup-linux-x64-musl" "4.24.3" + "@rollup/rollup-win32-arm64-msvc" "4.24.3" + "@rollup/rollup-win32-ia32-msvc" "4.24.3" + "@rollup/rollup-win32-x64-msvc" "4.24.3" + fsevents "~2.3.2" + rtl-css-js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -15003,6 +15417,11 @@ safe-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== +safe-stable-stringify@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -15363,6 +15782,18 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" +sinon@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-17.0.2.tgz#470894bcc2d24b01bad539722ea46da949892405" + integrity sha512-uihLiaB9FhzesElPDFZA7hDcNABzsVHwr3YfmM9sBllVwab3l0ltGlRV1XhpNfIacNDLGD1QRZNLs5nU5+hTuA== + dependencies: + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/samsam" "^8.0.0" + diff "^5.2.0" + nise "^5.1.9" + supports-color "^7" + sinon@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.0.tgz#69ca293dbc3e82590a8b0d46c97f63ebc1e5fc01" @@ -16126,11 +16557,34 @@ tinybench@^2.8.0: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" + integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== + +tinyglobby@^0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + tinypool@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== +tinypool@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" + integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== + tinyrainbow@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" @@ -16141,6 +16595,11 @@ tinyspy@^3.0.0: resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -16342,6 +16801,28 @@ tsup@^8.2.3: sucrase "^3.35.0" tree-kill "^1.2.2" +tsup@^8.3.0: + version "8.3.5" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.3.5.tgz#d55344e4756e924bf6f442e54e7d324b4471eee0" + integrity sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA== + dependencies: + bundle-require "^5.0.0" + cac "^6.7.14" + chokidar "^4.0.1" + consola "^3.2.3" + debug "^4.3.7" + esbuild "^0.24.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.24.0" + source-map "0.8.0-beta.0" + sucrase "^3.35.0" + tinyexec "^0.3.1" + tinyglobby "^0.2.9" + tree-kill "^1.2.2" + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -16552,7 +17033,7 @@ typedoc@^0.25.7: minimatch "^9.0.3" shiki "^0.14.7" -typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@~5.2.2: +typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@^5.6.2, typescript@~5.2.2: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -16952,7 +17433,7 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" -viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.7.8, viem@^2.9.2: +viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.21.37, viem@^2.7.8, viem@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.2.tgz#29bd2425222be136bf969a90dd3a8d6032221904" integrity sha512-GRakUTNiYE9W+vL+Be9JkQfzWnkczerHtSpEe2JR/jEGTYZAs4shrA4WLgiaVCI9JxpnduZhQfRWNvy2dlyP2g== @@ -16977,6 +17458,16 @@ vite-node@2.0.4: tinyrainbow "^1.2.0" vite "^5.0.0" +vite-node@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.4.tgz#97ffb6de913fd8d42253afe441f9512e9dbdfd5c" + integrity sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg== + dependencies: + cac "^6.7.14" + debug "^4.3.7" + pathe "^1.1.2" + vite "^5.0.0" + vite-plugin-node-polyfills@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz#d0afcf82eb985fc02244620d7cec1ddd1c6e0864" @@ -16994,6 +17485,15 @@ vite-tsconfig-paths@^4.2.0, vite-tsconfig-paths@^4.3.2: globrex "^0.1.2" tsconfck "^3.0.3" +vite-tsconfig-paths@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.0.1.tgz#c9387a29c32fd586e4c7f4e2b2da1f0b5c9a7403" + integrity sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.3" + vite@^5.0.0, vite@^5.3.5: version "5.3.5" resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" @@ -17030,6 +17530,32 @@ vitest@^2.0.4: vite-node "2.0.4" why-is-node-running "^2.3.0" +vitest@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.4.tgz#ba8f4589fb639cf5a9e6af54781667312b3e8230" + integrity sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ== + dependencies: + "@vitest/expect" "2.1.4" + "@vitest/mocker" "2.1.4" + "@vitest/pretty-format" "^2.1.4" + "@vitest/runner" "2.1.4" + "@vitest/snapshot" "2.1.4" + "@vitest/spy" "2.1.4" + "@vitest/utils" "2.1.4" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" + pathe "^1.1.2" + std-env "^3.7.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.1.4" + why-is-node-running "^2.3.0" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" From 2040ba79a5c4bdaac267d77cfcdbcfe714e890e9 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Sat, 2 Nov 2024 21:07:30 -0500 Subject: [PATCH 04/43] Refactor sdk core to drift --- packages/hyperdrive-js-core/src/base/types.ts | 91 ------------ .../src/checkpoint/types.ts | 10 +- .../utils => drift}/getBlockOrThrow.ts | 15 +- .../src/errors/BlockNotFoundError.ts | 2 +- .../src/evm-client/contractFactory.ts | 27 ---- .../utils/getBlockFromReadOptions.ts | 13 -- .../evm-client/utils/isReadWriteContract.ts | 12 -- .../src/factory/ReadFactory.ts | 17 +-- .../src/factory/ReadWriteFactory.ts | 24 ++-- .../src/hyperdrive/base/ReadHyperdrive.ts | 129 +++++++++--------- .../hyperdrive/base/ReadWriteHyperdrive.ts | 3 + .../base/v1.0.14/ReadHyperdrive_v1_0_14.ts | 2 +- .../erc4626/ReadErc4626Hyperdrive.ts | 8 +- .../erc4626/ReadMockErc4626Hyperdrive.ts | 16 +-- .../erc4626/ReadWriteErc4626Hyperdrive.ts | 14 +- .../erc4626/ReadWriteMockErc4626Hyperdrive.ts | 14 +- .../hyperdrive/ezeth/ReadEzEthHyperdrive.ts | 23 ++-- .../ezeth/ReadWriteEzEthHyperdrive.ts | 24 ++-- .../hyperdrive/lseth/ReadLsEthHyperdrive.ts | 11 +- .../lseth/ReadWriteLsEthHyperdrive.ts | 17 ++- .../src/hyperdrive/reth/ReadREthHyperdrive.ts | 11 +- .../reth/ReadWriteREthHyperdrive.ts | 11 +- .../hyperdrive/steth/ReadStEthHyperdrive.ts | 11 +- .../steth/ReadWriteStEthHyperdrive.ts | 31 ++--- .../hyperdrive-js-core/src/model/ReadModel.ts | 35 ++--- .../src/model/ReadWriteModel.ts | 26 ++-- packages/hyperdrive-js-core/src/pool/types.ts | 2 +- .../src/registry/ReadRegistry.ts | 30 ++-- .../src/registry/ReadWriteRegistry.ts | 35 +++-- .../hyperdrive-js-core/src/registry/types.ts | 9 +- .../hyperdrive-js-core/src/token/ReadToken.ts | 2 +- .../src/token/ReadWriteToken.ts | 8 +- .../src/token/erc20/ReadErc20.ts | 19 +-- .../src/token/erc20/ReadWriteErc20.ts | 13 +- .../src/token/erc4626/ReadErc4626.ts | 14 +- .../src/token/erc4626/ReadMockErc4626.ts | 14 +- .../src/token/erc4626/ReadWriteErc4626.ts | 4 +- .../src/token/erc4626/ReadWriteMockErc4626.ts | 7 +- .../src/token/eth/ReadEth.ts | 7 +- .../src/token/eth/ReadWriteEth.ts | 4 +- .../src/token/lseth/ReadLsEth.ts | 14 +- .../src/token/lseth/ReadWriteLsEth.ts | 4 +- .../src/token/reth/ReadREth.ts | 14 +- .../src/token/reth/ReadWriteREth.ts | 4 +- .../src/token/steth/ReadStEth.ts | 14 +- .../src/token/steth/ReadWriteStEth.ts | 4 +- 46 files changed, 332 insertions(+), 487 deletions(-) rename packages/hyperdrive-js-core/src/{evm-client/utils => drift}/getBlockOrThrow.ts (61%) delete mode 100644 packages/hyperdrive-js-core/src/evm-client/contractFactory.ts delete mode 100644 packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts delete mode 100644 packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts diff --git a/packages/hyperdrive-js-core/src/base/types.ts b/packages/hyperdrive-js-core/src/base/types.ts index f00061a6a..13e33b13b 100644 --- a/packages/hyperdrive-js-core/src/base/types.ts +++ b/packages/hyperdrive-js-core/src/base/types.ts @@ -1,11 +1,3 @@ -/** - * Combines members of an intersection into a readable type. - * @see https://twitter.com/mattpocockuk/status/1622730173446557697?s=20&t=NdpAcmEFXY01xkqU3KO0Mg - */ -export type Prettify = { - [K in keyof T]: T[K]; -} & unknown; - /** * A generic constructor type. */ @@ -13,86 +5,3 @@ export type Constructor< TInstanceType = any, TArgs extends any[] = any[], > = new (...args: TArgs) => TInstanceType; - -/** - * Overrides properties of `T` with properties of `U`. - */ -export type Override = Prettify & U>; - -/** - * Convert members of a union to an intersection. - * - * @example - * ```ts - * type Union = { a: number } | { b: string }; - * type Intersection = UnionToIntersection; - * // { a: number } & { b: string } - * ``` - * - * @privateRemarks - * This works by taking advantage of [distributive conditional - * types](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types), - * which allows conditional types to be applied to each member of a union type - * individually, and [contravarience in function argument - * types](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html#strict-function-types). - * - * The conditional type `T extends any ? (x: T) => any : never` is used to - * create a function type for each member of the union that takes the member as - * an argument. - * - * Then, the union of function types is checked to see if it can be assigned to - * a single function type with an inferred argument type. TypeScript infers the - * argument type as the intersection of the union members since it's the only - * argument type that satisfies all members of the function type union. - */ -type UnionToIntersection = ( - T extends any ? (member: T) => any : never -) extends (member: infer R) => any - ? R - : never; - -/** - * Merge the keys of a union or intersection of objects into a single type. - * - * @example - * ```ts - * type GetBlockOptions = { - * includeTransactions?: boolean | undefined - * } & ( - * | { - * blockHash?: string | undefined; - * blockNumber?: never | undefined; - * blockTag?: never | undefined; - * } - * | { - * blockHash?: never | undefined; - * blockNumber?: bigint | undefined; - * blockTag?: never | undefined; - * } - * | { - * blockHash?: never | undefined; - * blockNumber?: never | undefined; - * blockTag?: string | undefined; - * } - * ) - * - * type Merged = MergeKeys; - * // { - * // includeTransactions?: boolean | undefined; - * // blockHash?: string | undefined; - * // blockNumber?: bigint | undefined; - * // blockTag?: string | undefined; - * // } - * ``` - */ -export type MergeKeys = - UnionToIntersection extends infer I - ? { - // Each key of the intersection is first checked against the union type, - // T. If it exists in every member of T, then T[K] will be a union of - // the value types. Otherwise, I[K] is used. I[K] is the value type of - // the key in the intersection which will be `never` for keys with - // conflicting value types. - [K in keyof I]: K extends keyof T ? T[K] : I[K]; - } - : never; diff --git a/packages/hyperdrive-js-core/src/checkpoint/types.ts b/packages/hyperdrive-js-core/src/checkpoint/types.ts index 2f3124768..12189c98b 100644 --- a/packages/hyperdrive-js-core/src/checkpoint/types.ts +++ b/packages/hyperdrive-js-core/src/checkpoint/types.ts @@ -1,18 +1,18 @@ import { + ContractEvent, ContractReadOptions, - Event, FunctionReturn, -} from "@delvtech/evm-client"; -import { Prettify } from "src/base/types"; + Pretty, +} from "@delvtech/drift"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; -export type Checkpoint = Prettify< +export type Checkpoint = Pretty< { checkpointTime: bigint; } & FunctionReturn >; -export type CheckpointEvent = Event; +export type CheckpointEvent = ContractEvent; export type GetCheckpointTimeParams = ( | { diff --git a/packages/hyperdrive-js-core/src/evm-client/utils/getBlockOrThrow.ts b/packages/hyperdrive-js-core/src/drift/getBlockOrThrow.ts similarity index 61% rename from packages/hyperdrive-js-core/src/evm-client/utils/getBlockOrThrow.ts rename to packages/hyperdrive-js-core/src/drift/getBlockOrThrow.ts index 7343d180a..d354c93ca 100644 --- a/packages/hyperdrive-js-core/src/evm-client/utils/getBlockOrThrow.ts +++ b/packages/hyperdrive-js-core/src/drift/getBlockOrThrow.ts @@ -1,6 +1,13 @@ -import { Block, Network, NetworkGetBlockOptions } from "@delvtech/evm-client"; +import { + Block, + ContractReadOptions, + Drift, + GetBlockParams, +} from "@delvtech/drift"; import { BlockNotFoundError } from "src/errors/BlockNotFoundError"; +export type GetBlockOrThrowParams = GetBlockParams & ContractReadOptions; + /** * A utility that tries to fetch a block from a given network and throws an * error if no block is found. Useful for unified error handling when fetching @@ -8,10 +15,10 @@ import { BlockNotFoundError } from "src/errors/BlockNotFoundError"; * @throws `BlockNotFoundError` */ export async function getBlockOrThrow( - network: Network, - options?: NetworkGetBlockOptions, + drift: Drift, + options?: GetBlockOrThrowParams, ): Promise { - const fetched = await network.getBlock(options); + const fetched = await drift.getBlock(options); if (!fetched) { throw new BlockNotFoundError(options); } diff --git a/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts b/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts index 7c6279a53..62f20885d 100644 --- a/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts +++ b/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts @@ -1,4 +1,4 @@ -import { NetworkGetBlockOptions } from "@delvtech/evm-client"; +import { NetworkGetBlockOptions } from "@delvtech/drift"; import { HyperdriveSdkError } from "./HyperdriveSdkError"; export class BlockNotFoundError extends HyperdriveSdkError { diff --git a/packages/hyperdrive-js-core/src/evm-client/contractFactory.ts b/packages/hyperdrive-js-core/src/evm-client/contractFactory.ts deleted file mode 100644 index 1c670754e..000000000 --- a/packages/hyperdrive-js-core/src/evm-client/contractFactory.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { - CachedReadContract, - CachedReadWriteContract, - SimpleCache, -} from "@delvtech/evm-client"; -import { Abi } from "abitype"; - -export interface ContractFactoryOptions { - abi: TAbi; - address: `0x${string}`; - cache?: SimpleCache; - namespace?: string; -} - -/** - * A factory function that creates a `CachedReadContract` instance. - */ -export type ReadContractFactory = ( - options: ContractFactoryOptions, -) => CachedReadContract; - -/** - * A factory function that creates a `CachedReadWriteContract` instance. - */ -export type ReadWriteContractFactory = ( - options: ContractFactoryOptions, -) => CachedReadWriteContract; diff --git a/packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts b/packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts deleted file mode 100644 index d5119604d..000000000 --- a/packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BlockTag, ContractReadOptions } from "@delvtech/evm-client"; - -// TODO: Move this to @delvtech/evm-client -export type BlockLike = BlockTag | bigint; - -/** - * Extracts a block number or block tag from a `ContractReadOptions` object. - */ -export function getBlockFromReadOptions( - options?: ContractReadOptions, -): BlockLike | undefined { - return options?.blockNumber || options?.blockTag; -} diff --git a/packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts b/packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts deleted file mode 100644 index 26057a907..000000000 --- a/packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { - CachedReadContract, - CachedReadWriteContract, -} from "@delvtech/evm-client"; - -// TODO: Consider better type checking if more use cases arise, possibly with a -// library like zod. -export function isReadWriteContract( - contract: CachedReadContract | CachedReadWriteContract, -): contract is CachedReadWriteContract { - return "write" in contract; -} diff --git a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts index 515729686..e9928fc7e 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; import { FactoryAbi, factoryAbi } from "src/factory/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; @@ -8,22 +8,22 @@ export interface ReadFactoryOptions extends ReadContractModelOptions {} export class ReadFactory extends ReadModel { address: Address; - contract: CachedReadContract; + contract: Contract; constructor({ debugName = "Hyperdrive Factory", address, cache, - namespace, + cacheNamespace, ...modelOptions }: ReadFactoryOptions) { super({ debugName, ...modelOptions }); - this.address = address; - this.contract = this.contractFactory({ + this.address = address as Address; + this.contract = this.drift.contract({ abi: factoryAbi, address, cache, - namespace, + cacheNamespace, }); } @@ -98,8 +98,9 @@ export class ReadFactory extends ReadModel { (address) => new ReadHyperdrive({ address, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), ); } diff --git a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts index be6f7193c..6f31321bc 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts @@ -1,20 +1,21 @@ import { - CachedReadWriteContract, ContractReadOptions, -} from "@delvtech/evm-client"; -import { Override } from "src/base/types"; -import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; + Drift, + ReadWriteAdapter, + ReadWriteContract, + ReplaceProps, +} from "@delvtech/drift"; import { ReadFactory, ReadFactoryOptions } from "src/factory/ReadFactory"; import { FactoryAbi } from "src/factory/abi"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; export interface ReadWriteFactoryOptions - extends Override {} + extends ReplaceProps {} export class ReadWriteFactory extends ReadFactory { - declare contract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; + declare contract: ReadWriteContract; + declare drift: Drift; constructor(options: ReadWriteFactoryOptions) { super(options); @@ -25,16 +26,17 @@ export class ReadWriteFactory extends ReadFactory { * deployed by the deployer factory. */ async getInstances( - options?: ContractReadOptions + options?: ContractReadOptions, ): Promise { const hyperdriveAddresses = await this.getInstanceAddresses(options); return hyperdriveAddresses.map( (address) => new ReadWriteHyperdrive({ address, - contractFactory: this.contractFactory, - network: this.network, - }) + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), ); } } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts index 4c8b824c1..94c7f252f 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts @@ -1,16 +1,16 @@ import { + Address, Block, BlockTag, - CachedReadContract, + ContractEvent, ContractGetEventsOptions, ContractReadOptions, ContractWriteOptions, - Event, -} from "@delvtech/evm-client"; -import { Address } from "abitype"; + MergeKeys, + ReadContract, +} from "@delvtech/drift"; import { assertNever } from "src/base/assertNever"; import { MAX_UINT256, SECONDS_PER_YEAR } from "src/base/constants"; -import { MergeKeys } from "src/base/types"; import { getCheckpointTime } from "src/checkpoint/getCheckpointTime"; import { Checkpoint, @@ -18,9 +18,8 @@ import { GetCheckpointParams, GetCheckpointTimeParams, } from "src/checkpoint/types"; +import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; -import { getBlockFromReadOptions } from "src/evm-client/utils/getBlockFromReadOptions"; -import { getBlockOrThrow } from "src/evm-client/utils/getBlockOrThrow"; import { fixed } from "src/fixed-point"; import { HyperdriveAbi, hyperdriveAbi } from "src/hyperdrive/base/abi"; import { MAX_ITERATIONS, NULL_BYTES } from "src/hyperdrive/constants"; @@ -47,7 +46,7 @@ export interface ReadHyperdriveOptions extends ReadContractModelOptions {} export class ReadHyperdrive extends ReadModel { readonly address: Address; - readonly contract: CachedReadContract; + readonly contract: ReadContract; /** * @hidden @@ -56,16 +55,17 @@ export class ReadHyperdrive extends ReadModel { debugName = "Hyperdrive", address, cache, - namespace, + cacheNamespace, + drift, ...modelOptions }: ReadHyperdriveOptions) { - super({ debugName, ...modelOptions }); + super({ debugName, drift: drift, ...modelOptions }); this.address = address; - this.contract = this.contractFactory({ + this.contract = this.drift.contract({ abi: hyperdriveAbi, address, cache, - namespace, + cacheNamespace, }); } @@ -105,14 +105,13 @@ export class ReadHyperdrive extends ReadModel { const address = await this.contract.read("baseToken"); return address === ReadEth.address ? new ReadEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }) : new ReadErc20({ address, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } @@ -127,9 +126,9 @@ export class ReadHyperdrive extends ReadModel { const address = await this.contract.read("vaultSharesToken"); return new ReadErc20({ address, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } @@ -188,7 +187,7 @@ export class ReadHyperdrive extends ReadModel { } const blockNumber = events[0].blockNumber; - return getBlockOrThrow(this.network, { blockNumber }); + return getBlockOrThrow(this.drift, { blockNumber }); } /** @@ -210,7 +209,7 @@ export class ReadHyperdrive extends ReadModel { blockRange: bigint; options?: ContractReadOptions; }): Promise { - const currentBlock = await getBlockOrThrow(this.network, options); + const currentBlock = await getBlockOrThrow(this.drift, options); // Clamp the start block to the pool's initialization block if the // blockRange is too big. let startBlockNumber = currentBlock.blockNumber! - blockRange; @@ -222,13 +221,13 @@ export class ReadHyperdrive extends ReadModel { // NOTE: Cloudchain will throw an error if the block number is too far back // in history. - const startBlock = await getBlockOrThrow(this.network, { + const startBlock = await getBlockOrThrow(this.drift, { blockNumber: startBlockNumber, }); // Get the info from fromBlock to get the starting vault share price const { vaultSharePrice: startVaultSharePrice } = await this.getPoolInfo({ - blockNumber: startBlockNumber, + block: startBlockNumber, }); // Get the current vaultSharePrice from the latest pool info @@ -273,7 +272,7 @@ export class ReadHyperdrive extends ReadModel { if (timestamp === undefined) { // Default to the block from read options const getBlockOptions = blockNumber ? { blockNumber } : options; - const block = await getBlockOrThrow(this.network, getBlockOptions); + const block = await getBlockOrThrow(this.drift, getBlockOptions); timestamp = block.timestamp; } @@ -625,9 +624,12 @@ export class ReadHyperdrive extends ReadModel { ContractGetEventsOptions & ContractGetEventsOptions, ): Promise<{ - addLiquidity: Event[]; - removeLiquidity: Event[]; - redeemWithdrawalShares: Event[]; + addLiquidity: ContractEvent[]; + removeLiquidity: ContractEvent[]; + redeemWithdrawalShares: ContractEvent< + HyperdriveAbi, + "RedeemWithdrawalShares" + >[]; }> { const addLiquidityEvents = await this.contract.getEvents( "AddLiquidity", @@ -674,14 +676,14 @@ export class ReadHyperdrive extends ReadModel { } // Attempt to fetch the blocks first to fail early if the block is not found - const currentBlock = await getBlockOrThrow(this.network, options); - const startBlock = await getBlockOrThrow(this.network, { + const currentBlock = await getBlockOrThrow(this.drift, options); + const startBlock = await getBlockOrThrow(this.drift, { blockNumber: fromBlock, }); // Get the info from fromBlock to get the starting lp share price const { lpSharePrice: startLpSharePrice } = await this.getPoolInfo({ - blockNumber: fromBlock, + block: fromBlock, }); // Get the current lpSharePrice from the latest pool info @@ -712,8 +714,8 @@ export class ReadHyperdrive extends ReadModel { openLongEvents, closeLongEvents, }: { - openLongEvents: Event[]; - closeLongEvents: Event[]; + openLongEvents: ContractEvent[]; + closeLongEvents: ContractEvent[]; }): Long[] { // Put open and long events in block order. We spread openLongEvents first // since you have to open a long before you can close one. @@ -778,15 +780,13 @@ export class ReadHyperdrive extends ReadModel { account: `0x${string}`; options?: ContractReadOptions; }): Promise { - const toBlock = getBlockFromReadOptions(options); - const transfersReceived = await this.contract.getEvents("TransferSingle", { filter: { to: account }, - toBlock, + toBlock: options?.block, }); const transfersSent = await this.contract.getEvents("TransferSingle", { filter: { from: account }, - toBlock, + toBlock: options?.block, }); const longsReceived = transfersReceived.filter((event) => { @@ -919,15 +919,13 @@ export class ReadHyperdrive extends ReadModel { account: `0x${string}`; options?: ContractReadOptions; }): Promise { - const toBlock = getBlockFromReadOptions(options); - const openLongEvents = await this.contract.getEvents("OpenLong", { filter: { trader: account }, - toBlock, + toBlock: options?.block, }); const closeLongEvents = await this.contract.getEvents("CloseLong", { filter: { trader: account }, - toBlock, + toBlock: options?.block, }); return this._calcOpenLongs({ @@ -949,22 +947,20 @@ export class ReadHyperdrive extends ReadModel { account: `0x${string}`; options?: ContractReadOptions; }): Promise { - const toBlock = getBlockFromReadOptions(options); - const { checkpointDuration, positionDuration } = await this.getPoolConfig(options); const openShortEvents = await this.contract.getEvents("OpenShort", { filter: { trader: account }, - toBlock, + toBlock: options?.block, }); const closeShortEvents = await this.contract.getEvents("CloseShort", { filter: { trader: account }, - toBlock, + toBlock: options?.block, }); return this._calcOpenShorts({ - hyperdriveAddress: this.contract.address, + hyperdriveAddress: this.address, checkpointDuration, positionDuration, openShortEvents, @@ -982,8 +978,8 @@ export class ReadHyperdrive extends ReadModel { hyperdriveAddress: Address; checkpointDuration: bigint; positionDuration: bigint; - openShortEvents: Event[]; - closeShortEvents: Event[]; + openShortEvents: ContractEvent[]; + closeShortEvents: ContractEvent[]; }): Promise { // Put open and short events in block order. We spread openShortEvents first // since you have to open a short before you can close one. @@ -995,7 +991,7 @@ export class ReadHyperdrive extends ReadModel { for (const event of orderedShortEvents) { const assetId = event.args.assetId.toString(); - const { timestamp } = await getBlockOrThrow(this.network, { + const { timestamp } = await getBlockOrThrow(this.drift, { blockNumber: event.blockNumber, }); @@ -1073,11 +1069,9 @@ export class ReadHyperdrive extends ReadModel { account: `0x${string}`; options?: ContractReadOptions; }): Promise { - const toBlock = getBlockFromReadOptions(options); - const closedLongs = await this.contract.getEvents("CloseLong", { filter: { trader: account }, - toBlock, + toBlock: options?.block, }); const closedLongsList: ClosedLong[] = await Promise.all( @@ -1095,7 +1089,7 @@ export class ReadHyperdrive extends ReadModel { baseAmountPaid: 0n, // TODO: Remove this field, this is copy/paste from @hyperdrive/queries maturity: event.args.maturityTime, closedTimestamp: ( - await getBlockOrThrow(this.network, { + await getBlockOrThrow(this.drift, { blockNumber: event.blockNumber, }) ).timestamp, @@ -1115,17 +1109,16 @@ export class ReadHyperdrive extends ReadModel { account: `0x${string}`; options?: ContractReadOptions; }): Promise { - const toBlock = getBlockFromReadOptions(options); const closedShorts = await this.contract.getEvents("CloseShort", { filter: { trader: account }, - toBlock, + toBlock: options?.block, }); const { checkpointDuration } = await this.getPoolConfig(options); const closedShortsList: ClosedShort[] = await Promise.all( closedShorts.map(async (event) => { const { assetId, maturityTime } = event.args; - const { timestamp } = await getBlockOrThrow(this.network, { + const { timestamp } = await getBlockOrThrow(this.drift, { blockNumber: event.blockNumber, }); @@ -1134,7 +1127,7 @@ export class ReadHyperdrive extends ReadModel { : fixed(event.args.amount).mul(event.args.vaultSharePrice).bigint; return { - hyperdriveAddress: this.contract.address, + hyperdriveAddress: this.address, assetId, bondAmount: event.args.bondAmount, baseAmountReceived: baseAmount, @@ -1277,16 +1270,15 @@ export class ReadHyperdrive extends ReadModel { baseValue: bigint; sharesValue: bigint; }> { - const toBlock = getBlockFromReadOptions(options); const addLiquidityEvents = await this.contract.getEvents("AddLiquidity", { filter: { provider: account }, - toBlock, + toBlock: options?.block, }); const removeLiquidityEvents = await this.contract.getEvents( "RemoveLiquidity", { filter: { provider: account }, - toBlock, + toBlock: options?.block, }, ); @@ -1352,8 +1344,11 @@ export class ReadHyperdrive extends ReadModel { addLiquidityEvents, removeLiquidityEvents, }: { - addLiquidityEvents: Event[]; - removeLiquidityEvents: Event[]; + addLiquidityEvents: ContractEvent[]; + removeLiquidityEvents: ContractEvent< + typeof hyperdriveAbi, + "RemoveLiquidity" + >[]; }) { const combinedEventsInOrder = [ ...addLiquidityEvents, @@ -1414,7 +1409,7 @@ export class ReadHyperdrive extends ReadModel { "RemoveLiquidity", { filter: { provider: account }, - toBlock: getBlockFromReadOptions(options), + toBlock: options?.block, }, ); return Promise.all( @@ -1437,7 +1432,7 @@ export class ReadHyperdrive extends ReadModel { withdrawalShareAmount, lpSharePrice, closedTimestamp: ( - await getBlockOrThrow(this.network, { + await getBlockOrThrow(this.drift, { blockNumber, }) ).timestamp, @@ -1477,7 +1472,7 @@ export class ReadHyperdrive extends ReadModel { "RedeemWithdrawalShares", { filter: { provider: account }, - toBlock: getBlockFromReadOptions(options), + toBlock: options?.block, }, ); @@ -1489,11 +1484,11 @@ export class ReadHyperdrive extends ReadModel { : fixed(amount).mul(vaultSharePrice).bigint; return { - hyperdriveAddress: this.contract.address, + hyperdriveAddress: this.address, withdrawalShareAmount, baseAmount, redeemedTimestamp: ( - await getBlockOrThrow(this.network, { blockNumber }) + await getBlockOrThrow(this.drift, { blockNumber }) ).timestamp, }; }), diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts index f232a12f1..9dbb63aad 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -16,6 +16,9 @@ import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; type ReadWriteParams = { args: Args; options?: ContractWriteOptions; + /** + * @deprecated Use `options.onMined` instead. + */ onTransactionCompleted?: (hash: `0x${string}`) => void; }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts index 2444d3681..4c03e7e9c 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { fixed } from "src/fixed-point"; import { diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts index 379eaea11..0bc6261bd 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadHyperdrive, @@ -38,9 +38,9 @@ export function readErc4626HyperdriveMixin< return new ReadErc4626({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts index bc06ca533..ba9c38c47 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts @@ -1,11 +1,11 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; -import { ReadHyperdriveOptions } from "src/exports"; +import { ReadHyperdriveOptions } from "src/hyperdrive/base/ReadHyperdrive"; import { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; import { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; export class ReadMockErc4626Hyperdrive extends readMockErc4626HyperdriveMixin( - ReadErc4626Hyperdrive + ReadErc4626Hyperdrive, ) {} /** @@ -19,7 +19,7 @@ export interface ReadMockErc4626HyperdriveMixin { * @internal */ export function readMockErc4626HyperdriveMixin< - T extends Constructor + T extends Constructor, >(Base: T): Constructor & T { return class extends Base { constructor(...[options]: any[]) { @@ -28,15 +28,15 @@ export function readMockErc4626HyperdriveMixin< } async getSharesToken( - options?: ContractReadOptions + options?: ContractReadOptions, ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadMockErc4626({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts index 4370a7180..0db4b1511 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { @@ -8,7 +8,7 @@ import { import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; export class ReadWriteErc4626Hyperdrive extends readWriteErc4626HyperdriveMixin( - ReadWriteHyperdrive + ReadWriteHyperdrive, ) {} export interface ReadWriteErc4626HyperdriveMixin @@ -20,19 +20,19 @@ export interface ReadWriteErc4626HyperdriveMixin * @internal */ export function readWriteErc4626HyperdriveMixin< - T extends Constructor + T extends Constructor, >(Base: T): Constructor & T { return class extends readErc4626HyperdriveMixin(Base) { async getSharesToken( - options?: ContractReadOptions + options?: ContractReadOptions, ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteErc4626({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts index 9c497d0bf..1bbd691d3 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; import { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; @@ -8,7 +8,7 @@ import { } from "./ReadMockErc4626Hyperdrive"; export class ReadWriteMockErc4626Hyperdrive extends readWriteMockErc4626HyperdriveMixin( - ReadWriteErc4626Hyperdrive + ReadWriteErc4626Hyperdrive, ) {} export interface ReadWriteMockErc4626HyperdriveMixin @@ -20,20 +20,20 @@ export interface ReadWriteMockErc4626HyperdriveMixin * @internal */ export function readWriteMockErc4626HyperdriveMixin< - T extends Constructor + T extends Constructor, >(Base: T): Constructor & T { // return class extends readErc4626HyperdriveMixin(Base) { return class extends readMockErc4626HyperdriveMixin(Base) { async getSharesToken( - options?: ContractReadOptions + options?: ContractReadOptions, ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteMockErc4626({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts index f279c55a6..adcf6a7fa 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions, ReadContract } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { @@ -16,7 +16,7 @@ export class ReadEzEthHyperdrive extends readEzEthHyperdriveMixin( * @internal */ export interface ReadEzEthHyperdriveMixin { - ezEthHyperdriveContract: CachedReadContract; + ezEthHyperdriveContract: Contract; /** * Get a model of ETH, the base token for this Hyperdrive instance. @@ -36,29 +36,28 @@ export function readEzEthHyperdriveMixin>( Base: T, ): Constructor & T { return class extends Base { - ezEthHyperdriveContract: CachedReadContract; + ezEthHyperdriveContract: ReadContract; constructor(...[options]: any[]) { const { debugName = "EzETH Hyperdrive", address, cache, - namespace, + cacheNamespace, ...modelOptions } = options as ConstructorParameters[0]; - super({ debugName, address, cache, namespace, ...modelOptions }); - this.ezEthHyperdriveContract = this.contractFactory({ + super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + this.ezEthHyperdriveContract = this.drift.contract({ abi: ezEthHyperdriveAbi, address, cache, - namespace, + cacheNamespace, }); } async getBaseToken(): Promise { return new ReadEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } @@ -66,9 +65,9 @@ export function readEzEthHyperdriveMixin>( const { vaultSharesToken } = await this.getPoolConfig(); return new ReadErc20({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts index 556ce4d7b..9db9b52dc 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts @@ -1,7 +1,4 @@ -import { - CachedReadWriteContract, - ContractReadOptions, -} from "@delvtech/evm-client"; +import { ContractReadOptions, ReadWriteContract } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { @@ -13,12 +10,12 @@ import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; export class ReadWriteEzEthHyperdrive extends readWriteEzEthHyperdriveMixin( - ReadWriteHyperdrive + ReadWriteHyperdrive, ) {} export interface ReadWriteEzEthHyperdriveMixin extends ReadEzEthHyperdriveMixin { - ezEthHyperdriveContract: CachedReadWriteContract; + ezEthHyperdriveContract: ReadWriteContract; getBaseToken(options?: ContractReadOptions): Promise; getSharesToken(options?: ContractReadOptions): Promise; } @@ -27,27 +24,26 @@ export interface ReadWriteEzEthHyperdriveMixin * @internal */ export function readWriteEzEthHyperdriveMixin< - T extends Constructor + T extends Constructor, >(Base: T): Constructor & T { return class extends readEzEthHyperdriveMixin(Base) { - declare ezEthHyperdriveContract: CachedReadWriteContract; + declare ezEthHyperdriveContract: ReadWriteContract; async getBaseToken(): Promise { return new ReadWriteEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } async getSharesToken( - options?: ContractReadOptions + options?: ContractReadOptions, ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteErc20({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts index 0bf5eec48..118b0332e 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadHyperdrive, @@ -41,8 +41,7 @@ export function readLsEthHyperdriveMixin>( async getBaseToken(): Promise { return new ReadEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } @@ -51,9 +50,9 @@ export function readLsEthHyperdriveMixin>( return new ReadLsEth({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts index 9e0a15fbb..ddca694a7 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { @@ -9,7 +9,7 @@ import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; import { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; export class ReadWriteLsEthHyperdrive extends readWriteLsEthHyperdriveMixin( - ReadWriteHyperdrive + ReadWriteHyperdrive, ) {} export interface ReadWriteLsEthHyperdriveMixin @@ -19,25 +19,24 @@ export interface ReadWriteLsEthHyperdriveMixin } export function readWriteLsEthHyperdriveMixin< - T extends Constructor + T extends Constructor, >(Base: T): Constructor & T { return class extends readLsEthHyperdriveMixin(Base) { async getSharesToken( - options?: ContractReadOptions + options?: ContractReadOptions, ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteLsEth({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } async getBaseToken(): Promise { return new ReadWriteEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts index f463a34e0..2352e6369 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { fixed } from "@delvtech/fixed-point-wasm"; import { Constructor } from "src/base/types"; import { @@ -42,8 +42,7 @@ export function readREthHyperdriveMixin>( async getBaseToken(): Promise { return new ReadEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } @@ -51,9 +50,9 @@ export function readREthHyperdriveMixin>( const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadREth({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts index aac239e18..0fa108bf3 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { readREthHyperdriveMixin } from "src/hyperdrive/reth/ReadREthHyperdrive"; @@ -23,8 +23,7 @@ export function readWriteREthHyperdriveMixin< return class extends readREthHyperdriveMixin(Base) { async getBaseToken(): Promise { return new ReadWriteEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } @@ -34,9 +33,9 @@ export function readWriteREthHyperdriveMixin< const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteREth({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts index 593828945..ede875424 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { fixed } from "src/fixed-point"; import { @@ -63,8 +63,7 @@ export function readStEthHyperdriveMixin>( async getBaseToken(): Promise { return new ReadEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } @@ -72,9 +71,9 @@ export function readStEthHyperdriveMixin>( const { vaultSharesToken } = await this.getPoolConfig(); return new ReadStEth({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts index 0d39e3ce6..17a0e466d 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts @@ -1,9 +1,5 @@ -import { - CachedReadWriteContract, - ContractReadOptions, -} from "@delvtech/evm-client"; -import { Constructor, Override } from "src/base/types"; -import { HyperdriveAbi } from "src/hyperdrive/base/abi"; +import { ContractReadOptions, ReplaceProps } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive, ReadWriteHyperdriveOptions, @@ -17,41 +13,40 @@ import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; import { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; export class ReadWriteStEthHyperdrive extends readWriteStEthHyperdriveMixin( - ReadWriteHyperdrive + ReadWriteHyperdrive, ) {} export interface ReadWriteStEthHyperdriveMixin extends ReadStEthHyperdriveMixin { - stEthHyperdriveContract: CachedReadWriteContract; getBaseToken(options?: ContractReadOptions): Promise; getSharesToken(options?: ContractReadOptions): Promise; } export interface ReadWriteStEthHyperdriveOptions - extends Override {} + extends ReplaceProps< + ReadWriteHyperdriveOptions, + ReadStEthHyperdriveOptions + > {} export function readWriteStEthHyperdriveMixin< - T extends Constructor + T extends Constructor, >(Base: T): Constructor & T { return class extends readStEthHyperdriveMixin(Base) { - declare stEthHyperdriveContract: CachedReadWriteContract; - async getBaseToken(): Promise { return new ReadWriteEth({ - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, }); } async getSharesToken( - options?: ContractReadOptions + options?: ContractReadOptions, ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteStEth({ address: vaultSharesToken, - contractFactory: this.contractFactory, - namespace: this.contract.namespace, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }); } }; diff --git a/packages/hyperdrive-js-core/src/model/ReadModel.ts b/packages/hyperdrive-js-core/src/model/ReadModel.ts index 81084113d..52e59ee67 100644 --- a/packages/hyperdrive-js-core/src/model/ReadModel.ts +++ b/packages/hyperdrive-js-core/src/model/ReadModel.ts @@ -1,16 +1,10 @@ -import { Network } from "@delvtech/evm-client"; -import { Prettify } from "src/base/types"; -import { - ContractFactoryOptions, - ReadContractFactory, -} from "src/evm-client/contractFactory"; +import { ContractParams, Drift } from "@delvtech/drift"; /** * The base options required for all read models. */ export interface ReadModelOptions { - contractFactory: ReadContractFactory; - network: Network; + drift: Drift; /** * An arbitrary name for the instance. This is for convenience only (e.g., for @@ -29,25 +23,18 @@ export interface ReadModelOptions { * A base class for read-only models. */ export class ReadModel { + drift: Drift; debugName: string; - network: Network; - contractFactory: ReadContractFactory; - constructor({ - debugName, - network, - contractFactory, - earliestBlock, - }: ReadModelOptions) { + constructor({ debugName, drift, earliestBlock }: ReadModelOptions) { this.debugName = debugName ?? this.constructor.name; - this.network = network; - this.contractFactory = contractFactory; + this.drift = drift; // Override the contract factory to ensure that events are fetched from the // earliest block if necessary. if (earliestBlock) { - this.contractFactory = (options) => { - const contract = contractFactory(options); + this.drift.contract = (options) => { + const contract = this.drift.contract(options); // Override the getEvents method const originalGetEvents = contract.getEvents; @@ -63,7 +50,7 @@ export class ReadModel { return originalGetEvents(eventName, _options); }; - return contract; + return contract as any; }; } } @@ -73,7 +60,5 @@ export class ReadModel { * The options required to create a read model that represents a specific * contract. */ -export type ReadContractModelOptions = Prettify< - // The abi is omitted because it's assumed the model will import its own ABI - ReadModelOptions & Omit ->; +export type ReadContractModelOptions = ReadModelOptions & + Omit; diff --git a/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts b/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts index 8647d4221..981d37e37 100644 --- a/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts +++ b/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts @@ -1,22 +1,26 @@ -import { Prettify } from "src/base/types"; import { - ContractFactoryOptions, - ReadWriteContractFactory, -} from "src/evm-client/contractFactory"; + ContractParams, + Drift, + ReadWriteAdapter, + ReplaceProps, +} from "@delvtech/drift"; import { ReadModel, ReadModelOptions } from "src/model/ReadModel"; /** * The base options required for all read-write models. */ -export interface ReadWriteModelOptions extends ReadModelOptions { - contractFactory: ReadWriteContractFactory; -} +export type ReadWriteModelOptions = ReplaceProps< + ReadModelOptions, + { + drift: Drift; + } +>; /** * A base class for read-write models. */ export class ReadWriteModel extends ReadModel { - declare contractFactory: ReadWriteContractFactory; + declare drift: Drift; constructor(options: ReadWriteModelOptions) { super(options); @@ -27,7 +31,5 @@ export class ReadWriteModel extends ReadModel { * The options required to create a read-write model that represents a specific * contract. */ -export type ReadWriteContractModelOptions = Prettify< - // The abi is omitted because it's assumed the model will import its own ABI - ReadWriteModelOptions & Omit ->; +export type ReadWriteContractModelOptions = ReadWriteModelOptions & + Omit; diff --git a/packages/hyperdrive-js-core/src/pool/types.ts b/packages/hyperdrive-js-core/src/pool/types.ts index b3cf3623d..36c6d73f1 100644 --- a/packages/hyperdrive-js-core/src/pool/types.ts +++ b/packages/hyperdrive-js-core/src/pool/types.ts @@ -1,4 +1,4 @@ -import { FunctionReturn } from "@delvtech/evm-client"; +import { FunctionReturn } from "@delvtech/drift"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; export type PoolConfig = FunctionReturn; diff --git a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts index b5ff6db2c..d5abb22a2 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; import { ReadFactory } from "src/factory/ReadFactory"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; @@ -13,22 +13,22 @@ export interface ReadRegistryOptions extends ReadContractModelOptions {} export class ReadRegistry extends ReadModel { address: Address; - contract: CachedReadContract; + contract: Contract; constructor({ debugName = "Hyperdrive Registry", address, cache, - namespace, + cacheNamespace, ...modelOptions }: ReadRegistryOptions) { super({ debugName, ...modelOptions }); this.address = address; - this.contract = this.contractFactory({ + this.contract = this.drift.contract({ abi: registryAbi, address, cache, - namespace, + cacheNamespace, }); } @@ -41,8 +41,9 @@ export class ReadRegistry extends ReadModel { (address) => new ReadFactory({ address, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), ); } @@ -119,8 +120,9 @@ export class ReadRegistry extends ReadModel { (address) => new ReadHyperdrive({ address, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), ); } @@ -167,8 +169,9 @@ export class ReadRegistry extends ReadModel { data: `0x${data.toString(16)}`, factory: new ReadFactory({ address: factory, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), }; } @@ -192,8 +195,9 @@ export class ReadRegistry extends ReadModel { data: `0x${data.toString(16)}`, factory: new ReadFactory({ address: factory, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), })); } diff --git a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts index a8cfad672..0623e87a1 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts @@ -1,10 +1,11 @@ import { - CachedReadWriteContract, ContractReadOptions, -} from "@delvtech/evm-client"; + Drift, + ReadWriteAdapter, + ReadWriteContract, + ReplaceProps, +} from "@delvtech/drift"; import { Address } from "abitype"; -import { Override } from "src/base/types"; -import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; @@ -13,11 +14,11 @@ import { RegistryAbi } from "src/registry/abi"; import { ReadWriteInstanceInfoWithMetadata } from "src/registry/types"; export interface ReadWriteRegistryOptions - extends Override {} + extends ReplaceProps {} export class ReadWriteRegistry extends ReadRegistry { - declare contract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; + declare drift: Drift; + declare contract: ReadWriteContract; constructor(options: ReadWriteRegistryOptions) { super(options); @@ -34,8 +35,9 @@ export class ReadWriteRegistry extends ReadRegistry { (address) => new ReadWriteFactory({ address, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), ); } @@ -65,8 +67,9 @@ export class ReadWriteRegistry extends ReadRegistry { (address) => new ReadWriteHyperdrive({ address, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), ); } @@ -87,8 +90,9 @@ export class ReadWriteRegistry extends ReadRegistry { data: `0x${data.toString(16)}`, factory: new ReadWriteFactory({ address: factory, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), }; } @@ -112,8 +116,9 @@ export class ReadWriteRegistry extends ReadRegistry { data: `0x${data.toString(16)}`, factory: new ReadWriteFactory({ address: factory, - contractFactory: this.contractFactory, - network: this.network, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, }), })); } diff --git a/packages/hyperdrive-js-core/src/registry/types.ts b/packages/hyperdrive-js-core/src/registry/types.ts index 61eaf513e..987bab0c9 100644 --- a/packages/hyperdrive-js-core/src/registry/types.ts +++ b/packages/hyperdrive-js-core/src/registry/types.ts @@ -1,5 +1,4 @@ -import { FunctionReturn } from "@delvtech/evm-client"; -import { Override } from "src/base/types"; +import { FunctionReturn, ReplaceProps } from "@delvtech/drift"; import { ReadFactory } from "src/factory/ReadFactory"; import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; import { RegistryAbi } from "src/registry/abi"; @@ -8,7 +7,7 @@ import { RegistryAbi } from "src/registry/abi"; * The info collected for each Hyperdrive factory along with the metadata * associated with each instance. */ -export type FactoryInfoWithMetadata = Override< +export type FactoryInfoWithMetadata = ReplaceProps< FunctionReturn, { /** @@ -23,7 +22,7 @@ export type FactoryInfoWithMetadata = Override< * The info related to each Hyperdrive instance along with the metadata * associated with each instance. */ -export type ReadInstanceInfoWithMetadata = Override< +export type ReadInstanceInfoWithMetadata = ReplaceProps< FunctionReturn, { /** @@ -39,7 +38,7 @@ export type ReadInstanceInfoWithMetadata = Override< >; /** {@inheritDoc ReadInstanceInfoWithMetadata} */ -export type ReadWriteInstanceInfoWithMetadata = Override< +export type ReadWriteInstanceInfoWithMetadata = ReplaceProps< ReadInstanceInfoWithMetadata, { /** {@inheritDoc ReadInstanceInfoWithMetadata.factory} */ diff --git a/packages/hyperdrive-js-core/src/token/ReadToken.ts b/packages/hyperdrive-js-core/src/token/ReadToken.ts index 2b313b6e6..03d6c31e8 100644 --- a/packages/hyperdrive-js-core/src/token/ReadToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadToken.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { ReadModel } from "src/model/ReadModel"; export interface ReadToken extends ReadModel { diff --git a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts index ebd3a1f2c..8900ed700 100644 --- a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts @@ -1,11 +1,9 @@ -import { ContractWriteOptions } from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; +import { ContractWriteOptions, ReplaceProps } from "@delvtech/drift"; import { ReadWriteModel } from "src/model/ReadWriteModel"; import { ReadToken } from "src/token/ReadToken"; -export interface ReadWriteToken extends ReadToken, ReadWriteModel { - contractFactory: ReadWriteContractFactory; - +export interface ReadWriteToken + extends ReplaceProps { /** * Give a spending allowance to a given spender. * @param spender - The address of the spender. diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts index 7d2e94769..85be0761a 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts @@ -1,4 +1,5 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Address } from "abitype"; import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; import { erc20Abi, Erc20Abi } from "src/token/erc20/abi"; import { ReadToken } from "src/token/ReadToken"; @@ -6,29 +7,29 @@ import { ReadToken } from "src/token/ReadToken"; export interface ReadErc20Options extends ReadContractModelOptions {} export class ReadErc20 extends ReadModel implements ReadToken { - contract: CachedReadContract; + contract: Contract; constructor({ debugName = "ERC-20 Token", address, cache, - namespace, + cacheNamespace, ...modelOptions }: ReadErc20Options) { super({ debugName, ...modelOptions }); - this.contract = this.contractFactory({ + this.contract = this.drift.contract({ abi: erc20Abi, address, cache, - namespace, + cacheNamespace, }); } - get address(): `0x${string}` { - return this.contract.address; + get address(): Address { + return this.contract.address as Address; } - get namespace(): string | undefined { - return this.contract.namespace; + get namespace(): PropertyKey | undefined { + return this.contract.cacheNamespace; } getName(): Promise { diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts index 90fee23dc..86b81896c 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts @@ -1,9 +1,10 @@ import { - CachedReadWriteContract, ContractWriteOptions, -} from "@delvtech/evm-client"; -import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; -import { syncCacheWithTransaction } from "src/evm-client/syncCacheWithTransaction"; + Drift, + ReadWriteAdapter, + ReadWriteContract, +} from "@delvtech/drift"; +import { syncCacheWithTransaction } from "src/drift/syncCacheWithTransaction"; import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadErc20 } from "src/token/erc20/ReadErc20"; @@ -12,8 +13,8 @@ import { Erc20Abi } from "src/token/erc20/abi"; export interface ReadWriteErc20Options extends ReadWriteContractModelOptions {} export class ReadWriteErc20 extends ReadErc20 implements ReadWriteToken { - declare contract: CachedReadWriteContract; - declare contractFactory: ReadWriteContractFactory; + declare drift: Drift; + declare contract: ReadWriteContract; constructor(options: ReadWriteErc20Options) { super(options); diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts index 935e5296f..d2f6277ed 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { Erc4626Abi, erc4626Abi } from "src/token/erc4626/abi"; @@ -9,7 +9,7 @@ export class ReadErc4626 extends readErc4626Mixin(ReadErc20) {} * @internal */ export interface ReadErc4626Mixin { - erc4626Contract: CachedReadContract; + erc4626Contract: Contract; /** * Get the total supply of assets in the vault. @@ -46,22 +46,22 @@ export function readErc4626Mixin>( Base: T, ): Constructor & T { return class extends Base implements ReadErc4626Mixin { - erc4626Contract: CachedReadContract; + erc4626Contract: Contract; constructor(...[options]: any[]) { const { debugName = "ERC-4626 Tokenized Vault", address, cache, - namespace, + cacheNamespace, ...modelOptions } = options as ReadErc20Options; - super({ debugName, address, cache, namespace, ...modelOptions }); - this.erc4626Contract = this.contractFactory({ + super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + this.erc4626Contract = this.drift.contract({ abi: erc4626Abi, address, cache, - namespace, + cacheNamespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts index 17809c137..85206a377 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { mockErc4626Abi, MockErc4626Abi } from "src/token/erc4626/abi"; import { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; @@ -9,7 +9,7 @@ export class ReadMockErc4626 extends readMockErc4626Mixin(ReadErc4626) {} * @internal */ export interface ReadMockErc4626Mixin { - mockErc4626Contract: CachedReadContract; + mockErc4626Contract: Contract; /** * Get the rate of the vault. @@ -24,22 +24,22 @@ export function readMockErc4626Mixin>( BaseReadErc4626: T, ): Constructor & T { return class extends BaseReadErc4626 implements ReadMockErc4626Mixin { - mockErc4626Contract: CachedReadContract; + mockErc4626Contract: Contract; constructor(...[options]: any[]) { const { debugName = "Mock ERC-4626 Tokenized Vault", address, cache, - namespace, + cacheNamespace, ...modelOptions } = options as ConstructorParameters[0]; - super({ debugName, address, cache, namespace, ...modelOptions }); - this.mockErc4626Contract = this.contractFactory({ + super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + this.mockErc4626Contract = this.drift.contract({ abi: mockErc4626Abi, address, cache, - namespace, + cacheNamespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts index 5762a88b9..8521db317 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts @@ -1,8 +1,8 @@ -import { CachedReadWriteContract } from "@delvtech/evm-client"; +import { ReadWriteContract } from "@delvtech/drift"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { readErc4626Mixin } from "src/token/erc4626/ReadErc4626"; import { Erc4626Abi } from "src/token/erc4626/abi"; export class ReadWriteErc4626 extends readErc4626Mixin(ReadWriteErc20) { - declare erc4626Contract: CachedReadWriteContract; + declare erc4626Contract: ReadWriteContract; } diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts index 86dca9f4e..4c04a4ae0 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts @@ -1,7 +1,4 @@ -import { - CachedReadWriteContract, - ContractWriteOptions, -} from "@delvtech/evm-client"; +import { ContractWriteOptions, ReadWriteContract } from "@delvtech/drift"; import { MockErc4626Abi } from "src/token/erc4626/abi"; import { readMockErc4626Mixin } from "src/token/erc4626/ReadMockErc4626"; import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; @@ -9,7 +6,7 @@ import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; export class ReadWriteMockErc4626 extends readMockErc4626Mixin( ReadWriteErc4626, ) { - declare mockErc4626Contract: CachedReadWriteContract; + declare mockErc4626Contract: ReadWriteContract; /** * Mint shares. diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts index 4fbc627d7..8210dab29 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/evm-client"; +import { ContractReadOptions } from "@delvtech/drift"; import { ReadModel, ReadModelOptions } from "src/model/ReadModel"; import { ReadToken } from "src/token/ReadToken"; @@ -42,6 +42,9 @@ export class ReadEth extends ReadModel implements ReadToken { account: `0x${string}`; options?: ContractReadOptions; }): Promise { - return this.network.getBalance(account, options); + return this.drift.getBalance({ + address: account, + ...options, + }); } } diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts index f7f26a6f7..a7514179f 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts @@ -1,5 +1,5 @@ +import { Drift, ReadWriteAdapter } from "@delvtech/drift"; import { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; -import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; import { ReadWriteModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadEth } from "src/token/eth/ReadEth"; @@ -7,7 +7,7 @@ import { ReadEth } from "src/token/eth/ReadEth"; export interface ReadWriteEthOptions extends ReadWriteModelOptions {} export class ReadWriteEth extends ReadEth implements ReadWriteToken { - declare contractFactory: ReadWriteContractFactory; + declare drift: Drift; constructor(options: ReadWriteEthOptions) { super(options); diff --git a/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts b/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts index 0f9d06c05..5fd3792e3 100644 --- a/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts +++ b/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { LsEthAbi, lsEthAbi } from "src/token/lseth/abi"; @@ -9,7 +9,7 @@ export class ReadLsEth extends readLsEthMixin(ReadErc20) {} * @internal */ export interface ReadLsEthMixin { - lsEthContract: CachedReadContract; + lsEthContract: Contract; /** * Get the total supply of underlying eth in the lsEth contract. @@ -57,17 +57,17 @@ export function readLsEthMixin>( Base: T, ): Constructor & T { return class extends Base implements ReadLsEthMixin { - lsEthContract: CachedReadContract; + lsEthContract: Contract; constructor(...[options]: any[]) { - const { contractFactory, address, cache, namespace } = + const { drift, address, cache, cacheNamespace } = options as ReadErc20Options; - super({ address, contractFactory, cache, namespace }); - this.lsEthContract = contractFactory({ + super({ address, drift, cache, cacheNamespace }); + this.lsEthContract = drift.contract({ abi: lsEthAbi, address, cache, - namespace, + cacheNamespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts b/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts index 622c91bac..f1e8237b7 100644 --- a/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts +++ b/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts @@ -1,8 +1,8 @@ -import { CachedReadWriteContract } from "@delvtech/evm-client"; +import { ReadWriteContract } from "@delvtech/drift"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { readLsEthMixin } from "src/token/lseth/ReadLsEth"; import { LsEthAbi } from "src/token/lseth/abi"; export class ReadWriteLsEth extends readLsEthMixin(ReadWriteErc20) { - declare lsEthContract: CachedReadWriteContract; + declare lsEthContract: ReadWriteContract; } diff --git a/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts b/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts index 5814887bd..2bcdb7691 100644 --- a/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts +++ b/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { REthAbi, rEthAbi } from "src/token/reth/abi"; @@ -9,7 +9,7 @@ export class ReadREth extends readREthMixin(ReadErc20) {} * @internal */ export interface ReadREthMixin { - rEthContract: CachedReadContract; + rEthContract: Contract; /** * Get the total supply of underlying eth in the rETH contract. @@ -57,17 +57,17 @@ export function readREthMixin>( Base: T, ): Constructor & T { return class extends Base implements ReadREthMixin { - rEthContract: CachedReadContract; + rEthContract: Contract; constructor(...[options]: any[]) { - const { contractFactory, address, cache, namespace } = + const { drift, address, cache, cacheNamespace } = options as ReadErc20Options; - super({ address, contractFactory, cache, namespace }); - this.rEthContract = contractFactory({ + super({ address, drift, cache, cacheNamespace }); + this.rEthContract = drift.contract({ abi: rEthAbi, address, cache, - namespace, + cacheNamespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts b/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts index 58dcb09b6..3b5ef80c7 100644 --- a/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts +++ b/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts @@ -1,8 +1,8 @@ -import { CachedReadWriteContract } from "@delvtech/evm-client"; +import { ReadWriteContract } from "@delvtech/drift"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { readREthMixin } from "src/token/reth/ReadREth"; import { REthAbi } from "src/token/reth/abi"; export class ReadWriteREth extends readREthMixin(ReadWriteErc20) { - declare rEthContract: CachedReadWriteContract; + declare rEthContract: ReadWriteContract; } diff --git a/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts b/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts index b3bd469ff..85e9c694d 100644 --- a/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts +++ b/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts @@ -1,4 +1,4 @@ -import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { StEthAbi, stEthAbi } from "src/token/steth/abi"; @@ -9,7 +9,7 @@ export class ReadStEth extends readStEthMixin(ReadErc20) {} * @internal */ export interface ReadStEthMixin { - stEthContract: CachedReadContract; + stEthContract: Contract; /** * Get the number of stETH shares held by an account. @@ -54,22 +54,22 @@ export function readStEthMixin>( Base: T, ): Constructor & T { return class extends Base implements ReadStEthMixin { - stEthContract: CachedReadContract; + stEthContract: Contract; constructor(...[options]: any[]) { const { debugName = "stETH Token", address, cache, - namespace, + cacheNamespace, ...modelOptions } = options as ReadErc20Options; - super({ debugName, address, cache, namespace, ...modelOptions }); - this.stEthContract = this.contractFactory({ + super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + this.stEthContract = this.drift.contract({ abi: stEthAbi, address, cache, - namespace, + cacheNamespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts b/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts index 24b25aec6..66ec0b8ff 100644 --- a/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts +++ b/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts @@ -1,8 +1,8 @@ -import { CachedReadWriteContract } from "@delvtech/evm-client"; +import { ReadWriteContract } from "@delvtech/drift"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { StEthAbi } from "src/token/steth/abi"; import { readStEthMixin } from "src/token/steth/ReadStEth"; export class ReadWriteStEth extends readStEthMixin(ReadWriteErc20) { - declare stEthContract: CachedReadWriteContract; + declare stEthContract: ReadWriteContract; } From 12ba2b07375344fad841d9ae5e73d800e53898a7 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Sat, 2 Nov 2024 21:15:30 -0500 Subject: [PATCH 05/43] Update exports --- packages/hyperdrive-js-core/package.json | 44 +---- .../src/exports/contract.ts | 5 - .../hyperdrive-js-core/src/exports/errors.ts | 3 - .../src/exports/factory/index.ts | 2 - .../src/exports/factory/model.ts | 5 - .../src/exports/factory/rest.ts | 1 - .../src/exports/hyperdrive/index.ts | 2 - .../src/exports/hyperdrive/model.ts | 36 ---- .../src/exports/hyperdrive/rest.ts | 28 --- .../hyperdrive-js-core/src/exports/index.ts | 169 +++++++++++++++++- .../hyperdrive-js-core/src/exports/model.ts | 10 -- .../src/exports/registry/index.ts | 2 - .../src/exports/registry/model.ts | 8 - .../src/exports/registry/rest.ts | 1 - .../src/exports/token/index.ts | 2 - .../src/exports/token/model.ts | 34 ---- .../src/exports/token/rest.ts | 19 -- .../hyperdrive-js-core/src/exports/utils.ts | 13 -- .../hyperdrive/model.ts => v1.0.14.ts} | 0 .../src/exports/v1.0.14/hyperdrive/index.ts | 1 - .../src/exports/v1.0.14/index.ts | 1 - packages/hyperdrive-js-core/tsup.config.ts | 41 +---- 22 files changed, 169 insertions(+), 258 deletions(-) delete mode 100644 packages/hyperdrive-js-core/src/exports/contract.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/errors.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/factory/index.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/factory/model.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/factory/rest.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/model.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/registry/index.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/registry/model.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/registry/rest.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/token/index.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/token/model.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/token/rest.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/utils.ts rename packages/hyperdrive-js-core/src/exports/{v1.0.14/hyperdrive/model.ts => v1.0.14.ts} (100%) delete mode 100644 packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts delete mode 100644 packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index ba8310505..dda1ba613 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -49,47 +49,13 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "./factory/*": { - "types": "./dist/factory/*.d.ts", - "default": "./dist/factory/*.js" - }, - "./hyperdrive/*": { - "types": "./dist/hyperdrive/*.d.ts", - "default": "./dist/hyperdrive/*.js" - }, - "./registry/*": { - "types": "./dist/registry/*.d.ts", - "default": "./dist/registry/*.js" - }, - "./token/*": { - "types": "./dist/token/*.d.ts", - "default": "./dist/token/*.js" - }, - "./contract": { - "types": "./dist/contract.d.ts", - "default": "./dist/contract.js" - }, - "./errors": { - "types": "./dist/errors.d.ts", - "default": "./dist/errors.js" - }, - "./model": { - "types": "./dist/model.d.ts", - "default": "./dist/model.js" - }, - "./utils": { - "types": "./dist/utils.d.ts", - "default": "./dist/utils.js" + "default": "./dist/index.js", + "require": "./dist/index.cjs" }, "./v1.0.14": { - "types": "./dist/v1.0.14/index.d.ts", - "default": "./dist/v1.0.14/index.js" - }, - "./v1.0.14/*": { - "types": "./dist/v1.0.14/*.d.ts", - "default": "./dist/v1.0.14/*.js" + "types": "./dist/v1.0.14.d.ts", + "default": "./dist/v1.0.14.js", + "require": "./dist/v1.0.14.cjs" }, "./package.json": "./package.json" }, diff --git a/packages/hyperdrive-js-core/src/exports/contract.ts b/packages/hyperdrive-js-core/src/exports/contract.ts deleted file mode 100644 index 0d319d3e3..000000000 --- a/packages/hyperdrive-js-core/src/exports/contract.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { - ContractFactoryOptions, - ReadContractFactory, - ReadWriteContractFactory, -} from "src/evm-client/contractFactory"; diff --git a/packages/hyperdrive-js-core/src/exports/errors.ts b/packages/hyperdrive-js-core/src/exports/errors.ts deleted file mode 100644 index d12be0f93..000000000 --- a/packages/hyperdrive-js-core/src/exports/errors.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; -export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; -export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; diff --git a/packages/hyperdrive-js-core/src/exports/factory/index.ts b/packages/hyperdrive-js-core/src/exports/factory/index.ts deleted file mode 100644 index 29cd2058f..000000000 --- a/packages/hyperdrive-js-core/src/exports/factory/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./model"; -export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/factory/model.ts b/packages/hyperdrive-js-core/src/exports/factory/model.ts deleted file mode 100644 index bdbe55aea..000000000 --- a/packages/hyperdrive-js-core/src/exports/factory/model.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { ReadFactory, type ReadFactoryOptions } from "src/factory/ReadFactory"; -export { - ReadWriteFactory, - type ReadWriteFactoryOptions, -} from "src/factory/ReadWriteFactory"; diff --git a/packages/hyperdrive-js-core/src/exports/factory/rest.ts b/packages/hyperdrive-js-core/src/exports/factory/rest.ts deleted file mode 100644 index 05e2b407a..000000000 --- a/packages/hyperdrive-js-core/src/exports/factory/rest.ts +++ /dev/null @@ -1 +0,0 @@ -export { factoryAbi, type FactoryAbi } from "src/factory/abi"; diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts deleted file mode 100644 index 29cd2058f..000000000 --- a/packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./model"; -export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts deleted file mode 100644 index 57bb07332..000000000 --- a/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts +++ /dev/null @@ -1,36 +0,0 @@ -export { - ReadHyperdrive, - type ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; -export { - ReadWriteHyperdrive, - type ReadWriteHyperdriveOptions, -} from "src/hyperdrive/base/ReadWriteHyperdrive"; - -// erc-4626 -export { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; -export { ReadMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive"; -export { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; -export { ReadWriteMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive"; - -// ezeth -export { ReadEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; -export { ReadWriteEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive"; - -// lseth -export { ReadLsEthHyperdrive } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; -export { ReadWriteLsEthHyperdrive } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; - -// reth -export { ReadREthHyperdrive } from "src/hyperdrive/reth/ReadREthHyperdrive"; -export { ReadWriteREthHyperdrive } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; - -// steth -export { - ReadStEthHyperdrive, - type ReadStEthHyperdriveOptions, -} from "src/hyperdrive/steth/ReadStEthHyperdrive"; -export { - ReadWriteStEthHyperdrive, - type ReadWriteStEthHyperdriveOptions, -} from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts deleted file mode 100644 index 1970602a6..000000000 --- a/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts +++ /dev/null @@ -1,28 +0,0 @@ -export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/base/abi"; - -// ezeth -export { - ezEthHyperdriveAbi, - type EzEthHyperdriveAbi, -} from "src/hyperdrive/ezeth/abi"; - -// pool -export type { PoolConfig, PoolInfo } from "src/pool/types"; - -// shorts -export type { ClosedShort, OpenShort, Short } from "src/shorts/types"; - -// longs -export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; -export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; -export type { - ClosedLong, - Long, - OpenLongPositionReceived, -} from "src/longs/types"; - -// lp -export type { ClosedLpShares } from "src/lp/ClosedLpShares"; - -// withdrawal shares -export type { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; diff --git a/packages/hyperdrive-js-core/src/exports/index.ts b/packages/hyperdrive-js-core/src/exports/index.ts index 8fd78ac3a..ee3d8742c 100644 --- a/packages/hyperdrive-js-core/src/exports/index.ts +++ b/packages/hyperdrive-js-core/src/exports/index.ts @@ -1,8 +1,161 @@ -export * from "./contract"; -export * from "./errors"; -export * from "./factory"; -export * from "./hyperdrive"; -export * from "./model"; -export * from "./registry"; -export * from "./token"; -export * from "./utils"; +// Hyperdrive // + +export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/base/abi"; +export { + ReadHyperdrive, + type ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +export { + ReadWriteHyperdrive, + type ReadWriteHyperdriveOptions, +} from "src/hyperdrive/base/ReadWriteHyperdrive"; + +// erc-4626 +export { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; +export { ReadMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive"; +export { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; +export { ReadWriteMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive"; + +// ezeth +export { + ezEthHyperdriveAbi, + type EzEthHyperdriveAbi, +} from "src/hyperdrive/ezeth/abi"; +export { ReadEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; +export { ReadWriteEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive"; + +// lseth +export { ReadLsEthHyperdrive } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; +export { ReadWriteLsEthHyperdrive } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; + +// reth +export { ReadREthHyperdrive } from "src/hyperdrive/reth/ReadREthHyperdrive"; +export { ReadWriteREthHyperdrive } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; + +// steth +export { + ReadStEthHyperdrive, + type ReadStEthHyperdriveOptions, +} from "src/hyperdrive/steth/ReadStEthHyperdrive"; +export { + ReadWriteStEthHyperdrive, + type ReadWriteStEthHyperdriveOptions, +} from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; + +export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; + +// pool +export type { PoolConfig, PoolInfo } from "src/pool/types"; + +// shorts +export type { ClosedShort, OpenShort, Short } from "src/shorts/types"; + +// longs +export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; +export type { + ClosedLong, + Long, + OpenLongPositionReceived, +} from "src/longs/types"; + +// lp +export type { ClosedLpShares } from "src/lp/ClosedLpShares"; + +// withdrawal shares +export type { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; + +// Registry // + +export { registryAbi, type RegistryAbi } from "src/registry/abi"; +export { + ReadRegistry, + type ReadRegistryOptions, +} from "src/registry/ReadRegistry"; +export { + ReadWriteRegistry, + type ReadWriteRegistryOptions, +} from "src/registry/ReadWriteRegistry"; + +// Factory // + +export { factoryAbi, type FactoryAbi } from "src/factory/abi"; +export { ReadFactory, type ReadFactoryOptions } from "src/factory/ReadFactory"; +export { + ReadWriteFactory, + type ReadWriteFactoryOptions, +} from "src/factory/ReadWriteFactory"; + +// Token // + +export type { ReadToken } from "src/token/ReadToken"; +export type { ReadWriteToken } from "src/token/ReadWriteToken"; + +// eth +export { ReadEth, type ReadEthOptions } from "src/token/eth/ReadEth"; +export { + ReadWriteEth, + type ReadWriteEthOptions, +} from "src/token/eth/ReadWriteEth"; + +// erc-20 +export { erc20Abi, type Erc20Abi } from "src/token/erc20/abi"; +export { ReadErc20, type ReadErc20Options } from "src/token/erc20/ReadErc20"; +export { + ReadWriteErc20, + type ReadWriteErc20Options, +} from "src/token/erc20/ReadWriteErc20"; + +// erc-4626 +export { + erc4626Abi, + mockErc4626Abi, + type Erc4626Abi, + type MockErc4626Abi, +} from "src/token/erc4626/abi"; +export { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; +export { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; +export { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; +export { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; + +// lseth +export { lsEthAbi, type LsEthAbi } from "src/token/lseth/abi"; +export { ReadLsEth } from "src/token/lseth/ReadLsEth"; +export { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; + +// reth +export { rEthAbi, type REthAbi } from "src/token/reth/abi"; +export { ReadREth } from "src/token/reth/ReadREth"; +export { ReadWriteREth } from "src/token/reth/ReadWriteREth"; + +// steth +export { stEthAbi, type StEthAbi } from "src/token/steth/abi"; +export { ReadStEth } from "src/token/steth/ReadStEth"; +export { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; + +// Errors // + +export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; +export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; +export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; + +// Model // + +export { + ReadModel, + type ReadContractModelOptions, + type ReadModelOptions, +} from "src/model/ReadModel"; +export { + ReadWriteModel, + type ReadWriteContractModelOptions, + type ReadWriteModelOptions, +} from "src/model/ReadWriteModel"; + +// Base // + +export { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; +export { getHprFromApr } from "src/base/getHprFromApr"; +export { getHprFromApy } from "src/base/getHprFromApy"; + +// types +export type { Constructor } from "src/base/types"; diff --git a/packages/hyperdrive-js-core/src/exports/model.ts b/packages/hyperdrive-js-core/src/exports/model.ts deleted file mode 100644 index 24ba9e724..000000000 --- a/packages/hyperdrive-js-core/src/exports/model.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { - ReadModel, - type ReadContractModelOptions, - type ReadModelOptions, -} from "src/model/ReadModel"; -export { - ReadWriteModel, - type ReadWriteContractModelOptions, - type ReadWriteModelOptions, -} from "src/model/ReadWriteModel"; diff --git a/packages/hyperdrive-js-core/src/exports/registry/index.ts b/packages/hyperdrive-js-core/src/exports/registry/index.ts deleted file mode 100644 index 29cd2058f..000000000 --- a/packages/hyperdrive-js-core/src/exports/registry/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./model"; -export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/registry/model.ts b/packages/hyperdrive-js-core/src/exports/registry/model.ts deleted file mode 100644 index 194822a85..000000000 --- a/packages/hyperdrive-js-core/src/exports/registry/model.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - ReadRegistry, - type ReadRegistryOptions, -} from "src/registry/ReadRegistry"; -export { - ReadWriteRegistry, - type ReadWriteRegistryOptions, -} from "src/registry/ReadWriteRegistry"; diff --git a/packages/hyperdrive-js-core/src/exports/registry/rest.ts b/packages/hyperdrive-js-core/src/exports/registry/rest.ts deleted file mode 100644 index 29e3390b5..000000000 --- a/packages/hyperdrive-js-core/src/exports/registry/rest.ts +++ /dev/null @@ -1 +0,0 @@ -export { registryAbi, type RegistryAbi } from "src/registry/abi"; diff --git a/packages/hyperdrive-js-core/src/exports/token/index.ts b/packages/hyperdrive-js-core/src/exports/token/index.ts deleted file mode 100644 index 29cd2058f..000000000 --- a/packages/hyperdrive-js-core/src/exports/token/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./model"; -export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/token/model.ts b/packages/hyperdrive-js-core/src/exports/token/model.ts deleted file mode 100644 index fd8033027..000000000 --- a/packages/hyperdrive-js-core/src/exports/token/model.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type { ReadToken } from "src/token/ReadToken"; -export type { ReadWriteToken } from "src/token/ReadWriteToken"; - -// eth -export { ReadEth, type ReadEthOptions } from "src/token/eth/ReadEth"; -export { - ReadWriteEth, - type ReadWriteEthOptions, -} from "src/token/eth/ReadWriteEth"; - -// erc-20 -export { ReadErc20, type ReadErc20Options } from "src/token/erc20/ReadErc20"; -export { - ReadWriteErc20, - type ReadWriteErc20Options, -} from "src/token/erc20/ReadWriteErc20"; - -// erc-4626 -export { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; -export { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; -export { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; -export { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; - -// lseth -export { ReadLsEth } from "src/token/lseth/ReadLsEth"; -export { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; - -// reth -export { ReadREth } from "src/token/reth/ReadREth"; -export { ReadWriteREth } from "src/token/reth/ReadWriteREth"; - -// steth -export { ReadStEth } from "src/token/steth/ReadStEth"; -export { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; diff --git a/packages/hyperdrive-js-core/src/exports/token/rest.ts b/packages/hyperdrive-js-core/src/exports/token/rest.ts deleted file mode 100644 index 317a005ad..000000000 --- a/packages/hyperdrive-js-core/src/exports/token/rest.ts +++ /dev/null @@ -1,19 +0,0 @@ -// erc-20 -export { erc20Abi, type Erc20Abi } from "src/token/erc20/abi"; - -// erc-4626 -export { - erc4626Abi, - mockErc4626Abi, - type Erc4626Abi, - type MockErc4626Abi, -} from "src/token/erc4626/abi"; - -// lseth -export { lsEthAbi, type LsEthAbi } from "src/token/lseth/abi"; - -// reth -export { rEthAbi, type REthAbi } from "src/token/reth/abi"; - -// steth -export { stEthAbi, type StEthAbi } from "src/token/steth/abi"; diff --git a/packages/hyperdrive-js-core/src/exports/utils.ts b/packages/hyperdrive-js-core/src/exports/utils.ts deleted file mode 100644 index 0acd4a93c..000000000 --- a/packages/hyperdrive-js-core/src/exports/utils.ts +++ /dev/null @@ -1,13 +0,0 @@ -export { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; -export { getHprFromApr } from "src/base/getHprFromApr"; -export { getHprFromApy } from "src/base/getHprFromApy"; -export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; -export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; - -// types -export type { - Constructor, - MergeKeys, - Override, - Prettify, -} from "src/base/types"; diff --git a/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts b/packages/hyperdrive-js-core/src/exports/v1.0.14.ts similarity index 100% rename from packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts rename to packages/hyperdrive-js-core/src/exports/v1.0.14.ts diff --git a/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts b/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts deleted file mode 100644 index b6837c3e2..000000000 --- a/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./model"; diff --git a/packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts b/packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts deleted file mode 100644 index 85fbc6375..000000000 --- a/packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./hyperdrive"; diff --git a/packages/hyperdrive-js-core/tsup.config.ts b/packages/hyperdrive-js-core/tsup.config.ts index 41747e1e2..07ca24f96 100644 --- a/packages/hyperdrive-js-core/tsup.config.ts +++ b/packages/hyperdrive-js-core/tsup.config.ts @@ -1,44 +1,9 @@ import { defineConfig } from "tsup"; export default defineConfig({ - // Splitting the entry points in foundational packages like this makes it - // easier for wrapper packages to selectively re-export `*` from some entry - // points and while augmenting or modifying others. - entry: [ - "src/exports/index.ts", - - "src/exports/contract.ts", - "src/exports/errors.ts", - "src/exports/model.ts", - "src/exports/utils.ts", - - // factory - "src/exports/factory/index.ts", - "src/exports/factory/model.ts", - "src/exports/factory/rest.ts", - - // hyperdrive - "src/exports/hyperdrive/index.ts", - "src/exports/hyperdrive/model.ts", - "src/exports/hyperdrive/rest.ts", - - // registry - "src/exports/registry/index.ts", - "src/exports/registry/model.ts", - "src/exports/registry/rest.ts", - - // token - "src/exports/token/index.ts", - "src/exports/token/model.ts", - "src/exports/token/rest.ts", - - // v1.0.14 - "src/exports/v1.0.14/index.ts", - "src/exports/v1.0.14/hyperdrive/index.ts", - "src/exports/v1.0.14/hyperdrive/model.ts", - "src/exports/v1.0.14/hyperdrive/rest.ts", - ], - format: ["esm"], + entry: ["src/exports/index.ts", "src/exports/v1.0.14.ts"], + format: ["esm", "cjs"], + sourcemap: true, dts: true, clean: true, minify: true, From df4c213ae4fa3102109680f285532208e075311a Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Mon, 4 Nov 2024 11:57:35 -0600 Subject: [PATCH 06/43] Remove unnecessary repetition --- .../hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts index 94c7f252f..172b3f643 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts @@ -59,7 +59,7 @@ export class ReadHyperdrive extends ReadModel { drift, ...modelOptions }: ReadHyperdriveOptions) { - super({ debugName, drift: drift, ...modelOptions }); + super({ debugName, drift, ...modelOptions }); this.address = address; this.contract = this.drift.contract({ abi: hyperdriveAbi, From d46c5bc4e05187f1c052a22cb90abe016c81ebda Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Mon, 4 Nov 2024 11:58:11 -0600 Subject: [PATCH 07/43] Refactor `setupReadHyperdrive` to Drift --- .../base/testing/setupReadHyperdrive.ts | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts index 951c875c3..8b438f490 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts @@ -1,41 +1,32 @@ -import { - CachedReadContract, - createCachedReadContract, -} from "@delvtech/evm-client"; -import { NetworkStub, ReadContractStub } from "@delvtech/evm-client/stubs"; -import { Abi } from "abitype"; -import { ReadHyperdrive_v1_0_14 } from "src/exports/v1.0.14"; -import { HyperdriveAbi } from "src/hyperdrive/base/abi"; +import { ZERO_ADDRESS } from "@delvtech/drift"; +import { MockDrift } from "@delvtech/drift/testing"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; // No need to explicitly set return types as they are already set in the Stubs // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export function setupReadHyperdrive() { - const network = new NetworkStub(); - + const drift = new MockDrift(); // TODO: We use the v1.0.14 version of ReadHyperdrive to avoid the need to - // stub every `convertToShares` and `convertToBase` call since evm-client only + // stub every `convertToShares` and `convertToBase` call since drift only // supports stubbing calls with static values. It should be refactored to // support stubbing a call with a function to dynamically calculate the return // value based on arguments and options. const readHyperdrive = new ReadHyperdrive_v1_0_14({ - address: "0x123", - contractFactory: ({ abi }: { abi: TAbi }) => { - const contract = new ReadContractStub(abi); - return createCachedReadContract({ contract }); - }, - network: network, + address: ZERO_ADDRESS, + drift, }); - // The ReadHyperdrive class doesn't infer that the contract is a Stub + // The ReadHyperdrive class doesn't infer that the contract is a MockContract, // so we need to cast it to the correct type. - const contract = - readHyperdrive.contract as unknown as CachedReadContract & - ReadContractStub; + const contract = drift.contract({ + abi: readHyperdrive.contract.abi, + address: readHyperdrive.contract.address, + }); - contract.stubRead({ functionName: "decimals", value: 18 }); + contract.onRead("decimals").resolves(18); return { + drift, contract, - network, readHyperdrive, }; } From cdc88a4a6cf49ac2fb3fc61e62713b31961bc7f3 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Mon, 4 Nov 2024 14:06:27 -0600 Subject: [PATCH 08/43] Remove `syncCacheWithTransaction` in favor of `onMined` --- .../evm-client/syncCacheWithTransaction.ts | 85 ---------------- .../hyperdrive/base/ReadWriteHyperdrive.ts | 98 ++++++++++++++----- .../src/token/erc20/ReadWriteErc20.ts | 12 ++- 3 files changed, 78 insertions(+), 117 deletions(-) delete mode 100644 packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts diff --git a/packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts b/packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts deleted file mode 100644 index efa681d87..000000000 --- a/packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - CachedReadWriteContract, - ContractReadOptions, - FunctionArgs, - FunctionName, -} from "@delvtech/evm-client"; -import { Abi } from "abitype"; - -/** - * Clears the cache and calls the transaction handlers provided to a "Write" - * method on any CachedReadWriteContract class. - * - * This decorator accepts an argument of cache keys to clear. By default it will - * clear the entire cache. - * - * @example - * ```ts - * class ReadWriteFooBar extends CachedReadWriteContract { - * - * // Listen for tx complete and clear the entire cache - * @syncCacheWithTransaction() - * setFoo() { - * return this.contract.write("setFoo", []); - * } - * - * // Listen for tx complete and clear a partial or specific cache entry - * @syncCacheWithTransaction({ cacheEntries: [{ functionName: "getBar" }]}) - * setBar() { - * return this.contract.write("setBar", []); - * } - * } - * ``` - * - * @internal - */ -export function syncCacheWithTransaction(options?: { - cacheEntries?: { - functionName?: FunctionName; - args?: FunctionArgs>; - options?: ContractReadOptions; - }[]; -}) { - return function ( - // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any - target: any, - propertyKey: string, - descriptor: PropertyDescriptor, - ): void { - const originalMethod = descriptor.value; - - // Wrap the original method in a function that does the transaction - // side-effects we want after the tx completes - // eslint-disable-next-line @typescript-eslint/no-explicit-any - descriptor.value = async function (...args: any[]) { - // Access the target class instance from within a decorator - // @ts-expect-error The `this` keyword will be the target class instance - const network = this.network; - // @ts-expect-error The `this` keyword will be the target class instance - const contract = this.contract as CachedReadWriteContract; - - // call the original function and await the hash - const hash = await originalMethod.apply(this, args); - - // Dont await this part, we want it to happen in the background once the - // tx is completed - network.waitForTransaction(hash).then(() => { - if (options?.cacheEntries) { - options.cacheEntries.forEach((cacheKey) => { - return contract.deleteReadsMatching( - cacheKey.functionName, - cacheKey.args, - cacheKey.options, - ); - }); - } else { - contract.clearCache(); - } - args[0]?.onTransactionCompleted?.(hash); - }); - - // Return the original method's result hash - return hash; - }; - }; -} diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts index 9dbb63aad..4a144611c 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -5,7 +5,6 @@ import { ReadWriteAdapter, ReadWriteContract, } from "@delvtech/drift"; -import { syncCacheWithTransaction } from "src/drift/syncCacheWithTransaction"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { NULL_BYTES } from "src/hyperdrive/constants"; @@ -16,10 +15,6 @@ import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; type ReadWriteParams = { args: Args; options?: ContractWriteOptions; - /** - * @deprecated Use `options.onMined` instead. - */ - onTransactionCompleted?: (hash: `0x${string}`) => void; }; export interface ReadWriteHyperdriveOptions @@ -62,7 +57,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * Allows anyone to mint a new checkpoint. * @param time - The time (in seconds) of the checkpoint to create. */ - @syncCacheWithTransaction() async checkpoint({ args: { time }, options, @@ -70,7 +64,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { const hash = await this.contract.write( "checkpoint", { _checkpointTime: BigInt(time), _maxIterations: 4n }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } @@ -79,9 +79,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * Allows an authorized address to pause this contract * @param paused - True to pause all deposits and false to unpause them */ - @syncCacheWithTransaction({ - cacheEntries: [{ functionName: "getMarketState" }], - }) async pause({ args: { paused }, options, @@ -91,8 +88,15 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { const hash = await this.contract.write( "pause", { _status: paused }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.invalidateReadsMatching("getMarketState"); + options?.onMined?.(receipt); + }, + }, ); + return hash as `0x${string}`; } @@ -107,7 +111,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * blocked. * @returns The initial number of LP shares created. */ - @syncCacheWithTransaction() async initialize({ args: { contribution, @@ -135,7 +138,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { extraData: extraData, }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } @@ -150,7 +159,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @return bondProceeds - The amount of bonds the user received * */ - @syncCacheWithTransaction() async openLong({ args: { destination, @@ -177,7 +185,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minVaultSharePrice: minVaultSharePrice, _options: { destination, asBase, extraData }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } @@ -192,7 +206,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @return maturityTime - The maturity time of the short. * @return traderDeposit - The amount the user deposited for this trade. */ - @syncCacheWithTransaction() async openShort({ args: { destination, @@ -219,7 +232,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minVaultSharePrice: minVaultSharePrice, _options: { destination, asBase, extraData }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } @@ -234,7 +253,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @param options - Contract Write Options * @return The amount of underlying asset the user receives. */ - @syncCacheWithTransaction() async closeLong({ args: { maturityTime, @@ -261,7 +279,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minOutput: minAmountOut, _options: { destination, asBase, extraData }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } @@ -276,7 +300,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @param options - Contract Write Options * @return The amount of base tokens produced by closing this short */ - @syncCacheWithTransaction() async closeShort({ args: { maturityTime, @@ -303,7 +326,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minOutput: minAmountOut, _options: { destination, asBase, extraData }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } @@ -319,7 +348,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @param options - Contract Write Options * @return lpShares The number of LP tokens created */ - @syncCacheWithTransaction() async addLiquidity({ args: { destination, @@ -349,7 +377,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _maxApr: maxApr, _options: { destination, asBase, extraData }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } @@ -365,7 +399,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { receives a proportional amount of the pool's idle capital * @returns withdrawShares - The base that the LP receives buys out some of their LP shares, but it may not be sufficient to fully buy the LP out. In this case, the LP receives withdrawal shares equal in value to the present value they are owed. As idle capital becomes available, the pool will buy back these shares. */ - @syncCacheWithTransaction() async removeLiquidity({ args: { destination, @@ -389,7 +422,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minOutputPerShare: minOutputPerShare, _options: { destination, asBase, extraData }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; @@ -405,7 +444,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @return baseProceeds The amount of base the LP received. * @return sharesRedeemed The amount of withdrawal shares that were redeemed. */ - @syncCacheWithTransaction() async redeemWithdrawalShares({ args: { withdrawalSharesIn, @@ -429,7 +467,13 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minOutputPerShare: minOutputPerShare, _options: { destination, asBase, extraData }, }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, ); return hash as `0x${string}`; } diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts index 86b81896c..a4a0549ed 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts @@ -4,7 +4,6 @@ import { ReadWriteAdapter, ReadWriteContract, } from "@delvtech/drift"; -import { syncCacheWithTransaction } from "src/drift/syncCacheWithTransaction"; import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadErc20 } from "src/token/erc20/ReadErc20"; @@ -20,9 +19,6 @@ export class ReadWriteErc20 extends ReadErc20 implements ReadWriteToken { super(options); } - @syncCacheWithTransaction({ - cacheEntries: [{ functionName: "allowance" }], - }) async approve({ spender, amount, @@ -36,7 +32,13 @@ export class ReadWriteErc20 extends ReadErc20 implements ReadWriteToken { const hash = await this.contract.write( "approve", { spender, amount }, - options, + { + ...options, + onMined: (receipt) => { + this.contract.invalidateReadsMatching("allowance"); + options?.onMined?.(receipt); + }, + }, ); return hash; } From ee562a44b0455314fcdbef4afa242fab6af673ac Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Mon, 4 Nov 2024 14:27:46 -0600 Subject: [PATCH 09/43] Remove unnecessary type casting --- .../src/factory/ReadFactory.ts | 2 +- .../hyperdrive/base/ReadWriteHyperdrive.ts | 32 ++++++------------- .../src/token/erc20/ReadErc20.ts | 2 +- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts index e9928fc7e..402eef82d 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts @@ -18,7 +18,7 @@ export class ReadFactory extends ReadModel { ...modelOptions }: ReadFactoryOptions) { super({ debugName, ...modelOptions }); - this.address = address as Address; + this.address = address; this.contract = this.drift.contract({ abi: factoryAbi, address, diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts index 4a144611c..3d4d43a2e 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -61,7 +61,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { args: { time }, options, }: ReadWriteParams<{ time: number }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "checkpoint", { _checkpointTime: BigInt(time), _maxIterations: 4n }, { @@ -72,7 +72,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } /** @@ -85,7 +84,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }: ReadWriteParams<{ paused: boolean; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "pause", { _status: paused }, { @@ -96,8 +95,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - - return hash as `0x${string}`; } /** @@ -127,7 +124,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "initialize", { _apr: apr, @@ -146,7 +143,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } /** @@ -177,7 +173,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "openLong", { _amount: amount, @@ -193,7 +189,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } /** @@ -224,7 +219,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "openShort", { _bondAmount: bondAmount, @@ -240,7 +235,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } /** @@ -271,7 +265,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "closeLong", { _maturityTime: maturityTime, @@ -287,7 +281,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } /** @@ -318,7 +311,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "closeShort", { _maturityTime: maturityTime, @@ -334,7 +327,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } /** @@ -368,7 +360,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "addLiquidity", { _contribution: contribution, @@ -385,7 +377,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } /** @@ -415,7 +406,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "removeLiquidity", { _lpShares: lpSharesIn, @@ -430,8 +421,6 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - - return hash as `0x${string}`; } /** @@ -460,7 +449,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - const hash = await this.contract.write( + return this.contract.write( "redeemWithdrawalShares", { _withdrawalShares: withdrawalSharesIn, @@ -475,6 +464,5 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { }, }, ); - return hash as `0x${string}`; } } diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts index 85be0761a..f4e1d6c41 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts @@ -26,7 +26,7 @@ export class ReadErc20 extends ReadModel implements ReadToken { } get address(): Address { - return this.contract.address as Address; + return this.contract.address; } get namespace(): PropertyKey | undefined { return this.contract.cacheNamespace; From a93a35b077b74214922914e7535d79c4dd9f28f1 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Mon, 4 Nov 2024 15:08:22 -0600 Subject: [PATCH 10/43] Refactor tests to drift --- .../hyperdrive/base/ReadHyperdrive.test.ts | 623 ++++++++---------- 1 file changed, 282 insertions(+), 341 deletions(-) diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts index 70077a91d..881928679 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts @@ -1,6 +1,7 @@ +import { ZERO_ADDRESS } from "@delvtech/drift"; +import { fixed, parseFixed } from "@delvtech/fixed-point-wasm"; import { ALICE, BOB } from "src/base/testing/accounts"; import { CheckpointEvent } from "src/checkpoint/types"; -import { fixed, parseFixed } from "src/fixed-point"; import { setupReadHyperdrive } from "src/hyperdrive/base/testing/setupReadHyperdrive"; import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; import { @@ -13,10 +14,7 @@ import { assert, expect, test } from "vitest"; test("getVersion should return the parsed version of the contract", async () => { const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "version", - value: "v1.0.14", - }); + contract.onRead("version").resolves("v1.0.14"); const value = await readHyperdrive.getVersion(); expect(value).toEqual({ @@ -34,10 +32,7 @@ test("getPoolConfig should return the PoolConfig from the contract as-is", async const { contract, readHyperdrive } = setupReadHyperdrive(); // stub out the contract call the sdk is going to make - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig7Days, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); // The sdk should return the correct data const value = await readHyperdrive.getPoolConfig(); @@ -50,10 +45,7 @@ test("getPoolConfig should return the PoolConfig from the contract as-is", async test("getPoolInfo should return the PoolInfo from the contract as-is", async () => { const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolInfo", - value: simplePoolInfo, - }); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); const value = await readHyperdrive.getPoolInfo(); expect(value).toBe(simplePoolInfo); @@ -66,14 +58,8 @@ test("getFixedRate should get the fixed rate as-is", async () => { // These are necessary to stub, but the values won't be used since we stub // calculateAPRFromReserves directly - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig7Days, - }); - contract.stubRead({ - functionName: "getPoolInfo", - value: simplePoolInfo, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); const value = await readHyperdrive.getFixedApr(); expect(value).toBe(50000000000000000n); @@ -82,7 +68,7 @@ test("getFixedRate should get the fixed rate as-is", async () => { test("getTradingVolume should get the trading volume in terms of bonds", async () => { const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.stubEvents("OpenLong", {}, [ + contract.onGetEvents("OpenLong").resolves([ { eventName: "OpenLong", args: { @@ -111,7 +97,7 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }, ]); - contract.stubEvents("CloseLong", {}, [ + contract.onGetEvents("CloseLong").resolves([ { eventName: "CloseLong", args: { @@ -130,7 +116,7 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }, ]); - contract.stubEvents("OpenShort", {}, [ + contract.onGetEvents("OpenShort").resolves([ { eventName: "OpenShort", args: { @@ -161,7 +147,7 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }, ]); - contract.stubEvents("CloseShort", {}, []); + contract.onGetEvents("CloseShort").resolves([]); const value = await readHyperdrive.getTradingVolume(); @@ -173,35 +159,27 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }); test("getShortAccruedYield should return the amount of yield a non-mature position has earned", async () => { - const { contract, network, readHyperdrive } = setupReadHyperdrive(); + const { contract, drift, readHyperdrive } = setupReadHyperdrive(); - network.stubGetBlock({ - value: { blockNumber: 1n, timestamp: 100n }, - }); + drift.onGetBlock().resolves({ blockNumber: 1n, timestamp: 100n }); - contract.stubRead({ - functionName: "getPoolConfig", - value: { - ...simplePoolConfig7Days, - positionDuration: 86400n, // one day in seconds - checkpointDuration: 86400n, // one day in seconds - }, + contract.onRead("getPoolConfig").resolves({ + ...simplePoolConfig7Days, + positionDuration: 86400n, // one day in seconds + checkpointDuration: 86400n, // one day in seconds }); // The pool info gives us the current price - contract.stubRead({ - functionName: "getPoolInfo", - value: { ...simplePoolInfo, vaultSharePrice: parseFixed("1.01").bigint }, + contract.onRead("getPoolInfo").resolves({ + ...simplePoolInfo, + vaultSharePrice: parseFixed("1.01").bigint, }); // The checkpoint gives us the price when the bond was opened - contract.stubRead({ - functionName: "getCheckpoint", - value: { - vaultSharePrice: parseFixed("1.008").bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, - }, + contract.onRead("getCheckpoint").resolves({ + vaultSharePrice: parseFixed("1.008").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, }); const accruedYield = await readHyperdrive.getShortAccruedYield({ @@ -216,40 +194,28 @@ test("getShortAccruedYield should return the amount of yield a non-mature positi }); test("getShortAccruedYield should return the amount of yield a mature position has earned", async () => { - const { network, contract, readHyperdrive } = setupReadHyperdrive(); + const { drift, contract, readHyperdrive } = setupReadHyperdrive(); - network.stubGetBlock({ - value: { blockNumber: 1n, timestamp: 1699503565n }, - }); - contract.stubRead({ - functionName: "getPoolConfig", - value: { - ...simplePoolConfig7Days, - positionDuration: 86400n, // one day in seconds - checkpointDuration: 86400n, // one day in seconds - }, + drift.onGetBlock().resolves({ blockNumber: 1n, timestamp: 1699503565n }); + + contract.onRead("getPoolConfig").resolves({ + ...simplePoolConfig7Days, + positionDuration: 86400n, // one day in seconds + checkpointDuration: 86400n, // one day in seconds }); // This checkpoint gives us the price when the short was opened - contract.stubRead({ - functionName: "getCheckpoint", - args: { _checkpointTime: 1n }, - value: { - vaultSharePrice: parseFixed("1.008").bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, - }, + contract.onRead("getCheckpoint", { _checkpointTime: 1n }).resolves({ + vaultSharePrice: parseFixed("1.008").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, }); // This checkpoint gives us the price when the shorts matured - contract.stubRead({ - functionName: "getCheckpoint", - args: { _checkpointTime: 86401n }, - value: { - vaultSharePrice: parseFixed("1.01").bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, - }, + contract.onRead("getCheckpoint", { _checkpointTime: 86401n }).resolves({ + vaultSharePrice: parseFixed("1.01").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, }); const accruedYield = await readHyperdrive.getShortAccruedYield({ @@ -287,7 +253,7 @@ test("getCheckpointEvents should return an array of CheckpointEvents", async () }, }, ] as CheckpointEvent[]; - contract.stubEvents("CreateCheckpoint", undefined, checkPointEvents); + contract.onGetEvents("CreateCheckpoint").resolves(checkPointEvents); const events = await readHyperdrive.getCheckpointEvents(); @@ -306,7 +272,7 @@ test("getOpenLongs should account for longs opened with base", async () => { const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { eventName: "OpenLong", args: { @@ -338,7 +304,7 @@ test("getOpenLongs should account for longs opened with base", async () => { }, }, ]); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, []); + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([]); const value = await readHyperdrive.getOpenLongs({ account: BOB }); @@ -364,7 +330,7 @@ test("getOpenLongs should account for longs opened with shares", async () => { const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { eventName: "OpenLong", args: { @@ -398,7 +364,7 @@ test("getOpenLongs should account for longs opened with shares", async () => { ]); // Bob has not closed the position at all, these are just stubbed out - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, []); + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([]); const value = await readHyperdrive.getOpenLongs({ account: BOB }); expect(value).toEqual([ @@ -410,6 +376,7 @@ test("getOpenLongs should account for longs opened with shares", async () => { }, ]); }); + test("getOpenLongs should account for longs partially closed to base", async () => { // Description: // Bob opens up a long position over 2 txs in the same checkpoint, for a total @@ -422,7 +389,7 @@ test("getOpenLongs should account for longs partially closed to base", async () const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { eventName: "OpenLong", args: { @@ -455,7 +422,7 @@ test("getOpenLongs should account for longs partially closed to base", async () }, }, ]); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { eventName: "CloseLong", args: { @@ -501,7 +468,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { eventName: "OpenLong", args: { @@ -534,7 +501,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { }, }, ]); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { eventName: "CloseLong", args: { @@ -555,7 +522,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { }, ]); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { eventName: "OpenLong", args: { @@ -589,7 +556,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { }, ]); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { eventName: "CloseLong", args: { @@ -622,7 +589,7 @@ test("getOpenLongs should handle when user fully closes then re-opens a position const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { args: { extraData: "0x", @@ -661,7 +628,7 @@ test("getOpenLongs should handle when user fully closes then re-opens a position } as const, ]); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { args: { extraData: "0x", @@ -708,7 +675,7 @@ test("getOpenLongs should account for longs partially closed to shares", async ( const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { eventName: "OpenLong", args: { @@ -726,7 +693,7 @@ test("getOpenLongs should account for longs partially closed to shares", async ( }, ]); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { eventName: "CloseLong", blockNumber: 5n, @@ -771,7 +738,7 @@ test("getOpenLongs should account for longs fully closed to shares", async () => const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ { eventName: "OpenLong", args: { @@ -790,7 +757,7 @@ test("getOpenLongs should account for longs fully closed to shares", async () => }, ]); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { eventName: "CloseLong", blockNumber: 5n, @@ -820,13 +787,13 @@ test("getOpenLongs should account for longs fully closed to shares", async () => test("getClosedLongs should account for closing out to base", async () => { // Description: // Bob closes a long position of 2 bonds and receives back 2.2 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { eventName: "CloseLong", blockNumber: 5n, @@ -847,7 +814,7 @@ test("getClosedLongs should account for closing out to base", async () => { }, }, ]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getClosedLongs({ account: BOB }); expect(value).toEqual([ { @@ -866,13 +833,13 @@ test("getClosedLongs should account for closing out to shares", async () => { // Bob closes a long position of 2 bonds and receives back 1.9 shares. Shares // are worth 1.1 base at the time he closes, therefore his closed position is // valued at 2.09 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ { eventName: "CloseLong", blockNumber: 5n, @@ -895,7 +862,7 @@ test("getClosedLongs should account for closing out to shares", async () => { ]); // getBlock gives us the timestamp of when he closed the position - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getClosedLongs({ account: BOB }); expect(value).toEqual([ @@ -915,13 +882,10 @@ test("getOpenShorts should account for shorts opened with base", async () => { // Bob opens up a short position for 100 bonds over 2 txs in the same // checkpoint, for a total cost of around 1.44 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); - contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [ + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.onGetEvents("OpenShort", { filter: { trader: BOB } }).resolves([ { eventName: "OpenShort", blockNumber: 1n, @@ -954,13 +918,11 @@ test("getOpenShorts should account for shorts opened with base", async () => { }, ]); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, []); + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([]); - network.stubGetBlock({ - value: { - timestamp: 1713801432n, - blockNumber: 1n, - }, + drift.onGetBlock().resolves({ + timestamp: 1713801432n, + blockNumber: 1n, }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); @@ -973,7 +935,7 @@ test("getOpenShorts should account for shorts opened with base", async () => { bondAmount: parseFixed("100").bigint, baseProceeds: parseFixed("98.576966043666144584").bigint, fixedRatePaid: parseFixed("0.175635145784387390").bigint, - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, maturity: 1716336000n, openedTimestamp: 1713801432n, }, @@ -985,13 +947,10 @@ test("getOpenShorts should account for shorts opened with shares", async () => { // Bob opens up a short position for 100 bonds over 2 txs in the same // checkpoint, for a total cost of around 1.44 shares. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); - contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [ + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.onGetEvents("OpenShort", { filter: { trader: BOB } }).resolves([ { eventName: "OpenShort", blockNumber: 1n, @@ -1024,13 +983,11 @@ test("getOpenShorts should account for shorts opened with shares", async () => { }, ]); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, []); + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([]); - network.stubGetBlock({ - value: { - timestamp: 1713801432n, - blockNumber: 1n, - }, + drift.onGetBlock().resolves({ + timestamp: 1713801432n, + blockNumber: 1n, }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); @@ -1043,7 +1000,7 @@ test("getOpenShorts should account for shorts opened with shares", async () => { bondAmount: parseFixed("100").bigint, baseProceeds: parseFixed("98.576966043666144584").bigint, fixedRatePaid: parseFixed("0.175635145784387390").bigint, - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, maturity: 1716336000n, openedTimestamp: 1713801432n, }, @@ -1055,12 +1012,9 @@ test("getOpenShorts should account for shorts partially closed to base", async ( // Bob shorts 50 bonds for a total cost of 0.73 base. He then partially // closes this position, redeeming 25 bonds for 0.36 base. As a result, he has 25 // bonds left with a total cost of 0.37 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); const events = [ { @@ -1096,10 +1050,14 @@ test("getOpenShorts should account for shorts partially closed to base", async ( }, ] as const; - contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([ @@ -1109,7 +1067,7 @@ test("getOpenShorts should account for shorts partially closed to base", async ( baseAmountPaid: parseFixed("0.367919766722905778").bigint, baseProceeds: parseFixed("24.637035274042034163").bigint, checkpointTime: 123454800n, - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, fixedRatePaid: parseFixed("0.179245221000329770").bigint, maturity: 1716336000n, openedTimestamp: 123456789n, @@ -1121,12 +1079,9 @@ test("getOpenShorts should account for shorts fully closed to base", async () => // Description: // Bob opens up a short position, then completely closes this position, As a // result, he no longer has any open short positions. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); const events = [ { @@ -1162,10 +1117,14 @@ test("getOpenShorts should account for shorts fully closed to base", async () => }, ] as const; - contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([]); @@ -1176,12 +1135,9 @@ test("getOpenShorts should account for shorts partially closed to shares", async // Bob shorts 50 bonds for a total cost of 0.73 base. He then partially // closes this position, redeeming 25 bonds for 0.36 shares. As a result, he // has 25 bonds left with a total cost of 0.37 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); const events = [ { @@ -1217,10 +1173,14 @@ test("getOpenShorts should account for shorts partially closed to shares", async }, ] as const; - contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([ @@ -1230,7 +1190,7 @@ test("getOpenShorts should account for shorts partially closed to shares", async baseAmountPaid: parseFixed("0.367919766723039831").bigint, baseProceeds: parseFixed("24.637035274042034163").bigint, checkpointTime: 123454800n, - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, fixedRatePaid: parseFixed("0.179245221000329770").bigint, maturity: 1716336000n, openedTimestamp: 123456789n, @@ -1243,12 +1203,9 @@ test("getOpenShorts should account for shorts fully closed to shares", async () // Bob opens up a short position, then completely closes this position, As a // result, he no longer has any open short positions. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); const events = [ { eventName: "OpenShort", @@ -1283,10 +1240,14 @@ test("getOpenShorts should account for shorts fully closed to shares", async () }, ] as const; - contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([]); @@ -1298,26 +1259,19 @@ test("getOpenShorts should handle when user fully closes then re-opens a positio // in the same checkpoint, resulting in a single position with new accounting // (ie: the previous loss is not factored in). - const { contract, network, readHyperdrive } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); + const { contract, drift, readHyperdrive } = setupReadHyperdrive(); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); // pool info to get the price of shares at the time he closes the short - contract.stubRead({ - functionName: "getPoolInfo", - value: { ...simplePoolInfo, vaultSharePrice: parseFixed("1.1").bigint }, - options: { blockNumber: 5n }, - }); + contract + .onRead("getPoolInfo", {}, { block: 5n }) + .resolves({ ...simplePoolInfo, vaultSharePrice: parseFixed("1.1").bigint }); // Stub the timestamp so getOpenShorts can construct the checkpoint id - network.stubGetBlock({ - value: { - timestamp: 123456789n, - // this blockNumber is unused, but setting this to 3n, as there should be - // 3 blocks in this test flow - blockNumber: 3n, - }, + drift.onGetBlock().resolves({ + timestamp: 123456789n, + // this blockNumber is unused, but setting this to 3n, as there should be + // 3 blocks in this test flow + blockNumber: 3n, }); const events = [ @@ -1369,12 +1323,13 @@ test("getOpenShorts should handle when user fully closes then re-opens a positio }, ] as const; - contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [ - events[0], - events[2], - ]); + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0], events[2]]); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); const value = await readHyperdrive.getOpenShorts({ account: BOB }); @@ -1394,32 +1349,18 @@ test("getOpenShorts should handle when user fully closes then re-opens a positio }); test("getShortBondsGivenDeposit & previewOpenShort should align within a given tolerance", async () => { - const { contract, network, readHyperdrive } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig30Days, - }); - contract.stubRead({ - functionName: "getPoolInfo", - value: simplePoolInfo, + const { contract, drift, readHyperdrive } = setupReadHyperdrive(); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.onRead("getCheckpointExposure").resolves(0n); + contract.onRead("getCheckpoint").resolves({ + vaultSharePrice: parseFixed(1.05).bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, }); - contract.stubRead({ - functionName: "getCheckpointExposure", - value: 0n, - }); - contract.stubRead({ - functionName: "getCheckpoint", - value: { - vaultSharePrice: parseFixed(1.05).bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, - }, - }); - network.stubGetBlock({ - value: { - timestamp: 123456789n, - blockNumber: 1n, - }, + drift.onGetBlock().resolves({ + timestamp: 123456789n, + blockNumber: 1n, }); const targetDeposit = parseFixed(1.123); @@ -1440,17 +1381,14 @@ test("getShortBondsGivenDeposit & previewOpenShort should align within a given t test("getClosedShorts should account for shorts closed to base", async () => { // Description: // Bob completely closes his position, redeeming 100 shorted bonds for 2 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); const eventData = "0x0200000000000000000000000000000000000000000000000000000065d76f800000000000000000000000000000000000000000000000056bc75e2d63100000"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig7Days, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([ { eventName: "CloseShort", args: { @@ -1468,7 +1406,7 @@ test("getClosedShorts should account for shorts closed to base", async () => { }, ]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getClosedShorts({ account: BOB }); @@ -1479,7 +1417,7 @@ test("getClosedShorts should account for shorts closed to base", async () => { bondAmount: parseFixed("100").bigint, checkpointTime: 123454800n, closedTimestamp: 123456789n, - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, maturity: 1708617600n, }, ]); @@ -1490,17 +1428,14 @@ test("getClosedShorts should account for shorts closed to shares", async () => { // Bob completely closes his position, redeeming 100 shorted bonds for 1.1 shares. // Shares are worth 1.1 base at the time he closes, therefore his closed position // is valued at 1.21 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); const eventData = "0x0200000000000000000000000000000000000000000000000000000065d76f800000000000000000000000000000000000000000000000056bc75e2d63100000"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.stubRead({ - functionName: "getPoolConfig", - value: simplePoolConfig7Days, - }); + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); - contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [ + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([ { eventName: "CloseShort", blockNumber: 5n, @@ -1519,7 +1454,7 @@ test("getClosedShorts should account for shorts closed to shares", async () => { }, ]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const value = await readHyperdrive.getClosedShorts({ account: BOB }); @@ -1530,7 +1465,7 @@ test("getClosedShorts should account for shorts closed to shares", async () => { bondAmount: parseFixed("100").bigint, checkpointTime: 123454800n, closedTimestamp: 123456789n, - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, maturity: 1708617600n, }, ]); @@ -1543,17 +1478,14 @@ test("getOpenLpPosition should return zero when a position is fully closed", asy // 1 base on this position) Bob is left with 0 LP shares and 0 base paid in his // current LP position. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); - contract.stubRead({ - functionName: "getPoolInfo", - value: simplePoolInfo, - }); - contract.stubSimulateWrite("removeLiquidity", { + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.onSimulateWrite("removeLiquidity").resolves({ proceeds: parseFixed("100").bigint, withdrawalShares: 0n, }); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 175n } }); - contract.stubEvents("AddLiquidity", { filter: { provider: BOB } }, [ + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 175n }); + contract.onGetEvents("AddLiquidity", { filter: { provider: BOB } }).resolves([ { eventName: "AddLiquidity", blockNumber: 174n, @@ -1569,23 +1501,25 @@ test("getOpenLpPosition should return zero when a position is fully closed", asy }, ]); - contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ - { - eventName: "RemoveLiquidity", - blockNumber: 175n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("499").bigint, - lpAmount: parseFixed("498").bigint, - lpSharePrice: parseFixed("1.002867781011873985").bigint, - provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", - vaultSharePrice: parseFixed("498.567723245858722697").bigint, - withdrawalShareAmount: 0n, - destination: BOB, + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 175n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("499").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.002867781011873985").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("498.567723245858722697").bigint, + withdrawalShareAmount: 0n, + destination: BOB, + }, }, - }, - ]); + ]); const value = await readHyperdrive.getOpenLpPosition({ account: BOB, @@ -1607,17 +1541,14 @@ test("getOpenLpPosition should return the current lpShareBalance and baseAmountP // receiving 99 LP shares, depositing 100 base. Bob now has with 99 LP // shares and 100 base paid in his current LP position. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 175n } }); - contract.stubSimulateWrite("removeLiquidity", { + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 175n }); + contract.onSimulateWrite("removeLiquidity").resolves({ proceeds: parseFixed("100").bigint, withdrawalShares: 0n, }); - contract.stubRead({ - functionName: "getPoolInfo", - value: simplePoolInfo, - }); - contract.stubEvents("AddLiquidity", { filter: { provider: BOB } }, [ + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.onGetEvents("AddLiquidity", { filter: { provider: BOB } }).resolves([ { eventName: "AddLiquidity", blockNumber: 174n, @@ -1646,23 +1577,25 @@ test("getOpenLpPosition should return the current lpShareBalance and baseAmountP }, ]); - contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ - { - eventName: "RemoveLiquidity", - blockNumber: 175n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("499").bigint, - lpAmount: parseFixed("498").bigint, - lpSharePrice: parseFixed("1.002867781011873985").bigint, - provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", - vaultSharePrice: parseFixed("1.0008670371827").bigint, - withdrawalShareAmount: 0n, - destination: BOB, + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 175n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("499").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.002867781011873985").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("1.0008670371827").bigint, + withdrawalShareAmount: 0n, + destination: BOB, + }, }, - }, - ]); + ]); const value = await readHyperdrive.getOpenLpPosition({ account: BOB, @@ -1680,27 +1613,29 @@ test("getClosedLpShares should account for LP shares closed to base", async () = // Description: // Bob completely closes his LP position of 5 LP shares and receives back // base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); - - contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ - { - eventName: "RemoveLiquidity", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("10").bigint, - vaultSharePrice: parseFixed("9").bigint, - provider: BOB, - withdrawalShareAmount: 0n, - lpAmount: parseFixed("5").bigint, - lpSharePrice: parseFixed("2").bigint, - destination: BOB, + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("10").bigint, + vaultSharePrice: parseFixed("9").bigint, + provider: BOB, + withdrawalShareAmount: 0n, + lpAmount: parseFixed("5").bigint, + lpSharePrice: parseFixed("2").bigint, + destination: BOB, + }, }, - }, - ]); + ]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const closedLpShares = await readHyperdrive.getClosedLpShares({ account: BOB, @@ -1720,27 +1655,29 @@ test("getClosedLpShares should account for LP shares closed to vault shares", as // Description: // Bob completely closes his LP position of 5 LP shares and receives back // shares. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); - - contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ - { - eventName: "RemoveLiquidity", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: false, - amount: parseFixed("9").bigint, - vaultSharePrice: parseFixed("1.1").bigint, - provider: BOB, - withdrawalShareAmount: 0n, - lpAmount: parseFixed("5").bigint, - lpSharePrice: parseFixed("2").bigint, - destination: BOB, + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: false, + amount: parseFixed("9").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + provider: BOB, + withdrawalShareAmount: 0n, + lpAmount: parseFixed("5").bigint, + lpSharePrice: parseFixed("2").bigint, + destination: BOB, + }, }, - }, - ]); + ]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const closedLpShares = await readHyperdrive.getClosedLpShares({ account: BOB, @@ -1759,25 +1696,27 @@ test("getClosedLpShares should account for LP shares closed to vault shares", as test("getRedeemedWithdrawalShares should account for withdrawal shares closed to base", async () => { // Description: // Bob completely redeems 5 withdrawal shares and receives 10 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); - - contract.stubEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }, [ - { - eventName: "RedeemWithdrawalShares", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("10").bigint, - vaultSharePrice: parseFixed("9.8").bigint, - provider: BOB, - withdrawalShareAmount: parseFixed("5").bigint, - destination: BOB, + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RedeemWithdrawalShares", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("10").bigint, + vaultSharePrice: parseFixed("9.8").bigint, + provider: BOB, + withdrawalShareAmount: parseFixed("5").bigint, + destination: BOB, + }, }, - }, - ]); + ]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const redeemedWithdrawalShares = await readHyperdrive.getRedeemedWithdrawalShares({ @@ -1785,7 +1724,7 @@ test("getRedeemedWithdrawalShares should account for withdrawal shares closed to }); expect(redeemedWithdrawalShares).toEqual([ { - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, baseAmount: parseFixed("10").bigint, withdrawalShareAmount: parseFixed("5").bigint, redeemedTimestamp: 123456789n, @@ -1795,25 +1734,27 @@ test("getRedeemedWithdrawalShares should account for withdrawal shares closed to test("getRedeemedWithdrawalShares should account for withdrawal shares closed to vault shares", async () => { // Description: // Bob completely redeems 5 withdrawal shares and receives 8 shares that are worth 10 base. - const { contract, readHyperdrive, network } = setupReadHyperdrive(); - - contract.stubEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }, [ - { - eventName: "RedeemWithdrawalShares", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: false, - vaultSharePrice: parseFixed("1.25").bigint, - amount: parseFixed("8").bigint, - provider: BOB, - withdrawalShareAmount: parseFixed("5").bigint, - destination: BOB, + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RedeemWithdrawalShares", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: false, + vaultSharePrice: parseFixed("1.25").bigint, + amount: parseFixed("8").bigint, + provider: BOB, + withdrawalShareAmount: parseFixed("5").bigint, + destination: BOB, + }, }, - }, - ]); + ]); - network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); const redeemedWithdrawalShares = await readHyperdrive.getRedeemedWithdrawalShares({ @@ -1821,7 +1762,7 @@ test("getRedeemedWithdrawalShares should account for withdrawal shares closed to }); expect(redeemedWithdrawalShares).toEqual([ { - hyperdriveAddress: "0x0000000000000000000000000000000000000000", + hyperdriveAddress: ZERO_ADDRESS, baseAmount: parseFixed("10").bigint, withdrawalShareAmount: parseFixed("5").bigint, redeemedTimestamp: 123456789n, From 1339dffabdd97625ad3f05b2d919a8156612633b Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 19:41:47 -0600 Subject: [PATCH 11/43] Rename "Models" to "Clients" in sdk core --- .../src/client/ContractClient.ts | 32 +++++++++++++++++ .../ReadModel.ts => client/ReadClient.ts} | 21 ++++------- .../src/client/ReadWriteClient.ts | 20 +++++++++++ .../hyperdrive-js-core/src/exports/index.ts | 20 +++++------ .../src/factory/ReadFactory.ts | 11 +++--- .../src/factory/ReadWriteFactory.ts | 4 +-- .../src/hyperdrive/base/ReadHyperdrive.ts | 11 +++--- .../hyperdrive/base/ReadWriteHyperdrive.ts | 4 +-- .../erc4626/ReadErc4626Hyperdrive.ts | 2 +- .../hyperdrive/ezeth/ReadEzEthHyperdrive.ts | 8 ++--- .../hyperdrive/lseth/ReadLsEthHyperdrive.ts | 4 +-- .../src/hyperdrive/reth/ReadREthHyperdrive.ts | 4 +-- .../hyperdrive/steth/ReadStEthHyperdrive.ts | 21 ++--------- .../src/model/ReadWriteModel.ts | 35 ------------------- .../src/registry/ReadRegistry.ts | 11 +++--- .../src/registry/ReadWriteRegistry.ts | 4 +-- .../hyperdrive-js-core/src/token/ReadToken.ts | 4 +-- .../src/token/ReadWriteToken.ts | 4 +-- .../src/token/erc20/ReadErc20.ts | 11 +++--- .../src/token/erc20/ReadWriteErc20.ts | 4 +-- .../src/token/erc4626/ReadErc4626.ts | 4 +-- .../src/token/erc4626/ReadMockErc4626.ts | 4 +-- .../src/token/eth/ReadEth.ts | 6 ++-- .../src/token/eth/ReadWriteEth.ts | 4 +-- .../src/token/steth/ReadStEth.ts | 4 +-- .../hyperdrive-viem/src/viem/viemReadMixin.ts | 20 ++++------- 26 files changed, 135 insertions(+), 142 deletions(-) create mode 100644 packages/hyperdrive-js-core/src/client/ContractClient.ts rename packages/hyperdrive-js-core/src/{model/ReadModel.ts => client/ReadClient.ts} (72%) create mode 100644 packages/hyperdrive-js-core/src/client/ReadWriteClient.ts delete mode 100644 packages/hyperdrive-js-core/src/model/ReadWriteModel.ts diff --git a/packages/hyperdrive-js-core/src/client/ContractClient.ts b/packages/hyperdrive-js-core/src/client/ContractClient.ts new file mode 100644 index 000000000..d73f29d2c --- /dev/null +++ b/packages/hyperdrive-js-core/src/client/ContractClient.ts @@ -0,0 +1,32 @@ +import { SimpleCache } from "@delvtech/drift"; +import { Address } from "abitype"; +import { ReadClientOptions } from "src/client/ReadClient"; +import { ReadWriteClientOptions } from "src/client/ReadWriteClient"; + +/** + * Additional options required for clients that represent a specific contract. + */ +export interface ContractClientOptions { + /** + * The address of the contract. + */ + address: Address; + + /** + * The cache to use for the contract. + */ + cache?: SimpleCache; + + /** + * The namespace to use for the cache. + */ + cacheNamespace?: PropertyKey; +} + +export interface ReadContractClientOptions + extends ReadClientOptions, + ContractClientOptions {} + +export interface ReadWriteContractClientOptions + extends ReadWriteClientOptions, + ContractClientOptions {} diff --git a/packages/hyperdrive-js-core/src/model/ReadModel.ts b/packages/hyperdrive-js-core/src/client/ReadClient.ts similarity index 72% rename from packages/hyperdrive-js-core/src/model/ReadModel.ts rename to packages/hyperdrive-js-core/src/client/ReadClient.ts index 52e59ee67..3ab9d0768 100644 --- a/packages/hyperdrive-js-core/src/model/ReadModel.ts +++ b/packages/hyperdrive-js-core/src/client/ReadClient.ts @@ -1,14 +1,14 @@ -import { ContractParams, Drift } from "@delvtech/drift"; +import { Drift } from "@delvtech/drift"; /** - * The base options required for all read models. + * The base options required for all read clients. */ -export interface ReadModelOptions { +export interface ReadClientOptions { drift: Drift; /** * An arbitrary name for the instance. This is for convenience only (e.g., for - * use as a display name or in logging) and has no affect on the model's + * use as a display name or in logging) and has no affect on the client's * behavior. */ debugName?: string; @@ -20,13 +20,13 @@ export interface ReadModelOptions { } /** - * A base class for read-only models. + * A base class for read-only clients. */ -export class ReadModel { +export class ReadClient { drift: Drift; debugName: string; - constructor({ debugName, drift, earliestBlock }: ReadModelOptions) { + constructor({ debugName, drift, earliestBlock }: ReadClientOptions) { this.debugName = debugName ?? this.constructor.name; this.drift = drift; @@ -55,10 +55,3 @@ export class ReadModel { } } } - -/** - * The options required to create a read model that represents a specific - * contract. - */ -export type ReadContractModelOptions = ReadModelOptions & - Omit; diff --git a/packages/hyperdrive-js-core/src/client/ReadWriteClient.ts b/packages/hyperdrive-js-core/src/client/ReadWriteClient.ts new file mode 100644 index 000000000..6f81d95bb --- /dev/null +++ b/packages/hyperdrive-js-core/src/client/ReadWriteClient.ts @@ -0,0 +1,20 @@ +import { Drift, ReadWriteAdapter } from "@delvtech/drift"; +import { ReadClient, ReadClientOptions } from "src/client/ReadClient"; + +/** + * The base options required for all read-write clients. + */ +export interface ReadWriteClientOptions extends ReadClientOptions { + drift: Drift; +} + +/** + * A base class for read-write clients. + */ +export class ReadWriteClient extends ReadClient { + declare drift: Drift; + + constructor(options: ReadWriteClientOptions) { + super(options); + } +} diff --git a/packages/hyperdrive-js-core/src/exports/index.ts b/packages/hyperdrive-js-core/src/exports/index.ts index ee3d8742c..92c52d413 100644 --- a/packages/hyperdrive-js-core/src/exports/index.ts +++ b/packages/hyperdrive-js-core/src/exports/index.ts @@ -138,18 +138,18 @@ export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; -// Model // +// Client // +export type { + ContractClientOptions, + ReadContractClientOptions, + ReadWriteContractClientOptions, +} from "src/client/ContractClient"; +export { ReadClient, type ReadClientOptions } from "src/client/ReadClient"; export { - ReadModel, - type ReadContractModelOptions, - type ReadModelOptions, -} from "src/model/ReadModel"; -export { - ReadWriteModel, - type ReadWriteContractModelOptions, - type ReadWriteModelOptions, -} from "src/model/ReadWriteModel"; + ReadWriteClient, + type ReadWriteClientOptions, +} from "src/client/ReadWriteClient"; // Base // diff --git a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts index 402eef82d..7f04b100d 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts @@ -1,12 +1,13 @@ import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; +import { ReadContractClientOptions } from "src/client/ContractClient"; +import { ReadClient } from "src/client/ReadClient"; import { FactoryAbi, factoryAbi } from "src/factory/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; -import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; -export interface ReadFactoryOptions extends ReadContractModelOptions {} +export interface ReadFactoryOptions extends ReadContractClientOptions {} -export class ReadFactory extends ReadModel { +export class ReadFactory extends ReadClient { address: Address; contract: Contract; @@ -15,9 +16,9 @@ export class ReadFactory extends ReadModel { address, cache, cacheNamespace, - ...modelOptions + ...rest }: ReadFactoryOptions) { - super({ debugName, ...modelOptions }); + super({ debugName, ...rest }); this.address = address; this.contract = this.drift.contract({ abi: factoryAbi, diff --git a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts index 6f31321bc..38916c341 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts @@ -5,13 +5,13 @@ import { ReadWriteContract, ReplaceProps, } from "@delvtech/drift"; +import { ReadWriteContractClientOptions } from "src/client/ContractClient"; import { ReadFactory, ReadFactoryOptions } from "src/factory/ReadFactory"; import { FactoryAbi } from "src/factory/abi"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; -import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; export interface ReadWriteFactoryOptions - extends ReplaceProps {} + extends ReplaceProps {} export class ReadWriteFactory extends ReadFactory { declare contract: ReadWriteContract; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts index 172b3f643..9a580455f 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts @@ -18,6 +18,8 @@ import { GetCheckpointParams, GetCheckpointTimeParams, } from "src/checkpoint/types"; +import { ReadContractClientOptions } from "src/client/ContractClient"; +import { ReadClient } from "src/client/ReadClient"; import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; import { fixed } from "src/fixed-point"; @@ -32,7 +34,6 @@ import { } from "src/longs/types"; import { ClosedLpShares } from "src/lp/ClosedLpShares"; import { LP_ASSET_ID } from "src/lp/assetId"; -import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; import { MarketState, PoolConfig, PoolInfo } from "src/pool/types"; import { calculateShortAccruedYield } from "src/shorts/calculateShortAccruedYield"; @@ -42,9 +43,9 @@ import { ReadEth } from "src/token/eth/ReadEth"; import { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; import { WITHDRAW_SHARES_ASSET_ID } from "src/withdrawalShares/assetId"; -export interface ReadHyperdriveOptions extends ReadContractModelOptions {} +export interface ReadHyperdriveOptions extends ReadContractClientOptions {} -export class ReadHyperdrive extends ReadModel { +export class ReadHyperdrive extends ReadClient { readonly address: Address; readonly contract: ReadContract; @@ -57,9 +58,9 @@ export class ReadHyperdrive extends ReadModel { cache, cacheNamespace, drift, - ...modelOptions + ...rest }: ReadHyperdriveOptions) { - super({ debugName, drift, ...modelOptions }); + super({ debugName, drift, ...rest }); this.address = address; this.contract = this.drift.contract({ abi: hyperdriveAbi, diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts index 3d4d43a2e..7b405179e 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -5,10 +5,10 @@ import { ReadWriteAdapter, ReadWriteContract, } from "@delvtech/drift"; +import { ReadWriteContractClientOptions } from "src/client/ContractClient"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { NULL_BYTES } from "src/hyperdrive/constants"; -import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; @@ -18,7 +18,7 @@ type ReadWriteParams = { }; export interface ReadWriteHyperdriveOptions - extends ReadWriteContractModelOptions {} + extends ReadWriteContractClientOptions {} export class ReadWriteHyperdrive extends ReadHyperdrive { declare drift: Drift; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts index 0bc6261bd..70d851039 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts @@ -15,7 +15,7 @@ export class ReadErc4626Hyperdrive extends readErc4626HyperdriveMixin( */ export interface ReadErc4626HyperdriveMixin { /** - * Get a model of the tokenized vault for this Hyperdrive instance. + * Get a client for the tokenized vault for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts index adcf6a7fa..05c7e2ec4 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts @@ -19,12 +19,12 @@ export interface ReadEzEthHyperdriveMixin { ezEthHyperdriveContract: Contract; /** - * Get a model of ETH, the base token for this Hyperdrive instance. + * Get a client for ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a model of the EzETH token for this Hyperdrive instance. + * Get a client for the EzETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } @@ -44,9 +44,9 @@ export function readEzEthHyperdriveMixin>( address, cache, cacheNamespace, - ...modelOptions + ...rest } = options as ConstructorParameters[0]; - super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + super({ debugName, address, cache, cacheNamespace, ...rest }); this.ezEthHyperdriveContract = this.drift.contract({ abi: ezEthHyperdriveAbi, address, diff --git a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts index 118b0332e..3f90a02b4 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts @@ -16,12 +16,12 @@ export class ReadLsEthHyperdrive extends readLsEthHyperdriveMixin( */ export interface ReadLsEthHyperdriveMixin { /** - * Get a model of ETH, the base token for this Hyperdrive instance. + * Get a client for ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a model of the LsETH token for this Hyperdrive instance. + * Get a client for the LsETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts index 2352e6369..708c1b57c 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts @@ -17,12 +17,12 @@ export class ReadREthHyperdrive extends readREthHyperdriveMixin( */ export interface ReadREthHyperdriveMixin { /** - * Get a model of ETH, the base token for this Hyperdrive instance. + * Get a client for ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a model of the rETH token for this Hyperdrive instance. + * Get a client for the rETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts index ede875424..a77b69474 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts @@ -8,22 +8,7 @@ import { import { ReadEth } from "src/token/eth/ReadEth"; import { ReadStEth } from "src/token/steth/ReadStEth"; -export interface ReadStEthHyperdriveOptions extends ReadHyperdriveOptions { - /** - * The `StETHHyperdrive` contract stores and operates on Lido balances in - * shares. However, since users are most familiar with stETH public balances, - * this model will accept and return balances in stETH by default and convert - * them to shares when interacting with the contract to ease UI integration. - * - * To use shares instead of stETH, set this to `true`. - * - * @default false - * - * @see - * https://docs.lido.fi/guides/lido-tokens-integration-guide#bookkeeping-shares - */ - useSharesAccounting?: boolean; -} +export interface ReadStEthHyperdriveOptions extends ReadHyperdriveOptions {} export class ReadStEthHyperdrive extends readStEthHyperdriveMixin( ReadHyperdrive, @@ -38,12 +23,12 @@ export class ReadStEthHyperdrive extends readStEthHyperdriveMixin( */ export interface ReadStEthHyperdriveMixin { /** - * Get a model of ETH, the base token for this Hyperdrive instance. + * Get a client for ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a model of the Lido stETH token for this Hyperdrive instance. + * Get a client for the Lido stETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } diff --git a/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts b/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts deleted file mode 100644 index 981d37e37..000000000 --- a/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - ContractParams, - Drift, - ReadWriteAdapter, - ReplaceProps, -} from "@delvtech/drift"; -import { ReadModel, ReadModelOptions } from "src/model/ReadModel"; - -/** - * The base options required for all read-write models. - */ -export type ReadWriteModelOptions = ReplaceProps< - ReadModelOptions, - { - drift: Drift; - } ->; - -/** - * A base class for read-write models. - */ -export class ReadWriteModel extends ReadModel { - declare drift: Drift; - - constructor(options: ReadWriteModelOptions) { - super(options); - } -} - -/** - * The options required to create a read-write model that represents a specific - * contract. - */ -export type ReadWriteContractModelOptions = ReadWriteModelOptions & - Omit; diff --git a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts index d5abb22a2..f72ab3a06 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts @@ -1,17 +1,18 @@ import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; +import { ReadContractClientOptions } from "src/client/ContractClient"; +import { ReadClient } from "src/client/ReadClient"; import { ReadFactory } from "src/factory/ReadFactory"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; -import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; import { RegistryAbi, registryAbi } from "src/registry/abi"; import { FactoryInfoWithMetadata, ReadInstanceInfoWithMetadata, } from "src/registry/types"; -export interface ReadRegistryOptions extends ReadContractModelOptions {} +export interface ReadRegistryOptions extends ReadContractClientOptions {} -export class ReadRegistry extends ReadModel { +export class ReadRegistry extends ReadClient { address: Address; contract: Contract; @@ -20,9 +21,9 @@ export class ReadRegistry extends ReadModel { address, cache, cacheNamespace, - ...modelOptions + ...rest }: ReadRegistryOptions) { - super({ debugName, ...modelOptions }); + super({ debugName, ...rest }); this.address = address; this.contract = this.drift.contract({ abi: registryAbi, diff --git a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts index 0623e87a1..d8187507c 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts @@ -6,15 +6,15 @@ import { ReplaceProps, } from "@delvtech/drift"; import { Address } from "abitype"; +import { ReadWriteContractClientOptions } from "src/client/ContractClient"; import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; -import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; import { ReadRegistry, ReadRegistryOptions } from "src/registry/ReadRegistry"; import { RegistryAbi } from "src/registry/abi"; import { ReadWriteInstanceInfoWithMetadata } from "src/registry/types"; export interface ReadWriteRegistryOptions - extends ReplaceProps {} + extends ReplaceProps {} export class ReadWriteRegistry extends ReadRegistry { declare drift: Drift; diff --git a/packages/hyperdrive-js-core/src/token/ReadToken.ts b/packages/hyperdrive-js-core/src/token/ReadToken.ts index 03d6c31e8..37e7e4b0b 100644 --- a/packages/hyperdrive-js-core/src/token/ReadToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadToken.ts @@ -1,7 +1,7 @@ import { ContractReadOptions } from "@delvtech/drift"; -import { ReadModel } from "src/model/ReadModel"; +import { ReadClient } from "src/client/ReadClient"; -export interface ReadToken extends ReadModel { +export interface ReadToken extends ReadClient { address: `0x${string}`; /** diff --git a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts index 8900ed700..9db1b0a32 100644 --- a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts @@ -1,9 +1,9 @@ import { ContractWriteOptions, ReplaceProps } from "@delvtech/drift"; -import { ReadWriteModel } from "src/model/ReadWriteModel"; +import { ReadWriteClient } from "src/client/ReadWriteClient"; import { ReadToken } from "src/token/ReadToken"; export interface ReadWriteToken - extends ReplaceProps { + extends ReplaceProps { /** * Give a spending allowance to a given spender. * @param spender - The address of the spender. diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts index f4e1d6c41..6e71f893d 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts @@ -1,12 +1,13 @@ import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; -import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; +import { ReadContractClientOptions } from "src/client/ContractClient"; +import { ReadClient } from "src/client/ReadClient"; import { erc20Abi, Erc20Abi } from "src/token/erc20/abi"; import { ReadToken } from "src/token/ReadToken"; -export interface ReadErc20Options extends ReadContractModelOptions {} +export interface ReadErc20Options extends ReadContractClientOptions {} -export class ReadErc20 extends ReadModel implements ReadToken { +export class ReadErc20 extends ReadClient implements ReadToken { contract: Contract; constructor({ @@ -14,9 +15,9 @@ export class ReadErc20 extends ReadModel implements ReadToken { address, cache, cacheNamespace, - ...modelOptions + ...rest }: ReadErc20Options) { - super({ debugName, ...modelOptions }); + super({ debugName, ...rest }); this.contract = this.drift.contract({ abi: erc20Abi, address, diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts index a4a0549ed..f4a798d98 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts @@ -4,12 +4,12 @@ import { ReadWriteAdapter, ReadWriteContract, } from "@delvtech/drift"; -import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; +import { ReadWriteContractClientOptions } from "src/client/ContractClient"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadErc20 } from "src/token/erc20/ReadErc20"; import { Erc20Abi } from "src/token/erc20/abi"; -export interface ReadWriteErc20Options extends ReadWriteContractModelOptions {} +export interface ReadWriteErc20Options extends ReadWriteContractClientOptions {} export class ReadWriteErc20 extends ReadErc20 implements ReadWriteToken { declare drift: Drift; diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts index d2f6277ed..d263fe299 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts @@ -54,9 +54,9 @@ export function readErc4626Mixin>( address, cache, cacheNamespace, - ...modelOptions + ...rest } = options as ReadErc20Options; - super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + super({ debugName, address, cache, cacheNamespace, ...rest }); this.erc4626Contract = this.drift.contract({ abi: erc4626Abi, address, diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts index 85206a377..657c2b13a 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts @@ -32,9 +32,9 @@ export function readMockErc4626Mixin>( address, cache, cacheNamespace, - ...modelOptions + ...rest } = options as ConstructorParameters[0]; - super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + super({ debugName, address, cache, cacheNamespace, ...rest }); this.mockErc4626Contract = this.drift.contract({ abi: mockErc4626Abi, address, diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts index 8210dab29..4a397e4fd 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts @@ -1,10 +1,10 @@ import { ContractReadOptions } from "@delvtech/drift"; -import { ReadModel, ReadModelOptions } from "src/model/ReadModel"; +import { ReadClient, ReadClientOptions } from "src/client/ReadClient"; import { ReadToken } from "src/token/ReadToken"; -export interface ReadEthOptions extends ReadModelOptions {} +export interface ReadEthOptions extends ReadClientOptions {} -export class ReadEth extends ReadModel implements ReadToken { +export class ReadEth extends ReadClient implements ReadToken { static address = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" as const; address = ReadEth.address; diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts index a7514179f..367cfa996 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts @@ -1,10 +1,10 @@ import { Drift, ReadWriteAdapter } from "@delvtech/drift"; +import { ReadWriteClientOptions } from "src/client/ReadWriteClient"; import { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; -import { ReadWriteModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadEth } from "src/token/eth/ReadEth"; -export interface ReadWriteEthOptions extends ReadWriteModelOptions {} +export interface ReadWriteEthOptions extends ReadWriteClientOptions {} export class ReadWriteEth extends ReadEth implements ReadWriteToken { declare drift: Drift; diff --git a/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts b/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts index 85e9c694d..dadbc9f19 100644 --- a/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts +++ b/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts @@ -62,9 +62,9 @@ export function readStEthMixin>( address, cache, cacheNamespace, - ...modelOptions + ...rest } = options as ReadErc20Options; - super({ debugName, address, cache, cacheNamespace, ...modelOptions }); + super({ debugName, address, cache, cacheNamespace, ...rest }); this.stEthContract = this.drift.contract({ abi: stEthAbi, address, diff --git a/packages/hyperdrive-viem/src/viem/viemReadMixin.ts b/packages/hyperdrive-viem/src/viem/viemReadMixin.ts index 19aa2027e..a457521f4 100644 --- a/packages/hyperdrive-viem/src/viem/viemReadMixin.ts +++ b/packages/hyperdrive-viem/src/viem/viemReadMixin.ts @@ -1,22 +1,17 @@ -import { - createCachedReadContract, - createNetwork, -} from "@delvtech/evm-client-viem"; +import { Pretty } from "@delvtech/drift"; import { Constructor, - ContractFactoryOptions, ReadContractModelOptions, ReadModelOptions, } from "@delvtech/hyperdrive-js-core"; import { PublicClient } from "viem"; -import { Prettify } from "viem/chains"; export type ViemReadMixin = new ( - options: ViemReadModelOptions[0]> + options: ViemReadModelOptions[0]>, ) => InstanceType; export function viemReadMixin( - Base: T + Base: T, ): ViemReadMixin { return class extends (Base as Constructor) { constructor(...[options, ...restArgs]: any[]) { @@ -35,7 +30,7 @@ export function viemReadMixin( network: createNetwork(publicClient), ...restOptions, }, - ...restArgs + ...restArgs, ); } } as ViemReadMixin; @@ -45,10 +40,9 @@ export type ReadContractModelConstructor = new ( ...args: [options: ReadContractModelOptions, ...any[]] ) => any; -export type ViemReadModelOptions = Prettify< - // Replace the properties the mixin will create with the ones it will use to - // create them. - Omit & { +// Replace the `drift` option with `publicClient` +export type ViemReadModelOptions = Pretty< + Omit & { publicClient: PublicClient; } >; From 2d7bfa6dff106e250cc0ffde8be1641a4396f7ff Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 19:01:22 -0600 Subject: [PATCH 12/43] Remove evm-client from sdk core --- packages/hyperdrive-js-core/package.json | 4 +--- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index dda1ba613..71824fa53 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -11,8 +11,7 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "@delvtech/drift": "^0.0.1-beta.6", - "@delvtech/evm-client": "^0.5.1" + "@delvtech/drift": "^0.0.1-beta.6" }, "dependencies": { "@delvtech/fixed-point-wasm": "^0.0.6", @@ -23,7 +22,6 @@ }, "devDependencies": { "@delvtech/drift": "^0.0.1-beta.6", - "@delvtech/evm-client": "^0.5.1", "@hyperdrive/eslint-config": "*", "@hyperdrive/prettier-config": "*", "@hyperdrive/tsconfig": "*", diff --git a/yarn.lock b/yarn.lock index db505174d..911d784b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1486,7 +1486,7 @@ dependencies: "@delvtech/evm-client" "0.5.1" -"@delvtech/evm-client@0.5.1", "@delvtech/evm-client@^0.5.1": +"@delvtech/evm-client@0.5.1": version "0.5.1" resolved "https://registry.yarnpkg.com/@delvtech/evm-client/-/evm-client-0.5.1.tgz#b69bd04ecb9f1690c1ce94acb7362e4d30b9e1e5" integrity sha512-Ixx7coKko1l9i2CkrrkhzRVnxzf+b3ROEppWvN7Q0+Gx3DLq1lq8oorXjZb5dZhs5K07LtJM7sUJLztxx8BIEA== From 2019ba213401a3a63f0f1c038e9d88b9d5b29744 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 19:02:31 -0600 Subject: [PATCH 13/43] Add drift to viem sdk --- packages/hyperdrive-viem/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index ff5a27881..0c83cb876 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -12,6 +12,8 @@ "viem": "^2.7.8" }, "dependencies": { + "@delvtech/drift": "^0.0.1-beta.6", + "@delvtech/drift-viem": "^0.0.1-beta.6", "@delvtech/hyperdrive-js-core": "3.0.6", "@delvtech/evm-client-viem": "^0.6.3" }, From e66521f57ff2245e6e657dbc399a7948cd3bdb74 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 21:22:12 -0600 Subject: [PATCH 14/43] Refactor hyperdrive-viem to drift --- packages/hyperdrive-viem/package.json | 31 +--- .../hyperdrive-viem/src/exports/factory.ts | 9 - .../hyperdrive-viem/src/exports/hyperdrive.ts | 44 ----- packages/hyperdrive-viem/src/exports/index.ts | 156 ++++++++++++++++-- .../hyperdrive-viem/src/exports/registry.ts | 9 - packages/hyperdrive-viem/src/exports/token.ts | 2 - .../{v1.0.14/hyperdrive.ts => v1.0.14.ts} | 0 .../src/exports/v1.0.14/index.ts | 1 - packages/hyperdrive-viem/src/factory.ts | 19 ++- .../hyperdrive-viem/src/hyperdrive/base.ts | 19 ++- .../hyperdrive-viem/src/hyperdrive/erc4626.ts | 15 +- .../hyperdrive-viem/src/hyperdrive/ezeth.ts | 9 +- .../hyperdrive-viem/src/hyperdrive/lseth.ts | 9 +- .../hyperdrive-viem/src/hyperdrive/reth.ts | 11 +- .../hyperdrive-viem/src/hyperdrive/steth.ts | 17 +- .../src/hyperdrive/v1.0.14/base.ts | 9 +- .../src/hyperdrive/v1.0.14/erc4626.ts | 15 +- .../src/hyperdrive/v1.0.14/ezeth.ts | 9 +- .../src/hyperdrive/v1.0.14/lseth.ts | 9 +- .../src/hyperdrive/v1.0.14/reth.ts | 9 +- .../src/hyperdrive/v1.0.14/steth.ts | 9 +- packages/hyperdrive-viem/src/registry.ts | 22 ++- .../hyperdrive-viem/src/viem/viemReadMixin.ts | 70 ++++---- .../src/viem/viemReadWriteMixin.ts | 86 +++++----- packages/hyperdrive-viem/tsup.config.ts | 16 +- 25 files changed, 343 insertions(+), 262 deletions(-) delete mode 100644 packages/hyperdrive-viem/src/exports/factory.ts delete mode 100644 packages/hyperdrive-viem/src/exports/hyperdrive.ts delete mode 100644 packages/hyperdrive-viem/src/exports/registry.ts delete mode 100644 packages/hyperdrive-viem/src/exports/token.ts rename packages/hyperdrive-viem/src/exports/{v1.0.14/hyperdrive.ts => v1.0.14.ts} (100%) delete mode 100644 packages/hyperdrive-viem/src/exports/v1.0.14/index.ts diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index 0c83cb876..ee3b2a8ff 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -33,33 +33,16 @@ ], "exports": { ".": { - "import": "./dist/index.js", - "require": "./dist/index.js" - }, - "./factory": { - "import": "./dist/factory.js", - "require": "./dist/factory.js" - }, - "./hyperdrive": { - "import": "./dist/hyperdrive.js", - "require": "./dist/hyperdrive.js" - }, - "./registry": { - "import": "./dist/registry.js", - "require": "./dist/registry.js" - }, - "./token": { - "import": "./dist/token.js", - "require": "./dist/token.js" + "types": "./dist/index.d.ts", + "default": "./dist/index.js", + "require": "./dist/index.cjs" }, "./v1.0.14": { - "import": "./dist/v1.0.14/index.js", - "require": "./dist/v1.0.14/index.js" + "types": "./dist/v1.0.14.d.ts", + "default": "./dist/v1.0.14.js", + "require": "./dist/v1.0.14.cjs" }, - "./v1.0.14/*": { - "import": "./dist/v1.0.14/*.js", - "require": "./dist/v1.0.14/*.js" - } + "./package.json": "./package.json" }, "publishConfig": { "access": "public" diff --git a/packages/hyperdrive-viem/src/exports/factory.ts b/packages/hyperdrive-viem/src/exports/factory.ts deleted file mode 100644 index a67b59bb6..000000000 --- a/packages/hyperdrive-viem/src/exports/factory.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { - ReadFactory, - ReadWriteFactory, - type ReadFactoryOptions, - type ReadWriteFactoryOptions, -} from "src/factory"; - -// re-exports -export * from "@delvtech/hyperdrive-js-core/factory/rest"; diff --git a/packages/hyperdrive-viem/src/exports/hyperdrive.ts b/packages/hyperdrive-viem/src/exports/hyperdrive.ts deleted file mode 100644 index 69e50f8b5..000000000 --- a/packages/hyperdrive-viem/src/exports/hyperdrive.ts +++ /dev/null @@ -1,44 +0,0 @@ -// base -export { - ReadHyperdrive, - ReadWriteHyperdrive, - type ReadHyperdriveOptions, - type ReadWriteHyperdriveOptions, -} from "src/hyperdrive/base"; - -// erc-4626 -export { - ReadErc4626Hyperdrive, - ReadMockErc4626Hyperdrive, - ReadWriteErc4626Hyperdrive, - ReadWriteMockErc4626Hyperdrive, -} from "src/hyperdrive/erc4626"; - -// ezeth -export { - ReadEzEthHyperdrive, - ReadWriteEzEthHyperdrive, -} from "src/hyperdrive/ezeth"; - -// lseth -export { - ReadLsEthHyperdrive, - ReadWriteLsEthHyperdrive, -} from "src/hyperdrive/lseth"; - -// reth -export { - ReadREthHyperdrive, - ReadWriteREthHyperdrive, -} from "src/hyperdrive/reth"; - -// steth -export { - ReadStEthHyperdrive, - ReadWriteStEthHyperdrive, - type ReadStEthHyperdriveOptions, - type ReadWriteStEthHyperdriveOptions, -} from "src/hyperdrive/steth"; - -// re-exports -export * from "@delvtech/hyperdrive-js-core/hyperdrive/rest"; diff --git a/packages/hyperdrive-viem/src/exports/index.ts b/packages/hyperdrive-viem/src/exports/index.ts index 432a95c54..b7cfdede1 100644 --- a/packages/hyperdrive-viem/src/exports/index.ts +++ b/packages/hyperdrive-viem/src/exports/index.ts @@ -1,14 +1,142 @@ -// models -export * from "./factory"; -export * from "./hyperdrive"; -export * from "./registry"; -export * from "./token"; - -// re-exports -export * from "@delvtech/hyperdrive-js-core/contract"; -export * from "@delvtech/hyperdrive-js-core/errors"; -export * from "@delvtech/hyperdrive-js-core/model"; -export * from "@delvtech/hyperdrive-js-core/utils"; - -// client re-exports -export * from "@delvtech/evm-client-viem"; +import { + ReadClientOptions as BaseReadClientOptions, + ReadWriteClientOptions as BaseReadWriteClientOptions, +} from "@delvtech/hyperdrive-js-core"; +import { ViemReadClientOptions } from "src/viem/viemReadMixin"; +import { ViemReadWriteClientOptions } from "src/viem/viemReadWriteMixin"; + +// Factory +export { + ReadFactory, + ReadWriteFactory, + type ReadFactoryOptions, + type ReadWriteFactoryOptions, +} from "src/factory"; + +// Registry +export { + ReadRegistry, + ReadWriteRegistry, + type ReadRegistryOptions, + type ReadWriteRegistryOptions, +} from "src/registry"; + +// Hyperdrive // + +// base +export { + ReadHyperdrive, + ReadWriteHyperdrive, + type ReadHyperdriveOptions, + type ReadWriteHyperdriveOptions, +} from "src/hyperdrive/base"; + +// erc-4626 +export { + ReadErc4626Hyperdrive, + ReadMockErc4626Hyperdrive, + ReadWriteErc4626Hyperdrive, + ReadWriteMockErc4626Hyperdrive, +} from "src/hyperdrive/erc4626"; + +// ezeth +export { + ReadEzEthHyperdrive, + ReadWriteEzEthHyperdrive, +} from "src/hyperdrive/ezeth"; + +// lseth +export { + ReadLsEthHyperdrive, + ReadWriteLsEthHyperdrive, +} from "src/hyperdrive/lseth"; + +// reth +export { + ReadREthHyperdrive, + ReadWriteREthHyperdrive, +} from "src/hyperdrive/reth"; + +// steth +export { + ReadStEthHyperdrive, + ReadWriteStEthHyperdrive, + type ReadStEthHyperdriveOptions, + type ReadWriteStEthHyperdriveOptions, +} from "src/hyperdrive/steth"; + +// Client +export type ReadClientOptions = ViemReadClientOptions; +export type ReadWriteClientOptions = + ViemReadWriteClientOptions; + +// Re-exports // + +export type { BaseReadClientOptions, BaseReadWriteClientOptions }; + +export { + adjustAmountByPercentage, + BlockNotFoundError, + calculateAprFromPrice, + calculateMatureLongYieldAfterFees, + erc20Abi, + erc4626Abi, + ezEthHyperdriveAbi, + factoryAbi, + getHprFromApr, + getHprFromApy, + hyperdriveAbi, + HyperdriveSdkError, + lsEthAbi, + MethodNotImplementedError, + mockErc4626Abi, + ReadClient, + ReadErc20, + ReadErc4626, + ReadEth, + ReadLsEth, + ReadMockErc4626, + ReadREth, + ReadStEth, + ReadWriteClient, + ReadWriteErc20, + ReadWriteErc4626, + ReadWriteEth, + ReadWriteLsEth, + ReadWriteMockErc4626, + ReadWriteREth, + ReadWriteStEth, + registryAbi, + rEthAbi, + stEthAbi, + type ClosedLong, + type ClosedLpShares, + type ClosedShort, + type Constructor, + type ContractClientOptions, + type Erc20Abi, + type Erc4626Abi, + type EzEthHyperdriveAbi, + type FactoryAbi, + type HyperdriveAbi, + type Long, + type LsEthAbi, + type MockErc4626Abi, + type OpenLongPositionReceived, + type OpenShort, + type PoolConfig, + type PoolInfo, + type ReadContractClientOptions, + type ReadErc20Options, + type ReadEthOptions, + type ReadToken, + type ReadWriteContractClientOptions, + type ReadWriteErc20Options, + type ReadWriteEthOptions, + type ReadWriteToken, + type RedeemedWithdrawalShares, + type RegistryAbi, + type REthAbi, + type Short, + type StEthAbi, +} from "@delvtech/hyperdrive-js-core"; diff --git a/packages/hyperdrive-viem/src/exports/registry.ts b/packages/hyperdrive-viem/src/exports/registry.ts deleted file mode 100644 index 950df4bb1..000000000 --- a/packages/hyperdrive-viem/src/exports/registry.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { - ReadRegistry, - ReadWriteRegistry, - type ReadRegistryOptions, - type ReadWriteRegistryOptions, -} from "src/registry"; - -// re-exports -export * from "@delvtech/hyperdrive-js-core/registry/rest"; diff --git a/packages/hyperdrive-viem/src/exports/token.ts b/packages/hyperdrive-viem/src/exports/token.ts deleted file mode 100644 index 5ca60eb46..000000000 --- a/packages/hyperdrive-viem/src/exports/token.ts +++ /dev/null @@ -1,2 +0,0 @@ -// re-exports -export * from "@delvtech/hyperdrive-js-core/token/index"; diff --git a/packages/hyperdrive-viem/src/exports/v1.0.14/hyperdrive.ts b/packages/hyperdrive-viem/src/exports/v1.0.14.ts similarity index 100% rename from packages/hyperdrive-viem/src/exports/v1.0.14/hyperdrive.ts rename to packages/hyperdrive-viem/src/exports/v1.0.14.ts diff --git a/packages/hyperdrive-viem/src/exports/v1.0.14/index.ts b/packages/hyperdrive-viem/src/exports/v1.0.14/index.ts deleted file mode 100644 index 85fbc6375..000000000 --- a/packages/hyperdrive-viem/src/exports/v1.0.14/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./hyperdrive"; diff --git a/packages/hyperdrive-viem/src/factory.ts b/packages/hyperdrive-viem/src/factory.ts index 007d757a7..0f9c6c78f 100644 --- a/packages/hyperdrive-viem/src/factory.ts +++ b/packages/hyperdrive-viem/src/factory.ts @@ -1,18 +1,23 @@ -import * as core from "@delvtech/hyperdrive-js-core/factory/model"; -import { viemReadMixin, ViemReadModelOptions } from "src/viem/viemReadMixin"; import { + ReadFactory as BaseReadFactory, + ReadFactoryOptions as BaseReadFactoryOptions, + ReadWriteFactory as BaseReadWriteFactory, + ReadWriteFactoryOptions as BaseReadWriteFactoryOptions, +} from "@delvtech/hyperdrive-js-core"; +import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; +import { + ViemReadWriteClientOptions, viemReadWriteMixin, - ViemReadWriteModelOptions, } from "src/viem/viemReadWriteMixin"; export interface ReadFactoryOptions - extends ViemReadModelOptions {} + extends ViemReadClientOptions {} -export class ReadFactory extends viemReadMixin(core.ReadFactory) {} +export class ReadFactory extends viemReadMixin(BaseReadFactory) {} export interface ReadWriteFactoryOptions - extends ViemReadWriteModelOptions {} + extends ViemReadWriteClientOptions {} export class ReadWriteFactory extends viemReadWriteMixin( - core.ReadWriteFactory + BaseReadWriteFactory, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/base.ts b/packages/hyperdrive-viem/src/hyperdrive/base.ts index 71a41997a..41e194f3f 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/base.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/base.ts @@ -1,18 +1,23 @@ -import * as core from "@delvtech/hyperdrive-js-core"; -import { viemReadMixin, ViemReadModelOptions } from "src/viem/viemReadMixin"; import { + ReadHyperdrive as BaseReadHyperdrive, + ReadHyperdriveOptions as BaseReadHyperdriveOptions, + ReadWriteHyperdrive as BaseReadWriteHyperdrive, + ReadWriteHyperdriveOptions as BaseReadWriteHyperdriveOptions, +} from "@delvtech/hyperdrive-js-core"; +import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; +import { + ViemReadWriteClientOptions, viemReadWriteMixin, - ViemReadWriteModelOptions, } from "src/viem/viemReadWriteMixin"; export interface ReadHyperdriveOptions - extends ViemReadModelOptions {} + extends ViemReadClientOptions {} -export class ReadHyperdrive extends viemReadMixin(core.ReadHyperdrive) {} +export class ReadHyperdrive extends viemReadMixin(BaseReadHyperdrive) {} export interface ReadWriteHyperdriveOptions - extends ViemReadWriteModelOptions {} + extends ViemReadWriteClientOptions {} export class ReadWriteHyperdrive extends viemReadWriteMixin( - core.ReadWriteHyperdrive + BaseReadWriteHyperdrive, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts b/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts index ebeee4858..ed3b40184 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts @@ -1,19 +1,24 @@ -import * as core from "@delvtech/hyperdrive-js-core/hyperdrive/model"; +import { + ReadErc4626Hyperdrive as BaseReadErc4626Hyperdrive, + ReadMockErc4626Hyperdrive as BaseReadMockErc4626Hyperdrive, + ReadWriteErc4626Hyperdrive as BaseReadWriteErc4626Hyperdrive, + ReadWriteMockErc4626Hyperdrive as BaseReadWriteMockErc4626Hyperdrive, +} from "@delvtech/hyperdrive-js-core"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadErc4626Hyperdrive extends viemReadMixin( - core.ReadErc4626Hyperdrive + BaseReadErc4626Hyperdrive, ) {} export class ReadWriteErc4626Hyperdrive extends viemReadWriteMixin( - core.ReadWriteErc4626Hyperdrive + BaseReadWriteErc4626Hyperdrive, ) {} export class ReadMockErc4626Hyperdrive extends viemReadMixin( - core.ReadMockErc4626Hyperdrive + BaseReadMockErc4626Hyperdrive, ) {} export class ReadWriteMockErc4626Hyperdrive extends viemReadWriteMixin( - core.ReadWriteMockErc4626Hyperdrive + BaseReadWriteMockErc4626Hyperdrive, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts b/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts index 99726f973..fbc5b27c4 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts @@ -1,11 +1,14 @@ -import * as core from "@delvtech/hyperdrive-js-core"; +import { + ReadEzEthHyperdrive as BaseReadEzEthHyperdrive, + ReadWriteEzEthHyperdrive as BaseReadWriteEzEthHyperdrive, +} from "@delvtech/hyperdrive-js-core"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadEzEthHyperdrive extends viemReadMixin( - core.ReadEzEthHyperdrive + BaseReadEzEthHyperdrive, ) {} export class ReadWriteEzEthHyperdrive extends viemReadWriteMixin( - core.ReadWriteEzEthHyperdrive + BaseReadWriteEzEthHyperdrive, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/lseth.ts b/packages/hyperdrive-viem/src/hyperdrive/lseth.ts index ec498c050..a33269018 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/lseth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/lseth.ts @@ -1,11 +1,14 @@ -import * as core from "@delvtech/hyperdrive-js-core"; +import { + ReadLsEthHyperdrive as BaseReadLsEthHyperdrive, + ReadWriteLsEthHyperdrive as BaseReadWriteLsEthHyperdrive, +} from "@delvtech/hyperdrive-js-core"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadLsEthHyperdrive extends viemReadMixin( - core.ReadLsEthHyperdrive + BaseReadLsEthHyperdrive, ) {} export class ReadWriteLsEthHyperdrive extends viemReadWriteMixin( - core.ReadWriteLsEthHyperdrive + BaseReadWriteLsEthHyperdrive, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/reth.ts b/packages/hyperdrive-viem/src/hyperdrive/reth.ts index 2c542c85d..60e3ff523 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/reth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/reth.ts @@ -1,11 +1,12 @@ -import * as core from "@delvtech/hyperdrive-js-core"; +import { + ReadREthHyperdrive as BaseReadREthHyperdrive, + ReadWriteREthHyperdrive as BaseReadWriteREthHyperdrive, +} from "@delvtech/hyperdrive-js-core"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; -export class ReadREthHyperdrive extends viemReadMixin( - core.ReadREthHyperdrive -) {} +export class ReadREthHyperdrive extends viemReadMixin(BaseReadREthHyperdrive) {} export class ReadWriteREthHyperdrive extends viemReadWriteMixin( - core.ReadWriteREthHyperdrive + BaseReadWriteREthHyperdrive, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/steth.ts b/packages/hyperdrive-viem/src/hyperdrive/steth.ts index 0f0d7babb..ac1e57b01 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/steth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/steth.ts @@ -1,17 +1,22 @@ -import * as core from "@delvtech/hyperdrive-js-core"; -import { viemReadMixin, ViemReadModelOptions } from "src/viem/viemReadMixin"; +import { + ReadStEthHyperdrive as BaseReadStEthHyperdrive, + ReadStEthHyperdriveOptions as BaseReadStEthHyperdriveOptions, + ReadWriteStEthHyperdrive as BaseReadWriteStEthHyperdrive, + ReadWriteStEthHyperdriveOptions as BaseReadWriteStEthHyperdriveOptions, +} from "@delvtech/hyperdrive-js-core"; +import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export interface ReadStEthHyperdriveOptions - extends ViemReadModelOptions {} + extends ViemReadClientOptions {} export class ReadStEthHyperdrive extends viemReadMixin( - core.ReadStEthHyperdrive + BaseReadStEthHyperdrive, ) {} export interface ReadWriteStEthHyperdriveOptions - extends ViemReadModelOptions {} + extends ViemReadClientOptions {} export class ReadWriteStEthHyperdrive extends viemReadWriteMixin( - core.ReadWriteStEthHyperdrive + BaseReadWriteStEthHyperdrive, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts index f44eddf21..0f77a1460 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts @@ -1,11 +1,14 @@ -import * as core from "@delvtech/hyperdrive-js-core/v1.0.14"; +import { + ReadHyperdrive_v1_0_14 as BaseReadHyperdrive_v1_0_14, + ReadWriteHyperdrive_v1_0_14 as BaseReadWriteHyperdrive_v1_0_14, +} from "@delvtech/hyperdrive-js-core/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadHyperdrive_v1_0_14 extends viemReadMixin( - core.ReadHyperdrive_v1_0_14 + BaseReadHyperdrive_v1_0_14, ) {} export class ReadWriteHyperdrive_v1_0_14 extends viemReadWriteMixin( - core.ReadWriteHyperdrive_v1_0_14 + BaseReadWriteHyperdrive_v1_0_14, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts index b4f974a9b..c2efe1857 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts @@ -1,19 +1,24 @@ -import * as core from "@delvtech/hyperdrive-js-core/v1.0.14"; +import { + ReadErc4626Hyperdrive_v1_0_14 as BaseReadErc4626Hyperdrive_v1_0_14, + ReadMockErc4626Hyperdrive_v1_0_14 as BaseReadMockErc4626Hyperdrive_v1_0_14, + ReadWriteErc4626Hyperdrive_v1_0_14 as BaseReadWriteErc4626Hyperdrive_v1_0_14, + ReadWriteMockErc4626Hyperdrive_v1_0_14 as BaseReadWriteMockErc4626Hyperdrive_v1_0_14, +} from "@delvtech/hyperdrive-js-core/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadErc4626Hyperdrive_v1_0_14 extends viemReadMixin( - core.ReadErc4626Hyperdrive_v1_0_14 + BaseReadErc4626Hyperdrive_v1_0_14, ) {} export class ReadWriteErc4626Hyperdrive_v1_0_14 extends viemReadWriteMixin( - core.ReadWriteErc4626Hyperdrive_v1_0_14 + BaseReadWriteErc4626Hyperdrive_v1_0_14, ) {} export class ReadMockErc4626Hyperdrive_v1_0_14 extends viemReadMixin( - core.ReadMockErc4626Hyperdrive_v1_0_14 + BaseReadMockErc4626Hyperdrive_v1_0_14, ) {} export class ReadWriteMockErc4626Hyperdrive_v1_0_14 extends viemReadWriteMixin( - core.ReadWriteMockErc4626Hyperdrive_v1_0_14 + BaseReadWriteMockErc4626Hyperdrive_v1_0_14, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts index 16bee02cc..ff7a2e094 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts @@ -1,11 +1,14 @@ -import * as core from "@delvtech/hyperdrive-js-core/v1.0.14"; +import { + ReadEzEthHyperdrive_v1_0_14 as BaseReadEzEthHyperdrive_v1_0_14, + ReadWriteEzEthHyperdrive_v1_0_14 as BaseReadWriteEzEthHyperdrive_v1_0_14, +} from "@delvtech/hyperdrive-js-core/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadEzEthHyperdrive_v1_0_14 extends viemReadMixin( - core.ReadEzEthHyperdrive_v1_0_14 + BaseReadEzEthHyperdrive_v1_0_14, ) {} export class ReadWriteEzEthHyperdrive_v1_0_14 extends viemReadWriteMixin( - core.ReadWriteEzEthHyperdrive_v1_0_14 + BaseReadWriteEzEthHyperdrive_v1_0_14, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts index 156393c44..caae010af 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts @@ -1,11 +1,14 @@ -import * as core from "@delvtech/hyperdrive-js-core/v1.0.14"; +import { + ReadLsEthHyperdrive_v1_0_14 as BaseReadLsEthHyperdrive_v1_0_14, + ReadWriteLsEthHyperdrive_v1_0_14 as BaseReadWriteLsEthHyperdrive_v1_0_14, +} from "@delvtech/hyperdrive-js-core/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadLsEthHyperdrive_v1_0_14 extends viemReadMixin( - core.ReadLsEthHyperdrive_v1_0_14 + BaseReadLsEthHyperdrive_v1_0_14, ) {} export class ReadWriteLsEthHyperdrive_v1_0_14 extends viemReadWriteMixin( - core.ReadWriteLsEthHyperdrive_v1_0_14 + BaseReadWriteLsEthHyperdrive_v1_0_14, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts index 06b6fd259..c61010265 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts @@ -1,11 +1,14 @@ -import * as core from "@delvtech/hyperdrive-js-core/v1.0.14"; +import { + ReadREthHyperdrive_v1_0_14 as BaseReadREthHyperdrive_v1_0_14, + ReadWriteREthHyperdrive_v1_0_14 as BaseReadWriteREthHyperdrive_v1_0_14, +} from "@delvtech/hyperdrive-js-core/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadREthHyperdrive_v1_0_14 extends viemReadMixin( - core.ReadREthHyperdrive_v1_0_14 + BaseReadREthHyperdrive_v1_0_14, ) {} export class ReadWriteREthHyperdrive_v1_0_14 extends viemReadWriteMixin( - core.ReadWriteREthHyperdrive_v1_0_14 + BaseReadWriteREthHyperdrive_v1_0_14, ) {} diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts index d51b8e35f..0423b2473 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts @@ -1,11 +1,14 @@ -import * as core from "@delvtech/hyperdrive-js-core/v1.0.14"; +import { + ReadStEthHyperdrive_v1_0_14 as BaseReadStEthHyperdrive_v1_0_14, + ReadWriteStEthHyperdrive_v1_0_14 as BaseReadWriteStEthHyperdrive_v1_0_14, +} from "@delvtech/hyperdrive-js-core/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; export class ReadStEthHyperdrive_v1_0_14 extends viemReadMixin( - core.ReadStEthHyperdrive_v1_0_14 + BaseReadStEthHyperdrive_v1_0_14, ) {} export class ReadWriteStEthHyperdrive_v1_0_14 extends viemReadWriteMixin( - core.ReadWriteStEthHyperdrive_v1_0_14 + BaseReadWriteStEthHyperdrive_v1_0_14, ) {} diff --git a/packages/hyperdrive-viem/src/registry.ts b/packages/hyperdrive-viem/src/registry.ts index 2f3e878d6..56e9dbbb2 100644 --- a/packages/hyperdrive-viem/src/registry.ts +++ b/packages/hyperdrive-viem/src/registry.ts @@ -1,15 +1,23 @@ -import * as core from "@delvtech/hyperdrive-js-core/registry/model"; -import { viemReadMixin, ViemReadModelOptions } from "src/viem/viemReadMixin"; -import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; +import { + ReadRegistry as BaseReadRegistry, + ReadRegistryOptions as BaseReadRegistryOptions, + ReadWriteRegistry as BaseReadWriteRegistry, + ReadWriteRegistryOptions as BaseReadWriteRegistryOptions, +} from "@delvtech/hyperdrive-js-core"; +import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; +import { + ViemReadWriteClientOptions, + viemReadWriteMixin, +} from "src/viem/viemReadWriteMixin"; export type ReadRegistryOptions = - ViemReadModelOptions; + ViemReadClientOptions; -export class ReadRegistry extends viemReadMixin(core.ReadRegistry) {} +export class ReadRegistry extends viemReadMixin(BaseReadRegistry) {} export type ReadWriteRegistryOptions = - ViemReadModelOptions; + ViemReadWriteClientOptions; export class ReadWriteRegistry extends viemReadWriteMixin( - core.ReadWriteRegistry + BaseReadWriteRegistry, ) {} diff --git a/packages/hyperdrive-viem/src/viem/viemReadMixin.ts b/packages/hyperdrive-viem/src/viem/viemReadMixin.ts index a457521f4..922ada9fb 100644 --- a/packages/hyperdrive-viem/src/viem/viemReadMixin.ts +++ b/packages/hyperdrive-viem/src/viem/viemReadMixin.ts @@ -1,48 +1,46 @@ -import { Pretty } from "@delvtech/drift"; +import { Drift, Pretty } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; import { Constructor, - ReadContractModelOptions, - ReadModelOptions, + ReadClient, + ReadClientOptions, } from "@delvtech/hyperdrive-js-core"; import { PublicClient } from "viem"; -export type ViemReadMixin = new ( - options: ViemReadModelOptions[0]>, -) => InstanceType; +// Replace the `drift` option with `publicClient`. +export type ViemReadClientOptions = Pretty< + Omit & { + publicClient: PublicClient; + } +>; -export function viemReadMixin( +/** + * A mixin that overrides a read client's `drift` option with a `publicClient` + * option. + */ +export function viemReadMixin>( Base: T, -): ViemReadMixin { +): ViemReadClientConstructor { return class extends (Base as Constructor) { constructor(...[options, ...restArgs]: any[]) { - const { publicClient, cache, namespace, ...restOptions } = - options as ViemReadModelOptions; - super( - { - contractFactory: (options: ContractFactoryOptions) => { - return createCachedReadContract({ - publicClient, - cache, - namespace, - ...options, - }); - }, - network: createNetwork(publicClient), - ...restOptions, - }, - ...restArgs, - ); + const { publicClient, ...restOptions } = + options as ViemReadClientOptions; + + const clientOptions: ReadClientOptions = { + // TODO: Fix type casting needed for conflicting viem versions + drift: new Drift(viemAdapter({ publicClient: publicClient as any })), + ...restOptions, + }; + + super(clientOptions, ...restArgs); } - } as ViemReadMixin; + } as ViemReadClientConstructor; } -export type ReadContractModelConstructor = new ( - ...args: [options: ReadContractModelOptions, ...any[]] -) => any; - -// Replace the `drift` option with `publicClient` -export type ViemReadModelOptions = Pretty< - Omit & { - publicClient: PublicClient; - } ->; +// A `ReadClient` class constructor that takes a `publicClient` instead of a +// `drift` option. +export type ViemReadClientConstructor> = + Constructor< + InstanceType, + [options: ViemReadClientOptions[0]>] + >; diff --git a/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts b/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts index 6099b746b..b92524ec7 100644 --- a/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts +++ b/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts @@ -1,58 +1,50 @@ -import { - createCachedReadWriteContract, - createNetwork, -} from "@delvtech/evm-client-viem"; +import { Drift, Pretty, ReadWriteAdapter } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; import { Constructor, - ContractFactoryOptions, - ReadWriteContractModelOptions, - ReadWriteModelOptions, + ReadWriteClient, + ReadWriteClientOptions, } from "@delvtech/hyperdrive-js-core"; import { PublicClient, WalletClient } from "viem"; -import { Prettify } from "viem/chains"; -export type ViemReadWriteMixin = - new ( - options: ViemReadWriteModelOptions[0]> - ) => InstanceType; +// Replace the `drift` option with `publicClient` and `walletClient`. +export type ViemReadWriteClientOptions = + Pretty< + Omit & { + publicClient: PublicClient; + walletClient: WalletClient; + } + >; -export function viemReadWriteMixin( - Base: T -): ViemReadWriteMixin { +export function viemReadWriteMixin>( + Base: T, +): ViemReadWriteClientConstructor { return class extends (Base as Constructor) { constructor(...[options, ...restArgs]: any[]) { - const { publicClient, walletClient, cache, namespace, ...restOptions } = - options as ViemReadWriteModelOptions; - super( - { - contractFactory: (options: ContractFactoryOptions) => { - return createCachedReadWriteContract({ - publicClient, - walletClient, - cache, - namespace, - ...options, - }); - }, - network: createNetwork(publicClient), - ...restOptions, - }, - ...restArgs - ); - } - } as ViemReadWriteMixin; -} + const { publicClient, walletClient, ...restOptions } = + options as ViemReadWriteClientOptions; -export type ReadWriteContractModelConstructor = new ( - ...args: [options: ReadWriteContractModelOptions, ...any[]] -) => any; + const clientOptions: ReadWriteClientOptions = { + // TODO: Fix type casting needed for conflicting viem versions + drift: new Drift( + viemAdapter({ + publicClient: publicClient as any, + walletClient: walletClient as any, + }) as ReadWriteAdapter, + ), + ...restOptions, + }; -export type ViemReadWriteModelOptions = - Prettify< - // Replace the properties the wrapper will create with the ones it will use - // to create them. - Omit & { - publicClient: PublicClient; - walletClient: WalletClient; + super(clientOptions, ...restArgs); } - >; + } as ViemReadWriteClientConstructor; +} + +// A `ReadWriteClient` class constructor that takes a `publicClient` instead of +// a `drift` option. +export type ViemReadWriteClientConstructor< + T extends Constructor, +> = Constructor< + InstanceType, + [options: ViemReadWriteClientOptions[0]>] +>; diff --git a/packages/hyperdrive-viem/tsup.config.ts b/packages/hyperdrive-viem/tsup.config.ts index 5c5a22e9e..07ca24f96 100644 --- a/packages/hyperdrive-viem/tsup.config.ts +++ b/packages/hyperdrive-viem/tsup.config.ts @@ -1,19 +1,9 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: [ - "src/exports/index.ts", - - "src/exports/factory.ts", - "src/exports/hyperdrive.ts", - "src/exports/registry.ts", - "src/exports/token.ts", - - // v1.0.14 - "src/exports/v1.0.14/index.ts", - "src/exports/v1.0.14/hyperdrive.ts", - ], - format: ["esm"], + entry: ["src/exports/index.ts", "src/exports/v1.0.14.ts"], + format: ["esm", "cjs"], + sourcemap: true, dts: true, clean: true, minify: true, From cc8d7452b1242409ff7701553df7113105c2777d Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 22:45:58 -0600 Subject: [PATCH 15/43] Remove evm-client from viem sdk --- packages/hyperdrive-viem/package.json | 3 +-- yarn.lock | 19 +------------------ 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index ee3b2a8ff..29e344a6e 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -14,8 +14,7 @@ "dependencies": { "@delvtech/drift": "^0.0.1-beta.6", "@delvtech/drift-viem": "^0.0.1-beta.6", - "@delvtech/hyperdrive-js-core": "3.0.6", - "@delvtech/evm-client-viem": "^0.6.3" + "@delvtech/hyperdrive-js-core": "3.0.6" }, "devDependencies": { "@hyperdrive/eslint-config": "*", diff --git a/yarn.lock b/yarn.lock index 911d784b7..bb65ab36b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,23 +1479,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@delvtech/evm-client-viem@^0.6.3": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@delvtech/evm-client-viem/-/evm-client-viem-0.6.3.tgz#9b45833cd509fe676df5b765126bf6dc3c19413e" - integrity sha512-n2qVLGk7v4WPIHsvwaWTmjVyK1pmkzoFu/jqxXhgHD8ArWCccfXu3LGpRUFT7LVI/ksshW7hnMbvJ3r5mpZuzA== - dependencies: - "@delvtech/evm-client" "0.5.1" - -"@delvtech/evm-client@0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@delvtech/evm-client/-/evm-client-0.5.1.tgz#b69bd04ecb9f1690c1ce94acb7362e4d30b9e1e5" - integrity sha512-Ixx7coKko1l9i2CkrrkhzRVnxzf+b3ROEppWvN7Q0+Gx3DLq1lq8oorXjZb5dZhs5K07LtJM7sUJLztxx8BIEA== - dependencies: - "@types/lodash.ismatch" "^4.4.9" - fast-safe-stringify "^2.1.1" - lodash.ismatch "^4.4.0" - lru-cache "^10.0.1" - "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -9612,7 +9595,7 @@ fast-redact@^3.0.0: resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== -fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.1.1: +fast-safe-stringify@^2.0.6: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== From 6aed48ac1d386c1778b0a82c868ccfa22c5c467b Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 22:14:47 -0600 Subject: [PATCH 16/43] Update appconfig for drift --- .../src/hyperdrives/aero/getAeroHyperdrive.ts | 2 +- .../src/hyperdrives/cbeth/getCbethHyperdrive.ts | 2 +- .../src/hyperdrives/custom/getCustomHyperdrive.ts | 2 +- .../src/hyperdrives/gnosisWsteth/getGnosisWstethHyperdrive.ts | 2 +- .../src/hyperdrives/morpho/getMorphoHyperdrive.ts | 2 +- .../src/hyperdrives/steth/getStethHyperdrive.ts | 4 ++-- .../src/hyperdrives/susds/getSusdsHyperdrive.ts | 2 +- packages/hyperdrive-appconfig/src/tokens/getTokenConfig.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/hyperdrive-appconfig/src/hyperdrives/aero/getAeroHyperdrive.ts b/packages/hyperdrive-appconfig/src/hyperdrives/aero/getAeroHyperdrive.ts index 7aeec9714..eea53321b 100644 --- a/packages/hyperdrive-appconfig/src/hyperdrives/aero/getAeroHyperdrive.ts +++ b/packages/hyperdrive-appconfig/src/hyperdrives/aero/getAeroHyperdrive.ts @@ -41,7 +41,7 @@ export async function getAeroLpHyperdrive({ // safe to cast here because we know the pool was initialized const initializationBlock = await hyperdrive.getInitializationBlock(); const hyperdriveConfig: HyperdriveConfig = { - chainId: await hyperdrive.network.getChainId(), + chainId: await hyperdrive.drift.getChainId(), kind: await hyperdrive.getKind(), // safe to cast here because we know the pool was initialized initializationBlock: initializationBlock.blockNumber as bigint, diff --git a/packages/hyperdrive-appconfig/src/hyperdrives/cbeth/getCbethHyperdrive.ts b/packages/hyperdrive-appconfig/src/hyperdrives/cbeth/getCbethHyperdrive.ts index f39369d4e..19a6b285f 100644 --- a/packages/hyperdrive-appconfig/src/hyperdrives/cbeth/getCbethHyperdrive.ts +++ b/packages/hyperdrive-appconfig/src/hyperdrives/cbeth/getCbethHyperdrive.ts @@ -18,7 +18,7 @@ export async function getCbethHyperdrive({ sharesTokenConfig: TokenConfig; hyperdriveConfig: HyperdriveConfig; }> { - const chainId = await hyperdrive.network.getChainId(); + const chainId = await hyperdrive.drift.getChainId(); const version = await hyperdrive.getVersion(); const poolConfig = await hyperdrive.getPoolConfig(); diff --git a/packages/hyperdrive-appconfig/src/hyperdrives/custom/getCustomHyperdrive.ts b/packages/hyperdrive-appconfig/src/hyperdrives/custom/getCustomHyperdrive.ts index 80fef4d00..208ffd5f7 100644 --- a/packages/hyperdrive-appconfig/src/hyperdrives/custom/getCustomHyperdrive.ts +++ b/packages/hyperdrive-appconfig/src/hyperdrives/custom/getCustomHyperdrive.ts @@ -65,7 +65,7 @@ export async function getCustomHyperdrive({ }); const hyperdriveConfig: HyperdriveConfig = { - chainId: await hyperdrive.network.getChainId(), + chainId: await hyperdrive.drift.getChainId(), kind: await hyperdrive.getKind(), address: hyperdrive.address, version: version.string, diff --git a/packages/hyperdrive-appconfig/src/hyperdrives/gnosisWsteth/getGnosisWstethHyperdrive.ts b/packages/hyperdrive-appconfig/src/hyperdrives/gnosisWsteth/getGnosisWstethHyperdrive.ts index 5d8be638d..dbc18700a 100644 --- a/packages/hyperdrive-appconfig/src/hyperdrives/gnosisWsteth/getGnosisWstethHyperdrive.ts +++ b/packages/hyperdrive-appconfig/src/hyperdrives/gnosisWsteth/getGnosisWstethHyperdrive.ts @@ -18,7 +18,7 @@ export async function getGnosisWstethHyperdrive({ sharesTokenConfig: TokenConfig; hyperdriveConfig: HyperdriveConfig; }> { - const chainId = await hyperdrive.network.getChainId(); + const chainId = await hyperdrive.drift.getChainId(); const version = await hyperdrive.getVersion(); const poolConfig = await hyperdrive.getPoolConfig(); diff --git a/packages/hyperdrive-appconfig/src/hyperdrives/morpho/getMorphoHyperdrive.ts b/packages/hyperdrive-appconfig/src/hyperdrives/morpho/getMorphoHyperdrive.ts index 03593806f..923ed048f 100644 --- a/packages/hyperdrive-appconfig/src/hyperdrives/morpho/getMorphoHyperdrive.ts +++ b/packages/hyperdrive-appconfig/src/hyperdrives/morpho/getMorphoHyperdrive.ts @@ -41,7 +41,7 @@ export async function getMorphoHyperdrive({ // safe to cast here because we know the pool was initialized const initializationBlock = await hyperdrive.getInitializationBlock(); const hyperdriveConfig: HyperdriveConfig = { - chainId: await hyperdrive.network.getChainId(), + chainId: await hyperdrive.drift.getChainId(), kind: await hyperdrive.getKind(), // safe to cast here because we know the pool was initialized initializationBlock: initializationBlock.blockNumber as bigint, diff --git a/packages/hyperdrive-appconfig/src/hyperdrives/steth/getStethHyperdrive.ts b/packages/hyperdrive-appconfig/src/hyperdrives/steth/getStethHyperdrive.ts index 30984bc5e..1678e3e31 100644 --- a/packages/hyperdrive-appconfig/src/hyperdrives/steth/getStethHyperdrive.ts +++ b/packages/hyperdrive-appconfig/src/hyperdrives/steth/getStethHyperdrive.ts @@ -15,7 +15,7 @@ export async function getStethHyperdrive({ baseTokenConfig: TokenConfig; hyperdriveConfig: HyperdriveConfig; }> { - const chainId = await hyperdrive.network.getChainId(); + const chainId = await hyperdrive.drift.getChainId(); const version = await hyperdrive.getVersion(); const poolConfig = await hyperdrive.getPoolConfig(); @@ -31,7 +31,7 @@ export async function getStethHyperdrive({ const baseTokenConfig: TokenConfig = { address: poolConfig.baseToken, - chainId: await hyperdrive.network.getChainId(), + chainId: await hyperdrive.drift.getChainId(), name: "Ether", symbol: "ETH", decimals: 18, diff --git a/packages/hyperdrive-appconfig/src/hyperdrives/susds/getSusdsHyperdrive.ts b/packages/hyperdrive-appconfig/src/hyperdrives/susds/getSusdsHyperdrive.ts index 79741ab5d..5ad95f606 100644 --- a/packages/hyperdrive-appconfig/src/hyperdrives/susds/getSusdsHyperdrive.ts +++ b/packages/hyperdrive-appconfig/src/hyperdrives/susds/getSusdsHyperdrive.ts @@ -41,7 +41,7 @@ export async function getSusdsHyperdrive({ // safe to cast here because we know the pool was initialized const initializationBlock = await hyperdrive.getInitializationBlock(); const hyperdriveConfig: HyperdriveConfig = { - chainId: await hyperdrive.network.getChainId(), + chainId: await hyperdrive.drift.getChainId(), kind: await hyperdrive.getKind(), // safe to cast here because we know the pool was initialized initializationBlock: initializationBlock.blockNumber as bigint, diff --git a/packages/hyperdrive-appconfig/src/tokens/getTokenConfig.ts b/packages/hyperdrive-appconfig/src/tokens/getTokenConfig.ts index b32a565de..36ac24ed2 100644 --- a/packages/hyperdrive-appconfig/src/tokens/getTokenConfig.ts +++ b/packages/hyperdrive-appconfig/src/tokens/getTokenConfig.ts @@ -13,7 +13,7 @@ export async function getTokenConfig({ places: number; }): Promise { return { - chainId: await token.network.getChainId(), + chainId: await token.drift.getChainId(), address: token.address, decimals: await token.getDecimals(), places, From 063164935132b0c81bfd0ae634c9d261bb1c4fc5 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 23:16:04 -0600 Subject: [PATCH 17/43] Add drift to UI, update SDK usage --- apps/hyperdrive-trading/package.json | 1 + .../src/hyperdrive/getLpApy.ts | 5 +- .../src/hyperdrive/getReadHyperdrive.ts | 2 +- .../src/hyperdrive/getReadWriteHyperdrive.ts | 2 +- .../src/hyperdrive/getYieldSourceRate.ts | 7 +- apps/hyperdrive-trading/src/sdk/sdkCache.ts | 2 +- .../src/ui/chainlog/FactoriesTable.tsx | 2 +- .../src/ui/chainlog/PoolsTable.tsx | 2 +- .../hyperdrive/longs/hooks/useCloseLong.tsx | 46 ++++++------ .../ui/hyperdrive/longs/hooks/useFixedRate.ts | 7 +- .../ui/hyperdrive/longs/hooks/useOpenLong.tsx | 53 ++++++++------ .../hyperdrive/lp/hooks/useAddLiquidity.tsx | 51 +++++++------ .../lp/hooks/useRedeemWithdrawalShares.ts | 26 ++++--- .../lp/hooks/useRemoveLiquidity.tsx | 49 +++++++------ .../OpenShortsTable/ShortRateAndSizeCell.tsx | 2 +- .../hyperdrive/shorts/hooks/useCloseShort.tsx | 49 +++++++------ .../hyperdrive/shorts/hooks/useOpenShort.tsx | 73 ++++++++++--------- 17 files changed, 210 insertions(+), 169 deletions(-) diff --git a/apps/hyperdrive-trading/package.json b/apps/hyperdrive-trading/package.json index 1a4d31822..e5c722105 100644 --- a/apps/hyperdrive-trading/package.json +++ b/apps/hyperdrive-trading/package.json @@ -28,6 +28,7 @@ "gen:walletconnect": "bash ./scripts/generate-walletconnect.sh" }, "dependencies": { + "@delvtech/drift": "^0.0.1-beta.6", "@delvtech/fixed-point-wasm": "^0.0.6", "@delvtech/hyperdrive-appconfig": "^0.0.1", "@delvtech/hyperdrive-viem": "^3.0.6", diff --git a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts index 027005f4e..48ecf8dba 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts @@ -1,10 +1,11 @@ +import { Block } from "@delvtech/drift"; import { fixed } from "@delvtech/fixed-point-wasm"; import { appConfig, getRewardsFn, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { Block, ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; import { getPublicClient } from "@wagmi/core"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; import { isForkChain } from "src/chains/isForkChain"; @@ -45,7 +46,7 @@ export async function getLpApy({ readHyperdrive: ReadHyperdrive; hyperdrive: HyperdriveConfig; }): Promise { - const currentBlock = (await readHyperdrive.network.getBlock()) as Block; + const currentBlock = (await readHyperdrive.drift.getBlock()) as Block; const currentBlockNumber = currentBlock.blockNumber!; // Appconfig tells us how many days to look back for historical rates const numBlocksForHistoricalRate = isForkChain(hyperdrive.chainId) diff --git a/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts b/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts index e457da5c7..ffd27b5be 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts @@ -36,7 +36,7 @@ export async function getReadHyperdrive({ address: hyperdriveAddress, publicClient, cache: sdkCache, - namespace: publicClient.chain?.id.toString(), + cacheNamespace: publicClient.chain?.id.toString(), earliestBlock: hyperdriveConfig.initializationBlock, }; diff --git a/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts b/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts index af33447d8..be6b13293 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts @@ -38,7 +38,7 @@ export async function getReadWriteHyperdrive({ publicClient, walletClient, cache: sdkCache, - namespace: publicClient.chain?.id.toString(), + cacheNamespace: publicClient.chain?.id.toString(), earliestBlock: hyperdriveConfig.initializationBlock, }; diff --git a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts index bca577f14..a43cde013 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts @@ -1,3 +1,4 @@ +import { Block } from "@delvtech/drift"; import { fixed } from "@delvtech/fixed-point-wasm"; import { AppConfig, @@ -5,7 +6,7 @@ import { getRewardsFn, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { Block, ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; import { getPublicClient } from "@wagmi/core"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; import { isForkChain } from "src/chains/isForkChain"; @@ -16,7 +17,7 @@ export async function getYieldSourceRate( readHyperdrive: ReadHyperdrive, appConfig: AppConfig, ): Promise<{ rate: bigint; ratePeriodDays: number; netRate: bigint }> { - const hyperdriveChainId = await readHyperdrive.network.getChainId(); + const hyperdriveChainId = await readHyperdrive.drift.getChainId(); const hyperdrive = findHyperdriveConfig({ hyperdriveChainId, hyperdriveAddress: readHyperdrive.address, @@ -28,7 +29,7 @@ export async function getYieldSourceRate( hyperdrive, }); - const currentBlock = (await readHyperdrive.network.getBlock()) as Block; + const currentBlock = (await readHyperdrive.drift.getBlock()) as Block; const initializationBlock = hyperdrive.initializationBlock; const isPoolYoungerThanOneRatePeriod = diff --git a/apps/hyperdrive-trading/src/sdk/sdkCache.ts b/apps/hyperdrive-trading/src/sdk/sdkCache.ts index 38ef4bcc6..0cca2c799 100644 --- a/apps/hyperdrive-trading/src/sdk/sdkCache.ts +++ b/apps/hyperdrive-trading/src/sdk/sdkCache.ts @@ -1,4 +1,4 @@ -import { createLruSimpleCache } from "@delvtech/hyperdrive-viem"; +import { createLruSimpleCache } from "@delvtech/drift"; // 1 minute TTL to match the queryClient's staleTime export const sdkCache = createLruSimpleCache({ max: 500, ttl: 60_000 }); diff --git a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx index e09cfdf46..bf5569958 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx @@ -187,7 +187,7 @@ function useFactoriesQuery(): UseQueryResult { address: connectedAppConfig.registries[chainId], publicClient, cache: sdkCache, - namespace: chainId.toString(), + cacheNamespace: chainId.toString(), }); const factoryAddresses = await registry.getFactoryAddresses(); diff --git a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx index cb337a561..e08719f36 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx @@ -233,7 +233,7 @@ function usePoolsQuery(): UseQueryResult { address: connectedAppConfig.registries[chainId], publicClient, cache: sdkCache, - namespace: chainId.toString(), + cacheNamespace: chainId.toString(), }); return registry.getInstances().then((instances) => { diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useCloseLong.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useCloseLong.tsx index 1989c88ef..ea6f491b9 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useCloseLong.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useCloseLong.tsx @@ -87,27 +87,31 @@ export function useCloseLong({ maturityTime, asBase, }, - onTransactionCompleted: (txHash: Hash) => { - queryClient.invalidateQueries(); - toast.success( - , - { id: hash, duration: SUCCESS_TOAST_DURATION }, - ); - toastWarpcast(); - onExecuted?.(txHash); - window.plausible("transactionSuccess", { - props: { - transactionHash: txHash, - transactionType: "close", - positionType: "long", - poolAddress: hyperdriveAddress, - chainId, - }, - }); + options: { + onMined: (receipt) => { + queryClient.invalidateQueries(); + if (receipt?.status === "success") { + toast.success( + , + { id: hash, duration: SUCCESS_TOAST_DURATION }, + ); + toastWarpcast(); + onExecuted?.(receipt.transactionHash); + window.plausible("transactionSuccess", { + props: { + transactionHash: receipt.transactionHash, + transactionType: "close", + positionType: "long", + poolAddress: hyperdriveAddress, + chainId, + }, + }); + } + }, }, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts index 05ec95cae..1b5d0d567 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts @@ -1,3 +1,4 @@ +import { BlockTag } from "@delvtech/drift"; import { appConfig, findHyperdriveConfig, @@ -14,11 +15,11 @@ import { Address } from "viem"; export function useFixedRate({ chainId, hyperdriveAddress, - blockNumber, + block, }: { chainId: number; hyperdriveAddress: Address; - blockNumber?: bigint; + block?: BlockTag | bigint; }): { fixedApr: { apr: bigint; formatted: string } | undefined; fixedRoi: { roi: bigint; formatted: string } | undefined; @@ -40,7 +41,7 @@ export function useFixedRate({ queryKey: makeQueryKey("fixedApr", { chainId, address: hyperdriveAddress }), queryFn: queryEnabled ? async () => { - const fixedApr = await readHyperdrive.getFixedApr({ blockNumber }); + const fixedApr = await readHyperdrive.getFixedApr({ block }); const fixedRoi = getHprFromApr( fixedApr, hyperdrive.poolConfig.positionDuration, diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLong.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLong.tsx index 878a3f343..cb4062958 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLong.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLong.tsx @@ -89,30 +89,35 @@ export function useOpenLong({ }, options: { value: ethValue, - }, - onTransactionCompleted: (txHash) => { - queryClient.invalidateQueries(); - toast.success( - , - { id: txHash, duration: SUCCESS_TOAST_DURATION }, - ); - setTimeout(() => { - toastWarpcast(); - }, SUCCESS_TOAST_DURATION); - onExecuted?.(txHash); - window.plausible("transactionSuccess", { - props: { - transactionHash: txHash, - transactionType: "open", - positionType: "long", - poolAddress: hyperdriveAddress, - chainId, - }, - }); + onMined: (receipt) => { + queryClient.invalidateQueries(); + if (receipt?.status === "success") { + toast.success( + , + { + id: receipt.transactionHash, + duration: SUCCESS_TOAST_DURATION, + }, + ); + setTimeout(() => { + toastWarpcast(); + }, SUCCESS_TOAST_DURATION); + onExecuted?.(receipt.transactionHash); + window.plausible("transactionSuccess", { + props: { + transactionHash: receipt.transactionHash, + transactionType: "open", + positionType: "long", + poolAddress: hyperdriveAddress, + chainId, + }, + }); + } + }, }, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useAddLiquidity.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useAddLiquidity.tsx index ae4ca7939..dbdb45ebd 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useAddLiquidity.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useAddLiquidity.tsx @@ -92,28 +92,35 @@ export function useAddLiquidity({ maxApr, destination, }, - options: { value: ethValue }, - onTransactionCompleted: (txHash: Hash) => { - queryClient.invalidateQueries(); - toast.success( - , - { id: txHash, duration: SUCCESS_TOAST_DURATION }, - ); - toastWarpcast(); - onExecuted?.(txHash); - window.plausible("transactionSuccess", { - props: { - transactionHash: txHash, - transactionType: "open", - positionType: "lp", - poolAddress: hyperdriveAddress, - chainId, - }, - }); + options: { + value: ethValue, + onMined: (receipt) => { + queryClient.invalidateQueries(); + if (receipt?.status === "success") { + toast.success( + , + { + id: receipt.transactionHash, + duration: SUCCESS_TOAST_DURATION, + }, + ); + toastWarpcast(); + onExecuted?.(receipt.transactionHash); + window.plausible("transactionSuccess", { + props: { + transactionHash: receipt.transactionHash, + transactionType: "open", + positionType: "lp", + poolAddress: hyperdriveAddress, + chainId, + }, + }); + } + }, }, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemWithdrawalShares.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemWithdrawalShares.ts index 564886991..3a8bc47e4 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemWithdrawalShares.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemWithdrawalShares.ts @@ -77,17 +77,21 @@ export function useRedeemWithdrawalShares({ destination, asBase, }, - onTransactionCompleted: (transactionHash) => { - queryClient.invalidateQueries(); - window.plausible("transactionSuccess", { - props: { - transactionHash, - transactionType: "close", - positionType: "lp", - poolAddress: hyperdriveAddress, - chainId, - }, - }); + options: { + onMined: (receipt) => { + queryClient.invalidateQueries(); + if (receipt?.status === "success") { + window.plausible("transactionSuccess", { + props: { + transactionHash: receipt.transactionHash, + transactionType: "close", + positionType: "lp", + poolAddress: hyperdriveAddress, + chainId, + }, + }); + } + }, }, }); addTransaction({ diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRemoveLiquidity.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRemoveLiquidity.tsx index dc2ad79be..da3988da9 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRemoveLiquidity.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRemoveLiquidity.tsx @@ -80,27 +80,34 @@ export function useRemoveLiquidity({ minOutputPerShare: finalMinOutputPerShare, destination, }, - onTransactionCompleted: (txHash: Hash) => { - queryClient.invalidateQueries(); - toast.success( - , - { id: txHash, duration: SUCCESS_TOAST_DURATION }, - ); - toastWarpcast(); - onExecuted?.(txHash); - window.plausible("transactionSuccess", { - props: { - transactionHash: txHash, - transactionType: "close", - positionType: "lp", - poolAddress: hyperdriveAddress, - chainId, - }, - }); + options: { + onMined: (receipt) => { + queryClient.invalidateQueries(); + if (receipt?.status === "success") { + toast.success( + , + { + id: receipt.transactionHash, + duration: SUCCESS_TOAST_DURATION, + }, + ); + toastWarpcast(); + onExecuted?.(receipt.transactionHash); + window.plausible("transactionSuccess", { + props: { + transactionHash: receipt.transactionHash, + transactionType: "close", + positionType: "lp", + poolAddress: hyperdriveAddress, + chainId, + }, + }); + } + }, }, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx index e5133dba4..c26e74e62 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx @@ -33,7 +33,7 @@ export function ShortRateAndSizeCell({ const { fixedApr } = useFixedRate({ chainId: hyperdrive.chainId, hyperdriveAddress: hyperdrive.address, - blockNumber: maturityBlock?.number, + block: maturityBlock?.number, }); const rateDifference = (fixedApr?.apr || 0n) - short.fixedRatePaid; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useCloseShort.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useCloseShort.tsx index f472a9461..543374fe8 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useCloseShort.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useCloseShort.tsx @@ -83,27 +83,34 @@ export function useCloseShort({ destination, maturityTime, }, - onTransactionCompleted: (txHash: Hash) => { - queryClient.invalidateQueries(); - toast.success( - , - { id: txHash, duration: SUCCESS_TOAST_DURATION }, - ); - toastWarpcast(); - onExecuted?.(txHash); - window.plausible("transactionSuccess", { - props: { - transactionHash: hash, - transactionType: "close", - positionType: "short", - poolAddress: hyperdriveAddress, - chainId, - }, - }); + options: { + onMined: (receipt) => { + queryClient.invalidateQueries(); + if (receipt?.status === "success") { + toast.success( + , + { + id: receipt.transactionHash, + duration: SUCCESS_TOAST_DURATION, + }, + ); + toastWarpcast(); + onExecuted?.(receipt.transactionHash); + window.plausible("transactionSuccess", { + props: { + transactionHash: receipt.transactionHash, + transactionType: "close", + positionType: "short", + poolAddress: hyperdriveAddress, + chainId, + }, + }); + } + }, }, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx index 58f789096..07495f134 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx @@ -72,19 +72,6 @@ export function useOpenShort({ return; } - const openShortOptions = { - value: ethValue - ? // Pad the eth value by 1% so that the tx goes through, the - // contract will refund any amount that it doesn't spend - adjustAmountByPercentage({ - amount: ethValue, - decimals: 18, - direction: "up", - percentage: parseUnits("1", 18), - }) - : undefined, - }; - // All shares need to be prepared before going into the sdk const finalMaxDeposit = asBase ? maxDeposit @@ -103,28 +90,44 @@ export function useOpenShort({ minVaultSharePrice, maxDeposit: finalMaxDeposit, }, - options: openShortOptions, - onTransactionCompleted: (txHash: `0x${string}`) => { - queryClient.invalidateQueries(); - toast.success( - , - { id: txHash, duration: SUCCESS_TOAST_DURATION }, - ); - toastWarpcast(); - onExecuted?.(txHash); - window.plausible("transactionSuccess", { - props: { - transactionHash: txHash, - transactionType: "open", - positionType: "short", - poolAddress: hyperdriveAddress, - chainId, - }, - }); + options: { + value: ethValue + ? // Pad the eth value by 1% so that the tx goes through, the + // contract will refund any amount that it doesn't spend + adjustAmountByPercentage({ + amount: ethValue, + decimals: 18, + direction: "up", + percentage: parseUnits("1", 18), + }) + : undefined, + onMined: (receipt) => { + queryClient.invalidateQueries(); + if (receipt?.status === "success") { + toast.success( + , + { + id: receipt.transactionHash, + duration: SUCCESS_TOAST_DURATION, + }, + ); + toastWarpcast(); + onExecuted?.(receipt.transactionHash); + window.plausible("transactionSuccess", { + props: { + transactionHash: receipt.transactionHash, + transactionType: "open", + positionType: "short", + poolAddress: hyperdriveAddress, + chainId, + }, + }); + } + }, }, }); From 6d1bf99c69e1f2d15ec35d41e740aa3c2a6806d5 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Tue, 5 Nov 2024 23:50:33 -0600 Subject: [PATCH 18/43] Fix ReadClient --- packages/hyperdrive-js-core/src/client/ReadClient.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/hyperdrive-js-core/src/client/ReadClient.ts b/packages/hyperdrive-js-core/src/client/ReadClient.ts index 3ab9d0768..515130daa 100644 --- a/packages/hyperdrive-js-core/src/client/ReadClient.ts +++ b/packages/hyperdrive-js-core/src/client/ReadClient.ts @@ -33,8 +33,9 @@ export class ReadClient { // Override the contract factory to ensure that events are fetched from the // earliest block if necessary. if (earliestBlock) { + const originalContractFactory = this.drift.contract; this.drift.contract = (options) => { - const contract = this.drift.contract(options); + const contract = originalContractFactory(options); // Override the getEvents method const originalGetEvents = contract.getEvents; From a3eabf6926ec65cea44cdea456650aab5265bd31 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 00:40:27 -0600 Subject: [PATCH 19/43] Remove symlinks, bump drift versions --- apps/hyperdrive-trading/package.json | 2 +- packages/drift | 1 - packages/drift-viem | 1 - packages/hyperdrive-js-core/package.json | 4 +- packages/hyperdrive-viem/package.json | 4 +- packages/typescript-config.drift | 1 - yarn.lock | 550 +---------------------- 7 files changed, 23 insertions(+), 540 deletions(-) delete mode 120000 packages/drift delete mode 120000 packages/drift-viem delete mode 120000 packages/typescript-config.drift diff --git a/apps/hyperdrive-trading/package.json b/apps/hyperdrive-trading/package.json index e5c722105..8f847e9b2 100644 --- a/apps/hyperdrive-trading/package.json +++ b/apps/hyperdrive-trading/package.json @@ -28,7 +28,7 @@ "gen:walletconnect": "bash ./scripts/generate-walletconnect.sh" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.6", + "@delvtech/drift": "^0.0.1-beta.7", "@delvtech/fixed-point-wasm": "^0.0.6", "@delvtech/hyperdrive-appconfig": "^0.0.1", "@delvtech/hyperdrive-viem": "^3.0.6", diff --git a/packages/drift b/packages/drift deleted file mode 120000 index b0ebb30d3..000000000 --- a/packages/drift +++ /dev/null @@ -1 +0,0 @@ -../../drift/packages/drift \ No newline at end of file diff --git a/packages/drift-viem b/packages/drift-viem deleted file mode 120000 index efd26b159..000000000 --- a/packages/drift-viem +++ /dev/null @@ -1 +0,0 @@ -../../drift/packages/drift-viem \ No newline at end of file diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index 71824fa53..7c2d5bde0 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -11,7 +11,7 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "@delvtech/drift": "^0.0.1-beta.6" + "@delvtech/drift": "^0.0.1-beta.7" }, "dependencies": { "@delvtech/fixed-point-wasm": "^0.0.6", @@ -21,7 +21,7 @@ "lodash.mapvalues": "^4.6.0" }, "devDependencies": { - "@delvtech/drift": "^0.0.1-beta.6", + "@delvtech/drift": "^0.0.1-beta.7", "@hyperdrive/eslint-config": "*", "@hyperdrive/prettier-config": "*", "@hyperdrive/tsconfig": "*", diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index 29e344a6e..b4e2aa672 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -12,8 +12,8 @@ "viem": "^2.7.8" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.6", - "@delvtech/drift-viem": "^0.0.1-beta.6", + "@delvtech/drift": "^0.0.1-beta.7", + "@delvtech/drift-viem": "^0.0.1-beta.7", "@delvtech/hyperdrive-js-core": "3.0.6" }, "devDependencies": { diff --git a/packages/typescript-config.drift b/packages/typescript-config.drift deleted file mode 120000 index 7ae9ea41f..000000000 --- a/packages/typescript-config.drift +++ /dev/null @@ -1 +0,0 @@ -../../drift/packages/typescript-config \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index bb65ab36b..253fb2b7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,6 +1479,20 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@delvtech/drift-viem@^0.0.1-beta.7": + version "0.0.1-beta.7" + resolved "https://registry.yarnpkg.com/@delvtech/drift-viem/-/drift-viem-0.0.1-beta.7.tgz#b2d751a4625494f5f4c3416db83452199f2ea299" + integrity sha512-WVXSTzhi/kviFatpw0m7DiSeMN0GJg7jYp/n+wiKtmiwq6h0S6fqsbSkycW4lrcEVT8t16gh648IsXmitZydCw== + +"@delvtech/drift@^0.0.1-beta.7": + version "0.0.1-beta.7" + resolved "https://registry.yarnpkg.com/@delvtech/drift/-/drift-0.0.1-beta.7.tgz#798df3ff4803f6b518c2d056ab1ef3680d28fba8" + integrity sha512-bR7EkszcfKsfWAD9WYCNoG8UBRecdhou7eswsZCeRJjgJNZw9AhsaeBZtrqWhaCSD9cfYuXILKkjIPIKTVdT4g== + dependencies: + lodash.ismatch "^4.4.0" + lru-cache "^10.0.1" + safe-stable-stringify "^2.5.0" + "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -2071,11 +2085,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== -"@esbuild/aix-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" - integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== - "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" @@ -2096,11 +2105,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== -"@esbuild/android-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" - integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== - "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" @@ -2121,11 +2125,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== -"@esbuild/android-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" - integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== - "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" @@ -2146,11 +2145,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== -"@esbuild/android-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" - integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== - "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" @@ -2171,11 +2165,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== -"@esbuild/darwin-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" - integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== - "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" @@ -2196,11 +2185,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== -"@esbuild/darwin-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" - integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== - "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" @@ -2221,11 +2205,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== -"@esbuild/freebsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" - integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== - "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" @@ -2246,11 +2225,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== -"@esbuild/freebsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" - integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== - "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" @@ -2271,11 +2245,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== -"@esbuild/linux-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" - integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== - "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" @@ -2296,11 +2265,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== -"@esbuild/linux-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" - integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== - "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" @@ -2321,11 +2285,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== -"@esbuild/linux-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" - integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== - "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" @@ -2346,11 +2305,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== -"@esbuild/linux-loong64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" - integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== - "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" @@ -2371,11 +2325,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== -"@esbuild/linux-mips64el@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" - integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== - "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" @@ -2396,11 +2345,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== -"@esbuild/linux-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" - integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== - "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" @@ -2421,11 +2365,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== -"@esbuild/linux-riscv64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" - integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== - "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" @@ -2446,11 +2385,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== -"@esbuild/linux-s390x@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" - integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== - "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" @@ -2471,11 +2405,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== -"@esbuild/linux-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" - integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== - "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" @@ -2496,11 +2425,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== -"@esbuild/netbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" - integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== - "@esbuild/openbsd-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" @@ -2511,11 +2435,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== -"@esbuild/openbsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" - integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== - "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" @@ -2536,11 +2455,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== -"@esbuild/openbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" - integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== - "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" @@ -2561,11 +2475,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== -"@esbuild/sunos-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" - integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== - "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" @@ -2586,11 +2495,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== -"@esbuild/win32-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" - integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== - "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" @@ -2611,11 +2515,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== -"@esbuild/win32-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" - integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== - "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" @@ -2636,11 +2535,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== -"@esbuild/win32-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" - integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -3045,11 +2939,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3841,11 +3730,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz#7746deb85e4a8fb54fbfda8ac5c102692f102476" integrity sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww== -"@rollup/rollup-android-arm-eabi@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.3.tgz#49a2a9808074f2683667992aa94b288e0b54fc82" - integrity sha512-ufb2CH2KfBWPJok95frEZZ82LtDl0A6QKTa8MoM+cWwDZvVGl5/jNb79pIhRvAalUu+7LD91VYR0nwRD799HkQ== - "@rollup/rollup-android-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" @@ -3861,11 +3745,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz#93de4d867709d3313794723b5afd91e1e174f906" integrity sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A== -"@rollup/rollup-android-arm64@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.3.tgz#197e3bc01c228d3c23591e0fcedca91f8f398ec1" - integrity sha512-iAHpft/eQk9vkWIV5t22V77d90CRofgR2006UiCjHcHJFVI1E0oBkQIAbz+pLtthFw3hWEmVB4ilxGyBf48i2Q== - "@rollup/rollup-darwin-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" @@ -3881,11 +3760,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz#e41e6a81673260ab196e0f59462b9940a6ac03cd" integrity sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q== -"@rollup/rollup-darwin-arm64@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.3.tgz#16772c0309d0dc3cca716580cdac7a1c560ddf46" - integrity sha512-QPW2YmkWLlvqmOa2OwrfqLJqkHm7kJCIMq9kOz40Zo9Ipi40kf9ONG5Sz76zszrmIZZ4hgRIkez69YnTHgEz1w== - "@rollup/rollup-darwin-x64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" @@ -3901,21 +3775,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz#2b0a0aef6e8c5317d494cfc9076d7a16b099bdcb" integrity sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA== -"@rollup/rollup-darwin-x64@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.3.tgz#4e98120a1c4cda7d4043ccce72347cee53784140" - integrity sha512-KO0pN5x3+uZm1ZXeIfDqwcvnQ9UEGN8JX5ufhmgH5Lz4ujjZMAnxQygZAVGemFWn+ZZC0FQopruV4lqmGMshow== - -"@rollup/rollup-freebsd-arm64@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.3.tgz#27145e414986e216e0d9b9a8d488028f33c39566" - integrity sha512-CsC+ZdIiZCZbBI+aRlWpYJMSWvVssPuWqrDy/zi9YfnatKKSLFCe6fjna1grHuo/nVaHG+kiglpRhyBQYRTK4A== - -"@rollup/rollup-freebsd-x64@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.3.tgz#67e75fd87a903090f038b212273c492e5ca6b32f" - integrity sha512-F0nqiLThcfKvRQhZEzMIXOQG4EeX61im61VYL1jo4eBxv4aZRmpin6crnBJQ/nWnCsjH5F6J3W6Stdm0mBNqBg== - "@rollup/rollup-linux-arm-gnueabihf@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" @@ -3931,11 +3790,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz#e22319deb5367384ef315e66bc6de80d2bf2b3ae" integrity sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q== -"@rollup/rollup-linux-arm-gnueabihf@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.3.tgz#bb45ebadbb9496298ab5461373bde357e8f33e88" - integrity sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A== - "@rollup/rollup-linux-arm-musleabihf@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz#4ba804a00b5e793196a622f6977e05f23e01f59a" @@ -3946,11 +3800,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz#d5dd68f5d7ae21b345a5c87208c94e5c813f54b8" integrity sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw== -"@rollup/rollup-linux-arm-musleabihf@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.3.tgz#384276c23feb0a4d6ffa603a9a760decce8b4118" - integrity sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw== - "@rollup/rollup-linux-arm64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" @@ -3966,11 +3815,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz#1703d3a418d33f8f025acaf93f39ca1efcd5b645" integrity sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw== -"@rollup/rollup-linux-arm64-gnu@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.3.tgz#89e5a4570ddd9eca908324a6de60bd64f904e3f0" - integrity sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ== - "@rollup/rollup-linux-arm64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" @@ -3986,11 +3830,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz#3f59c2c6e60f75ce8b1090bd841c555e3bb01f0e" integrity sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw== -"@rollup/rollup-linux-arm64-musl@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.3.tgz#9ffd7cd6c6c6670d8c039056d6a49ad9f1f66949" - integrity sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw== - "@rollup/rollup-linux-powerpc64le-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz#1540b284d91c440bc9fa7a1714cfb71a5597e94d" @@ -4001,11 +3840,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz#3f99a0921596a6f539121a312df29af52a205f15" integrity sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ== -"@rollup/rollup-linux-powerpc64le-gnu@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.3.tgz#4d32ce982e2d25e3b8116336ad5ce6e270b5a024" - integrity sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g== - "@rollup/rollup-linux-riscv64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" @@ -4021,11 +3855,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz#c08fb3e629d50d2eac31329347cfc559a1cf81d1" integrity sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A== -"@rollup/rollup-linux-riscv64-gnu@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.3.tgz#f43d4e0572397e3d3acd82d77d79ce021dea3310" - integrity sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA== - "@rollup/rollup-linux-s390x-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz#579ca5f271421a961d3c73d221202c79e02ff03a" @@ -4036,11 +3865,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz#173722cd745779d730d4b24d21386185e0e12de8" integrity sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q== -"@rollup/rollup-linux-s390x-gnu@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.3.tgz#264f8a4c206173945bdab2a676d638b7945106a9" - integrity sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw== - "@rollup/rollup-linux-x64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" @@ -4056,11 +3880,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz#0af2b6541ab0f4954d2c4f96bcdc7947420dd28c" integrity sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q== -"@rollup/rollup-linux-x64-gnu@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.3.tgz#e86172a407b2edd41540ec2ae636e497fadccff6" - integrity sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ== - "@rollup/rollup-linux-x64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" @@ -4076,11 +3895,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz#f973f9552744764b221128f7c3629222216ace69" integrity sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q== -"@rollup/rollup-linux-x64-musl@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.3.tgz#8ae9bf78986d1b16ccbc89ab6f2dfa96807d3178" - integrity sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw== - "@rollup/rollup-win32-arm64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" @@ -4096,11 +3910,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz#21ac5ed84d914bc31821fec3dd909f7257cfb17b" integrity sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA== -"@rollup/rollup-win32-arm64-msvc@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.3.tgz#11d6a59f651a3c2a9e5eaab0a99367b77a29c319" - integrity sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA== - "@rollup/rollup-win32-ia32-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" @@ -4116,11 +3925,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz#0cfe740063b35dcd5a62c4e243226631a846ce11" integrity sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ== -"@rollup/rollup-win32-ia32-msvc@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.3.tgz#7ff146e53dc6e388b60329b7ec3335501d2b0f98" - integrity sha512-9SjYp1sPyxJsPWuhOCX6F4jUMXGbVVd5obVpoVEi8ClZqo52ViZewA6eFz85y8ezuOA+uJMP5A5zo6Oz4S5rVQ== - "@rollup/rollup-win32-x64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" @@ -4136,11 +3940,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz#5f2c40d3f1b53ede80fb4e6964f840c0f8936832" integrity sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg== -"@rollup/rollup-win32-x64-msvc@4.24.3": - version "4.24.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.3.tgz#7687335781efe6bee14d6ed8eff9746a9f24c9cd" - integrity sha512-HGZgRFFYrMrP3TJlq58nR1xy8zHKId25vhmm5S9jETEfDf6xybPxsavFTJaufe2zgOGYJBskGlj49CwtEuFhWQ== - "@safe-global/safe-apps-provider@0.18.1": version "0.18.1" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" @@ -4786,11 +4585,6 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/estree@1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - "@types/ethereumjs-util@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@types/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#f49fe8114789ec0871721392c09318c3eb56671b" @@ -4923,13 +4717,6 @@ dependencies: "@types/lodash" "*" -"@types/lodash.ismatch@^4.4.9": - version "4.4.9" - resolved "https://registry.yarnpkg.com/@types/lodash.ismatch/-/lodash.ismatch-4.4.9.tgz#97b4317f7dc3975bb51660a0f9a055ac7b67b134" - integrity sha512-qWihnStOPKH8urljLGm6ZOEdN/5Bt4vxKR81tL3L4ArUNLvcf9RW3QSnPs21eix5BiqioSWq4aAXD4Iep+d0fw== - dependencies: - "@types/lodash" "*" - "@types/lodash.mapvalues@^4.6.9": version "4.6.9" resolved "https://registry.yarnpkg.com/@types/lodash.mapvalues/-/lodash.mapvalues-4.6.9.tgz#1edb4b1d299db332166b474221b06058b34030a7" @@ -5646,25 +5433,6 @@ chai "^5.1.1" tinyrainbow "^1.2.0" -"@vitest/expect@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.4.tgz#48f4f53a01092a3bdc118cff245f79ef388bdd8e" - integrity sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA== - dependencies: - "@vitest/spy" "2.1.4" - "@vitest/utils" "2.1.4" - chai "^5.1.2" - tinyrainbow "^1.2.0" - -"@vitest/mocker@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.4.tgz#0dc07edb9114f7f080a0181fbcdb16cd4a2d855d" - integrity sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ== - dependencies: - "@vitest/spy" "2.1.4" - estree-walker "^3.0.3" - magic-string "^0.30.12" - "@vitest/pretty-format@2.0.4", "@vitest/pretty-format@^2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.4.tgz#9a3934932e7f8ddd836b38c34ddaeec91bd0f82e" @@ -5672,13 +5440,6 @@ dependencies: tinyrainbow "^1.2.0" -"@vitest/pretty-format@2.1.4", "@vitest/pretty-format@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.4.tgz#fc31993bdc1ef5a6c1a4aa6844e7ba55658a4f9f" - integrity sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww== - dependencies: - tinyrainbow "^1.2.0" - "@vitest/runner@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.4.tgz#0b1edb8ab5f81a1c7dfd50090e5e7e971a117891" @@ -5687,14 +5448,6 @@ "@vitest/utils" "2.0.4" pathe "^1.1.2" -"@vitest/runner@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.4.tgz#f9346500bdd0be1c926daaac5d683bae87ceda2c" - integrity sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA== - dependencies: - "@vitest/utils" "2.1.4" - pathe "^1.1.2" - "@vitest/snapshot@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.4.tgz#7d7dea9df17c5c13386f1a7a433b99dc0ffe3c14" @@ -5704,15 +5457,6 @@ magic-string "^0.30.10" pathe "^1.1.2" -"@vitest/snapshot@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.4.tgz#ef8c3f605fbc23a32773256d37d3fdfd9b23d353" - integrity sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q== - dependencies: - "@vitest/pretty-format" "2.1.4" - magic-string "^0.30.12" - pathe "^1.1.2" - "@vitest/spy@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.4.tgz#19083386a741a158c2f142beffe43be68b1375cf" @@ -5720,13 +5464,6 @@ dependencies: tinyspy "^3.0.0" -"@vitest/spy@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.4.tgz#4e90f9783437c5841a27c80f8fd84d7289a6100a" - integrity sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg== - dependencies: - tinyspy "^3.0.2" - "@vitest/utils@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.4.tgz#2db1df35aaeb5caa932770a190df636a68d284d5" @@ -5737,15 +5474,6 @@ loupe "^3.1.1" tinyrainbow "^1.2.0" -"@vitest/utils@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.4.tgz#6d67ac966647a21ce8bc497472ce230de3b64537" - integrity sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg== - dependencies: - "@vitest/pretty-format" "2.1.4" - loupe "^3.1.2" - tinyrainbow "^1.2.0" - "@wagmi/connectors@4.1.18": version "4.1.18" resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-4.1.18.tgz#b95350ff2cb527093ff9dd11d382e0563ec546e3" @@ -6189,11 +5917,6 @@ abitype@^1.0.5: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== -abitype@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" - integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -7141,17 +6864,6 @@ chai@^5.1.1: loupe "^3.1.0" pathval "^2.0.0" -chai@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" - integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - chalk@5.3.0, chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -7249,13 +6961,6 @@ cheerio@^1.0.0-rc.12: optionalDependencies: fsevents "~2.3.2" -chokidar@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" - integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== - dependencies: - readdirp "^4.0.1" - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -8092,13 +7797,6 @@ debug@^4.3.5: dependencies: ms "2.1.2" -debug@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - decache@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da" @@ -8867,36 +8565,6 @@ esbuild@^0.23.0: "@esbuild/win32-ia32" "0.23.0" "@esbuild/win32-x64" "0.23.0" -esbuild@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" - integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.24.0" - "@esbuild/android-arm" "0.24.0" - "@esbuild/android-arm64" "0.24.0" - "@esbuild/android-x64" "0.24.0" - "@esbuild/darwin-arm64" "0.24.0" - "@esbuild/darwin-x64" "0.24.0" - "@esbuild/freebsd-arm64" "0.24.0" - "@esbuild/freebsd-x64" "0.24.0" - "@esbuild/linux-arm" "0.24.0" - "@esbuild/linux-arm64" "0.24.0" - "@esbuild/linux-ia32" "0.24.0" - "@esbuild/linux-loong64" "0.24.0" - "@esbuild/linux-mips64el" "0.24.0" - "@esbuild/linux-ppc64" "0.24.0" - "@esbuild/linux-riscv64" "0.24.0" - "@esbuild/linux-s390x" "0.24.0" - "@esbuild/linux-x64" "0.24.0" - "@esbuild/netbsd-x64" "0.24.0" - "@esbuild/openbsd-arm64" "0.24.0" - "@esbuild/openbsd-x64" "0.24.0" - "@esbuild/sunos-x64" "0.24.0" - "@esbuild/win32-arm64" "0.24.0" - "@esbuild/win32-ia32" "0.24.0" - "@esbuild/win32-x64" "0.24.0" - esbuild@~0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" @@ -9479,11 +9147,6 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" -expect-type@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" - integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== - express@^4.17.3: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" @@ -9575,7 +9238,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-gl merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -9643,11 +9306,6 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -fdir@^6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" - integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== - feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" @@ -11887,11 +11545,6 @@ loupe@^3.1.0, loupe@^3.1.1: dependencies: get-func-name "^2.0.1" -loupe@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" - integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -11955,13 +11608,6 @@ magic-string@^0.30.10: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -magic-string@^0.30.12: - version "0.30.12" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60" - integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - magic-string@^0.30.3: version "0.30.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" @@ -12941,7 +12587,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -13007,17 +12653,6 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nise@^5.1.9: - version "5.1.9" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139" - integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww== - dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^11.2.2" - "@sinonjs/text-encoding" "^0.7.2" - just-extend "^6.2.0" - path-to-regexp "^6.2.1" - nise@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nise/-/nise-6.0.0.tgz#ae56fccb5d912037363c3b3f29ebbfa28bde8b48" @@ -13705,21 +13340,11 @@ picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - pidtree@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -14826,11 +14451,6 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" - integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -15310,33 +14930,6 @@ rollup@^4.19.0: "@rollup/rollup-win32-x64-msvc" "4.19.1" fsevents "~2.3.2" -rollup@^4.24.0: - version "4.24.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.3.tgz#8b259063740af60b0030315f88665ba2041789b8" - integrity sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.24.3" - "@rollup/rollup-android-arm64" "4.24.3" - "@rollup/rollup-darwin-arm64" "4.24.3" - "@rollup/rollup-darwin-x64" "4.24.3" - "@rollup/rollup-freebsd-arm64" "4.24.3" - "@rollup/rollup-freebsd-x64" "4.24.3" - "@rollup/rollup-linux-arm-gnueabihf" "4.24.3" - "@rollup/rollup-linux-arm-musleabihf" "4.24.3" - "@rollup/rollup-linux-arm64-gnu" "4.24.3" - "@rollup/rollup-linux-arm64-musl" "4.24.3" - "@rollup/rollup-linux-powerpc64le-gnu" "4.24.3" - "@rollup/rollup-linux-riscv64-gnu" "4.24.3" - "@rollup/rollup-linux-s390x-gnu" "4.24.3" - "@rollup/rollup-linux-x64-gnu" "4.24.3" - "@rollup/rollup-linux-x64-musl" "4.24.3" - "@rollup/rollup-win32-arm64-msvc" "4.24.3" - "@rollup/rollup-win32-ia32-msvc" "4.24.3" - "@rollup/rollup-win32-x64-msvc" "4.24.3" - fsevents "~2.3.2" - rtl-css-js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -15765,18 +15358,6 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" -sinon@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-17.0.2.tgz#470894bcc2d24b01bad539722ea46da949892405" - integrity sha512-uihLiaB9FhzesElPDFZA7hDcNABzsVHwr3YfmM9sBllVwab3l0ltGlRV1XhpNfIacNDLGD1QRZNLs5nU5+hTuA== - dependencies: - "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^11.2.2" - "@sinonjs/samsam" "^8.0.0" - diff "^5.2.0" - nise "^5.1.9" - supports-color "^7" - sinon@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.0.tgz#69ca293dbc3e82590a8b0d46c97f63ebc1e5fc01" @@ -16540,34 +16121,11 @@ tinybench@^2.8.0: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== -tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyexec@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" - integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== - -tinyglobby@^0.2.9: - version "0.2.10" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" - integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== - dependencies: - fdir "^6.4.2" - picomatch "^4.0.2" - tinypool@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== -tinypool@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" - integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== - tinyrainbow@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" @@ -16578,11 +16136,6 @@ tinyspy@^3.0.0: resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== -tinyspy@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" - integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -16784,28 +16337,6 @@ tsup@^8.2.3: sucrase "^3.35.0" tree-kill "^1.2.2" -tsup@^8.3.0: - version "8.3.5" - resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.3.5.tgz#d55344e4756e924bf6f442e54e7d324b4471eee0" - integrity sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA== - dependencies: - bundle-require "^5.0.0" - cac "^6.7.14" - chokidar "^4.0.1" - consola "^3.2.3" - debug "^4.3.7" - esbuild "^0.24.0" - joycon "^3.1.1" - picocolors "^1.1.1" - postcss-load-config "^6.0.1" - resolve-from "^5.0.0" - rollup "^4.24.0" - source-map "0.8.0-beta.0" - sucrase "^3.35.0" - tinyexec "^0.3.1" - tinyglobby "^0.2.9" - tree-kill "^1.2.2" - tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -17016,7 +16547,7 @@ typedoc@^0.25.7: minimatch "^9.0.3" shiki "^0.14.7" -typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@^5.6.2, typescript@~5.2.2: +typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@~5.2.2: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -17416,7 +16947,7 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" -viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.21.37, viem@^2.7.8, viem@^2.9.2: +viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.7.8, viem@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.2.tgz#29bd2425222be136bf969a90dd3a8d6032221904" integrity sha512-GRakUTNiYE9W+vL+Be9JkQfzWnkczerHtSpEe2JR/jEGTYZAs4shrA4WLgiaVCI9JxpnduZhQfRWNvy2dlyP2g== @@ -17441,16 +16972,6 @@ vite-node@2.0.4: tinyrainbow "^1.2.0" vite "^5.0.0" -vite-node@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.4.tgz#97ffb6de913fd8d42253afe441f9512e9dbdfd5c" - integrity sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg== - dependencies: - cac "^6.7.14" - debug "^4.3.7" - pathe "^1.1.2" - vite "^5.0.0" - vite-plugin-node-polyfills@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz#d0afcf82eb985fc02244620d7cec1ddd1c6e0864" @@ -17468,15 +16989,6 @@ vite-tsconfig-paths@^4.2.0, vite-tsconfig-paths@^4.3.2: globrex "^0.1.2" tsconfck "^3.0.3" -vite-tsconfig-paths@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.0.1.tgz#c9387a29c32fd586e4c7f4e2b2da1f0b5c9a7403" - integrity sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - tsconfck "^3.0.3" - vite@^5.0.0, vite@^5.3.5: version "5.3.5" resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" @@ -17513,32 +17025,6 @@ vitest@^2.0.4: vite-node "2.0.4" why-is-node-running "^2.3.0" -vitest@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.4.tgz#ba8f4589fb639cf5a9e6af54781667312b3e8230" - integrity sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ== - dependencies: - "@vitest/expect" "2.1.4" - "@vitest/mocker" "2.1.4" - "@vitest/pretty-format" "^2.1.4" - "@vitest/runner" "2.1.4" - "@vitest/snapshot" "2.1.4" - "@vitest/spy" "2.1.4" - "@vitest/utils" "2.1.4" - chai "^5.1.2" - debug "^4.3.7" - expect-type "^1.1.0" - magic-string "^0.30.12" - pathe "^1.1.2" - std-env "^3.7.0" - tinybench "^2.9.0" - tinyexec "^0.3.1" - tinypool "^1.0.1" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.1.4" - why-is-node-running "^2.3.0" - vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" From a5286b1dd3d4626dc5ececf423bc440a841c1597 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 02:45:18 -0600 Subject: [PATCH 20/43] Add `getHyperdrive` functions --- .../src/hyperdrive/getReadHyperdrive.ts | 76 ------------- .../src/hyperdrive/getReadWriteHyperdrive.ts | 77 -------------- .../ui/hyperdrive/hooks/useReadHyperdrive.ts | 11 +- .../hooks/useReadWriteHyperdrive.ts | 11 +- .../src/ui/markets/PoolsList.tsx | 9 +- .../src/ui/portfolio/usePortfolioLongsData.ts | 13 ++- .../src/ui/portfolio/usePortfolioLpData.ts | 9 +- .../ui/portfolio/usePortfolioShortsData.ts | 10 +- packages/hyperdrive-js-core/package.json | 3 +- .../hyperdrive-js-core/src/exports/index.ts | 6 ++ .../src/hyperdrive/getHyperdrive.ts | 100 ++++++++++++++++++ packages/hyperdrive-viem/src/exports/index.ts | 6 ++ .../src/hyperdrive/getHyperdrive.ts | 45 ++++++++ 13 files changed, 192 insertions(+), 184 deletions(-) delete mode 100644 apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts delete mode 100644 apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts create mode 100644 packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts create mode 100644 packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts diff --git a/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts b/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts deleted file mode 100644 index ffd27b5be..000000000 --- a/apps/hyperdrive-trading/src/hyperdrive/getReadHyperdrive.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { - AppConfig, - findHyperdriveConfig, -} from "@delvtech/hyperdrive-appconfig"; -import { - ReadHyperdrive, - ReadHyperdriveOptions, - ReadStEthHyperdrive, -} from "@delvtech/hyperdrive-viem"; -import { - ReadHyperdrive_v1_0_14, - ReadStEthHyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-viem/v1.0.14"; -import semver from "semver"; -import { sdkCache } from "src/sdk/sdkCache"; -import { failedRequestToast } from "src/ui/base/components/Toaster/failedRequestToast"; -import { Address, PublicClient } from "viem"; - -export async function getReadHyperdrive({ - hyperdriveAddress, - publicClient, - appConfig, -}: { - hyperdriveAddress: Address; - publicClient: PublicClient; - appConfig: AppConfig; -}): Promise { - let hyperdrive: ReadHyperdrive; - - const hyperdriveConfig = findHyperdriveConfig({ - hyperdriveChainId: publicClient.chain?.id as number, - hyperdriveAddress, - hyperdrives: appConfig.hyperdrives, - }); - const options: ReadHyperdriveOptions = { - address: hyperdriveAddress, - publicClient, - cache: sdkCache, - cacheNamespace: publicClient.chain?.id.toString(), - earliestBlock: hyperdriveConfig.initializationBlock, - }; - - try { - // steth - if (hyperdriveConfig.kind === "StETHHyperdrive") { - hyperdrive = new ReadStEthHyperdrive(options); - - // <= v1.0.14 - if (await isV1_0_14(hyperdrive)) { - return new ReadStEthHyperdrive_v1_0_14(options); - } - - return hyperdrive; - } - - // base - - hyperdrive = new ReadHyperdrive(options); - - // <= v1.0.14 - if (await isV1_0_14(hyperdrive)) { - return new ReadHyperdrive_v1_0_14(options); - } - - return hyperdrive; - } catch (error) { - failedRequestToast(); - console.error(error); - return new ReadHyperdrive(options); - } -} - -async function isV1_0_14(hyperdrive: ReadHyperdrive): Promise { - const version = await hyperdrive.getVersion(); - return semver.lte(version.string, "1.0.14"); -} diff --git a/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts b/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts deleted file mode 100644 index be6b13293..000000000 --- a/apps/hyperdrive-trading/src/hyperdrive/getReadWriteHyperdrive.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { - AppConfig, - findHyperdriveConfig, -} from "@delvtech/hyperdrive-appconfig"; -import { - ReadWriteHyperdrive, - ReadWriteHyperdriveOptions, - ReadWriteStEthHyperdrive, -} from "@delvtech/hyperdrive-viem"; -import { - ReadWriteHyperdrive_v1_0_14, - ReadWriteStEthHyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-viem/v1.0.14"; -import semver from "semver"; -import { sdkCache } from "src/sdk/sdkCache"; -import { failedRequestToast } from "src/ui/base/components/Toaster/failedRequestToast"; -import { Address, PublicClient, WalletClient } from "viem"; - -export async function getReadWriteHyperdrive({ - hyperdriveAddress, - publicClient, - walletClient, - appConfig, -}: { - hyperdriveAddress: Address; - publicClient: PublicClient; - walletClient: WalletClient; - appConfig: AppConfig; -}): Promise { - let hyperdrive: ReadWriteHyperdrive; - const hyperdriveConfig = findHyperdriveConfig({ - hyperdriveChainId: publicClient.chain?.id as number, - hyperdriveAddress, - hyperdrives: appConfig.hyperdrives, - }); - const options: ReadWriteHyperdriveOptions = { - address: hyperdriveAddress, - publicClient, - walletClient, - cache: sdkCache, - cacheNamespace: publicClient.chain?.id.toString(), - earliestBlock: hyperdriveConfig.initializationBlock, - }; - - try { - // steth - if (hyperdriveConfig.kind === "StETHHyperdrive") { - hyperdrive = new ReadWriteStEthHyperdrive(options); - - // <= v1.0.14 - if (await isV1_0_14(hyperdrive)) { - return new ReadWriteStEthHyperdrive_v1_0_14(options); - } - - return hyperdrive; - } - - // base - hyperdrive = new ReadWriteHyperdrive(options); - - // <= v1.0.14 - if (await isV1_0_14(hyperdrive)) { - return new ReadWriteHyperdrive_v1_0_14(options); - } - - return hyperdrive; - } catch (error) { - failedRequestToast(); - console.error(error); - return new ReadWriteHyperdrive(options); - } -} - -async function isV1_0_14(hyperdrive: ReadWriteHyperdrive): Promise { - const version = await hyperdrive.getVersion(); - return semver.lte(version.string, "1.0.14"); -} diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts index 58565fdf0..c9b0f67c6 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts @@ -1,8 +1,7 @@ -import { appConfig } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { getHyperdrive, ReadHyperdrive } from "@delvtech/hyperdrive-viem"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { getReadHyperdrive } from "src/hyperdrive/getReadHyperdrive"; +import { sdkCache } from "src/sdk/sdkCache"; import { Address } from "viem"; import { usePublicClient } from "wagmi"; @@ -25,10 +24,10 @@ export function useReadHyperdrive({ enabled, queryFn: enabled ? () => - getReadHyperdrive({ - hyperdriveAddress: address, + getHyperdrive({ + address, publicClient, - appConfig, + cache: sdkCache, }) : undefined, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts index 913922112..93c9c6437 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts @@ -1,8 +1,7 @@ -import { appConfig } from "@delvtech/hyperdrive-appconfig"; -import { ReadWriteHyperdrive } from "@delvtech/hyperdrive-viem"; +import { getHyperdrive, ReadWriteHyperdrive } from "@delvtech/hyperdrive-viem"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { getReadWriteHyperdrive } from "src/hyperdrive/getReadWriteHyperdrive"; +import { sdkCache } from "src/sdk/sdkCache"; import { Address } from "viem"; import { usePublicClient, useWalletClient } from "wagmi"; @@ -26,11 +25,11 @@ export function useReadWriteHyperdrive({ enabled, queryFn: enabled ? () => - getReadWriteHyperdrive({ - hyperdriveAddress: address, + getHyperdrive({ + address, publicClient, walletClient, - appConfig, + cache: sdkCache, }) : undefined, }); diff --git a/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx b/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx index ad9aa76a5..6b4319248 100644 --- a/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx +++ b/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx @@ -6,14 +6,15 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; +import { getHyperdrive } from "@delvtech/hyperdrive-viem"; import { AdjustmentsHorizontalIcon } from "@heroicons/react/20/solid"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { useNavigate, useSearch } from "@tanstack/react-router"; import { getPublicClient } from "@wagmi/core"; import { ReactElement, ReactNode, useMemo } from "react"; import { ZERO_ADDRESS } from "src/base/constants"; -import { getReadHyperdrive } from "src/hyperdrive/getReadHyperdrive"; import { wagmiConfig } from "src/network/wagmiClient"; +import { sdkCache } from "src/sdk/sdkCache"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import LoadingState from "src/ui/base/components/LoadingState"; import { MultiSelect } from "src/ui/base/components/MultiSelect"; @@ -345,10 +346,10 @@ function usePoolsList(): { const publicClient = getPublicClient(wagmiConfig as any, { chainId: hyperdrive.chainId, }); - const readHyperdrive = await getReadHyperdrive({ - hyperdriveAddress: hyperdrive.address, - appConfig: appConfig, + const readHyperdrive = await getHyperdrive({ + address: hyperdrive.address, publicClient: publicClient as PublicClient, + cache: sdkCache, }); // We only show hyperdrives that are not paused diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts index f9a5fac4d..b78b5c3f4 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts @@ -1,8 +1,11 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { OpenLongPositionReceived } from "@delvtech/hyperdrive-viem"; +import { + getHyperdrive, + OpenLongPositionReceived, +} from "@delvtech/hyperdrive-viem"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { getReadHyperdrive } from "src/hyperdrive/getReadHyperdrive"; +import { sdkCache } from "src/sdk/sdkCache"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { usePublicClients } from "src/ui/hyperdrive/hooks/usePublicClients"; import { useAccount } from "wagmi"; @@ -45,10 +48,10 @@ export function usePortfolioLongsData(): { }; } - const readHyperdrive = await getReadHyperdrive({ - appConfig: appConfigForConnectedChain, - hyperdriveAddress: hyperdrive.address, + const readHyperdrive = await getHyperdrive({ + address: hyperdrive.address, publicClient, + cache: sdkCache, }); const allLongs = await readHyperdrive.getOpenLongPositions({ diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts index 1701524b0..6ae31a48c 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts @@ -1,7 +1,8 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; +import { getHyperdrive } from "@delvtech/hyperdrive-viem"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { getReadHyperdrive } from "src/hyperdrive/getReadHyperdrive"; +import { sdkCache } from "src/sdk/sdkCache"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { usePublicClients } from "src/ui/hyperdrive/hooks/usePublicClients"; import { useAccount } from "wagmi"; @@ -44,10 +45,10 @@ export function usePortfolioLpData(): { }; } - const readHyperdrive = await getReadHyperdrive({ - appConfig: appConfigForConnectedChain, - hyperdriveAddress: hyperdrive.address, + const readHyperdrive = await getHyperdrive({ + address: hyperdrive.address, publicClient, + cache: sdkCache, }); const [lpShares, withdrawalShares] = await Promise.all([ diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts index a9dd8b6cb..2375cd814 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts @@ -1,8 +1,8 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { getHyperdrive, OpenShort } from "@delvtech/hyperdrive-viem"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { getReadHyperdrive } from "src/hyperdrive/getReadHyperdrive"; +import { sdkCache } from "src/sdk/sdkCache"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { usePublicClients } from "src/ui/hyperdrive/hooks/usePublicClients"; import { useAccount } from "wagmi"; @@ -45,10 +45,10 @@ export function usePortfolioShortsData(): { }; } - const readHyperdrive = await getReadHyperdrive({ - appConfig: appConfigForConnectedChain, - hyperdriveAddress: hyperdrive.address, + const readHyperdrive = await getHyperdrive({ + address: hyperdrive.address, publicClient, + cache: sdkCache, }); return { diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index 7c2d5bde0..481a7e7ed 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -18,7 +18,8 @@ "@delvtech/hyperdrive-artifacts": "^1.0.18", "@delvtech/hyperdrive-wasm": "^0.15.3", "lodash.groupby": "^4.6.0", - "lodash.mapvalues": "^4.6.0" + "lodash.mapvalues": "^4.6.0", + "semver": "^7.6.3" }, "devDependencies": { "@delvtech/drift": "^0.0.1-beta.7", diff --git a/packages/hyperdrive-js-core/src/exports/index.ts b/packages/hyperdrive-js-core/src/exports/index.ts index 92c52d413..2c3446913 100644 --- a/packages/hyperdrive-js-core/src/exports/index.ts +++ b/packages/hyperdrive-js-core/src/exports/index.ts @@ -1,5 +1,11 @@ // Hyperdrive // +export { + getHyperdrive, + type Hyperdrive, + type HyperdriveOptions, +} from "src/hyperdrive/getHyperdrive"; + export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/base/abi"; export { ReadHyperdrive, diff --git a/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts new file mode 100644 index 000000000..70e6f035b --- /dev/null +++ b/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts @@ -0,0 +1,100 @@ +import { Drift, ReadWriteAdapter } from "@delvtech/drift"; +import semver from "semver"; +import { hyperdriveAbi } from "src/hyperdrive/base/abi"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +import { + ReadWriteHyperdrive, + ReadWriteHyperdriveOptions, +} from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +import { ReadStEthHyperdrive } from "src/hyperdrive/steth/ReadStEthHyperdrive"; +import { ReadWriteStEthHyperdrive } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; +import { ReadStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14"; +import { ReadWriteStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14"; + +export interface HyperdriveOptions + extends ReadHyperdriveOptions { + drift: T; +} + +export type Hyperdrive = + T extends Drift ? ReadWriteHyperdrive : ReadHyperdrive; + +export async function getHyperdrive({ + address, + drift, + cache = drift.cache, + cacheNamespace, + earliestBlock, + debugName, +}: HyperdriveOptions): Promise> { + cacheNamespace ??= await drift.getChainId(); + + const options: HyperdriveOptions = { + address, + drift, + cache, + cacheNamespace, + earliestBlock, + debugName, + }; + + const kind = await drift.read({ + abi: hyperdriveAbi, + address, + fn: "kind", + cacheNamespace, + }); + + const version = await drift.read({ + abi: hyperdriveAbi, + address, + fn: "version", + cacheNamespace, + }); + + const isV1_0_14 = semver.lte(version, "1.0.14"); + const isReadWrite = isReadWriteOptions(options); + + switch (kind) { + case "StETHHyperdrive": + if (isReadWrite && isV1_0_14) { + return new ReadWriteStEthHyperdrive_v1_0_14(options); + } + + if (isReadWrite) { + return new ReadWriteStEthHyperdrive(options); + } + + if (isV1_0_14) { + return new ReadStEthHyperdrive_v1_0_14(options) as any; + } + + return new ReadStEthHyperdrive(options) as any; + + default: + if (isReadWrite && isV1_0_14) { + return new ReadWriteHyperdrive_v1_0_14(options); + } + + if (isReadWrite) { + return new ReadWriteHyperdrive(options); + } + + if (isV1_0_14) { + return new ReadHyperdrive_v1_0_14(options) as any; + } + + return new ReadHyperdrive(options) as any; + } +} + +function isReadWriteOptions( + options: HyperdriveOptions, +): options is ReadWriteHyperdriveOptions { + return typeof options.drift.write === "function"; +} diff --git a/packages/hyperdrive-viem/src/exports/index.ts b/packages/hyperdrive-viem/src/exports/index.ts index b7cfdede1..6389b149f 100644 --- a/packages/hyperdrive-viem/src/exports/index.ts +++ b/packages/hyperdrive-viem/src/exports/index.ts @@ -23,6 +23,12 @@ export { // Hyperdrive // +export { + getHyperdrive, + type Hyperdrive, + type HyperdriveOptions, +} from "src/hyperdrive/getHyperdrive"; + // base export { ReadHyperdrive, diff --git a/packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts b/packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts new file mode 100644 index 000000000..127954b57 --- /dev/null +++ b/packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts @@ -0,0 +1,45 @@ +import { Drift } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; +import { getHyperdrive as baseGetHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, + ReadWriteHyperdrive, +} from "src/hyperdrive/base"; +import { WalletClient } from "viem"; + +export interface HyperdriveOptions< + T extends WalletClient | undefined = undefined, +> extends ReadHyperdriveOptions { + walletClient?: T; +} + +export type Hyperdrive = + T extends void ? ReadHyperdrive : ReadWriteHyperdrive; + +export async function getHyperdrive< + T extends WalletClient | undefined = undefined, +>({ + address, + publicClient, + walletClient, + cache, + cacheNamespace = publicClient.chain?.id, + debugName, + earliestBlock, +}: HyperdriveOptions): Promise> { + const drift = new Drift( + viemAdapter({ + publicClient, + walletClient, + }), + ); + return baseGetHyperdrive({ + address, + drift, + cache, + cacheNamespace, + debugName, + earliestBlock, + }) as Promise>; +} From 9bb161107267d4c08f2ff39797d1b4c77e18961f Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 05:28:16 -0600 Subject: [PATCH 21/43] Consolidate `client` and `drift` dirs in sdk core --- .../src/{client => drift}/ContractClient.ts | 4 ++-- .../src/{client => drift}/ReadClient.ts | 0 .../src/{client => drift}/ReadWriteClient.ts | 2 +- packages/hyperdrive-js-core/src/exports/index.ts | 10 ++++------ packages/hyperdrive-js-core/src/factory/ReadFactory.ts | 4 ++-- .../hyperdrive-js-core/src/factory/ReadWriteFactory.ts | 2 +- .../src/hyperdrive/base/ReadHyperdrive.ts | 4 ++-- .../src/hyperdrive/base/ReadWriteHyperdrive.ts | 2 +- .../hyperdrive-js-core/src/registry/ReadRegistry.ts | 4 ++-- .../src/registry/ReadWriteRegistry.ts | 2 +- packages/hyperdrive-js-core/src/token/ReadToken.ts | 2 +- .../hyperdrive-js-core/src/token/ReadWriteToken.ts | 2 +- .../hyperdrive-js-core/src/token/erc20/ReadErc20.ts | 4 ++-- .../src/token/erc20/ReadWriteErc20.ts | 2 +- packages/hyperdrive-js-core/src/token/eth/ReadEth.ts | 2 +- .../hyperdrive-js-core/src/token/eth/ReadWriteEth.ts | 2 +- 16 files changed, 23 insertions(+), 25 deletions(-) rename packages/hyperdrive-js-core/src/{client => drift}/ContractClient.ts (83%) rename packages/hyperdrive-js-core/src/{client => drift}/ReadClient.ts (100%) rename packages/hyperdrive-js-core/src/{client => drift}/ReadWriteClient.ts (86%) diff --git a/packages/hyperdrive-js-core/src/client/ContractClient.ts b/packages/hyperdrive-js-core/src/drift/ContractClient.ts similarity index 83% rename from packages/hyperdrive-js-core/src/client/ContractClient.ts rename to packages/hyperdrive-js-core/src/drift/ContractClient.ts index d73f29d2c..735b64c52 100644 --- a/packages/hyperdrive-js-core/src/client/ContractClient.ts +++ b/packages/hyperdrive-js-core/src/drift/ContractClient.ts @@ -1,7 +1,7 @@ import { SimpleCache } from "@delvtech/drift"; import { Address } from "abitype"; -import { ReadClientOptions } from "src/client/ReadClient"; -import { ReadWriteClientOptions } from "src/client/ReadWriteClient"; +import { ReadClientOptions } from "src/drift/ReadClient"; +import { ReadWriteClientOptions } from "src/drift/ReadWriteClient"; /** * Additional options required for clients that represent a specific contract. diff --git a/packages/hyperdrive-js-core/src/client/ReadClient.ts b/packages/hyperdrive-js-core/src/drift/ReadClient.ts similarity index 100% rename from packages/hyperdrive-js-core/src/client/ReadClient.ts rename to packages/hyperdrive-js-core/src/drift/ReadClient.ts diff --git a/packages/hyperdrive-js-core/src/client/ReadWriteClient.ts b/packages/hyperdrive-js-core/src/drift/ReadWriteClient.ts similarity index 86% rename from packages/hyperdrive-js-core/src/client/ReadWriteClient.ts rename to packages/hyperdrive-js-core/src/drift/ReadWriteClient.ts index 6f81d95bb..fe7cefb63 100644 --- a/packages/hyperdrive-js-core/src/client/ReadWriteClient.ts +++ b/packages/hyperdrive-js-core/src/drift/ReadWriteClient.ts @@ -1,5 +1,5 @@ import { Drift, ReadWriteAdapter } from "@delvtech/drift"; -import { ReadClient, ReadClientOptions } from "src/client/ReadClient"; +import { ReadClient, ReadClientOptions } from "src/drift/ReadClient"; /** * The base options required for all read-write clients. diff --git a/packages/hyperdrive-js-core/src/exports/index.ts b/packages/hyperdrive-js-core/src/exports/index.ts index 2c3446913..130e054af 100644 --- a/packages/hyperdrive-js-core/src/exports/index.ts +++ b/packages/hyperdrive-js-core/src/exports/index.ts @@ -144,24 +144,22 @@ export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; -// Client // +// Drift // export type { ContractClientOptions, ReadContractClientOptions, ReadWriteContractClientOptions, -} from "src/client/ContractClient"; -export { ReadClient, type ReadClientOptions } from "src/client/ReadClient"; +} from "src/drift/ContractClient"; +export { ReadClient, type ReadClientOptions } from "src/drift/ReadClient"; export { ReadWriteClient, type ReadWriteClientOptions, -} from "src/client/ReadWriteClient"; +} from "src/drift/ReadWriteClient"; // Base // export { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; export { getHprFromApr } from "src/base/getHprFromApr"; export { getHprFromApy } from "src/base/getHprFromApy"; - -// types export type { Constructor } from "src/base/types"; diff --git a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts index 7f04b100d..dc3812d28 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts @@ -1,7 +1,7 @@ import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; -import { ReadContractClientOptions } from "src/client/ContractClient"; -import { ReadClient } from "src/client/ReadClient"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; import { FactoryAbi, factoryAbi } from "src/factory/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; diff --git a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts index 38916c341..04036fbcc 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts @@ -5,7 +5,7 @@ import { ReadWriteContract, ReplaceProps, } from "@delvtech/drift"; -import { ReadWriteContractClientOptions } from "src/client/ContractClient"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; import { ReadFactory, ReadFactoryOptions } from "src/factory/ReadFactory"; import { FactoryAbi } from "src/factory/abi"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts index 9a580455f..039ce7b8f 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts @@ -18,8 +18,8 @@ import { GetCheckpointParams, GetCheckpointTimeParams, } from "src/checkpoint/types"; -import { ReadContractClientOptions } from "src/client/ContractClient"; -import { ReadClient } from "src/client/ReadClient"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; import { fixed } from "src/fixed-point"; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts index 7b405179e..e9b3f7c34 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -5,7 +5,7 @@ import { ReadWriteAdapter, ReadWriteContract, } from "@delvtech/drift"; -import { ReadWriteContractClientOptions } from "src/client/ContractClient"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { NULL_BYTES } from "src/hyperdrive/constants"; diff --git a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts index f72ab3a06..4bfe1514f 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts @@ -1,7 +1,7 @@ import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; -import { ReadContractClientOptions } from "src/client/ContractClient"; -import { ReadClient } from "src/client/ReadClient"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; import { ReadFactory } from "src/factory/ReadFactory"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { RegistryAbi, registryAbi } from "src/registry/abi"; diff --git a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts index d8187507c..dc67671cf 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts @@ -6,7 +6,7 @@ import { ReplaceProps, } from "@delvtech/drift"; import { Address } from "abitype"; -import { ReadWriteContractClientOptions } from "src/client/ContractClient"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { ReadRegistry, ReadRegistryOptions } from "src/registry/ReadRegistry"; diff --git a/packages/hyperdrive-js-core/src/token/ReadToken.ts b/packages/hyperdrive-js-core/src/token/ReadToken.ts index 37e7e4b0b..a582e2f25 100644 --- a/packages/hyperdrive-js-core/src/token/ReadToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadToken.ts @@ -1,5 +1,5 @@ import { ContractReadOptions } from "@delvtech/drift"; -import { ReadClient } from "src/client/ReadClient"; +import { ReadClient } from "src/drift/ReadClient"; export interface ReadToken extends ReadClient { address: `0x${string}`; diff --git a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts index 9db1b0a32..8515c6bbd 100644 --- a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts @@ -1,5 +1,5 @@ import { ContractWriteOptions, ReplaceProps } from "@delvtech/drift"; -import { ReadWriteClient } from "src/client/ReadWriteClient"; +import { ReadWriteClient } from "src/drift/ReadWriteClient"; import { ReadToken } from "src/token/ReadToken"; export interface ReadWriteToken diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts index 6e71f893d..9fac7e2b0 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts @@ -1,7 +1,7 @@ import { Contract, ContractReadOptions } from "@delvtech/drift"; import { Address } from "abitype"; -import { ReadContractClientOptions } from "src/client/ContractClient"; -import { ReadClient } from "src/client/ReadClient"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; import { erc20Abi, Erc20Abi } from "src/token/erc20/abi"; import { ReadToken } from "src/token/ReadToken"; diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts index f4a798d98..f1075bd3d 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts @@ -4,7 +4,7 @@ import { ReadWriteAdapter, ReadWriteContract, } from "@delvtech/drift"; -import { ReadWriteContractClientOptions } from "src/client/ContractClient"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadErc20 } from "src/token/erc20/ReadErc20"; import { Erc20Abi } from "src/token/erc20/abi"; diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts index 4a397e4fd..48a4f552e 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts @@ -1,5 +1,5 @@ import { ContractReadOptions } from "@delvtech/drift"; -import { ReadClient, ReadClientOptions } from "src/client/ReadClient"; +import { ReadClient, ReadClientOptions } from "src/drift/ReadClient"; import { ReadToken } from "src/token/ReadToken"; export interface ReadEthOptions extends ReadClientOptions {} diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts index 367cfa996..e7f85bf9a 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts @@ -1,5 +1,5 @@ import { Drift, ReadWriteAdapter } from "@delvtech/drift"; -import { ReadWriteClientOptions } from "src/client/ReadWriteClient"; +import { ReadWriteClientOptions } from "src/drift/ReadWriteClient"; import { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadEth } from "src/token/eth/ReadEth"; From a3389c58007ebf694ea87f2c796ac8d3c92901d3 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 12:25:44 -0600 Subject: [PATCH 22/43] Add sdk core to sandbox and ui, bump drift-viem version --- apps/hyperdrive-trading/package.json | 3 +- apps/sdk-sandbox/package.json | 3 + packages/hyperdrive-viem/package.json | 2 +- yarn.lock | 550 +++++++++++++++++++++++++- 4 files changed, 538 insertions(+), 20 deletions(-) diff --git a/apps/hyperdrive-trading/package.json b/apps/hyperdrive-trading/package.json index 8f847e9b2..ea3cd82f9 100644 --- a/apps/hyperdrive-trading/package.json +++ b/apps/hyperdrive-trading/package.json @@ -29,9 +29,10 @@ }, "dependencies": { "@delvtech/drift": "^0.0.1-beta.7", + "@delvtech/drift-viem": "^0.0.1-beta.9", "@delvtech/fixed-point-wasm": "^0.0.6", "@delvtech/hyperdrive-appconfig": "^0.0.1", - "@delvtech/hyperdrive-viem": "^3.0.6", + "@delvtech/hyperdrive-js-core": "^3.0.6", "@headlessui/react": "^2.1.5", "@heroicons/react": "^2.0.16", "@radix-ui/react-tooltip": "^1.1.2", diff --git a/apps/sdk-sandbox/package.json b/apps/sdk-sandbox/package.json index 9c9e1e2e9..e690baca4 100644 --- a/apps/sdk-sandbox/package.json +++ b/apps/sdk-sandbox/package.json @@ -11,9 +11,12 @@ "fixed-point:watch": "tsx -r dotenv/config --watch scripts/fixed-point.ts" }, "dependencies": { + "@delvtech/drift": "^0.0.1-beta.7", + "@delvtech/drift-viem": "^0.0.1-beta.9", "@delvtech/fixed-point-wasm": "*", "@delvtech/hyperdrive-appconfig": "*", "@delvtech/hyperdrive-viem": "*", + "@delvtech/hyperdrive-js-core": "*", "@delvtech/hyperdrive-wasm": "*", "viem": "^2.9.2" }, diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index b4e2aa672..efb735021 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@delvtech/drift": "^0.0.1-beta.7", - "@delvtech/drift-viem": "^0.0.1-beta.7", + "@delvtech/drift-viem": "^0.0.1-beta.9", "@delvtech/hyperdrive-js-core": "3.0.6" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 253fb2b7f..b5e33b646 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,20 +1479,6 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@delvtech/drift-viem@^0.0.1-beta.7": - version "0.0.1-beta.7" - resolved "https://registry.yarnpkg.com/@delvtech/drift-viem/-/drift-viem-0.0.1-beta.7.tgz#b2d751a4625494f5f4c3416db83452199f2ea299" - integrity sha512-WVXSTzhi/kviFatpw0m7DiSeMN0GJg7jYp/n+wiKtmiwq6h0S6fqsbSkycW4lrcEVT8t16gh648IsXmitZydCw== - -"@delvtech/drift@^0.0.1-beta.7": - version "0.0.1-beta.7" - resolved "https://registry.yarnpkg.com/@delvtech/drift/-/drift-0.0.1-beta.7.tgz#798df3ff4803f6b518c2d056ab1ef3680d28fba8" - integrity sha512-bR7EkszcfKsfWAD9WYCNoG8UBRecdhou7eswsZCeRJjgJNZw9AhsaeBZtrqWhaCSD9cfYuXILKkjIPIKTVdT4g== - dependencies: - lodash.ismatch "^4.4.0" - lru-cache "^10.0.1" - safe-stable-stringify "^2.5.0" - "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -2085,6 +2071,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== +"@esbuild/aix-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" + integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== + "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" @@ -2105,6 +2096,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== +"@esbuild/android-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" + integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== + "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" @@ -2125,6 +2121,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== +"@esbuild/android-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" + integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== + "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" @@ -2145,6 +2146,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== +"@esbuild/android-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" + integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== + "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" @@ -2165,6 +2171,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== +"@esbuild/darwin-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" + integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== + "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" @@ -2185,6 +2196,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== +"@esbuild/darwin-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" + integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== + "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" @@ -2205,6 +2221,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== +"@esbuild/freebsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" + integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== + "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" @@ -2225,6 +2246,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== +"@esbuild/freebsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" + integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== + "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" @@ -2245,6 +2271,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== +"@esbuild/linux-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" + integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== + "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" @@ -2265,6 +2296,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== +"@esbuild/linux-arm@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" + integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== + "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" @@ -2285,6 +2321,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== +"@esbuild/linux-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" + integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== + "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" @@ -2305,6 +2346,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== +"@esbuild/linux-loong64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" + integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== + "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" @@ -2325,6 +2371,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== +"@esbuild/linux-mips64el@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" + integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== + "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" @@ -2345,6 +2396,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== +"@esbuild/linux-ppc64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" + integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== + "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" @@ -2365,6 +2421,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== +"@esbuild/linux-riscv64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" + integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== + "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" @@ -2385,6 +2446,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== +"@esbuild/linux-s390x@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" + integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== + "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" @@ -2405,6 +2471,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== +"@esbuild/linux-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" + integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== + "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" @@ -2425,6 +2496,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== +"@esbuild/netbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" + integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== + "@esbuild/openbsd-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" @@ -2435,6 +2511,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== +"@esbuild/openbsd-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" + integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== + "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" @@ -2455,6 +2536,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== +"@esbuild/openbsd-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" + integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== + "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" @@ -2475,6 +2561,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== +"@esbuild/sunos-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" + integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== + "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" @@ -2495,6 +2586,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== +"@esbuild/win32-arm64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" + integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== + "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" @@ -2515,6 +2611,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== +"@esbuild/win32-ia32@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" + integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== + "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" @@ -2535,6 +2636,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== +"@esbuild/win32-x64@0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" + integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -2939,6 +3045,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3730,6 +3841,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz#7746deb85e4a8fb54fbfda8ac5c102692f102476" integrity sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww== +"@rollup/rollup-android-arm-eabi@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz#c460b54c50d42f27f8254c435a4f3b3e01910bc8" + integrity sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw== + "@rollup/rollup-android-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" @@ -3745,6 +3861,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz#93de4d867709d3313794723b5afd91e1e174f906" integrity sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A== +"@rollup/rollup-android-arm64@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz#96e01f3a04675d8d5973ab8d3fd6bc3be21fa5e1" + integrity sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA== + "@rollup/rollup-darwin-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" @@ -3760,6 +3881,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz#e41e6a81673260ab196e0f59462b9940a6ac03cd" integrity sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q== +"@rollup/rollup-darwin-arm64@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz#9b2ec23b17b47cbb2f771b81f86ede3ac6730bce" + integrity sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ== + "@rollup/rollup-darwin-x64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" @@ -3775,6 +3901,21 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz#2b0a0aef6e8c5317d494cfc9076d7a16b099bdcb" integrity sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA== +"@rollup/rollup-darwin-x64@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz#f30e4ee6929e048190cf10e0daa8e8ae035b6e46" + integrity sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg== + +"@rollup/rollup-freebsd-arm64@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz#c54b2373ec5bcf71f08c4519c7ae80a0b6c8e03b" + integrity sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw== + +"@rollup/rollup-freebsd-x64@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz#3bc53aa29d5a34c28ba8e00def76aa612368458e" + integrity sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g== + "@rollup/rollup-linux-arm-gnueabihf@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" @@ -3790,6 +3931,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz#e22319deb5367384ef315e66bc6de80d2bf2b3ae" integrity sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q== +"@rollup/rollup-linux-arm-gnueabihf@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz#c85aedd1710c9e267ee86b6d1ce355ecf7d9e8d9" + integrity sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA== + "@rollup/rollup-linux-arm-musleabihf@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz#4ba804a00b5e793196a622f6977e05f23e01f59a" @@ -3800,6 +3946,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz#d5dd68f5d7ae21b345a5c87208c94e5c813f54b8" integrity sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw== +"@rollup/rollup-linux-arm-musleabihf@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz#e77313408bf13995aecde281aec0cceb08747e42" + integrity sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw== + "@rollup/rollup-linux-arm64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" @@ -3815,6 +3966,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz#1703d3a418d33f8f025acaf93f39ca1efcd5b645" integrity sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw== +"@rollup/rollup-linux-arm64-gnu@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz#633f632397b3662108cfaa1abca2a80b85f51102" + integrity sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg== + "@rollup/rollup-linux-arm64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" @@ -3830,6 +3986,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz#3f59c2c6e60f75ce8b1090bd841c555e3bb01f0e" integrity sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw== +"@rollup/rollup-linux-arm64-musl@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz#63edd72b29c4cced93e16113a68e1be9fef88907" + integrity sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA== + "@rollup/rollup-linux-powerpc64le-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz#1540b284d91c440bc9fa7a1714cfb71a5597e94d" @@ -3840,6 +4001,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz#3f99a0921596a6f539121a312df29af52a205f15" integrity sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ== +"@rollup/rollup-linux-powerpc64le-gnu@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz#a9418a4173df80848c0d47df0426a0bf183c4e75" + integrity sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA== + "@rollup/rollup-linux-riscv64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" @@ -3855,6 +4021,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz#c08fb3e629d50d2eac31329347cfc559a1cf81d1" integrity sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A== +"@rollup/rollup-linux-riscv64-gnu@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz#bc9c195db036a27e5e3339b02f51526b4ce1e988" + integrity sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw== + "@rollup/rollup-linux-s390x-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz#579ca5f271421a961d3c73d221202c79e02ff03a" @@ -3865,6 +4036,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz#173722cd745779d730d4b24d21386185e0e12de8" integrity sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q== +"@rollup/rollup-linux-s390x-gnu@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz#1651fdf8144ae89326c01da5d52c60be63e71a82" + integrity sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ== + "@rollup/rollup-linux-x64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" @@ -3880,6 +4056,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz#0af2b6541ab0f4954d2c4f96bcdc7947420dd28c" integrity sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q== +"@rollup/rollup-linux-x64-gnu@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz#e473de5e4acb95fcf930a35cbb7d3e8080e57a6f" + integrity sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA== + "@rollup/rollup-linux-x64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" @@ -3895,6 +4076,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz#f973f9552744764b221128f7c3629222216ace69" integrity sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q== +"@rollup/rollup-linux-x64-musl@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz#0af12dd2578c29af4037f0c834b4321429dd5b01" + integrity sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q== + "@rollup/rollup-win32-arm64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" @@ -3910,6 +4096,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz#21ac5ed84d914bc31821fec3dd909f7257cfb17b" integrity sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA== +"@rollup/rollup-win32-arm64-msvc@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz#e48e78cdd45313b977c1390f4bfde7ab79be8871" + integrity sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA== + "@rollup/rollup-win32-ia32-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" @@ -3925,6 +4116,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz#0cfe740063b35dcd5a62c4e243226631a846ce11" integrity sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ== +"@rollup/rollup-win32-ia32-msvc@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz#a3fc8536d243fe161c796acb93eba43c250f311c" + integrity sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg== + "@rollup/rollup-win32-x64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" @@ -3940,6 +4136,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz#5f2c40d3f1b53ede80fb4e6964f840c0f8936832" integrity sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg== +"@rollup/rollup-win32-x64-msvc@4.24.4": + version "4.24.4" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz#e2a9d1fd56524103a6cc8a54404d9d3ebc73c454" + integrity sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg== + "@safe-global/safe-apps-provider@0.18.1": version "0.18.1" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" @@ -4585,6 +4786,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/ethereumjs-util@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@types/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#f49fe8114789ec0871721392c09318c3eb56671b" @@ -4717,6 +4923,13 @@ dependencies: "@types/lodash" "*" +"@types/lodash.ismatch@^4.4.9": + version "4.4.9" + resolved "https://registry.yarnpkg.com/@types/lodash.ismatch/-/lodash.ismatch-4.4.9.tgz#97b4317f7dc3975bb51660a0f9a055ac7b67b134" + integrity sha512-qWihnStOPKH8urljLGm6ZOEdN/5Bt4vxKR81tL3L4ArUNLvcf9RW3QSnPs21eix5BiqioSWq4aAXD4Iep+d0fw== + dependencies: + "@types/lodash" "*" + "@types/lodash.mapvalues@^4.6.9": version "4.6.9" resolved "https://registry.yarnpkg.com/@types/lodash.mapvalues/-/lodash.mapvalues-4.6.9.tgz#1edb4b1d299db332166b474221b06058b34030a7" @@ -5433,6 +5646,25 @@ chai "^5.1.1" tinyrainbow "^1.2.0" +"@vitest/expect@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.4.tgz#48f4f53a01092a3bdc118cff245f79ef388bdd8e" + integrity sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA== + dependencies: + "@vitest/spy" "2.1.4" + "@vitest/utils" "2.1.4" + chai "^5.1.2" + tinyrainbow "^1.2.0" + +"@vitest/mocker@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.4.tgz#0dc07edb9114f7f080a0181fbcdb16cd4a2d855d" + integrity sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ== + dependencies: + "@vitest/spy" "2.1.4" + estree-walker "^3.0.3" + magic-string "^0.30.12" + "@vitest/pretty-format@2.0.4", "@vitest/pretty-format@^2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.4.tgz#9a3934932e7f8ddd836b38c34ddaeec91bd0f82e" @@ -5440,6 +5672,13 @@ dependencies: tinyrainbow "^1.2.0" +"@vitest/pretty-format@2.1.4", "@vitest/pretty-format@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.4.tgz#fc31993bdc1ef5a6c1a4aa6844e7ba55658a4f9f" + integrity sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww== + dependencies: + tinyrainbow "^1.2.0" + "@vitest/runner@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.4.tgz#0b1edb8ab5f81a1c7dfd50090e5e7e971a117891" @@ -5448,6 +5687,14 @@ "@vitest/utils" "2.0.4" pathe "^1.1.2" +"@vitest/runner@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.4.tgz#f9346500bdd0be1c926daaac5d683bae87ceda2c" + integrity sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA== + dependencies: + "@vitest/utils" "2.1.4" + pathe "^1.1.2" + "@vitest/snapshot@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.4.tgz#7d7dea9df17c5c13386f1a7a433b99dc0ffe3c14" @@ -5457,6 +5704,15 @@ magic-string "^0.30.10" pathe "^1.1.2" +"@vitest/snapshot@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.4.tgz#ef8c3f605fbc23a32773256d37d3fdfd9b23d353" + integrity sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q== + dependencies: + "@vitest/pretty-format" "2.1.4" + magic-string "^0.30.12" + pathe "^1.1.2" + "@vitest/spy@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.4.tgz#19083386a741a158c2f142beffe43be68b1375cf" @@ -5464,6 +5720,13 @@ dependencies: tinyspy "^3.0.0" +"@vitest/spy@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.4.tgz#4e90f9783437c5841a27c80f8fd84d7289a6100a" + integrity sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg== + dependencies: + tinyspy "^3.0.2" + "@vitest/utils@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.4.tgz#2db1df35aaeb5caa932770a190df636a68d284d5" @@ -5474,6 +5737,15 @@ loupe "^3.1.1" tinyrainbow "^1.2.0" +"@vitest/utils@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.4.tgz#6d67ac966647a21ce8bc497472ce230de3b64537" + integrity sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg== + dependencies: + "@vitest/pretty-format" "2.1.4" + loupe "^3.1.2" + tinyrainbow "^1.2.0" + "@wagmi/connectors@4.1.18": version "4.1.18" resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-4.1.18.tgz#b95350ff2cb527093ff9dd11d382e0563ec546e3" @@ -5917,6 +6189,11 @@ abitype@^1.0.5: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== +abitype@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" + integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -6864,6 +7141,17 @@ chai@^5.1.1: loupe "^3.1.0" pathval "^2.0.0" +chai@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" + integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@5.3.0, chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -6961,6 +7249,13 @@ cheerio@^1.0.0-rc.12: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -7797,6 +8092,13 @@ debug@^4.3.5: dependencies: ms "2.1.2" +debug@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decache@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da" @@ -8565,6 +8867,36 @@ esbuild@^0.23.0: "@esbuild/win32-ia32" "0.23.0" "@esbuild/win32-x64" "0.23.0" +esbuild@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" + integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.24.0" + "@esbuild/android-arm" "0.24.0" + "@esbuild/android-arm64" "0.24.0" + "@esbuild/android-x64" "0.24.0" + "@esbuild/darwin-arm64" "0.24.0" + "@esbuild/darwin-x64" "0.24.0" + "@esbuild/freebsd-arm64" "0.24.0" + "@esbuild/freebsd-x64" "0.24.0" + "@esbuild/linux-arm" "0.24.0" + "@esbuild/linux-arm64" "0.24.0" + "@esbuild/linux-ia32" "0.24.0" + "@esbuild/linux-loong64" "0.24.0" + "@esbuild/linux-mips64el" "0.24.0" + "@esbuild/linux-ppc64" "0.24.0" + "@esbuild/linux-riscv64" "0.24.0" + "@esbuild/linux-s390x" "0.24.0" + "@esbuild/linux-x64" "0.24.0" + "@esbuild/netbsd-x64" "0.24.0" + "@esbuild/openbsd-arm64" "0.24.0" + "@esbuild/openbsd-x64" "0.24.0" + "@esbuild/sunos-x64" "0.24.0" + "@esbuild/win32-arm64" "0.24.0" + "@esbuild/win32-ia32" "0.24.0" + "@esbuild/win32-x64" "0.24.0" + esbuild@~0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" @@ -9147,6 +9479,11 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" +expect-type@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" + integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== + express@^4.17.3: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" @@ -9238,7 +9575,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-gl merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -9306,6 +9643,11 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" +fdir@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" @@ -11545,6 +11887,11 @@ loupe@^3.1.0, loupe@^3.1.1: dependencies: get-func-name "^2.0.1" +loupe@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" + integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -11608,6 +11955,13 @@ magic-string@^0.30.10: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +magic-string@^0.30.12: + version "0.30.12" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60" + integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + magic-string@^0.30.3: version "0.30.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" @@ -12587,7 +12941,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -12653,6 +13007,17 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +nise@^5.1.9: + version "5.1.9" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139" + integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/text-encoding" "^0.7.2" + just-extend "^6.2.0" + path-to-regexp "^6.2.1" + nise@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nise/-/nise-6.0.0.tgz#ae56fccb5d912037363c3b3f29ebbfa28bde8b48" @@ -13340,11 +13705,21 @@ picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pidtree@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -14451,6 +14826,11 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -14930,6 +15310,33 @@ rollup@^4.19.0: "@rollup/rollup-win32-x64-msvc" "4.19.1" fsevents "~2.3.2" +rollup@^4.24.0: + version "4.24.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.4.tgz#fdc76918de02213c95447c9ffff5e35dddb1d058" + integrity sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.24.4" + "@rollup/rollup-android-arm64" "4.24.4" + "@rollup/rollup-darwin-arm64" "4.24.4" + "@rollup/rollup-darwin-x64" "4.24.4" + "@rollup/rollup-freebsd-arm64" "4.24.4" + "@rollup/rollup-freebsd-x64" "4.24.4" + "@rollup/rollup-linux-arm-gnueabihf" "4.24.4" + "@rollup/rollup-linux-arm-musleabihf" "4.24.4" + "@rollup/rollup-linux-arm64-gnu" "4.24.4" + "@rollup/rollup-linux-arm64-musl" "4.24.4" + "@rollup/rollup-linux-powerpc64le-gnu" "4.24.4" + "@rollup/rollup-linux-riscv64-gnu" "4.24.4" + "@rollup/rollup-linux-s390x-gnu" "4.24.4" + "@rollup/rollup-linux-x64-gnu" "4.24.4" + "@rollup/rollup-linux-x64-musl" "4.24.4" + "@rollup/rollup-win32-arm64-msvc" "4.24.4" + "@rollup/rollup-win32-ia32-msvc" "4.24.4" + "@rollup/rollup-win32-x64-msvc" "4.24.4" + fsevents "~2.3.2" + rtl-css-js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -15358,6 +15765,18 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" +sinon@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-17.0.2.tgz#470894bcc2d24b01bad539722ea46da949892405" + integrity sha512-uihLiaB9FhzesElPDFZA7hDcNABzsVHwr3YfmM9sBllVwab3l0ltGlRV1XhpNfIacNDLGD1QRZNLs5nU5+hTuA== + dependencies: + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/samsam" "^8.0.0" + diff "^5.2.0" + nise "^5.1.9" + supports-color "^7" + sinon@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.0.tgz#69ca293dbc3e82590a8b0d46c97f63ebc1e5fc01" @@ -16121,11 +16540,34 @@ tinybench@^2.8.0: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" + integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== + +tinyglobby@^0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + tinypool@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== +tinypool@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" + integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== + tinyrainbow@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" @@ -16136,6 +16578,11 @@ tinyspy@^3.0.0: resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -16337,6 +16784,28 @@ tsup@^8.2.3: sucrase "^3.35.0" tree-kill "^1.2.2" +tsup@^8.3.0: + version "8.3.5" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.3.5.tgz#d55344e4756e924bf6f442e54e7d324b4471eee0" + integrity sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA== + dependencies: + bundle-require "^5.0.0" + cac "^6.7.14" + chokidar "^4.0.1" + consola "^3.2.3" + debug "^4.3.7" + esbuild "^0.24.0" + joycon "^3.1.1" + picocolors "^1.1.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.24.0" + source-map "0.8.0-beta.0" + sucrase "^3.35.0" + tinyexec "^0.3.1" + tinyglobby "^0.2.9" + tree-kill "^1.2.2" + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -16547,7 +17016,7 @@ typedoc@^0.25.7: minimatch "^9.0.3" shiki "^0.14.7" -typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@~5.2.2: +typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@^5.6.2, typescript@~5.2.2: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -16947,7 +17416,7 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" -viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.7.8, viem@^2.9.2: +viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.21.37, viem@^2.7.8, viem@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.2.tgz#29bd2425222be136bf969a90dd3a8d6032221904" integrity sha512-GRakUTNiYE9W+vL+Be9JkQfzWnkczerHtSpEe2JR/jEGTYZAs4shrA4WLgiaVCI9JxpnduZhQfRWNvy2dlyP2g== @@ -16972,6 +17441,16 @@ vite-node@2.0.4: tinyrainbow "^1.2.0" vite "^5.0.0" +vite-node@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.4.tgz#97ffb6de913fd8d42253afe441f9512e9dbdfd5c" + integrity sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg== + dependencies: + cac "^6.7.14" + debug "^4.3.7" + pathe "^1.1.2" + vite "^5.0.0" + vite-plugin-node-polyfills@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz#d0afcf82eb985fc02244620d7cec1ddd1c6e0864" @@ -16989,6 +17468,15 @@ vite-tsconfig-paths@^4.2.0, vite-tsconfig-paths@^4.3.2: globrex "^0.1.2" tsconfck "^3.0.3" +vite-tsconfig-paths@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.0.tgz#b449b6749eb69e635ad4b5fcf4f4181b92d512c9" + integrity sha512-Y1PLGHCJfAq1Zf4YIGEsmuU/NCX1epoZx9zwSr32Gjn3aalwQHRKr5aUmbo6r0JHeHkqmWpmDg7WOynhYXw1og== + dependencies: + debug "^4.1.1" + globrex "^0.1.2" + tsconfck "^3.0.3" + vite@^5.0.0, vite@^5.3.5: version "5.3.5" resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" @@ -17025,6 +17513,32 @@ vitest@^2.0.4: vite-node "2.0.4" why-is-node-running "^2.3.0" +vitest@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.4.tgz#ba8f4589fb639cf5a9e6af54781667312b3e8230" + integrity sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ== + dependencies: + "@vitest/expect" "2.1.4" + "@vitest/mocker" "2.1.4" + "@vitest/pretty-format" "^2.1.4" + "@vitest/runner" "2.1.4" + "@vitest/snapshot" "2.1.4" + "@vitest/spy" "2.1.4" + "@vitest/utils" "2.1.4" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" + pathe "^1.1.2" + std-env "^3.7.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.1.4" + why-is-node-running "^2.3.0" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" From 393261b9598175a0208c69d76b9c413e14befaf7 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 12:28:17 -0600 Subject: [PATCH 23/43] Fix `getHyperdrive` in sdk core for v1.0.14 pools --- .../src/hyperdrive/getHyperdrive.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts index 70e6f035b..fde57e04a 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts @@ -42,13 +42,7 @@ export async function getHyperdrive({ earliestBlock, debugName, }; - - const kind = await drift.read({ - abi: hyperdriveAbi, - address, - fn: "kind", - cacheNamespace, - }); + const isReadWrite = isReadWriteOptions(options); const version = await drift.read({ abi: hyperdriveAbi, @@ -56,9 +50,16 @@ export async function getHyperdrive({ fn: "version", cacheNamespace, }); - const isV1_0_14 = semver.lte(version, "1.0.14"); - const isReadWrite = isReadWriteOptions(options); + + const kind = isV1_0_14 + ? undefined + : await drift.read({ + abi: hyperdriveAbi, + address, + fn: "kind", + cacheNamespace, + }); switch (kind) { case "StETHHyperdrive": From 19a5eadfa10bc024ca2808bc553057a7780493be Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 12:38:24 -0600 Subject: [PATCH 24/43] Change `HyperdriveSdkError` base to `DriftError` for better stack traces. --- .../src/errors/HyperdriveSdkError.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts b/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts index c83978911..34c045c60 100644 --- a/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts +++ b/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts @@ -1,6 +1,11 @@ -export class HyperdriveSdkError extends Error { - constructor(...[message, options]: Parameters) { - super(message, options); - this.name = "HyperdriveSdkError"; +import { DriftError } from "@delvtech/drift"; + +export class HyperdriveSdkError extends DriftError { + constructor(message: string, options?: ErrorOptions) { + super(message, { + ...options, + prefix: "ᛋ ", + name: "Hyperdrive SDK Error", + }); } } From 98fb5a9b6b3f489367a9127630fdcfd741246af3 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 17:21:57 -0600 Subject: [PATCH 25/43] Bump drift versions --- apps/hyperdrive-trading/package.json | 4 +- apps/sdk-sandbox/package.json | 4 +- packages/hyperdrive-js-core/package.json | 4 +- packages/hyperdrive-viem/package.json | 4 +- yarn.lock | 550 +---------------------- 5 files changed, 26 insertions(+), 540 deletions(-) diff --git a/apps/hyperdrive-trading/package.json b/apps/hyperdrive-trading/package.json index ea3cd82f9..b5e6e5999 100644 --- a/apps/hyperdrive-trading/package.json +++ b/apps/hyperdrive-trading/package.json @@ -28,8 +28,8 @@ "gen:walletconnect": "bash ./scripts/generate-walletconnect.sh" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.7", - "@delvtech/drift-viem": "^0.0.1-beta.9", + "@delvtech/drift": "^0.0.1-beta.9", + "@delvtech/drift-viem": "^0.0.1-beta.11", "@delvtech/fixed-point-wasm": "^0.0.6", "@delvtech/hyperdrive-appconfig": "^0.0.1", "@delvtech/hyperdrive-js-core": "^3.0.6", diff --git a/apps/sdk-sandbox/package.json b/apps/sdk-sandbox/package.json index e690baca4..9cf5da229 100644 --- a/apps/sdk-sandbox/package.json +++ b/apps/sdk-sandbox/package.json @@ -11,8 +11,8 @@ "fixed-point:watch": "tsx -r dotenv/config --watch scripts/fixed-point.ts" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.7", - "@delvtech/drift-viem": "^0.0.1-beta.9", + "@delvtech/drift": "^0.0.1-beta.9", + "@delvtech/drift-viem": "^0.0.1-beta.11", "@delvtech/fixed-point-wasm": "*", "@delvtech/hyperdrive-appconfig": "*", "@delvtech/hyperdrive-viem": "*", diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index 481a7e7ed..d8bb836fb 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -11,7 +11,7 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "@delvtech/drift": "^0.0.1-beta.7" + "@delvtech/drift": "^0.0.1-beta.9" }, "dependencies": { "@delvtech/fixed-point-wasm": "^0.0.6", @@ -22,7 +22,7 @@ "semver": "^7.6.3" }, "devDependencies": { - "@delvtech/drift": "^0.0.1-beta.7", + "@delvtech/drift": "^0.0.1-beta.9", "@hyperdrive/eslint-config": "*", "@hyperdrive/prettier-config": "*", "@hyperdrive/tsconfig": "*", diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index efb735021..9d67e9515 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -12,8 +12,8 @@ "viem": "^2.7.8" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.7", - "@delvtech/drift-viem": "^0.0.1-beta.9", + "@delvtech/drift": "^0.0.1-beta.9", + "@delvtech/drift-viem": "^0.0.1-beta.11", "@delvtech/hyperdrive-js-core": "3.0.6" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index b5e33b646..a05ced751 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,6 +1479,20 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@delvtech/drift-viem@^0.0.1-beta.11": + version "0.0.1-beta.11" + resolved "https://registry.yarnpkg.com/@delvtech/drift-viem/-/drift-viem-0.0.1-beta.11.tgz#9cba8d1164939fb30f99e6caf8abbcea17ac48de" + integrity sha512-bO7eH8ysWKimeuIq3xK8oyG+TDuzoaxOAXnuvoDlot7XuR4Uuqfp4cQuQR8ob0mvIasEh0ZqKp/LoJ2Jn75ykg== + +"@delvtech/drift@^0.0.1-beta.9": + version "0.0.1-beta.9" + resolved "https://registry.yarnpkg.com/@delvtech/drift/-/drift-0.0.1-beta.9.tgz#802a2d226fe3c19a9e1e5b81982ed8e7a1dd48ee" + integrity sha512-XAdRFE3HMlzhnlDEb8ehkOpdcwZSz7v0DZ8l4dvlKAY6jmta2Uew43gAt7UfuO4ATlzWPuw5VhTXf82K0m+stw== + dependencies: + lodash.ismatch "^4.4.0" + lru-cache "^10.0.1" + safe-stable-stringify "^2.5.0" + "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -2071,11 +2085,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== -"@esbuild/aix-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" - integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== - "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" @@ -2096,11 +2105,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== -"@esbuild/android-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" - integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== - "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" @@ -2121,11 +2125,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== -"@esbuild/android-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" - integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== - "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" @@ -2146,11 +2145,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== -"@esbuild/android-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" - integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== - "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" @@ -2171,11 +2165,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== -"@esbuild/darwin-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd" - integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== - "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" @@ -2196,11 +2185,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== -"@esbuild/darwin-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" - integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== - "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" @@ -2221,11 +2205,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== -"@esbuild/freebsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" - integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== - "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" @@ -2246,11 +2225,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== -"@esbuild/freebsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" - integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== - "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" @@ -2271,11 +2245,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== -"@esbuild/linux-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" - integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== - "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" @@ -2296,11 +2265,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== -"@esbuild/linux-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" - integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== - "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" @@ -2321,11 +2285,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== -"@esbuild/linux-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" - integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== - "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" @@ -2346,11 +2305,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== -"@esbuild/linux-loong64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" - integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== - "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" @@ -2371,11 +2325,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== -"@esbuild/linux-mips64el@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" - integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== - "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" @@ -2396,11 +2345,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== -"@esbuild/linux-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" - integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== - "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" @@ -2421,11 +2365,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== -"@esbuild/linux-riscv64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" - integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== - "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" @@ -2446,11 +2385,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== -"@esbuild/linux-s390x@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" - integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== - "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" @@ -2471,11 +2405,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== -"@esbuild/linux-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" - integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== - "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" @@ -2496,11 +2425,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== -"@esbuild/netbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" - integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== - "@esbuild/openbsd-arm64@0.23.0": version "0.23.0" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" @@ -2511,11 +2435,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== -"@esbuild/openbsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" - integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== - "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" @@ -2536,11 +2455,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== -"@esbuild/openbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" - integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== - "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" @@ -2561,11 +2475,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== -"@esbuild/sunos-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" - integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== - "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" @@ -2586,11 +2495,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== -"@esbuild/win32-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" - integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== - "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" @@ -2611,11 +2515,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== -"@esbuild/win32-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" - integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== - "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" @@ -2636,11 +2535,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== -"@esbuild/win32-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" - integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -3045,11 +2939,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3841,11 +3730,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz#7746deb85e4a8fb54fbfda8ac5c102692f102476" integrity sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww== -"@rollup/rollup-android-arm-eabi@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.4.tgz#c460b54c50d42f27f8254c435a4f3b3e01910bc8" - integrity sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw== - "@rollup/rollup-android-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" @@ -3861,11 +3745,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz#93de4d867709d3313794723b5afd91e1e174f906" integrity sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A== -"@rollup/rollup-android-arm64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.4.tgz#96e01f3a04675d8d5973ab8d3fd6bc3be21fa5e1" - integrity sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA== - "@rollup/rollup-darwin-arm64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" @@ -3881,11 +3760,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz#e41e6a81673260ab196e0f59462b9940a6ac03cd" integrity sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q== -"@rollup/rollup-darwin-arm64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.4.tgz#9b2ec23b17b47cbb2f771b81f86ede3ac6730bce" - integrity sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ== - "@rollup/rollup-darwin-x64@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" @@ -3901,21 +3775,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz#2b0a0aef6e8c5317d494cfc9076d7a16b099bdcb" integrity sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA== -"@rollup/rollup-darwin-x64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.4.tgz#f30e4ee6929e048190cf10e0daa8e8ae035b6e46" - integrity sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg== - -"@rollup/rollup-freebsd-arm64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.4.tgz#c54b2373ec5bcf71f08c4519c7ae80a0b6c8e03b" - integrity sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw== - -"@rollup/rollup-freebsd-x64@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.4.tgz#3bc53aa29d5a34c28ba8e00def76aa612368458e" - integrity sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g== - "@rollup/rollup-linux-arm-gnueabihf@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" @@ -3931,11 +3790,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz#e22319deb5367384ef315e66bc6de80d2bf2b3ae" integrity sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q== -"@rollup/rollup-linux-arm-gnueabihf@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.4.tgz#c85aedd1710c9e267ee86b6d1ce355ecf7d9e8d9" - integrity sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA== - "@rollup/rollup-linux-arm-musleabihf@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz#4ba804a00b5e793196a622f6977e05f23e01f59a" @@ -3946,11 +3800,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz#d5dd68f5d7ae21b345a5c87208c94e5c813f54b8" integrity sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw== -"@rollup/rollup-linux-arm-musleabihf@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.4.tgz#e77313408bf13995aecde281aec0cceb08747e42" - integrity sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw== - "@rollup/rollup-linux-arm64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" @@ -3966,11 +3815,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz#1703d3a418d33f8f025acaf93f39ca1efcd5b645" integrity sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw== -"@rollup/rollup-linux-arm64-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.4.tgz#633f632397b3662108cfaa1abca2a80b85f51102" - integrity sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg== - "@rollup/rollup-linux-arm64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" @@ -3986,11 +3830,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz#3f59c2c6e60f75ce8b1090bd841c555e3bb01f0e" integrity sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw== -"@rollup/rollup-linux-arm64-musl@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.4.tgz#63edd72b29c4cced93e16113a68e1be9fef88907" - integrity sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA== - "@rollup/rollup-linux-powerpc64le-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz#1540b284d91c440bc9fa7a1714cfb71a5597e94d" @@ -4001,11 +3840,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz#3f99a0921596a6f539121a312df29af52a205f15" integrity sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ== -"@rollup/rollup-linux-powerpc64le-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.4.tgz#a9418a4173df80848c0d47df0426a0bf183c4e75" - integrity sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA== - "@rollup/rollup-linux-riscv64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" @@ -4021,11 +3855,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz#c08fb3e629d50d2eac31329347cfc559a1cf81d1" integrity sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A== -"@rollup/rollup-linux-riscv64-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.4.tgz#bc9c195db036a27e5e3339b02f51526b4ce1e988" - integrity sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw== - "@rollup/rollup-linux-s390x-gnu@4.19.0": version "4.19.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz#579ca5f271421a961d3c73d221202c79e02ff03a" @@ -4036,11 +3865,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz#173722cd745779d730d4b24d21386185e0e12de8" integrity sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q== -"@rollup/rollup-linux-s390x-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.4.tgz#1651fdf8144ae89326c01da5d52c60be63e71a82" - integrity sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ== - "@rollup/rollup-linux-x64-gnu@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" @@ -4056,11 +3880,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz#0af2b6541ab0f4954d2c4f96bcdc7947420dd28c" integrity sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q== -"@rollup/rollup-linux-x64-gnu@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.4.tgz#e473de5e4acb95fcf930a35cbb7d3e8080e57a6f" - integrity sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA== - "@rollup/rollup-linux-x64-musl@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" @@ -4076,11 +3895,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz#f973f9552744764b221128f7c3629222216ace69" integrity sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q== -"@rollup/rollup-linux-x64-musl@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.4.tgz#0af12dd2578c29af4037f0c834b4321429dd5b01" - integrity sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q== - "@rollup/rollup-win32-arm64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" @@ -4096,11 +3910,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz#21ac5ed84d914bc31821fec3dd909f7257cfb17b" integrity sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA== -"@rollup/rollup-win32-arm64-msvc@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.4.tgz#e48e78cdd45313b977c1390f4bfde7ab79be8871" - integrity sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA== - "@rollup/rollup-win32-ia32-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" @@ -4116,11 +3925,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz#0cfe740063b35dcd5a62c4e243226631a846ce11" integrity sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ== -"@rollup/rollup-win32-ia32-msvc@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.4.tgz#a3fc8536d243fe161c796acb93eba43c250f311c" - integrity sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg== - "@rollup/rollup-win32-x64-msvc@4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" @@ -4136,11 +3940,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz#5f2c40d3f1b53ede80fb4e6964f840c0f8936832" integrity sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg== -"@rollup/rollup-win32-x64-msvc@4.24.4": - version "4.24.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.4.tgz#e2a9d1fd56524103a6cc8a54404d9d3ebc73c454" - integrity sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg== - "@safe-global/safe-apps-provider@0.18.1": version "0.18.1" resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" @@ -4786,11 +4585,6 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/estree@1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - "@types/ethereumjs-util@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@types/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#f49fe8114789ec0871721392c09318c3eb56671b" @@ -4923,13 +4717,6 @@ dependencies: "@types/lodash" "*" -"@types/lodash.ismatch@^4.4.9": - version "4.4.9" - resolved "https://registry.yarnpkg.com/@types/lodash.ismatch/-/lodash.ismatch-4.4.9.tgz#97b4317f7dc3975bb51660a0f9a055ac7b67b134" - integrity sha512-qWihnStOPKH8urljLGm6ZOEdN/5Bt4vxKR81tL3L4ArUNLvcf9RW3QSnPs21eix5BiqioSWq4aAXD4Iep+d0fw== - dependencies: - "@types/lodash" "*" - "@types/lodash.mapvalues@^4.6.9": version "4.6.9" resolved "https://registry.yarnpkg.com/@types/lodash.mapvalues/-/lodash.mapvalues-4.6.9.tgz#1edb4b1d299db332166b474221b06058b34030a7" @@ -5646,25 +5433,6 @@ chai "^5.1.1" tinyrainbow "^1.2.0" -"@vitest/expect@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.4.tgz#48f4f53a01092a3bdc118cff245f79ef388bdd8e" - integrity sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA== - dependencies: - "@vitest/spy" "2.1.4" - "@vitest/utils" "2.1.4" - chai "^5.1.2" - tinyrainbow "^1.2.0" - -"@vitest/mocker@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.4.tgz#0dc07edb9114f7f080a0181fbcdb16cd4a2d855d" - integrity sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ== - dependencies: - "@vitest/spy" "2.1.4" - estree-walker "^3.0.3" - magic-string "^0.30.12" - "@vitest/pretty-format@2.0.4", "@vitest/pretty-format@^2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.4.tgz#9a3934932e7f8ddd836b38c34ddaeec91bd0f82e" @@ -5672,13 +5440,6 @@ dependencies: tinyrainbow "^1.2.0" -"@vitest/pretty-format@2.1.4", "@vitest/pretty-format@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.4.tgz#fc31993bdc1ef5a6c1a4aa6844e7ba55658a4f9f" - integrity sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww== - dependencies: - tinyrainbow "^1.2.0" - "@vitest/runner@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.4.tgz#0b1edb8ab5f81a1c7dfd50090e5e7e971a117891" @@ -5687,14 +5448,6 @@ "@vitest/utils" "2.0.4" pathe "^1.1.2" -"@vitest/runner@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.4.tgz#f9346500bdd0be1c926daaac5d683bae87ceda2c" - integrity sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA== - dependencies: - "@vitest/utils" "2.1.4" - pathe "^1.1.2" - "@vitest/snapshot@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.4.tgz#7d7dea9df17c5c13386f1a7a433b99dc0ffe3c14" @@ -5704,15 +5457,6 @@ magic-string "^0.30.10" pathe "^1.1.2" -"@vitest/snapshot@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.4.tgz#ef8c3f605fbc23a32773256d37d3fdfd9b23d353" - integrity sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q== - dependencies: - "@vitest/pretty-format" "2.1.4" - magic-string "^0.30.12" - pathe "^1.1.2" - "@vitest/spy@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.4.tgz#19083386a741a158c2f142beffe43be68b1375cf" @@ -5720,13 +5464,6 @@ dependencies: tinyspy "^3.0.0" -"@vitest/spy@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.4.tgz#4e90f9783437c5841a27c80f8fd84d7289a6100a" - integrity sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg== - dependencies: - tinyspy "^3.0.2" - "@vitest/utils@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.4.tgz#2db1df35aaeb5caa932770a190df636a68d284d5" @@ -5737,15 +5474,6 @@ loupe "^3.1.1" tinyrainbow "^1.2.0" -"@vitest/utils@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.4.tgz#6d67ac966647a21ce8bc497472ce230de3b64537" - integrity sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg== - dependencies: - "@vitest/pretty-format" "2.1.4" - loupe "^3.1.2" - tinyrainbow "^1.2.0" - "@wagmi/connectors@4.1.18": version "4.1.18" resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-4.1.18.tgz#b95350ff2cb527093ff9dd11d382e0563ec546e3" @@ -6189,11 +5917,6 @@ abitype@^1.0.5: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== -abitype@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.6.tgz#76410903e1d88e34f1362746e2d407513c38565b" - integrity sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A== - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -7141,17 +6864,6 @@ chai@^5.1.1: loupe "^3.1.0" pathval "^2.0.0" -chai@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.2.tgz#3afbc340b994ae3610ca519a6c70ace77ad4378d" - integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - chalk@5.3.0, chalk@^5.0.1, chalk@^5.2.0, chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" @@ -7249,13 +6961,6 @@ cheerio@^1.0.0-rc.12: optionalDependencies: fsevents "~2.3.2" -chokidar@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" - integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== - dependencies: - readdirp "^4.0.1" - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -8092,13 +7797,6 @@ debug@^4.3.5: dependencies: ms "2.1.2" -debug@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - decache@^3.0.5: version "3.1.0" resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da" @@ -8867,36 +8565,6 @@ esbuild@^0.23.0: "@esbuild/win32-ia32" "0.23.0" "@esbuild/win32-x64" "0.23.0" -esbuild@^0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7" - integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ== - optionalDependencies: - "@esbuild/aix-ppc64" "0.24.0" - "@esbuild/android-arm" "0.24.0" - "@esbuild/android-arm64" "0.24.0" - "@esbuild/android-x64" "0.24.0" - "@esbuild/darwin-arm64" "0.24.0" - "@esbuild/darwin-x64" "0.24.0" - "@esbuild/freebsd-arm64" "0.24.0" - "@esbuild/freebsd-x64" "0.24.0" - "@esbuild/linux-arm" "0.24.0" - "@esbuild/linux-arm64" "0.24.0" - "@esbuild/linux-ia32" "0.24.0" - "@esbuild/linux-loong64" "0.24.0" - "@esbuild/linux-mips64el" "0.24.0" - "@esbuild/linux-ppc64" "0.24.0" - "@esbuild/linux-riscv64" "0.24.0" - "@esbuild/linux-s390x" "0.24.0" - "@esbuild/linux-x64" "0.24.0" - "@esbuild/netbsd-x64" "0.24.0" - "@esbuild/openbsd-arm64" "0.24.0" - "@esbuild/openbsd-x64" "0.24.0" - "@esbuild/sunos-x64" "0.24.0" - "@esbuild/win32-arm64" "0.24.0" - "@esbuild/win32-ia32" "0.24.0" - "@esbuild/win32-x64" "0.24.0" - esbuild@~0.23.0: version "0.23.1" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" @@ -9479,11 +9147,6 @@ execa@^8.0.1: signal-exit "^4.1.0" strip-final-newline "^3.0.0" -expect-type@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.1.0.tgz#a146e414250d13dfc49eafcfd1344a4060fa4c75" - integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== - express@^4.17.3: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" @@ -9575,7 +9238,7 @@ fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-gl merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -9643,11 +9306,6 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -fdir@^6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" - integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== - feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" @@ -11887,11 +11545,6 @@ loupe@^3.1.0, loupe@^3.1.1: dependencies: get-func-name "^2.0.1" -loupe@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.2.tgz#c86e0696804a02218f2206124c45d8b15291a240" - integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -11955,13 +11608,6 @@ magic-string@^0.30.10: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -magic-string@^0.30.12: - version "0.30.12" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60" - integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - magic-string@^0.30.3: version "0.30.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d" @@ -12941,7 +12587,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -13007,17 +12653,6 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nise@^5.1.9: - version "5.1.9" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.9.tgz#0cb73b5e4499d738231a473cd89bd8afbb618139" - integrity sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww== - dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^11.2.2" - "@sinonjs/text-encoding" "^0.7.2" - just-extend "^6.2.0" - path-to-regexp "^6.2.1" - nise@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nise/-/nise-6.0.0.tgz#ae56fccb5d912037363c3b3f29ebbfa28bde8b48" @@ -13705,21 +13340,11 @@ picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - pidtree@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -14826,11 +14451,6 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.5.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" - integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -15310,33 +14930,6 @@ rollup@^4.19.0: "@rollup/rollup-win32-x64-msvc" "4.19.1" fsevents "~2.3.2" -rollup@^4.24.0: - version "4.24.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.4.tgz#fdc76918de02213c95447c9ffff5e35dddb1d058" - integrity sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.24.4" - "@rollup/rollup-android-arm64" "4.24.4" - "@rollup/rollup-darwin-arm64" "4.24.4" - "@rollup/rollup-darwin-x64" "4.24.4" - "@rollup/rollup-freebsd-arm64" "4.24.4" - "@rollup/rollup-freebsd-x64" "4.24.4" - "@rollup/rollup-linux-arm-gnueabihf" "4.24.4" - "@rollup/rollup-linux-arm-musleabihf" "4.24.4" - "@rollup/rollup-linux-arm64-gnu" "4.24.4" - "@rollup/rollup-linux-arm64-musl" "4.24.4" - "@rollup/rollup-linux-powerpc64le-gnu" "4.24.4" - "@rollup/rollup-linux-riscv64-gnu" "4.24.4" - "@rollup/rollup-linux-s390x-gnu" "4.24.4" - "@rollup/rollup-linux-x64-gnu" "4.24.4" - "@rollup/rollup-linux-x64-musl" "4.24.4" - "@rollup/rollup-win32-arm64-msvc" "4.24.4" - "@rollup/rollup-win32-ia32-msvc" "4.24.4" - "@rollup/rollup-win32-x64-msvc" "4.24.4" - fsevents "~2.3.2" - rtl-css-js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -15765,18 +15358,6 @@ simple-get@^2.7.0: once "^1.3.1" simple-concat "^1.0.0" -sinon@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-17.0.2.tgz#470894bcc2d24b01bad539722ea46da949892405" - integrity sha512-uihLiaB9FhzesElPDFZA7hDcNABzsVHwr3YfmM9sBllVwab3l0ltGlRV1XhpNfIacNDLGD1QRZNLs5nU5+hTuA== - dependencies: - "@sinonjs/commons" "^3.0.1" - "@sinonjs/fake-timers" "^11.2.2" - "@sinonjs/samsam" "^8.0.0" - diff "^5.2.0" - nise "^5.1.9" - supports-color "^7" - sinon@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.0.tgz#69ca293dbc3e82590a8b0d46c97f63ebc1e5fc01" @@ -16540,34 +16121,11 @@ tinybench@^2.8.0: resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== -tinybench@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyexec@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" - integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== - -tinyglobby@^0.2.9: - version "0.2.10" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" - integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== - dependencies: - fdir "^6.4.2" - picomatch "^4.0.2" - tinypool@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== -tinypool@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.1.tgz#c64233c4fac4304e109a64340178760116dbe1fe" - integrity sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA== - tinyrainbow@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" @@ -16578,11 +16136,6 @@ tinyspy@^3.0.0: resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== -tinyspy@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" - integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -16784,28 +16337,6 @@ tsup@^8.2.3: sucrase "^3.35.0" tree-kill "^1.2.2" -tsup@^8.3.0: - version "8.3.5" - resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.3.5.tgz#d55344e4756e924bf6f442e54e7d324b4471eee0" - integrity sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA== - dependencies: - bundle-require "^5.0.0" - cac "^6.7.14" - chokidar "^4.0.1" - consola "^3.2.3" - debug "^4.3.7" - esbuild "^0.24.0" - joycon "^3.1.1" - picocolors "^1.1.1" - postcss-load-config "^6.0.1" - resolve-from "^5.0.0" - rollup "^4.24.0" - source-map "0.8.0-beta.0" - sucrase "^3.35.0" - tinyexec "^0.3.1" - tinyglobby "^0.2.9" - tree-kill "^1.2.2" - tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -17016,7 +16547,7 @@ typedoc@^0.25.7: minimatch "^9.0.3" shiki "^0.14.7" -typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@^5.6.2, typescript@~5.2.2: +typescript@^5.0.2, typescript@^5.3.3, typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@~5.2.2: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== @@ -17416,7 +16947,7 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" -viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.21.37, viem@^2.7.8, viem@^2.9.2: +viem@2.9.2, viem@^1.0.0, viem@^1.1.4, viem@^2.7.8, viem@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.2.tgz#29bd2425222be136bf969a90dd3a8d6032221904" integrity sha512-GRakUTNiYE9W+vL+Be9JkQfzWnkczerHtSpEe2JR/jEGTYZAs4shrA4WLgiaVCI9JxpnduZhQfRWNvy2dlyP2g== @@ -17441,16 +16972,6 @@ vite-node@2.0.4: tinyrainbow "^1.2.0" vite "^5.0.0" -vite-node@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.4.tgz#97ffb6de913fd8d42253afe441f9512e9dbdfd5c" - integrity sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg== - dependencies: - cac "^6.7.14" - debug "^4.3.7" - pathe "^1.1.2" - vite "^5.0.0" - vite-plugin-node-polyfills@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz#d0afcf82eb985fc02244620d7cec1ddd1c6e0864" @@ -17468,15 +16989,6 @@ vite-tsconfig-paths@^4.2.0, vite-tsconfig-paths@^4.3.2: globrex "^0.1.2" tsconfck "^3.0.3" -vite-tsconfig-paths@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.0.tgz#b449b6749eb69e635ad4b5fcf4f4181b92d512c9" - integrity sha512-Y1PLGHCJfAq1Zf4YIGEsmuU/NCX1epoZx9zwSr32Gjn3aalwQHRKr5aUmbo6r0JHeHkqmWpmDg7WOynhYXw1og== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - tsconfck "^3.0.3" - vite@^5.0.0, vite@^5.3.5: version "5.3.5" resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" @@ -17513,32 +17025,6 @@ vitest@^2.0.4: vite-node "2.0.4" why-is-node-running "^2.3.0" -vitest@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.4.tgz#ba8f4589fb639cf5a9e6af54781667312b3e8230" - integrity sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ== - dependencies: - "@vitest/expect" "2.1.4" - "@vitest/mocker" "2.1.4" - "@vitest/pretty-format" "^2.1.4" - "@vitest/runner" "2.1.4" - "@vitest/snapshot" "2.1.4" - "@vitest/spy" "2.1.4" - "@vitest/utils" "2.1.4" - chai "^5.1.2" - debug "^4.3.7" - expect-type "^1.1.0" - magic-string "^0.30.12" - pathe "^1.1.2" - std-env "^3.7.0" - tinybench "^2.9.0" - tinyexec "^0.3.1" - tinypool "^1.0.1" - tinyrainbow "^1.2.0" - vite "^5.0.0" - vite-node "2.1.4" - why-is-node-running "^2.3.0" - vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" From 38a26c600756dc01e306b9fd6ce4ae9830486b46 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 20:04:40 -0600 Subject: [PATCH 26/43] Refactor UI to use sdk core directly --- apps/hyperdrive-trading/src/drift/getDrift.ts | 23 ++++++++++ .../src/hyperdrive/getLpApy.ts | 2 +- .../src/hyperdrive/getYieldSourceRate.ts | 2 +- apps/hyperdrive-trading/src/sdk/sdkCache.ts | 4 -- .../src/ui/chainlog/FactoriesTable.tsx | 17 ++----- .../src/ui/chainlog/PoolsTable.tsx | 16 ++----- .../src/ui/drift/useDrift.ts | 46 +++++++++++++++++++ .../src/ui/hyperdrive/hooks/usePoolInfo.ts | 2 +- .../ui/hyperdrive/hooks/usePrepareSharesIn.ts | 2 +- .../hyperdrive/hooks/usePrepareSharesOut.ts | 2 +- .../ui/hyperdrive/hooks/useReadHyperdrive.ts | 30 +++++++----- .../hooks/useReadWriteHyperdrive.ts | 34 +++++++++----- .../longs/CloseLongForm/CloseLongForm.tsx | 2 +- .../CloseLongModalButton.tsx | 2 +- .../longs/OpenLongPreview/OpenLongStats.tsx | 2 +- .../longs/OpenLongsTable/CurrentValueCell.tsx | 2 +- .../OpenLongsTable/OpenLongsTableDesktop.tsx | 2 +- .../ui/hyperdrive/longs/hooks/useFixedRate.ts | 2 +- .../ui/hyperdrive/longs/hooks/useOpenLongs.ts | 2 +- .../longs/hooks/useTotalClosedLongsValue.ts | 2 +- .../longs/hooks/useTotalOpenLongsValue.ts | 2 +- .../lp/AddLiquidityForm/AddLiquidityForm.tsx | 2 +- .../RemoveLiquidityForm.tsx | 2 +- .../lp/hooks/useRedeemedWithdrawalShares.ts | 2 +- .../shorts/CloseShortForm/CloseShortForm.tsx | 5 +- .../CloseShortModalButton.tsx | 2 +- .../ClosedShortsTable/ClosedShortsTable.tsx | 2 +- .../OpenShortsTable/AccruedYieldCell.tsx | 2 +- .../CurrentShortsValueCell.tsx | 2 +- .../OpenShortsTable/CurrentValueCell.tsx | 2 +- .../OpenShortsTableDesktop.tsx | 2 +- .../OpenShortsTable/ShortRateAndSizeCell.tsx | 2 +- .../shorts/hooks/useClosedShorts.ts | 2 +- .../hyperdrive/shorts/hooks/useOpenShort.tsx | 2 +- .../hyperdrive/shorts/hooks/useOpenShorts.ts | 2 +- .../hyperdrive/shorts/hooks/useShortRate.ts | 2 +- .../shorts/hooks/useTotalClosedShortsValue.ts | 2 +- .../shorts/hooks/useTotalOpenShortsValue.ts | 2 +- .../RedeemWithdrawalSharesForm.tsx | 2 +- .../src/ui/markets/PoolsList.tsx | 14 ++---- .../src/ui/portfolio/usePortfolioLongsData.ts | 28 ++--------- .../src/ui/portfolio/usePortfolioLpData.ts | 28 ++--------- .../ui/portfolio/usePortfolioShortsData.ts | 28 ++--------- .../src/ui/registry/hooks/useReadRegistry.ts | 15 +++--- 44 files changed, 179 insertions(+), 171 deletions(-) create mode 100644 apps/hyperdrive-trading/src/drift/getDrift.ts delete mode 100644 apps/hyperdrive-trading/src/sdk/sdkCache.ts create mode 100644 apps/hyperdrive-trading/src/ui/drift/useDrift.ts diff --git a/apps/hyperdrive-trading/src/drift/getDrift.ts b/apps/hyperdrive-trading/src/drift/getDrift.ts new file mode 100644 index 000000000..5f15e70d2 --- /dev/null +++ b/apps/hyperdrive-trading/src/drift/getDrift.ts @@ -0,0 +1,23 @@ +import { createLruSimpleCache, Drift, DriftOptions } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; +import { getPublicClient, GetPublicClientParameters } from "@wagmi/core"; +import { wagmiConfig } from "src/network/wagmiClient"; + +// 1 minute TTL to match the queryClient's staleTime +export const sdkCache = createLruSimpleCache({ max: 500, ttl: 60_000 }); + +export function getDriftOptions({ + chainId, +}: { + chainId?: number; +} = {}): DriftOptions { + return { + cache: sdkCache, + cacheNamespace: chainId, + }; +} + +export function getDrift(params?: GetPublicClientParameters): Drift { + const publicClient = getPublicClient(wagmiConfig as any, params) as any; + return new Drift(viemAdapter({ publicClient }), getDriftOptions(params)); +} diff --git a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts index 48ecf8dba..12511c1c8 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts @@ -5,7 +5,7 @@ import { getRewardsFn, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; import { getPublicClient } from "@wagmi/core"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; import { isForkChain } from "src/chains/isForkChain"; diff --git a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts index a43cde013..e59bc382f 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts @@ -6,7 +6,7 @@ import { getRewardsFn, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; import { getPublicClient } from "@wagmi/core"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; import { isForkChain } from "src/chains/isForkChain"; diff --git a/apps/hyperdrive-trading/src/sdk/sdkCache.ts b/apps/hyperdrive-trading/src/sdk/sdkCache.ts deleted file mode 100644 index 0cca2c799..000000000 --- a/apps/hyperdrive-trading/src/sdk/sdkCache.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { createLruSimpleCache } from "@delvtech/drift"; - -// 1 minute TTL to match the queryClient's staleTime -export const sdkCache = createLruSimpleCache({ max: 500, ttl: 60_000 }); diff --git a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx index bf5569958..3c0bd644e 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx @@ -1,4 +1,4 @@ -import { ReadRegistry } from "@delvtech/hyperdrive-viem"; +import { ReadRegistry } from "@delvtech/hyperdrive-js-core"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { UseQueryResult, useQuery } from "@tanstack/react-query"; import { @@ -8,20 +8,18 @@ import { getSortedRowModel, useReactTable, } from "@tanstack/react-table"; -import { getPublicClient } from "@wagmi/core"; import classNames from "classnames"; import { ReactElement } from "react"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { wagmiConfig } from "src/network/wagmiClient"; +import { getDrift } from "src/drift/getDrift"; import { Status, decodeFactoryData } from "src/registry/data"; -import { sdkCache } from "src/sdk/sdkCache"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { NonIdealState } from "src/ui/base/components/NonIdealState"; import { TableSkeleton } from "src/ui/base/components/TableSkeleton"; import { AddressCell } from "src/ui/chainlog/AddressCell"; import { ChainCell } from "src/ui/chainlog/ChainCell"; import { StatusCell } from "src/ui/chainlog/StatusCell"; -import { Address, PublicClient } from "viem"; +import { Address } from "viem"; export function FactoriesTable(): ReactElement { const { data = [], isFetching } = useFactoriesQuery(); @@ -178,16 +176,9 @@ function useFactoriesQuery(): UseQueryResult { await Promise.all( chainIds.map(async (chainId) => { - // TODO: Cleanup type casting - const publicClient = getPublicClient(wagmiConfig as any, { - chainId, - }) as PublicClient; - const registry = new ReadRegistry({ address: connectedAppConfig.registries[chainId], - publicClient, - cache: sdkCache, - cacheNamespace: chainId.toString(), + drift: getDrift({ chainId }), }); const factoryAddresses = await registry.getFactoryAddresses(); diff --git a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx index e08719f36..8f8c13818 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx @@ -1,4 +1,4 @@ -import { ReadRegistry } from "@delvtech/hyperdrive-viem"; +import { ReadRegistry } from "@delvtech/hyperdrive-js-core"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { UseQueryResult, useQuery } from "@tanstack/react-query"; import { Link } from "@tanstack/react-router"; @@ -9,13 +9,11 @@ import { getSortedRowModel, useReactTable, } from "@tanstack/react-table"; -import { getPublicClient } from "@wagmi/core"; import classNames from "classnames"; import { ReactElement } from "react"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { wagmiConfig } from "src/network/wagmiClient"; +import { getDrift } from "src/drift/getDrift"; import { Status, decodeInstanceData } from "src/registry/data"; -import { sdkCache } from "src/sdk/sdkCache"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { NonIdealState } from "src/ui/base/components/NonIdealState"; import { TableSkeleton } from "src/ui/base/components/TableSkeleton"; @@ -23,7 +21,7 @@ import { AddressCell } from "src/ui/chainlog/AddressCell"; import { ChainCell } from "src/ui/chainlog/ChainCell"; import { PausedCell } from "src/ui/chainlog/PausedCell"; import { StatusCell } from "src/ui/chainlog/StatusCell"; -import { Address, PublicClient } from "viem"; +import { Address } from "viem"; export function PoolsTable(): ReactElement { const { data = [], isFetching } = usePoolsQuery(); @@ -225,15 +223,9 @@ function usePoolsQuery(): UseQueryResult { // requests by 80% and data transfer by 65%. Promise.all( chainIds.map(async (chainId) => { - const publicClient = getPublicClient(wagmiConfig as any, { - chainId, - }) as PublicClient; - const registry = new ReadRegistry({ address: connectedAppConfig.registries[chainId], - publicClient, - cache: sdkCache, - cacheNamespace: chainId.toString(), + drift: getDrift({ chainId }), }); return registry.getInstances().then((instances) => { diff --git a/apps/hyperdrive-trading/src/ui/drift/useDrift.ts b/apps/hyperdrive-trading/src/ui/drift/useDrift.ts new file mode 100644 index 000000000..2b9c6dd49 --- /dev/null +++ b/apps/hyperdrive-trading/src/ui/drift/useDrift.ts @@ -0,0 +1,46 @@ +import { Drift, ReadWriteAdapter } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; +import { useMemo } from "react"; +import { getDriftOptions } from "src/drift/getDrift"; +import { + usePublicClient, + UsePublicClientParameters, + useWalletClient, + UseWalletClientParameters, +} from "wagmi"; + +export function useDrift( + params?: UsePublicClientParameters, +): Drift | undefined { + const publicClient = usePublicClient(params); + const { data: walletClient } = useWalletClient(params); + + return useMemo( + () => + publicClient + ? new Drift( + viemAdapter({ publicClient, walletClient }), + getDriftOptions({ chainId: publicClient.chain.id }), + ) + : undefined, + [publicClient, walletClient], + ); +} + +export function useReadWriteDrift( + params?: UseWalletClientParameters, +): Drift | undefined { + const publicClient = usePublicClient(params); + const { data: walletClient } = useWalletClient(params); + + return useMemo( + () => + publicClient && walletClient + ? new Drift( + viemAdapter({ publicClient, walletClient }), + getDriftOptions({ chainId: publicClient.chain.id }), + ) + : undefined, + [publicClient, walletClient], + ); +} diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts index 0bc328044..17c95b0e2 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts @@ -1,4 +1,4 @@ -import { PoolInfo } from "@delvtech/hyperdrive-viem"; +import { PoolInfo } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts index cc1711151..94db7b701 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts @@ -3,7 +3,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { QueryStatusWithIdle, getStatus } from "src/base/queryStatus"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts index 92f0cc27c..262db32d1 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts @@ -3,7 +3,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { QueryStatusWithIdle, getStatus } from "src/base/queryStatus"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts index c9b0f67c6..d7e0b6be9 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts @@ -1,9 +1,12 @@ -import { getHyperdrive, ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { + appConfig, + findHyperdriveConfig, +} from "@delvtech/hyperdrive-appconfig"; +import { getHyperdrive, ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { sdkCache } from "src/sdk/sdkCache"; +import { useDrift } from "src/ui/drift/useDrift"; import { Address } from "viem"; -import { usePublicClient } from "wagmi"; export function useReadHyperdrive({ chainId, @@ -12,9 +15,8 @@ export function useReadHyperdrive({ chainId: number; address: Address | undefined; }): ReadHyperdrive | undefined { - const publicClient = usePublicClient({ chainId }); - - const enabled = !!address && !!publicClient; + const drift = useDrift({ chainId }); + const enabled = !!address && !!drift; const { data } = useQuery({ queryKey: makeQueryKey("getReadHyperdrive", { @@ -23,12 +25,18 @@ export function useReadHyperdrive({ }), enabled, queryFn: enabled - ? () => - getHyperdrive({ + ? () => { + const { initializationBlock } = findHyperdriveConfig({ + hyperdriveAddress: address, + hyperdriveChainId: chainId, + hyperdrives: appConfig.hyperdrives, + }); + return getHyperdrive({ address, - publicClient, - cache: sdkCache, - }) + drift, + earliestBlock: initializationBlock, + }); + } : undefined, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts index 93c9c6437..73dd830e6 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts @@ -1,9 +1,15 @@ -import { getHyperdrive, ReadWriteHyperdrive } from "@delvtech/hyperdrive-viem"; +import { + appConfig, + findHyperdriveConfig, +} from "@delvtech/hyperdrive-appconfig"; +import { + getHyperdrive, + ReadWriteHyperdrive, +} from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { sdkCache } from "src/sdk/sdkCache"; +import { useReadWriteDrift } from "src/ui/drift/useDrift"; import { Address } from "viem"; -import { usePublicClient, useWalletClient } from "wagmi"; export function useReadWriteHyperdrive({ address, @@ -12,10 +18,9 @@ export function useReadWriteHyperdrive({ address: Address | undefined; chainId: number; }): ReadWriteHyperdrive | undefined { - const publicClient = usePublicClient({ chainId }); - const { data: walletClient } = useWalletClient({ chainId }); + const drift = useReadWriteDrift({ chainId }); - const enabled = !!address && !!publicClient && !!walletClient; + const enabled = !!address && !!drift; const { data } = useQuery({ queryKey: makeQueryKey("getReadWriteHyperdrive", { @@ -24,13 +29,18 @@ export function useReadWriteHyperdrive({ }), enabled, queryFn: enabled - ? () => - getHyperdrive({ + ? () => { + const { initializationBlock } = findHyperdriveConfig({ + hyperdriveAddress: address, + hyperdriveChainId: chainId, + hyperdrives: appConfig.hyperdrives, + }); + return getHyperdrive({ address, - publicClient, - walletClient, - cache: sdkCache, - }) + drift, + earliestBlock: initializationBlock, + }); + } : undefined, }); diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx index a199fa518..2029103a5 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx @@ -6,7 +6,7 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage, Long } from "@delvtech/hyperdrive-viem"; +import { adjustAmountByPercentage, Long } from "@delvtech/hyperdrive-js-core"; import { MouseEvent, ReactElement } from "react"; import { isTestnetChain } from "src/chains/isTestnetChain"; import { LoadingButton } from "src/ui/base/components/LoadingButton"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx index 88309aa73..8e2117c7f 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx @@ -5,7 +5,7 @@ import { findBaseToken, findToken, } from "@delvtech/hyperdrive-appconfig"; -import { Long } from "@delvtech/hyperdrive-viem"; +import { Long } from "@delvtech/hyperdrive-js-core"; import { ReactElement } from "react"; import { Modal } from "src/ui/base/components/Modal/Modal"; import { ModalHeader } from "src/ui/base/components/Modal/ModalHeader"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx index 802540e23..a3a298fb4 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx @@ -5,7 +5,7 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; -import { calculateAprFromPrice } from "@delvtech/hyperdrive-viem"; +import { calculateAprFromPrice } from "@delvtech/hyperdrive-js-core"; import classNames from "classnames"; import Skeleton from "react-loading-skeleton"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx index c81edba9b..ec33c78c8 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx @@ -3,7 +3,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenLongPositionReceived } from "@delvtech/hyperdrive-viem"; +import { OpenLongPositionReceived } from "@delvtech/hyperdrive-js-core"; import { ExclamationTriangleIcon } from "@heroicons/react/20/solid"; import classNames from "classnames"; import { ReactElement } from "react"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx index 662863631..7a0fcda37 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx @@ -8,7 +8,7 @@ import { import { calculateAprFromPrice, OpenLongPositionReceived, -} from "@delvtech/hyperdrive-viem"; +} from "@delvtech/hyperdrive-js-core"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { Link } from "@tanstack/react-router"; import { diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts index 1b5d0d567..bb1050ddc 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts @@ -3,7 +3,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { getHprFromApr } from "@delvtech/hyperdrive-viem"; +import { getHprFromApr } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { formatRate } from "src/base/formatRate"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts index fe568c4c7..2ad5d97f5 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts @@ -1,4 +1,4 @@ -import { Long, OpenLongPositionReceived } from "@delvtech/hyperdrive-viem"; +import { Long, OpenLongPositionReceived } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts index c62b0ceeb..333b0046b 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { ClosedLong } from "@delvtech/hyperdrive-viem"; +import { ClosedLong } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts index 35d6f43f8..700d8ddbc 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { Long } from "@delvtech/hyperdrive-viem"; +import { Long } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { usePoolInfo } from "src/ui/hyperdrive/hooks/usePoolInfo"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx index 7b6df0c38..e892b9b94 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx @@ -6,7 +6,7 @@ import { findBaseToken, findToken, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-viem"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; import classNames from "classnames"; import { MouseEvent, ReactElement } from "react"; import Skeleton from "react-loading-skeleton"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx index 89f7699bd..b1e5bb591 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx @@ -5,7 +5,7 @@ import { findToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-viem"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; import { MouseEvent, ReactElement } from "react"; import Skeleton from "react-loading-skeleton"; import { calculateRatio } from "src/base/calculateRatio"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts index d46e3c3da..ab5213cbf 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts @@ -1,4 +1,4 @@ -import { RedeemedWithdrawalShares } from "@delvtech/hyperdrive-viem"; +import { RedeemedWithdrawalShares } from "@delvtech/hyperdrive-js-core"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx index 179320f61..14a0cac61 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx @@ -5,7 +5,10 @@ import { findToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage, OpenShort } from "@delvtech/hyperdrive-viem"; +import { + adjustAmountByPercentage, + OpenShort, +} from "@delvtech/hyperdrive-js-core"; import { MouseEvent, ReactElement } from "react"; import { isTestnetChain } from "src/chains/isTestnetChain"; import { LoadingButton } from "src/ui/base/components/LoadingButton"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx index 38a2e1a1a..3f7397f07 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx @@ -5,7 +5,7 @@ import { findBaseToken, findToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { OpenShort } from "@delvtech/hyperdrive-js-core"; import { ReactElement } from "react"; import { Modal } from "src/ui/base/components/Modal/Modal"; import { ModalHeader } from "src/ui/base/components/Modal/ModalHeader"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx index c02174211..482a30971 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx @@ -4,7 +4,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { ClosedShort } from "@delvtech/hyperdrive-viem"; +import { ClosedShort } from "@delvtech/hyperdrive-js-core"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/16/solid"; import { createColumnHelper, diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx index 10c6ec644..21dea1c55 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx @@ -3,7 +3,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { OpenShort } from "@delvtech/hyperdrive-js-core"; import classNames from "classnames"; import { ReactElement } from "react"; import { formatBalance } from "src/ui/base/formatting/formatBalance"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx index 3fa93f506..5dada7bf3 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx @@ -3,7 +3,7 @@ import { findBaseToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { OpenShort } from "@delvtech/hyperdrive-js-core"; import { ExclamationTriangleIcon } from "@heroicons/react/16/solid"; import classNames from "classnames"; import { ReactElement } from "react"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx index f4d6ba20c..ad7e57a59 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx @@ -3,7 +3,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { OpenShort } from "@delvtech/hyperdrive-js-core"; import { ExclamationTriangleIcon } from "@heroicons/react/20/solid"; import classNames from "classnames"; import { ReactElement } from "react"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx index 35fc58181..cd69f5384 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx @@ -5,7 +5,7 @@ import { findToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { OpenShort } from "@delvtech/hyperdrive-js-core"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { Link } from "@tanstack/react-router"; import { diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx index c26e74e62..cc0a3b81b 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx @@ -3,7 +3,7 @@ import { findBaseToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { OpenShort } from "@delvtech/hyperdrive-js-core"; import classNames from "classnames"; import { ReactElement } from "react"; import { formatRate } from "src/base/formatRate"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts index 2ace58600..e0e4969db 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts @@ -1,4 +1,4 @@ -import { ClosedShort } from "@delvtech/hyperdrive-viem"; +import { ClosedShort } from "@delvtech/hyperdrive-js-core"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx index 07495f134..dbda7afd6 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx @@ -1,5 +1,5 @@ import { appConfig } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-viem"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; import { useAddRecentTransaction } from "@rainbow-me/rainbowkit"; import { MutationStatus, diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts index 9ef178d33..862ff3ad0 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts @@ -1,4 +1,4 @@ -import { OpenShort } from "@delvtech/hyperdrive-viem"; +import { OpenShort } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts index 80683b3f6..5eb33878d 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts @@ -2,7 +2,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { getHprFromApr } from "@delvtech/hyperdrive-viem"; +import { getHprFromApr } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { formatRate } from "src/base/formatRate"; import { makeQueryKey } from "src/base/makeQueryKey"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts index c355be46d..989bfdbc4 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { ClosedShort } from "@delvtech/hyperdrive-viem"; +import { ClosedShort } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts index 26a721584..2b71c8e15 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { Short } from "@delvtech/hyperdrive-viem"; +import { Short } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { usePoolInfo } from "src/ui/hyperdrive/hooks/usePoolInfo"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx index 9dd2a9a77..bdfdac8f8 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx @@ -6,7 +6,7 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-viem"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; import { ReactElement } from "react"; import { convertSharesToBase } from "src/hyperdrive/convertSharesToBase"; import { LabelValue } from "src/ui/base/components/LabelValue"; diff --git a/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx b/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx index 6b4319248..1c65bf41d 100644 --- a/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx +++ b/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx @@ -6,15 +6,13 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; -import { getHyperdrive } from "@delvtech/hyperdrive-viem"; +import { getHyperdrive } from "@delvtech/hyperdrive-js-core"; import { AdjustmentsHorizontalIcon } from "@heroicons/react/20/solid"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { useNavigate, useSearch } from "@tanstack/react-router"; -import { getPublicClient } from "@wagmi/core"; import { ReactElement, ReactNode, useMemo } from "react"; import { ZERO_ADDRESS } from "src/base/constants"; -import { wagmiConfig } from "src/network/wagmiClient"; -import { sdkCache } from "src/sdk/sdkCache"; +import { getDrift } from "src/drift/getDrift"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import LoadingState from "src/ui/base/components/LoadingState"; import { MultiSelect } from "src/ui/base/components/MultiSelect"; @@ -22,7 +20,6 @@ import { NonIdealState } from "src/ui/base/components/NonIdealState"; import { Well } from "src/ui/base/components/Well/Well"; import { LANDING_ROUTE } from "src/ui/landing/routes"; import { PoolRow } from "src/ui/markets/PoolRow/PoolRow"; -import { PublicClient } from "viem"; import { useChainId } from "wagmi"; // TODO: Re-implement sorting without blocking the list from rendering. @@ -343,13 +340,10 @@ function usePoolsList(): { queryFn: async () => { const pools = await Promise.all( appConfigForConnectedChain.hyperdrives.map(async (hyperdrive) => { - const publicClient = getPublicClient(wagmiConfig as any, { - chainId: hyperdrive.chainId, - }); const readHyperdrive = await getHyperdrive({ address: hyperdrive.address, - publicClient: publicClient as PublicClient, - cache: sdkCache, + drift: getDrift({ chainId: hyperdrive.chainId }), + earliestBlock: hyperdrive.initializationBlock, }); // We only show hyperdrives that are not paused diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts index b78b5c3f4..bca9c546b 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts @@ -2,12 +2,11 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; import { getHyperdrive, OpenLongPositionReceived, -} from "@delvtech/hyperdrive-viem"; +} from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { sdkCache } from "src/sdk/sdkCache"; +import { getDrift } from "src/drift/getDrift"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; -import { usePublicClients } from "src/ui/hyperdrive/hooks/usePublicClients"; import { useAccount } from "wagmi"; type OpenLongPositionsData = { @@ -20,13 +19,8 @@ export function usePortfolioLongsData(): { openLongPositionsStatus: "error" | "success" | "loading"; } { const { address: account } = useAccount(); - const appConfigForConnectedChain = useAppConfigForConnectedChain(); - - const clients = usePublicClients( - Object.keys(appConfigForConnectedChain.chains).map(Number), - ); - const queryEnabled = !!account && !!appConfigForConnectedChain && !!clients; + const queryEnabled = !!account && !!appConfigForConnectedChain; const { data: openLongPositions, status: openLongPositionsStatus } = useQuery( { @@ -36,22 +30,10 @@ export function usePortfolioLongsData(): { ? async () => await Promise.all( appConfigForConnectedChain.hyperdrives.map(async (hyperdrive) => { - const publicClient = clients[hyperdrive.chainId]?.publicClient; - - if (!publicClient) { - console.error( - `No public client found for chainId ${hyperdrive.chainId}`, - ); - return { - hyperdrive, - openLongs: [], - }; - } - const readHyperdrive = await getHyperdrive({ address: hyperdrive.address, - publicClient, - cache: sdkCache, + drift: getDrift({ chainId: hyperdrive.chainId }), + earliestBlock: hyperdrive.initializationBlock, }); const allLongs = await readHyperdrive.getOpenLongPositions({ diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts index 6ae31a48c..004e0d89e 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts @@ -1,10 +1,9 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { getHyperdrive } from "@delvtech/hyperdrive-viem"; +import { getHyperdrive } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { sdkCache } from "src/sdk/sdkCache"; +import { getDrift } from "src/drift/getDrift"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; -import { usePublicClients } from "src/ui/hyperdrive/hooks/usePublicClients"; import { useAccount } from "wagmi"; type LpPosition = { @@ -18,37 +17,20 @@ export function usePortfolioLpData(): { openLpPositionStatus: "error" | "success" | "loading"; } { const { address: account } = useAccount(); - const appConfigForConnectedChain = useAppConfigForConnectedChain(); - const queryEnabled = !!account && !!appConfigForConnectedChain.hyperdrives.length; - const clients = usePublicClients( - Object.keys(appConfigForConnectedChain.chains).map(Number), - ); + const { data, status } = useQuery({ queryKey: makeQueryKey("portfolioLp", { account }), queryFn: queryEnabled ? async () => { const results = await Promise.all( appConfigForConnectedChain.hyperdrives.map(async (hyperdrive) => { - const publicClient = clients[hyperdrive.chainId]?.publicClient; - - if (!publicClient) { - console.error( - `No public client found for chainId ${hyperdrive.chainId}`, - ); - return { - hyperdrive, - lpShares: 0n, - withdrawalShares: 0n, - }; - } - const readHyperdrive = await getHyperdrive({ address: hyperdrive.address, - publicClient, - cache: sdkCache, + drift: getDrift({ chainId: hyperdrive.chainId }), + earliestBlock: hyperdrive.initializationBlock, }); const [lpShares, withdrawalShares] = await Promise.all([ diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts index 2375cd814..16cc9067b 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts @@ -1,10 +1,9 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { getHyperdrive, OpenShort } from "@delvtech/hyperdrive-viem"; +import { getHyperdrive, OpenShort } from "@delvtech/hyperdrive-js-core"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; -import { sdkCache } from "src/sdk/sdkCache"; +import { getDrift } from "src/drift/getDrift"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; -import { usePublicClients } from "src/ui/hyperdrive/hooks/usePublicClients"; import { useAccount } from "wagmi"; type OpenShortPositionsData = { @@ -17,13 +16,8 @@ export function usePortfolioShortsData(): { openShortPositionsStatus: "error" | "success" | "loading"; } { const { address: account } = useAccount(); - const appConfigForConnectedChain = useAppConfigForConnectedChain(); - - const clients = usePublicClients( - Object.keys(appConfigForConnectedChain.chains).map(Number), - ); - const queryEnabled = !!account && !!appConfigForConnectedChain && !!clients; + const queryEnabled = !!account && !!appConfigForConnectedChain; const { data: openShortPositions, status: openShortPositionsStatus } = useQuery({ @@ -33,22 +27,10 @@ export function usePortfolioShortsData(): { ? async () => await Promise.all( appConfigForConnectedChain.hyperdrives.map(async (hyperdrive) => { - const publicClient = clients[hyperdrive.chainId]?.publicClient; - - if (!publicClient) { - console.error( - `No public client found for chainId ${hyperdrive.chainId}`, - ); - return { - hyperdrive, - openShorts: [], - }; - } - const readHyperdrive = await getHyperdrive({ address: hyperdrive.address, - publicClient, - cache: sdkCache, + drift: getDrift({ chainId: hyperdrive.chainId }), + earliestBlock: hyperdrive.initializationBlock, }); return { diff --git a/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts b/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts index 612affdd1..876cc0cbf 100644 --- a/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts +++ b/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts @@ -1,21 +1,20 @@ -import { ReadRegistry } from "@delvtech/hyperdrive-viem"; +import { ReadRegistry } from "@delvtech/hyperdrive-js-core"; import { useMemo } from "react"; -import { sdkCache } from "src/sdk/sdkCache"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; -import { usePublicClient } from "wagmi"; +import { useDrift } from "src/ui/drift/useDrift"; export function useReadRegistry(chainId: number): ReadRegistry | undefined { const { registries } = useAppConfigForConnectedChain(); - const publicClient = usePublicClient(); + const drift = useDrift(); return useMemo( () => - publicClient + drift ? new ReadRegistry({ address: registries[chainId], - publicClient, - cache: sdkCache, + drift, + cacheNamespace: chainId, }) : undefined, - [publicClient, registries, chainId], + [drift, registries, chainId], ); } From 87b1f5e6374b91e656b75d66d65a5cf0f15c9d41 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Wed, 6 Nov 2024 20:05:06 -0600 Subject: [PATCH 27/43] Remove unused prop from `OpenLongForm` --- .../src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx | 1 - .../src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx | 3 --- 2 files changed, 4 deletions(-) diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx index d2a04dc16..a5bdc2b0b 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx @@ -368,7 +368,6 @@ export function OpenLongForm({ primaryStats={ Date: Thu, 7 Nov 2024 19:38:57 -0600 Subject: [PATCH 28/43] Bump drift version --- apps/hyperdrive-trading/package.json | 4 ++-- apps/sdk-sandbox/package.json | 4 ++-- packages/hyperdrive-js-core/package.json | 4 ++-- packages/hyperdrive-viem/package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/hyperdrive-trading/package.json b/apps/hyperdrive-trading/package.json index b5e6e5999..328128f95 100644 --- a/apps/hyperdrive-trading/package.json +++ b/apps/hyperdrive-trading/package.json @@ -28,8 +28,8 @@ "gen:walletconnect": "bash ./scripts/generate-walletconnect.sh" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.9", - "@delvtech/drift-viem": "^0.0.1-beta.11", + "@delvtech/drift": "^0.0.1-beta.11", + "@delvtech/drift-viem": "^0.0.1-beta.13", "@delvtech/fixed-point-wasm": "^0.0.6", "@delvtech/hyperdrive-appconfig": "^0.0.1", "@delvtech/hyperdrive-js-core": "^3.0.6", diff --git a/apps/sdk-sandbox/package.json b/apps/sdk-sandbox/package.json index 9cf5da229..c83fb6dbc 100644 --- a/apps/sdk-sandbox/package.json +++ b/apps/sdk-sandbox/package.json @@ -11,8 +11,8 @@ "fixed-point:watch": "tsx -r dotenv/config --watch scripts/fixed-point.ts" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.9", - "@delvtech/drift-viem": "^0.0.1-beta.11", + "@delvtech/drift": "^0.0.1-beta.11", + "@delvtech/drift-viem": "^0.0.1-beta.13", "@delvtech/fixed-point-wasm": "*", "@delvtech/hyperdrive-appconfig": "*", "@delvtech/hyperdrive-viem": "*", diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index d8bb836fb..6f520313f 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -11,7 +11,7 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "@delvtech/drift": "^0.0.1-beta.9" + "@delvtech/drift": "^0.0.1-beta.11" }, "dependencies": { "@delvtech/fixed-point-wasm": "^0.0.6", @@ -22,7 +22,7 @@ "semver": "^7.6.3" }, "devDependencies": { - "@delvtech/drift": "^0.0.1-beta.9", + "@delvtech/drift": "^0.0.1-beta.11", "@hyperdrive/eslint-config": "*", "@hyperdrive/prettier-config": "*", "@hyperdrive/tsconfig": "*", diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index 9d67e9515..fde3b322d 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -12,8 +12,8 @@ "viem": "^2.7.8" }, "dependencies": { - "@delvtech/drift": "^0.0.1-beta.9", - "@delvtech/drift-viem": "^0.0.1-beta.11", + "@delvtech/drift": "^0.0.1-beta.11", + "@delvtech/drift-viem": "^0.0.1-beta.13", "@delvtech/hyperdrive-js-core": "3.0.6" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index a05ced751..2af3ee972 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,15 +1479,15 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@delvtech/drift-viem@^0.0.1-beta.11": - version "0.0.1-beta.11" - resolved "https://registry.yarnpkg.com/@delvtech/drift-viem/-/drift-viem-0.0.1-beta.11.tgz#9cba8d1164939fb30f99e6caf8abbcea17ac48de" - integrity sha512-bO7eH8ysWKimeuIq3xK8oyG+TDuzoaxOAXnuvoDlot7XuR4Uuqfp4cQuQR8ob0mvIasEh0ZqKp/LoJ2Jn75ykg== +"@delvtech/drift-viem@^0.0.1-beta.13": + version "0.0.1-beta.13" + resolved "https://registry.yarnpkg.com/@delvtech/drift-viem/-/drift-viem-0.0.1-beta.13.tgz#9f5f38a50f72ea887319ea9480559fa01956c29b" + integrity sha512-i7PUAmUdq7IRRSjQO4JozV7swvYFcED3X4TT1l5RF0kXAD5drbMHIcpIB1D+2N7V2H2MCd2D4PDWDqVu+Hotzg== -"@delvtech/drift@^0.0.1-beta.9": - version "0.0.1-beta.9" - resolved "https://registry.yarnpkg.com/@delvtech/drift/-/drift-0.0.1-beta.9.tgz#802a2d226fe3c19a9e1e5b81982ed8e7a1dd48ee" - integrity sha512-XAdRFE3HMlzhnlDEb8ehkOpdcwZSz7v0DZ8l4dvlKAY6jmta2Uew43gAt7UfuO4ATlzWPuw5VhTXf82K0m+stw== +"@delvtech/drift@^0.0.1-beta.11": + version "0.0.1-beta.11" + resolved "https://registry.yarnpkg.com/@delvtech/drift/-/drift-0.0.1-beta.11.tgz#939c2fe6a07dacfa58ba72cf30ba4917fde7e91d" + integrity sha512-YjMLT4xJszZPVfNVK+t7rINwereQ4yMgVOS+VNm0NsMqWmv5vXxjnDGtLHg1RyeZy93DVnxPxTFj0YJxB/4t3g== dependencies: lodash.ismatch "^4.4.0" lru-cache "^10.0.1" From d226fbae08fb994c0b3dbb9fb3c902a062646493 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 20:00:52 -0600 Subject: [PATCH 29/43] Copy sdk core to new pkg --- packages/hyperdrive-js/.eslintrc | 6 + packages/hyperdrive-js/.gitignore | 2 + packages/hyperdrive-js/.prettierignore | 2 + packages/hyperdrive-js/.prettierrc.mjs | 7 + packages/hyperdrive-js/LICENSE | 201 ++ packages/hyperdrive-js/package.json | 64 + .../src/base/adjustAmountByPercentage.test.ts | 47 + .../src/base/adjustAmountByPercentage.ts | 55 + .../hyperdrive-js/src/base/assertNever.ts | 35 + packages/hyperdrive-js/src/base/constants.ts | 6 + .../hyperdrive-js/src/base/getHprFromApr.ts | 6 + .../hyperdrive-js/src/base/getHprFromApy.ts | 6 + .../src/base/testing/accounts.ts | 3 + packages/hyperdrive-js/src/base/types.ts | 7 + .../src/checkpoint/getCheckpointTime.ts | 7 + .../hyperdrive-js/src/checkpoint/types.ts | 63 + .../hyperdrive-js/src/drift/ContractClient.ts | 32 + .../hyperdrive-js/src/drift/ReadClient.ts | 58 + .../src/drift/ReadWriteClient.ts | 20 + .../src/drift/getBlockOrThrow.ts | 26 + .../src/errors/BlockNotFoundError.ts | 11 + .../src/errors/HyperdriveSdkError.ts | 11 + .../src/errors/MethodNotImplementedError.ts | 22 + packages/hyperdrive-js/src/exports/index.ts | 165 ++ packages/hyperdrive-js/src/exports/v1.0.14.ts | 25 + .../hyperdrive-js/src/factory/ReadFactory.ts | 131 ++ .../src/factory/ReadWriteFactory.ts | 42 + packages/hyperdrive-js/src/factory/abi.ts | 4 + packages/hyperdrive-js/src/fixed-point.ts | 6 + .../hyperdrive/base/ReadHyperdrive.test.ts | 1771 ++++++++++++++ .../src/hyperdrive/base/ReadHyperdrive.ts | 2078 +++++++++++++++++ .../hyperdrive/base/ReadWriteHyperdrive.ts | 468 ++++ .../hyperdrive-js/src/hyperdrive/base/abi.ts | 4 + .../base/testing/setupReadHyperdrive.ts | 32 + .../base/v1.0.14/ReadHyperdrive_v1_0_14.ts | 60 + .../v1.0.14/ReadWriteHyperdrive_v1_0_14.ts | 6 + .../hyperdrive-js/src/hyperdrive/constants.ts | 5 + .../erc4626/ReadErc4626Hyperdrive.ts | 47 + .../erc4626/ReadMockErc4626Hyperdrive.ts | 43 + .../erc4626/ReadWriteErc4626Hyperdrive.ts | 39 + .../erc4626/ReadWriteMockErc4626Hyperdrive.ts | 40 + .../v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts | 6 + .../ReadMockErc4626Hyperdrive_v1_0_14.ts | 6 + .../ReadWriteErc4626Hyperdrive_v1_0_14.ts | 6 + .../ReadWriteMockErc4626Hyperdrive_v1_0_14.ts | 6 + .../hyperdrive/ezeth/ReadEzEthHyperdrive.ts | 74 + .../ezeth/ReadWriteEzEthHyperdrive.ts | 50 + .../hyperdrive-js/src/hyperdrive/ezeth/abi.ts | 4 + .../v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts | 6 + .../ReadWriteEzEthHyperdrive_v1_0_14.ts | 6 + .../src/hyperdrive/getHyperdrive.ts | 101 + .../hyperdrive/lseth/ReadLsEthHyperdrive.ts | 59 + .../lseth/ReadWriteLsEthHyperdrive.ts | 43 + .../v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts | 6 + .../ReadWriteLsEthHyperdrive_v1_0_14.ts | 6 + .../src/hyperdrive/reth/ReadREthHyperdrive.ts | 97 + .../reth/ReadWriteREthHyperdrive.ts | 42 + .../v1.0.14/ReadREthHyperdrive_v1_0_14.ts | 6 + .../ReadWriteREthHyperdrive_v1_0_14.ts | 6 + .../hyperdrive/steth/ReadStEthHyperdrive.ts | 103 + .../steth/ReadWriteStEthHyperdrive.ts | 53 + .../v1.0.14/ReadStEthHyperdrive_v1_0_14.ts | 6 + .../ReadWriteStEthHyperdrive_v1_0_14.ts | 6 + .../utils/calculateAprFromPrice.test.ts | 12 + .../hyperdrive/utils/calculateAprFromPrice.ts | 30 + packages/hyperdrive-js/src/hyperwasm.ts | 5 + .../calculateMatureLongYieldAfterFees.test.ts | 25 + .../calculateMatureLongYieldAfterFees.ts | 16 + packages/hyperdrive-js/src/longs/types.ts | 29 + .../hyperdrive-js/src/lp/ClosedLpShares.ts | 7 + packages/hyperdrive-js/src/lp/assetId.ts | 1 + .../decodeAssetFromTransferSingleEventData.ts | 23 + .../hyperdrive-js/src/pool/parseAssetType.ts | 21 + .../src/pool/testing/PoolConfig.ts | 33 + .../src/pool/testing/PoolInfo.ts | 19 + packages/hyperdrive-js/src/pool/types.ts | 6 + .../src/registry/ReadRegistry.ts | 205 ++ .../src/registry/ReadWriteRegistry.ts | 125 + packages/hyperdrive-js/src/registry/abi.ts | 4 + packages/hyperdrive-js/src/registry/types.ts | 47 + .../shorts/calculateShortAccruedYield.test.ts | 15 + .../src/shorts/calculateShortAccruedYield.ts | 23 + packages/hyperdrive-js/src/shorts/types.ts | 23 + packages/hyperdrive-js/src/token/ReadToken.ts | 46 + .../hyperdrive-js/src/token/ReadWriteToken.ts | 23 + .../src/token/erc20/ReadErc20.ts | 76 + .../src/token/erc20/ReadWriteErc20.ts | 45 + packages/hyperdrive-js/src/token/erc20/abi.ts | 4 + .../src/token/erc4626/ReadErc4626.ts | 100 + .../src/token/erc4626/ReadMockErc4626.ts | 53 + .../src/token/erc4626/ReadWriteErc4626.ts | 8 + .../src/token/erc4626/ReadWriteMockErc4626.ts | 45 + .../hyperdrive-js/src/token/erc4626/abi.ts | 8 + .../hyperdrive-js/src/token/eth/ReadEth.ts | 50 + .../src/token/eth/ReadWriteEth.ts | 26 + .../src/token/lseth/ReadLsEth.ts | 124 + .../src/token/lseth/ReadWriteLsEth.ts | 8 + packages/hyperdrive-js/src/token/lseth/abi.ts | 4 + .../hyperdrive-js/src/token/reth/ReadREth.ts | 125 + .../src/token/reth/ReadWriteREth.ts | 8 + packages/hyperdrive-js/src/token/reth/abi.ts | 4 + .../src/token/steth/ReadStEth.ts | 118 + .../src/token/steth/ReadWriteStEth.ts | 8 + packages/hyperdrive-js/src/token/steth/abi.ts | 4 + .../RedeemedWithdrawalShares.ts | 6 + .../src/withdrawalShares/assetId.ts | 2 + packages/hyperdrive-js/tsconfig.json | 17 + packages/hyperdrive-js/tsup.config.ts | 11 + packages/hyperdrive-js/vite.config.ts | 6 + 109 files changed, 7959 insertions(+) create mode 100644 packages/hyperdrive-js/.eslintrc create mode 100644 packages/hyperdrive-js/.gitignore create mode 100644 packages/hyperdrive-js/.prettierignore create mode 100644 packages/hyperdrive-js/.prettierrc.mjs create mode 100644 packages/hyperdrive-js/LICENSE create mode 100644 packages/hyperdrive-js/package.json create mode 100644 packages/hyperdrive-js/src/base/adjustAmountByPercentage.test.ts create mode 100644 packages/hyperdrive-js/src/base/adjustAmountByPercentage.ts create mode 100644 packages/hyperdrive-js/src/base/assertNever.ts create mode 100644 packages/hyperdrive-js/src/base/constants.ts create mode 100644 packages/hyperdrive-js/src/base/getHprFromApr.ts create mode 100644 packages/hyperdrive-js/src/base/getHprFromApy.ts create mode 100644 packages/hyperdrive-js/src/base/testing/accounts.ts create mode 100644 packages/hyperdrive-js/src/base/types.ts create mode 100644 packages/hyperdrive-js/src/checkpoint/getCheckpointTime.ts create mode 100644 packages/hyperdrive-js/src/checkpoint/types.ts create mode 100644 packages/hyperdrive-js/src/drift/ContractClient.ts create mode 100644 packages/hyperdrive-js/src/drift/ReadClient.ts create mode 100644 packages/hyperdrive-js/src/drift/ReadWriteClient.ts create mode 100644 packages/hyperdrive-js/src/drift/getBlockOrThrow.ts create mode 100644 packages/hyperdrive-js/src/errors/BlockNotFoundError.ts create mode 100644 packages/hyperdrive-js/src/errors/HyperdriveSdkError.ts create mode 100644 packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts create mode 100644 packages/hyperdrive-js/src/exports/index.ts create mode 100644 packages/hyperdrive-js/src/exports/v1.0.14.ts create mode 100644 packages/hyperdrive-js/src/factory/ReadFactory.ts create mode 100644 packages/hyperdrive-js/src/factory/ReadWriteFactory.ts create mode 100644 packages/hyperdrive-js/src/factory/abi.ts create mode 100644 packages/hyperdrive-js/src/fixed-point.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.test.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/base/ReadWriteHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/base/abi.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/base/testing/setupReadHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/constants.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadMockErc4626Hyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteMockErc4626Hyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/ezeth/abi.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.test.ts create mode 100644 packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.ts create mode 100644 packages/hyperdrive-js/src/hyperwasm.ts create mode 100644 packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.test.ts create mode 100644 packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.ts create mode 100644 packages/hyperdrive-js/src/longs/types.ts create mode 100644 packages/hyperdrive-js/src/lp/ClosedLpShares.ts create mode 100644 packages/hyperdrive-js/src/lp/assetId.ts create mode 100644 packages/hyperdrive-js/src/pool/decodeAssetFromTransferSingleEventData.ts create mode 100644 packages/hyperdrive-js/src/pool/parseAssetType.ts create mode 100644 packages/hyperdrive-js/src/pool/testing/PoolConfig.ts create mode 100644 packages/hyperdrive-js/src/pool/testing/PoolInfo.ts create mode 100644 packages/hyperdrive-js/src/pool/types.ts create mode 100644 packages/hyperdrive-js/src/registry/ReadRegistry.ts create mode 100644 packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts create mode 100644 packages/hyperdrive-js/src/registry/abi.ts create mode 100644 packages/hyperdrive-js/src/registry/types.ts create mode 100644 packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.test.ts create mode 100644 packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.ts create mode 100644 packages/hyperdrive-js/src/shorts/types.ts create mode 100644 packages/hyperdrive-js/src/token/ReadToken.ts create mode 100644 packages/hyperdrive-js/src/token/ReadWriteToken.ts create mode 100644 packages/hyperdrive-js/src/token/erc20/ReadErc20.ts create mode 100644 packages/hyperdrive-js/src/token/erc20/ReadWriteErc20.ts create mode 100644 packages/hyperdrive-js/src/token/erc20/abi.ts create mode 100644 packages/hyperdrive-js/src/token/erc4626/ReadErc4626.ts create mode 100644 packages/hyperdrive-js/src/token/erc4626/ReadMockErc4626.ts create mode 100644 packages/hyperdrive-js/src/token/erc4626/ReadWriteErc4626.ts create mode 100644 packages/hyperdrive-js/src/token/erc4626/ReadWriteMockErc4626.ts create mode 100644 packages/hyperdrive-js/src/token/erc4626/abi.ts create mode 100644 packages/hyperdrive-js/src/token/eth/ReadEth.ts create mode 100644 packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts create mode 100644 packages/hyperdrive-js/src/token/lseth/ReadLsEth.ts create mode 100644 packages/hyperdrive-js/src/token/lseth/ReadWriteLsEth.ts create mode 100644 packages/hyperdrive-js/src/token/lseth/abi.ts create mode 100644 packages/hyperdrive-js/src/token/reth/ReadREth.ts create mode 100644 packages/hyperdrive-js/src/token/reth/ReadWriteREth.ts create mode 100644 packages/hyperdrive-js/src/token/reth/abi.ts create mode 100644 packages/hyperdrive-js/src/token/steth/ReadStEth.ts create mode 100644 packages/hyperdrive-js/src/token/steth/ReadWriteStEth.ts create mode 100644 packages/hyperdrive-js/src/token/steth/abi.ts create mode 100644 packages/hyperdrive-js/src/withdrawalShares/RedeemedWithdrawalShares.ts create mode 100644 packages/hyperdrive-js/src/withdrawalShares/assetId.ts create mode 100644 packages/hyperdrive-js/tsconfig.json create mode 100644 packages/hyperdrive-js/tsup.config.ts create mode 100644 packages/hyperdrive-js/vite.config.ts diff --git a/packages/hyperdrive-js/.eslintrc b/packages/hyperdrive-js/.eslintrc new file mode 100644 index 000000000..0f852a697 --- /dev/null +++ b/packages/hyperdrive-js/.eslintrc @@ -0,0 +1,6 @@ +{ + "root": true, + "extends": [ + "@hyperdrive/eslint-config" + ], +} \ No newline at end of file diff --git a/packages/hyperdrive-js/.gitignore b/packages/hyperdrive-js/.gitignore new file mode 100644 index 000000000..de4d1f007 --- /dev/null +++ b/packages/hyperdrive-js/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/hyperdrive-js/.prettierignore b/packages/hyperdrive-js/.prettierignore new file mode 100644 index 000000000..76add878f --- /dev/null +++ b/packages/hyperdrive-js/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/packages/hyperdrive-js/.prettierrc.mjs b/packages/hyperdrive-js/.prettierrc.mjs new file mode 100644 index 000000000..c9a63a1d6 --- /dev/null +++ b/packages/hyperdrive-js/.prettierrc.mjs @@ -0,0 +1,7 @@ +import repoConfig from "@hyperdrive/prettier-config"; + +/** @type {import("prettier").Config} */ +export default { + ...repoConfig, + plugins: ["prettier-plugin-organize-imports"], +}; diff --git a/packages/hyperdrive-js/LICENSE b/packages/hyperdrive-js/LICENSE new file mode 100644 index 000000000..4f4a9cf45 --- /dev/null +++ b/packages/hyperdrive-js/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2024] [DELV, Inc] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/hyperdrive-js/package.json b/packages/hyperdrive-js/package.json new file mode 100644 index 000000000..dcd95ddd0 --- /dev/null +++ b/packages/hyperdrive-js/package.json @@ -0,0 +1,64 @@ +{ + "name": "@delvtech/hyperdrive-js", + "version": "0.0.1", + "license": "AGPL-3.0", + "type": "module", + "scripts": { + "build": "tsup", + "watch": "npm run build -- --watch", + "test": "vitest run", + "test:watch": "vitest --reporter=verbose", + "typecheck": "tsc --noEmit" + }, + "peerDependencies": { + "@delvtech/drift": "^0.0.1-beta.11" + }, + "dependencies": { + "@delvtech/fixed-point-wasm": "^0.0.6", + "@delvtech/hyperdrive-artifacts": "^1.0.18", + "@delvtech/hyperdrive-wasm": "^0.15.3", + "lodash.groupby": "^4.6.0", + "lodash.mapvalues": "^4.6.0", + "semver": "^7.6.3" + }, + "devDependencies": { + "@delvtech/drift": "^0.0.1-beta.11", + "@hyperdrive/eslint-config": "*", + "@hyperdrive/prettier-config": "*", + "@hyperdrive/tsconfig": "*", + "@types/lodash.groupby": "^4.6.9", + "@types/lodash.mapvalues": "^4.6.9", + "@types/sinon": "^17.0.3", + "abitype": "^1.0.5", + "dotenv": "^16.4.5", + "prettier": "3.3.3", + "prettier-plugin-organize-imports": "4.0.0", + "sinon": "^18.0.0", + "tsconfig-paths": "^4.2.0", + "tsup": "^8.2.3", + "typescript": "^5.5.4", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^2.0.4" + }, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "./v1.0.14": { + "types": "./dist/v1.0.14.d.ts", + "default": "./dist/v1.0.14.js", + "require": "./dist/v1.0.14.cjs" + }, + "./package.json": "./package.json" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/hyperdrive-js/src/base/adjustAmountByPercentage.test.ts b/packages/hyperdrive-js/src/base/adjustAmountByPercentage.test.ts new file mode 100644 index 000000000..a704a85a4 --- /dev/null +++ b/packages/hyperdrive-js/src/base/adjustAmountByPercentage.test.ts @@ -0,0 +1,47 @@ +import { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; +import { parseFixed } from "src/fixed-point"; +import { expect, test } from "vitest"; + +test("should return adjusted amount down when given a basic input", () => { + expect( + adjustAmountByPercentage({ + amount: parseFixed(100).bigint, + percentage: parseFixed(1).bigint, + decimals: 18, + direction: "down", + }), + ).toBe(parseFixed(99).bigint); +}); +test("should return adjusted amount up when given a basic input", () => { + expect( + adjustAmountByPercentage({ + amount: parseFixed(100).bigint, + percentage: parseFixed(1).bigint, + decimals: 18, + direction: "up", + }), + ).toBe(parseFixed(101).bigint); +}); + +test("should handle precision accurately when given precise input amounts", () => { + const amount = parseFixed("100.123456789012345678").bigint; + expect( + adjustAmountByPercentage({ + amount, + percentage: parseFixed(1).bigint, + decimals: 18, + direction: "down", + }), + ).toBe(amount - amount / 100n); +}); + +test("should return zero when input amount is zero", () => { + expect( + adjustAmountByPercentage({ + amount: 0n, + percentage: parseFixed(1).bigint, + decimals: 18, + direction: "down", + }), + ).toBe(0n); +}); diff --git a/packages/hyperdrive-js/src/base/adjustAmountByPercentage.ts b/packages/hyperdrive-js/src/base/adjustAmountByPercentage.ts new file mode 100644 index 000000000..1128ec6bb --- /dev/null +++ b/packages/hyperdrive-js/src/base/adjustAmountByPercentage.ts @@ -0,0 +1,55 @@ +import { fixed } from "src/fixed-point"; + +interface AdjustAmountByPercentageOptions { + /** + * The amount to adjust + */ + amount: bigint; + /** + * The percentage to adjust it by, eg: 1e18 for 1% + */ + percentage: bigint; + + /** + * The decimals of precision for the `amount` + */ + decimals: number; + direction: "up" | "down"; +} + +/** + * Adjusts a given amount by some percentage. Useful for slippage calculations. + * + * Example: + * + * ```ts + * adjustAmountByPercentage({ + * amount: parseUnits("100", 18), + * decimals: 18, + * percentage: BigInt(1e18), + * direction: "down", + * }) === parseUnits("99") + * ``` + * + * ```ts + * adjustAmountByPercentage({ + * amount: parseUnits("100", 18), + * decimals: 18, + * percentage: BigInt(1e18), + * direction: "up", + * }) === parseUnits("101") + * ``` + */ +export function adjustAmountByPercentage({ + amount, + percentage, + decimals, + direction, +}: AdjustAmountByPercentageOptions): bigint { + const slippageAmount = fixed(amount, decimals) + .mul(percentage, decimals) + .div(100, 0); + return direction === "down" + ? amount - slippageAmount.bigint + : amount + slippageAmount.bigint; +} diff --git a/packages/hyperdrive-js/src/base/assertNever.ts b/packages/hyperdrive-js/src/base/assertNever.ts new file mode 100644 index 000000000..f23f00820 --- /dev/null +++ b/packages/hyperdrive-js/src/base/assertNever.ts @@ -0,0 +1,35 @@ +import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; + +/** + * Helper function for exhaustive checks of discriminated unions. + * https://basarat.gitbooks.io/typescript/docs/types/discriminated-unions.html + * + * @example + * + * type A = {type: 'a'}; + * type B = {type: 'b'}; + * type Union = A | B; + * + * function doSomething(arg: Union) { + * if (arg.type === 'a') { + * return something; + * } + * + * if (arg.type === 'b') { + * return somethingElse; + * } + * + * // TS will error if there are other types in the union + * // Will throw an Error when called at runtime. + * // Use `assertNever(arg, true)` instead to fail silently. + * return assertNever(arg); + * } + */ export function assertNever(value: never, noThrow?: boolean): never { + if (noThrow) { + return value; + } + + throw new HyperdriveSdkError( + `Unhandled discriminated union member: ${JSON.stringify(value)}`, + ); +} diff --git a/packages/hyperdrive-js/src/base/constants.ts b/packages/hyperdrive-js/src/base/constants.ts new file mode 100644 index 000000000..68e3c47c4 --- /dev/null +++ b/packages/hyperdrive-js/src/base/constants.ts @@ -0,0 +1,6 @@ +export const SECONDS_PER_YEAR = 31536000n; + +export const MAX_UINT256 = + 115792089237316195423570985008687907853269984665640564039457584007913129639935n; + +export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; diff --git a/packages/hyperdrive-js/src/base/getHprFromApr.ts b/packages/hyperdrive-js/src/base/getHprFromApr.ts new file mode 100644 index 000000000..ddcde9159 --- /dev/null +++ b/packages/hyperdrive-js/src/base/getHprFromApr.ts @@ -0,0 +1,6 @@ +import { hyperwasm } from "src/hyperwasm"; +// TODO: This is now simply a renamed, re-exported hyperwasm function. We should +// consider re-exporting all hyperwasm functions directly or not at all. +export function getHprFromApr(apr: bigint, positionDuration: bigint): bigint { + return hyperwasm.calcHprGivenApr({ apr, positionDuration }); +} diff --git a/packages/hyperdrive-js/src/base/getHprFromApy.ts b/packages/hyperdrive-js/src/base/getHprFromApy.ts new file mode 100644 index 000000000..35a8d8c36 --- /dev/null +++ b/packages/hyperdrive-js/src/base/getHprFromApy.ts @@ -0,0 +1,6 @@ +import { hyperwasm } from "src/hyperwasm"; +// TODO: This is now simply a renamed, re-exported hyperwasm function. We should +// consider re-exporting all hyperwasm functions directly or not at all. +export function getHprFromApy(apy: bigint, positionDuration: bigint): bigint { + return hyperwasm.calcHprGivenApy({ apy, positionDuration }); +} diff --git a/packages/hyperdrive-js/src/base/testing/accounts.ts b/packages/hyperdrive-js/src/base/testing/accounts.ts new file mode 100644 index 000000000..f04008eed --- /dev/null +++ b/packages/hyperdrive-js/src/base/testing/accounts.ts @@ -0,0 +1,3 @@ +export const BOB = "0xBob"; +export const ALICE = "0xAlice"; +export const NANCY = "0xNancy"; diff --git a/packages/hyperdrive-js/src/base/types.ts b/packages/hyperdrive-js/src/base/types.ts new file mode 100644 index 000000000..13e33b13b --- /dev/null +++ b/packages/hyperdrive-js/src/base/types.ts @@ -0,0 +1,7 @@ +/** + * A generic constructor type. + */ +export type Constructor< + TInstanceType = any, + TArgs extends any[] = any[], +> = new (...args: TArgs) => TInstanceType; diff --git a/packages/hyperdrive-js/src/checkpoint/getCheckpointTime.ts b/packages/hyperdrive-js/src/checkpoint/getCheckpointTime.ts new file mode 100644 index 000000000..55bc54ada --- /dev/null +++ b/packages/hyperdrive-js/src/checkpoint/getCheckpointTime.ts @@ -0,0 +1,7 @@ +export function getCheckpointTime( + blockTimestamp: bigint, + checkpointDuration: bigint, +): bigint { + // https://github.com/delvtech/hyperdrive/blob/314cd408ffa4968d5a6daff95167cd9af17607d6/contracts/src/HyperdriveStorage.sol#L193 + return blockTimestamp - (blockTimestamp % checkpointDuration); +} diff --git a/packages/hyperdrive-js/src/checkpoint/types.ts b/packages/hyperdrive-js/src/checkpoint/types.ts new file mode 100644 index 000000000..12189c98b --- /dev/null +++ b/packages/hyperdrive-js/src/checkpoint/types.ts @@ -0,0 +1,63 @@ +import { + ContractEvent, + ContractReadOptions, + FunctionReturn, + Pretty, +} from "@delvtech/drift"; +import { HyperdriveAbi } from "src/hyperdrive/base/abi"; + +export type Checkpoint = Pretty< + { + checkpointTime: bigint; + } & FunctionReturn +>; + +export type CheckpointEvent = ContractEvent; + +export type GetCheckpointTimeParams = ( + | { + /** + * A timestamp that falls within the checkpoint. + */ + timestamp?: bigint; + blockNumber?: never; + } + | { + timestamp?: never; + /** + * A block number that falls within the checkpoint. + */ + blockNumber?: bigint; + } +) & { + options?: ContractReadOptions; +}; + +export type GetCheckpointParams = ( + | { + /** + * The time of the checkpoint. + */ + checkpointTime?: bigint; + timestamp?: never; + blockNumber?: never; + } + | { + checkpointTime?: never; + /** + * A timestamp that falls within the checkpoint. + */ + timestamp?: bigint; + blockNumber?: never; + } + | { + checkpointTime?: never; + timestamp?: never; + /** + * A block number that falls within the checkpoint. + */ + blockNumber?: bigint; + } +) & { + options?: ContractReadOptions; +}; diff --git a/packages/hyperdrive-js/src/drift/ContractClient.ts b/packages/hyperdrive-js/src/drift/ContractClient.ts new file mode 100644 index 000000000..735b64c52 --- /dev/null +++ b/packages/hyperdrive-js/src/drift/ContractClient.ts @@ -0,0 +1,32 @@ +import { SimpleCache } from "@delvtech/drift"; +import { Address } from "abitype"; +import { ReadClientOptions } from "src/drift/ReadClient"; +import { ReadWriteClientOptions } from "src/drift/ReadWriteClient"; + +/** + * Additional options required for clients that represent a specific contract. + */ +export interface ContractClientOptions { + /** + * The address of the contract. + */ + address: Address; + + /** + * The cache to use for the contract. + */ + cache?: SimpleCache; + + /** + * The namespace to use for the cache. + */ + cacheNamespace?: PropertyKey; +} + +export interface ReadContractClientOptions + extends ReadClientOptions, + ContractClientOptions {} + +export interface ReadWriteContractClientOptions + extends ReadWriteClientOptions, + ContractClientOptions {} diff --git a/packages/hyperdrive-js/src/drift/ReadClient.ts b/packages/hyperdrive-js/src/drift/ReadClient.ts new file mode 100644 index 000000000..515130daa --- /dev/null +++ b/packages/hyperdrive-js/src/drift/ReadClient.ts @@ -0,0 +1,58 @@ +import { Drift } from "@delvtech/drift"; + +/** + * The base options required for all read clients. + */ +export interface ReadClientOptions { + drift: Drift; + + /** + * An arbitrary name for the instance. This is for convenience only (e.g., for + * use as a display name or in logging) and has no affect on the client's + * behavior. + */ + debugName?: string; + + /** + * The earliest block to fetch events from. + */ + earliestBlock?: bigint; +} + +/** + * A base class for read-only clients. + */ +export class ReadClient { + drift: Drift; + debugName: string; + + constructor({ debugName, drift, earliestBlock }: ReadClientOptions) { + this.debugName = debugName ?? this.constructor.name; + this.drift = drift; + + // Override the contract factory to ensure that events are fetched from the + // earliest block if necessary. + if (earliestBlock) { + const originalContractFactory = this.drift.contract; + this.drift.contract = (options) => { + const contract = originalContractFactory(options); + + // Override the getEvents method + const originalGetEvents = contract.getEvents; + contract.getEvents = async function (eventName, options) { + const _options = { ...options }; + const fromBlock = _options?.fromBlock; + const isBeforeEarliest = + typeof fromBlock === "bigint" && fromBlock < earliestBlock; + if (!fromBlock || fromBlock === "earliest" || isBeforeEarliest) { + _options.fromBlock = earliestBlock; + } + + return originalGetEvents(eventName, _options); + }; + + return contract as any; + }; + } + } +} diff --git a/packages/hyperdrive-js/src/drift/ReadWriteClient.ts b/packages/hyperdrive-js/src/drift/ReadWriteClient.ts new file mode 100644 index 000000000..fe7cefb63 --- /dev/null +++ b/packages/hyperdrive-js/src/drift/ReadWriteClient.ts @@ -0,0 +1,20 @@ +import { Drift, ReadWriteAdapter } from "@delvtech/drift"; +import { ReadClient, ReadClientOptions } from "src/drift/ReadClient"; + +/** + * The base options required for all read-write clients. + */ +export interface ReadWriteClientOptions extends ReadClientOptions { + drift: Drift; +} + +/** + * A base class for read-write clients. + */ +export class ReadWriteClient extends ReadClient { + declare drift: Drift; + + constructor(options: ReadWriteClientOptions) { + super(options); + } +} diff --git a/packages/hyperdrive-js/src/drift/getBlockOrThrow.ts b/packages/hyperdrive-js/src/drift/getBlockOrThrow.ts new file mode 100644 index 000000000..d354c93ca --- /dev/null +++ b/packages/hyperdrive-js/src/drift/getBlockOrThrow.ts @@ -0,0 +1,26 @@ +import { + Block, + ContractReadOptions, + Drift, + GetBlockParams, +} from "@delvtech/drift"; +import { BlockNotFoundError } from "src/errors/BlockNotFoundError"; + +export type GetBlockOrThrowParams = GetBlockParams & ContractReadOptions; + +/** + * A utility that tries to fetch a block from a given network and throws an + * error if no block is found. Useful for unified error handling when fetching + * blocks that may not exist. + * @throws `BlockNotFoundError` + */ +export async function getBlockOrThrow( + drift: Drift, + options?: GetBlockOrThrowParams, +): Promise { + const fetched = await drift.getBlock(options); + if (!fetched) { + throw new BlockNotFoundError(options); + } + return fetched; +} diff --git a/packages/hyperdrive-js/src/errors/BlockNotFoundError.ts b/packages/hyperdrive-js/src/errors/BlockNotFoundError.ts new file mode 100644 index 000000000..62f20885d --- /dev/null +++ b/packages/hyperdrive-js/src/errors/BlockNotFoundError.ts @@ -0,0 +1,11 @@ +import { NetworkGetBlockOptions } from "@delvtech/drift"; +import { HyperdriveSdkError } from "./HyperdriveSdkError"; + +export class BlockNotFoundError extends HyperdriveSdkError { + constructor(options?: NetworkGetBlockOptions) { + const block = + options?.blockHash ?? options?.blockNumber ?? options?.blockTag; + super(`Block${block !== undefined ? ` ${block}` : ""} not found`); + this.name = "BlockNotFound"; + } +} diff --git a/packages/hyperdrive-js/src/errors/HyperdriveSdkError.ts b/packages/hyperdrive-js/src/errors/HyperdriveSdkError.ts new file mode 100644 index 000000000..34c045c60 --- /dev/null +++ b/packages/hyperdrive-js/src/errors/HyperdriveSdkError.ts @@ -0,0 +1,11 @@ +import { DriftError } from "@delvtech/drift"; + +export class HyperdriveSdkError extends DriftError { + constructor(message: string, options?: ErrorOptions) { + super(message, { + ...options, + prefix: "ᛋ ", + name: "Hyperdrive SDK Error", + }); + } +} diff --git a/packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts b/packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts new file mode 100644 index 000000000..77536f3fb --- /dev/null +++ b/packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts @@ -0,0 +1,22 @@ +import { HyperdriveSdkError } from "./HyperdriveSdkError"; + +export interface MethodNotImplementedErrorOptions { + /** + * The name of the object that the method was not implemented in. + */ + objectName: string; + /** + * The name of the method that was not implemented. + */ + methodName: string; +} + +/** + * An error that is thrown when a method is not implemented in an object. + */ +export class MethodNotImplementedError extends HyperdriveSdkError { + constructor({ methodName, objectName }: MethodNotImplementedErrorOptions) { + super(`${objectName} does not implement the method ${methodName}.`); + this.name = "MethodNotImplemented"; + } +} diff --git a/packages/hyperdrive-js/src/exports/index.ts b/packages/hyperdrive-js/src/exports/index.ts new file mode 100644 index 000000000..130e054af --- /dev/null +++ b/packages/hyperdrive-js/src/exports/index.ts @@ -0,0 +1,165 @@ +// Hyperdrive // + +export { + getHyperdrive, + type Hyperdrive, + type HyperdriveOptions, +} from "src/hyperdrive/getHyperdrive"; + +export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/base/abi"; +export { + ReadHyperdrive, + type ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +export { + ReadWriteHyperdrive, + type ReadWriteHyperdriveOptions, +} from "src/hyperdrive/base/ReadWriteHyperdrive"; + +// erc-4626 +export { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; +export { ReadMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive"; +export { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; +export { ReadWriteMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive"; + +// ezeth +export { + ezEthHyperdriveAbi, + type EzEthHyperdriveAbi, +} from "src/hyperdrive/ezeth/abi"; +export { ReadEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; +export { ReadWriteEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive"; + +// lseth +export { ReadLsEthHyperdrive } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; +export { ReadWriteLsEthHyperdrive } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; + +// reth +export { ReadREthHyperdrive } from "src/hyperdrive/reth/ReadREthHyperdrive"; +export { ReadWriteREthHyperdrive } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; + +// steth +export { + ReadStEthHyperdrive, + type ReadStEthHyperdriveOptions, +} from "src/hyperdrive/steth/ReadStEthHyperdrive"; +export { + ReadWriteStEthHyperdrive, + type ReadWriteStEthHyperdriveOptions, +} from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; + +export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; + +// pool +export type { PoolConfig, PoolInfo } from "src/pool/types"; + +// shorts +export type { ClosedShort, OpenShort, Short } from "src/shorts/types"; + +// longs +export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; +export type { + ClosedLong, + Long, + OpenLongPositionReceived, +} from "src/longs/types"; + +// lp +export type { ClosedLpShares } from "src/lp/ClosedLpShares"; + +// withdrawal shares +export type { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; + +// Registry // + +export { registryAbi, type RegistryAbi } from "src/registry/abi"; +export { + ReadRegistry, + type ReadRegistryOptions, +} from "src/registry/ReadRegistry"; +export { + ReadWriteRegistry, + type ReadWriteRegistryOptions, +} from "src/registry/ReadWriteRegistry"; + +// Factory // + +export { factoryAbi, type FactoryAbi } from "src/factory/abi"; +export { ReadFactory, type ReadFactoryOptions } from "src/factory/ReadFactory"; +export { + ReadWriteFactory, + type ReadWriteFactoryOptions, +} from "src/factory/ReadWriteFactory"; + +// Token // + +export type { ReadToken } from "src/token/ReadToken"; +export type { ReadWriteToken } from "src/token/ReadWriteToken"; + +// eth +export { ReadEth, type ReadEthOptions } from "src/token/eth/ReadEth"; +export { + ReadWriteEth, + type ReadWriteEthOptions, +} from "src/token/eth/ReadWriteEth"; + +// erc-20 +export { erc20Abi, type Erc20Abi } from "src/token/erc20/abi"; +export { ReadErc20, type ReadErc20Options } from "src/token/erc20/ReadErc20"; +export { + ReadWriteErc20, + type ReadWriteErc20Options, +} from "src/token/erc20/ReadWriteErc20"; + +// erc-4626 +export { + erc4626Abi, + mockErc4626Abi, + type Erc4626Abi, + type MockErc4626Abi, +} from "src/token/erc4626/abi"; +export { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; +export { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; +export { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; +export { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; + +// lseth +export { lsEthAbi, type LsEthAbi } from "src/token/lseth/abi"; +export { ReadLsEth } from "src/token/lseth/ReadLsEth"; +export { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; + +// reth +export { rEthAbi, type REthAbi } from "src/token/reth/abi"; +export { ReadREth } from "src/token/reth/ReadREth"; +export { ReadWriteREth } from "src/token/reth/ReadWriteREth"; + +// steth +export { stEthAbi, type StEthAbi } from "src/token/steth/abi"; +export { ReadStEth } from "src/token/steth/ReadStEth"; +export { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; + +// Errors // + +export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; +export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; +export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; + +// Drift // + +export type { + ContractClientOptions, + ReadContractClientOptions, + ReadWriteContractClientOptions, +} from "src/drift/ContractClient"; +export { ReadClient, type ReadClientOptions } from "src/drift/ReadClient"; +export { + ReadWriteClient, + type ReadWriteClientOptions, +} from "src/drift/ReadWriteClient"; + +// Base // + +export { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; +export { getHprFromApr } from "src/base/getHprFromApr"; +export { getHprFromApy } from "src/base/getHprFromApy"; +export type { Constructor } from "src/base/types"; diff --git a/packages/hyperdrive-js/src/exports/v1.0.14.ts b/packages/hyperdrive-js/src/exports/v1.0.14.ts new file mode 100644 index 000000000..ccd7f5935 --- /dev/null +++ b/packages/hyperdrive-js/src/exports/v1.0.14.ts @@ -0,0 +1,25 @@ +// base +export { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +export { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; + +// erc-4626 +export { ReadErc4626Hyperdrive_v1_0_14 } from "src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14"; +export { ReadMockErc4626Hyperdrive_v1_0_14 } from "src/hyperdrive/erc4626/v1.0.14/ReadMockErc4626Hyperdrive_v1_0_14"; +export { ReadWriteErc4626Hyperdrive_v1_0_14 } from "src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14"; +export { ReadWriteMockErc4626Hyperdrive_v1_0_14 } from "src/hyperdrive/erc4626/v1.0.14/ReadWriteMockErc4626Hyperdrive_v1_0_14"; + +// ezeth +export { ReadEzEthHyperdrive_v1_0_14 } from "src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14"; +export { ReadWriteEzEthHyperdrive_v1_0_14 } from "src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14"; + +// lseth +export { ReadLsEthHyperdrive_v1_0_14 } from "src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14"; +export { ReadWriteLsEthHyperdrive_v1_0_14 } from "src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14"; + +// reth +export { ReadREthHyperdrive_v1_0_14 } from "src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14"; +export { ReadWriteREthHyperdrive_v1_0_14 } from "src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14"; + +// steth +export { ReadStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14"; +export { ReadWriteStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14"; diff --git a/packages/hyperdrive-js/src/factory/ReadFactory.ts b/packages/hyperdrive-js/src/factory/ReadFactory.ts new file mode 100644 index 000000000..dc3812d28 --- /dev/null +++ b/packages/hyperdrive-js/src/factory/ReadFactory.ts @@ -0,0 +1,131 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Address } from "abitype"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; +import { FactoryAbi, factoryAbi } from "src/factory/abi"; +import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; + +export interface ReadFactoryOptions extends ReadContractClientOptions {} + +export class ReadFactory extends ReadClient { + address: Address; + contract: Contract; + + constructor({ + debugName = "Hyperdrive Factory", + address, + cache, + cacheNamespace, + ...rest + }: ReadFactoryOptions) { + super({ debugName, ...rest }); + this.address = address; + this.contract = this.drift.contract({ + abi: factoryAbi, + address, + cache, + cacheNamespace, + }); + } + + /** + * Find out if the given address is an instance deployed by the factory. + */ + async getIsInstance(address: Address): Promise { + return this.contract.read("isInstance", { _instance: address }); + } + + /** + * Find out if the given address is a deployer coordinator registered with the + * factory. + */ + async getIsDeployerCoordinator(address: Address): Promise { + return this.contract.read("isDeployerCoordinator", { + _deployerCoordinator: address, + }); + } + + /** + * Get the address of all registered deployer coordinators. + */ + async getDeployerCoordinatorAddresses({ + instances, + options, + }: { + /** + * Only return deployer coordinators that deployed the given instances. + */ + instances?: Address[]; + options?: ContractReadOptions; + } = {}): Promise { + if (instances) { + const readOnlyAddresses = await this.contract.read( + "getDeployerCoordinatorByInstances", + { + __instances: instances, + }, + ); + return readOnlyAddresses.slice(); + } + + const count = await this.contract.read( + "getNumberOfDeployerCoordinators", + {}, + options, + ); + + if (count === 0n) { + return []; + } + + const readOnlyAddresses = await this.contract.read( + "getDeployerCoordinatorsInRange", + { + _startIndex: 0n, + _endIndex: count, + }, + options, + ); + return readOnlyAddresses.slice(); + } + + /** + * Get a {@linkcode ReadHyperdrive} instance for each Hyperdrive instance + * deployed by the deployer factory. + */ + async getInstances(options?: ContractReadOptions): Promise { + const hyperdriveAddresses = await this.getInstanceAddresses(options); + return hyperdriveAddresses.map( + (address) => + new ReadHyperdrive({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + ); + } + + /** + * Get the address of all Hyperdrive instances deployed by the factory. + */ + async getInstanceAddresses( + options?: ContractReadOptions, + ): Promise { + const count = await this.contract.read("getNumberOfInstances", {}, options); + + if (count === 0n) { + return []; + } + + const readOnlyAddresses = await this.contract.read( + "getInstancesInRange", + { + _startIndex: 0n, + _endIndex: count, + }, + options, + ); + return readOnlyAddresses.slice(); + } +} diff --git a/packages/hyperdrive-js/src/factory/ReadWriteFactory.ts b/packages/hyperdrive-js/src/factory/ReadWriteFactory.ts new file mode 100644 index 000000000..04036fbcc --- /dev/null +++ b/packages/hyperdrive-js/src/factory/ReadWriteFactory.ts @@ -0,0 +1,42 @@ +import { + ContractReadOptions, + Drift, + ReadWriteAdapter, + ReadWriteContract, + ReplaceProps, +} from "@delvtech/drift"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +import { ReadFactory, ReadFactoryOptions } from "src/factory/ReadFactory"; +import { FactoryAbi } from "src/factory/abi"; +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; + +export interface ReadWriteFactoryOptions + extends ReplaceProps {} + +export class ReadWriteFactory extends ReadFactory { + declare contract: ReadWriteContract; + declare drift: Drift; + + constructor(options: ReadWriteFactoryOptions) { + super(options); + } + + /** + * Get a {@linkcode ReadWriteHyperdrive} instance for each Hyperdrive instance + * deployed by the deployer factory. + */ + async getInstances( + options?: ContractReadOptions, + ): Promise { + const hyperdriveAddresses = await this.getInstanceAddresses(options); + return hyperdriveAddresses.map( + (address) => + new ReadWriteHyperdrive({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + ); + } +} diff --git a/packages/hyperdrive-js/src/factory/abi.ts b/packages/hyperdrive-js/src/factory/abi.ts new file mode 100644 index 000000000..1a0f44818 --- /dev/null +++ b/packages/hyperdrive-js/src/factory/abi.ts @@ -0,0 +1,4 @@ +import { IHyperdriveFactory } from "@delvtech/hyperdrive-artifacts/IHyperdriveFactory"; + +export const factoryAbi = IHyperdriveFactory.abi; +export type FactoryAbi = typeof factoryAbi; diff --git a/packages/hyperdrive-js/src/fixed-point.ts b/packages/hyperdrive-js/src/fixed-point.ts new file mode 100644 index 000000000..ccbceb234 --- /dev/null +++ b/packages/hyperdrive-js/src/fixed-point.ts @@ -0,0 +1,6 @@ +import * as fixedPoint from "@delvtech/fixed-point-wasm"; + +fixedPoint.initSync(fixedPoint.wasmBuffer); + +export { fixedPoint }; +export const { fixed, FixedPoint, ln, parseFixed, randomFixed } = fixedPoint; diff --git a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.test.ts b/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.test.ts new file mode 100644 index 000000000..881928679 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.test.ts @@ -0,0 +1,1771 @@ +import { ZERO_ADDRESS } from "@delvtech/drift"; +import { fixed, parseFixed } from "@delvtech/fixed-point-wasm"; +import { ALICE, BOB } from "src/base/testing/accounts"; +import { CheckpointEvent } from "src/checkpoint/types"; +import { setupReadHyperdrive } from "src/hyperdrive/base/testing/setupReadHyperdrive"; +import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; +import { + simplePoolConfig30Days, + simplePoolConfig7Days, +} from "src/pool/testing/PoolConfig"; +import { simplePoolInfo } from "src/pool/testing/PoolInfo"; +import { assert, expect, test } from "vitest"; + +test("getVersion should return the parsed version of the contract", async () => { + const { contract, readHyperdrive } = setupReadHyperdrive(); + + contract.onRead("version").resolves("v1.0.14"); + + const value = await readHyperdrive.getVersion(); + expect(value).toEqual({ + major: 1, + minor: 0, + patch: 14, + string: "v1.0.14", + }); +}); + +// The sdk should return the exact PoolConfig from the contracts. It should not +// do any conversions or transformations, eg: converting seconds to ms, +// formatting bigints, etc.. +test("getPoolConfig should return the PoolConfig from the contract as-is", async () => { + const { contract, readHyperdrive } = setupReadHyperdrive(); + + // stub out the contract call the sdk is going to make + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + + // The sdk should return the correct data + const value = await readHyperdrive.getPoolConfig(); + expect(value).toBe(simplePoolConfig7Days); +}); + +// The sdk should return the exact PoolInfo from the contracts. It should not do +// any conversions or transformations, eg: converting seconds into ms, +// formatting bigints, etc.. +test("getPoolInfo should return the PoolInfo from the contract as-is", async () => { + const { contract, readHyperdrive } = setupReadHyperdrive(); + + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + + const value = await readHyperdrive.getPoolInfo(); + expect(value).toBe(simplePoolInfo); +}); + +// The sdk should return the exact APR from the contracts. It should not do any +// conversions or transformations, eg: formatting bigints, etc.. +test("getFixedRate should get the fixed rate as-is", async () => { + const { contract, readHyperdrive } = setupReadHyperdrive(); + + // These are necessary to stub, but the values won't be used since we stub + // calculateAPRFromReserves directly + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + + const value = await readHyperdrive.getFixedApr(); + expect(value).toBe(50000000000000000n); +}); + +test("getTradingVolume should get the trading volume in terms of bonds", async () => { + const { contract, readHyperdrive } = setupReadHyperdrive(); + + contract.onGetEvents("OpenLong").resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + amount: parseFixed("1").bigint, + bondAmount: parseFixed("1.3").bigint, + maturityTime: 1729209600n, + vaultSharePrice: 1n, + asBase: false, + trader: BOB, + }, + }, + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 2n, + amount: parseFixed("1").bigint, + bondAmount: parseFixed("1.4").bigint, + maturityTime: 1733961600n, + asBase: false, + trader: ALICE, + vaultSharePrice: 0n, + }, + }, + ]); + + contract.onGetEvents("CloseLong").resolves([ + { + eventName: "CloseLong", + args: { + extraData: "0x", + assetId: 1n, + maturityTime: 123456789n, + trader: BOB, + destination: BOB, + // received back 1 base + asBase: true, + amount: parseFixed("1").bigint, + vaultSharePrice: 0n, + // closed out 0.9 bonds + bondAmount: parseFixed("0.9").bigint, + }, + }, + ]); + + contract.onGetEvents("OpenShort").resolves([ + { + eventName: "OpenShort", + args: { + extraData: "0x", + assetId: 3n, + amount: parseFixed("1").bigint, + bondAmount: parseFixed("100").bigint, + maturityTime: 1729296000n, + vaultSharePrice: 1n, + asBase: false, + baseProceeds: parseFixed("100").bigint, + trader: BOB, + }, + }, + { + eventName: "OpenShort", + args: { + extraData: "0x", + assetId: 4n, + amount: parseFixed("2").bigint, + bondAmount: parseFixed("190").bigint, + maturityTime: 1729296000n, + vaultSharePrice: 1n, + asBase: false, + baseProceeds: parseFixed("190").bigint, + trader: BOB, + }, + }, + ]); + + contract.onGetEvents("CloseShort").resolves([]); + + const value = await readHyperdrive.getTradingVolume(); + + expect(value).toEqual({ + shortVolume: parseFixed("290").bigint, // sum of bondAmount in short events + longVolume: parseFixed("3.6").bigint, // sum of bondAmount in long events + totalVolume: parseFixed("293.6").bigint, + }); +}); + +test("getShortAccruedYield should return the amount of yield a non-mature position has earned", async () => { + const { contract, drift, readHyperdrive } = setupReadHyperdrive(); + + drift.onGetBlock().resolves({ blockNumber: 1n, timestamp: 100n }); + + contract.onRead("getPoolConfig").resolves({ + ...simplePoolConfig7Days, + positionDuration: 86400n, // one day in seconds + checkpointDuration: 86400n, // one day in seconds + }); + + // The pool info gives us the current price + contract.onRead("getPoolInfo").resolves({ + ...simplePoolInfo, + vaultSharePrice: parseFixed("1.01").bigint, + }); + + // The checkpoint gives us the price when the bond was opened + contract.onRead("getCheckpoint").resolves({ + vaultSharePrice: parseFixed("1.008").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }); + + const accruedYield = await readHyperdrive.getShortAccruedYield({ + checkpointTime: 0n, + bondAmount: parseFixed("100").bigint, + }); + + // If you opened a short position on 100 bonds at a previous checkpoint price + // of 1.008 and the current price is 1.01, your accrued profit would + // be 0.20. + expect(accruedYield).toEqual(parseFixed("0.20").bigint); +}); + +test("getShortAccruedYield should return the amount of yield a mature position has earned", async () => { + const { drift, contract, readHyperdrive } = setupReadHyperdrive(); + + drift.onGetBlock().resolves({ blockNumber: 1n, timestamp: 1699503565n }); + + contract.onRead("getPoolConfig").resolves({ + ...simplePoolConfig7Days, + positionDuration: 86400n, // one day in seconds + checkpointDuration: 86400n, // one day in seconds + }); + + // This checkpoint gives us the price when the short was opened + contract.onRead("getCheckpoint", { _checkpointTime: 1n }).resolves({ + vaultSharePrice: parseFixed("1.008").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }); + + // This checkpoint gives us the price when the shorts matured + contract.onRead("getCheckpoint", { _checkpointTime: 86401n }).resolves({ + vaultSharePrice: parseFixed("1.01").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }); + + const accruedYield = await readHyperdrive.getShortAccruedYield({ + checkpointTime: 1n, + bondAmount: parseFixed("100").bigint, + }); + + // If you opened a short position on 100 bonds at a previous checkpoint price + // of 1.008 and the price was 1.01 at maturity, your accrued profit would + // be 0.20. + expect(accruedYield).toEqual(parseFixed("0.20").bigint); +}); + +test("getCheckpointEvents should return an array of CheckpointEvents", async () => { + const { contract, readHyperdrive } = setupReadHyperdrive(); + const checkPointEvents = [ + { + eventName: "CreateCheckpoint", + args: { + vaultSharePrice: 423890n, + checkpointTime: 1699480800n, + lpSharePrice: 1000276463406900050n, + maturedLongs: 1010694n, + maturedShorts: 0n, + }, + }, + { + eventName: "CreateCheckpoint", + args: { + sharePrice: 1000378348050038939n, + checkpointTime: 1729299000n, + lpSharePrice: 80120n, + maturedLongs: 923162n, + maturedShorts: 230904n, + }, + }, + ] as CheckpointEvent[]; + contract.onGetEvents("CreateCheckpoint").resolves(checkPointEvents); + + const events = await readHyperdrive.getCheckpointEvents(); + + expect(events).toEqual(checkPointEvents); +}); + +// opened with base +test("getOpenLongs should account for longs opened with base", async () => { + // Description: + // Bob opens up a long position over 2 txs in the same checkpoint, for a total + // cost 2 base, and receiving 2.7 bonds. As a result, he should now have + // an open position with the 2.7 bonds and a total cost of 2 base. + + const { contract, readHyperdrive } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + // received bonds + bondAmount: parseFixed("1.3").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: 1n, + // received bonds + bondAmount: parseFixed("1.4").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + ]); + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([]); + + const value = await readHyperdrive.getOpenLongs({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + baseAmountPaid: 2000000000000000000n, // Bob paid 2 base over 2 txs that opened a long + bondAmount: 2700000000000000000n, // Bob received a total of 2.7 bonds from these txs + maturity: 1708545600n, + }, + ]); +}); + +test("getOpenLongs should account for longs opened with shares", async () => { + // Description: + // Bob opens up a long position over 2 txs, for a total cost 2 shares, and + // receiving 2.7 bonds. As a result, he should now have an open position with + // the 2.7 bonds and a total cost of 2.35 base. (because 1 share = 1.15 base in + // the first tx, and 1 share = 1.2 base in the second tx) + + const { contract, readHyperdrive } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in shares + vaultSharePrice: parseFixed("1.15").bigint, + amount: parseFixed("1").bigint, + // received bonds + bondAmount: parseFixed("1.3").bigint, + maturityTime: timestamp, + asBase: false, + trader: BOB, + }, + }, + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in shares + vaultSharePrice: parseFixed("1.2").bigint, + amount: parseFixed("1").bigint, + // received bonds + bondAmount: parseFixed("1.4").bigint, + maturityTime: timestamp, + asBase: false, + trader: BOB, + }, + }, + ]); + + // Bob has not closed the position at all, these are just stubbed out + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([]); + const value = await readHyperdrive.getOpenLongs({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + baseAmountPaid: parseFixed("2.35").bigint, // Bob paid in shares, for the equivalent cost of 2.35 base + bondAmount: parseFixed("2.7").bigint, // Bob received a total of 2.7 bond + maturity: 1708545600n, + }, + ]); +}); + +test("getOpenLongs should account for longs partially closed to base", async () => { + // Description: + // Bob opens up a long position over 2 txs in the same checkpoint, for a total + // cost 2 base, and receiving 2.7 bonds. He then partially closes this + // position, redeeming 0.9 bonds for 1 base. As a result, he should now have + // an open position with the remaining 1.8 bonds and a total cost of 1 base. + + const { contract, readHyperdrive } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // received bonds + bondAmount: parseFixed("1.3").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + // received bonds + bondAmount: parseFixed("1.4").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + ]); + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseLong", + args: { + extraData: "0x", + assetId: 1n, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + + // received back 1 base + asBase: true, + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // closed out 0.9 bonds + bondAmount: parseFixed("0.9").bigint, + }, + }, + ]); + + // mints + const value = await readHyperdrive.getOpenLongs({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + baseAmountPaid: 1000000000000000000n, // Bob has now paid 1 base total + bondAmount: 1800000000000000000n, // Bob currently hold 1.8 bonds + maturity: 1708545600n, + }, + ]); +}); + +test("getOpenLongs should account for longs fully closed to base", async () => { + // Description: + // Bob opens up a long position over 2 txs in the same checkpoint, for a total + // cost 2 base, and receiving 2.7 bonds. He then completely closes this + // position, redeeming 2.7 bonds for 2.5 base. As a result, he no longer has + // any open long positions. + + const { contract, readHyperdrive } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // received bonds + bondAmount: parseFixed("1.3").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + // received bonds + bondAmount: parseFixed("1.4").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + ]); + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseLong", + args: { + extraData: "0x", + assetId: 1n, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + + // received back 1 base + asBase: true, + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // closed out 0.9 bonds + bondAmount: parseFixed("0.9").bigint, + }, + }, + ]); + + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // received bonds + bondAmount: parseFixed("1.3").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("1").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + // received bonds + bondAmount: parseFixed("1.4").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + ]); + + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseLong", + args: { + extraData: "0x", + assetId: 1n, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + + // received back 2.5 base + asBase: true, + amount: parseFixed("2.5").bigint, + vaultSharePrice: parseFixed("1.19").bigint, + + // closed out 2.7 bonds + bondAmount: parseFixed("2.7").bigint, + }, + }, + ]); + const value = await readHyperdrive.getOpenLongs({ account: BOB }); + + expect(value).toEqual([]); +}); + +test("getOpenLongs should handle when user fully closes then re-opens a position in the same checkpoint", async () => { + // Description: + // Bob opens a Long, then fully closes it at a loss. Then he re-opens a long + // in the same checkpoint, resulting in a single position with new accounting + // (ie: the previous loss is not factored in). + + const { contract, readHyperdrive } = setupReadHyperdrive(); + + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + args: { + extraData: "0x", + trader: BOB, + assetId: + 452312848583266388373324160190187140051835877600158453279131187532625961856n, + maturityTime: 1715299200n, + amount: parseFixed("2000").bigint, + vaultSharePrice: parseFixed("1.0002871459674").bigint, + asBase: true, + bondAmount: parseFixed("2020.518819362004558105").bigint, + }, + blockNumber: 1n, + data: "0x00000000000000000000000000000000000000000000000000000000663d638000000000000000000000000000000000000000000000006c6b935b8bbd40000000000000000000000000000000000000000000000000006c639ba602f70a9a7f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000006d8854d90acff06119", + eventName: "OpenLong", + transactionHash: + "0x8b938ee12cc519b7a76debcad41aab61ef3de2cecc8a858adea7575671b1d9b4", + }, + { + args: { + extraData: "0x", + trader: BOB, + assetId: + 452312848583266388373324160190187140051835877600158453279131187532625961856n, + maturityTime: 1715299200n, + amount: parseFixed("9.0931").bigint, + vaultSharePrice: parseFixed("1.0003519789758").bigint, + asBase: true, + bondAmount: parseFixed("9.196435772384927298").bigint, + }, + blockNumber: 3n, + data: "0x00000000000000000000000000000000000000000000000000000000663d63800000000000000000000000000000000000000000000000007e312e45cf1ac0000000000000000000000000000000000000000000000000007e25d062e6d4586900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000007fa04d9c34b2de42", + eventName: "OpenLong", + transactionHash: + "0x5130c7a919f7303343e102020705cfe3db2ab5ca200410d119cef296c4693621", + } as const, + ]); + + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + args: { + extraData: "0x", + trader: BOB, + destination: BOB, + assetId: + 452312848583266388373324160190187140051835877600158453279131187532625961856n, + maturityTime: 1715299200n, + amount: parseFixed("1998.524066158245200112").bigint, + vaultSharePrice: parseFixed("1.0002973144644").bigint, + asBase: true, + bondAmount: parseFixed("2020.518819362004558105").bigint, + }, + blockNumber: 2n, + data: "0x00000000000000000000000000000000000000000000000000000000663d638000000000000000000000000000000000000000000000006c5717c9895f7a40f000000000000000000000000000000000000000000000006c4ed96d6708a25d07000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000006d8854d90acff06119", + eventName: "CloseLong", + transactionHash: + "0x8fff6dfc2498356b665542c5517e895dd6c0364e2fa9bf011d373781dad22655", + }, + ]); + + const value = await readHyperdrive.getOpenLongs({ account: BOB }); + + expect(value).toEqual([ + { + assetId: + 452312848583266388373324160190187140051835877600158453279131187532625961856n, + baseAmountPaid: parseFixed("9.0931").bigint, + bondAmount: parseFixed("9.196435772384927298").bigint, + maturity: 1715299200n, + }, + ]); +}); + +test("getOpenLongs should account for longs partially closed to shares", async () => { + // Description: + // Bob opens up a long position, for a total cost 2 base, and receiving 2.2 + // bonds. He then closes half of this position, redeeming 1.1 bonds for 0.8 + // shares. Shares are worth 1.1 base at the time he closes, As a result, he + // has 1.1 bonds left with a total cost paid of 1.12 base. + + const { contract, readHyperdrive } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + asBase: true, + amount: parseFixed("2").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + // received bonds + bondAmount: parseFixed("2.2").bigint, + maturityTime: timestamp, + trader: BOB, + }, + }, + ]); + + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseLong", + blockNumber: 5n, + args: { + extraData: "0x", + assetId: 1n, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + + // received back 0.8 shares + asBase: false, + amount: parseFixed("0.88").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // closed out 1.1 bonds + bondAmount: parseFixed("1.1").bigint, + }, + }, + ]); + + const value = await readHyperdrive.getOpenLongs({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + baseAmountPaid: parseFixed("1.032").bigint, + bondAmount: parseFixed("1.1").bigint, + maturity: 1708545600n, + }, + ]); +}); + +test("getOpenLongs should account for longs fully closed to shares", async () => { + // Description: + // Bob opens up a long position, for a total cost 2 base, and receiving 2.2 + // bonds. He then closes the entirety of this position to shares at a time + // when shares are worth 1.1 base. As a result, he gets back 2 shares, for a + // value of 2.2 base. + const { contract, readHyperdrive } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenLong", + args: { + extraData: "0x", + assetId: 1n, + // paid for in base + amount: parseFixed("2").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // received bonds + bondAmount: parseFixed("2.2").bigint, + maturityTime: timestamp, + asBase: true, + trader: BOB, + }, + }, + ]); + + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseLong", + blockNumber: 5n, + args: { + extraData: "0x", + assetId: 1n, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + + // received back 2 shares, and no base + asBase: false, + amount: parseFixed("2.2").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + + // closed out 2.2 bonds + bondAmount: parseFixed("2.2").bigint, + }, + }, + ]); + + const value = await readHyperdrive.getOpenLongs({ account: BOB }); + + expect(value).toEqual([]); +}); + +test("getClosedLongs should account for closing out to base", async () => { + // Description: + // Bob closes a long position of 2 bonds and receives back 2.2 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseLong", + blockNumber: 5n, + args: { + extraData: "0x", + assetId: 1n, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + + // received back 2.2 base, and no shares + asBase: true, + amount: parseFixed("2.2").bigint, + vaultSharePrice: parseFixed("2.0").bigint, + + // closed out 2.0 bonds + bondAmount: parseFixed("2.0").bigint, + }, + }, + ]); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + const value = await readHyperdrive.getClosedLongs({ account: BOB }); + expect(value).toEqual([ + { + assetId: 1n, + baseAmount: parseFixed("2.2").bigint, + baseAmountPaid: 0n, + bondAmount: parseFixed("2.0").bigint, + closedTimestamp: 123456789n, + maturity: 1708545600n, + }, + ]); +}); + +test("getClosedLongs should account for closing out to shares", async () => { + // Description: + // Bob closes a long position of 2 bonds and receives back 1.9 shares. Shares + // are worth 1.1 base at the time he closes, therefore his closed position is + // valued at 2.09 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + const eventData = + "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + + contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseLong", + blockNumber: 5n, + args: { + extraData: "0x", + assetId: 1n, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + + // received back 1.9 shares, and no base + asBase: false, + vaultSharePrice: parseFixed("1.1").bigint, + amount: parseFixed("1.9").bigint, + + // closed out 2 bonds + bondAmount: parseFixed("2.0").bigint, + }, + }, + ]); + + // getBlock gives us the timestamp of when he closed the position + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + + const value = await readHyperdrive.getClosedLongs({ account: BOB }); + expect(value).toEqual([ + { + assetId: 1n, + baseAmount: parseFixed("2.09").bigint, + baseAmountPaid: 0n, + bondAmount: parseFixed("2.0").bigint, + closedTimestamp: 123456789n, + maturity: 1708545600n, + }, + ]); +}); + +test("getOpenShorts should account for shorts opened with base", async () => { + // Description: + // Bob opens up a short position for 100 bonds over 2 txs in the same + // checkpoint, for a total cost of around 1.44 base. + + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.onGetEvents("OpenShort", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenShort", + blockNumber: 1n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.725310333032516405").bigint, + vaultSharePrice: parseFixed("0.721996107012129147").bigint, + asBase: true, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "OpenShort", + blockNumber: 2n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.72527013345635719").bigint, + vaultSharePrice: parseFixed("0.721952948135251528").bigint, + asBase: true, + baseProceeds: parseFixed("49.288611983218631127").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + ]); + + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([]); + + drift.onGetBlock().resolves({ + timestamp: 1713801432n, + blockNumber: 1n, + }); + + const value = await readHyperdrive.getOpenShorts({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + checkpointTime: 1713798000n, + baseAmountPaid: parseFixed("1.450580466488873595").bigint, + bondAmount: parseFixed("100").bigint, + baseProceeds: parseFixed("98.576966043666144584").bigint, + fixedRatePaid: parseFixed("0.175635145784387390").bigint, + hyperdriveAddress: ZERO_ADDRESS, + maturity: 1716336000n, + openedTimestamp: 1713801432n, + }, + ]); +}); + +test("getOpenShorts should account for shorts opened with shares", async () => { + // Description: + // Bob opens up a short position for 100 bonds over 2 txs in the same + // checkpoint, for a total cost of around 1.44 shares. + + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.onGetEvents("OpenShort", { filter: { trader: BOB } }).resolves([ + { + eventName: "OpenShort", + blockNumber: 1n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.721996107012129147").bigint, + vaultSharePrice: parseFixed("1.004590365499").bigint, + asBase: false, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "OpenShort", + blockNumber: 2n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.721952948135251528").bigint, + vaultSharePrice: parseFixed("1.004594738936").bigint, + asBase: false, + baseProceeds: parseFixed("49.288611983218631127").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + ]); + + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([]); + + drift.onGetBlock().resolves({ + timestamp: 1713801432n, + blockNumber: 1n, + }); + + const value = await readHyperdrive.getOpenShorts({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + checkpointTime: 1713798000n, + baseAmountPaid: parseFixed("1.450580466488178492").bigint, + bondAmount: parseFixed("100").bigint, + baseProceeds: parseFixed("98.576966043666144584").bigint, + fixedRatePaid: parseFixed("0.175635145784387390").bigint, + hyperdriveAddress: ZERO_ADDRESS, + maturity: 1716336000n, + openedTimestamp: 1713801432n, + }, + ]); +}); + +test("getOpenShorts should account for shorts partially closed to base", async () => { + // Description: + // Bob shorts 50 bonds for a total cost of 0.73 base. He then partially + // closes this position, redeeming 25 bonds for 0.36 base. As a result, he has 25 + // bonds left with a total cost of 0.37 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + + const events = [ + { + eventName: "OpenShort", + blockNumber: 1n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.725310333032516405").bigint, + vaultSharePrice: parseFixed("0.721996107012129147").bigint, + asBase: true, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "CloseShort", + blockNumber: 2n, + args: { + extraData: "0x", + trader: BOB, + destination: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.357390566309610627").bigint, + vaultSharePrice: parseFixed("0.355730805024955393").bigint, + asBase: true, + basePayment: parseFixed("24.651318786405479294").bigint, + bondAmount: parseFixed("25").bigint, + }, + }, + ] as const; + + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + const value = await readHyperdrive.getOpenShorts({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + bondAmount: parseFixed("25").bigint, + baseAmountPaid: parseFixed("0.367919766722905778").bigint, + baseProceeds: parseFixed("24.637035274042034163").bigint, + checkpointTime: 123454800n, + hyperdriveAddress: ZERO_ADDRESS, + fixedRatePaid: parseFixed("0.179245221000329770").bigint, + maturity: 1716336000n, + openedTimestamp: 123456789n, + }, + ]); +}); + +test("getOpenShorts should account for shorts fully closed to base", async () => { + // Description: + // Bob opens up a short position, then completely closes this position, As a + // result, he no longer has any open short positions. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + + const events = [ + { + eventName: "OpenShort", + blockNumber: 1n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.725310333032516405").bigint, + vaultSharePrice: parseFixed("0.721996107012129147").bigint, + asBase: true, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "CloseShort", + blockNumber: 2n, + args: { + extraData: "0x", + trader: BOB, + destination: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.357390566309610627").bigint, + vaultSharePrice: parseFixed("0.355730805024955393").bigint, + asBase: true, + basePayment: parseFixed("24.651318786405479294").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + ] as const; + + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + const value = await readHyperdrive.getOpenShorts({ account: BOB }); + + expect(value).toEqual([]); +}); + +test("getOpenShorts should account for shorts partially closed to shares", async () => { + // Description: + // Bob shorts 50 bonds for a total cost of 0.73 base. He then partially + // closes this position, redeeming 25 bonds for 0.36 shares. As a result, he + // has 25 bonds left with a total cost of 0.37 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + + const events = [ + { + eventName: "OpenShort", + blockNumber: 1n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.725310333032516405").bigint, + vaultSharePrice: parseFixed("1.004590365499").bigint, + asBase: true, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "CloseShort", + blockNumber: 2n, + args: { + extraData: "0x", + trader: BOB, + destination: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.355730805024955393").bigint, + vaultSharePrice: parseFixed("1.004665778901").bigint, + asBase: false, + basePayment: parseFixed("24.651318786405479294").bigint, + bondAmount: parseFixed("25").bigint, + }, + }, + ] as const; + + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + const value = await readHyperdrive.getOpenShorts({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + bondAmount: parseFixed("25").bigint, + baseAmountPaid: parseFixed("0.367919766723039831").bigint, + baseProceeds: parseFixed("24.637035274042034163").bigint, + checkpointTime: 123454800n, + hyperdriveAddress: ZERO_ADDRESS, + fixedRatePaid: parseFixed("0.179245221000329770").bigint, + maturity: 1716336000n, + openedTimestamp: 123456789n, + }, + ]); +}); + +test("getOpenShorts should account for shorts fully closed to shares", async () => { + // Description: + // Bob opens up a short position, then completely closes this position, As a + // result, he no longer has any open short positions. + + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + const events = [ + { + eventName: "OpenShort", + blockNumber: 1n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.725310333032516405").bigint, + vaultSharePrice: parseFixed("1.004590365499").bigint, + asBase: true, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "CloseShort", + blockNumber: 2n, + args: { + extraData: "0x", + trader: BOB, + destination: BOB, + assetId: 1n, + maturityTime: 1716336000n, + vaultSharePrice: parseFixed("1.004665778901").bigint, + amount: parseFixed("0.355730805024955393").bigint, + asBase: false, + basePayment: parseFixed("24.651318786405479294").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + ] as const; + + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0]]); + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + const value = await readHyperdrive.getOpenShorts({ account: BOB }); + + expect(value).toEqual([]); +}); + +test("getOpenShorts should handle when user fully closes then re-opens a position in the same checkpoint", async () => { + // Description: + // Bob opens a Short, then fully closes it at a loss. Then he re-opens a short + // in the same checkpoint, resulting in a single position with new accounting + // (ie: the previous loss is not factored in). + + const { contract, drift, readHyperdrive } = setupReadHyperdrive(); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + // pool info to get the price of shares at the time he closes the short + contract + .onRead("getPoolInfo", {}, { block: 5n }) + .resolves({ ...simplePoolInfo, vaultSharePrice: parseFixed("1.1").bigint }); + + // Stub the timestamp so getOpenShorts can construct the checkpoint id + drift.onGetBlock().resolves({ + timestamp: 123456789n, + // this blockNumber is unused, but setting this to 3n, as there should be + // 3 blocks in this test flow + blockNumber: 3n, + }); + + const events = [ + { + eventName: "OpenShort", + blockNumber: 1n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.725310333032516405").bigint, + vaultSharePrice: parseFixed("1.004590365499").bigint, + asBase: true, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "CloseShort", + blockNumber: 2n, + args: { + extraData: "0x", + trader: BOB, + destination: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.355730805024955393").bigint, + vaultSharePrice: parseFixed("1.004665778901").bigint, + asBase: false, + basePayment: parseFixed("24.651318786405479294").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + { + eventName: "OpenShort", + blockNumber: 3n, + args: { + extraData: "0x", + trader: BOB, + assetId: 1n, + maturityTime: 1716336000n, + amount: parseFixed("0.725310333032516405").bigint, + vaultSharePrice: parseFixed("1.004590365499").bigint, + asBase: true, + baseProceeds: parseFixed("49.288354060447513457").bigint, + bondAmount: parseFixed("50").bigint, + }, + }, + ] as const; + + contract + .onGetEvents("OpenShort", { filter: { trader: BOB } }) + .resolves([events[0], events[2]]); + + contract + .onGetEvents("CloseShort", { filter: { trader: BOB } }) + .resolves([events[1]]); + + const value = await readHyperdrive.getOpenShorts({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + baseAmountPaid: parseFixed("0.725310333032516405").bigint, + bondAmount: parseFixed("50").bigint, + baseProceeds: parseFixed("49.288354060447513457").bigint, + fixedRatePaid: parseFixed("0.175667439018216348").bigint, + maturity: 1716336000n, + checkpointTime: 123454800n, + openedTimestamp: 123456789n, + hyperdriveAddress: readHyperdrive.contract.address, + }, + ]); +}); + +test("getShortBondsGivenDeposit & previewOpenShort should align within a given tolerance", async () => { + const { contract, drift, readHyperdrive } = setupReadHyperdrive(); + contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.onRead("getCheckpointExposure").resolves(0n); + contract.onRead("getCheckpoint").resolves({ + vaultSharePrice: parseFixed(1.05).bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }); + drift.onGetBlock().resolves({ + timestamp: 123456789n, + blockNumber: 1n, + }); + + const targetDeposit = parseFixed(1.123); + const tolerance = fixed(1e9); + const amountOfBondsToShort = await readHyperdrive.getShortBondsGivenDeposit({ + amountIn: targetDeposit.bigint, + asBase: true, + tolerance: tolerance.bigint, + }); + const { traderDeposit } = await readHyperdrive.previewOpenShort({ + amountOfBondsToShort, + asBase: true, + }); + + assert(targetDeposit.absDiff(traderDeposit).lte(tolerance)); +}); + +test("getClosedShorts should account for shorts closed to base", async () => { + // Description: + // Bob completely closes his position, redeeming 100 shorted bonds for 2 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const eventData = + "0x0200000000000000000000000000000000000000000000000000000065d76f800000000000000000000000000000000000000000000000056bc75e2d63100000"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseShort", + args: { + extraData: "0x", + assetId: 1n, + asBase: true, + amount: parseFixed("2").bigint, // closed out to base + vaultSharePrice: parseFixed("1.8").bigint, // did not close out to shares + bondAmount: parseFixed("100").bigint, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + basePayment: parseFixed("2").bigint, // did not close out to base + }, + }, + ]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + + const value = await readHyperdrive.getClosedShorts({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + baseAmountReceived: parseFixed("2").bigint, + bondAmount: parseFixed("100").bigint, + checkpointTime: 123454800n, + closedTimestamp: 123456789n, + hyperdriveAddress: ZERO_ADDRESS, + maturity: 1708617600n, + }, + ]); +}); + +test("getClosedShorts should account for shorts closed to shares", async () => { + // Description: + // Bob completely closes his position, redeeming 100 shorted bonds for 1.1 shares. + // Shares are worth 1.1 base at the time he closes, therefore his closed position + // is valued at 1.21 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const eventData = + "0x0200000000000000000000000000000000000000000000000000000065d76f800000000000000000000000000000000000000000000000056bc75e2d63100000"; + const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); + + contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + + contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([ + { + eventName: "CloseShort", + blockNumber: 5n, + args: { + extraData: "0x", + assetId: 1n, + asBase: false, + vaultSharePrice: parseFixed("1.1").bigint, + amount: parseFixed("1.1").bigint, // closed out to shares + bondAmount: parseFixed("100").bigint, + maturityTime: timestamp, + trader: BOB, + destination: BOB, + basePayment: parseFixed("1.21").bigint, + }, + }, + ]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + + const value = await readHyperdrive.getClosedShorts({ account: BOB }); + + expect(value).toEqual([ + { + assetId: 1n, + baseAmountReceived: parseFixed("1.21").bigint, + bondAmount: parseFixed("100").bigint, + checkpointTime: 123454800n, + closedTimestamp: 123456789n, + hyperdriveAddress: ZERO_ADDRESS, + maturity: 1708617600n, + }, + ]); +}); + +test("getOpenLpPosition should return zero when a position is fully closed", async () => { + // Description: + // Bob opens up an lp position, receiving 498 LP shares, depositing 500 base. + // Bob then closes all of his 498 LP shares, receiving 499 base (he lost + // 1 base on this position) Bob is left with 0 LP shares and 0 base paid in his + // current LP position. + + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.onSimulateWrite("removeLiquidity").resolves({ + proceeds: parseFixed("100").bigint, + withdrawalShares: 0n, + }); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 175n }); + contract.onGetEvents("AddLiquidity", { filter: { provider: BOB } }).resolves([ + { + eventName: "AddLiquidity", + blockNumber: 174n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("500").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.000000590811771717").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("498.570512905658351934").bigint, + }, + }, + ]); + + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 175n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("499").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.002867781011873985").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("498.567723245858722697").bigint, + withdrawalShareAmount: 0n, + destination: BOB, + }, + }, + ]); + + const value = await readHyperdrive.getOpenLpPosition({ + account: BOB, + asBase: false, + }); + expect(value).toEqual({ + lpShareBalance: parseFixed("0").bigint, + baseAmountPaid: parseFixed("0").bigint, + baseValue: parseFixed("0").bigint, + sharesValue: parseFixed("0").bigint, + }); +}); + +test("getOpenLpPosition should return the current lpShareBalance and baseAmountPaid", async () => { + // Description: + // Bob opens up an lp position, receiving 498 LP shares, depositing 500 base. + // Bob then closes his entire position of 498 LP shares, receiving 499 base + // (he lost 1 base on this position). Then he opens up a new LP position, + // receiving 99 LP shares, depositing 100 base. Bob now has with 99 LP + // shares and 100 base paid in his current LP position. + + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 175n }); + contract.onSimulateWrite("removeLiquidity").resolves({ + proceeds: parseFixed("100").bigint, + withdrawalShares: 0n, + }); + contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.onGetEvents("AddLiquidity", { filter: { provider: BOB } }).resolves([ + { + eventName: "AddLiquidity", + blockNumber: 174n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("500").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.000000590811771717").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("1.002867171358").bigint, + }, + }, + { + eventName: "AddLiquidity", + blockNumber: 176n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("100").bigint, + lpAmount: parseFixed("99").bigint, + lpSharePrice: parseFixed("1.000000576182752684").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("1.002867314461").bigint, + }, + }, + ]); + + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 175n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("499").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.002867781011873985").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("1.0008670371827").bigint, + withdrawalShareAmount: 0n, + destination: BOB, + }, + }, + ]); + + const value = await readHyperdrive.getOpenLpPosition({ + account: BOB, + asBase: false, + }); + expect(value).toEqual({ + lpShareBalance: parseFixed("99").bigint, + baseAmountPaid: parseFixed("100").bigint, + baseValue: parseFixed("100").bigint, + sharesValue: parseFixed("100").bigint, + }); +}); + +test("getClosedLpShares should account for LP shares closed to base", async () => { + // Description: + // Bob completely closes his LP position of 5 LP shares and receives back + // base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("10").bigint, + vaultSharePrice: parseFixed("9").bigint, + provider: BOB, + withdrawalShareAmount: 0n, + lpAmount: parseFixed("5").bigint, + lpSharePrice: parseFixed("2").bigint, + destination: BOB, + }, + }, + ]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + + const closedLpShares = await readHyperdrive.getClosedLpShares({ + account: BOB, + }); + expect(closedLpShares).toEqual([ + { + lpAmount: parseFixed("5").bigint, + baseAmount: parseFixed("10").bigint, + lpSharePrice: parseFixed("2").bigint, + withdrawalShareAmount: 0n, + closedTimestamp: 123456789n, + }, + ]); +}); + +test("getClosedLpShares should account for LP shares closed to vault shares", async () => { + // Description: + // Bob completely closes his LP position of 5 LP shares and receives back + // shares. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RemoveLiquidity", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: false, + amount: parseFixed("9").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + provider: BOB, + withdrawalShareAmount: 0n, + lpAmount: parseFixed("5").bigint, + lpSharePrice: parseFixed("2").bigint, + destination: BOB, + }, + }, + ]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + + const closedLpShares = await readHyperdrive.getClosedLpShares({ + account: BOB, + }); + expect(closedLpShares).toEqual([ + { + lpAmount: parseFixed("5").bigint, + baseAmount: parseFixed("9.9").bigint, + withdrawalShareAmount: 0n, + lpSharePrice: parseFixed("2").bigint, + closedTimestamp: 123456789n, + }, + ]); +}); + +test("getRedeemedWithdrawalShares should account for withdrawal shares closed to base", async () => { + // Description: + // Bob completely redeems 5 withdrawal shares and receives 10 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RedeemWithdrawalShares", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("10").bigint, + vaultSharePrice: parseFixed("9.8").bigint, + provider: BOB, + withdrawalShareAmount: parseFixed("5").bigint, + destination: BOB, + }, + }, + ]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + + const redeemedWithdrawalShares = + await readHyperdrive.getRedeemedWithdrawalShares({ + account: BOB, + }); + expect(redeemedWithdrawalShares).toEqual([ + { + hyperdriveAddress: ZERO_ADDRESS, + baseAmount: parseFixed("10").bigint, + withdrawalShareAmount: parseFixed("5").bigint, + redeemedTimestamp: 123456789n, + }, + ]); +}); +test("getRedeemedWithdrawalShares should account for withdrawal shares closed to vault shares", async () => { + // Description: + // Bob completely redeems 5 withdrawal shares and receives 8 shares that are worth 10 base. + const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + + contract + .onGetEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }) + .resolves([ + { + eventName: "RedeemWithdrawalShares", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: false, + vaultSharePrice: parseFixed("1.25").bigint, + amount: parseFixed("8").bigint, + provider: BOB, + withdrawalShareAmount: parseFixed("5").bigint, + destination: BOB, + }, + }, + ]); + + drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + + const redeemedWithdrawalShares = + await readHyperdrive.getRedeemedWithdrawalShares({ + account: BOB, + }); + expect(redeemedWithdrawalShares).toEqual([ + { + hyperdriveAddress: ZERO_ADDRESS, + baseAmount: parseFixed("10").bigint, + withdrawalShareAmount: parseFixed("5").bigint, + redeemedTimestamp: 123456789n, + }, + ]); +}); diff --git a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts new file mode 100644 index 000000000..039ce7b8f --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts @@ -0,0 +1,2078 @@ +import { + Address, + Block, + BlockTag, + ContractEvent, + ContractGetEventsOptions, + ContractReadOptions, + ContractWriteOptions, + MergeKeys, + ReadContract, +} from "@delvtech/drift"; +import { assertNever } from "src/base/assertNever"; +import { MAX_UINT256, SECONDS_PER_YEAR } from "src/base/constants"; +import { getCheckpointTime } from "src/checkpoint/getCheckpointTime"; +import { + Checkpoint, + CheckpointEvent, + GetCheckpointParams, + GetCheckpointTimeParams, +} from "src/checkpoint/types"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; +import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; +import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; +import { fixed } from "src/fixed-point"; +import { HyperdriveAbi, hyperdriveAbi } from "src/hyperdrive/base/abi"; +import { MAX_ITERATIONS, NULL_BYTES } from "src/hyperdrive/constants"; +import { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; +import { hyperwasm } from "src/hyperwasm"; +import { + ClosedLong, + Long, + OpenLongPositionReceivedWithoutDetails, +} from "src/longs/types"; +import { ClosedLpShares } from "src/lp/ClosedLpShares"; +import { LP_ASSET_ID } from "src/lp/assetId"; +import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; +import { MarketState, PoolConfig, PoolInfo } from "src/pool/types"; +import { calculateShortAccruedYield } from "src/shorts/calculateShortAccruedYield"; +import { ClosedShort, OpenShort } from "src/shorts/types"; +import { ReadErc20 } from "src/token/erc20/ReadErc20"; +import { ReadEth } from "src/token/eth/ReadEth"; +import { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; +import { WITHDRAW_SHARES_ASSET_ID } from "src/withdrawalShares/assetId"; + +export interface ReadHyperdriveOptions extends ReadContractClientOptions {} + +export class ReadHyperdrive extends ReadClient { + readonly address: Address; + readonly contract: ReadContract; + + /** + * @hidden + */ + constructor({ + debugName = "Hyperdrive", + address, + cache, + cacheNamespace, + drift, + ...rest + }: ReadHyperdriveOptions) { + super({ debugName, drift, ...rest }); + this.address = address; + this.contract = this.drift.contract({ + abi: hyperdriveAbi, + address, + cache, + cacheNamespace, + }); + } + + async getKind(): Promise { + return this.contract.read("kind"); + } + + async getVersion(): Promise<{ + major: number; + minor: number; + patch: number; + string: string; + }> { + const string = await this.contract.read("version"); + const [major, minor, patch] = string + .replace(/^\D*/, "") + .split(".") + .map((num) => parseInt(num)); + + return { + major, + minor, + patch, + string, + }; + } + + /** + * Returns the base token of the pool. + * + * @privateRemarks + * The default implementation supports ERC20 and ETH base tokens. If + * the address returned by the contract is not the ETH address, it is assumed + * to be an ERC20 token. + */ + async getBaseToken(): Promise { + const address = await this.contract.read("baseToken"); + return address === ReadEth.address + ? new ReadEth({ + drift: this.drift, + }) + : new ReadErc20({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + + /** + * Returns the share token of the pool. + * + * @privateRemarks + * The share token is assumed to be an ERC20 token. This can be overwritten + * in instances of Hyperdrive to return custom tokens. + */ + async getSharesToken(): Promise { + const address = await this.contract.read("vaultSharesToken"); + return new ReadErc20({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + + getDecimals(): Promise { + return this.contract.read("decimals"); + } + + /** + * Convert an amount of shares to base tokens using the current vault share price. + */ + async convertToBase({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.contract.read( + "convertToBase", + { + _shareAmount: sharesAmount, + }, + options, + ); + } + + /** + * Convert an amount of base tokens to shares using the current vault share price. + */ + async convertToShares({ + baseAmount, + options, + }: { + baseAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.contract.read( + "convertToShares", + { + _baseAmount: baseAmount, + }, + options, + ); + } + + async getInitializationBlock(options?: { + fromBlock?: BlockTag | bigint; + toBlock?: BlockTag | bigint; + }): Promise { + const events = await this.contract.getEvents("Initialize", options); + + if (!events.length || events[0].blockNumber === undefined) { + throw new HyperdriveSdkError( + "Pool has not been initialized, no block found.", + ); + } + const blockNumber = events[0].blockNumber; + + return getBlockOrThrow(this.drift, { blockNumber }); + } + + /** + * Get a standardized variable rate using vault share prices from blocks in + * the last `timeRange` seconds. + * + * Note: This function will throw an error if the pool was deployed within the + * last `timeRange` seconds. + * + * See Agent0 for calculation: + * https://github.com/delvtech/agent0/blob/854e9392e09898e65aeed0040c5e648c8d3d1380/src/agent0/ethpy/hyperdrive/interface/read_interface.py#L421 + * + * @param blockRange The block range (in blocks) to use to calculate the variable rate. + */ + async getYieldSourceRate({ + blockRange, + options, + }: { + blockRange: bigint; + options?: ContractReadOptions; + }): Promise { + const currentBlock = await getBlockOrThrow(this.drift, options); + // Clamp the start block to the pool's initialization block if the + // blockRange is too big. + let startBlockNumber = currentBlock.blockNumber! - blockRange; + const { blockNumber: initializationBlock } = + await this.getInitializationBlock(); + if (initializationBlock && initializationBlock > startBlockNumber) { + startBlockNumber = initializationBlock; + } + + // NOTE: Cloudchain will throw an error if the block number is too far back + // in history. + const startBlock = await getBlockOrThrow(this.drift, { + blockNumber: startBlockNumber, + }); + + // Get the info from fromBlock to get the starting vault share price + const { vaultSharePrice: startVaultSharePrice } = await this.getPoolInfo({ + block: startBlockNumber, + }); + + // Get the current vaultSharePrice from the latest pool info + const { vaultSharePrice: currentVaultSharePrice } = + await this.getPoolInfo(options); + + const timeFrame = currentBlock.timestamp - startBlock.timestamp; // bigint + + const vaultApy = calculateApyFromPrice({ + startPrice: startVaultSharePrice, + endPrice: currentVaultSharePrice, + timeFrame, + }); + + return vaultApy; + } + + /** + * Get the checkpoint time for a given timestamp or block number, defaulting + * to the latest block. + * @returns The time of the checkpoint. + */ + getCheckpointTime(params: GetCheckpointTimeParams = {}): Promise { + return this._getCheckpointTime(params); + } + + /** + * A protected version of `ReadHyperdrive.getCheckpointTime` with + * more relaxed types to streamline internal usage. The public API ensures + * only one of `timestamp` or `blockNumber` is provided to avoid ambiguity, + * but this function allows both to be provided, in which case `timestamp` + * will take precedence. + */ + protected async _getCheckpointTime({ + timestamp, + blockNumber, + options, + }: MergeKeys = {}): Promise { + const { checkpointDuration } = await this.getPoolConfig(options); + + // If no timestamp is provided, try to get one from the block number + if (timestamp === undefined) { + // Default to the block from read options + const getBlockOptions = blockNumber ? { blockNumber } : options; + const block = await getBlockOrThrow(this.drift, getBlockOptions); + timestamp = block.timestamp; + } + + return getCheckpointTime(timestamp, checkpointDuration); + } + + async getCheckpoint({ + checkpointTime, + timestamp, + blockNumber, + options, + }: GetCheckpointParams = {}): Promise { + if (checkpointTime === undefined) { + checkpointTime = await this._getCheckpointTime({ + timestamp, + blockNumber, + options, + }); + } + + const { + lastWeightedSpotPriceUpdateTime, + vaultSharePrice, + weightedSpotPrice, + } = await this.contract.read( + "getCheckpoint", + { _checkpointTime: checkpointTime }, + options, + ); + + return { + checkpointTime, + lastWeightedSpotPriceUpdateTime, + vaultSharePrice, + weightedSpotPrice, + }; + } + + async getCheckpointExposure({ + checkpointTime, + blockNumber, + timestamp, + options, + }: GetCheckpointParams = {}): Promise { + if (checkpointTime === undefined) { + checkpointTime = await this._getCheckpointTime({ + blockNumber, + timestamp, + options, + }); + } + + return this.contract.read( + "getCheckpointExposure", + { _checkpointTime: checkpointTime }, + options, + ); + } + + /** + * + * This function retrieves the market state. This is helpful for retrieving + * general market state statistics, such as whether the market has been + * paused. + */ + getMarketState(options?: ContractReadOptions): Promise { + return this.contract.read("getMarketState", undefined, options); + } + + /** + * Gets the pool's configuration parameters + */ + getPoolConfig(options?: ContractReadOptions): Promise { + return this.contract.read("getPoolConfig", undefined, options); + } + + /** + * Gets info about the pool's reserves and other state that is important to + * evaluate potential trades. + */ + getPoolInfo(options?: ContractReadOptions): Promise { + return this.contract.read("getPoolInfo", undefined, options); + } + + /** + * Gets the pool's fixed APR, i.e. the fixed rate a user locks in when they + * open a long. + */ + async getFixedApr(options?: ContractReadOptions): Promise { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + return hyperwasm.spotRate({ poolConfig, poolInfo }); + } + + /** + * Gets the implied variable rate of opening a short. + */ + async getImpliedRate({ + bondAmount, + timestamp, + variableApy, + options, + }: { + bondAmount: bigint; + timestamp: bigint; + // TODO: Get this from sdk instead + variableApy: bigint; + options?: ContractReadOptions; + }): Promise { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + + // The vault share price at the time the current checkpoint was minted is + // the most accurate, however if there is no current checkpoint we should + // just use the current vault share price. + let { vaultSharePrice: openVaultSharePrice } = await this.getCheckpoint({ + timestamp, + }); + if (!openVaultSharePrice) { + openVaultSharePrice = (await this.getPoolInfo()).vaultSharePrice; + } + + return hyperwasm.calcImpliedRate({ + poolInfo, + poolConfig, + bondAmount, + openVaultSharePrice, + variableApy, + }); + } + + /** + * Gets the market liquidity available for trading and removing LP. + */ + async getIdleLiquidity(options?: ContractReadOptions): Promise { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + + return hyperwasm.idleShareReservesInBase({ poolInfo, poolConfig }); + } + + /** + * Gets the total present value of the pool in base. + * @param options + * @returns + */ + async getPresentValue(options?: ContractReadOptions): Promise { + // presentValueInShares 33997119981629446n + // Start block: {blockNumber: 20486359n, timestamp: 1723150091n} + // Start vault share price: 1015896019620210959n + // Current vault share price: 1017273050693203130n + // Time frame: 1203624n + // Vault APY: 36128140020150719n + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + + const presentValueInShares = hyperwasm.presentValue({ + poolInfo, + poolConfig, + currentTime: BigInt(Date.now()) / 1000n, + }); + + return this.convertToBase({ + sharesAmount: presentValueInShares, + options, + }); + } + + /** + * Gets the yield accrued on an amount of bonds shorted in a given checkpoint. + * Note that shorts stop accruing yield once they reach maturity. + * @param checkpointTime - The checkpoint the short was opened in + * @param bondAmount - The number of bonds shorted + * @param decimals + * @param options + */ + async getShortAccruedYield({ + checkpointTime, + bondAmount, + options, + }: { + checkpointTime: bigint; + bondAmount: bigint; + options?: ContractReadOptions; + }): Promise { + // Get the vault share price when the short was opened + let { vaultSharePrice: openVaultSharePrice } = await this.getCheckpoint({ + checkpointTime, + options, + }); + + const { positionDuration } = await this.getPoolConfig(options); + const maturityTime = checkpointTime + positionDuration; + const latestCheckpointTime = await this.getCheckpointTime({ options }); + const isMatured = latestCheckpointTime >= maturityTime; + + // If the short is mature, get the vault share price at maturity + let endingVaultSharePrice; + if (isMatured) { + const checkpointAtMaturity = await this.getCheckpoint({ + checkpointTime: maturityTime, + options, + }); + endingVaultSharePrice = checkpointAtMaturity.vaultSharePrice; + } else { + // Otherwise get the current vault share price + const poolInfo = await this.getPoolInfo(options); + endingVaultSharePrice = poolInfo.vaultSharePrice; + // Also check if the latest checkpoint was minted + const checkpointIsMinted = openVaultSharePrice != 0n; + // If not, this tx will mint it and set its vaultSharePrice + if (!checkpointIsMinted) { + openVaultSharePrice = poolInfo.vaultSharePrice; + } + } + + return calculateShortAccruedYield({ + openVaultSharePrice, + endingVaultSharePrice, + bondAmount, + decimals: await this.getDecimals(), + }); + } + + /** + * Calculates the total trading volume in bonds given a block window. + * @param options.fromBlock - The start block, defaults to "earliest" + * @param options.toBlock - The end block, defaults to "latest" + * @returns the total amount of bonds traded + */ + async getTradingVolume(options?: { + fromBlock?: BlockTag | bigint; + toBlock?: BlockTag | bigint; + }): Promise<{ + totalVolume: bigint; + longVolume: bigint; + shortVolume: bigint; + }> { + const { fromBlock, toBlock } = options || {}; + const longEvents = await this.getLongEvents({ + fromBlock, + toBlock, + }); + const shortEvents = await this.getShortEvents({ + fromBlock, + toBlock, + }); + + const longVolume = longEvents.reduce( + (sum, { bondAmount }) => sum + bondAmount, + 0n, + ); + const shortVolume = shortEvents.reduce( + (sum, { bondAmount }) => sum + bondAmount, + 0n, + ); + return { + longVolume, + shortVolume, + totalVolume: longVolume + shortVolume, + }; + } + + /** + * Gets the spot price of a long + * @param options - The read options + * @returns the spot price of a long + */ + async getLongPrice(options?: ContractReadOptions): Promise { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + + return hyperwasm.spotPrice({ poolConfig, poolInfo }); + } + + async getLongEvents( + options?: ContractGetEventsOptions & + ContractGetEventsOptions, + ): Promise< + { + trader: `0x${string}`; + assetId: bigint; + bondAmount: bigint; + baseAmount: bigint; + eventName: "OpenLong" | "CloseLong"; + blockNumber: bigint | undefined; + transactionHash: `0x${string}` | undefined; + }[] + > { + const openLongEvents = await this.contract.getEvents("OpenLong", options); + const closeLongEvents = await this.contract.getEvents("CloseLong", options); + return [...openLongEvents, ...closeLongEvents] + .map(({ args, eventName, blockNumber, transactionHash }) => { + const baseAmount = args.asBase + ? args.amount + : fixed(args.amount).mul(args.vaultSharePrice).bigint; + return { + trader: args.trader, + assetId: args.assetId, + bondAmount: args.bondAmount, + baseAmount, + eventName, + blockNumber, + transactionHash, + }; + }) + .sort((a, b) => Number(a.blockNumber) - Number(b.blockNumber)); + } + + async getShortEvents( + options?: ContractGetEventsOptions & + ContractGetEventsOptions, + ): Promise< + { + trader: `0x${string}`; + assetId: bigint; + bondAmount: bigint; + baseAmount: bigint; + eventName: "OpenShort" | "CloseShort"; + blockNumber: bigint | undefined; + transactionHash: `0x${string}` | undefined; + }[] + > { + const openShortEvents = await this.contract.getEvents("OpenShort", options); + const closeShortEvents = await this.contract.getEvents( + "CloseShort", + options, + ); + return [...openShortEvents, ...closeShortEvents] + .map(({ args, eventName, blockNumber, transactionHash }) => { + const baseAmount = args.asBase + ? args.amount + : fixed(args.amount).mul(args.vaultSharePrice).bigint; + return { + trader: args.trader, + assetId: args.assetId, + bondAmount: args.bondAmount, + baseAmount, + eventName, + blockNumber, + transactionHash, + }; + }) + .sort((a, b) => Number(a.blockNumber) - Number(b.blockNumber)); + } + + async getLpEvents( + options?: ContractGetEventsOptions & + ContractGetEventsOptions & + ContractGetEventsOptions, + ): Promise<{ + addLiquidity: ContractEvent[]; + removeLiquidity: ContractEvent[]; + redeemWithdrawalShares: ContractEvent< + HyperdriveAbi, + "RedeemWithdrawalShares" + >[]; + }> { + const addLiquidityEvents = await this.contract.getEvents( + "AddLiquidity", + options, + ); + const removeLiquidityEvents = await this.contract.getEvents( + "RemoveLiquidity", + options, + ); + const redeemWithdrawalSharesEvents = await this.contract.getEvents( + "RedeemWithdrawalShares", + options, + ); + + return { + addLiquidity: addLiquidityEvents, + removeLiquidity: removeLiquidityEvents, + redeemWithdrawalShares: redeemWithdrawalSharesEvents, + }; + } + + /** + * This returns the LP APY using the following formula for continuous compounding: + * r = rate of return + * p_0 = from lpSharePrice + * p_1 = to lpSharePrice + * t = time frame between p_0 and p_1 + * + * r = (p_1 / p_0) ^ (1 / t) - 1 + */ + async getLpApy({ + fromBlock, + options, + }: { + fromBlock: bigint; + options?: ContractReadOptions; + }): Promise<{ lpApy: bigint }> { + // If the 24 hour rate doesn't exist, assume the pool was initialized less + // than 24 hours before and try to get the all-time rate until toBlock + const { blockNumber: initializationBlock } = + await this.getInitializationBlock(); + if (initializationBlock && initializationBlock > fromBlock) { + fromBlock = initializationBlock; + } + + // Attempt to fetch the blocks first to fail early if the block is not found + const currentBlock = await getBlockOrThrow(this.drift, options); + const startBlock = await getBlockOrThrow(this.drift, { + blockNumber: fromBlock, + }); + + // Get the info from fromBlock to get the starting lp share price + const { lpSharePrice: startLpSharePrice } = await this.getPoolInfo({ + block: fromBlock, + }); + + // Get the current lpSharePrice from the latest pool info + const { lpSharePrice: currentLpSharePrice } = await this.getPoolInfo(); + + const timeFrame = currentBlock.timestamp - startBlock.timestamp; + + const lpApy = calculateApyFromPrice({ + startPrice: startLpSharePrice, + endPrice: currentLpSharePrice, + timeFrame, + }); + + return { lpApy }; + } + + async getCheckpointEvents( + options?: ContractGetEventsOptions, + ): Promise { + const checkPointEvents = await this.contract.getEvents( + "CreateCheckpoint", + options, + ); + return checkPointEvents; + } + + private _calcOpenLongs({ + openLongEvents, + closeLongEvents, + }: { + openLongEvents: ContractEvent[]; + closeLongEvents: ContractEvent[]; + }): Long[] { + // Put open and long events in block order. We spread openLongEvents first + // since you have to open a long before you can close one. + const orderedLongEvents = [...openLongEvents, ...closeLongEvents].sort( + (a, b) => Number(a.blockNumber) - Number(b.blockNumber), + ); + + const openLongs: Record = {}; + + orderedLongEvents.forEach((event) => { + const assetId = event.args.assetId.toString(); + + const long: Long = openLongs[assetId] || { + assetId: event.args.assetId, + maturity: event.args.maturityTime, + baseAmountPaid: 0n, + bondAmount: 0n, + }; + + const baseAmount = event.args.asBase + ? event.args.amount + : fixed(event.args.amount).mul(event.args.vaultSharePrice).bigint; + + switch (event.eventName) { + case "OpenLong": + openLongs[assetId] = { + ...long, + baseAmountPaid: long.baseAmountPaid + baseAmount, + bondAmount: long.bondAmount + event.args.bondAmount, + }; + return; + + case "CloseLong": + // If a user closes their whole position, we should remove the whole + // position since it's basically starting over + if (event.args.bondAmount === long.bondAmount) { + delete openLongs[assetId]; + } else { + // otherwise just subtract the amount of bonds they closed and baseAmount + // they received back from the running total + openLongs[assetId] = { + ...long, + baseAmountPaid: long.baseAmountPaid - baseAmount, + bondAmount: long.bondAmount - event.args.bondAmount, + }; + } + return; + + default: + assertNever(event, true); + } + }); + + return Object.values(openLongs).filter((long) => long.bondAmount); + } + + // TODO: Rename this to getOpenLongs once this function replaces the existing getOpenLongs + async getOpenLongPositions({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const transfersReceived = await this.contract.getEvents("TransferSingle", { + filter: { to: account }, + toBlock: options?.block, + }); + const transfersSent = await this.contract.getEvents("TransferSingle", { + filter: { from: account }, + toBlock: options?.block, + }); + + const longsReceived = transfersReceived.filter((event) => { + const { assetType } = decodeAssetFromTransferSingleEventData( + event.data as `0x${string}`, + ); + return assetType === "LONG"; + }); + + const longsSent = transfersSent.filter((event) => { + const { assetType } = decodeAssetFromTransferSingleEventData( + event.data as `0x${string}`, + ); + return assetType === "LONG"; + }); + + // Put open and long events in block order. We spread openLongEvents first + // since you have to open a long before you can close one. + const orderedLongEvents = [...longsReceived, ...longsSent].sort( + (a, b) => Number(a.blockNumber) - Number(b.blockNumber), + ); + + const openLongs: Record = + {}; + + orderedLongEvents.forEach((event) => { + const assetId = event.args.id.toString(); + + const long: OpenLongPositionReceivedWithoutDetails = openLongs[ + assetId + ] || { + assetId, + maturity: decodeAssetFromTransferSingleEventData( + event.data as `0x${string}`, + ).timestamp, + value: 0n, + }; + + const isLongReceived = event.args.to === account; + if (isLongReceived) { + const updatedLong: OpenLongPositionReceivedWithoutDetails = { + ...long, + value: long.value + event.args.value, + }; + openLongs[assetId] = updatedLong; + return; + } + + const isLongSent = event.args.from === account; + if (isLongSent) { + // If a user closes their whole position, we should remove the whole + // position since it's basically starting over + if (event.args.value === long.value) { + delete openLongs[assetId]; + return; + } + // otherwise just subtract the amount of bonds they closed and baseAmount + // they received back from the running total + const updatedLong: OpenLongPositionReceivedWithoutDetails = { + ...long, + value: long.value - event.args.value, + }; + openLongs[assetId] = updatedLong; + } + }); + return Object.values(openLongs).filter((long) => long.value); + } + + async getOpenLongDetails({ + assetId, + account, + options, + }: { + assetId: bigint; + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const allLongPositions = await this.getOpenLongPositions({ + account, + options, + }); + + const longPosition = allLongPositions.find((p) => p.assetId === assetId); + + if (!longPosition) { + throw new HyperdriveSdkError( + `No position with asset id: ${assetId} found for account ${account}`, + ); + } + + const openLongEvents = await this.contract.getEvents("OpenLong", { + filter: { trader: account }, + }); + + const closeLongEvents = await this.contract.getEvents("CloseLong", { + filter: { trader: account }, + }); + + const allOpenLongDetails = this._calcOpenLongs({ + openLongEvents, + closeLongEvents, + }); + + const openLongDetails = allOpenLongDetails.find( + (details) => + details.assetId.toString() === longPosition.assetId.toString(), + ); + // If no details exists for the position, the user must have just received + // some longs via transfer but never opened them themselves. + // OR If the amounts aren't the same, then they may have opened some and + // received some from another wallet. In this case, we still can't be sure + // of the details, so we return undefined. + if (!openLongDetails || openLongDetails.bondAmount !== longPosition.value) { + return; + } + + return openLongDetails; + } + /** + * @deprecated Use ReadHyperdrive.getOpenLongPositions and ReadHyperdrive.getOpenLongDetails instead to retrieve all longs opened or received by a user. + * Gets the active longs opened by a specific user. + * @param account - The user's address + * @param options.toBlock - The end block, defaults to "latest" + * @returns the active longs opened by a specific user + */ + async getOpenLongs({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const openLongEvents = await this.contract.getEvents("OpenLong", { + filter: { trader: account }, + toBlock: options?.block, + }); + const closeLongEvents = await this.contract.getEvents("CloseLong", { + filter: { trader: account }, + toBlock: options?.block, + }); + + return this._calcOpenLongs({ + openLongEvents, + closeLongEvents, + }); + } + + /** + * Gets the active shorts opened by a specific user. + * @param account - The user's address + * @param options.toBlock - The end block, defaults to "latest" + * @returns the active shorts opened by a specific user + * */ + async getOpenShorts({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const { checkpointDuration, positionDuration } = + await this.getPoolConfig(options); + + const openShortEvents = await this.contract.getEvents("OpenShort", { + filter: { trader: account }, + toBlock: options?.block, + }); + const closeShortEvents = await this.contract.getEvents("CloseShort", { + filter: { trader: account }, + toBlock: options?.block, + }); + + return this._calcOpenShorts({ + hyperdriveAddress: this.address, + checkpointDuration, + positionDuration, + openShortEvents, + closeShortEvents, + }); + } + + private async _calcOpenShorts({ + hyperdriveAddress, + checkpointDuration, + positionDuration, + closeShortEvents, + openShortEvents, + }: { + hyperdriveAddress: Address; + checkpointDuration: bigint; + positionDuration: bigint; + openShortEvents: ContractEvent[]; + closeShortEvents: ContractEvent[]; + }): Promise { + // Put open and short events in block order. We spread openShortEvents first + // since you have to open a short before you can close one. + const orderedShortEvents = [...openShortEvents, ...closeShortEvents].sort( + (a, b) => Number(a.blockNumber) - Number(b.blockNumber), + ); + + const openShorts: Record = {}; + + for (const event of orderedShortEvents) { + const assetId = event.args.assetId.toString(); + const { timestamp } = await getBlockOrThrow(this.drift, { + blockNumber: event.blockNumber, + }); + + // Create a default empty short that we will update based on the events + // const short: OpenShort = openShorts[assetId] || { + openShorts[assetId] = openShorts[assetId] || { + hyperdriveAddress, + assetId: event.args.assetId, + maturity: event.args.maturityTime, + checkpointTime: getCheckpointTime(timestamp, checkpointDuration), + // The openedTimestamp will always reflect the latest short, if you open + // twice in the same checkpoint + openedTimestamp: timestamp, + baseAmountPaid: 0n, + bondAmount: 0n, + baseProceeds: 0n, + fixedRatePaid: 0n, + }; + + const baseAmount = event.args.asBase + ? event.args.amount + : fixed(event.args.amount).mul(event.args.vaultSharePrice).bigint; + + const { eventName } = event; + switch (eventName) { + // When you open a short, we add up how much you've paid and your new + // total bond amount, then update the average price and fixed rate + // paid + case "OpenShort": + openShorts[assetId].baseAmountPaid += baseAmount; + openShorts[assetId].bondAmount += event.args.bondAmount; + openShorts[assetId].baseProceeds += event.args.baseProceeds; + openShorts[assetId].fixedRatePaid = calculateAprFromPrice({ + positionDuration, + baseAmount: openShorts[assetId].baseProceeds, + bondAmount: openShorts[assetId].bondAmount, + }); + continue; + + case "CloseShort": { + // If a user closes their whole position, we should remove the whole + // position since it's basically starting over + if (event.args.bondAmount === openShorts[assetId].bondAmount) { + delete openShorts[assetId]; + continue; + } + // otherwise just subtract the amount of bonds they closed and baseAmount + // they received back from the running total + openShorts[assetId].baseAmountPaid -= baseAmount; + openShorts[assetId].bondAmount -= event.args.bondAmount; + openShorts[assetId].baseProceeds -= event.args.basePayment; + openShorts[assetId].fixedRatePaid = calculateAprFromPrice({ + positionDuration, + baseAmount: openShorts[assetId].baseProceeds, + bondAmount: openShorts[assetId].bondAmount, + }); + continue; + } + + default: + assertNever(eventName, true); + } + } + + return Object.values(openShorts).filter((short) => short.bondAmount); + } + + /** + * Gets the closed longs by a specific user. + */ + async getClosedLongs({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const closedLongs = await this.contract.getEvents("CloseLong", { + filter: { trader: account }, + toBlock: options?.block, + }); + + const closedLongsList: ClosedLong[] = await Promise.all( + closedLongs.map(async (event) => { + const assetId = event.args.assetId; + + const baseAmount = event.args.asBase + ? event.args.amount + : fixed(event.args.amount).mul(event.args.vaultSharePrice).bigint; + + return { + assetId, + bondAmount: event.args.bondAmount, + baseAmount, + baseAmountPaid: 0n, // TODO: Remove this field, this is copy/paste from @hyperdrive/queries + maturity: event.args.maturityTime, + closedTimestamp: ( + await getBlockOrThrow(this.drift, { + blockNumber: event.blockNumber, + }) + ).timestamp, + }; + }), + ); + return closedLongsList.filter((long) => long.bondAmount); + } + + /** + * Gets the inactive shorts opened by a specific user. + */ + async getClosedShorts({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const closedShorts = await this.contract.getEvents("CloseShort", { + filter: { trader: account }, + toBlock: options?.block, + }); + + const { checkpointDuration } = await this.getPoolConfig(options); + const closedShortsList: ClosedShort[] = await Promise.all( + closedShorts.map(async (event) => { + const { assetId, maturityTime } = event.args; + const { timestamp } = await getBlockOrThrow(this.drift, { + blockNumber: event.blockNumber, + }); + + const baseAmount = event.args.asBase + ? event.args.amount + : fixed(event.args.amount).mul(event.args.vaultSharePrice).bigint; + + return { + hyperdriveAddress: this.address, + assetId, + bondAmount: event.args.bondAmount, + baseAmountReceived: baseAmount, + maturity: maturityTime, + closedTimestamp: timestamp, + checkpointTime: getCheckpointTime(timestamp, checkpointDuration), + }; + }), + ); + + return closedShortsList.filter((short) => short.bondAmount); + } + /** + * Gets the maximum amount of bonds a user can open a short for. + */ + async getMaxShort({ + budget, + options, + }: { + budget: bigint; + options?: ContractReadOptions; + }): Promise<{ + maxBaseIn: bigint; + maxSharesIn: bigint; + maxBondsOut: bigint; + }> { + const poolInfo = await this.getPoolInfo(options); + const poolConfig = await this.getPoolConfig(options); + const checkpointExposure = await this.getCheckpointExposure({ options }); + const { vaultSharePrice: openVaultSharePrice } = await this.getCheckpoint({ + options, + }); + + const maxBondsOut = hyperwasm.maxShort({ + budget, + poolInfo, + poolConfig, + maxIterations: MAX_ITERATIONS, + openVaultSharePrice, + checkpointExposure, + }); + + const maxBaseIn = hyperwasm.calcOpenShort({ + poolInfo, + poolConfig, + bondAmount: maxBondsOut, + openVaultSharePrice, + }); + const maxSharesIn = await this.convertToShares({ + baseAmount: maxBaseIn, + options, + }); + + return { + maxBaseIn, + maxSharesIn, + maxBondsOut, + }; + } + /** + * Gets the maximum amount of bonds a user can open a long for. + */ + async getMaxLong(options?: ContractReadOptions): Promise<{ + maxBaseIn: bigint; + maxSharesIn: bigint; + maxBondsOut: bigint; + }> { + const poolInfo = await this.getPoolInfo(options); + const poolConfig = await this.getPoolConfig(options); + const checkpointExposure = await this.getCheckpointExposure({ options }); + + const maxBaseIn = hyperwasm.maxLong({ + poolInfo, + poolConfig, + budget: MAX_UINT256, + checkpointExposure, + }); + + const maxSharesIn = await this.convertToShares({ + baseAmount: maxBaseIn, + options, + }); + + const maxBondsOut = hyperwasm.calcOpenLong({ + poolInfo, + poolConfig, + baseAmount: maxBaseIn, + }); + + return { + maxBaseIn, + maxSharesIn, + maxBondsOut, + }; + } + + getLpSharesTotalSupply(args?: { + options?: ContractReadOptions; + }): Promise { + return this.contract.read( + "totalSupply", + { tokenId: LP_ASSET_ID }, + args?.options, + ); + } + + /** + * Gets the amount of LP shares a user has. + */ + getLpShares({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + return this.contract.read( + "balanceOf", + { tokenId: LP_ASSET_ID, owner: account }, + options, + ); + } + + /** + * Gets a user's current LP position. + */ + async getOpenLpPosition({ + account, + // TODO: Remove asBase parameter when we can use hyperwasm to calculate the + // preview remove liquidity + asBase, + options, + }: { + asBase: boolean; + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise<{ + lpShareBalance: bigint; + baseAmountPaid: bigint; + baseValue: bigint; + sharesValue: bigint; + }> { + const addLiquidityEvents = await this.contract.getEvents("AddLiquidity", { + filter: { provider: account }, + toBlock: options?.block, + }); + const removeLiquidityEvents = await this.contract.getEvents( + "RemoveLiquidity", + { + filter: { provider: account }, + toBlock: options?.block, + }, + ); + + const decimals = await this.getDecimals(); + const { lpShareBalance, baseAmountPaid } = this._calcOpenLpPosition({ + addLiquidityEvents, + removeLiquidityEvents, + }); + + if (!lpShareBalance) { + return { + lpShareBalance, + baseAmountPaid, + baseValue: 0n, + sharesValue: 0n, + }; + } + + // Note: `previewRemoveLiquidity` uses the `simulateWrite` method which + // simulates the transaction at the current block. This means that the + // calculated value of the position will always be based on the current + // state of the pool, even if the lp balance and amount paid were + // calculated using past events via the block in options. + + const { proceeds, withdrawalShares } = await this.previewRemoveLiquidity({ + lpSharesIn: lpShareBalance, + minOutputPerShare: 1n, + asBase, + destination: account, + }); + + // Note: we don't pass in the options here because we want the current + // prices that were used in the previewRemoveLiquidity call. + const proceedsBaseValue = asBase + ? proceeds + : await this.convertToBase({ + sharesAmount: proceeds, + }); + + // convert the withdrawal shares into base using lpSharePrice + const { lpSharePrice } = await this.getPoolInfo(); + const withdrawalSharesBaseValue = fixed(lpSharePrice, decimals).mul( + withdrawalShares, + decimals, + ).bigint; + const withdrawalSharesSharesValue = await this.convertToShares({ + baseAmount: withdrawalSharesBaseValue, + }); + + return { + lpShareBalance, + baseAmountPaid, + baseValue: proceedsBaseValue + withdrawalSharesBaseValue, + sharesValue: proceeds + withdrawalSharesSharesValue, + }; + } + + /** + * Combine the adds and removes in order of block number to get the full + * transaction history in the order the user executed them + */ + private _calcOpenLpPosition({ + addLiquidityEvents, + removeLiquidityEvents, + }: { + addLiquidityEvents: ContractEvent[]; + removeLiquidityEvents: ContractEvent< + typeof hyperdriveAbi, + "RemoveLiquidity" + >[]; + }) { + const combinedEventsInOrder = [ + ...addLiquidityEvents, + ...removeLiquidityEvents, + ].sort((a, b) => Number(a.blockNumber) - Number(b.blockNumber)); + + let baseAmountPaid = 0n; + let lpShareBalance = 0n; + combinedEventsInOrder.forEach((event) => { + const baseAmount = event.args.asBase + ? event.args.amount + : fixed(event.args.amount).mul(event.args.vaultSharePrice).bigint; + + switch (event.eventName) { + case "AddLiquidity": + lpShareBalance += event.args.lpAmount; + baseAmountPaid += baseAmount; + return; + + case "RemoveLiquidity": { + lpShareBalance -= event.args.lpAmount; + + // If a user removes all their lp shares, we should zero out + // baseAmountPaid, since it's basically starting over + if (lpShareBalance <= 0n) { + baseAmountPaid = 0n; + } else { + // Include the base value of withdrawal shares received when + // recalculating baseAmountPaid. + const withdrawalSharesBaseValue = fixed( + event.args.withdrawalShareAmount, + ).mul(event.args.lpSharePrice).bigint; + baseAmountPaid = + baseAmountPaid - baseAmount - withdrawalSharesBaseValue; + } + return; + } + + default: + assertNever(event, true); + } + }); + + return { lpShareBalance, baseAmountPaid }; + } + + /** + * Gets the amount of closed LP shares a user has. + */ + async getClosedLpShares({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const removeLiquidityEvents = await this.contract.getEvents( + "RemoveLiquidity", + { + filter: { provider: account }, + toBlock: options?.block, + }, + ); + return Promise.all( + removeLiquidityEvents.map(async ({ blockNumber, args }) => { + const { + lpAmount, + withdrawalShareAmount, + asBase, + amount, + lpSharePrice, + } = args; + + const baseAmount = asBase + ? amount + : fixed(args.amount).mul(args.vaultSharePrice).bigint; + + return { + lpAmount, + baseAmount, + withdrawalShareAmount, + lpSharePrice, + closedTimestamp: ( + await getBlockOrThrow(this.drift, { + blockNumber, + }) + ).timestamp, + }; + }), + ); + } + + /** + * Gets the amount of withdrawal shares a user has. + */ + getWithdrawalShares({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + return this.contract.read( + "balanceOf", + { tokenId: WITHDRAW_SHARES_ASSET_ID, owner: account }, + options, + ); + } + + /** + * Gets the amount of redeemed withdrawal shares a user has. + */ + async getRedeemedWithdrawalShares({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const redeemedWithdrawalShareEvents = await this.contract.getEvents( + "RedeemWithdrawalShares", + { + filter: { provider: account }, + toBlock: options?.block, + }, + ); + + return Promise.all( + redeemedWithdrawalShareEvents.map(async ({ blockNumber, args }) => { + const { withdrawalShareAmount, amount, asBase, vaultSharePrice } = args; + const baseAmount = asBase + ? args.amount + : fixed(amount).mul(vaultSharePrice).bigint; + + return { + hyperdriveAddress: this.address, + withdrawalShareAmount, + baseAmount, + redeemedTimestamp: ( + await getBlockOrThrow(this.drift, { blockNumber }) + ).timestamp, + }; + }), + ); + } + + /** + * Predicts the amount of bonds a user will receive when opening a long in + * either base or shares. The curve fee returned from this function is paid in bonds. + */ + async previewOpenLong({ + amountIn, + asBase, + options, + }: { + amountIn: bigint; + asBase: boolean; + options?: ContractReadOptions; + }): Promise<{ + maturityTime: bigint; + bondProceeds: bigint; + spotPriceAfterOpen: bigint; + spotRateAfterOpen: bigint; + curveFee: bigint; + }> { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + const checkpointTime = await this.getCheckpointTime({ options }); + + // calcOpenLong only accepts base, so if the user is depositing shares we + // need to convert that value to base before we can preview the trade for them + let depositAmountConvertedToBase = amountIn; + if (!asBase) { + depositAmountConvertedToBase = await this.convertToBase({ + sharesAmount: amountIn, + options, + }); + } + + const spotPriceAfterOpen = hyperwasm.spotPriceAfterLong({ + poolInfo, + poolConfig, + baseAmount: depositAmountConvertedToBase, + }); + + const spotRateAfterOpen = hyperwasm.calcAprGivenFixedPrice({ + price: spotPriceAfterOpen, + positionDuration: poolConfig.positionDuration, + }); + + const bondProceeds = hyperwasm.calcOpenLong({ + poolInfo, + poolConfig, + baseAmount: depositAmountConvertedToBase, + }); + + const curveFeeInBonds = hyperwasm.openLongCurveFee({ + poolInfo, + poolConfig, + baseAmount: depositAmountConvertedToBase, + }); + + return { + maturityTime: checkpointTime + poolConfig.positionDuration, + bondProceeds, + spotPriceAfterOpen, + spotRateAfterOpen, + curveFee: curveFeeInBonds, + }; + } + + /** + * Calculates the cost to open a short given the current pool state and the + * amount of bonds the user wants to short. + * @param amountOfBondsToShort The number of bonds to short + * @param asBase If true, the traderDeposit will be in base. If false, the traderDeposit will be in shares + */ + async previewOpenShort({ + amountOfBondsToShort, + asBase, + options, + }: { + amountOfBondsToShort: bigint; + asBase: boolean; + options?: ContractReadOptions; + }): Promise<{ + maturityTime: bigint; + traderDeposit: bigint; + spotPriceAfterOpen: bigint; + spotRateAfterOpen: bigint; + curveFee: bigint; + fixedRatePaid: bigint; + }> { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + const latestCheckpoint = await this.getCheckpoint({ options }); + const accruedYield = await this.getShortAccruedYield({ + checkpointTime: latestCheckpoint.checkpointTime, + bondAmount: amountOfBondsToShort, + options, + }); + + const baseDepositAmount = hyperwasm.calcOpenShort({ + poolInfo, + poolConfig, + bondAmount: amountOfBondsToShort, + openVaultSharePrice: latestCheckpoint.vaultSharePrice, + }); + + // Calculation for fixed rate paid. This is the rate the user pays upfront + // to open a short. + const fixedTimeRangeInYears = fixed(poolConfig.positionDuration).div( + SECONDS_PER_YEAR, + ); + const baseAmountMinusYield = fixed(baseDepositAmount).sub(accruedYield); + const bondsMinusBaseAmount = + fixed(amountOfBondsToShort).sub(baseAmountMinusYield); + const fixedRatePaid = baseAmountMinusYield + .div(bondsMinusBaseAmount) + .div(fixedTimeRangeInYears).bigint; + + const spotPriceAfterOpen = hyperwasm.spotPriceAfterShort({ + poolInfo, + poolConfig, + bondAmount: amountOfBondsToShort, + }); + + const spotRateAfterOpen = hyperwasm.calcAprGivenFixedPrice({ + price: spotPriceAfterOpen, + positionDuration: poolConfig.positionDuration, + }); + + const curveFeeInBase = hyperwasm.openShortCurveFee({ + poolInfo, + poolConfig, + bondAmount: amountOfBondsToShort, + }); + + if (asBase) { + return { + maturityTime: + latestCheckpoint.checkpointTime + poolConfig.positionDuration, + traderDeposit: baseDepositAmount, + spotPriceAfterOpen, + spotRateAfterOpen, + curveFee: curveFeeInBase, + fixedRatePaid, + }; + } + + return { + maturityTime: + latestCheckpoint.checkpointTime + poolConfig.positionDuration, + traderDeposit: await this.convertToShares({ + baseAmount: baseDepositAmount, + options, + }), + spotPriceAfterOpen, + spotRateAfterOpen, + curveFee: await this.convertToShares({ + baseAmount: curveFeeInBase, + options, + }), + fixedRatePaid, + }; + } + + /** + * Predicts the amount of bonds that can be shorted given a target deposit + * amount in either base or shares. + */ + async getShortBondsGivenDeposit({ + amountIn, + asBase, + tolerance, + options, + }: { + amountIn: bigint; + asBase: boolean; + /** + * The maximum difference between the target and actual base amount. + * + * @default 1e9 + */ + tolerance?: bigint; + options?: ContractReadOptions; + }): Promise { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + const latestCheckpoint = await this.getCheckpoint({ options }); + const checkpointExposure = await this.getCheckpointExposure({ options }); + + let targetBaseAmount = amountIn; + if (!asBase) { + targetBaseAmount = await this.convertToBase({ + sharesAmount: amountIn, + options, + }); + } + + const absoluteMaxBondAmount = hyperwasm.absoluteMaxShort({ + poolInfo, + poolConfig, + checkpointExposure, + }); + + return hyperwasm.shortBondsGivenDeposit({ + poolInfo, + poolConfig, + targetBaseAmount, + absoluteMaxBondAmount, + openVaultSharePrice: latestCheckpoint.vaultSharePrice, + maybeTolerance: tolerance, + }); + } + + /** + * Predicts the amount of base asset a user will receive when closing a long. + */ + async previewCloseLong({ + maturityTime, + bondAmountIn, + asBase, + options, + }: { + maturityTime: bigint; + bondAmountIn: bigint; + asBase: boolean; + options?: ContractReadOptions; + }): Promise<{ amountOut: bigint; flatPlusCurveFee: bigint }> { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + const currentTime = BigInt(Math.floor(Date.now() / 1000)); + + const flatFeeInShares = hyperwasm.closeLongFlatFee({ + poolInfo, + poolConfig, + bondAmount: bondAmountIn, + maturityTime, + currentTime, + }); + const curveFeeInShares = hyperwasm.closeLongCurveFee({ + poolInfo, + poolConfig, + bondAmount: bondAmountIn, + maturityTime, + currentTime, + }); + const flatPlusCurveFee = flatFeeInShares + curveFeeInShares; + + const amountOutInShares = hyperwasm.calcCloseLong({ + poolInfo, + poolConfig, + bondAmount: bondAmountIn, + maturityTime, + currentTime, + }); + + if (!asBase) { + return { + amountOut: amountOutInShares, + flatPlusCurveFee, + }; + } + + return { + amountOut: await this.convertToBase({ + sharesAmount: amountOutInShares, + options, + }), + flatPlusCurveFee: await this.convertToBase({ + sharesAmount: flatPlusCurveFee, + options, + }), + }; + } + /** + * Get a rough estimate of the market value of a short. This can be used to + * value a position that cannot be fully closed. + */ + async estimateShortMarketValue({ + maturityTime, + asBase, + shortAmountIn, + options, + }: { + maturityTime: bigint; + shortAmountIn: bigint; + asBase: boolean; + extraData?: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + + // The checkpoint in which this position was opened. + // This is always maturity time - position duration thanks to mint on demand + const openCheckpointTimestamp = maturityTime - poolConfig.positionDuration; + const { vaultSharePrice: openVaultSharePrice } = await this.getCheckpoint({ + timestamp: openCheckpointTimestamp, + options, + }); + + const currentTime = BigInt(Math.floor(Date.now() / 1000)); + + // If the position is mature, we use the closing vault share price otherwise + // use the current vault share price + let closeVaultSharePrice = poolInfo.vaultSharePrice; + if (maturityTime <= currentTime) { + const closingCheckpoint = await this.getCheckpoint({ + timestamp: maturityTime, + options, + }); + closeVaultSharePrice = closingCheckpoint.vaultSharePrice; + } + + const marketEstimateInShares = hyperwasm.calcShortMarketValue({ + poolInfo, + poolConfig, + bondAmount: shortAmountIn, + openVaultSharePrice, + closeVaultSharePrice, + maturityTime, + currentTime, + }); + + if (!asBase) { + return marketEstimateInShares; + } + + return this.convertToBase({ + sharesAmount: marketEstimateInShares, + options, + }); + } + + /** + * Predicts the amount of base asset a user will receive when closing a short. + * If closing the short would result in negative interest, an error will be + * thrown. + */ + async previewCloseShort({ + maturityTime, + shortAmountIn, + asBase, + options, + }: { + maturityTime: bigint; + shortAmountIn: bigint; + asBase: boolean; + extraData?: `0x${string}`; + options?: ContractReadOptions; + }): Promise<{ + amountOut: bigint; + flatPlusCurveFee: bigint; + }> { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + + // The checkpoint in which this position was opened. + // This is always maturity time - position duration thanks to mint on demand + const openCheckpointTimestamp = maturityTime - poolConfig.positionDuration; + const { vaultSharePrice: openVaultSharePrice } = await this.getCheckpoint({ + timestamp: openCheckpointTimestamp, + options, + }); + + const currentTime = BigInt(Math.floor(Date.now() / 1000)); + + // If the position is mature, we use the closing vault share price otherwise + // use the current vault share price + let closeVaultSharePrice = poolInfo.vaultSharePrice; + if (maturityTime <= currentTime) { + const closingCheckpoint = await this.getCheckpoint({ + timestamp: maturityTime, + options, + }); + closeVaultSharePrice = closingCheckpoint.vaultSharePrice; + } + + const flatFeeInShares = hyperwasm.closeShortFlatFee({ + poolInfo, + poolConfig, + bondAmount: shortAmountIn, + maturityTime, + currentTime, + }); + const curveFeeInShares = hyperwasm.closeShortCurveFee({ + poolInfo, + poolConfig, + bondAmount: shortAmountIn, + maturityTime, + currentTime, + }); + const flatPlusCurveFee = flatFeeInShares + curveFeeInShares; + + const amountOutInShares = hyperwasm.calcCloseShort({ + poolInfo, + poolConfig, + bondAmount: shortAmountIn, + openVaultSharePrice, + closeVaultSharePrice, + maturityTime, + currentTime, + }); + + if (!asBase) { + return { + amountOut: amountOutInShares, + flatPlusCurveFee, + }; + } + + return { + amountOut: await this.convertToBase({ + sharesAmount: amountOutInShares, + options, + }), + flatPlusCurveFee: await this.convertToBase({ + sharesAmount: flatPlusCurveFee, + options, + }), + }; + } + + /** + * Predicts the amount of LP shares a user will receive when adding liquidity. + */ + async previewAddLiquidity({ + contribution, + minApr, + minLpSharePrice, + maxApr, + asBase, + options, + }: { + contribution: bigint; + minApr: bigint; + minLpSharePrice: bigint; + maxApr: bigint; + destination: `0x${string}`; + asBase: boolean; + extraData?: `0x${string}`; + options?: ContractReadOptions; + }): Promise<{ lpSharesOut: bigint; slippagePaid: bigint }> { + const poolConfig = await this.getPoolConfig(options); + const poolInfo = await this.getPoolInfo(options); + const currentTime = BigInt(Math.floor(Date.now() / 1000)); + const lpSharesOut = hyperwasm.calcAddLiquidity({ + poolInfo, + poolConfig, + currentTime, + contribution, + asBase, + minLpSharePrice, + minApr: minApr, + maxApr: maxApr, + }); + const decimals = await this.getDecimals(); + + const lpSharesOutInBase = fixed(lpSharesOut, decimals).mul( + poolInfo.lpSharePrice, + decimals, + ).bigint; + const valueOfLpShares = asBase + ? lpSharesOutInBase + : await this.convertToShares({ + baseAmount: lpSharesOutInBase, + options, + }); + + return { + lpSharesOut, + slippagePaid: contribution - valueOfLpShares, + }; + } + + /** + * Predicts the amount of base asset and withdrawal shares a user will receive when removing liquidity. + */ + async previewRemoveLiquidity({ + lpSharesIn, + minOutputPerShare, + destination, + asBase, + extraData = NULL_BYTES, + options, + }: { + lpSharesIn: bigint; + minOutputPerShare: bigint; + destination: `0x${string}`; + asBase: boolean; + extraData?: `0x${string}`; + options?: ContractWriteOptions; + }): Promise<{ proceeds: bigint; withdrawalShares: bigint }> { + const { proceeds, withdrawalShares } = await this.contract.simulateWrite( + "removeLiquidity", + { + _lpShares: lpSharesIn, + _minOutputPerShare: minOutputPerShare, + _options: { destination, asBase, extraData }, + }, + { + ...options, + // since this is calling a write method in view mode, we must specify + // the `from` in order to have an account to preview with + from: destination, + }, + ); + + return { + proceeds, + withdrawalShares, + }; + } + + /** + * Predicts the amount of base asset and redeemed shares a user will receive when redeeming withdrawal shares. + */ + async previewRedeemWithdrawalShares({ + withdrawalSharesIn, + minOutputPerShare, + destination, + asBase, + extraData = NULL_BYTES, + options, + }: { + withdrawalSharesIn: bigint; + minOutputPerShare: bigint; + destination: `0x${string}`; + asBase: boolean; + extraData?: `0x${string}`; + options?: ContractWriteOptions; + }): Promise<{ + baseProceeds: bigint; + withdrawalSharesRedeemed: bigint; + asBase: boolean; + sharesProceeds: bigint; + }> { + const { proceeds, withdrawalSharesRedeemed } = + await this.contract.simulateWrite( + "redeemWithdrawalShares", + { + _withdrawalShares: withdrawalSharesIn, + _minOutputPerShare: minOutputPerShare, + _options: { destination, asBase, extraData }, + }, + options, + ); + + return { + asBase, + baseProceeds: asBase + ? proceeds + : await this.convertToBase({ sharesAmount: proceeds }), + sharesProceeds: asBase + ? await this.convertToShares({ baseAmount: proceeds }) + : proceeds, + withdrawalSharesRedeemed, + }; + } +} + +/* + * This returns the APY using the following formula for continuous compounding: + + * r = rate of return + * p_0 = start price + * p_1 = end price + * t = term length in fractions of a year + * + * r = (p_1 / p_0) ^ (1 / t) - 1 + */ +function calculateApyFromPrice({ + startPrice, + endPrice, + timeFrame, // seconds +}: { + startPrice: bigint; + endPrice: bigint; + timeFrame: bigint; +}): bigint { + const priceRatio = fixed(endPrice).div(startPrice); + const yearFraction = fixed(timeFrame).div(SECONDS_PER_YEAR); + return priceRatio.pow(fixed(1e18).div(yearFraction)).sub(1e18).bigint; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/base/ReadWriteHyperdrive.ts new file mode 100644 index 000000000..e9b3f7c34 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -0,0 +1,468 @@ +import { + ContractReadOptions, + ContractWriteOptions, + Drift, + ReadWriteAdapter, + ReadWriteContract, +} from "@delvtech/drift"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +import { HyperdriveAbi } from "src/hyperdrive/base/abi"; +import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { NULL_BYTES } from "src/hyperdrive/constants"; +import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; +import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; + +type ReadWriteParams = { + args: Args; + options?: ContractWriteOptions; +}; + +export interface ReadWriteHyperdriveOptions + extends ReadWriteContractClientOptions {} + +export class ReadWriteHyperdrive extends ReadHyperdrive { + declare drift: Drift; + declare contract: ReadWriteContract; + + constructor(options: ReadWriteHyperdriveOptions) { + super(options); + } + + async getBaseToken( + options?: ContractReadOptions, + ): Promise { + const address = await this.contract.read("baseToken", {}, options); + return address === ReadWriteEth.address + ? new ReadWriteEth({ + drift: this.drift, + }) + : new ReadWriteErc20({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + + async getSharesToken(): Promise { + const address = await this.contract.read("vaultSharesToken"); + return new ReadWriteErc20({ + address, + drift: this.drift, + cacheNamespace: this.contract.cacheNamespace, + }); + } + + /** + * Allows anyone to mint a new checkpoint. + * @param time - The time (in seconds) of the checkpoint to create. + */ + async checkpoint({ + args: { time }, + options, + }: ReadWriteParams<{ time: number }>): Promise<`0x${string}`> { + return this.contract.write( + "checkpoint", + { _checkpointTime: BigInt(time), _maxIterations: 4n }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Allows an authorized address to pause this contract + * @param paused - True to pause all deposits and false to unpause them + */ + async pause({ + args: { paused }, + options, + }: ReadWriteParams<{ + paused: boolean; + }>): Promise<`0x${string}`> { + return this.contract.write( + "pause", + { _status: paused }, + { + ...options, + onMined: (receipt) => { + this.contract.invalidateReadsMatching("getMarketState"); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Allows the first LP to initialize the market with a target APR. + * @param args.contribution - The amount of base to supply. + * @param args.apr - The target APR. + * @param args.destination - The destination of the LP shares. + * @param args.asBase - If true the user is charged in underlying if false + * the contract transfers in yield source directly. Note + * - for some paths one choice may be disabled or + * blocked. + * @returns The initial number of LP shares created. + */ + async initialize({ + args: { + contribution, + apr, + destination, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + contribution: bigint; + apr: bigint; + destination: `0x${string}`; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "initialize", + { + _apr: apr, + _contribution: contribution, + _options: { + destination: destination, + asBase: asBase, + extraData: extraData, + }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Opens a new long position. + * @param destination - The account opening the position + * @param baseAmount - The amount of base supplied to the position + * @param bondAmountOut - The amount of bonds to send to the destination + * @param asUnderlying - A flag indicating whether the sender will pay in base or using another currency. Implementations choose which currencies they accept. + * @param options - Contract Write Options + * @return bondProceeds - The amount of bonds the user received + * + */ + async openLong({ + args: { + destination, + amount, + minBondsOut, + minVaultSharePrice, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + destination: `0x${string}`; + amount: bigint; + minVaultSharePrice: bigint; + minBondsOut: bigint; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "openLong", + { + _amount: amount, + _minOutput: minBondsOut, + _minVaultSharePrice: minVaultSharePrice, + _options: { destination, asBase, extraData }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Opens a new short position. + * @param destination - The account opening the position + * @param baseAmount - The amount of base supplied to the position + * @param bondAmountOut - The amount of bonds to send to the destination + * @param asUnderlying - A flag indicating whether the sender will pay in base or using another currency. Implementations choose which currencies they accept. + * @param options - Contract Write Options + * @return maturityTime - The maturity time of the short. + * @return traderDeposit - The amount the user deposited for this trade. + */ + async openShort({ + args: { + destination, + bondAmount, + minVaultSharePrice, + maxDeposit, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + destination: `0x${string}`; + minVaultSharePrice: bigint; + bondAmount: bigint; + maxDeposit: bigint; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "openShort", + { + _bondAmount: bondAmount, + _maxDeposit: maxDeposit, + _minVaultSharePrice: minVaultSharePrice, + _options: { destination, asBase, extraData }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Closes a long position. + * @param maturityTime - The maturity time of the long + * @param bondAmountIn - The amount of of bonds to remove from the position + * @param minBaseAmountOut - The minimum amount of base to send to the destination + * @param destination - The account receiving the base + * @param asUnderlying - A flag indicating whether the sender will pay in base or using another currency. Implementations choose which currencies they accept. + * @param options - Contract Write Options + * @return The amount of underlying asset the user receives. + */ + async closeLong({ + args: { + maturityTime, + bondAmountIn, + minAmountOut, + destination, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + maturityTime: bigint; + bondAmountIn: bigint; + minAmountOut: bigint; + destination: `0x${string}`; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "closeLong", + { + _maturityTime: maturityTime, + _bondAmount: bondAmountIn, + _minOutput: minAmountOut, + _options: { destination, asBase, extraData }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Closes a short position. + * @param maturityTime - The maturity time of the short + * @param bondAmountIn - The amount of bonds to remove from the position + * @param minBaseAmountOut - The minimum amount of base to send to the destination + * @param destination - The account receiving the base + * @param asUnderlying - A flag indicating whether the sender will pay in base or using another currency. Implementations choose which currencies they accept. + * @param options - Contract Write Options + * @return The amount of base tokens produced by closing this short + */ + async closeShort({ + args: { + maturityTime, + bondAmountIn, + minAmountOut, + destination, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + maturityTime: bigint; + bondAmountIn: bigint; + minAmountOut: bigint; + destination: `0x${string}`; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "closeShort", + { + _maturityTime: maturityTime, + _bondAmount: bondAmountIn, + _minOutput: minAmountOut, + _options: { destination, asBase, extraData }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Adds liquidity to the pool. + * @param destination - The account adding liquidity + * @param contribution - The amount of base to supply + * @param minApr - The minimum APR to accept + * @param minLpSharePrice - The minimum LP share price to accept + * @param maxApr - The maximum APR to accept + * @param asUnderlying - A flag indicating whether the sender will pay in base or using another currency. Implementations choose which currencies they accept. + * @param options - Contract Write Options + * @return lpShares The number of LP tokens created + */ + async addLiquidity({ + args: { + destination, + contribution, + minApr, + minLpSharePrice, + maxApr, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + destination: `0x${string}`; + contribution: bigint; + minApr: bigint; + minLpSharePrice: bigint; + maxApr: bigint; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "addLiquidity", + { + _contribution: contribution, + _minLpSharePrice: minLpSharePrice, + _minApr: minApr, + _maxApr: maxApr, + _options: { destination, asBase, extraData }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Removes liquidity from the pool. + * @param destination - The account removing liquidity + * @param lpSharesIn - The amount of LP shares to remove + * @param minBaseAmountOut - The minimum amount of base to send to the destination + * @param asUnderlying - A flag indicating whether the sender will pay in base or using another currency. Implementations choose which currencies they accept. + * @param options - Contract Write Options + * @returns baseProceeds - The base the LP removing liquidity receives. The LP + receives a proportional amount of the pool's idle capital + * @returns withdrawShares - The base that the LP receives buys out some of their LP shares, but it may not be sufficient to fully buy the LP out. In this case, the LP receives withdrawal shares equal in value to the present value they are owed. As idle capital becomes available, the pool will buy back these shares. + */ + async removeLiquidity({ + args: { + destination, + lpSharesIn, + minOutputPerShare, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + destination: `0x${string}`; + lpSharesIn: bigint; + minOutputPerShare: bigint; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "removeLiquidity", + { + _lpShares: lpSharesIn, + _minOutputPerShare: minOutputPerShare, + _options: { destination, asBase, extraData }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } + + /** + * Redeems withdrawal shares. + * @param withdrawalSharesIn - The amount of withdrawal shares to redeem + * @param minBaseAmountOutPerShare - The minimum amount of base to send to the destination per share + * @param destination - The account receiving the base + * @param asUnderlying - A flag indicating whether the sender will pay in base or using another currency. Implementations choose which currencies they accept. + * @param options - Contract Write Options + * @return baseProceeds The amount of base the LP received. + * @return sharesRedeemed The amount of withdrawal shares that were redeemed. + */ + async redeemWithdrawalShares({ + args: { + withdrawalSharesIn, + minOutputPerShare, + destination, + asBase = true, + extraData = NULL_BYTES, + }, + options, + }: ReadWriteParams<{ + withdrawalSharesIn: bigint; + minOutputPerShare: bigint; + destination: `0x${string}`; + asBase?: boolean; + extraData?: `0x${string}`; + }>): Promise<`0x${string}`> { + return this.contract.write( + "redeemWithdrawalShares", + { + _withdrawalShares: withdrawalSharesIn, + _minOutputPerShare: minOutputPerShare, + _options: { destination, asBase, extraData }, + }, + { + ...options, + onMined: (receipt) => { + this.contract.cache.clear(); + options?.onMined?.(receipt); + }, + }, + ); + } +} diff --git a/packages/hyperdrive-js/src/hyperdrive/base/abi.ts b/packages/hyperdrive-js/src/hyperdrive/base/abi.ts new file mode 100644 index 000000000..406da38f7 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/base/abi.ts @@ -0,0 +1,4 @@ +import { IHyperdrive } from "@delvtech/hyperdrive-artifacts/IHyperdrive"; + +export const hyperdriveAbi = IHyperdrive.abi; +export type HyperdriveAbi = typeof IHyperdrive.abi; diff --git a/packages/hyperdrive-js/src/hyperdrive/base/testing/setupReadHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/base/testing/setupReadHyperdrive.ts new file mode 100644 index 000000000..8b438f490 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/base/testing/setupReadHyperdrive.ts @@ -0,0 +1,32 @@ +import { ZERO_ADDRESS } from "@delvtech/drift"; +import { MockDrift } from "@delvtech/drift/testing"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; + +// No need to explicitly set return types as they are already set in the Stubs +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +export function setupReadHyperdrive() { + const drift = new MockDrift(); + // TODO: We use the v1.0.14 version of ReadHyperdrive to avoid the need to + // stub every `convertToShares` and `convertToBase` call since drift only + // supports stubbing calls with static values. It should be refactored to + // support stubbing a call with a function to dynamically calculate the return + // value based on arguments and options. + const readHyperdrive = new ReadHyperdrive_v1_0_14({ + address: ZERO_ADDRESS, + drift, + }); + + // The ReadHyperdrive class doesn't infer that the contract is a MockContract, + // so we need to cast it to the correct type. + const contract = drift.contract({ + abi: readHyperdrive.contract.abi, + address: readHyperdrive.contract.address, + }); + + contract.onRead("decimals").resolves(18); + return { + drift, + contract, + readHyperdrive, + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..4c03e7e9c --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts @@ -0,0 +1,60 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { fixed } from "src/fixed-point"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; + +/** + * A Hyperdrive instance that is compatible with Hyperdrive <= v1.0.14. + */ +export class ReadHyperdrive_v1_0_14 extends readHyperdriveMixin_v1_0_14( + ReadHyperdrive, +) {} + +/** + * Overrides for compatibility with Hyperdrive <= v1.0.14. + */ +export function readHyperdriveMixin_v1_0_14< + T extends Constructor, +>(Base: T): T { + return class extends Base { + /** + * @hidden + */ + constructor(...[options]: any[]) { + const { debugName = "Hyperdrive v1.0.14", ...restOptions } = + options as ReadHyperdriveOptions; + super({ + debugName, + ...restOptions, + }); + } + + async convertToBase({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise { + const { vaultSharePrice } = await this.getPoolInfo(options); + const decimals = await this.getDecimals(); + return fixed(sharesAmount, decimals).mul(vaultSharePrice, decimals) + .bigint; + } + + async convertToShares({ + baseAmount, + options, + }: { + baseAmount: bigint; + options?: ContractReadOptions; + }): Promise { + const { vaultSharePrice } = await this.getPoolInfo(options); + const decimals = await this.getDecimals(); + return fixed(baseAmount, decimals).div(vaultSharePrice).bigint; + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..1df627632 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { readHyperdriveMixin_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; + +export class ReadWriteHyperdrive_v1_0_14 extends readHyperdriveMixin_v1_0_14( + ReadWriteHyperdrive, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/constants.ts b/packages/hyperdrive-js/src/hyperdrive/constants.ts new file mode 100644 index 000000000..48b50f611 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/constants.ts @@ -0,0 +1,5 @@ +// This is the null bytes, which is different than the zero address +export const NULL_BYTES = "0x"; + +// The maximum number of iterations to run the Newton's method for. Used in `readHyperdrive.getMaxShort`. +export const MAX_ITERATIONS = 14; diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts new file mode 100644 index 000000000..70d851039 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts @@ -0,0 +1,47 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; + +export class ReadErc4626Hyperdrive extends readErc4626HyperdriveMixin( + ReadHyperdrive, +) {} + +/** + * @internal + */ +export interface ReadErc4626HyperdriveMixin { + /** + * Get a client for the tokenized vault for this Hyperdrive instance. + */ + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readErc4626HyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends Base { + constructor(...[options]: any[]) { + const { debugName = "ERC-4626 Hyperdrive", ...restOptions } = + options as ReadHyperdriveOptions; + super({ debugName, ...restOptions }); + } + + async getSharesToken(options?: ContractReadOptions): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + + return new ReadErc4626({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts new file mode 100644 index 000000000..ba9c38c47 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts @@ -0,0 +1,43 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadHyperdriveOptions } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; +import { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; + +export class ReadMockErc4626Hyperdrive extends readMockErc4626HyperdriveMixin( + ReadErc4626Hyperdrive, +) {} + +/** + * @internal + */ +export interface ReadMockErc4626HyperdriveMixin { + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readMockErc4626HyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends Base { + constructor(...[options]: any[]) { + const { debugName } = options as ReadHyperdriveOptions; + super({ debugName: debugName ?? "Mock ERC-4626 Hyperdrive", ...options }); + } + + async getSharesToken( + options?: ContractReadOptions, + ): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + + return new ReadMockErc4626({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts new file mode 100644 index 000000000..0db4b1511 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts @@ -0,0 +1,39 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { + ReadErc4626HyperdriveMixin, + readErc4626HyperdriveMixin, +} from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; +import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; + +export class ReadWriteErc4626Hyperdrive extends readWriteErc4626HyperdriveMixin( + ReadWriteHyperdrive, +) {} + +export interface ReadWriteErc4626HyperdriveMixin + extends ReadErc4626HyperdriveMixin { + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readWriteErc4626HyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends readErc4626HyperdriveMixin(Base) { + async getSharesToken( + options?: ContractReadOptions, + ): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + + return new ReadWriteErc4626({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts new file mode 100644 index 000000000..1bbd691d3 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts @@ -0,0 +1,40 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; +import { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; +import { + ReadMockErc4626HyperdriveMixin, + readMockErc4626HyperdriveMixin, +} from "./ReadMockErc4626Hyperdrive"; + +export class ReadWriteMockErc4626Hyperdrive extends readWriteMockErc4626HyperdriveMixin( + ReadWriteErc4626Hyperdrive, +) {} + +export interface ReadWriteMockErc4626HyperdriveMixin + extends ReadMockErc4626HyperdriveMixin { + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readWriteMockErc4626HyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + // return class extends readErc4626HyperdriveMixin(Base) { + return class extends readMockErc4626HyperdriveMixin(Base) { + async getSharesToken( + options?: ContractReadOptions, + ): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + + return new ReadWriteMockErc4626({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts new file mode 100644 index 000000000..2decde5e7 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { readErc4626HyperdriveMixin } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; + +export class ReadErc4626Hyperdrive_v1_0_14 extends readErc4626HyperdriveMixin( + ReadHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadMockErc4626Hyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadMockErc4626Hyperdrive_v1_0_14.ts new file mode 100644 index 000000000..97ef34a21 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadMockErc4626Hyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { readMockErc4626HyperdriveMixin } from "src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive"; +import { ReadErc4626Hyperdrive_v1_0_14 } from "src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14"; + +export class ReadMockErc4626Hyperdrive_v1_0_14 extends readMockErc4626HyperdriveMixin( + ReadErc4626Hyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts new file mode 100644 index 000000000..a888094f3 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +import { readWriteErc4626HyperdriveMixin } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; + +export class ReadWriteErc4626Hyperdrive_v1_0_14 extends readWriteErc4626HyperdriveMixin( + ReadWriteHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteMockErc4626Hyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteMockErc4626Hyperdrive_v1_0_14.ts new file mode 100644 index 000000000..6dd576969 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteMockErc4626Hyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { readWriteMockErc4626HyperdriveMixin } from "src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive"; +import { ReadWriteErc4626Hyperdrive_v1_0_14 } from "src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14"; + +export class ReadWriteMockErc4626Hyperdrive_v1_0_14 extends readWriteMockErc4626HyperdriveMixin( + ReadWriteErc4626Hyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts new file mode 100644 index 000000000..05c7e2ec4 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts @@ -0,0 +1,74 @@ +import { Contract, ContractReadOptions, ReadContract } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { + EzEthHyperdriveAbi, + ezEthHyperdriveAbi, +} from "src/hyperdrive/ezeth/abi"; +import { ReadErc20 } from "src/token/erc20/ReadErc20"; +import { ReadEth } from "src/token/eth/ReadEth"; + +export class ReadEzEthHyperdrive extends readEzEthHyperdriveMixin( + ReadHyperdrive, +) {} + +/** + * @internal + */ +export interface ReadEzEthHyperdriveMixin { + ezEthHyperdriveContract: Contract; + + /** + * Get a client for ETH, the base token for this Hyperdrive instance. + */ + getBaseToken(options?: ContractReadOptions): Promise; + + /** + * Get a client for the EzETH token for this Hyperdrive instance. + */ + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readEzEthHyperdriveMixin>( + Base: T, +): Constructor & T { + return class extends Base { + ezEthHyperdriveContract: ReadContract; + + constructor(...[options]: any[]) { + const { + debugName = "EzETH Hyperdrive", + address, + cache, + cacheNamespace, + ...rest + } = options as ConstructorParameters[0]; + super({ debugName, address, cache, cacheNamespace, ...rest }); + this.ezEthHyperdriveContract = this.drift.contract({ + abi: ezEthHyperdriveAbi, + address, + cache, + cacheNamespace, + }); + } + + async getBaseToken(): Promise { + return new ReadEth({ + drift: this.drift, + }); + } + + async getSharesToken(): Promise { + const { vaultSharesToken } = await this.getPoolConfig(); + return new ReadErc20({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts new file mode 100644 index 000000000..9db9b52dc --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts @@ -0,0 +1,50 @@ +import { ContractReadOptions, ReadWriteContract } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { + ReadEzEthHyperdriveMixin, + readEzEthHyperdriveMixin, +} from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; +import { EzEthHyperdriveAbi } from "src/hyperdrive/ezeth/abi"; +import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; +import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; + +export class ReadWriteEzEthHyperdrive extends readWriteEzEthHyperdriveMixin( + ReadWriteHyperdrive, +) {} + +export interface ReadWriteEzEthHyperdriveMixin + extends ReadEzEthHyperdriveMixin { + ezEthHyperdriveContract: ReadWriteContract; + getBaseToken(options?: ContractReadOptions): Promise; + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readWriteEzEthHyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends readEzEthHyperdriveMixin(Base) { + declare ezEthHyperdriveContract: ReadWriteContract; + + async getBaseToken(): Promise { + return new ReadWriteEth({ + drift: this.drift, + }); + } + + async getSharesToken( + options?: ContractReadOptions, + ): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + return new ReadWriteErc20({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/abi.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/abi.ts new file mode 100644 index 000000000..a0ccb4885 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/abi.ts @@ -0,0 +1,4 @@ +import { IEzETHHyperdrive } from "@delvtech/hyperdrive-artifacts/IEzETHHyperdrive"; + +export const ezEthHyperdriveAbi = IEzETHHyperdrive.abi; +export type EzEthHyperdriveAbi = typeof ezEthHyperdriveAbi; diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..d1e240984 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { readEzEthHyperdriveMixin } from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; + +export class ReadEzEthHyperdrive_v1_0_14 extends readEzEthHyperdriveMixin( + ReadHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..7d8c1ddc8 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +import { readWriteEzEthHyperdriveMixin } from "src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive"; + +export class ReadWriteEzEthHyperdrive_v1_0_14 extends readWriteEzEthHyperdriveMixin( + ReadWriteHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts new file mode 100644 index 000000000..fde57e04a --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts @@ -0,0 +1,101 @@ +import { Drift, ReadWriteAdapter } from "@delvtech/drift"; +import semver from "semver"; +import { hyperdriveAbi } from "src/hyperdrive/base/abi"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +import { + ReadWriteHyperdrive, + ReadWriteHyperdriveOptions, +} from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +import { ReadStEthHyperdrive } from "src/hyperdrive/steth/ReadStEthHyperdrive"; +import { ReadWriteStEthHyperdrive } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; +import { ReadStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14"; +import { ReadWriteStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14"; + +export interface HyperdriveOptions + extends ReadHyperdriveOptions { + drift: T; +} + +export type Hyperdrive = + T extends Drift ? ReadWriteHyperdrive : ReadHyperdrive; + +export async function getHyperdrive({ + address, + drift, + cache = drift.cache, + cacheNamespace, + earliestBlock, + debugName, +}: HyperdriveOptions): Promise> { + cacheNamespace ??= await drift.getChainId(); + + const options: HyperdriveOptions = { + address, + drift, + cache, + cacheNamespace, + earliestBlock, + debugName, + }; + const isReadWrite = isReadWriteOptions(options); + + const version = await drift.read({ + abi: hyperdriveAbi, + address, + fn: "version", + cacheNamespace, + }); + const isV1_0_14 = semver.lte(version, "1.0.14"); + + const kind = isV1_0_14 + ? undefined + : await drift.read({ + abi: hyperdriveAbi, + address, + fn: "kind", + cacheNamespace, + }); + + switch (kind) { + case "StETHHyperdrive": + if (isReadWrite && isV1_0_14) { + return new ReadWriteStEthHyperdrive_v1_0_14(options); + } + + if (isReadWrite) { + return new ReadWriteStEthHyperdrive(options); + } + + if (isV1_0_14) { + return new ReadStEthHyperdrive_v1_0_14(options) as any; + } + + return new ReadStEthHyperdrive(options) as any; + + default: + if (isReadWrite && isV1_0_14) { + return new ReadWriteHyperdrive_v1_0_14(options); + } + + if (isReadWrite) { + return new ReadWriteHyperdrive(options); + } + + if (isV1_0_14) { + return new ReadHyperdrive_v1_0_14(options) as any; + } + + return new ReadHyperdrive(options) as any; + } +} + +function isReadWriteOptions( + options: HyperdriveOptions, +): options is ReadWriteHyperdriveOptions { + return typeof options.drift.write === "function"; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts new file mode 100644 index 000000000..3f90a02b4 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts @@ -0,0 +1,59 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadEth } from "src/token/eth/ReadEth"; +import { ReadLsEth } from "src/token/lseth/ReadLsEth"; + +export class ReadLsEthHyperdrive extends readLsEthHyperdriveMixin( + ReadHyperdrive, +) {} + +/** + * @internal + */ +export interface ReadLsEthHyperdriveMixin { + /** + * Get a client for ETH, the base token for this Hyperdrive instance. + */ + getBaseToken(options?: ContractReadOptions): Promise; + + /** + * Get a client for the LsETH token for this Hyperdrive instance. + */ + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readLsEthHyperdriveMixin>( + Base: T, +): Constructor & T { + return class extends Base { + constructor(...[options]: any[]) { + const { debugName = "lsETH Hyperdrive", ...restOptions } = + options as ReadHyperdriveOptions; + super({ debugName, ...restOptions }); + } + + async getBaseToken(): Promise { + return new ReadEth({ + drift: this.drift, + }); + } + + async getSharesToken(options?: ContractReadOptions): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + + return new ReadLsEth({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts new file mode 100644 index 000000000..ddca694a7 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts @@ -0,0 +1,43 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { + ReadLsEthHyperdriveMixin, + readLsEthHyperdriveMixin, +} from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; +import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; +import { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; + +export class ReadWriteLsEthHyperdrive extends readWriteLsEthHyperdriveMixin( + ReadWriteHyperdrive, +) {} + +export interface ReadWriteLsEthHyperdriveMixin + extends ReadLsEthHyperdriveMixin { + getBaseToken(options?: ContractReadOptions): Promise; + getSharesToken(options?: ContractReadOptions): Promise; +} + +export function readWriteLsEthHyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends readLsEthHyperdriveMixin(Base) { + async getSharesToken( + options?: ContractReadOptions, + ): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + return new ReadWriteLsEth({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + + async getBaseToken(): Promise { + return new ReadWriteEth({ + drift: this.drift, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..ea5012d91 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { readLsEthHyperdriveMixin } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; + +export class ReadLsEthHyperdrive_v1_0_14 extends readLsEthHyperdriveMixin( + ReadHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..6fa9d551b --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +import { readWriteLsEthHyperdriveMixin } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; + +export class ReadWriteLsEthHyperdrive_v1_0_14 extends readWriteLsEthHyperdriveMixin( + ReadWriteHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts new file mode 100644 index 000000000..708c1b57c --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts @@ -0,0 +1,97 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { fixed } from "@delvtech/fixed-point-wasm"; +import { Constructor } from "src/base/types"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadEth } from "src/token/eth/ReadEth"; +import { ReadREth } from "src/token/reth/ReadREth"; + +export class ReadREthHyperdrive extends readREthHyperdriveMixin( + ReadHyperdrive, +) {} + +/** + * @internal + */ +export interface ReadREthHyperdriveMixin { + /** + * Get a client for ETH, the base token for this Hyperdrive instance. + */ + getBaseToken(options?: ContractReadOptions): Promise; + + /** + * Get a client for the rETH token for this Hyperdrive instance. + */ + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readREthHyperdriveMixin>( + Base: T, +): Constructor & T { + return class extends Base { + constructor(...[options]: any[]) { + const { debugName = "rETH Hyperdrive", ...restOptions } = + options as ReadHyperdriveOptions; + super({ debugName, ...restOptions }); + } + + async getBaseToken(): Promise { + return new ReadEth({ + drift: this.drift, + }); + } + + async getSharesToken(options?: ContractReadOptions): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + return new ReadREth({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + + // Calculations + + async getMaxShort({ + budget, + options, + }: { + budget: bigint; + options: Parameters[0]["options"]; + }): ReturnType { + const result = await super.getMaxShort({ budget, options }); + const decimals = await this.getDecimals(); + return { + ...result, + // FIXME: MockRocketPool updates its price based on the current + // timestamp, so the accuracy of max calculations will slowly drift + // every second. This pads the max shares to avoid errors trying to open + // the max, but may not be needed for mainnet. + maxSharesIn: fixed(result.maxSharesIn, decimals).mul(1e18 - 1e12, 18) + .bigint, + }; + } + + async getMaxLong( + options?: Parameters[0], + ): ReturnType { + const result = await super.getMaxLong(options); + const decimals = await this.getDecimals(); + return { + ...result, + // FIXME: MockRocketPool updates its price based on the current + // timestamp, so the accuracy of max calculations will slowly drift + // every second. This pads the max shares to avoid errors trying to open + // the max, but may not be needed for mainnet. + maxSharesIn: fixed(result.maxSharesIn, decimals).mul(1e18 - 1e12, 18) + .bigint, + }; + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts new file mode 100644 index 000000000..0fa108bf3 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts @@ -0,0 +1,42 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { readREthHyperdriveMixin } from "src/hyperdrive/reth/ReadREthHyperdrive"; +import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; +import { ReadWriteREth } from "src/token/reth/ReadWriteREth"; + +export class ReadWriteREthHyperdrive extends readWriteREthHyperdriveMixin( + ReadWriteHyperdrive, +) {} + +export interface ReadWriteREthHyperdriveMixin { + getBaseToken(options?: ContractReadOptions): Promise; + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readWriteREthHyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends readREthHyperdriveMixin(Base) { + async getBaseToken(): Promise { + return new ReadWriteEth({ + drift: this.drift, + }); + } + + async getSharesToken( + options?: ContractReadOptions, + ): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + return new ReadWriteREth({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..07af3d1d0 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { readREthHyperdriveMixin } from "src/hyperdrive/reth/ReadREthHyperdrive"; + +export class ReadREthHyperdrive_v1_0_14 extends readREthHyperdriveMixin( + ReadHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..8f801c7e8 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +import { readWriteREthHyperdriveMixin } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; + +export class ReadWriteREthHyperdrive_v1_0_14 extends readWriteREthHyperdriveMixin( + ReadWriteHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts new file mode 100644 index 000000000..a77b69474 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts @@ -0,0 +1,103 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { fixed } from "src/fixed-point"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadEth } from "src/token/eth/ReadEth"; +import { ReadStEth } from "src/token/steth/ReadStEth"; + +export interface ReadStEthHyperdriveOptions extends ReadHyperdriveOptions {} + +export class ReadStEthHyperdrive extends readStEthHyperdriveMixin( + ReadHyperdrive, +) { + constructor(options: ReadStEthHyperdriveOptions) { + super(options); + } +} + +/** + * @internal + */ +export interface ReadStEthHyperdriveMixin { + /** + * Get a client for ETH, the base token for this Hyperdrive instance. + */ + getBaseToken(options?: ContractReadOptions): Promise; + + /** + * Get a client for the Lido stETH token for this Hyperdrive instance. + */ + getSharesToken(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readStEthHyperdriveMixin>( + Base: T, +): Constructor & T { + return class extends Base { + constructor(...[options]: any[]) { + const { debugName = "stETH Hyperdrive", ...restOptions } = + options as ReadStEthHyperdriveOptions; + super({ debugName, ...restOptions }); + } + + async getBaseToken(): Promise { + return new ReadEth({ + drift: this.drift, + }); + } + + async getSharesToken(): Promise { + const { vaultSharesToken } = await this.getPoolConfig(); + return new ReadStEth({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + + // Calculations + + async getMaxShort({ + budget, + options, + }: { + budget: bigint; + options?: Parameters[0]["options"]; + }): ReturnType { + const result = await super.getMaxShort({ budget, options }); + const decimals = await this.getDecimals(); + return { + ...result, + // FIXME: MockLido updates its price based on the current timestamp, so + // the accuracy of max calculations will slowly drift every second. + // This pads the max shares to avoid errors trying to open the max, + // but may not be needed for mainnet. + maxSharesIn: fixed(result.maxSharesIn, decimals).mul(1e18 - 1e12, 18) + .bigint, + }; + } + + async getMaxLong( + options?: Parameters[0], + ): ReturnType { + const result = await super.getMaxLong(options); + const decimals = await this.getDecimals(); + return { + ...result, + // FIXME: MockLido updates its price based on the current timestamp, so + // the accuracy of max calculations will slowly drift every second. + // This pads the max shares to avoid errors trying to open the max, + // but may not be needed for mainnet. + maxSharesIn: fixed(result.maxSharesIn, decimals).mul(1e18 - 1e12, 18) + .bigint, + }; + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts new file mode 100644 index 000000000..17a0e466d --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts @@ -0,0 +1,53 @@ +import { ContractReadOptions, ReplaceProps } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { + ReadWriteHyperdrive, + ReadWriteHyperdriveOptions, +} from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { + ReadStEthHyperdriveMixin, + readStEthHyperdriveMixin, + ReadStEthHyperdriveOptions, +} from "src/hyperdrive/steth/ReadStEthHyperdrive"; +import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; +import { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; + +export class ReadWriteStEthHyperdrive extends readWriteStEthHyperdriveMixin( + ReadWriteHyperdrive, +) {} + +export interface ReadWriteStEthHyperdriveMixin + extends ReadStEthHyperdriveMixin { + getBaseToken(options?: ContractReadOptions): Promise; + getSharesToken(options?: ContractReadOptions): Promise; +} + +export interface ReadWriteStEthHyperdriveOptions + extends ReplaceProps< + ReadWriteHyperdriveOptions, + ReadStEthHyperdriveOptions + > {} + +export function readWriteStEthHyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends readStEthHyperdriveMixin(Base) { + async getBaseToken(): Promise { + return new ReadWriteEth({ + drift: this.drift, + }); + } + + async getSharesToken( + options?: ContractReadOptions, + ): Promise { + const { vaultSharesToken } = await this.getPoolConfig(options); + return new ReadWriteStEth({ + address: vaultSharesToken, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..918a64606 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { readStEthHyperdriveMixin } from "src/hyperdrive/steth/ReadStEthHyperdrive"; + +export class ReadStEthHyperdrive_v1_0_14 extends readStEthHyperdriveMixin( + ReadHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..c09a4db22 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +import { readWriteStEthHyperdriveMixin } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; + +export class ReadWriteStEthHyperdrive_v1_0_14 extends readWriteStEthHyperdriveMixin( + ReadWriteHyperdrive_v1_0_14, +) {} diff --git a/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.test.ts b/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.test.ts new file mode 100644 index 000000000..a76928fcf --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.test.ts @@ -0,0 +1,12 @@ +import { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; +import { expect, test } from "vitest"; + +test("calculateAprFromPrice should return fixed rate an open long position is currently earning", async () => { + const rate = calculateAprFromPrice({ + positionDuration: 604800n, + baseAmount: 100000000000000000000n, + bondAmount: 100086217686058270990n, + }); + + expect(rate).toEqual(44956364873241333n); +}); diff --git a/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.ts b/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.ts new file mode 100644 index 000000000..698dc3450 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.ts @@ -0,0 +1,30 @@ +import { fixed } from "src/fixed-point"; +import { hyperwasm } from "src/hyperwasm"; + +/** + * Calculate the APR of a position given the position duration, the amount paid + * in base, and the amount of bonds received. + */ +export function calculateAprFromPrice({ + positionDuration, + baseAmount, + bondAmount, +}: { + /** + * The position duration in seconds. + */ + positionDuration: bigint; + /** + * The amount paid in base. + */ + baseAmount: bigint; + /** + * The amount of bonds received. + */ + bondAmount: bigint; +}): bigint { + return hyperwasm.calcAprGivenFixedPrice({ + positionDuration, + price: fixed(baseAmount).div(bondAmount).bigint, + }); +} diff --git a/packages/hyperdrive-js/src/hyperwasm.ts b/packages/hyperdrive-js/src/hyperwasm.ts new file mode 100644 index 000000000..b36e39c74 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperwasm.ts @@ -0,0 +1,5 @@ +import * as hyperwasm from "@delvtech/hyperdrive-wasm"; + +hyperwasm.initSync(hyperwasm.wasmBuffer); + +export { hyperwasm }; diff --git a/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.test.ts b/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.test.ts new file mode 100644 index 000000000..7ad8e9be7 --- /dev/null +++ b/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.test.ts @@ -0,0 +1,25 @@ +import { expect, test } from "vitest"; + +import { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; + +test("calculateMatureLongYieldAfterFees should return the yield a mature long has earned after fees", async () => { + const value = calculateMatureLongYieldAfterFees({ + flatFee: 500000000000000n, + bondAmount: 1000862573239041776123n, + baseAmountPaid: 1000000000000000000000n, + decimals: 18, + }); + + expect(value).toEqual(362141952422255235n); +}); + +test("calculateMatureLongYieldAfterFees should work with mixed decimals", async () => { + const value = calculateMatureLongYieldAfterFees({ + flatFee: 500000000000000n, + bondAmount: 5000862n, + baseAmountPaid: 4000000n, + decimals: 6, + }); + + expect(value).toEqual(998362n); +}); diff --git a/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.ts b/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.ts new file mode 100644 index 000000000..cd44194ba --- /dev/null +++ b/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.ts @@ -0,0 +1,16 @@ +import { fixed } from "src/fixed-point"; +export function calculateMatureLongYieldAfterFees({ + flatFee, + bondAmount, + baseAmountPaid, + decimals, +}: { + flatFee: bigint; + bondAmount: bigint; + baseAmountPaid: bigint; + decimals: number; +}): bigint { + // Flat fee is always 18 decimals + const poolFee = fixed(bondAmount, decimals).mul(flatFee).bigint; + return bondAmount - baseAmountPaid - poolFee; +} diff --git a/packages/hyperdrive-js/src/longs/types.ts b/packages/hyperdrive-js/src/longs/types.ts new file mode 100644 index 000000000..242ba269b --- /dev/null +++ b/packages/hyperdrive-js/src/longs/types.ts @@ -0,0 +1,29 @@ +export interface Long { + assetId: bigint; + bondAmount: bigint; + /** + * Time in seconds when this long will mature + */ + maturity: bigint; + + baseAmountPaid: bigint; +} + +export interface ClosedLong extends Long { + // A closed long will include the baseAmount that was redeemed + baseAmount: bigint; + closedTimestamp: bigint; +} + +// TODO: This is a temporary type until all the long positions are migrated to the new format with details used for the long which includes all bond details if those are able to be calculated. +export interface OpenLongPositionReceived { + assetId: bigint; + value: bigint; + maturity: bigint; + details: Long | undefined; +} +// TODO: This is a temporary type for describing the OpenLongPositionReceived without the details field. This will be a position a user has received from another account and we will not be able to calculate the bond details for it. +export type OpenLongPositionReceivedWithoutDetails = Omit< + OpenLongPositionReceived, + "details" +>; diff --git a/packages/hyperdrive-js/src/lp/ClosedLpShares.ts b/packages/hyperdrive-js/src/lp/ClosedLpShares.ts new file mode 100644 index 000000000..44ce183dd --- /dev/null +++ b/packages/hyperdrive-js/src/lp/ClosedLpShares.ts @@ -0,0 +1,7 @@ +export interface ClosedLpShares { + lpAmount: bigint; + baseAmount: bigint; + withdrawalShareAmount: bigint; + lpSharePrice: bigint; + closedTimestamp: bigint; +} diff --git a/packages/hyperdrive-js/src/lp/assetId.ts b/packages/hyperdrive-js/src/lp/assetId.ts new file mode 100644 index 000000000..ca10f51c6 --- /dev/null +++ b/packages/hyperdrive-js/src/lp/assetId.ts @@ -0,0 +1 @@ +export const LP_ASSET_ID = 0n; diff --git a/packages/hyperdrive-js/src/pool/decodeAssetFromTransferSingleEventData.ts b/packages/hyperdrive-js/src/pool/decodeAssetFromTransferSingleEventData.ts new file mode 100644 index 000000000..2e5d3695b --- /dev/null +++ b/packages/hyperdrive-js/src/pool/decodeAssetFromTransferSingleEventData.ts @@ -0,0 +1,23 @@ +import { AssetType, parseAssetType } from "src/pool/parseAssetType"; + +export function decodeAssetFromTransferSingleEventData( + eventData: `0x${string}`, +): { + assetType: AssetType; + /** + * in seconds + */ + timestamp: bigint; +} { + const cleanEventData = eventData.slice(2); + + const identifier = Number(cleanEventData.slice(0, 2)); + const assetType = parseAssetType(identifier); + // 62 hexadecimal digits (248 bits) = timestamp (in seconds) + const timestampPart = cleanEventData.slice(2, 64); + const timestamp = BigInt(parseInt(timestampPart, 16)); + return { + assetType, + timestamp, + }; +} diff --git a/packages/hyperdrive-js/src/pool/parseAssetType.ts b/packages/hyperdrive-js/src/pool/parseAssetType.ts new file mode 100644 index 000000000..73c8e6dae --- /dev/null +++ b/packages/hyperdrive-js/src/pool/parseAssetType.ts @@ -0,0 +1,21 @@ +import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; + +export type AssetType = "LP" | "LONG" | "SHORT" | "WITHDRAWAL_SHARE"; +export function parseAssetType(identifier: number): AssetType { + if (identifier === 0) { + return "LP"; + } + if (identifier === 1) { + return "LONG"; + } + if (identifier === 2) { + return "SHORT"; + } + if (identifier === 3) { + return "WITHDRAWAL_SHARE"; + } + + throw new HyperdriveSdkError( + `parseAssetType(${identifier}) did not match a valid asset type.`, + ); +} diff --git a/packages/hyperdrive-js/src/pool/testing/PoolConfig.ts b/packages/hyperdrive-js/src/pool/testing/PoolConfig.ts new file mode 100644 index 000000000..e33846877 --- /dev/null +++ b/packages/hyperdrive-js/src/pool/testing/PoolConfig.ts @@ -0,0 +1,33 @@ +import { ZERO_ADDRESS } from "src/base/constants"; +import { PoolConfig } from "src/pool/types"; + +const SEVEN_DAYS = 604_800n; +export const simplePoolConfig7Days: PoolConfig = { + baseToken: ZERO_ADDRESS, + vaultSharesToken: ZERO_ADDRESS, + governance: ZERO_ADDRESS, + feeCollector: ZERO_ADDRESS, + sweepCollector: ZERO_ADDRESS, + fees: { + curve: 100000000000000000n, + flat: 500000000000000n, + governanceLP: 10000000000000000n, + governanceZombie: 100000000000000000n, + }, + initialVaultSharePrice: 1000000000000000000n, + minimumShareReserves: 10000000000000000000n, + minimumTransactionAmount: 1000000000000000n, + timeStretch: 44463125629060298n, + positionDuration: SEVEN_DAYS, + checkpointDuration: 3600n, + linkerCodeHash: "0x".padEnd(66, "0") as `0x${string}`, + linkerFactory: ZERO_ADDRESS, + circuitBreakerDelta: 0n, + checkpointRewarder: ZERO_ADDRESS, +}; + +const THIRTY_DAYS = 2_592_000n; +export const simplePoolConfig30Days: PoolConfig = { + ...simplePoolConfig7Days, + positionDuration: THIRTY_DAYS, +}; diff --git a/packages/hyperdrive-js/src/pool/testing/PoolInfo.ts b/packages/hyperdrive-js/src/pool/testing/PoolInfo.ts new file mode 100644 index 000000000..eab8000b6 --- /dev/null +++ b/packages/hyperdrive-js/src/pool/testing/PoolInfo.ts @@ -0,0 +1,19 @@ +import { PoolInfo } from "src/pool/types"; + +export const simplePoolInfo: PoolInfo = { + shareReserves: 10000000000000000000000000n, + bondReserves: 10217899519533796120000000n, + vaultSharePrice: 1000000000000000000n, + longsOutstanding: 0n, + shortsOutstanding: 0n, + longExposure: 0n, + shareAdjustment: 0n, + longAverageMaturityTime: 0n, + shortAverageMaturityTime: 0n, + lpTotalSupply: 9999990000000000000000000n, + lpSharePrice: 1000000000000000000n, + withdrawalSharesProceeds: 0n, + withdrawalSharesReadyToWithdraw: 0n, + zombieBaseProceeds: 0n, + zombieShareReserves: 0n, +}; diff --git a/packages/hyperdrive-js/src/pool/types.ts b/packages/hyperdrive-js/src/pool/types.ts new file mode 100644 index 000000000..36c6d73f1 --- /dev/null +++ b/packages/hyperdrive-js/src/pool/types.ts @@ -0,0 +1,6 @@ +import { FunctionReturn } from "@delvtech/drift"; +import { HyperdriveAbi } from "src/hyperdrive/base/abi"; + +export type PoolConfig = FunctionReturn; +export type PoolInfo = FunctionReturn; +export type MarketState = FunctionReturn; diff --git a/packages/hyperdrive-js/src/registry/ReadRegistry.ts b/packages/hyperdrive-js/src/registry/ReadRegistry.ts new file mode 100644 index 000000000..4bfe1514f --- /dev/null +++ b/packages/hyperdrive-js/src/registry/ReadRegistry.ts @@ -0,0 +1,205 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Address } from "abitype"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; +import { ReadFactory } from "src/factory/ReadFactory"; +import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { RegistryAbi, registryAbi } from "src/registry/abi"; +import { + FactoryInfoWithMetadata, + ReadInstanceInfoWithMetadata, +} from "src/registry/types"; + +export interface ReadRegistryOptions extends ReadContractClientOptions {} + +export class ReadRegistry extends ReadClient { + address: Address; + contract: Contract; + + constructor({ + debugName = "Hyperdrive Registry", + address, + cache, + cacheNamespace, + ...rest + }: ReadRegistryOptions) { + super({ debugName, ...rest }); + this.address = address; + this.contract = this.drift.contract({ + abi: registryAbi, + address, + cache, + cacheNamespace, + }); + } + + /** + * Get a {@linkcode ReadFactory} instance for each registered factory. + */ + async getFactories(options?: ContractReadOptions): Promise { + const factoryAddresses = await this.getFactoryAddresses(options); + return factoryAddresses.map( + (address) => + new ReadFactory({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + ); + } + + /** + * Get the address of all registered factories. + */ + async getFactoryAddresses(options?: ContractReadOptions): Promise { + const count = await this.contract.read("getNumberOfFactories", {}, options); + + if (count === 0n) { + return []; + } + + const readOnlyAddresses = await this.contract.read( + "getFactoriesInRange", + { + _startIndex: 0n, + _endIndex: count, + }, + options, + ); + return readOnlyAddresses.slice(); + } + + /** + * Gets the Hyperdrive factory info with associated metadata for a factory. + */ + async getFactoryInfo( + factoryAddress: Address, + options?: ContractReadOptions, + ): Promise { + const { kind, name, version, data } = await this.contract.read( + "getFactoryInfoWithMetadata", + { _factory: factoryAddress }, + options, + ); + return { + kind, + name, + version, + data: `0x${data.toString(16)}`, + }; + } + + /** + * Gets the Hyperdrive factory info with associated metadata for a list of + * factories + */ + async getFactoryInfos( + factoryAddresses: Address[], + options?: ContractReadOptions, + ): Promise { + const infos = await this.contract.read( + "getFactoryInfosWithMetadata", + { __factories: factoryAddresses }, + options, + ); + return infos.map(({ kind, name, version, data }) => ({ + kind, + name, + version, + data: `0x${data.toString(16)}`, + })); + } + + /** + * Get a {@linkcode ReadHyperdrive} instance for each Hyperdrive instance + * registered in the registry. + */ + async getInstances(options?: ContractReadOptions): Promise { + const hyperdriveAddresses = await this.getInstanceAddresses(options); + return hyperdriveAddresses.map( + (address) => + new ReadHyperdrive({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + ); + } + + /** + * Get the address of all Hyperdrive instances registered in the registry. + */ + async getInstanceAddresses( + options?: ContractReadOptions, + ): Promise { + const count = await this.contract.read("getNumberOfInstances", {}, options); + + if (count === 0n) { + return []; + } + + const readOnlyAddresses = await this.contract.read( + "getInstancesInRange", + { + _startIndex: 0n, + _endIndex: count, + }, + options, + ); + return readOnlyAddresses.slice(); + } + + /** + * Gets the instance info with associated metadata for an instance. + */ + async getInstanceInfo( + instanceAddress: Address, + options?: ContractReadOptions, + ): Promise { + const { kind, name, version, data, factory } = await this.contract.read( + "getInstanceInfoWithMetadata", + { _instance: instanceAddress }, + options, + ); + return { + kind, + name, + version, + data: `0x${data.toString(16)}`, + factory: new ReadFactory({ + address: factory, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + }; + } + + /** + * Gets the instance info with associated metadata for a list of instances. + */ + async getInstanceInfos( + instanceAddresses: Address[], + options?: ContractReadOptions, + ): Promise { + const infos = await this.contract.read( + "getInstanceInfosWithMetadata", + { __instances: instanceAddresses }, + options, + ); + return infos.map(({ kind, name, version, data, factory }) => ({ + kind, + name, + version, + data: `0x${data.toString(16)}`, + factory: new ReadFactory({ + address: factory, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + })); + } +} diff --git a/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts b/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts new file mode 100644 index 000000000..dc67671cf --- /dev/null +++ b/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts @@ -0,0 +1,125 @@ +import { + ContractReadOptions, + Drift, + ReadWriteAdapter, + ReadWriteContract, + ReplaceProps, +} from "@delvtech/drift"; +import { Address } from "abitype"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadRegistry, ReadRegistryOptions } from "src/registry/ReadRegistry"; +import { RegistryAbi } from "src/registry/abi"; +import { ReadWriteInstanceInfoWithMetadata } from "src/registry/types"; + +export interface ReadWriteRegistryOptions + extends ReplaceProps {} + +export class ReadWriteRegistry extends ReadRegistry { + declare drift: Drift; + declare contract: ReadWriteContract; + + constructor(options: ReadWriteRegistryOptions) { + super(options); + } + + /** + * Get a {@linkcode ReadWriteFactory} instance for each registered factory. + */ + async getFactories( + options?: ContractReadOptions, + ): Promise { + const factoryAddresses = await this.getFactoryAddresses(options); + return factoryAddresses.map( + (address) => + new ReadWriteFactory({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + ); + } + + /** + * Get a {@linkcode ReadWriteHyperdrive} instance for each Hyperdrive instance + * registered in the registry. + */ + async getInstances( + options?: ContractReadOptions, + ): Promise { + const count = await this.contract.read("getNumberOfInstances", {}, options); + + if (count === 0n) { + return []; + } + + const hyperdriveAddresses = await this.contract.read( + "getInstancesInRange", + { + _startIndex: 0n, + _endIndex: count, + }, + options, + ); + return hyperdriveAddresses.map( + (address) => + new ReadWriteHyperdrive({ + address, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + ); + } + + async getInstanceInfo( + instanceAddress: Address, + options?: ContractReadOptions, + ): Promise { + const { kind, name, version, data, factory } = await this.contract.read( + "getInstanceInfoWithMetadata", + { _instance: instanceAddress }, + options, + ); + return { + kind, + name, + version, + data: `0x${data.toString(16)}`, + factory: new ReadWriteFactory({ + address: factory, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + }; + } + + /** + * Gets the instance info with associated metadata for a list of instances. + */ + async getInstanceInfos( + instanceAddresses: Address[], + options?: ContractReadOptions, + ): Promise { + const infos = await this.contract.read( + "getInstanceInfosWithMetadata", + { __instances: instanceAddresses }, + options, + ); + return infos.map(({ kind, name, version, data, factory }) => ({ + kind, + name, + version, + data: `0x${data.toString(16)}`, + factory: new ReadWriteFactory({ + address: factory, + drift: this.drift, + cache: this.contract.cache, + cacheNamespace: this.contract.cacheNamespace, + }), + })); + } +} diff --git a/packages/hyperdrive-js/src/registry/abi.ts b/packages/hyperdrive-js/src/registry/abi.ts new file mode 100644 index 000000000..00aada691 --- /dev/null +++ b/packages/hyperdrive-js/src/registry/abi.ts @@ -0,0 +1,4 @@ +import { IHyperdriveRegistry } from "@delvtech/hyperdrive-artifacts/IHyperdriveRegistry"; + +export const registryAbi = IHyperdriveRegistry.abi; +export type RegistryAbi = typeof registryAbi; diff --git a/packages/hyperdrive-js/src/registry/types.ts b/packages/hyperdrive-js/src/registry/types.ts new file mode 100644 index 000000000..987bab0c9 --- /dev/null +++ b/packages/hyperdrive-js/src/registry/types.ts @@ -0,0 +1,47 @@ +import { FunctionReturn, ReplaceProps } from "@delvtech/drift"; +import { ReadFactory } from "src/factory/ReadFactory"; +import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; +import { RegistryAbi } from "src/registry/abi"; + +/** + * The info collected for each Hyperdrive factory along with the metadata + * associated with each instance. + */ +export type FactoryInfoWithMetadata = ReplaceProps< + FunctionReturn, + { + /** + * Data about the factory. Different registries can utilize different + * schemas for these values. + */ + data: `0x${string}`; + } +>; + +/** + * The info related to each Hyperdrive instance along with the metadata + * associated with each instance. + */ +export type ReadInstanceInfoWithMetadata = ReplaceProps< + FunctionReturn, + { + /** + * Data about the instance. Different registries can utilize different + * schemas for these values. + */ + data: `0x${string}`; + /** + * The factory that deployed this instance. + */ + factory: ReadFactory; + } +>; + +/** {@inheritDoc ReadInstanceInfoWithMetadata} */ +export type ReadWriteInstanceInfoWithMetadata = ReplaceProps< + ReadInstanceInfoWithMetadata, + { + /** {@inheritDoc ReadInstanceInfoWithMetadata.factory} */ + factory: ReadWriteFactory; + } +>; diff --git a/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.test.ts b/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.test.ts new file mode 100644 index 000000000..52bc43e9d --- /dev/null +++ b/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.test.ts @@ -0,0 +1,15 @@ +import { calculateShortAccruedYield } from "src/shorts/calculateShortAccruedYield"; +import { expect, test } from "vitest"; + +test("calculateShortAccruedYield should return the yield a short has accrued since it was opened", async () => { + const value = calculateShortAccruedYield({ + bondAmount: 100_000n, + openVaultSharePrice: 1_008n, + endingVaultSharePrice: 1_010n, + decimals: 3, + }); + // If you opened a short position on 100 bonds at a previous checkpoint price + // of 1.008 and the current checkpoint price is 1.01, your accrued profit would + // be 0.20. + expect(value).toEqual(200n); +}); diff --git a/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.ts b/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.ts new file mode 100644 index 000000000..ebb3d5d3f --- /dev/null +++ b/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.ts @@ -0,0 +1,23 @@ +import { fixed } from "src/fixed-point"; + +export function calculateShortAccruedYield({ + openVaultSharePrice, + endingVaultSharePrice, + bondAmount, + decimals, +}: { + openVaultSharePrice: bigint; + endingVaultSharePrice: bigint; + bondAmount: bigint; + decimals: number; +}): bigint { + // Current Accrued yield = (current share price - checkpoint share price) x + // number of bonds + const result = + // vaultSharePrice is always 18 decimals + fixed(endingVaultSharePrice - openVaultSharePrice).mul( + bondAmount, + decimals, + ).bigint; + return result; +} diff --git a/packages/hyperdrive-js/src/shorts/types.ts b/packages/hyperdrive-js/src/shorts/types.ts new file mode 100644 index 000000000..2e13f8a5b --- /dev/null +++ b/packages/hyperdrive-js/src/shorts/types.ts @@ -0,0 +1,23 @@ +export interface Short { + hyperdriveAddress: `0x${string}`; + assetId: bigint; + bondAmount: bigint; + checkpointTime: bigint; + /** + * Time in seconds when this short will mature + */ + maturity: bigint; +} + +export interface ClosedShort extends Short { + baseAmountReceived: bigint; + closedTimestamp: bigint; +} + +export interface OpenShort extends Short { + baseAmountPaid: bigint; + baseProceeds: bigint; + fixedRatePaid: bigint; + + openedTimestamp: bigint; +} diff --git a/packages/hyperdrive-js/src/token/ReadToken.ts b/packages/hyperdrive-js/src/token/ReadToken.ts new file mode 100644 index 000000000..a582e2f25 --- /dev/null +++ b/packages/hyperdrive-js/src/token/ReadToken.ts @@ -0,0 +1,46 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { ReadClient } from "src/drift/ReadClient"; + +export interface ReadToken extends ReadClient { + address: `0x${string}`; + + /** + * Get the name of this token + */ + getName(): Promise; + + /** + * Get the symbol for this token. + */ + getSymbol(): Promise; + + /** + * Get the number of decimal places this token uses. + */ + getDecimals(): Promise; + + /** + * Get the spending allowance of a given spender for a given owner of this + * token. + */ + getAllowance({ + owner, + spender, + options, + }: { + owner: `0x${string}`; + spender: `0x${string}`; + options?: ContractReadOptions; + }): Promise; + + /** + * Get the token balance of a given address + */ + getBalanceOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise; +} diff --git a/packages/hyperdrive-js/src/token/ReadWriteToken.ts b/packages/hyperdrive-js/src/token/ReadWriteToken.ts new file mode 100644 index 000000000..8515c6bbd --- /dev/null +++ b/packages/hyperdrive-js/src/token/ReadWriteToken.ts @@ -0,0 +1,23 @@ +import { ContractWriteOptions, ReplaceProps } from "@delvtech/drift"; +import { ReadWriteClient } from "src/drift/ReadWriteClient"; +import { ReadToken } from "src/token/ReadToken"; + +export interface ReadWriteToken + extends ReplaceProps { + /** + * Give a spending allowance to a given spender. + * @param spender - The address of the spender. + * @param amount - The amount of tokens the spender can spend. + * @returns The transaction hash. + */ + approve({ + spender, + amount, + options, + }: { + owner?: `0x${string}`; + spender: `0x${string}`; + amount: bigint; + options?: ContractWriteOptions; + }): Promise<`0x${string}`>; +} diff --git a/packages/hyperdrive-js/src/token/erc20/ReadErc20.ts b/packages/hyperdrive-js/src/token/erc20/ReadErc20.ts new file mode 100644 index 000000000..9fac7e2b0 --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc20/ReadErc20.ts @@ -0,0 +1,76 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Address } from "abitype"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; +import { erc20Abi, Erc20Abi } from "src/token/erc20/abi"; +import { ReadToken } from "src/token/ReadToken"; + +export interface ReadErc20Options extends ReadContractClientOptions {} + +export class ReadErc20 extends ReadClient implements ReadToken { + contract: Contract; + + constructor({ + debugName = "ERC-20 Token", + address, + cache, + cacheNamespace, + ...rest + }: ReadErc20Options) { + super({ debugName, ...rest }); + this.contract = this.drift.contract({ + abi: erc20Abi, + address, + cache, + cacheNamespace, + }); + } + + get address(): Address { + return this.contract.address; + } + get namespace(): PropertyKey | undefined { + return this.contract.cacheNamespace; + } + + getName(): Promise { + return this.contract.read("name"); + } + + getSymbol(): Promise { + return this.contract.read("symbol"); + } + + getDecimals(): Promise { + return this.contract.read("decimals"); + } + + getAllowance({ + owner, + spender, + options, + }: { + owner: `0x${string}`; + spender: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + return this.contract.read("allowance", { owner, spender }, options); + } + + getBalanceOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + return this.contract.read("balanceOf", { account }, options); + } + + /** + * Get the total supply of the token. + */ + getTotalSupply(options?: ContractReadOptions): Promise { + return this.contract.read("totalSupply", {}, options); + } +} diff --git a/packages/hyperdrive-js/src/token/erc20/ReadWriteErc20.ts b/packages/hyperdrive-js/src/token/erc20/ReadWriteErc20.ts new file mode 100644 index 000000000..f1075bd3d --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc20/ReadWriteErc20.ts @@ -0,0 +1,45 @@ +import { + ContractWriteOptions, + Drift, + ReadWriteAdapter, + ReadWriteContract, +} from "@delvtech/drift"; +import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +import { ReadWriteToken } from "src/token/ReadWriteToken"; +import { ReadErc20 } from "src/token/erc20/ReadErc20"; +import { Erc20Abi } from "src/token/erc20/abi"; + +export interface ReadWriteErc20Options extends ReadWriteContractClientOptions {} + +export class ReadWriteErc20 extends ReadErc20 implements ReadWriteToken { + declare drift: Drift; + declare contract: ReadWriteContract; + + constructor(options: ReadWriteErc20Options) { + super(options); + } + + async approve({ + spender, + amount, + options, + }: { + owner?: `0x${string}`; + spender: `0x${string}`; + amount: bigint; + options?: ContractWriteOptions; + }): Promise<`0x${string}`> { + const hash = await this.contract.write( + "approve", + { spender, amount }, + { + ...options, + onMined: (receipt) => { + this.contract.invalidateReadsMatching("allowance"); + options?.onMined?.(receipt); + }, + }, + ); + return hash; + } +} diff --git a/packages/hyperdrive-js/src/token/erc20/abi.ts b/packages/hyperdrive-js/src/token/erc20/abi.ts new file mode 100644 index 000000000..1d5e35c1c --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc20/abi.ts @@ -0,0 +1,4 @@ +import { IERC20 } from "@delvtech/hyperdrive-artifacts/IERC20"; + +export const erc20Abi = IERC20.abi; +export type Erc20Abi = typeof erc20Abi; diff --git a/packages/hyperdrive-js/src/token/erc4626/ReadErc4626.ts b/packages/hyperdrive-js/src/token/erc4626/ReadErc4626.ts new file mode 100644 index 000000000..d263fe299 --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc4626/ReadErc4626.ts @@ -0,0 +1,100 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; +import { Erc4626Abi, erc4626Abi } from "src/token/erc4626/abi"; + +export class ReadErc4626 extends readErc4626Mixin(ReadErc20) {} + +/** + * @internal + */ +export interface ReadErc4626Mixin { + erc4626Contract: Contract; + + /** + * Get the total supply of assets in the vault. + */ + getTotalAssets(options?: ContractReadOptions): Promise; + + /** + * Convert a shares amount to an assets amount. + */ + convertToAssets({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise; + + /** + * Convert an assets amount to a shares amount. + */ + convertToShares({ + assetsAmount, + options, + }: { + assetsAmount: bigint; + options?: ContractReadOptions; + }): Promise; +} + +/** + * @internal + */ +export function readErc4626Mixin>( + Base: T, +): Constructor & T { + return class extends Base implements ReadErc4626Mixin { + erc4626Contract: Contract; + + constructor(...[options]: any[]) { + const { + debugName = "ERC-4626 Tokenized Vault", + address, + cache, + cacheNamespace, + ...rest + } = options as ReadErc20Options; + super({ debugName, address, cache, cacheNamespace, ...rest }); + this.erc4626Contract = this.drift.contract({ + abi: erc4626Abi, + address, + cache, + cacheNamespace, + }); + } + + getTotalAssets(options?: ContractReadOptions): Promise { + return this.erc4626Contract.read("totalAssets", {}, options); + } + + convertToAssets({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.erc4626Contract.read( + "convertToAssets", + { shares: sharesAmount }, + options, + ); + } + + convertToShares({ + assetsAmount, + options, + }: { + assetsAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.erc4626Contract.read( + "convertToShares", + { assets: assetsAmount }, + options, + ); + } + }; +} diff --git a/packages/hyperdrive-js/src/token/erc4626/ReadMockErc4626.ts b/packages/hyperdrive-js/src/token/erc4626/ReadMockErc4626.ts new file mode 100644 index 000000000..657c2b13a --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc4626/ReadMockErc4626.ts @@ -0,0 +1,53 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { mockErc4626Abi, MockErc4626Abi } from "src/token/erc4626/abi"; +import { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; + +export class ReadMockErc4626 extends readMockErc4626Mixin(ReadErc4626) {} + +/** + * @internal + */ +export interface ReadMockErc4626Mixin { + mockErc4626Contract: Contract; + + /** + * Get the rate of the vault. + */ + getRate(options?: ContractReadOptions): Promise; +} + +/** + * @internal + */ +export function readMockErc4626Mixin>( + BaseReadErc4626: T, +): Constructor & T { + return class extends BaseReadErc4626 implements ReadMockErc4626Mixin { + mockErc4626Contract: Contract; + + constructor(...[options]: any[]) { + const { + debugName = "Mock ERC-4626 Tokenized Vault", + address, + cache, + cacheNamespace, + ...rest + } = options as ConstructorParameters[0]; + super({ debugName, address, cache, cacheNamespace, ...rest }); + this.mockErc4626Contract = this.drift.contract({ + abi: mockErc4626Abi, + address, + cache, + cacheNamespace, + }); + } + + /** + * Get the rate of the vault. + */ + getRate(options?: ContractReadOptions): Promise { + return this.mockErc4626Contract.read("getRate", {}, options); + } + }; +} diff --git a/packages/hyperdrive-js/src/token/erc4626/ReadWriteErc4626.ts b/packages/hyperdrive-js/src/token/erc4626/ReadWriteErc4626.ts new file mode 100644 index 000000000..8521db317 --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc4626/ReadWriteErc4626.ts @@ -0,0 +1,8 @@ +import { ReadWriteContract } from "@delvtech/drift"; +import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; +import { readErc4626Mixin } from "src/token/erc4626/ReadErc4626"; +import { Erc4626Abi } from "src/token/erc4626/abi"; + +export class ReadWriteErc4626 extends readErc4626Mixin(ReadWriteErc20) { + declare erc4626Contract: ReadWriteContract; +} diff --git a/packages/hyperdrive-js/src/token/erc4626/ReadWriteMockErc4626.ts b/packages/hyperdrive-js/src/token/erc4626/ReadWriteMockErc4626.ts new file mode 100644 index 000000000..4c04a4ae0 --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc4626/ReadWriteMockErc4626.ts @@ -0,0 +1,45 @@ +import { ContractWriteOptions, ReadWriteContract } from "@delvtech/drift"; +import { MockErc4626Abi } from "src/token/erc4626/abi"; +import { readMockErc4626Mixin } from "src/token/erc4626/ReadMockErc4626"; +import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; + +export class ReadWriteMockErc4626 extends readMockErc4626Mixin( + ReadWriteErc4626, +) { + declare mockErc4626Contract: ReadWriteContract; + + /** + * Mint shares. + */ + mint({ + receiver, + sharesAmount, + options, + }: { + receiver: `0x${string}`; + sharesAmount: bigint; + options?: ContractWriteOptions; + }): Promise<`0x${string}`> { + return this.mockErc4626Contract.write( + "mint", + { + _receiver: receiver, + _shares: sharesAmount, + }, + options, + ); + } + + /** + * Set the vault's rate. + */ + setRate({ + rate, + options, + }: { + rate: bigint; + options?: ContractWriteOptions; + }): Promise<`0x${string}`> { + return this.mockErc4626Contract.write("setRate", { _rate_: rate }, options); + } +} diff --git a/packages/hyperdrive-js/src/token/erc4626/abi.ts b/packages/hyperdrive-js/src/token/erc4626/abi.ts new file mode 100644 index 000000000..374dfc855 --- /dev/null +++ b/packages/hyperdrive-js/src/token/erc4626/abi.ts @@ -0,0 +1,8 @@ +import { IERC4626 } from "@delvtech/hyperdrive-artifacts/IERC4626"; +import { MockERC4626 } from "@delvtech/hyperdrive-artifacts/MockERC4626"; + +export const erc4626Abi = IERC4626.abi; +export type Erc4626Abi = typeof erc4626Abi; + +export const mockErc4626Abi = MockERC4626.abi; +export type MockErc4626Abi = typeof mockErc4626Abi; diff --git a/packages/hyperdrive-js/src/token/eth/ReadEth.ts b/packages/hyperdrive-js/src/token/eth/ReadEth.ts new file mode 100644 index 000000000..48a4f552e --- /dev/null +++ b/packages/hyperdrive-js/src/token/eth/ReadEth.ts @@ -0,0 +1,50 @@ +import { ContractReadOptions } from "@delvtech/drift"; +import { ReadClient, ReadClientOptions } from "src/drift/ReadClient"; +import { ReadToken } from "src/token/ReadToken"; + +export interface ReadEthOptions extends ReadClientOptions {} + +export class ReadEth extends ReadClient implements ReadToken { + static address = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" as const; + address = ReadEth.address; + + constructor({ debugName = "ETH", ...restOptions }: ReadEthOptions) { + super({ debugName, ...restOptions }); + } + + async getName(): Promise { + return "Ethereum"; + } + + async getSymbol(): Promise { + return "ETH"; + } + + async getDecimals(): Promise { + return 18; + } + + /** + * @remarks + * Native ETH does not require allowances as it is sent directly as the + * message value when used in Hyperdrive. This method returns a maximum + * value to indicate the absence of an allowance mechanism for ETH. + */ + async getAllowance(): Promise { + // Max value for uint256 + return 2n ** 256n - 1n; + } + + async getBalanceOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + return this.drift.getBalance({ + address: account, + ...options, + }); + } +} diff --git a/packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts b/packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts new file mode 100644 index 000000000..e7f85bf9a --- /dev/null +++ b/packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts @@ -0,0 +1,26 @@ +import { Drift, ReadWriteAdapter } from "@delvtech/drift"; +import { ReadWriteClientOptions } from "src/drift/ReadWriteClient"; +import { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; +import { ReadWriteToken } from "src/token/ReadWriteToken"; +import { ReadEth } from "src/token/eth/ReadEth"; + +export interface ReadWriteEthOptions extends ReadWriteClientOptions {} + +export class ReadWriteEth extends ReadEth implements ReadWriteToken { + declare drift: Drift; + + constructor(options: ReadWriteEthOptions) { + super(options); + } + + /** + * This method is not available for the native ETH token. + * @throws A {@linkcode MethodNotImplementedError} + */ + async approve(): Promise<`0x${string}`> { + throw new MethodNotImplementedError({ + objectName: this.debugName, + methodName: "approve", + }); + } +} diff --git a/packages/hyperdrive-js/src/token/lseth/ReadLsEth.ts b/packages/hyperdrive-js/src/token/lseth/ReadLsEth.ts new file mode 100644 index 000000000..5fd3792e3 --- /dev/null +++ b/packages/hyperdrive-js/src/token/lseth/ReadLsEth.ts @@ -0,0 +1,124 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; +import { LsEthAbi, lsEthAbi } from "src/token/lseth/abi"; + +export class ReadLsEth extends readLsEthMixin(ReadErc20) {} + +/** + * @internal + */ +export interface ReadLsEthMixin { + lsEthContract: Contract; + + /** + * Get the total supply of underlying eth in the lsEth contract. + */ + getTotalEthSupply(options?: ContractReadOptions): Promise; + + /** + * Get the underlying eth balance of an account. + */ + getEthBalanceOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise; + + /** + * Get the amount of ETH that would be received for a given number of shares. + */ + getEthBalanceFromShares({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise; + + /** + * Get the number of shares that would be received for a given amount of ETH. + */ + getSharesFromEthBalance({ + ethBalance, + options, + }: { + ethBalance: bigint; + options?: ContractReadOptions; + }): Promise; +} + +/** + * @internal + */ +export function readLsEthMixin>( + Base: T, +): Constructor & T { + return class extends Base implements ReadLsEthMixin { + lsEthContract: Contract; + + constructor(...[options]: any[]) { + const { drift, address, cache, cacheNamespace } = + options as ReadErc20Options; + super({ address, drift, cache, cacheNamespace }); + this.lsEthContract = drift.contract({ + abi: lsEthAbi, + address, + cache, + cacheNamespace, + }); + } + + async getTotalEthSupply(options?: ContractReadOptions): Promise { + return this.lsEthContract.read("totalUnderlyingSupply", {}, options); + } + + async getEthBalanceOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + return this.lsEthContract.read( + "balanceOfUnderlying", + { _owner: account }, + options, + ); + } + + async getEthBalanceFromShares({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.lsEthContract.read( + "underlyingBalanceFromShares", + { + _shares: sharesAmount, + }, + options, + ); + } + + async getSharesFromEthBalance({ + ethBalance, + options, + }: { + ethBalance: bigint; + options?: ContractReadOptions; + }): Promise { + return this.lsEthContract.read( + "sharesFromUnderlyingBalance", + { + _underlyingAssetAmount: ethBalance, + }, + options, + ); + } + }; +} diff --git a/packages/hyperdrive-js/src/token/lseth/ReadWriteLsEth.ts b/packages/hyperdrive-js/src/token/lseth/ReadWriteLsEth.ts new file mode 100644 index 000000000..f1e8237b7 --- /dev/null +++ b/packages/hyperdrive-js/src/token/lseth/ReadWriteLsEth.ts @@ -0,0 +1,8 @@ +import { ReadWriteContract } from "@delvtech/drift"; +import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; +import { readLsEthMixin } from "src/token/lseth/ReadLsEth"; +import { LsEthAbi } from "src/token/lseth/abi"; + +export class ReadWriteLsEth extends readLsEthMixin(ReadWriteErc20) { + declare lsEthContract: ReadWriteContract; +} diff --git a/packages/hyperdrive-js/src/token/lseth/abi.ts b/packages/hyperdrive-js/src/token/lseth/abi.ts new file mode 100644 index 000000000..5d936fa8c --- /dev/null +++ b/packages/hyperdrive-js/src/token/lseth/abi.ts @@ -0,0 +1,4 @@ +import { IRiverV1 } from "@delvtech/hyperdrive-artifacts/IRiverV1"; + +export const lsEthAbi = IRiverV1.abi; +export type LsEthAbi = typeof lsEthAbi; diff --git a/packages/hyperdrive-js/src/token/reth/ReadREth.ts b/packages/hyperdrive-js/src/token/reth/ReadREth.ts new file mode 100644 index 000000000..2bcdb7691 --- /dev/null +++ b/packages/hyperdrive-js/src/token/reth/ReadREth.ts @@ -0,0 +1,125 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; +import { REthAbi, rEthAbi } from "src/token/reth/abi"; + +export class ReadREth extends readREthMixin(ReadErc20) {} + +/** + * @internal + */ +export interface ReadREthMixin { + rEthContract: Contract; + + /** + * Get the total supply of underlying eth in the rETH contract. + */ + getTotalEthSupply(options?: ContractReadOptions): Promise; + + /** + * Get the underlying eth balance of an account. + */ + getEthBalanceOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise; + + /** + * Get the amount of ETH backing an amount of rETH. + */ + getEthValue({ + rEthAmount, + options, + }: { + rEthAmount: bigint; + options?: ContractReadOptions; + }): Promise; + + /** + * Get the amount of rETH backing an amount of ETH. + */ + getREthValue({ + ethAmount, + options, + }: { + ethAmount: bigint; + options?: ContractReadOptions; + }): Promise; +} + +/** + * @internal + */ +export function readREthMixin>( + Base: T, +): Constructor & T { + return class extends Base implements ReadREthMixin { + rEthContract: Contract; + + constructor(...[options]: any[]) { + const { drift, address, cache, cacheNamespace } = + options as ReadErc20Options; + super({ address, drift, cache, cacheNamespace }); + this.rEthContract = drift.contract({ + abi: rEthAbi, + address, + cache, + cacheNamespace, + }); + } + + async getTotalEthSupply(options?: ContractReadOptions): Promise { + return this.rEthContract.read("getTotalCollateral", {}, options); + } + + async getEthBalanceOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + const rEthBalance = await this.getBalanceOf({ account, options }); + return this.rEthContract.read( + "getEthValue", + { _rethAmount: rEthBalance }, + options, + ); + } + + async getEthValue({ + rEthAmount, + options, + }: { + rEthAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.rEthContract.read( + "getEthValue", + { + _rethAmount: rEthAmount, + }, + options, + ); + } + + async getREthValue({ + ethAmount, + options, + }: { + ethAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.rEthContract.read( + "getRethValue", + { + _ethAmount: ethAmount, + }, + options, + ); + } + }; +} diff --git a/packages/hyperdrive-js/src/token/reth/ReadWriteREth.ts b/packages/hyperdrive-js/src/token/reth/ReadWriteREth.ts new file mode 100644 index 000000000..3b5ef80c7 --- /dev/null +++ b/packages/hyperdrive-js/src/token/reth/ReadWriteREth.ts @@ -0,0 +1,8 @@ +import { ReadWriteContract } from "@delvtech/drift"; +import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; +import { readREthMixin } from "src/token/reth/ReadREth"; +import { REthAbi } from "src/token/reth/abi"; + +export class ReadWriteREth extends readREthMixin(ReadWriteErc20) { + declare rEthContract: ReadWriteContract; +} diff --git a/packages/hyperdrive-js/src/token/reth/abi.ts b/packages/hyperdrive-js/src/token/reth/abi.ts new file mode 100644 index 000000000..50f68b410 --- /dev/null +++ b/packages/hyperdrive-js/src/token/reth/abi.ts @@ -0,0 +1,4 @@ +import { IRocketTokenRETH } from "@delvtech/hyperdrive-artifacts/IRocketTokenRETH"; + +export const rEthAbi = IRocketTokenRETH.abi; +export type REthAbi = typeof rEthAbi; diff --git a/packages/hyperdrive-js/src/token/steth/ReadStEth.ts b/packages/hyperdrive-js/src/token/steth/ReadStEth.ts new file mode 100644 index 000000000..dadbc9f19 --- /dev/null +++ b/packages/hyperdrive-js/src/token/steth/ReadStEth.ts @@ -0,0 +1,118 @@ +import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { Constructor } from "src/base/types"; +import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; +import { StEthAbi, stEthAbi } from "src/token/steth/abi"; + +export class ReadStEth extends readStEthMixin(ReadErc20) {} + +/** + * @internal + */ +export interface ReadStEthMixin { + stEthContract: Contract; + + /** + * Get the number of stETH shares held by an account. + */ + getSharesOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise; + + /** + * Get the amount of pooled ETH (stETH) that would be received for a given + * number of shares. + */ + getPooledEthByShares({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise; + + /** + * Get the number of shares that would be received for a given amount of + * pooled ETH (stETH). + */ + getSharesByPooledEth({ + ethAmount, + options, + }: { + ethAmount: bigint; + options?: ContractReadOptions; + }): Promise; +} + +/** + * @internal + */ +export function readStEthMixin>( + Base: T, +): Constructor & T { + return class extends Base implements ReadStEthMixin { + stEthContract: Contract; + + constructor(...[options]: any[]) { + const { + debugName = "stETH Token", + address, + cache, + cacheNamespace, + ...rest + } = options as ReadErc20Options; + super({ debugName, address, cache, cacheNamespace, ...rest }); + this.stEthContract = this.drift.contract({ + abi: stEthAbi, + address, + cache, + cacheNamespace, + }); + } + + getSharesOf({ + account, + options, + }: { + account: `0x${string}`; + options?: ContractReadOptions; + }): Promise { + return this.stEthContract.read( + "sharesOf", + { _account: account }, + options, + ); + } + + getPooledEthByShares({ + sharesAmount, + options, + }: { + sharesAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.stEthContract.read( + "getPooledEthByShares", + { _sharesAmount: sharesAmount }, + options, + ); + } + + getSharesByPooledEth({ + ethAmount, + options, + }: { + ethAmount: bigint; + options?: ContractReadOptions; + }): Promise { + return this.stEthContract.read( + "getSharesByPooledEth", + { _ethAmount: ethAmount }, + options, + ); + } + }; +} diff --git a/packages/hyperdrive-js/src/token/steth/ReadWriteStEth.ts b/packages/hyperdrive-js/src/token/steth/ReadWriteStEth.ts new file mode 100644 index 000000000..66ec0b8ff --- /dev/null +++ b/packages/hyperdrive-js/src/token/steth/ReadWriteStEth.ts @@ -0,0 +1,8 @@ +import { ReadWriteContract } from "@delvtech/drift"; +import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; +import { StEthAbi } from "src/token/steth/abi"; +import { readStEthMixin } from "src/token/steth/ReadStEth"; + +export class ReadWriteStEth extends readStEthMixin(ReadWriteErc20) { + declare stEthContract: ReadWriteContract; +} diff --git a/packages/hyperdrive-js/src/token/steth/abi.ts b/packages/hyperdrive-js/src/token/steth/abi.ts new file mode 100644 index 000000000..9ca120fd4 --- /dev/null +++ b/packages/hyperdrive-js/src/token/steth/abi.ts @@ -0,0 +1,4 @@ +import { ILido } from "@delvtech/hyperdrive-artifacts/ILido"; + +export const stEthAbi = ILido.abi; +export type StEthAbi = typeof stEthAbi; diff --git a/packages/hyperdrive-js/src/withdrawalShares/RedeemedWithdrawalShares.ts b/packages/hyperdrive-js/src/withdrawalShares/RedeemedWithdrawalShares.ts new file mode 100644 index 000000000..b62e8a608 --- /dev/null +++ b/packages/hyperdrive-js/src/withdrawalShares/RedeemedWithdrawalShares.ts @@ -0,0 +1,6 @@ +export interface RedeemedWithdrawalShares { + hyperdriveAddress: `0x${string}`; + withdrawalShareAmount: bigint; + baseAmount: bigint; + redeemedTimestamp: bigint; +} diff --git a/packages/hyperdrive-js/src/withdrawalShares/assetId.ts b/packages/hyperdrive-js/src/withdrawalShares/assetId.ts new file mode 100644 index 000000000..807a2cbf1 --- /dev/null +++ b/packages/hyperdrive-js/src/withdrawalShares/assetId.ts @@ -0,0 +1,2 @@ +export const WITHDRAW_SHARES_ASSET_ID = + 0x0300000000000000000000000000000000000000000000000000000000000000n; diff --git a/packages/hyperdrive-js/tsconfig.json b/packages/hyperdrive-js/tsconfig.json new file mode 100644 index 000000000..f92f27a67 --- /dev/null +++ b/packages/hyperdrive-js/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@hyperdrive/tsconfig/base.json", + "include": ["src"], + "exclude": ["node_modules"], + "compilerOptions": { + "rootDir": ".", + "baseUrl": ".", + "moduleResolution": "Bundler", + "experimentalDecorators": true, + "target": "esnext", + "module": "ESNext", + "paths": { + "src/*": ["src/*"] + }, + "resolveJsonModule": true + } +} diff --git a/packages/hyperdrive-js/tsup.config.ts b/packages/hyperdrive-js/tsup.config.ts new file mode 100644 index 000000000..07ca24f96 --- /dev/null +++ b/packages/hyperdrive-js/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsup"; + +export default defineConfig({ + entry: ["src/exports/index.ts", "src/exports/v1.0.14.ts"], + format: ["esm", "cjs"], + sourcemap: true, + dts: true, + clean: true, + minify: true, + cjsInterop: true, +}); diff --git a/packages/hyperdrive-js/vite.config.ts b/packages/hyperdrive-js/vite.config.ts new file mode 100644 index 000000000..5f5a285c1 --- /dev/null +++ b/packages/hyperdrive-js/vite.config.ts @@ -0,0 +1,6 @@ +import tsconfigPaths from "vite-tsconfig-paths"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [tsconfigPaths()], +}); From b7f7ee74848da91d5839a86e9911b607b9d77704 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 20:06:09 -0600 Subject: [PATCH 30/43] Switch hyperdrive-viem to new pkg --- packages/hyperdrive-viem/package.json | 2 +- packages/hyperdrive-viem/src/exports/index.ts | 4 ++-- packages/hyperdrive-viem/src/factory.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/base.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/erc4626.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/ezeth.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/lseth.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/reth.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/steth.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts | 2 +- packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts | 2 +- packages/hyperdrive-viem/src/registry.ts | 2 +- packages/hyperdrive-viem/src/viem/viemReadMixin.ts | 2 +- packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts | 2 +- 19 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index fde3b322d..91780f3b4 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -14,7 +14,7 @@ "dependencies": { "@delvtech/drift": "^0.0.1-beta.11", "@delvtech/drift-viem": "^0.0.1-beta.13", - "@delvtech/hyperdrive-js-core": "3.0.6" + "@delvtech/hyperdrive-js": "0.0.1" }, "devDependencies": { "@hyperdrive/eslint-config": "*", diff --git a/packages/hyperdrive-viem/src/exports/index.ts b/packages/hyperdrive-viem/src/exports/index.ts index 6389b149f..3244ef865 100644 --- a/packages/hyperdrive-viem/src/exports/index.ts +++ b/packages/hyperdrive-viem/src/exports/index.ts @@ -1,7 +1,7 @@ import { ReadClientOptions as BaseReadClientOptions, ReadWriteClientOptions as BaseReadWriteClientOptions, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { ViemReadClientOptions } from "src/viem/viemReadMixin"; import { ViemReadWriteClientOptions } from "src/viem/viemReadWriteMixin"; @@ -145,4 +145,4 @@ export { type REthAbi, type Short, type StEthAbi, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; diff --git a/packages/hyperdrive-viem/src/factory.ts b/packages/hyperdrive-viem/src/factory.ts index 0f9c6c78f..e4e056b05 100644 --- a/packages/hyperdrive-viem/src/factory.ts +++ b/packages/hyperdrive-viem/src/factory.ts @@ -3,7 +3,7 @@ import { ReadFactoryOptions as BaseReadFactoryOptions, ReadWriteFactory as BaseReadWriteFactory, ReadWriteFactoryOptions as BaseReadWriteFactoryOptions, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; import { ViemReadWriteClientOptions, diff --git a/packages/hyperdrive-viem/src/hyperdrive/base.ts b/packages/hyperdrive-viem/src/hyperdrive/base.ts index 41e194f3f..544fe5414 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/base.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/base.ts @@ -3,7 +3,7 @@ import { ReadHyperdriveOptions as BaseReadHyperdriveOptions, ReadWriteHyperdrive as BaseReadWriteHyperdrive, ReadWriteHyperdriveOptions as BaseReadWriteHyperdriveOptions, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; import { ViemReadWriteClientOptions, diff --git a/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts b/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts index ed3b40184..337f70212 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/erc4626.ts @@ -3,7 +3,7 @@ import { ReadMockErc4626Hyperdrive as BaseReadMockErc4626Hyperdrive, ReadWriteErc4626Hyperdrive as BaseReadWriteErc4626Hyperdrive, ReadWriteMockErc4626Hyperdrive as BaseReadWriteMockErc4626Hyperdrive, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts b/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts index fbc5b27c4..82c173924 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/ezeth.ts @@ -1,7 +1,7 @@ import { ReadEzEthHyperdrive as BaseReadEzEthHyperdrive, ReadWriteEzEthHyperdrive as BaseReadWriteEzEthHyperdrive, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts b/packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts index 127954b57..d2c5767c4 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/getHyperdrive.ts @@ -1,6 +1,6 @@ import { Drift } from "@delvtech/drift"; import { viemAdapter } from "@delvtech/drift-viem"; -import { getHyperdrive as baseGetHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { getHyperdrive as baseGetHyperdrive } from "@delvtech/hyperdrive-js"; import { ReadHyperdrive, ReadHyperdriveOptions, diff --git a/packages/hyperdrive-viem/src/hyperdrive/lseth.ts b/packages/hyperdrive-viem/src/hyperdrive/lseth.ts index a33269018..588bf78b0 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/lseth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/lseth.ts @@ -1,7 +1,7 @@ import { ReadLsEthHyperdrive as BaseReadLsEthHyperdrive, ReadWriteLsEthHyperdrive as BaseReadWriteLsEthHyperdrive, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/reth.ts b/packages/hyperdrive-viem/src/hyperdrive/reth.ts index 60e3ff523..55b30cf91 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/reth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/reth.ts @@ -1,7 +1,7 @@ import { ReadREthHyperdrive as BaseReadREthHyperdrive, ReadWriteREthHyperdrive as BaseReadWriteREthHyperdrive, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/steth.ts b/packages/hyperdrive-viem/src/hyperdrive/steth.ts index ac1e57b01..b05cb951f 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/steth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/steth.ts @@ -3,7 +3,7 @@ import { ReadStEthHyperdriveOptions as BaseReadStEthHyperdriveOptions, ReadWriteStEthHyperdrive as BaseReadWriteStEthHyperdrive, ReadWriteStEthHyperdriveOptions as BaseReadWriteStEthHyperdriveOptions, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts index 0f77a1460..f621def98 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/base.ts @@ -1,7 +1,7 @@ import { ReadHyperdrive_v1_0_14 as BaseReadHyperdrive_v1_0_14, ReadWriteHyperdrive_v1_0_14 as BaseReadWriteHyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-js-core/v1.0.14"; +} from "@delvtech/hyperdrive-js/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts index c2efe1857..c20ea66fb 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/erc4626.ts @@ -3,7 +3,7 @@ import { ReadMockErc4626Hyperdrive_v1_0_14 as BaseReadMockErc4626Hyperdrive_v1_0_14, ReadWriteErc4626Hyperdrive_v1_0_14 as BaseReadWriteErc4626Hyperdrive_v1_0_14, ReadWriteMockErc4626Hyperdrive_v1_0_14 as BaseReadWriteMockErc4626Hyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-js-core/v1.0.14"; +} from "@delvtech/hyperdrive-js/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts index ff7a2e094..8437db49c 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/ezeth.ts @@ -1,7 +1,7 @@ import { ReadEzEthHyperdrive_v1_0_14 as BaseReadEzEthHyperdrive_v1_0_14, ReadWriteEzEthHyperdrive_v1_0_14 as BaseReadWriteEzEthHyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-js-core/v1.0.14"; +} from "@delvtech/hyperdrive-js/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts index caae010af..141bb1235 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/lseth.ts @@ -1,7 +1,7 @@ import { ReadLsEthHyperdrive_v1_0_14 as BaseReadLsEthHyperdrive_v1_0_14, ReadWriteLsEthHyperdrive_v1_0_14 as BaseReadWriteLsEthHyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-js-core/v1.0.14"; +} from "@delvtech/hyperdrive-js/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts index c61010265..c37efdd12 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/reth.ts @@ -1,7 +1,7 @@ import { ReadREthHyperdrive_v1_0_14 as BaseReadREthHyperdrive_v1_0_14, ReadWriteREthHyperdrive_v1_0_14 as BaseReadWriteREthHyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-js-core/v1.0.14"; +} from "@delvtech/hyperdrive-js/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts index 0423b2473..5446c873f 100644 --- a/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts +++ b/packages/hyperdrive-viem/src/hyperdrive/v1.0.14/steth.ts @@ -1,7 +1,7 @@ import { ReadStEthHyperdrive_v1_0_14 as BaseReadStEthHyperdrive_v1_0_14, ReadWriteStEthHyperdrive_v1_0_14 as BaseReadWriteStEthHyperdrive_v1_0_14, -} from "@delvtech/hyperdrive-js-core/v1.0.14"; +} from "@delvtech/hyperdrive-js/v1.0.14"; import { viemReadMixin } from "src/viem/viemReadMixin"; import { viemReadWriteMixin } from "src/viem/viemReadWriteMixin"; diff --git a/packages/hyperdrive-viem/src/registry.ts b/packages/hyperdrive-viem/src/registry.ts index 56e9dbbb2..de36bd1fc 100644 --- a/packages/hyperdrive-viem/src/registry.ts +++ b/packages/hyperdrive-viem/src/registry.ts @@ -3,7 +3,7 @@ import { ReadRegistryOptions as BaseReadRegistryOptions, ReadWriteRegistry as BaseReadWriteRegistry, ReadWriteRegistryOptions as BaseReadWriteRegistryOptions, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { ViemReadClientOptions, viemReadMixin } from "src/viem/viemReadMixin"; import { ViemReadWriteClientOptions, diff --git a/packages/hyperdrive-viem/src/viem/viemReadMixin.ts b/packages/hyperdrive-viem/src/viem/viemReadMixin.ts index 922ada9fb..6a2afd4d7 100644 --- a/packages/hyperdrive-viem/src/viem/viemReadMixin.ts +++ b/packages/hyperdrive-viem/src/viem/viemReadMixin.ts @@ -4,7 +4,7 @@ import { Constructor, ReadClient, ReadClientOptions, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { PublicClient } from "viem"; // Replace the `drift` option with `publicClient`. diff --git a/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts b/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts index b92524ec7..73891ce0f 100644 --- a/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts +++ b/packages/hyperdrive-viem/src/viem/viemReadWriteMixin.ts @@ -4,7 +4,7 @@ import { Constructor, ReadWriteClient, ReadWriteClientOptions, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { PublicClient, WalletClient } from "viem"; // Replace the `drift` option with `publicClient` and `walletClient`. From bdf7c4aa7c51c06374dbe701538d5656bc128e17 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 20:07:50 -0600 Subject: [PATCH 31/43] Change version --- packages/hyperdrive-js/package.json | 2 +- packages/hyperdrive-viem/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hyperdrive-js/package.json b/packages/hyperdrive-js/package.json index dcd95ddd0..46822c9b1 100644 --- a/packages/hyperdrive-js/package.json +++ b/packages/hyperdrive-js/package.json @@ -1,6 +1,6 @@ { "name": "@delvtech/hyperdrive-js", - "version": "0.0.1", + "version": "0.0.0", "license": "AGPL-3.0", "type": "module", "scripts": { diff --git a/packages/hyperdrive-viem/package.json b/packages/hyperdrive-viem/package.json index 91780f3b4..62d705bab 100644 --- a/packages/hyperdrive-viem/package.json +++ b/packages/hyperdrive-viem/package.json @@ -14,7 +14,7 @@ "dependencies": { "@delvtech/drift": "^0.0.1-beta.11", "@delvtech/drift-viem": "^0.0.1-beta.13", - "@delvtech/hyperdrive-js": "0.0.1" + "@delvtech/hyperdrive-js": "0.0.0" }, "devDependencies": { "@hyperdrive/eslint-config": "*", From 871ff38873659c2a6cc96868478669690f4ec3e7 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 20:08:17 -0600 Subject: [PATCH 32/43] Update changeset config --- .changeset/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index 4da54cf31..07124f10a 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -6,7 +6,7 @@ ["@delvtech/hyperdrive-wasm", "hyperdrive-wasm"], ["@delvtech/fixed-point-wasm", "fixed-point-wasm"] ], - "linked": [["@delvtech/hyperdrive-viem", "@delvtech/hyperdrive-js-core"]], + "linked": [["@delvtech/hyperdrive-viem", "@delvtech/hyperdrive-js"]], "access": "restricted", "baseBranch": "main", "updateInternalDependencies": "patch", From fd6a6d0bda1029dbca879a3c331c0cf5ed5aa4f5 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 20:11:25 -0600 Subject: [PATCH 33/43] Switch UI to new pkg --- apps/hyperdrive-trading/package.json | 2 +- apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts | 2 +- apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts | 2 +- apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx | 2 +- apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx | 2 +- .../src/ui/hyperdrive/hooks/useMarketState.ts | 2 +- .../src/ui/hyperdrive/hooks/usePoolInfo.ts | 2 +- .../src/ui/hyperdrive/hooks/usePrepareSharesIn.ts | 2 +- .../src/ui/hyperdrive/hooks/usePrepareSharesOut.ts | 2 +- .../src/ui/hyperdrive/hooks/useReadHyperdrive.ts | 2 +- .../src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts | 5 +---- .../src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx | 2 +- .../longs/CloseLongModalButton/CloseLongModalButton.tsx | 2 +- .../src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx | 2 +- .../ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx | 2 +- .../ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx | 2 +- .../longs/OpenLongsTable/OpenLongsTableDesktop.tsx | 2 +- .../src/ui/hyperdrive/longs/hooks/useFixedRate.ts | 2 +- .../src/ui/hyperdrive/longs/hooks/useOpenLongs.ts | 2 +- .../ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts | 2 +- .../src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts | 2 +- .../ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx | 2 +- .../lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx | 2 +- .../ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts | 2 +- .../ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx | 5 +---- .../shorts/CloseShortModalButton/CloseShortModalButton.tsx | 2 +- .../shorts/ClosedShortsTable/ClosedShortsTable.tsx | 2 +- .../src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx | 2 +- .../hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx | 2 +- .../shorts/OpenShortsTable/CurrentShortsValueCell.tsx | 2 +- .../hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx | 2 +- .../shorts/OpenShortsTable/OpenShortsTableDesktop.tsx | 2 +- .../shorts/OpenShortsTable/ShortRateAndSizeCell.tsx | 2 +- .../src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts | 2 +- .../src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx | 2 +- .../src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts | 2 +- .../src/ui/hyperdrive/shorts/hooks/useShortRate.ts | 2 +- .../ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts | 2 +- .../ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts | 2 +- .../RedeemWithdrawalSharesForm.tsx | 2 +- apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx | 2 +- .../src/ui/portfolio/usePortfolioLongsData.ts | 2 +- .../src/ui/portfolio/usePortfolioLpData.ts | 2 +- .../src/ui/portfolio/usePortfolioShortsData.ts | 2 +- .../src/ui/registry/hooks/useReadRegistry.ts | 2 +- 45 files changed, 45 insertions(+), 51 deletions(-) diff --git a/apps/hyperdrive-trading/package.json b/apps/hyperdrive-trading/package.json index 328128f95..759e8aede 100644 --- a/apps/hyperdrive-trading/package.json +++ b/apps/hyperdrive-trading/package.json @@ -32,7 +32,7 @@ "@delvtech/drift-viem": "^0.0.1-beta.13", "@delvtech/fixed-point-wasm": "^0.0.6", "@delvtech/hyperdrive-appconfig": "^0.0.1", - "@delvtech/hyperdrive-js-core": "^3.0.6", + "@delvtech/hyperdrive-js": "^0.0.0", "@headlessui/react": "^2.1.5", "@heroicons/react": "^2.0.16", "@radix-ui/react-tooltip": "^1.1.2", diff --git a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts index 12511c1c8..f669cad01 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getLpApy.ts @@ -5,7 +5,7 @@ import { getRewardsFn, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js"; import { getPublicClient } from "@wagmi/core"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; import { isForkChain } from "src/chains/isForkChain"; diff --git a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts index e59bc382f..0a8ca5af9 100644 --- a/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts +++ b/apps/hyperdrive-trading/src/hyperdrive/getYieldSourceRate.ts @@ -6,7 +6,7 @@ import { getRewardsFn, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js"; import { getPublicClient } from "@wagmi/core"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; import { isForkChain } from "src/chains/isForkChain"; diff --git a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx index 3c0bd644e..515aeea3a 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx @@ -1,4 +1,4 @@ -import { ReadRegistry } from "@delvtech/hyperdrive-js-core"; +import { ReadRegistry } from "@delvtech/hyperdrive-js"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { UseQueryResult, useQuery } from "@tanstack/react-query"; import { diff --git a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx index 8f8c13818..eb31e4aea 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx @@ -1,4 +1,4 @@ -import { ReadRegistry } from "@delvtech/hyperdrive-js-core"; +import { ReadRegistry } from "@delvtech/hyperdrive-js"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { UseQueryResult, useQuery } from "@tanstack/react-query"; import { Link } from "@tanstack/react-router"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useMarketState.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useMarketState.ts index 44378a896..3252fd120 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useMarketState.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useMarketState.ts @@ -1,4 +1,4 @@ -import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts index 17c95b0e2..291f8ec12 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePoolInfo.ts @@ -1,4 +1,4 @@ -import { PoolInfo } from "@delvtech/hyperdrive-js-core"; +import { PoolInfo } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts index 94db7b701..1d3b30d1c 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesIn.ts @@ -3,7 +3,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { QueryStatusWithIdle, getStatus } from "src/base/queryStatus"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts index 262db32d1..b5352d5d6 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/usePrepareSharesOut.ts @@ -3,7 +3,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { QueryStatusWithIdle, getStatus } from "src/base/queryStatus"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts index d7e0b6be9..ef11be6d4 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadHyperdrive.ts @@ -2,7 +2,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { getHyperdrive, ReadHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { getHyperdrive, ReadHyperdrive } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useDrift } from "src/ui/drift/useDrift"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts index 73dd830e6..98e261c43 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/hooks/useReadWriteHyperdrive.ts @@ -2,10 +2,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { - getHyperdrive, - ReadWriteHyperdrive, -} from "@delvtech/hyperdrive-js-core"; +import { getHyperdrive, ReadWriteHyperdrive } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadWriteDrift } from "src/ui/drift/useDrift"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx index 2029103a5..ad6b7c464 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongForm/CloseLongForm.tsx @@ -6,7 +6,7 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage, Long } from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage, Long } from "@delvtech/hyperdrive-js"; import { MouseEvent, ReactElement } from "react"; import { isTestnetChain } from "src/chains/isTestnetChain"; import { LoadingButton } from "src/ui/base/components/LoadingButton"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx index 8e2117c7f..32fa568cc 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/CloseLongModalButton/CloseLongModalButton.tsx @@ -5,7 +5,7 @@ import { findBaseToken, findToken, } from "@delvtech/hyperdrive-appconfig"; -import { Long } from "@delvtech/hyperdrive-js-core"; +import { Long } from "@delvtech/hyperdrive-js"; import { ReactElement } from "react"; import { Modal } from "src/ui/base/components/Modal/Modal"; import { ModalHeader } from "src/ui/base/components/Modal/ModalHeader"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx index a5bdc2b0b..189b0ccaf 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongForm/OpenLongForm.tsx @@ -5,7 +5,7 @@ import { findToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js"; import { MouseEvent, ReactElement } from "react"; import { isTestnetChain } from "src/chains/isTestnetChain"; import { getIsValidTradeSize } from "src/hyperdrive/getIsValidTradeSize"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx index 35fdd242d..7a5bea87d 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongPreview/OpenLongStats.tsx @@ -4,7 +4,7 @@ import { findBaseToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { calculateAprFromPrice } from "@delvtech/hyperdrive-js-core"; +import { calculateAprFromPrice } from "@delvtech/hyperdrive-js"; import classNames from "classnames"; import Skeleton from "react-loading-skeleton"; import { convertMillisecondsToDays } from "src/base/convertMillisecondsToDays"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx index ec33c78c8..0b69d4d19 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/CurrentValueCell.tsx @@ -3,7 +3,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenLongPositionReceived } from "@delvtech/hyperdrive-js-core"; +import { OpenLongPositionReceived } from "@delvtech/hyperdrive-js"; import { ExclamationTriangleIcon } from "@heroicons/react/20/solid"; import classNames from "classnames"; import { ReactElement } from "react"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx index 7a0fcda37..bedecaa75 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/OpenLongsTable/OpenLongsTableDesktop.tsx @@ -8,7 +8,7 @@ import { import { calculateAprFromPrice, OpenLongPositionReceived, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { Link } from "@tanstack/react-router"; import { diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts index bb1050ddc..c8896d295 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useFixedRate.ts @@ -3,7 +3,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { getHprFromApr } from "@delvtech/hyperdrive-js-core"; +import { getHprFromApr } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { formatRate } from "src/base/formatRate"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts index 2ad5d97f5..ecbb55980 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useOpenLongs.ts @@ -1,4 +1,4 @@ -import { Long, OpenLongPositionReceived } from "@delvtech/hyperdrive-js-core"; +import { Long, OpenLongPositionReceived } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts index 333b0046b..bfe51d5d8 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalClosedLongsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { ClosedLong } from "@delvtech/hyperdrive-js-core"; +import { ClosedLong } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts index 700d8ddbc..14865efd8 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/longs/hooks/useTotalOpenLongsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { Long } from "@delvtech/hyperdrive-js-core"; +import { Long } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { usePoolInfo } from "src/ui/hyperdrive/hooks/usePoolInfo"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx index e892b9b94..806da7b3f 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/AddLiquidityForm/AddLiquidityForm.tsx @@ -6,7 +6,7 @@ import { findBaseToken, findToken, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js"; import classNames from "classnames"; import { MouseEvent, ReactElement } from "react"; import Skeleton from "react-loading-skeleton"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx index b1e5bb591..97465e5f5 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/RemoveLiquidityForm/RemoveLiquidityForm.tsx @@ -5,7 +5,7 @@ import { findToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js"; import { MouseEvent, ReactElement } from "react"; import Skeleton from "react-loading-skeleton"; import { calculateRatio } from "src/base/calculateRatio"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts index ab5213cbf..32d4088cd 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/lp/hooks/useRedeemedWithdrawalShares.ts @@ -1,4 +1,4 @@ -import { RedeemedWithdrawalShares } from "@delvtech/hyperdrive-js-core"; +import { RedeemedWithdrawalShares } from "@delvtech/hyperdrive-js"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx index 14a0cac61..85f7cd1b8 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortForm/CloseShortForm.tsx @@ -5,10 +5,7 @@ import { findToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { - adjustAmountByPercentage, - OpenShort, -} from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage, OpenShort } from "@delvtech/hyperdrive-js"; import { MouseEvent, ReactElement } from "react"; import { isTestnetChain } from "src/chains/isTestnetChain"; import { LoadingButton } from "src/ui/base/components/LoadingButton"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx index 3f7397f07..7a3db3ea2 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/CloseShortModalButton/CloseShortModalButton.tsx @@ -5,7 +5,7 @@ import { findBaseToken, findToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-js-core"; +import { OpenShort } from "@delvtech/hyperdrive-js"; import { ReactElement } from "react"; import { Modal } from "src/ui/base/components/Modal/Modal"; import { ModalHeader } from "src/ui/base/components/Modal/ModalHeader"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx index 482a30971..497d8358d 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/ClosedShortsTable/ClosedShortsTable.tsx @@ -4,7 +4,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { ClosedShort } from "@delvtech/hyperdrive-js-core"; +import { ClosedShort } from "@delvtech/hyperdrive-js"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/16/solid"; import { createColumnHelper, diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx index 51ac626da..79a1aa12e 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortForm/OpenShortForm.tsx @@ -1,5 +1,5 @@ import { fixed } from "@delvtech/fixed-point-wasm"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js"; import { appConfig, diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx index 21dea1c55..48ccfde23 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/AccruedYieldCell.tsx @@ -3,7 +3,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-js-core"; +import { OpenShort } from "@delvtech/hyperdrive-js"; import classNames from "classnames"; import { ReactElement } from "react"; import { formatBalance } from "src/ui/base/formatting/formatBalance"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx index 5dada7bf3..6e894f812 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentShortsValueCell.tsx @@ -3,7 +3,7 @@ import { findBaseToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-js-core"; +import { OpenShort } from "@delvtech/hyperdrive-js"; import { ExclamationTriangleIcon } from "@heroicons/react/16/solid"; import classNames from "classnames"; import { ReactElement } from "react"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx index ad7e57a59..4a7cb3327 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/CurrentValueCell.tsx @@ -3,7 +3,7 @@ import { appConfig, findBaseToken, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-js-core"; +import { OpenShort } from "@delvtech/hyperdrive-js"; import { ExclamationTriangleIcon } from "@heroicons/react/20/solid"; import classNames from "classnames"; import { ReactElement } from "react"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx index cd69f5384..bbda584ba 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/OpenShortsTableDesktop.tsx @@ -5,7 +5,7 @@ import { findToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-js-core"; +import { OpenShort } from "@delvtech/hyperdrive-js"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; import { Link } from "@tanstack/react-router"; import { diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx index cc0a3b81b..fbdb53cf3 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/OpenShortsTable/ShortRateAndSizeCell.tsx @@ -3,7 +3,7 @@ import { findBaseToken, HyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { OpenShort } from "@delvtech/hyperdrive-js-core"; +import { OpenShort } from "@delvtech/hyperdrive-js"; import classNames from "classnames"; import { ReactElement } from "react"; import { formatRate } from "src/base/formatRate"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts index e0e4969db..facdd22a0 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useClosedShorts.ts @@ -1,4 +1,4 @@ -import { ClosedShort } from "@delvtech/hyperdrive-js-core"; +import { ClosedShort } from "@delvtech/hyperdrive-js"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx index dbda7afd6..513e9d261 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShort.tsx @@ -1,5 +1,5 @@ import { appConfig } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js"; import { useAddRecentTransaction } from "@rainbow-me/rainbowkit"; import { MutationStatus, diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts index 862ff3ad0..7dc03dad5 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useOpenShorts.ts @@ -1,4 +1,4 @@ -import { OpenShort } from "@delvtech/hyperdrive-js-core"; +import { OpenShort } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts index 5eb33878d..261e51c6f 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useShortRate.ts @@ -2,7 +2,7 @@ import { appConfig, findHyperdriveConfig, } from "@delvtech/hyperdrive-appconfig"; -import { getHprFromApr } from "@delvtech/hyperdrive-js-core"; +import { getHprFromApr } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { formatRate } from "src/base/formatRate"; import { makeQueryKey } from "src/base/makeQueryKey"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts index 989bfdbc4..78bf51f2f 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalClosedShortsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { ClosedShort } from "@delvtech/hyperdrive-js-core"; +import { ClosedShort } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { useReadHyperdrive } from "src/ui/hyperdrive/hooks/useReadHyperdrive"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts index 2b71c8e15..448396afd 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/shorts/hooks/useTotalOpenShortsValue.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { Short } from "@delvtech/hyperdrive-js-core"; +import { Short } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { usePoolInfo } from "src/ui/hyperdrive/hooks/usePoolInfo"; diff --git a/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx b/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx index bdfdac8f8..742766377 100644 --- a/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx +++ b/apps/hyperdrive-trading/src/ui/hyperdrive/withdrawalShares/RedeemWithdrawalSharesForm/RedeemWithdrawalSharesForm.tsx @@ -6,7 +6,7 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; -import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js-core"; +import { adjustAmountByPercentage } from "@delvtech/hyperdrive-js"; import { ReactElement } from "react"; import { convertSharesToBase } from "src/hyperdrive/convertSharesToBase"; import { LabelValue } from "src/ui/base/components/LabelValue"; diff --git a/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx b/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx index 1c65bf41d..381248d48 100644 --- a/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx +++ b/apps/hyperdrive-trading/src/ui/markets/PoolsList.tsx @@ -6,7 +6,7 @@ import { HyperdriveConfig, TokenConfig, } from "@delvtech/hyperdrive-appconfig"; -import { getHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { getHyperdrive } from "@delvtech/hyperdrive-js"; import { AdjustmentsHorizontalIcon } from "@heroicons/react/20/solid"; import { QueryStatus, useQuery } from "@tanstack/react-query"; import { useNavigate, useSearch } from "@tanstack/react-router"; diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts index bca9c546b..28ca65d92 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLongsData.ts @@ -2,7 +2,7 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; import { getHyperdrive, OpenLongPositionReceived, -} from "@delvtech/hyperdrive-js-core"; +} from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { getDrift } from "src/drift/getDrift"; diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts index 004e0d89e..d58c65485 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioLpData.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { getHyperdrive } from "@delvtech/hyperdrive-js-core"; +import { getHyperdrive } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { getDrift } from "src/drift/getDrift"; diff --git a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts index 16cc9067b..3557e809b 100644 --- a/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts +++ b/apps/hyperdrive-trading/src/ui/portfolio/usePortfolioShortsData.ts @@ -1,5 +1,5 @@ import { HyperdriveConfig } from "@delvtech/hyperdrive-appconfig"; -import { getHyperdrive, OpenShort } from "@delvtech/hyperdrive-js-core"; +import { getHyperdrive, OpenShort } from "@delvtech/hyperdrive-js"; import { useQuery } from "@tanstack/react-query"; import { makeQueryKey } from "src/base/makeQueryKey"; import { getDrift } from "src/drift/getDrift"; diff --git a/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts b/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts index 876cc0cbf..aaca40460 100644 --- a/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts +++ b/apps/hyperdrive-trading/src/ui/registry/hooks/useReadRegistry.ts @@ -1,4 +1,4 @@ -import { ReadRegistry } from "@delvtech/hyperdrive-js-core"; +import { ReadRegistry } from "@delvtech/hyperdrive-js"; import { useMemo } from "react"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { useDrift } from "src/ui/drift/useDrift"; From a8498f6413459c308d236d456067b7171beb35a3 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 20:16:04 -0600 Subject: [PATCH 34/43] Update sandbox --- apps/sdk-sandbox/package.json | 3 +-- apps/sdk-sandbox/scripts/example.ts | 19 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/apps/sdk-sandbox/package.json b/apps/sdk-sandbox/package.json index c83fb6dbc..ed83ac9ce 100644 --- a/apps/sdk-sandbox/package.json +++ b/apps/sdk-sandbox/package.json @@ -15,8 +15,7 @@ "@delvtech/drift-viem": "^0.0.1-beta.13", "@delvtech/fixed-point-wasm": "*", "@delvtech/hyperdrive-appconfig": "*", - "@delvtech/hyperdrive-viem": "*", - "@delvtech/hyperdrive-js-core": "*", + "@delvtech/hyperdrive-js": "*", "@delvtech/hyperdrive-wasm": "*", "viem": "^2.9.2" }, diff --git a/apps/sdk-sandbox/scripts/example.ts b/apps/sdk-sandbox/scripts/example.ts index 2626ebee5..07e3b9597 100644 --- a/apps/sdk-sandbox/scripts/example.ts +++ b/apps/sdk-sandbox/scripts/example.ts @@ -1,22 +1,21 @@ -import { IHyperdrive } from "@delvtech/hyperdrive-artifacts/IHyperdrive"; -import { ReadHyperdrive } from "@delvtech/hyperdrive-viem"; +import { Drift } from "@delvtech/drift"; +import { viemAdapter } from "@delvtech/drift-viem"; +import { ReadHyperdrive } from "@delvtech/hyperdrive-js"; import { publicClient } from "../client"; +const drift = new Drift(viemAdapter({ publicClient })); + const pool = new ReadHyperdrive({ - address: "0x1cB0E96C07910fee9a22607bb9228c73848903a3", - publicClient, + address: "0x324395D5d835F84a02A75Aa26814f6fD22F25698", + drift, }); const kind = await pool.getKind(); -const name = await publicClient.readContract({ - abi: IHyperdrive.abi, - address: "0x1cB0E96C07910fee9a22607bb9228c73848903a3", - functionName: "name", -}); const config = await pool.getPoolConfig(); + console.log(` + address: ${pool.address} kind: ${kind} - name: ${name} baseToken: ${config.baseToken} sharesToken: ${config.vaultSharesToken} `); From 8e5b5c86d85813b88197d38af04978309c27fb8b Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 20:18:19 -0600 Subject: [PATCH 35/43] Revert hyperdrive-js-core --- packages/hyperdrive-js-core/package.json | 51 +- packages/hyperdrive-js-core/src/base/types.ts | 91 +++ .../src/checkpoint/types.ts | 10 +- .../src/drift/ContractClient.ts | 32 - .../src/drift/ReadWriteClient.ts | 20 - .../src/errors/BlockNotFoundError.ts | 2 +- .../src/errors/HyperdriveSdkError.ts | 13 +- .../src/evm-client/contractFactory.ts | 27 + .../evm-client/syncCacheWithTransaction.ts | 85 +++ .../utils/getBlockFromReadOptions.ts | 13 + .../utils}/getBlockOrThrow.ts | 15 +- .../evm-client/utils/isReadWriteContract.ts | 12 + .../src/exports/contract.ts | 5 + .../hyperdrive-js-core/src/exports/errors.ts | 3 + .../src/exports/factory/index.ts | 2 + .../src/exports/factory/model.ts | 5 + .../src/exports/factory/rest.ts | 1 + .../src/exports/hyperdrive/index.ts | 2 + .../src/exports/hyperdrive/model.ts | 40 ++ .../src/exports/hyperdrive/rest.ts | 34 + .../hyperdrive-js-core/src/exports/index.ts | 173 +---- .../hyperdrive-js-core/src/exports/model.ts | 10 + .../src/exports/registry/index.ts | 2 + .../src/exports/registry/model.ts | 8 + .../src/exports/registry/rest.ts | 1 + .../src/exports/token/index.ts | 2 + .../src/exports/token/model.ts | 34 + .../src/exports/token/rest.ts | 19 + .../hyperdrive-js-core/src/exports/utils.ts | 13 + .../src/exports/v1.0.14/hyperdrive/index.ts | 1 + .../hyperdrive/model.ts} | 3 + .../src/exports/v1.0.14/index.ts | 1 + .../src/factory/ReadFactory.ts | 26 +- .../src/factory/ReadWriteFactory.ts | 26 +- .../hyperdrive/base/ReadHyperdrive.test.ts | 623 ++++++++++-------- .../src/hyperdrive/base/ReadHyperdrive.ts | 138 ++-- .../hyperdrive/base/ReadWriteHyperdrive.ts | 154 ++--- .../base/testing/setupReadHyperdrive.ts | 37 +- .../base/v1.0.14/ReadHyperdrive_v1_0_14.ts | 2 +- .../erc4626/ReadErc4626Hyperdrive.ts | 10 +- .../erc4626/ReadMockErc4626Hyperdrive.ts | 16 +- .../erc4626/ReadWriteErc4626Hyperdrive.ts | 14 +- .../erc4626/ReadWriteMockErc4626Hyperdrive.ts | 14 +- .../hyperdrive/ezeth/ReadEzEthHyperdrive.ts | 29 +- .../ezeth/ReadWriteEzEthHyperdrive.ts | 24 +- .../src/hyperdrive/getHyperdrive.ts | 101 --- .../hyperdrive/lseth/ReadLsEthHyperdrive.ts | 15 +- .../lseth/ReadWriteLsEthHyperdrive.ts | 17 +- .../metamorpho/ReadMetaMorphoHyperdrive.ts | 56 ++ .../ReadWriteMetaMorphoHyperdrive.ts | 26 + .../src/hyperdrive/metamorpho/abi.ts | 61 ++ .../ReadMetaMorphoHyperdrive_v1_0_14.ts | 6 + .../src/hyperdrive/reth/ReadREthHyperdrive.ts | 15 +- .../reth/ReadWriteREthHyperdrive.ts | 11 +- .../hyperdrive/steth/ReadStEthHyperdrive.ts | 32 +- .../steth/ReadWriteStEthHyperdrive.ts | 31 +- .../ReadClient.ts => model/ReadModel.ts} | 49 +- .../src/model/ReadWriteModel.ts | 33 + packages/hyperdrive-js-core/src/pool/types.ts | 2 +- .../src/registry/ReadRegistry.ts | 41 +- .../src/registry/ReadWriteRegistry.ts | 37 +- .../hyperdrive-js-core/src/registry/types.ts | 9 +- .../hyperdrive-js-core/src/token/ReadToken.ts | 6 +- .../src/token/ReadWriteToken.ts | 10 +- .../src/token/erc20/ReadErc20.ts | 28 +- .../src/token/erc20/ReadWriteErc20.ts | 27 +- .../src/token/erc4626/ReadErc4626.ts | 16 +- .../src/token/erc4626/ReadMockErc4626.ts | 16 +- .../src/token/erc4626/ReadWriteErc4626.ts | 4 +- .../src/token/erc4626/ReadWriteMockErc4626.ts | 7 +- .../src/token/eth/ReadEth.ts | 13 +- .../src/token/eth/ReadWriteEth.ts | 8 +- .../src/token/lseth/ReadLsEth.ts | 14 +- .../src/token/lseth/ReadWriteLsEth.ts | 4 +- .../src/token/reth/ReadREth.ts | 14 +- .../src/token/reth/ReadWriteREth.ts | 4 +- .../src/token/steth/ReadStEth.ts | 16 +- .../src/token/steth/ReadWriteStEth.ts | 4 +- packages/hyperdrive-js-core/tsup.config.ts | 41 +- yarn.lock | 19 +- 80 files changed, 1534 insertions(+), 1102 deletions(-) delete mode 100644 packages/hyperdrive-js-core/src/drift/ContractClient.ts delete mode 100644 packages/hyperdrive-js-core/src/drift/ReadWriteClient.ts create mode 100644 packages/hyperdrive-js-core/src/evm-client/contractFactory.ts create mode 100644 packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts create mode 100644 packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts rename packages/hyperdrive-js-core/src/{drift => evm-client/utils}/getBlockOrThrow.ts (61%) create mode 100644 packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts create mode 100644 packages/hyperdrive-js-core/src/exports/contract.ts create mode 100644 packages/hyperdrive-js-core/src/exports/errors.ts create mode 100644 packages/hyperdrive-js-core/src/exports/factory/index.ts create mode 100644 packages/hyperdrive-js-core/src/exports/factory/model.ts create mode 100644 packages/hyperdrive-js-core/src/exports/factory/rest.ts create mode 100644 packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts create mode 100644 packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts create mode 100644 packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts create mode 100644 packages/hyperdrive-js-core/src/exports/model.ts create mode 100644 packages/hyperdrive-js-core/src/exports/registry/index.ts create mode 100644 packages/hyperdrive-js-core/src/exports/registry/model.ts create mode 100644 packages/hyperdrive-js-core/src/exports/registry/rest.ts create mode 100644 packages/hyperdrive-js-core/src/exports/token/index.ts create mode 100644 packages/hyperdrive-js-core/src/exports/token/model.ts create mode 100644 packages/hyperdrive-js-core/src/exports/token/rest.ts create mode 100644 packages/hyperdrive-js-core/src/exports/utils.ts create mode 100644 packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts rename packages/hyperdrive-js-core/src/exports/{v1.0.14.ts => v1.0.14/hyperdrive/model.ts} (92%) create mode 100644 packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts delete mode 100644 packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts create mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts create mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts create mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts create mode 100644 packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts rename packages/hyperdrive-js-core/src/{drift/ReadClient.ts => model/ReadModel.ts} (51%) create mode 100644 packages/hyperdrive-js-core/src/model/ReadWriteModel.ts diff --git a/packages/hyperdrive-js-core/package.json b/packages/hyperdrive-js-core/package.json index 6f520313f..e33b074d3 100644 --- a/packages/hyperdrive-js-core/package.json +++ b/packages/hyperdrive-js-core/package.json @@ -11,18 +11,17 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "@delvtech/drift": "^0.0.1-beta.11" + "@delvtech/evm-client": "^0.5.1" }, "dependencies": { "@delvtech/fixed-point-wasm": "^0.0.6", "@delvtech/hyperdrive-artifacts": "^1.0.18", "@delvtech/hyperdrive-wasm": "^0.15.3", "lodash.groupby": "^4.6.0", - "lodash.mapvalues": "^4.6.0", - "semver": "^7.6.3" + "lodash.mapvalues": "^4.6.0" }, "devDependencies": { - "@delvtech/drift": "^0.0.1-beta.11", + "@delvtech/evm-client": "^0.5.1", "@hyperdrive/eslint-config": "*", "@hyperdrive/prettier-config": "*", "@hyperdrive/tsconfig": "*", @@ -48,13 +47,47 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "default": "./dist/index.js", - "require": "./dist/index.cjs" + "default": "./dist/index.js" + }, + "./factory/*": { + "types": "./dist/factory/*.d.ts", + "default": "./dist/factory/*.js" + }, + "./hyperdrive/*": { + "types": "./dist/hyperdrive/*.d.ts", + "default": "./dist/hyperdrive/*.js" + }, + "./registry/*": { + "types": "./dist/registry/*.d.ts", + "default": "./dist/registry/*.js" + }, + "./token/*": { + "types": "./dist/token/*.d.ts", + "default": "./dist/token/*.js" + }, + "./contract": { + "types": "./dist/contract.d.ts", + "default": "./dist/contract.js" + }, + "./errors": { + "types": "./dist/errors.d.ts", + "default": "./dist/errors.js" + }, + "./model": { + "types": "./dist/model.d.ts", + "default": "./dist/model.js" + }, + "./utils": { + "types": "./dist/utils.d.ts", + "default": "./dist/utils.js" }, "./v1.0.14": { - "types": "./dist/v1.0.14.d.ts", - "default": "./dist/v1.0.14.js", - "require": "./dist/v1.0.14.cjs" + "types": "./dist/v1.0.14/index.d.ts", + "default": "./dist/v1.0.14/index.js" + }, + "./v1.0.14/*": { + "types": "./dist/v1.0.14/*.d.ts", + "default": "./dist/v1.0.14/*.js" }, "./package.json": "./package.json" }, diff --git a/packages/hyperdrive-js-core/src/base/types.ts b/packages/hyperdrive-js-core/src/base/types.ts index 13e33b13b..f00061a6a 100644 --- a/packages/hyperdrive-js-core/src/base/types.ts +++ b/packages/hyperdrive-js-core/src/base/types.ts @@ -1,3 +1,11 @@ +/** + * Combines members of an intersection into a readable type. + * @see https://twitter.com/mattpocockuk/status/1622730173446557697?s=20&t=NdpAcmEFXY01xkqU3KO0Mg + */ +export type Prettify = { + [K in keyof T]: T[K]; +} & unknown; + /** * A generic constructor type. */ @@ -5,3 +13,86 @@ export type Constructor< TInstanceType = any, TArgs extends any[] = any[], > = new (...args: TArgs) => TInstanceType; + +/** + * Overrides properties of `T` with properties of `U`. + */ +export type Override = Prettify & U>; + +/** + * Convert members of a union to an intersection. + * + * @example + * ```ts + * type Union = { a: number } | { b: string }; + * type Intersection = UnionToIntersection; + * // { a: number } & { b: string } + * ``` + * + * @privateRemarks + * This works by taking advantage of [distributive conditional + * types](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types), + * which allows conditional types to be applied to each member of a union type + * individually, and [contravarience in function argument + * types](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-6.html#strict-function-types). + * + * The conditional type `T extends any ? (x: T) => any : never` is used to + * create a function type for each member of the union that takes the member as + * an argument. + * + * Then, the union of function types is checked to see if it can be assigned to + * a single function type with an inferred argument type. TypeScript infers the + * argument type as the intersection of the union members since it's the only + * argument type that satisfies all members of the function type union. + */ +type UnionToIntersection = ( + T extends any ? (member: T) => any : never +) extends (member: infer R) => any + ? R + : never; + +/** + * Merge the keys of a union or intersection of objects into a single type. + * + * @example + * ```ts + * type GetBlockOptions = { + * includeTransactions?: boolean | undefined + * } & ( + * | { + * blockHash?: string | undefined; + * blockNumber?: never | undefined; + * blockTag?: never | undefined; + * } + * | { + * blockHash?: never | undefined; + * blockNumber?: bigint | undefined; + * blockTag?: never | undefined; + * } + * | { + * blockHash?: never | undefined; + * blockNumber?: never | undefined; + * blockTag?: string | undefined; + * } + * ) + * + * type Merged = MergeKeys; + * // { + * // includeTransactions?: boolean | undefined; + * // blockHash?: string | undefined; + * // blockNumber?: bigint | undefined; + * // blockTag?: string | undefined; + * // } + * ``` + */ +export type MergeKeys = + UnionToIntersection extends infer I + ? { + // Each key of the intersection is first checked against the union type, + // T. If it exists in every member of T, then T[K] will be a union of + // the value types. Otherwise, I[K] is used. I[K] is the value type of + // the key in the intersection which will be `never` for keys with + // conflicting value types. + [K in keyof I]: K extends keyof T ? T[K] : I[K]; + } + : never; diff --git a/packages/hyperdrive-js-core/src/checkpoint/types.ts b/packages/hyperdrive-js-core/src/checkpoint/types.ts index 12189c98b..2f3124768 100644 --- a/packages/hyperdrive-js-core/src/checkpoint/types.ts +++ b/packages/hyperdrive-js-core/src/checkpoint/types.ts @@ -1,18 +1,18 @@ import { - ContractEvent, ContractReadOptions, + Event, FunctionReturn, - Pretty, -} from "@delvtech/drift"; +} from "@delvtech/evm-client"; +import { Prettify } from "src/base/types"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; -export type Checkpoint = Pretty< +export type Checkpoint = Prettify< { checkpointTime: bigint; } & FunctionReturn >; -export type CheckpointEvent = ContractEvent; +export type CheckpointEvent = Event; export type GetCheckpointTimeParams = ( | { diff --git a/packages/hyperdrive-js-core/src/drift/ContractClient.ts b/packages/hyperdrive-js-core/src/drift/ContractClient.ts deleted file mode 100644 index 735b64c52..000000000 --- a/packages/hyperdrive-js-core/src/drift/ContractClient.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { SimpleCache } from "@delvtech/drift"; -import { Address } from "abitype"; -import { ReadClientOptions } from "src/drift/ReadClient"; -import { ReadWriteClientOptions } from "src/drift/ReadWriteClient"; - -/** - * Additional options required for clients that represent a specific contract. - */ -export interface ContractClientOptions { - /** - * The address of the contract. - */ - address: Address; - - /** - * The cache to use for the contract. - */ - cache?: SimpleCache; - - /** - * The namespace to use for the cache. - */ - cacheNamespace?: PropertyKey; -} - -export interface ReadContractClientOptions - extends ReadClientOptions, - ContractClientOptions {} - -export interface ReadWriteContractClientOptions - extends ReadWriteClientOptions, - ContractClientOptions {} diff --git a/packages/hyperdrive-js-core/src/drift/ReadWriteClient.ts b/packages/hyperdrive-js-core/src/drift/ReadWriteClient.ts deleted file mode 100644 index fe7cefb63..000000000 --- a/packages/hyperdrive-js-core/src/drift/ReadWriteClient.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Drift, ReadWriteAdapter } from "@delvtech/drift"; -import { ReadClient, ReadClientOptions } from "src/drift/ReadClient"; - -/** - * The base options required for all read-write clients. - */ -export interface ReadWriteClientOptions extends ReadClientOptions { - drift: Drift; -} - -/** - * A base class for read-write clients. - */ -export class ReadWriteClient extends ReadClient { - declare drift: Drift; - - constructor(options: ReadWriteClientOptions) { - super(options); - } -} diff --git a/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts b/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts index 62f20885d..7c6279a53 100644 --- a/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts +++ b/packages/hyperdrive-js-core/src/errors/BlockNotFoundError.ts @@ -1,4 +1,4 @@ -import { NetworkGetBlockOptions } from "@delvtech/drift"; +import { NetworkGetBlockOptions } from "@delvtech/evm-client"; import { HyperdriveSdkError } from "./HyperdriveSdkError"; export class BlockNotFoundError extends HyperdriveSdkError { diff --git a/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts b/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts index 34c045c60..c83978911 100644 --- a/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts +++ b/packages/hyperdrive-js-core/src/errors/HyperdriveSdkError.ts @@ -1,11 +1,6 @@ -import { DriftError } from "@delvtech/drift"; - -export class HyperdriveSdkError extends DriftError { - constructor(message: string, options?: ErrorOptions) { - super(message, { - ...options, - prefix: "ᛋ ", - name: "Hyperdrive SDK Error", - }); +export class HyperdriveSdkError extends Error { + constructor(...[message, options]: Parameters) { + super(message, options); + this.name = "HyperdriveSdkError"; } } diff --git a/packages/hyperdrive-js-core/src/evm-client/contractFactory.ts b/packages/hyperdrive-js-core/src/evm-client/contractFactory.ts new file mode 100644 index 000000000..1c670754e --- /dev/null +++ b/packages/hyperdrive-js-core/src/evm-client/contractFactory.ts @@ -0,0 +1,27 @@ +import { + CachedReadContract, + CachedReadWriteContract, + SimpleCache, +} from "@delvtech/evm-client"; +import { Abi } from "abitype"; + +export interface ContractFactoryOptions { + abi: TAbi; + address: `0x${string}`; + cache?: SimpleCache; + namespace?: string; +} + +/** + * A factory function that creates a `CachedReadContract` instance. + */ +export type ReadContractFactory = ( + options: ContractFactoryOptions, +) => CachedReadContract; + +/** + * A factory function that creates a `CachedReadWriteContract` instance. + */ +export type ReadWriteContractFactory = ( + options: ContractFactoryOptions, +) => CachedReadWriteContract; diff --git a/packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts b/packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts new file mode 100644 index 000000000..efa681d87 --- /dev/null +++ b/packages/hyperdrive-js-core/src/evm-client/syncCacheWithTransaction.ts @@ -0,0 +1,85 @@ +import { + CachedReadWriteContract, + ContractReadOptions, + FunctionArgs, + FunctionName, +} from "@delvtech/evm-client"; +import { Abi } from "abitype"; + +/** + * Clears the cache and calls the transaction handlers provided to a "Write" + * method on any CachedReadWriteContract class. + * + * This decorator accepts an argument of cache keys to clear. By default it will + * clear the entire cache. + * + * @example + * ```ts + * class ReadWriteFooBar extends CachedReadWriteContract { + * + * // Listen for tx complete and clear the entire cache + * @syncCacheWithTransaction() + * setFoo() { + * return this.contract.write("setFoo", []); + * } + * + * // Listen for tx complete and clear a partial or specific cache entry + * @syncCacheWithTransaction({ cacheEntries: [{ functionName: "getBar" }]}) + * setBar() { + * return this.contract.write("setBar", []); + * } + * } + * ``` + * + * @internal + */ +export function syncCacheWithTransaction(options?: { + cacheEntries?: { + functionName?: FunctionName; + args?: FunctionArgs>; + options?: ContractReadOptions; + }[]; +}) { + return function ( + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any + target: any, + propertyKey: string, + descriptor: PropertyDescriptor, + ): void { + const originalMethod = descriptor.value; + + // Wrap the original method in a function that does the transaction + // side-effects we want after the tx completes + // eslint-disable-next-line @typescript-eslint/no-explicit-any + descriptor.value = async function (...args: any[]) { + // Access the target class instance from within a decorator + // @ts-expect-error The `this` keyword will be the target class instance + const network = this.network; + // @ts-expect-error The `this` keyword will be the target class instance + const contract = this.contract as CachedReadWriteContract; + + // call the original function and await the hash + const hash = await originalMethod.apply(this, args); + + // Dont await this part, we want it to happen in the background once the + // tx is completed + network.waitForTransaction(hash).then(() => { + if (options?.cacheEntries) { + options.cacheEntries.forEach((cacheKey) => { + return contract.deleteReadsMatching( + cacheKey.functionName, + cacheKey.args, + cacheKey.options, + ); + }); + } else { + contract.clearCache(); + } + args[0]?.onTransactionCompleted?.(hash); + }); + + // Return the original method's result hash + return hash; + }; + }; +} diff --git a/packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts b/packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts new file mode 100644 index 000000000..d5119604d --- /dev/null +++ b/packages/hyperdrive-js-core/src/evm-client/utils/getBlockFromReadOptions.ts @@ -0,0 +1,13 @@ +import { BlockTag, ContractReadOptions } from "@delvtech/evm-client"; + +// TODO: Move this to @delvtech/evm-client +export type BlockLike = BlockTag | bigint; + +/** + * Extracts a block number or block tag from a `ContractReadOptions` object. + */ +export function getBlockFromReadOptions( + options?: ContractReadOptions, +): BlockLike | undefined { + return options?.blockNumber || options?.blockTag; +} diff --git a/packages/hyperdrive-js-core/src/drift/getBlockOrThrow.ts b/packages/hyperdrive-js-core/src/evm-client/utils/getBlockOrThrow.ts similarity index 61% rename from packages/hyperdrive-js-core/src/drift/getBlockOrThrow.ts rename to packages/hyperdrive-js-core/src/evm-client/utils/getBlockOrThrow.ts index d354c93ca..7343d180a 100644 --- a/packages/hyperdrive-js-core/src/drift/getBlockOrThrow.ts +++ b/packages/hyperdrive-js-core/src/evm-client/utils/getBlockOrThrow.ts @@ -1,13 +1,6 @@ -import { - Block, - ContractReadOptions, - Drift, - GetBlockParams, -} from "@delvtech/drift"; +import { Block, Network, NetworkGetBlockOptions } from "@delvtech/evm-client"; import { BlockNotFoundError } from "src/errors/BlockNotFoundError"; -export type GetBlockOrThrowParams = GetBlockParams & ContractReadOptions; - /** * A utility that tries to fetch a block from a given network and throws an * error if no block is found. Useful for unified error handling when fetching @@ -15,10 +8,10 @@ export type GetBlockOrThrowParams = GetBlockParams & ContractReadOptions; * @throws `BlockNotFoundError` */ export async function getBlockOrThrow( - drift: Drift, - options?: GetBlockOrThrowParams, + network: Network, + options?: NetworkGetBlockOptions, ): Promise { - const fetched = await drift.getBlock(options); + const fetched = await network.getBlock(options); if (!fetched) { throw new BlockNotFoundError(options); } diff --git a/packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts b/packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts new file mode 100644 index 000000000..26057a907 --- /dev/null +++ b/packages/hyperdrive-js-core/src/evm-client/utils/isReadWriteContract.ts @@ -0,0 +1,12 @@ +import { + CachedReadContract, + CachedReadWriteContract, +} from "@delvtech/evm-client"; + +// TODO: Consider better type checking if more use cases arise, possibly with a +// library like zod. +export function isReadWriteContract( + contract: CachedReadContract | CachedReadWriteContract, +): contract is CachedReadWriteContract { + return "write" in contract; +} diff --git a/packages/hyperdrive-js-core/src/exports/contract.ts b/packages/hyperdrive-js-core/src/exports/contract.ts new file mode 100644 index 000000000..0d319d3e3 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/contract.ts @@ -0,0 +1,5 @@ +export type { + ContractFactoryOptions, + ReadContractFactory, + ReadWriteContractFactory, +} from "src/evm-client/contractFactory"; diff --git a/packages/hyperdrive-js-core/src/exports/errors.ts b/packages/hyperdrive-js-core/src/exports/errors.ts new file mode 100644 index 000000000..d12be0f93 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/errors.ts @@ -0,0 +1,3 @@ +export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; +export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; +export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; diff --git a/packages/hyperdrive-js-core/src/exports/factory/index.ts b/packages/hyperdrive-js-core/src/exports/factory/index.ts new file mode 100644 index 000000000..29cd2058f --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/factory/index.ts @@ -0,0 +1,2 @@ +export * from "./model"; +export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/factory/model.ts b/packages/hyperdrive-js-core/src/exports/factory/model.ts new file mode 100644 index 000000000..bdbe55aea --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/factory/model.ts @@ -0,0 +1,5 @@ +export { ReadFactory, type ReadFactoryOptions } from "src/factory/ReadFactory"; +export { + ReadWriteFactory, + type ReadWriteFactoryOptions, +} from "src/factory/ReadWriteFactory"; diff --git a/packages/hyperdrive-js-core/src/exports/factory/rest.ts b/packages/hyperdrive-js-core/src/exports/factory/rest.ts new file mode 100644 index 000000000..05e2b407a --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/factory/rest.ts @@ -0,0 +1 @@ +export { factoryAbi, type FactoryAbi } from "src/factory/abi"; diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts new file mode 100644 index 000000000..29cd2058f --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/hyperdrive/index.ts @@ -0,0 +1,2 @@ +export * from "./model"; +export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts new file mode 100644 index 000000000..a0cfcf284 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/hyperdrive/model.ts @@ -0,0 +1,40 @@ +export { + ReadHyperdrive, + type ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +export { + ReadWriteHyperdrive, + type ReadWriteHyperdriveOptions, +} from "src/hyperdrive/base/ReadWriteHyperdrive"; + +// erc-4626 +export { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; +export { ReadMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive"; +export { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; +export { ReadWriteMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive"; + +// ezeth +export { ReadEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; +export { ReadWriteEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive"; + +// lseth +export { ReadLsEthHyperdrive } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; +export { ReadWriteLsEthHyperdrive } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; + +// morpho +export { ReadMetaMorphoHyperdrive } from "src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive"; +export { ReadWriteMetaMorphoHyperdrive } from "src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive"; + +// reth +export { ReadREthHyperdrive } from "src/hyperdrive/reth/ReadREthHyperdrive"; +export { ReadWriteREthHyperdrive } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; + +// steth +export { + ReadStEthHyperdrive, + type ReadStEthHyperdriveOptions, +} from "src/hyperdrive/steth/ReadStEthHyperdrive"; +export { + ReadWriteStEthHyperdrive, + type ReadWriteStEthHyperdriveOptions, +} from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; diff --git a/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts b/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts new file mode 100644 index 000000000..55a51a6e8 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/hyperdrive/rest.ts @@ -0,0 +1,34 @@ +export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/base/abi"; + +// ezeth +export { + ezEthHyperdriveAbi, + type EzEthHyperdriveAbi, +} from "src/hyperdrive/ezeth/abi"; + +// morpho +export { + metaMorphoSnippetsABI, + type MetaMorphoSnippetsABI, +} from "src/hyperdrive/metamorpho/abi"; + +// pool +export type { PoolConfig, PoolInfo } from "src/pool/types"; + +// shorts +export type { ClosedShort, OpenShort, Short } from "src/shorts/types"; + +// longs +export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; +export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; +export type { + ClosedLong, + Long, + OpenLongPositionReceived, +} from "src/longs/types"; + +// lp +export type { ClosedLpShares } from "src/lp/ClosedLpShares"; + +// withdrawal shares +export type { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; diff --git a/packages/hyperdrive-js-core/src/exports/index.ts b/packages/hyperdrive-js-core/src/exports/index.ts index 130e054af..8fd78ac3a 100644 --- a/packages/hyperdrive-js-core/src/exports/index.ts +++ b/packages/hyperdrive-js-core/src/exports/index.ts @@ -1,165 +1,8 @@ -// Hyperdrive // - -export { - getHyperdrive, - type Hyperdrive, - type HyperdriveOptions, -} from "src/hyperdrive/getHyperdrive"; - -export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/base/abi"; -export { - ReadHyperdrive, - type ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; -export { - ReadWriteHyperdrive, - type ReadWriteHyperdriveOptions, -} from "src/hyperdrive/base/ReadWriteHyperdrive"; - -// erc-4626 -export { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; -export { ReadMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive"; -export { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; -export { ReadWriteMockErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive"; - -// ezeth -export { - ezEthHyperdriveAbi, - type EzEthHyperdriveAbi, -} from "src/hyperdrive/ezeth/abi"; -export { ReadEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; -export { ReadWriteEzEthHyperdrive } from "src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive"; - -// lseth -export { ReadLsEthHyperdrive } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; -export { ReadWriteLsEthHyperdrive } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; - -// reth -export { ReadREthHyperdrive } from "src/hyperdrive/reth/ReadREthHyperdrive"; -export { ReadWriteREthHyperdrive } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; - -// steth -export { - ReadStEthHyperdrive, - type ReadStEthHyperdriveOptions, -} from "src/hyperdrive/steth/ReadStEthHyperdrive"; -export { - ReadWriteStEthHyperdrive, - type ReadWriteStEthHyperdriveOptions, -} from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; - -export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; - -// pool -export type { PoolConfig, PoolInfo } from "src/pool/types"; - -// shorts -export type { ClosedShort, OpenShort, Short } from "src/shorts/types"; - -// longs -export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; -export type { - ClosedLong, - Long, - OpenLongPositionReceived, -} from "src/longs/types"; - -// lp -export type { ClosedLpShares } from "src/lp/ClosedLpShares"; - -// withdrawal shares -export type { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; - -// Registry // - -export { registryAbi, type RegistryAbi } from "src/registry/abi"; -export { - ReadRegistry, - type ReadRegistryOptions, -} from "src/registry/ReadRegistry"; -export { - ReadWriteRegistry, - type ReadWriteRegistryOptions, -} from "src/registry/ReadWriteRegistry"; - -// Factory // - -export { factoryAbi, type FactoryAbi } from "src/factory/abi"; -export { ReadFactory, type ReadFactoryOptions } from "src/factory/ReadFactory"; -export { - ReadWriteFactory, - type ReadWriteFactoryOptions, -} from "src/factory/ReadWriteFactory"; - -// Token // - -export type { ReadToken } from "src/token/ReadToken"; -export type { ReadWriteToken } from "src/token/ReadWriteToken"; - -// eth -export { ReadEth, type ReadEthOptions } from "src/token/eth/ReadEth"; -export { - ReadWriteEth, - type ReadWriteEthOptions, -} from "src/token/eth/ReadWriteEth"; - -// erc-20 -export { erc20Abi, type Erc20Abi } from "src/token/erc20/abi"; -export { ReadErc20, type ReadErc20Options } from "src/token/erc20/ReadErc20"; -export { - ReadWriteErc20, - type ReadWriteErc20Options, -} from "src/token/erc20/ReadWriteErc20"; - -// erc-4626 -export { - erc4626Abi, - mockErc4626Abi, - type Erc4626Abi, - type MockErc4626Abi, -} from "src/token/erc4626/abi"; -export { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; -export { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; -export { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; -export { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; - -// lseth -export { lsEthAbi, type LsEthAbi } from "src/token/lseth/abi"; -export { ReadLsEth } from "src/token/lseth/ReadLsEth"; -export { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; - -// reth -export { rEthAbi, type REthAbi } from "src/token/reth/abi"; -export { ReadREth } from "src/token/reth/ReadREth"; -export { ReadWriteREth } from "src/token/reth/ReadWriteREth"; - -// steth -export { stEthAbi, type StEthAbi } from "src/token/steth/abi"; -export { ReadStEth } from "src/token/steth/ReadStEth"; -export { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; - -// Errors // - -export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; -export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; -export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; - -// Drift // - -export type { - ContractClientOptions, - ReadContractClientOptions, - ReadWriteContractClientOptions, -} from "src/drift/ContractClient"; -export { ReadClient, type ReadClientOptions } from "src/drift/ReadClient"; -export { - ReadWriteClient, - type ReadWriteClientOptions, -} from "src/drift/ReadWriteClient"; - -// Base // - -export { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; -export { getHprFromApr } from "src/base/getHprFromApr"; -export { getHprFromApy } from "src/base/getHprFromApy"; -export type { Constructor } from "src/base/types"; +export * from "./contract"; +export * from "./errors"; +export * from "./factory"; +export * from "./hyperdrive"; +export * from "./model"; +export * from "./registry"; +export * from "./token"; +export * from "./utils"; diff --git a/packages/hyperdrive-js-core/src/exports/model.ts b/packages/hyperdrive-js-core/src/exports/model.ts new file mode 100644 index 000000000..24ba9e724 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/model.ts @@ -0,0 +1,10 @@ +export { + ReadModel, + type ReadContractModelOptions, + type ReadModelOptions, +} from "src/model/ReadModel"; +export { + ReadWriteModel, + type ReadWriteContractModelOptions, + type ReadWriteModelOptions, +} from "src/model/ReadWriteModel"; diff --git a/packages/hyperdrive-js-core/src/exports/registry/index.ts b/packages/hyperdrive-js-core/src/exports/registry/index.ts new file mode 100644 index 000000000..29cd2058f --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/registry/index.ts @@ -0,0 +1,2 @@ +export * from "./model"; +export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/registry/model.ts b/packages/hyperdrive-js-core/src/exports/registry/model.ts new file mode 100644 index 000000000..194822a85 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/registry/model.ts @@ -0,0 +1,8 @@ +export { + ReadRegistry, + type ReadRegistryOptions, +} from "src/registry/ReadRegistry"; +export { + ReadWriteRegistry, + type ReadWriteRegistryOptions, +} from "src/registry/ReadWriteRegistry"; diff --git a/packages/hyperdrive-js-core/src/exports/registry/rest.ts b/packages/hyperdrive-js-core/src/exports/registry/rest.ts new file mode 100644 index 000000000..29e3390b5 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/registry/rest.ts @@ -0,0 +1 @@ +export { registryAbi, type RegistryAbi } from "src/registry/abi"; diff --git a/packages/hyperdrive-js-core/src/exports/token/index.ts b/packages/hyperdrive-js-core/src/exports/token/index.ts new file mode 100644 index 000000000..29cd2058f --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/token/index.ts @@ -0,0 +1,2 @@ +export * from "./model"; +export * from "./rest"; diff --git a/packages/hyperdrive-js-core/src/exports/token/model.ts b/packages/hyperdrive-js-core/src/exports/token/model.ts new file mode 100644 index 000000000..fd8033027 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/token/model.ts @@ -0,0 +1,34 @@ +export type { ReadToken } from "src/token/ReadToken"; +export type { ReadWriteToken } from "src/token/ReadWriteToken"; + +// eth +export { ReadEth, type ReadEthOptions } from "src/token/eth/ReadEth"; +export { + ReadWriteEth, + type ReadWriteEthOptions, +} from "src/token/eth/ReadWriteEth"; + +// erc-20 +export { ReadErc20, type ReadErc20Options } from "src/token/erc20/ReadErc20"; +export { + ReadWriteErc20, + type ReadWriteErc20Options, +} from "src/token/erc20/ReadWriteErc20"; + +// erc-4626 +export { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; +export { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; +export { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; +export { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; + +// lseth +export { ReadLsEth } from "src/token/lseth/ReadLsEth"; +export { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; + +// reth +export { ReadREth } from "src/token/reth/ReadREth"; +export { ReadWriteREth } from "src/token/reth/ReadWriteREth"; + +// steth +export { ReadStEth } from "src/token/steth/ReadStEth"; +export { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; diff --git a/packages/hyperdrive-js-core/src/exports/token/rest.ts b/packages/hyperdrive-js-core/src/exports/token/rest.ts new file mode 100644 index 000000000..317a005ad --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/token/rest.ts @@ -0,0 +1,19 @@ +// erc-20 +export { erc20Abi, type Erc20Abi } from "src/token/erc20/abi"; + +// erc-4626 +export { + erc4626Abi, + mockErc4626Abi, + type Erc4626Abi, + type MockErc4626Abi, +} from "src/token/erc4626/abi"; + +// lseth +export { lsEthAbi, type LsEthAbi } from "src/token/lseth/abi"; + +// reth +export { rEthAbi, type REthAbi } from "src/token/reth/abi"; + +// steth +export { stEthAbi, type StEthAbi } from "src/token/steth/abi"; diff --git a/packages/hyperdrive-js-core/src/exports/utils.ts b/packages/hyperdrive-js-core/src/exports/utils.ts new file mode 100644 index 000000000..0acd4a93c --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/utils.ts @@ -0,0 +1,13 @@ +export { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; +export { getHprFromApr } from "src/base/getHprFromApr"; +export { getHprFromApy } from "src/base/getHprFromApy"; +export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; +export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; + +// types +export type { + Constructor, + MergeKeys, + Override, + Prettify, +} from "src/base/types"; diff --git a/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts b/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts new file mode 100644 index 000000000..b6837c3e2 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/index.ts @@ -0,0 +1 @@ +export * from "./model"; diff --git a/packages/hyperdrive-js-core/src/exports/v1.0.14.ts b/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts similarity index 92% rename from packages/hyperdrive-js-core/src/exports/v1.0.14.ts rename to packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts index ccd7f5935..d041c708d 100644 --- a/packages/hyperdrive-js-core/src/exports/v1.0.14.ts +++ b/packages/hyperdrive-js-core/src/exports/v1.0.14/hyperdrive/model.ts @@ -16,6 +16,9 @@ export { ReadWriteEzEthHyperdrive_v1_0_14 } from "src/hyperdrive/ezeth/v1.0.14/R export { ReadLsEthHyperdrive_v1_0_14 } from "src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14"; export { ReadWriteLsEthHyperdrive_v1_0_14 } from "src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14"; +// morpho +export { ReadMetaMorphoHyperdrive_v1_0_14 } from "src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14"; + // reth export { ReadREthHyperdrive_v1_0_14 } from "src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14"; export { ReadWriteREthHyperdrive_v1_0_14 } from "src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14"; diff --git a/packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts b/packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts new file mode 100644 index 000000000..85fbc6375 --- /dev/null +++ b/packages/hyperdrive-js-core/src/exports/v1.0.14/index.ts @@ -0,0 +1 @@ +export * from "./hyperdrive"; diff --git a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts index dc3812d28..515729686 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadFactory.ts @@ -1,30 +1,29 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Address } from "abitype"; -import { ReadContractClientOptions } from "src/drift/ContractClient"; -import { ReadClient } from "src/drift/ReadClient"; import { FactoryAbi, factoryAbi } from "src/factory/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; -export interface ReadFactoryOptions extends ReadContractClientOptions {} +export interface ReadFactoryOptions extends ReadContractModelOptions {} -export class ReadFactory extends ReadClient { +export class ReadFactory extends ReadModel { address: Address; - contract: Contract; + contract: CachedReadContract; constructor({ debugName = "Hyperdrive Factory", address, cache, - cacheNamespace, - ...rest + namespace, + ...modelOptions }: ReadFactoryOptions) { - super({ debugName, ...rest }); + super({ debugName, ...modelOptions }); this.address = address; - this.contract = this.drift.contract({ + this.contract = this.contractFactory({ abi: factoryAbi, address, cache, - cacheNamespace, + namespace, }); } @@ -99,9 +98,8 @@ export class ReadFactory extends ReadClient { (address) => new ReadHyperdrive({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), ); } diff --git a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts index 04036fbcc..be6f7193c 100644 --- a/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts +++ b/packages/hyperdrive-js-core/src/factory/ReadWriteFactory.ts @@ -1,21 +1,20 @@ import { + CachedReadWriteContract, ContractReadOptions, - Drift, - ReadWriteAdapter, - ReadWriteContract, - ReplaceProps, -} from "@delvtech/drift"; -import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +} from "@delvtech/evm-client"; +import { Override } from "src/base/types"; +import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; import { ReadFactory, ReadFactoryOptions } from "src/factory/ReadFactory"; import { FactoryAbi } from "src/factory/abi"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; export interface ReadWriteFactoryOptions - extends ReplaceProps {} + extends Override {} export class ReadWriteFactory extends ReadFactory { - declare contract: ReadWriteContract; - declare drift: Drift; + declare contract: CachedReadWriteContract; + declare contractFactory: ReadWriteContractFactory; constructor(options: ReadWriteFactoryOptions) { super(options); @@ -26,17 +25,16 @@ export class ReadWriteFactory extends ReadFactory { * deployed by the deployer factory. */ async getInstances( - options?: ContractReadOptions, + options?: ContractReadOptions ): Promise { const hyperdriveAddresses = await this.getInstanceAddresses(options); return hyperdriveAddresses.map( (address) => new ReadWriteHyperdrive({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, - }), + contractFactory: this.contractFactory, + network: this.network, + }) ); } } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts index 881928679..70077a91d 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.test.ts @@ -1,7 +1,6 @@ -import { ZERO_ADDRESS } from "@delvtech/drift"; -import { fixed, parseFixed } from "@delvtech/fixed-point-wasm"; import { ALICE, BOB } from "src/base/testing/accounts"; import { CheckpointEvent } from "src/checkpoint/types"; +import { fixed, parseFixed } from "src/fixed-point"; import { setupReadHyperdrive } from "src/hyperdrive/base/testing/setupReadHyperdrive"; import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; import { @@ -14,7 +13,10 @@ import { assert, expect, test } from "vitest"; test("getVersion should return the parsed version of the contract", async () => { const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.onRead("version").resolves("v1.0.14"); + contract.stubRead({ + functionName: "version", + value: "v1.0.14", + }); const value = await readHyperdrive.getVersion(); expect(value).toEqual({ @@ -32,7 +34,10 @@ test("getPoolConfig should return the PoolConfig from the contract as-is", async const { contract, readHyperdrive } = setupReadHyperdrive(); // stub out the contract call the sdk is going to make - contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig7Days, + }); // The sdk should return the correct data const value = await readHyperdrive.getPoolConfig(); @@ -45,7 +50,10 @@ test("getPoolConfig should return the PoolConfig from the contract as-is", async test("getPoolInfo should return the PoolInfo from the contract as-is", async () => { const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.stubRead({ + functionName: "getPoolInfo", + value: simplePoolInfo, + }); const value = await readHyperdrive.getPoolInfo(); expect(value).toBe(simplePoolInfo); @@ -58,8 +66,14 @@ test("getFixedRate should get the fixed rate as-is", async () => { // These are necessary to stub, but the values won't be used since we stub // calculateAPRFromReserves directly - contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); - contract.onRead("getPoolInfo").resolves(simplePoolInfo); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig7Days, + }); + contract.stubRead({ + functionName: "getPoolInfo", + value: simplePoolInfo, + }); const value = await readHyperdrive.getFixedApr(); expect(value).toBe(50000000000000000n); @@ -68,7 +82,7 @@ test("getFixedRate should get the fixed rate as-is", async () => { test("getTradingVolume should get the trading volume in terms of bonds", async () => { const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.onGetEvents("OpenLong").resolves([ + contract.stubEvents("OpenLong", {}, [ { eventName: "OpenLong", args: { @@ -97,7 +111,7 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }, ]); - contract.onGetEvents("CloseLong").resolves([ + contract.stubEvents("CloseLong", {}, [ { eventName: "CloseLong", args: { @@ -116,7 +130,7 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }, ]); - contract.onGetEvents("OpenShort").resolves([ + contract.stubEvents("OpenShort", {}, [ { eventName: "OpenShort", args: { @@ -147,7 +161,7 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }, ]); - contract.onGetEvents("CloseShort").resolves([]); + contract.stubEvents("CloseShort", {}, []); const value = await readHyperdrive.getTradingVolume(); @@ -159,27 +173,35 @@ test("getTradingVolume should get the trading volume in terms of bonds", async ( }); test("getShortAccruedYield should return the amount of yield a non-mature position has earned", async () => { - const { contract, drift, readHyperdrive } = setupReadHyperdrive(); + const { contract, network, readHyperdrive } = setupReadHyperdrive(); - drift.onGetBlock().resolves({ blockNumber: 1n, timestamp: 100n }); + network.stubGetBlock({ + value: { blockNumber: 1n, timestamp: 100n }, + }); - contract.onRead("getPoolConfig").resolves({ - ...simplePoolConfig7Days, - positionDuration: 86400n, // one day in seconds - checkpointDuration: 86400n, // one day in seconds + contract.stubRead({ + functionName: "getPoolConfig", + value: { + ...simplePoolConfig7Days, + positionDuration: 86400n, // one day in seconds + checkpointDuration: 86400n, // one day in seconds + }, }); // The pool info gives us the current price - contract.onRead("getPoolInfo").resolves({ - ...simplePoolInfo, - vaultSharePrice: parseFixed("1.01").bigint, + contract.stubRead({ + functionName: "getPoolInfo", + value: { ...simplePoolInfo, vaultSharePrice: parseFixed("1.01").bigint }, }); // The checkpoint gives us the price when the bond was opened - contract.onRead("getCheckpoint").resolves({ - vaultSharePrice: parseFixed("1.008").bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, + contract.stubRead({ + functionName: "getCheckpoint", + value: { + vaultSharePrice: parseFixed("1.008").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }, }); const accruedYield = await readHyperdrive.getShortAccruedYield({ @@ -194,28 +216,40 @@ test("getShortAccruedYield should return the amount of yield a non-mature positi }); test("getShortAccruedYield should return the amount of yield a mature position has earned", async () => { - const { drift, contract, readHyperdrive } = setupReadHyperdrive(); - - drift.onGetBlock().resolves({ blockNumber: 1n, timestamp: 1699503565n }); + const { network, contract, readHyperdrive } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves({ - ...simplePoolConfig7Days, - positionDuration: 86400n, // one day in seconds - checkpointDuration: 86400n, // one day in seconds + network.stubGetBlock({ + value: { blockNumber: 1n, timestamp: 1699503565n }, + }); + contract.stubRead({ + functionName: "getPoolConfig", + value: { + ...simplePoolConfig7Days, + positionDuration: 86400n, // one day in seconds + checkpointDuration: 86400n, // one day in seconds + }, }); // This checkpoint gives us the price when the short was opened - contract.onRead("getCheckpoint", { _checkpointTime: 1n }).resolves({ - vaultSharePrice: parseFixed("1.008").bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, + contract.stubRead({ + functionName: "getCheckpoint", + args: { _checkpointTime: 1n }, + value: { + vaultSharePrice: parseFixed("1.008").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }, }); // This checkpoint gives us the price when the shorts matured - contract.onRead("getCheckpoint", { _checkpointTime: 86401n }).resolves({ - vaultSharePrice: parseFixed("1.01").bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, + contract.stubRead({ + functionName: "getCheckpoint", + args: { _checkpointTime: 86401n }, + value: { + vaultSharePrice: parseFixed("1.01").bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }, }); const accruedYield = await readHyperdrive.getShortAccruedYield({ @@ -253,7 +287,7 @@ test("getCheckpointEvents should return an array of CheckpointEvents", async () }, }, ] as CheckpointEvent[]; - contract.onGetEvents("CreateCheckpoint").resolves(checkPointEvents); + contract.stubEvents("CreateCheckpoint", undefined, checkPointEvents); const events = await readHyperdrive.getCheckpointEvents(); @@ -272,7 +306,7 @@ test("getOpenLongs should account for longs opened with base", async () => { const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { eventName: "OpenLong", args: { @@ -304,7 +338,7 @@ test("getOpenLongs should account for longs opened with base", async () => { }, }, ]); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([]); + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, []); const value = await readHyperdrive.getOpenLongs({ account: BOB }); @@ -330,7 +364,7 @@ test("getOpenLongs should account for longs opened with shares", async () => { const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { eventName: "OpenLong", args: { @@ -364,7 +398,7 @@ test("getOpenLongs should account for longs opened with shares", async () => { ]); // Bob has not closed the position at all, these are just stubbed out - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([]); + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, []); const value = await readHyperdrive.getOpenLongs({ account: BOB }); expect(value).toEqual([ @@ -376,7 +410,6 @@ test("getOpenLongs should account for longs opened with shares", async () => { }, ]); }); - test("getOpenLongs should account for longs partially closed to base", async () => { // Description: // Bob opens up a long position over 2 txs in the same checkpoint, for a total @@ -389,7 +422,7 @@ test("getOpenLongs should account for longs partially closed to base", async () const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { eventName: "OpenLong", args: { @@ -422,7 +455,7 @@ test("getOpenLongs should account for longs partially closed to base", async () }, }, ]); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { eventName: "CloseLong", args: { @@ -468,7 +501,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { eventName: "OpenLong", args: { @@ -501,7 +534,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { }, }, ]); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { eventName: "CloseLong", args: { @@ -522,7 +555,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { }, ]); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { eventName: "OpenLong", args: { @@ -556,7 +589,7 @@ test("getOpenLongs should account for longs fully closed to base", async () => { }, ]); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { eventName: "CloseLong", args: { @@ -589,7 +622,7 @@ test("getOpenLongs should handle when user fully closes then re-opens a position const { contract, readHyperdrive } = setupReadHyperdrive(); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { args: { extraData: "0x", @@ -628,7 +661,7 @@ test("getOpenLongs should handle when user fully closes then re-opens a position } as const, ]); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { args: { extraData: "0x", @@ -675,7 +708,7 @@ test("getOpenLongs should account for longs partially closed to shares", async ( const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { eventName: "OpenLong", args: { @@ -693,7 +726,7 @@ test("getOpenLongs should account for longs partially closed to shares", async ( }, ]); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { eventName: "CloseLong", blockNumber: 5n, @@ -738,7 +771,7 @@ test("getOpenLongs should account for longs fully closed to shares", async () => const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("OpenLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("OpenLong", { filter: { trader: BOB } }, [ { eventName: "OpenLong", args: { @@ -757,7 +790,7 @@ test("getOpenLongs should account for longs fully closed to shares", async () => }, ]); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { eventName: "CloseLong", blockNumber: 5n, @@ -787,13 +820,13 @@ test("getOpenLongs should account for longs fully closed to shares", async () => test("getClosedLongs should account for closing out to base", async () => { // Description: // Bob closes a long position of 2 bonds and receives back 2.2 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { eventName: "CloseLong", blockNumber: 5n, @@ -814,7 +847,7 @@ test("getClosedLongs should account for closing out to base", async () => { }, }, ]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getClosedLongs({ account: BOB }); expect(value).toEqual([ { @@ -833,13 +866,13 @@ test("getClosedLongs should account for closing out to shares", async () => { // Bob closes a long position of 2 bonds and receives back 1.9 shares. Shares // are worth 1.1 base at the time he closes, therefore his closed position is // valued at 2.09 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); const eventData = "0x0100000000000000000000000000000000000000000000000000000065d65640000000000000000000000000000000000000000000000001bc82c3277b2dc665"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onGetEvents("CloseLong", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseLong", { filter: { trader: BOB } }, [ { eventName: "CloseLong", blockNumber: 5n, @@ -862,7 +895,7 @@ test("getClosedLongs should account for closing out to shares", async () => { ]); // getBlock gives us the timestamp of when he closed the position - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getClosedLongs({ account: BOB }); expect(value).toEqual([ @@ -882,10 +915,13 @@ test("getOpenShorts should account for shorts opened with base", async () => { // Bob opens up a short position for 100 bonds over 2 txs in the same // checkpoint, for a total cost of around 1.44 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); - contract.onGetEvents("OpenShort", { filter: { trader: BOB } }).resolves([ + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); + contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [ { eventName: "OpenShort", blockNumber: 1n, @@ -918,11 +954,13 @@ test("getOpenShorts should account for shorts opened with base", async () => { }, ]); - contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([]); + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, []); - drift.onGetBlock().resolves({ - timestamp: 1713801432n, - blockNumber: 1n, + network.stubGetBlock({ + value: { + timestamp: 1713801432n, + blockNumber: 1n, + }, }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); @@ -935,7 +973,7 @@ test("getOpenShorts should account for shorts opened with base", async () => { bondAmount: parseFixed("100").bigint, baseProceeds: parseFixed("98.576966043666144584").bigint, fixedRatePaid: parseFixed("0.175635145784387390").bigint, - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", maturity: 1716336000n, openedTimestamp: 1713801432n, }, @@ -947,10 +985,13 @@ test("getOpenShorts should account for shorts opened with shares", async () => { // Bob opens up a short position for 100 bonds over 2 txs in the same // checkpoint, for a total cost of around 1.44 shares. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); - contract.onGetEvents("OpenShort", { filter: { trader: BOB } }).resolves([ + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); + contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [ { eventName: "OpenShort", blockNumber: 1n, @@ -983,11 +1024,13 @@ test("getOpenShorts should account for shorts opened with shares", async () => { }, ]); - contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([]); + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, []); - drift.onGetBlock().resolves({ - timestamp: 1713801432n, - blockNumber: 1n, + network.stubGetBlock({ + value: { + timestamp: 1713801432n, + blockNumber: 1n, + }, }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); @@ -1000,7 +1043,7 @@ test("getOpenShorts should account for shorts opened with shares", async () => { bondAmount: parseFixed("100").bigint, baseProceeds: parseFixed("98.576966043666144584").bigint, fixedRatePaid: parseFixed("0.175635145784387390").bigint, - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", maturity: 1716336000n, openedTimestamp: 1713801432n, }, @@ -1012,9 +1055,12 @@ test("getOpenShorts should account for shorts partially closed to base", async ( // Bob shorts 50 bonds for a total cost of 0.73 base. He then partially // closes this position, redeeming 25 bonds for 0.36 base. As a result, he has 25 // bonds left with a total cost of 0.37 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); const events = [ { @@ -1050,14 +1096,10 @@ test("getOpenShorts should account for shorts partially closed to base", async ( }, ] as const; - contract - .onGetEvents("OpenShort", { filter: { trader: BOB } }) - .resolves([events[0]]); - contract - .onGetEvents("CloseShort", { filter: { trader: BOB } }) - .resolves([events[1]]); + contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([ @@ -1067,7 +1109,7 @@ test("getOpenShorts should account for shorts partially closed to base", async ( baseAmountPaid: parseFixed("0.367919766722905778").bigint, baseProceeds: parseFixed("24.637035274042034163").bigint, checkpointTime: 123454800n, - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", fixedRatePaid: parseFixed("0.179245221000329770").bigint, maturity: 1716336000n, openedTimestamp: 123456789n, @@ -1079,9 +1121,12 @@ test("getOpenShorts should account for shorts fully closed to base", async () => // Description: // Bob opens up a short position, then completely closes this position, As a // result, he no longer has any open short positions. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); const events = [ { @@ -1117,14 +1162,10 @@ test("getOpenShorts should account for shorts fully closed to base", async () => }, ] as const; - contract - .onGetEvents("OpenShort", { filter: { trader: BOB } }) - .resolves([events[0]]); - contract - .onGetEvents("CloseShort", { filter: { trader: BOB } }) - .resolves([events[1]]); + contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([]); @@ -1135,9 +1176,12 @@ test("getOpenShorts should account for shorts partially closed to shares", async // Bob shorts 50 bonds for a total cost of 0.73 base. He then partially // closes this position, redeeming 25 bonds for 0.36 shares. As a result, he // has 25 bonds left with a total cost of 0.37 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); const events = [ { @@ -1173,14 +1217,10 @@ test("getOpenShorts should account for shorts partially closed to shares", async }, ] as const; - contract - .onGetEvents("OpenShort", { filter: { trader: BOB } }) - .resolves([events[0]]); - contract - .onGetEvents("CloseShort", { filter: { trader: BOB } }) - .resolves([events[1]]); + contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([ @@ -1190,7 +1230,7 @@ test("getOpenShorts should account for shorts partially closed to shares", async baseAmountPaid: parseFixed("0.367919766723039831").bigint, baseProceeds: parseFixed("24.637035274042034163").bigint, checkpointTime: 123454800n, - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", fixedRatePaid: parseFixed("0.179245221000329770").bigint, maturity: 1716336000n, openedTimestamp: 123456789n, @@ -1203,9 +1243,12 @@ test("getOpenShorts should account for shorts fully closed to shares", async () // Bob opens up a short position, then completely closes this position, As a // result, he no longer has any open short positions. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); const events = [ { eventName: "OpenShort", @@ -1240,14 +1283,10 @@ test("getOpenShorts should account for shorts fully closed to shares", async () }, ] as const; - contract - .onGetEvents("OpenShort", { filter: { trader: BOB } }) - .resolves([events[0]]); - contract - .onGetEvents("CloseShort", { filter: { trader: BOB } }) - .resolves([events[1]]); + contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [events[0]]); + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getOpenShorts({ account: BOB }); expect(value).toEqual([]); @@ -1259,19 +1298,26 @@ test("getOpenShorts should handle when user fully closes then re-opens a positio // in the same checkpoint, resulting in a single position with new accounting // (ie: the previous loss is not factored in). - const { contract, drift, readHyperdrive } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); + const { contract, network, readHyperdrive } = setupReadHyperdrive(); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); // pool info to get the price of shares at the time he closes the short - contract - .onRead("getPoolInfo", {}, { block: 5n }) - .resolves({ ...simplePoolInfo, vaultSharePrice: parseFixed("1.1").bigint }); + contract.stubRead({ + functionName: "getPoolInfo", + value: { ...simplePoolInfo, vaultSharePrice: parseFixed("1.1").bigint }, + options: { blockNumber: 5n }, + }); // Stub the timestamp so getOpenShorts can construct the checkpoint id - drift.onGetBlock().resolves({ - timestamp: 123456789n, - // this blockNumber is unused, but setting this to 3n, as there should be - // 3 blocks in this test flow - blockNumber: 3n, + network.stubGetBlock({ + value: { + timestamp: 123456789n, + // this blockNumber is unused, but setting this to 3n, as there should be + // 3 blocks in this test flow + blockNumber: 3n, + }, }); const events = [ @@ -1323,13 +1369,12 @@ test("getOpenShorts should handle when user fully closes then re-opens a positio }, ] as const; - contract - .onGetEvents("OpenShort", { filter: { trader: BOB } }) - .resolves([events[0], events[2]]); + contract.stubEvents("OpenShort", { filter: { trader: BOB } }, [ + events[0], + events[2], + ]); - contract - .onGetEvents("CloseShort", { filter: { trader: BOB } }) - .resolves([events[1]]); + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [events[1]]); const value = await readHyperdrive.getOpenShorts({ account: BOB }); @@ -1349,18 +1394,32 @@ test("getOpenShorts should handle when user fully closes then re-opens a positio }); test("getShortBondsGivenDeposit & previewOpenShort should align within a given tolerance", async () => { - const { contract, drift, readHyperdrive } = setupReadHyperdrive(); - contract.onRead("getPoolConfig").resolves(simplePoolConfig30Days); - contract.onRead("getPoolInfo").resolves(simplePoolInfo); - contract.onRead("getCheckpointExposure").resolves(0n); - contract.onRead("getCheckpoint").resolves({ - vaultSharePrice: parseFixed(1.05).bigint, - weightedSpotPrice: 0n, - lastWeightedSpotPriceUpdateTime: 0n, + const { contract, network, readHyperdrive } = setupReadHyperdrive(); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig30Days, + }); + contract.stubRead({ + functionName: "getPoolInfo", + value: simplePoolInfo, }); - drift.onGetBlock().resolves({ - timestamp: 123456789n, - blockNumber: 1n, + contract.stubRead({ + functionName: "getCheckpointExposure", + value: 0n, + }); + contract.stubRead({ + functionName: "getCheckpoint", + value: { + vaultSharePrice: parseFixed(1.05).bigint, + weightedSpotPrice: 0n, + lastWeightedSpotPriceUpdateTime: 0n, + }, + }); + network.stubGetBlock({ + value: { + timestamp: 123456789n, + blockNumber: 1n, + }, }); const targetDeposit = parseFixed(1.123); @@ -1381,14 +1440,17 @@ test("getShortBondsGivenDeposit & previewOpenShort should align within a given t test("getClosedShorts should account for shorts closed to base", async () => { // Description: // Bob completely closes his position, redeeming 100 shorted bonds for 2 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); const eventData = "0x0200000000000000000000000000000000000000000000000000000065d76f800000000000000000000000000000000000000000000000056bc75e2d63100000"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig7Days, + }); - contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [ { eventName: "CloseShort", args: { @@ -1406,7 +1468,7 @@ test("getClosedShorts should account for shorts closed to base", async () => { }, ]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getClosedShorts({ account: BOB }); @@ -1417,7 +1479,7 @@ test("getClosedShorts should account for shorts closed to base", async () => { bondAmount: parseFixed("100").bigint, checkpointTime: 123454800n, closedTimestamp: 123456789n, - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", maturity: 1708617600n, }, ]); @@ -1428,14 +1490,17 @@ test("getClosedShorts should account for shorts closed to shares", async () => { // Bob completely closes his position, redeeming 100 shorted bonds for 1.1 shares. // Shares are worth 1.1 base at the time he closes, therefore his closed position // is valued at 1.21 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); + const { contract, readHyperdrive, network } = setupReadHyperdrive(); const eventData = "0x0200000000000000000000000000000000000000000000000000000065d76f800000000000000000000000000000000000000000000000056bc75e2d63100000"; const { timestamp } = decodeAssetFromTransferSingleEventData(eventData); - contract.onRead("getPoolConfig").resolves(simplePoolConfig7Days); + contract.stubRead({ + functionName: "getPoolConfig", + value: simplePoolConfig7Days, + }); - contract.onGetEvents("CloseShort", { filter: { trader: BOB } }).resolves([ + contract.stubEvents("CloseShort", { filter: { trader: BOB } }, [ { eventName: "CloseShort", blockNumber: 5n, @@ -1454,7 +1519,7 @@ test("getClosedShorts should account for shorts closed to shares", async () => { }, ]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const value = await readHyperdrive.getClosedShorts({ account: BOB }); @@ -1465,7 +1530,7 @@ test("getClosedShorts should account for shorts closed to shares", async () => { bondAmount: parseFixed("100").bigint, checkpointTime: 123454800n, closedTimestamp: 123456789n, - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", maturity: 1708617600n, }, ]); @@ -1478,14 +1543,17 @@ test("getOpenLpPosition should return zero when a position is fully closed", asy // 1 base on this position) Bob is left with 0 LP shares and 0 base paid in his // current LP position. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - contract.onRead("getPoolInfo").resolves(simplePoolInfo); - contract.onSimulateWrite("removeLiquidity").resolves({ + const { contract, readHyperdrive, network } = setupReadHyperdrive(); + contract.stubRead({ + functionName: "getPoolInfo", + value: simplePoolInfo, + }); + contract.stubSimulateWrite("removeLiquidity", { proceeds: parseFixed("100").bigint, withdrawalShares: 0n, }); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 175n }); - contract.onGetEvents("AddLiquidity", { filter: { provider: BOB } }).resolves([ + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 175n } }); + contract.stubEvents("AddLiquidity", { filter: { provider: BOB } }, [ { eventName: "AddLiquidity", blockNumber: 174n, @@ -1501,25 +1569,23 @@ test("getOpenLpPosition should return zero when a position is fully closed", asy }, ]); - contract - .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) - .resolves([ - { - eventName: "RemoveLiquidity", - blockNumber: 175n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("499").bigint, - lpAmount: parseFixed("498").bigint, - lpSharePrice: parseFixed("1.002867781011873985").bigint, - provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", - vaultSharePrice: parseFixed("498.567723245858722697").bigint, - withdrawalShareAmount: 0n, - destination: BOB, - }, + contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ + { + eventName: "RemoveLiquidity", + blockNumber: 175n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("499").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.002867781011873985").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("498.567723245858722697").bigint, + withdrawalShareAmount: 0n, + destination: BOB, }, - ]); + }, + ]); const value = await readHyperdrive.getOpenLpPosition({ account: BOB, @@ -1541,14 +1607,17 @@ test("getOpenLpPosition should return the current lpShareBalance and baseAmountP // receiving 99 LP shares, depositing 100 base. Bob now has with 99 LP // shares and 100 base paid in his current LP position. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 175n }); - contract.onSimulateWrite("removeLiquidity").resolves({ + const { contract, readHyperdrive, network } = setupReadHyperdrive(); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 175n } }); + contract.stubSimulateWrite("removeLiquidity", { proceeds: parseFixed("100").bigint, withdrawalShares: 0n, }); - contract.onRead("getPoolInfo").resolves(simplePoolInfo); - contract.onGetEvents("AddLiquidity", { filter: { provider: BOB } }).resolves([ + contract.stubRead({ + functionName: "getPoolInfo", + value: simplePoolInfo, + }); + contract.stubEvents("AddLiquidity", { filter: { provider: BOB } }, [ { eventName: "AddLiquidity", blockNumber: 174n, @@ -1577,25 +1646,23 @@ test("getOpenLpPosition should return the current lpShareBalance and baseAmountP }, ]); - contract - .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) - .resolves([ - { - eventName: "RemoveLiquidity", - blockNumber: 175n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("499").bigint, - lpAmount: parseFixed("498").bigint, - lpSharePrice: parseFixed("1.002867781011873985").bigint, - provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", - vaultSharePrice: parseFixed("1.0008670371827").bigint, - withdrawalShareAmount: 0n, - destination: BOB, - }, + contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ + { + eventName: "RemoveLiquidity", + blockNumber: 175n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("499").bigint, + lpAmount: parseFixed("498").bigint, + lpSharePrice: parseFixed("1.002867781011873985").bigint, + provider: "0x020a898437E9c9DCdF3c2ffdDB94E759C0DAdFB6", + vaultSharePrice: parseFixed("1.0008670371827").bigint, + withdrawalShareAmount: 0n, + destination: BOB, }, - ]); + }, + ]); const value = await readHyperdrive.getOpenLpPosition({ account: BOB, @@ -1613,29 +1680,27 @@ test("getClosedLpShares should account for LP shares closed to base", async () = // Description: // Bob completely closes his LP position of 5 LP shares and receives back // base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - - contract - .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) - .resolves([ - { - eventName: "RemoveLiquidity", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("10").bigint, - vaultSharePrice: parseFixed("9").bigint, - provider: BOB, - withdrawalShareAmount: 0n, - lpAmount: parseFixed("5").bigint, - lpSharePrice: parseFixed("2").bigint, - destination: BOB, - }, + const { contract, readHyperdrive, network } = setupReadHyperdrive(); + + contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ + { + eventName: "RemoveLiquidity", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("10").bigint, + vaultSharePrice: parseFixed("9").bigint, + provider: BOB, + withdrawalShareAmount: 0n, + lpAmount: parseFixed("5").bigint, + lpSharePrice: parseFixed("2").bigint, + destination: BOB, }, - ]); + }, + ]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const closedLpShares = await readHyperdrive.getClosedLpShares({ account: BOB, @@ -1655,29 +1720,27 @@ test("getClosedLpShares should account for LP shares closed to vault shares", as // Description: // Bob completely closes his LP position of 5 LP shares and receives back // shares. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - - contract - .onGetEvents("RemoveLiquidity", { filter: { provider: BOB } }) - .resolves([ - { - eventName: "RemoveLiquidity", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: false, - amount: parseFixed("9").bigint, - vaultSharePrice: parseFixed("1.1").bigint, - provider: BOB, - withdrawalShareAmount: 0n, - lpAmount: parseFixed("5").bigint, - lpSharePrice: parseFixed("2").bigint, - destination: BOB, - }, + const { contract, readHyperdrive, network } = setupReadHyperdrive(); + + contract.stubEvents("RemoveLiquidity", { filter: { provider: BOB } }, [ + { + eventName: "RemoveLiquidity", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: false, + amount: parseFixed("9").bigint, + vaultSharePrice: parseFixed("1.1").bigint, + provider: BOB, + withdrawalShareAmount: 0n, + lpAmount: parseFixed("5").bigint, + lpSharePrice: parseFixed("2").bigint, + destination: BOB, }, - ]); + }, + ]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const closedLpShares = await readHyperdrive.getClosedLpShares({ account: BOB, @@ -1696,27 +1759,25 @@ test("getClosedLpShares should account for LP shares closed to vault shares", as test("getRedeemedWithdrawalShares should account for withdrawal shares closed to base", async () => { // Description: // Bob completely redeems 5 withdrawal shares and receives 10 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - - contract - .onGetEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }) - .resolves([ - { - eventName: "RedeemWithdrawalShares", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: true, - amount: parseFixed("10").bigint, - vaultSharePrice: parseFixed("9.8").bigint, - provider: BOB, - withdrawalShareAmount: parseFixed("5").bigint, - destination: BOB, - }, + const { contract, readHyperdrive, network } = setupReadHyperdrive(); + + contract.stubEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }, [ + { + eventName: "RedeemWithdrawalShares", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: true, + amount: parseFixed("10").bigint, + vaultSharePrice: parseFixed("9.8").bigint, + provider: BOB, + withdrawalShareAmount: parseFixed("5").bigint, + destination: BOB, }, - ]); + }, + ]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const redeemedWithdrawalShares = await readHyperdrive.getRedeemedWithdrawalShares({ @@ -1724,7 +1785,7 @@ test("getRedeemedWithdrawalShares should account for withdrawal shares closed to }); expect(redeemedWithdrawalShares).toEqual([ { - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", baseAmount: parseFixed("10").bigint, withdrawalShareAmount: parseFixed("5").bigint, redeemedTimestamp: 123456789n, @@ -1734,27 +1795,25 @@ test("getRedeemedWithdrawalShares should account for withdrawal shares closed to test("getRedeemedWithdrawalShares should account for withdrawal shares closed to vault shares", async () => { // Description: // Bob completely redeems 5 withdrawal shares and receives 8 shares that are worth 10 base. - const { contract, readHyperdrive, drift } = setupReadHyperdrive(); - - contract - .onGetEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }) - .resolves([ - { - eventName: "RedeemWithdrawalShares", - blockNumber: 5n, - args: { - extraData: "0x", - asBase: false, - vaultSharePrice: parseFixed("1.25").bigint, - amount: parseFixed("8").bigint, - provider: BOB, - withdrawalShareAmount: parseFixed("5").bigint, - destination: BOB, - }, + const { contract, readHyperdrive, network } = setupReadHyperdrive(); + + contract.stubEvents("RedeemWithdrawalShares", { filter: { provider: BOB } }, [ + { + eventName: "RedeemWithdrawalShares", + blockNumber: 5n, + args: { + extraData: "0x", + asBase: false, + vaultSharePrice: parseFixed("1.25").bigint, + amount: parseFixed("8").bigint, + provider: BOB, + withdrawalShareAmount: parseFixed("5").bigint, + destination: BOB, }, - ]); + }, + ]); - drift.onGetBlock().resolves({ timestamp: 123456789n, blockNumber: 5n }); + network.stubGetBlock({ value: { timestamp: 123456789n, blockNumber: 5n } }); const redeemedWithdrawalShares = await readHyperdrive.getRedeemedWithdrawalShares({ @@ -1762,7 +1821,7 @@ test("getRedeemedWithdrawalShares should account for withdrawal shares closed to }); expect(redeemedWithdrawalShares).toEqual([ { - hyperdriveAddress: ZERO_ADDRESS, + hyperdriveAddress: "0x0000000000000000000000000000000000000000", baseAmount: parseFixed("10").bigint, withdrawalShareAmount: parseFixed("5").bigint, redeemedTimestamp: 123456789n, diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts index 039ce7b8f..4c8b824c1 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadHyperdrive.ts @@ -1,16 +1,16 @@ import { - Address, Block, BlockTag, - ContractEvent, + CachedReadContract, ContractGetEventsOptions, ContractReadOptions, ContractWriteOptions, - MergeKeys, - ReadContract, -} from "@delvtech/drift"; + Event, +} from "@delvtech/evm-client"; +import { Address } from "abitype"; import { assertNever } from "src/base/assertNever"; import { MAX_UINT256, SECONDS_PER_YEAR } from "src/base/constants"; +import { MergeKeys } from "src/base/types"; import { getCheckpointTime } from "src/checkpoint/getCheckpointTime"; import { Checkpoint, @@ -18,10 +18,9 @@ import { GetCheckpointParams, GetCheckpointTimeParams, } from "src/checkpoint/types"; -import { ReadContractClientOptions } from "src/drift/ContractClient"; -import { ReadClient } from "src/drift/ReadClient"; -import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; +import { getBlockFromReadOptions } from "src/evm-client/utils/getBlockFromReadOptions"; +import { getBlockOrThrow } from "src/evm-client/utils/getBlockOrThrow"; import { fixed } from "src/fixed-point"; import { HyperdriveAbi, hyperdriveAbi } from "src/hyperdrive/base/abi"; import { MAX_ITERATIONS, NULL_BYTES } from "src/hyperdrive/constants"; @@ -34,6 +33,7 @@ import { } from "src/longs/types"; import { ClosedLpShares } from "src/lp/ClosedLpShares"; import { LP_ASSET_ID } from "src/lp/assetId"; +import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; import { MarketState, PoolConfig, PoolInfo } from "src/pool/types"; import { calculateShortAccruedYield } from "src/shorts/calculateShortAccruedYield"; @@ -43,11 +43,11 @@ import { ReadEth } from "src/token/eth/ReadEth"; import { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; import { WITHDRAW_SHARES_ASSET_ID } from "src/withdrawalShares/assetId"; -export interface ReadHyperdriveOptions extends ReadContractClientOptions {} +export interface ReadHyperdriveOptions extends ReadContractModelOptions {} -export class ReadHyperdrive extends ReadClient { +export class ReadHyperdrive extends ReadModel { readonly address: Address; - readonly contract: ReadContract; + readonly contract: CachedReadContract; /** * @hidden @@ -56,17 +56,16 @@ export class ReadHyperdrive extends ReadClient { debugName = "Hyperdrive", address, cache, - cacheNamespace, - drift, - ...rest + namespace, + ...modelOptions }: ReadHyperdriveOptions) { - super({ debugName, drift, ...rest }); + super({ debugName, ...modelOptions }); this.address = address; - this.contract = this.drift.contract({ + this.contract = this.contractFactory({ abi: hyperdriveAbi, address, cache, - cacheNamespace, + namespace, }); } @@ -106,13 +105,14 @@ export class ReadHyperdrive extends ReadClient { const address = await this.contract.read("baseToken"); return address === ReadEth.address ? new ReadEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }) : new ReadErc20({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } @@ -127,9 +127,9 @@ export class ReadHyperdrive extends ReadClient { const address = await this.contract.read("vaultSharesToken"); return new ReadErc20({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } @@ -188,7 +188,7 @@ export class ReadHyperdrive extends ReadClient { } const blockNumber = events[0].blockNumber; - return getBlockOrThrow(this.drift, { blockNumber }); + return getBlockOrThrow(this.network, { blockNumber }); } /** @@ -210,7 +210,7 @@ export class ReadHyperdrive extends ReadClient { blockRange: bigint; options?: ContractReadOptions; }): Promise { - const currentBlock = await getBlockOrThrow(this.drift, options); + const currentBlock = await getBlockOrThrow(this.network, options); // Clamp the start block to the pool's initialization block if the // blockRange is too big. let startBlockNumber = currentBlock.blockNumber! - blockRange; @@ -222,13 +222,13 @@ export class ReadHyperdrive extends ReadClient { // NOTE: Cloudchain will throw an error if the block number is too far back // in history. - const startBlock = await getBlockOrThrow(this.drift, { + const startBlock = await getBlockOrThrow(this.network, { blockNumber: startBlockNumber, }); // Get the info from fromBlock to get the starting vault share price const { vaultSharePrice: startVaultSharePrice } = await this.getPoolInfo({ - block: startBlockNumber, + blockNumber: startBlockNumber, }); // Get the current vaultSharePrice from the latest pool info @@ -273,7 +273,7 @@ export class ReadHyperdrive extends ReadClient { if (timestamp === undefined) { // Default to the block from read options const getBlockOptions = blockNumber ? { blockNumber } : options; - const block = await getBlockOrThrow(this.drift, getBlockOptions); + const block = await getBlockOrThrow(this.network, getBlockOptions); timestamp = block.timestamp; } @@ -625,12 +625,9 @@ export class ReadHyperdrive extends ReadClient { ContractGetEventsOptions & ContractGetEventsOptions, ): Promise<{ - addLiquidity: ContractEvent[]; - removeLiquidity: ContractEvent[]; - redeemWithdrawalShares: ContractEvent< - HyperdriveAbi, - "RedeemWithdrawalShares" - >[]; + addLiquidity: Event[]; + removeLiquidity: Event[]; + redeemWithdrawalShares: Event[]; }> { const addLiquidityEvents = await this.contract.getEvents( "AddLiquidity", @@ -677,14 +674,14 @@ export class ReadHyperdrive extends ReadClient { } // Attempt to fetch the blocks first to fail early if the block is not found - const currentBlock = await getBlockOrThrow(this.drift, options); - const startBlock = await getBlockOrThrow(this.drift, { + const currentBlock = await getBlockOrThrow(this.network, options); + const startBlock = await getBlockOrThrow(this.network, { blockNumber: fromBlock, }); // Get the info from fromBlock to get the starting lp share price const { lpSharePrice: startLpSharePrice } = await this.getPoolInfo({ - block: fromBlock, + blockNumber: fromBlock, }); // Get the current lpSharePrice from the latest pool info @@ -715,8 +712,8 @@ export class ReadHyperdrive extends ReadClient { openLongEvents, closeLongEvents, }: { - openLongEvents: ContractEvent[]; - closeLongEvents: ContractEvent[]; + openLongEvents: Event[]; + closeLongEvents: Event[]; }): Long[] { // Put open and long events in block order. We spread openLongEvents first // since you have to open a long before you can close one. @@ -781,13 +778,15 @@ export class ReadHyperdrive extends ReadClient { account: `0x${string}`; options?: ContractReadOptions; }): Promise { + const toBlock = getBlockFromReadOptions(options); + const transfersReceived = await this.contract.getEvents("TransferSingle", { filter: { to: account }, - toBlock: options?.block, + toBlock, }); const transfersSent = await this.contract.getEvents("TransferSingle", { filter: { from: account }, - toBlock: options?.block, + toBlock, }); const longsReceived = transfersReceived.filter((event) => { @@ -920,13 +919,15 @@ export class ReadHyperdrive extends ReadClient { account: `0x${string}`; options?: ContractReadOptions; }): Promise { + const toBlock = getBlockFromReadOptions(options); + const openLongEvents = await this.contract.getEvents("OpenLong", { filter: { trader: account }, - toBlock: options?.block, + toBlock, }); const closeLongEvents = await this.contract.getEvents("CloseLong", { filter: { trader: account }, - toBlock: options?.block, + toBlock, }); return this._calcOpenLongs({ @@ -948,20 +949,22 @@ export class ReadHyperdrive extends ReadClient { account: `0x${string}`; options?: ContractReadOptions; }): Promise { + const toBlock = getBlockFromReadOptions(options); + const { checkpointDuration, positionDuration } = await this.getPoolConfig(options); const openShortEvents = await this.contract.getEvents("OpenShort", { filter: { trader: account }, - toBlock: options?.block, + toBlock, }); const closeShortEvents = await this.contract.getEvents("CloseShort", { filter: { trader: account }, - toBlock: options?.block, + toBlock, }); return this._calcOpenShorts({ - hyperdriveAddress: this.address, + hyperdriveAddress: this.contract.address, checkpointDuration, positionDuration, openShortEvents, @@ -979,8 +982,8 @@ export class ReadHyperdrive extends ReadClient { hyperdriveAddress: Address; checkpointDuration: bigint; positionDuration: bigint; - openShortEvents: ContractEvent[]; - closeShortEvents: ContractEvent[]; + openShortEvents: Event[]; + closeShortEvents: Event[]; }): Promise { // Put open and short events in block order. We spread openShortEvents first // since you have to open a short before you can close one. @@ -992,7 +995,7 @@ export class ReadHyperdrive extends ReadClient { for (const event of orderedShortEvents) { const assetId = event.args.assetId.toString(); - const { timestamp } = await getBlockOrThrow(this.drift, { + const { timestamp } = await getBlockOrThrow(this.network, { blockNumber: event.blockNumber, }); @@ -1070,9 +1073,11 @@ export class ReadHyperdrive extends ReadClient { account: `0x${string}`; options?: ContractReadOptions; }): Promise { + const toBlock = getBlockFromReadOptions(options); + const closedLongs = await this.contract.getEvents("CloseLong", { filter: { trader: account }, - toBlock: options?.block, + toBlock, }); const closedLongsList: ClosedLong[] = await Promise.all( @@ -1090,7 +1095,7 @@ export class ReadHyperdrive extends ReadClient { baseAmountPaid: 0n, // TODO: Remove this field, this is copy/paste from @hyperdrive/queries maturity: event.args.maturityTime, closedTimestamp: ( - await getBlockOrThrow(this.drift, { + await getBlockOrThrow(this.network, { blockNumber: event.blockNumber, }) ).timestamp, @@ -1110,16 +1115,17 @@ export class ReadHyperdrive extends ReadClient { account: `0x${string}`; options?: ContractReadOptions; }): Promise { + const toBlock = getBlockFromReadOptions(options); const closedShorts = await this.contract.getEvents("CloseShort", { filter: { trader: account }, - toBlock: options?.block, + toBlock, }); const { checkpointDuration } = await this.getPoolConfig(options); const closedShortsList: ClosedShort[] = await Promise.all( closedShorts.map(async (event) => { const { assetId, maturityTime } = event.args; - const { timestamp } = await getBlockOrThrow(this.drift, { + const { timestamp } = await getBlockOrThrow(this.network, { blockNumber: event.blockNumber, }); @@ -1128,7 +1134,7 @@ export class ReadHyperdrive extends ReadClient { : fixed(event.args.amount).mul(event.args.vaultSharePrice).bigint; return { - hyperdriveAddress: this.address, + hyperdriveAddress: this.contract.address, assetId, bondAmount: event.args.bondAmount, baseAmountReceived: baseAmount, @@ -1271,15 +1277,16 @@ export class ReadHyperdrive extends ReadClient { baseValue: bigint; sharesValue: bigint; }> { + const toBlock = getBlockFromReadOptions(options); const addLiquidityEvents = await this.contract.getEvents("AddLiquidity", { filter: { provider: account }, - toBlock: options?.block, + toBlock, }); const removeLiquidityEvents = await this.contract.getEvents( "RemoveLiquidity", { filter: { provider: account }, - toBlock: options?.block, + toBlock, }, ); @@ -1345,11 +1352,8 @@ export class ReadHyperdrive extends ReadClient { addLiquidityEvents, removeLiquidityEvents, }: { - addLiquidityEvents: ContractEvent[]; - removeLiquidityEvents: ContractEvent< - typeof hyperdriveAbi, - "RemoveLiquidity" - >[]; + addLiquidityEvents: Event[]; + removeLiquidityEvents: Event[]; }) { const combinedEventsInOrder = [ ...addLiquidityEvents, @@ -1410,7 +1414,7 @@ export class ReadHyperdrive extends ReadClient { "RemoveLiquidity", { filter: { provider: account }, - toBlock: options?.block, + toBlock: getBlockFromReadOptions(options), }, ); return Promise.all( @@ -1433,7 +1437,7 @@ export class ReadHyperdrive extends ReadClient { withdrawalShareAmount, lpSharePrice, closedTimestamp: ( - await getBlockOrThrow(this.drift, { + await getBlockOrThrow(this.network, { blockNumber, }) ).timestamp, @@ -1473,7 +1477,7 @@ export class ReadHyperdrive extends ReadClient { "RedeemWithdrawalShares", { filter: { provider: account }, - toBlock: options?.block, + toBlock: getBlockFromReadOptions(options), }, ); @@ -1485,11 +1489,11 @@ export class ReadHyperdrive extends ReadClient { : fixed(amount).mul(vaultSharePrice).bigint; return { - hyperdriveAddress: this.address, + hyperdriveAddress: this.contract.address, withdrawalShareAmount, baseAmount, redeemedTimestamp: ( - await getBlockOrThrow(this.drift, { blockNumber }) + await getBlockOrThrow(this.network, { blockNumber }) ).timestamp, }; }), diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts index e9b3f7c34..33c8a9c50 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/ReadWriteHyperdrive.ts @@ -1,28 +1,29 @@ import { + CachedReadWriteContract, ContractReadOptions, ContractWriteOptions, - Drift, - ReadWriteAdapter, - ReadWriteContract, -} from "@delvtech/drift"; -import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +} from "@delvtech/evm-client"; +import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; +import { syncCacheWithTransaction } from "src/evm-client/syncCacheWithTransaction"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { NULL_BYTES } from "src/hyperdrive/constants"; +import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; type ReadWriteParams = { args: Args; options?: ContractWriteOptions; + onTransactionCompleted?: (hash: `0x${string}`) => void; }; export interface ReadWriteHyperdriveOptions - extends ReadWriteContractClientOptions {} + extends ReadWriteContractModelOptions {} export class ReadWriteHyperdrive extends ReadHyperdrive { - declare drift: Drift; - declare contract: ReadWriteContract; + declare contract: CachedReadWriteContract; + declare contractFactory: ReadWriteContractFactory; constructor(options: ReadWriteHyperdriveOptions) { super(options); @@ -34,13 +35,14 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { const address = await this.contract.read("baseToken", {}, options); return address === ReadWriteEth.address ? new ReadWriteEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }) : new ReadWriteErc20({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } @@ -48,8 +50,9 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { const address = await this.contract.read("vaultSharesToken"); return new ReadWriteErc20({ address, - drift: this.drift, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } @@ -57,44 +60,38 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * Allows anyone to mint a new checkpoint. * @param time - The time (in seconds) of the checkpoint to create. */ + @syncCacheWithTransaction() async checkpoint({ args: { time }, options, }: ReadWriteParams<{ time: number }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "checkpoint", { _checkpointTime: BigInt(time), _maxIterations: 4n }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** * Allows an authorized address to pause this contract * @param paused - True to pause all deposits and false to unpause them */ + @syncCacheWithTransaction({ + cacheEntries: [{ functionName: "getMarketState" }], + }) async pause({ args: { paused }, options, }: ReadWriteParams<{ paused: boolean; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "pause", { _status: paused }, - { - ...options, - onMined: (receipt) => { - this.contract.invalidateReadsMatching("getMarketState"); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** @@ -108,6 +105,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * blocked. * @returns The initial number of LP shares created. */ + @syncCacheWithTransaction() async initialize({ args: { contribution, @@ -124,7 +122,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "initialize", { _apr: apr, @@ -135,14 +133,9 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { extraData: extraData, }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** @@ -155,6 +148,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @return bondProceeds - The amount of bonds the user received * */ + @syncCacheWithTransaction() async openLong({ args: { destination, @@ -173,7 +167,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "openLong", { _amount: amount, @@ -181,14 +175,9 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minVaultSharePrice: minVaultSharePrice, _options: { destination, asBase, extraData }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** @@ -201,6 +190,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @return maturityTime - The maturity time of the short. * @return traderDeposit - The amount the user deposited for this trade. */ + @syncCacheWithTransaction() async openShort({ args: { destination, @@ -219,7 +209,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "openShort", { _bondAmount: bondAmount, @@ -227,14 +217,9 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minVaultSharePrice: minVaultSharePrice, _options: { destination, asBase, extraData }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** @@ -247,6 +232,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @param options - Contract Write Options * @return The amount of underlying asset the user receives. */ + @syncCacheWithTransaction() async closeLong({ args: { maturityTime, @@ -265,7 +251,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "closeLong", { _maturityTime: maturityTime, @@ -273,14 +259,9 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minOutput: minAmountOut, _options: { destination, asBase, extraData }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** @@ -293,6 +274,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @param options - Contract Write Options * @return The amount of base tokens produced by closing this short */ + @syncCacheWithTransaction() async closeShort({ args: { maturityTime, @@ -311,7 +293,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "closeShort", { _maturityTime: maturityTime, @@ -319,14 +301,9 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _minOutput: minAmountOut, _options: { destination, asBase, extraData }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** @@ -340,6 +317,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @param options - Contract Write Options * @return lpShares The number of LP tokens created */ + @syncCacheWithTransaction() async addLiquidity({ args: { destination, @@ -360,7 +338,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "addLiquidity", { _contribution: contribution, @@ -369,14 +347,9 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { _maxApr: maxApr, _options: { destination, asBase, extraData }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } /** @@ -390,6 +363,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { receives a proportional amount of the pool's idle capital * @returns withdrawShares - The base that the LP receives buys out some of their LP shares, but it may not be sufficient to fully buy the LP out. In this case, the LP receives withdrawal shares equal in value to the present value they are owed. As idle capital becomes available, the pool will buy back these shares. */ + @syncCacheWithTransaction() async removeLiquidity({ args: { destination, @@ -406,21 +380,17 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "removeLiquidity", { _lpShares: lpSharesIn, _minOutputPerShare: minOutputPerShare, _options: { destination, asBase, extraData }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + + return hash; } /** @@ -433,6 +403,7 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { * @return baseProceeds The amount of base the LP received. * @return sharesRedeemed The amount of withdrawal shares that were redeemed. */ + @syncCacheWithTransaction() async redeemWithdrawalShares({ args: { withdrawalSharesIn, @@ -449,20 +420,15 @@ export class ReadWriteHyperdrive extends ReadHyperdrive { asBase?: boolean; extraData?: `0x${string}`; }>): Promise<`0x${string}`> { - return this.contract.write( + const hash = await this.contract.write( "redeemWithdrawalShares", { _withdrawalShares: withdrawalSharesIn, _minOutputPerShare: minOutputPerShare, _options: { destination, asBase, extraData }, }, - { - ...options, - onMined: (receipt) => { - this.contract.cache.clear(); - options?.onMined?.(receipt); - }, - }, + options, ); + return hash; } } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts index 8b438f490..951c875c3 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/testing/setupReadHyperdrive.ts @@ -1,32 +1,41 @@ -import { ZERO_ADDRESS } from "@delvtech/drift"; -import { MockDrift } from "@delvtech/drift/testing"; -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { + CachedReadContract, + createCachedReadContract, +} from "@delvtech/evm-client"; +import { NetworkStub, ReadContractStub } from "@delvtech/evm-client/stubs"; +import { Abi } from "abitype"; +import { ReadHyperdrive_v1_0_14 } from "src/exports/v1.0.14"; +import { HyperdriveAbi } from "src/hyperdrive/base/abi"; // No need to explicitly set return types as they are already set in the Stubs // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export function setupReadHyperdrive() { - const drift = new MockDrift(); + const network = new NetworkStub(); + // TODO: We use the v1.0.14 version of ReadHyperdrive to avoid the need to - // stub every `convertToShares` and `convertToBase` call since drift only + // stub every `convertToShares` and `convertToBase` call since evm-client only // supports stubbing calls with static values. It should be refactored to // support stubbing a call with a function to dynamically calculate the return // value based on arguments and options. const readHyperdrive = new ReadHyperdrive_v1_0_14({ - address: ZERO_ADDRESS, - drift, + address: "0x123", + contractFactory: ({ abi }: { abi: TAbi }) => { + const contract = new ReadContractStub(abi); + return createCachedReadContract({ contract }); + }, + network: network, }); - // The ReadHyperdrive class doesn't infer that the contract is a MockContract, + // The ReadHyperdrive class doesn't infer that the contract is a Stub // so we need to cast it to the correct type. - const contract = drift.contract({ - abi: readHyperdrive.contract.abi, - address: readHyperdrive.contract.address, - }); + const contract = + readHyperdrive.contract as unknown as CachedReadContract & + ReadContractStub; - contract.onRead("decimals").resolves(18); + contract.stubRead({ functionName: "decimals", value: 18 }); return { - drift, contract, + network, readHyperdrive, }; } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts b/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts index 4c03e7e9c..2444d3681 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { fixed } from "src/fixed-point"; import { diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts index 70d851039..379eaea11 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadHyperdrive, @@ -15,7 +15,7 @@ export class ReadErc4626Hyperdrive extends readErc4626HyperdriveMixin( */ export interface ReadErc4626HyperdriveMixin { /** - * Get a client for the tokenized vault for this Hyperdrive instance. + * Get a model of the tokenized vault for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } @@ -38,9 +38,9 @@ export function readErc4626HyperdriveMixin< return new ReadErc4626({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts index ba9c38c47..bc06ca533 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts @@ -1,11 +1,11 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; -import { ReadHyperdriveOptions } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadHyperdriveOptions } from "src/exports"; import { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; import { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; export class ReadMockErc4626Hyperdrive extends readMockErc4626HyperdriveMixin( - ReadErc4626Hyperdrive, + ReadErc4626Hyperdrive ) {} /** @@ -19,7 +19,7 @@ export interface ReadMockErc4626HyperdriveMixin { * @internal */ export function readMockErc4626HyperdriveMixin< - T extends Constructor, + T extends Constructor >(Base: T): Constructor & T { return class extends Base { constructor(...[options]: any[]) { @@ -28,15 +28,15 @@ export function readMockErc4626HyperdriveMixin< } async getSharesToken( - options?: ContractReadOptions, + options?: ContractReadOptions ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadMockErc4626({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts index 0db4b1511..4370a7180 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { @@ -8,7 +8,7 @@ import { import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; export class ReadWriteErc4626Hyperdrive extends readWriteErc4626HyperdriveMixin( - ReadWriteHyperdrive, + ReadWriteHyperdrive ) {} export interface ReadWriteErc4626HyperdriveMixin @@ -20,19 +20,19 @@ export interface ReadWriteErc4626HyperdriveMixin * @internal */ export function readWriteErc4626HyperdriveMixin< - T extends Constructor, + T extends Constructor >(Base: T): Constructor & T { return class extends readErc4626HyperdriveMixin(Base) { async getSharesToken( - options?: ContractReadOptions, + options?: ContractReadOptions ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteErc4626({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts index 1bbd691d3..9c497d0bf 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/erc4626/ReadWriteMockErc4626Hyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadWriteErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; import { ReadWriteMockErc4626 } from "src/token/erc4626/ReadWriteMockErc4626"; @@ -8,7 +8,7 @@ import { } from "./ReadMockErc4626Hyperdrive"; export class ReadWriteMockErc4626Hyperdrive extends readWriteMockErc4626HyperdriveMixin( - ReadWriteErc4626Hyperdrive, + ReadWriteErc4626Hyperdrive ) {} export interface ReadWriteMockErc4626HyperdriveMixin @@ -20,20 +20,20 @@ export interface ReadWriteMockErc4626HyperdriveMixin * @internal */ export function readWriteMockErc4626HyperdriveMixin< - T extends Constructor, + T extends Constructor >(Base: T): Constructor & T { // return class extends readErc4626HyperdriveMixin(Base) { return class extends readMockErc4626HyperdriveMixin(Base) { async getSharesToken( - options?: ContractReadOptions, + options?: ContractReadOptions ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteMockErc4626({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts index 05c7e2ec4..f279c55a6 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { Contract, ContractReadOptions, ReadContract } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; import { @@ -16,15 +16,15 @@ export class ReadEzEthHyperdrive extends readEzEthHyperdriveMixin( * @internal */ export interface ReadEzEthHyperdriveMixin { - ezEthHyperdriveContract: Contract; + ezEthHyperdriveContract: CachedReadContract; /** - * Get a client for ETH, the base token for this Hyperdrive instance. + * Get a model of ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a client for the EzETH token for this Hyperdrive instance. + * Get a model of the EzETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } @@ -36,28 +36,29 @@ export function readEzEthHyperdriveMixin>( Base: T, ): Constructor & T { return class extends Base { - ezEthHyperdriveContract: ReadContract; + ezEthHyperdriveContract: CachedReadContract; constructor(...[options]: any[]) { const { debugName = "EzETH Hyperdrive", address, cache, - cacheNamespace, - ...rest + namespace, + ...modelOptions } = options as ConstructorParameters[0]; - super({ debugName, address, cache, cacheNamespace, ...rest }); - this.ezEthHyperdriveContract = this.drift.contract({ + super({ debugName, address, cache, namespace, ...modelOptions }); + this.ezEthHyperdriveContract = this.contractFactory({ abi: ezEthHyperdriveAbi, address, cache, - cacheNamespace, + namespace, }); } async getBaseToken(): Promise { return new ReadEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } @@ -65,9 +66,9 @@ export function readEzEthHyperdriveMixin>( const { vaultSharesToken } = await this.getPoolConfig(); return new ReadErc20({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts index 9db9b52dc..556ce4d7b 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts @@ -1,4 +1,7 @@ -import { ContractReadOptions, ReadWriteContract } from "@delvtech/drift"; +import { + CachedReadWriteContract, + ContractReadOptions, +} from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { @@ -10,12 +13,12 @@ import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; export class ReadWriteEzEthHyperdrive extends readWriteEzEthHyperdriveMixin( - ReadWriteHyperdrive, + ReadWriteHyperdrive ) {} export interface ReadWriteEzEthHyperdriveMixin extends ReadEzEthHyperdriveMixin { - ezEthHyperdriveContract: ReadWriteContract; + ezEthHyperdriveContract: CachedReadWriteContract; getBaseToken(options?: ContractReadOptions): Promise; getSharesToken(options?: ContractReadOptions): Promise; } @@ -24,26 +27,27 @@ export interface ReadWriteEzEthHyperdriveMixin * @internal */ export function readWriteEzEthHyperdriveMixin< - T extends Constructor, + T extends Constructor >(Base: T): Constructor & T { return class extends readEzEthHyperdriveMixin(Base) { - declare ezEthHyperdriveContract: ReadWriteContract; + declare ezEthHyperdriveContract: CachedReadWriteContract; async getBaseToken(): Promise { return new ReadWriteEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } async getSharesToken( - options?: ContractReadOptions, + options?: ContractReadOptions ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteErc20({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts deleted file mode 100644 index fde57e04a..000000000 --- a/packages/hyperdrive-js-core/src/hyperdrive/getHyperdrive.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Drift, ReadWriteAdapter } from "@delvtech/drift"; -import semver from "semver"; -import { hyperdriveAbi } from "src/hyperdrive/base/abi"; -import { - ReadHyperdrive, - ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; -import { - ReadWriteHyperdrive, - ReadWriteHyperdriveOptions, -} from "src/hyperdrive/base/ReadWriteHyperdrive"; -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; -import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; -import { ReadStEthHyperdrive } from "src/hyperdrive/steth/ReadStEthHyperdrive"; -import { ReadWriteStEthHyperdrive } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; -import { ReadStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14"; -import { ReadWriteStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14"; - -export interface HyperdriveOptions - extends ReadHyperdriveOptions { - drift: T; -} - -export type Hyperdrive = - T extends Drift ? ReadWriteHyperdrive : ReadHyperdrive; - -export async function getHyperdrive({ - address, - drift, - cache = drift.cache, - cacheNamespace, - earliestBlock, - debugName, -}: HyperdriveOptions): Promise> { - cacheNamespace ??= await drift.getChainId(); - - const options: HyperdriveOptions = { - address, - drift, - cache, - cacheNamespace, - earliestBlock, - debugName, - }; - const isReadWrite = isReadWriteOptions(options); - - const version = await drift.read({ - abi: hyperdriveAbi, - address, - fn: "version", - cacheNamespace, - }); - const isV1_0_14 = semver.lte(version, "1.0.14"); - - const kind = isV1_0_14 - ? undefined - : await drift.read({ - abi: hyperdriveAbi, - address, - fn: "kind", - cacheNamespace, - }); - - switch (kind) { - case "StETHHyperdrive": - if (isReadWrite && isV1_0_14) { - return new ReadWriteStEthHyperdrive_v1_0_14(options); - } - - if (isReadWrite) { - return new ReadWriteStEthHyperdrive(options); - } - - if (isV1_0_14) { - return new ReadStEthHyperdrive_v1_0_14(options) as any; - } - - return new ReadStEthHyperdrive(options) as any; - - default: - if (isReadWrite && isV1_0_14) { - return new ReadWriteHyperdrive_v1_0_14(options); - } - - if (isReadWrite) { - return new ReadWriteHyperdrive(options); - } - - if (isV1_0_14) { - return new ReadHyperdrive_v1_0_14(options) as any; - } - - return new ReadHyperdrive(options) as any; - } -} - -function isReadWriteOptions( - options: HyperdriveOptions, -): options is ReadWriteHyperdriveOptions { - return typeof options.drift.write === "function"; -} diff --git a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts index 3f90a02b4..0bf5eec48 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadHyperdrive, @@ -16,12 +16,12 @@ export class ReadLsEthHyperdrive extends readLsEthHyperdriveMixin( */ export interface ReadLsEthHyperdriveMixin { /** - * Get a client for ETH, the base token for this Hyperdrive instance. + * Get a model of ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a client for the LsETH token for this Hyperdrive instance. + * Get a model of the LsETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } @@ -41,7 +41,8 @@ export function readLsEthHyperdriveMixin>( async getBaseToken(): Promise { return new ReadEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } @@ -50,9 +51,9 @@ export function readLsEthHyperdriveMixin>( return new ReadLsEth({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts index ddca694a7..9e0a15fbb 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { @@ -9,7 +9,7 @@ import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; import { ReadWriteLsEth } from "src/token/lseth/ReadWriteLsEth"; export class ReadWriteLsEthHyperdrive extends readWriteLsEthHyperdriveMixin( - ReadWriteHyperdrive, + ReadWriteHyperdrive ) {} export interface ReadWriteLsEthHyperdriveMixin @@ -19,24 +19,25 @@ export interface ReadWriteLsEthHyperdriveMixin } export function readWriteLsEthHyperdriveMixin< - T extends Constructor, + T extends Constructor >(Base: T): Constructor & T { return class extends readLsEthHyperdriveMixin(Base) { async getSharesToken( - options?: ContractReadOptions, + options?: ContractReadOptions ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteLsEth({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } async getBaseToken(): Promise { return new ReadWriteEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts new file mode 100644 index 000000000..764e9fed1 --- /dev/null +++ b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive.ts @@ -0,0 +1,56 @@ +import { ReadContract } from "@delvtech/evm-client"; +import { Constructor } from "src/base/types"; +import { + ReadHyperdrive, + ReadHyperdriveOptions, +} from "src/hyperdrive/base/ReadHyperdrive"; +import { + MetaMorphoSnippetsABI, + metaMorphoSnippetsABI, +} from "src/hyperdrive/metamorpho/abi"; + +// See: https://www.notion.so/delv-tech/Testnet-Addresses-911a0f422f374059afa5c40d76373de6 +const SEPOLIA_METAMORPHO_SNIPPETS_ADDRESS = + "0xf5461A30b3723085F8E702fCc7461db85481c173"; + +export class ReadMetaMorphoHyperdrive extends readMetaMorphoHyperdriveMixin( + ReadHyperdrive, +) {} + +/** + * @internal + */ +export interface ReadMetaMorphoHyperdriveMixin { + metaMorphoContract: ReadContract; +} + +/** + * @internal + */ +export function readMetaMorphoHyperdriveMixin< + T extends Constructor, +>(Base: T): Constructor & T { + return class extends Base { + metaMorphoContract: ReadContract; + + constructor(...[options]: any[]) { + const { + debugName = "MetaMorpho Hyperdrive", + address, + cache, + namespace, + ...modelOptions + } = options as ReadHyperdriveOptions; + super({ debugName, address, cache, namespace, ...modelOptions }); + + this.metaMorphoContract = this.contractFactory({ + abi: metaMorphoSnippetsABI, + // TODO: Refactor to a switch/case on chainId once evm-client has chainId + // support on the Network interface + address: SEPOLIA_METAMORPHO_SNIPPETS_ADDRESS, + cache, + namespace, + }); + } + }; +} diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts new file mode 100644 index 000000000..76ab82dbb --- /dev/null +++ b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/ReadWriteMetaMorphoHyperdrive.ts @@ -0,0 +1,26 @@ +import { ReadContract as ReadWriteContract } from "@delvtech/evm-client"; +import { Constructor } from "src/base/types"; +import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { MetaMorphoSnippetsABI } from "src/hyperdrive/metamorpho/abi"; + +export class ReadWriteMetaMorphoHyperdrive extends readWriteMetaMorphoHyperdriveMixin( + ReadWriteHyperdrive +) {} + +/** + * @internal + */ +export interface ReadWriteMetaMorphoHyperdriveMixin { + metaMorphoContract: ReadWriteContract; +} + +/** + * @internal + */ +export function readWriteMetaMorphoHyperdriveMixin< + T extends Constructor +>(Base: T): Constructor & T { + return class extends Base { + declare metaMorphoContract: ReadWriteContract; + }; +} diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts new file mode 100644 index 000000000..6b4f66e9f --- /dev/null +++ b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/abi.ts @@ -0,0 +1,61 @@ +export type MetaMorphoSnippetsABI = typeof metaMorphoSnippetsABI; +export const metaMorphoSnippetsABI = [ + { + inputs: [ + { + components: [ + { internalType: "address", name: "loanToken", type: "address" }, + { internalType: "address", name: "collateralToken", type: "address" }, + { internalType: "address", name: "oracle", type: "address" }, + { internalType: "address", name: "irm", type: "address" }, + { internalType: "uint256", name: "lltv", type: "uint256" }, + ], + internalType: "struct MarketParams", + name: "marketParams", + type: "tuple", + }, + { + components: [ + { + internalType: "uint128", + name: "totalSupplyAssets", + type: "uint128", + }, + { + internalType: "uint128", + name: "totalSupplyShares", + type: "uint128", + }, + { + internalType: "uint128", + name: "totalBorrowAssets", + type: "uint128", + }, + { + internalType: "uint128", + name: "totalBorrowShares", + type: "uint128", + }, + { internalType: "uint128", name: "lastUpdate", type: "uint128" }, + { internalType: "uint128", name: "fee", type: "uint128" }, + ], + internalType: "struct Market", + name: "market", + type: "tuple", + }, + ], + name: "supplyAPYMarket", + outputs: [{ internalType: "uint256", name: "supplyApy", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "address", name: "vault", type: "address" }], + name: "supplyAPYVault", + outputs: [ + { internalType: "uint256", name: "avgSupplyApy", type: "uint256" }, + ], + stateMutability: "view", + type: "function", + }, +] as const; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..333e8cfa1 --- /dev/null +++ b/packages/hyperdrive-js-core/src/hyperdrive/metamorpho/v1.0.14/ReadMetaMorphoHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { readMetaMorphoHyperdriveMixin } from "src/hyperdrive/metamorpho/ReadMetaMorphoHyperdrive"; + +export class ReadMetaMorphoHyperdrive_v1_0_14 extends readMetaMorphoHyperdriveMixin( + ReadHyperdrive_v1_0_14 +) {} diff --git a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts index 708c1b57c..f463a34e0 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadREthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { fixed } from "@delvtech/fixed-point-wasm"; import { Constructor } from "src/base/types"; import { @@ -17,12 +17,12 @@ export class ReadREthHyperdrive extends readREthHyperdriveMixin( */ export interface ReadREthHyperdriveMixin { /** - * Get a client for ETH, the base token for this Hyperdrive instance. + * Get a model of ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a client for the rETH token for this Hyperdrive instance. + * Get a model of the rETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } @@ -42,7 +42,8 @@ export function readREthHyperdriveMixin>( async getBaseToken(): Promise { return new ReadEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } @@ -50,9 +51,9 @@ export function readREthHyperdriveMixin>( const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadREth({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts index 0fa108bf3..aac239e18 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; import { readREthHyperdriveMixin } from "src/hyperdrive/reth/ReadREthHyperdrive"; @@ -23,7 +23,8 @@ export function readWriteREthHyperdriveMixin< return class extends readREthHyperdriveMixin(Base) { async getBaseToken(): Promise { return new ReadWriteEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } @@ -33,9 +34,9 @@ export function readWriteREthHyperdriveMixin< const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteREth({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts index a77b69474..593828945 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadStEthHyperdrive.ts @@ -1,4 +1,4 @@ -import { ContractReadOptions } from "@delvtech/drift"; +import { ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { fixed } from "src/fixed-point"; import { @@ -8,7 +8,22 @@ import { import { ReadEth } from "src/token/eth/ReadEth"; import { ReadStEth } from "src/token/steth/ReadStEth"; -export interface ReadStEthHyperdriveOptions extends ReadHyperdriveOptions {} +export interface ReadStEthHyperdriveOptions extends ReadHyperdriveOptions { + /** + * The `StETHHyperdrive` contract stores and operates on Lido balances in + * shares. However, since users are most familiar with stETH public balances, + * this model will accept and return balances in stETH by default and convert + * them to shares when interacting with the contract to ease UI integration. + * + * To use shares instead of stETH, set this to `true`. + * + * @default false + * + * @see + * https://docs.lido.fi/guides/lido-tokens-integration-guide#bookkeeping-shares + */ + useSharesAccounting?: boolean; +} export class ReadStEthHyperdrive extends readStEthHyperdriveMixin( ReadHyperdrive, @@ -23,12 +38,12 @@ export class ReadStEthHyperdrive extends readStEthHyperdriveMixin( */ export interface ReadStEthHyperdriveMixin { /** - * Get a client for ETH, the base token for this Hyperdrive instance. + * Get a model of ETH, the base token for this Hyperdrive instance. */ getBaseToken(options?: ContractReadOptions): Promise; /** - * Get a client for the Lido stETH token for this Hyperdrive instance. + * Get a model of the Lido stETH token for this Hyperdrive instance. */ getSharesToken(options?: ContractReadOptions): Promise; } @@ -48,7 +63,8 @@ export function readStEthHyperdriveMixin>( async getBaseToken(): Promise { return new ReadEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } @@ -56,9 +72,9 @@ export function readStEthHyperdriveMixin>( const { vaultSharesToken } = await this.getPoolConfig(); return new ReadStEth({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } diff --git a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts index 17a0e466d..0d39e3ce6 100644 --- a/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts +++ b/packages/hyperdrive-js-core/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts @@ -1,5 +1,9 @@ -import { ContractReadOptions, ReplaceProps } from "@delvtech/drift"; -import { Constructor } from "src/base/types"; +import { + CachedReadWriteContract, + ContractReadOptions, +} from "@delvtech/evm-client"; +import { Constructor, Override } from "src/base/types"; +import { HyperdriveAbi } from "src/hyperdrive/base/abi"; import { ReadWriteHyperdrive, ReadWriteHyperdriveOptions, @@ -13,40 +17,41 @@ import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; import { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; export class ReadWriteStEthHyperdrive extends readWriteStEthHyperdriveMixin( - ReadWriteHyperdrive, + ReadWriteHyperdrive ) {} export interface ReadWriteStEthHyperdriveMixin extends ReadStEthHyperdriveMixin { + stEthHyperdriveContract: CachedReadWriteContract; getBaseToken(options?: ContractReadOptions): Promise; getSharesToken(options?: ContractReadOptions): Promise; } export interface ReadWriteStEthHyperdriveOptions - extends ReplaceProps< - ReadWriteHyperdriveOptions, - ReadStEthHyperdriveOptions - > {} + extends Override {} export function readWriteStEthHyperdriveMixin< - T extends Constructor, + T extends Constructor >(Base: T): Constructor & T { return class extends readStEthHyperdriveMixin(Base) { + declare stEthHyperdriveContract: CachedReadWriteContract; + async getBaseToken(): Promise { return new ReadWriteEth({ - drift: this.drift, + contractFactory: this.contractFactory, + network: this.network, }); } async getSharesToken( - options?: ContractReadOptions, + options?: ContractReadOptions ): Promise { const { vaultSharesToken } = await this.getPoolConfig(options); return new ReadWriteStEth({ address: vaultSharesToken, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + namespace: this.contract.namespace, + network: this.network, }); } }; diff --git a/packages/hyperdrive-js-core/src/drift/ReadClient.ts b/packages/hyperdrive-js-core/src/model/ReadModel.ts similarity index 51% rename from packages/hyperdrive-js-core/src/drift/ReadClient.ts rename to packages/hyperdrive-js-core/src/model/ReadModel.ts index 515130daa..81084113d 100644 --- a/packages/hyperdrive-js-core/src/drift/ReadClient.ts +++ b/packages/hyperdrive-js-core/src/model/ReadModel.ts @@ -1,14 +1,20 @@ -import { Drift } from "@delvtech/drift"; +import { Network } from "@delvtech/evm-client"; +import { Prettify } from "src/base/types"; +import { + ContractFactoryOptions, + ReadContractFactory, +} from "src/evm-client/contractFactory"; /** - * The base options required for all read clients. + * The base options required for all read models. */ -export interface ReadClientOptions { - drift: Drift; +export interface ReadModelOptions { + contractFactory: ReadContractFactory; + network: Network; /** * An arbitrary name for the instance. This is for convenience only (e.g., for - * use as a display name or in logging) and has no affect on the client's + * use as a display name or in logging) and has no affect on the model's * behavior. */ debugName?: string; @@ -20,22 +26,28 @@ export interface ReadClientOptions { } /** - * A base class for read-only clients. + * A base class for read-only models. */ -export class ReadClient { - drift: Drift; +export class ReadModel { debugName: string; + network: Network; + contractFactory: ReadContractFactory; - constructor({ debugName, drift, earliestBlock }: ReadClientOptions) { + constructor({ + debugName, + network, + contractFactory, + earliestBlock, + }: ReadModelOptions) { this.debugName = debugName ?? this.constructor.name; - this.drift = drift; + this.network = network; + this.contractFactory = contractFactory; // Override the contract factory to ensure that events are fetched from the // earliest block if necessary. if (earliestBlock) { - const originalContractFactory = this.drift.contract; - this.drift.contract = (options) => { - const contract = originalContractFactory(options); + this.contractFactory = (options) => { + const contract = contractFactory(options); // Override the getEvents method const originalGetEvents = contract.getEvents; @@ -51,8 +63,17 @@ export class ReadClient { return originalGetEvents(eventName, _options); }; - return contract as any; + return contract; }; } } } + +/** + * The options required to create a read model that represents a specific + * contract. + */ +export type ReadContractModelOptions = Prettify< + // The abi is omitted because it's assumed the model will import its own ABI + ReadModelOptions & Omit +>; diff --git a/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts b/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts new file mode 100644 index 000000000..8647d4221 --- /dev/null +++ b/packages/hyperdrive-js-core/src/model/ReadWriteModel.ts @@ -0,0 +1,33 @@ +import { Prettify } from "src/base/types"; +import { + ContractFactoryOptions, + ReadWriteContractFactory, +} from "src/evm-client/contractFactory"; +import { ReadModel, ReadModelOptions } from "src/model/ReadModel"; + +/** + * The base options required for all read-write models. + */ +export interface ReadWriteModelOptions extends ReadModelOptions { + contractFactory: ReadWriteContractFactory; +} + +/** + * A base class for read-write models. + */ +export class ReadWriteModel extends ReadModel { + declare contractFactory: ReadWriteContractFactory; + + constructor(options: ReadWriteModelOptions) { + super(options); + } +} + +/** + * The options required to create a read-write model that represents a specific + * contract. + */ +export type ReadWriteContractModelOptions = Prettify< + // The abi is omitted because it's assumed the model will import its own ABI + ReadWriteModelOptions & Omit +>; diff --git a/packages/hyperdrive-js-core/src/pool/types.ts b/packages/hyperdrive-js-core/src/pool/types.ts index 36c6d73f1..b3cf3623d 100644 --- a/packages/hyperdrive-js-core/src/pool/types.ts +++ b/packages/hyperdrive-js-core/src/pool/types.ts @@ -1,4 +1,4 @@ -import { FunctionReturn } from "@delvtech/drift"; +import { FunctionReturn } from "@delvtech/evm-client"; import { HyperdriveAbi } from "src/hyperdrive/base/abi"; export type PoolConfig = FunctionReturn; diff --git a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts index 4bfe1514f..b5ff6db2c 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadRegistry.ts @@ -1,35 +1,34 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Address } from "abitype"; -import { ReadContractClientOptions } from "src/drift/ContractClient"; -import { ReadClient } from "src/drift/ReadClient"; import { ReadFactory } from "src/factory/ReadFactory"; import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; import { RegistryAbi, registryAbi } from "src/registry/abi"; import { FactoryInfoWithMetadata, ReadInstanceInfoWithMetadata, } from "src/registry/types"; -export interface ReadRegistryOptions extends ReadContractClientOptions {} +export interface ReadRegistryOptions extends ReadContractModelOptions {} -export class ReadRegistry extends ReadClient { +export class ReadRegistry extends ReadModel { address: Address; - contract: Contract; + contract: CachedReadContract; constructor({ debugName = "Hyperdrive Registry", address, cache, - cacheNamespace, - ...rest + namespace, + ...modelOptions }: ReadRegistryOptions) { - super({ debugName, ...rest }); + super({ debugName, ...modelOptions }); this.address = address; - this.contract = this.drift.contract({ + this.contract = this.contractFactory({ abi: registryAbi, address, cache, - cacheNamespace, + namespace, }); } @@ -42,9 +41,8 @@ export class ReadRegistry extends ReadClient { (address) => new ReadFactory({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), ); } @@ -121,9 +119,8 @@ export class ReadRegistry extends ReadClient { (address) => new ReadHyperdrive({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), ); } @@ -170,9 +167,8 @@ export class ReadRegistry extends ReadClient { data: `0x${data.toString(16)}`, factory: new ReadFactory({ address: factory, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), }; } @@ -196,9 +192,8 @@ export class ReadRegistry extends ReadClient { data: `0x${data.toString(16)}`, factory: new ReadFactory({ address: factory, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), })); } diff --git a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts index dc67671cf..a8cfad672 100644 --- a/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts +++ b/packages/hyperdrive-js-core/src/registry/ReadWriteRegistry.ts @@ -1,24 +1,23 @@ import { + CachedReadWriteContract, ContractReadOptions, - Drift, - ReadWriteAdapter, - ReadWriteContract, - ReplaceProps, -} from "@delvtech/drift"; +} from "@delvtech/evm-client"; import { Address } from "abitype"; -import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +import { Override } from "src/base/types"; +import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; import { ReadRegistry, ReadRegistryOptions } from "src/registry/ReadRegistry"; import { RegistryAbi } from "src/registry/abi"; import { ReadWriteInstanceInfoWithMetadata } from "src/registry/types"; export interface ReadWriteRegistryOptions - extends ReplaceProps {} + extends Override {} export class ReadWriteRegistry extends ReadRegistry { - declare drift: Drift; - declare contract: ReadWriteContract; + declare contract: CachedReadWriteContract; + declare contractFactory: ReadWriteContractFactory; constructor(options: ReadWriteRegistryOptions) { super(options); @@ -35,9 +34,8 @@ export class ReadWriteRegistry extends ReadRegistry { (address) => new ReadWriteFactory({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), ); } @@ -67,9 +65,8 @@ export class ReadWriteRegistry extends ReadRegistry { (address) => new ReadWriteHyperdrive({ address, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), ); } @@ -90,9 +87,8 @@ export class ReadWriteRegistry extends ReadRegistry { data: `0x${data.toString(16)}`, factory: new ReadWriteFactory({ address: factory, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), }; } @@ -116,9 +112,8 @@ export class ReadWriteRegistry extends ReadRegistry { data: `0x${data.toString(16)}`, factory: new ReadWriteFactory({ address: factory, - drift: this.drift, - cache: this.contract.cache, - cacheNamespace: this.contract.cacheNamespace, + contractFactory: this.contractFactory, + network: this.network, }), })); } diff --git a/packages/hyperdrive-js-core/src/registry/types.ts b/packages/hyperdrive-js-core/src/registry/types.ts index 987bab0c9..61eaf513e 100644 --- a/packages/hyperdrive-js-core/src/registry/types.ts +++ b/packages/hyperdrive-js-core/src/registry/types.ts @@ -1,4 +1,5 @@ -import { FunctionReturn, ReplaceProps } from "@delvtech/drift"; +import { FunctionReturn } from "@delvtech/evm-client"; +import { Override } from "src/base/types"; import { ReadFactory } from "src/factory/ReadFactory"; import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; import { RegistryAbi } from "src/registry/abi"; @@ -7,7 +8,7 @@ import { RegistryAbi } from "src/registry/abi"; * The info collected for each Hyperdrive factory along with the metadata * associated with each instance. */ -export type FactoryInfoWithMetadata = ReplaceProps< +export type FactoryInfoWithMetadata = Override< FunctionReturn, { /** @@ -22,7 +23,7 @@ export type FactoryInfoWithMetadata = ReplaceProps< * The info related to each Hyperdrive instance along with the metadata * associated with each instance. */ -export type ReadInstanceInfoWithMetadata = ReplaceProps< +export type ReadInstanceInfoWithMetadata = Override< FunctionReturn, { /** @@ -38,7 +39,7 @@ export type ReadInstanceInfoWithMetadata = ReplaceProps< >; /** {@inheritDoc ReadInstanceInfoWithMetadata} */ -export type ReadWriteInstanceInfoWithMetadata = ReplaceProps< +export type ReadWriteInstanceInfoWithMetadata = Override< ReadInstanceInfoWithMetadata, { /** {@inheritDoc ReadInstanceInfoWithMetadata.factory} */ diff --git a/packages/hyperdrive-js-core/src/token/ReadToken.ts b/packages/hyperdrive-js-core/src/token/ReadToken.ts index a582e2f25..2b313b6e6 100644 --- a/packages/hyperdrive-js-core/src/token/ReadToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadToken.ts @@ -1,7 +1,7 @@ -import { ContractReadOptions } from "@delvtech/drift"; -import { ReadClient } from "src/drift/ReadClient"; +import { ContractReadOptions } from "@delvtech/evm-client"; +import { ReadModel } from "src/model/ReadModel"; -export interface ReadToken extends ReadClient { +export interface ReadToken extends ReadModel { address: `0x${string}`; /** diff --git a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts index 8515c6bbd..ebd3a1f2c 100644 --- a/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts +++ b/packages/hyperdrive-js-core/src/token/ReadWriteToken.ts @@ -1,9 +1,11 @@ -import { ContractWriteOptions, ReplaceProps } from "@delvtech/drift"; -import { ReadWriteClient } from "src/drift/ReadWriteClient"; +import { ContractWriteOptions } from "@delvtech/evm-client"; +import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; +import { ReadWriteModel } from "src/model/ReadWriteModel"; import { ReadToken } from "src/token/ReadToken"; -export interface ReadWriteToken - extends ReplaceProps { +export interface ReadWriteToken extends ReadToken, ReadWriteModel { + contractFactory: ReadWriteContractFactory; + /** * Give a spending allowance to a given spender. * @param spender - The address of the spender. diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts index 9fac7e2b0..7d2e94769 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadErc20.ts @@ -1,36 +1,34 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; -import { Address } from "abitype"; -import { ReadContractClientOptions } from "src/drift/ContractClient"; -import { ReadClient } from "src/drift/ReadClient"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; +import { ReadContractModelOptions, ReadModel } from "src/model/ReadModel"; import { erc20Abi, Erc20Abi } from "src/token/erc20/abi"; import { ReadToken } from "src/token/ReadToken"; -export interface ReadErc20Options extends ReadContractClientOptions {} +export interface ReadErc20Options extends ReadContractModelOptions {} -export class ReadErc20 extends ReadClient implements ReadToken { - contract: Contract; +export class ReadErc20 extends ReadModel implements ReadToken { + contract: CachedReadContract; constructor({ debugName = "ERC-20 Token", address, cache, - cacheNamespace, - ...rest + namespace, + ...modelOptions }: ReadErc20Options) { - super({ debugName, ...rest }); - this.contract = this.drift.contract({ + super({ debugName, ...modelOptions }); + this.contract = this.contractFactory({ abi: erc20Abi, address, cache, - cacheNamespace, + namespace, }); } - get address(): Address { + get address(): `0x${string}` { return this.contract.address; } - get namespace(): PropertyKey | undefined { - return this.contract.cacheNamespace; + get namespace(): string | undefined { + return this.contract.namespace; } getName(): Promise { diff --git a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts index f1075bd3d..90fee23dc 100644 --- a/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts +++ b/packages/hyperdrive-js-core/src/token/erc20/ReadWriteErc20.ts @@ -1,24 +1,27 @@ import { + CachedReadWriteContract, ContractWriteOptions, - Drift, - ReadWriteAdapter, - ReadWriteContract, -} from "@delvtech/drift"; -import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; +} from "@delvtech/evm-client"; +import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; +import { syncCacheWithTransaction } from "src/evm-client/syncCacheWithTransaction"; +import { ReadWriteContractModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadErc20 } from "src/token/erc20/ReadErc20"; import { Erc20Abi } from "src/token/erc20/abi"; -export interface ReadWriteErc20Options extends ReadWriteContractClientOptions {} +export interface ReadWriteErc20Options extends ReadWriteContractModelOptions {} export class ReadWriteErc20 extends ReadErc20 implements ReadWriteToken { - declare drift: Drift; - declare contract: ReadWriteContract; + declare contract: CachedReadWriteContract; + declare contractFactory: ReadWriteContractFactory; constructor(options: ReadWriteErc20Options) { super(options); } + @syncCacheWithTransaction({ + cacheEntries: [{ functionName: "allowance" }], + }) async approve({ spender, amount, @@ -32,13 +35,7 @@ export class ReadWriteErc20 extends ReadErc20 implements ReadWriteToken { const hash = await this.contract.write( "approve", { spender, amount }, - { - ...options, - onMined: (receipt) => { - this.contract.invalidateReadsMatching("allowance"); - options?.onMined?.(receipt); - }, - }, + options, ); return hash; } diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts index d263fe299..935e5296f 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadErc4626.ts @@ -1,4 +1,4 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { Erc4626Abi, erc4626Abi } from "src/token/erc4626/abi"; @@ -9,7 +9,7 @@ export class ReadErc4626 extends readErc4626Mixin(ReadErc20) {} * @internal */ export interface ReadErc4626Mixin { - erc4626Contract: Contract; + erc4626Contract: CachedReadContract; /** * Get the total supply of assets in the vault. @@ -46,22 +46,22 @@ export function readErc4626Mixin>( Base: T, ): Constructor & T { return class extends Base implements ReadErc4626Mixin { - erc4626Contract: Contract; + erc4626Contract: CachedReadContract; constructor(...[options]: any[]) { const { debugName = "ERC-4626 Tokenized Vault", address, cache, - cacheNamespace, - ...rest + namespace, + ...modelOptions } = options as ReadErc20Options; - super({ debugName, address, cache, cacheNamespace, ...rest }); - this.erc4626Contract = this.drift.contract({ + super({ debugName, address, cache, namespace, ...modelOptions }); + this.erc4626Contract = this.contractFactory({ abi: erc4626Abi, address, cache, - cacheNamespace, + namespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts index 657c2b13a..17809c137 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadMockErc4626.ts @@ -1,4 +1,4 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { mockErc4626Abi, MockErc4626Abi } from "src/token/erc4626/abi"; import { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; @@ -9,7 +9,7 @@ export class ReadMockErc4626 extends readMockErc4626Mixin(ReadErc4626) {} * @internal */ export interface ReadMockErc4626Mixin { - mockErc4626Contract: Contract; + mockErc4626Contract: CachedReadContract; /** * Get the rate of the vault. @@ -24,22 +24,22 @@ export function readMockErc4626Mixin>( BaseReadErc4626: T, ): Constructor & T { return class extends BaseReadErc4626 implements ReadMockErc4626Mixin { - mockErc4626Contract: Contract; + mockErc4626Contract: CachedReadContract; constructor(...[options]: any[]) { const { debugName = "Mock ERC-4626 Tokenized Vault", address, cache, - cacheNamespace, - ...rest + namespace, + ...modelOptions } = options as ConstructorParameters[0]; - super({ debugName, address, cache, cacheNamespace, ...rest }); - this.mockErc4626Contract = this.drift.contract({ + super({ debugName, address, cache, namespace, ...modelOptions }); + this.mockErc4626Contract = this.contractFactory({ abi: mockErc4626Abi, address, cache, - cacheNamespace, + namespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts index 8521db317..5762a88b9 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteErc4626.ts @@ -1,8 +1,8 @@ -import { ReadWriteContract } from "@delvtech/drift"; +import { CachedReadWriteContract } from "@delvtech/evm-client"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { readErc4626Mixin } from "src/token/erc4626/ReadErc4626"; import { Erc4626Abi } from "src/token/erc4626/abi"; export class ReadWriteErc4626 extends readErc4626Mixin(ReadWriteErc20) { - declare erc4626Contract: ReadWriteContract; + declare erc4626Contract: CachedReadWriteContract; } diff --git a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts index 4c04a4ae0..86dca9f4e 100644 --- a/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts +++ b/packages/hyperdrive-js-core/src/token/erc4626/ReadWriteMockErc4626.ts @@ -1,4 +1,7 @@ -import { ContractWriteOptions, ReadWriteContract } from "@delvtech/drift"; +import { + CachedReadWriteContract, + ContractWriteOptions, +} from "@delvtech/evm-client"; import { MockErc4626Abi } from "src/token/erc4626/abi"; import { readMockErc4626Mixin } from "src/token/erc4626/ReadMockErc4626"; import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; @@ -6,7 +9,7 @@ import { ReadWriteErc4626 } from "src/token/erc4626/ReadWriteErc4626"; export class ReadWriteMockErc4626 extends readMockErc4626Mixin( ReadWriteErc4626, ) { - declare mockErc4626Contract: ReadWriteContract; + declare mockErc4626Contract: CachedReadWriteContract; /** * Mint shares. diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts index 48a4f552e..4fbc627d7 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadEth.ts @@ -1,10 +1,10 @@ -import { ContractReadOptions } from "@delvtech/drift"; -import { ReadClient, ReadClientOptions } from "src/drift/ReadClient"; +import { ContractReadOptions } from "@delvtech/evm-client"; +import { ReadModel, ReadModelOptions } from "src/model/ReadModel"; import { ReadToken } from "src/token/ReadToken"; -export interface ReadEthOptions extends ReadClientOptions {} +export interface ReadEthOptions extends ReadModelOptions {} -export class ReadEth extends ReadClient implements ReadToken { +export class ReadEth extends ReadModel implements ReadToken { static address = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" as const; address = ReadEth.address; @@ -42,9 +42,6 @@ export class ReadEth extends ReadClient implements ReadToken { account: `0x${string}`; options?: ContractReadOptions; }): Promise { - return this.drift.getBalance({ - address: account, - ...options, - }); + return this.network.getBalance(account, options); } } diff --git a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts index e7f85bf9a..f7f26a6f7 100644 --- a/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts +++ b/packages/hyperdrive-js-core/src/token/eth/ReadWriteEth.ts @@ -1,13 +1,13 @@ -import { Drift, ReadWriteAdapter } from "@delvtech/drift"; -import { ReadWriteClientOptions } from "src/drift/ReadWriteClient"; import { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; +import { ReadWriteContractFactory } from "src/evm-client/contractFactory"; +import { ReadWriteModelOptions } from "src/model/ReadWriteModel"; import { ReadWriteToken } from "src/token/ReadWriteToken"; import { ReadEth } from "src/token/eth/ReadEth"; -export interface ReadWriteEthOptions extends ReadWriteClientOptions {} +export interface ReadWriteEthOptions extends ReadWriteModelOptions {} export class ReadWriteEth extends ReadEth implements ReadWriteToken { - declare drift: Drift; + declare contractFactory: ReadWriteContractFactory; constructor(options: ReadWriteEthOptions) { super(options); diff --git a/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts b/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts index 5fd3792e3..0f9d06c05 100644 --- a/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts +++ b/packages/hyperdrive-js-core/src/token/lseth/ReadLsEth.ts @@ -1,4 +1,4 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { LsEthAbi, lsEthAbi } from "src/token/lseth/abi"; @@ -9,7 +9,7 @@ export class ReadLsEth extends readLsEthMixin(ReadErc20) {} * @internal */ export interface ReadLsEthMixin { - lsEthContract: Contract; + lsEthContract: CachedReadContract; /** * Get the total supply of underlying eth in the lsEth contract. @@ -57,17 +57,17 @@ export function readLsEthMixin>( Base: T, ): Constructor & T { return class extends Base implements ReadLsEthMixin { - lsEthContract: Contract; + lsEthContract: CachedReadContract; constructor(...[options]: any[]) { - const { drift, address, cache, cacheNamespace } = + const { contractFactory, address, cache, namespace } = options as ReadErc20Options; - super({ address, drift, cache, cacheNamespace }); - this.lsEthContract = drift.contract({ + super({ address, contractFactory, cache, namespace }); + this.lsEthContract = contractFactory({ abi: lsEthAbi, address, cache, - cacheNamespace, + namespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts b/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts index f1e8237b7..622c91bac 100644 --- a/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts +++ b/packages/hyperdrive-js-core/src/token/lseth/ReadWriteLsEth.ts @@ -1,8 +1,8 @@ -import { ReadWriteContract } from "@delvtech/drift"; +import { CachedReadWriteContract } from "@delvtech/evm-client"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { readLsEthMixin } from "src/token/lseth/ReadLsEth"; import { LsEthAbi } from "src/token/lseth/abi"; export class ReadWriteLsEth extends readLsEthMixin(ReadWriteErc20) { - declare lsEthContract: ReadWriteContract; + declare lsEthContract: CachedReadWriteContract; } diff --git a/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts b/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts index 2bcdb7691..5814887bd 100644 --- a/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts +++ b/packages/hyperdrive-js-core/src/token/reth/ReadREth.ts @@ -1,4 +1,4 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { REthAbi, rEthAbi } from "src/token/reth/abi"; @@ -9,7 +9,7 @@ export class ReadREth extends readREthMixin(ReadErc20) {} * @internal */ export interface ReadREthMixin { - rEthContract: Contract; + rEthContract: CachedReadContract; /** * Get the total supply of underlying eth in the rETH contract. @@ -57,17 +57,17 @@ export function readREthMixin>( Base: T, ): Constructor & T { return class extends Base implements ReadREthMixin { - rEthContract: Contract; + rEthContract: CachedReadContract; constructor(...[options]: any[]) { - const { drift, address, cache, cacheNamespace } = + const { contractFactory, address, cache, namespace } = options as ReadErc20Options; - super({ address, drift, cache, cacheNamespace }); - this.rEthContract = drift.contract({ + super({ address, contractFactory, cache, namespace }); + this.rEthContract = contractFactory({ abi: rEthAbi, address, cache, - cacheNamespace, + namespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts b/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts index 3b5ef80c7..58dcb09b6 100644 --- a/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts +++ b/packages/hyperdrive-js-core/src/token/reth/ReadWriteREth.ts @@ -1,8 +1,8 @@ -import { ReadWriteContract } from "@delvtech/drift"; +import { CachedReadWriteContract } from "@delvtech/evm-client"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { readREthMixin } from "src/token/reth/ReadREth"; import { REthAbi } from "src/token/reth/abi"; export class ReadWriteREth extends readREthMixin(ReadWriteErc20) { - declare rEthContract: ReadWriteContract; + declare rEthContract: CachedReadWriteContract; } diff --git a/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts b/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts index dadbc9f19..b3bd469ff 100644 --- a/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts +++ b/packages/hyperdrive-js-core/src/token/steth/ReadStEth.ts @@ -1,4 +1,4 @@ -import { Contract, ContractReadOptions } from "@delvtech/drift"; +import { CachedReadContract, ContractReadOptions } from "@delvtech/evm-client"; import { Constructor } from "src/base/types"; import { ReadErc20, ReadErc20Options } from "src/token/erc20/ReadErc20"; import { StEthAbi, stEthAbi } from "src/token/steth/abi"; @@ -9,7 +9,7 @@ export class ReadStEth extends readStEthMixin(ReadErc20) {} * @internal */ export interface ReadStEthMixin { - stEthContract: Contract; + stEthContract: CachedReadContract; /** * Get the number of stETH shares held by an account. @@ -54,22 +54,22 @@ export function readStEthMixin>( Base: T, ): Constructor & T { return class extends Base implements ReadStEthMixin { - stEthContract: Contract; + stEthContract: CachedReadContract; constructor(...[options]: any[]) { const { debugName = "stETH Token", address, cache, - cacheNamespace, - ...rest + namespace, + ...modelOptions } = options as ReadErc20Options; - super({ debugName, address, cache, cacheNamespace, ...rest }); - this.stEthContract = this.drift.contract({ + super({ debugName, address, cache, namespace, ...modelOptions }); + this.stEthContract = this.contractFactory({ abi: stEthAbi, address, cache, - cacheNamespace, + namespace, }); } diff --git a/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts b/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts index 66ec0b8ff..24b25aec6 100644 --- a/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts +++ b/packages/hyperdrive-js-core/src/token/steth/ReadWriteStEth.ts @@ -1,8 +1,8 @@ -import { ReadWriteContract } from "@delvtech/drift"; +import { CachedReadWriteContract } from "@delvtech/evm-client"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { StEthAbi } from "src/token/steth/abi"; import { readStEthMixin } from "src/token/steth/ReadStEth"; export class ReadWriteStEth extends readStEthMixin(ReadWriteErc20) { - declare stEthContract: ReadWriteContract; + declare stEthContract: CachedReadWriteContract; } diff --git a/packages/hyperdrive-js-core/tsup.config.ts b/packages/hyperdrive-js-core/tsup.config.ts index 07ca24f96..41747e1e2 100644 --- a/packages/hyperdrive-js-core/tsup.config.ts +++ b/packages/hyperdrive-js-core/tsup.config.ts @@ -1,9 +1,44 @@ import { defineConfig } from "tsup"; export default defineConfig({ - entry: ["src/exports/index.ts", "src/exports/v1.0.14.ts"], - format: ["esm", "cjs"], - sourcemap: true, + // Splitting the entry points in foundational packages like this makes it + // easier for wrapper packages to selectively re-export `*` from some entry + // points and while augmenting or modifying others. + entry: [ + "src/exports/index.ts", + + "src/exports/contract.ts", + "src/exports/errors.ts", + "src/exports/model.ts", + "src/exports/utils.ts", + + // factory + "src/exports/factory/index.ts", + "src/exports/factory/model.ts", + "src/exports/factory/rest.ts", + + // hyperdrive + "src/exports/hyperdrive/index.ts", + "src/exports/hyperdrive/model.ts", + "src/exports/hyperdrive/rest.ts", + + // registry + "src/exports/registry/index.ts", + "src/exports/registry/model.ts", + "src/exports/registry/rest.ts", + + // token + "src/exports/token/index.ts", + "src/exports/token/model.ts", + "src/exports/token/rest.ts", + + // v1.0.14 + "src/exports/v1.0.14/index.ts", + "src/exports/v1.0.14/hyperdrive/index.ts", + "src/exports/v1.0.14/hyperdrive/model.ts", + "src/exports/v1.0.14/hyperdrive/rest.ts", + ], + format: ["esm"], dts: true, clean: true, minify: true, diff --git a/yarn.lock b/yarn.lock index 2af3ee972..7dc49bfaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1493,6 +1493,16 @@ lru-cache "^10.0.1" safe-stable-stringify "^2.5.0" +"@delvtech/evm-client@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@delvtech/evm-client/-/evm-client-0.5.1.tgz#b69bd04ecb9f1690c1ce94acb7362e4d30b9e1e5" + integrity sha512-Ixx7coKko1l9i2CkrrkhzRVnxzf+b3ROEppWvN7Q0+Gx3DLq1lq8oorXjZb5dZhs5K07LtJM7sUJLztxx8BIEA== + dependencies: + "@types/lodash.ismatch" "^4.4.9" + fast-safe-stringify "^2.1.1" + lodash.ismatch "^4.4.0" + lru-cache "^10.0.1" + "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -4717,6 +4727,13 @@ dependencies: "@types/lodash" "*" +"@types/lodash.ismatch@^4.4.9": + version "4.4.9" + resolved "https://registry.yarnpkg.com/@types/lodash.ismatch/-/lodash.ismatch-4.4.9.tgz#97b4317f7dc3975bb51660a0f9a055ac7b67b134" + integrity sha512-qWihnStOPKH8urljLGm6ZOEdN/5Bt4vxKR81tL3L4ArUNLvcf9RW3QSnPs21eix5BiqioSWq4aAXD4Iep+d0fw== + dependencies: + "@types/lodash" "*" + "@types/lodash.mapvalues@^4.6.9": version "4.6.9" resolved "https://registry.yarnpkg.com/@types/lodash.mapvalues/-/lodash.mapvalues-4.6.9.tgz#1edb4b1d299db332166b474221b06058b34030a7" @@ -9258,7 +9275,7 @@ fast-redact@^3.0.0: resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== -fast-safe-stringify@^2.0.6: +fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== From 66d30ab1c81ffb0561d984dc90e05988c19bac0a Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 21:56:42 -0600 Subject: [PATCH 36/43] Remove one-off errors --- .../src/{errors => }/HyperdriveSdkError.ts | 4 ++-- .../hyperdrive-js/src/base/assertNever.ts | 2 +- .../src/drift/getBlockOrThrow.ts | 8 +++++-- .../src/errors/BlockNotFoundError.ts | 11 --------- .../src/errors/MethodNotImplementedError.ts | 22 ----------------- packages/hyperdrive-js/src/exports/index.ts | 8 ++----- .../src/hyperdrive/base/ReadHyperdrive.ts | 2 +- .../hyperdrive-js/src/pool/parseAssetType.ts | 2 +- .../src/token/eth/ReadWriteEth.ts | 24 +++++++++++++------ 9 files changed, 30 insertions(+), 53 deletions(-) rename packages/hyperdrive-js/src/{errors => }/HyperdriveSdkError.ts (70%) delete mode 100644 packages/hyperdrive-js/src/errors/BlockNotFoundError.ts delete mode 100644 packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts diff --git a/packages/hyperdrive-js/src/errors/HyperdriveSdkError.ts b/packages/hyperdrive-js/src/HyperdriveSdkError.ts similarity index 70% rename from packages/hyperdrive-js/src/errors/HyperdriveSdkError.ts rename to packages/hyperdrive-js/src/HyperdriveSdkError.ts index 34c045c60..32f6a41f8 100644 --- a/packages/hyperdrive-js/src/errors/HyperdriveSdkError.ts +++ b/packages/hyperdrive-js/src/HyperdriveSdkError.ts @@ -1,8 +1,8 @@ import { DriftError } from "@delvtech/drift"; export class HyperdriveSdkError extends DriftError { - constructor(message: string, options?: ErrorOptions) { - super(message, { + constructor(error: string, options?: ErrorOptions) { + super(error, { ...options, prefix: "ᛋ ", name: "Hyperdrive SDK Error", diff --git a/packages/hyperdrive-js/src/base/assertNever.ts b/packages/hyperdrive-js/src/base/assertNever.ts index f23f00820..d3fe8b7ae 100644 --- a/packages/hyperdrive-js/src/base/assertNever.ts +++ b/packages/hyperdrive-js/src/base/assertNever.ts @@ -1,4 +1,4 @@ -import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; +import { HyperdriveSdkError } from "src/HyperdriveSdkError"; /** * Helper function for exhaustive checks of discriminated unions. diff --git a/packages/hyperdrive-js/src/drift/getBlockOrThrow.ts b/packages/hyperdrive-js/src/drift/getBlockOrThrow.ts index d354c93ca..7ede661ce 100644 --- a/packages/hyperdrive-js/src/drift/getBlockOrThrow.ts +++ b/packages/hyperdrive-js/src/drift/getBlockOrThrow.ts @@ -4,7 +4,7 @@ import { Drift, GetBlockParams, } from "@delvtech/drift"; -import { BlockNotFoundError } from "src/errors/BlockNotFoundError"; +import { HyperdriveSdkError } from "src/HyperdriveSdkError"; export type GetBlockOrThrowParams = GetBlockParams & ContractReadOptions; @@ -20,7 +20,11 @@ export async function getBlockOrThrow( ): Promise { const fetched = await drift.getBlock(options); if (!fetched) { - throw new BlockNotFoundError(options); + const block = + options?.blockHash ?? options?.blockNumber ?? options?.blockTag; + throw new HyperdriveSdkError( + `Block${block !== undefined ? ` ${block}` : ""} not found`, + ); } return fetched; } diff --git a/packages/hyperdrive-js/src/errors/BlockNotFoundError.ts b/packages/hyperdrive-js/src/errors/BlockNotFoundError.ts deleted file mode 100644 index 62f20885d..000000000 --- a/packages/hyperdrive-js/src/errors/BlockNotFoundError.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NetworkGetBlockOptions } from "@delvtech/drift"; -import { HyperdriveSdkError } from "./HyperdriveSdkError"; - -export class BlockNotFoundError extends HyperdriveSdkError { - constructor(options?: NetworkGetBlockOptions) { - const block = - options?.blockHash ?? options?.blockNumber ?? options?.blockTag; - super(`Block${block !== undefined ? ` ${block}` : ""} not found`); - this.name = "BlockNotFound"; - } -} diff --git a/packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts b/packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts deleted file mode 100644 index 77536f3fb..000000000 --- a/packages/hyperdrive-js/src/errors/MethodNotImplementedError.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { HyperdriveSdkError } from "./HyperdriveSdkError"; - -export interface MethodNotImplementedErrorOptions { - /** - * The name of the object that the method was not implemented in. - */ - objectName: string; - /** - * The name of the method that was not implemented. - */ - methodName: string; -} - -/** - * An error that is thrown when a method is not implemented in an object. - */ -export class MethodNotImplementedError extends HyperdriveSdkError { - constructor({ methodName, objectName }: MethodNotImplementedErrorOptions) { - super(`${objectName} does not implement the method ${methodName}.`); - this.name = "MethodNotImplemented"; - } -} diff --git a/packages/hyperdrive-js/src/exports/index.ts b/packages/hyperdrive-js/src/exports/index.ts index 130e054af..9ee4c7943 100644 --- a/packages/hyperdrive-js/src/exports/index.ts +++ b/packages/hyperdrive-js/src/exports/index.ts @@ -1,3 +1,5 @@ +export { HyperdriveSdkError } from "src/HyperdriveSdkError"; + // Hyperdrive // export { @@ -138,12 +140,6 @@ export { stEthAbi, type StEthAbi } from "src/token/steth/abi"; export { ReadStEth } from "src/token/steth/ReadStEth"; export { ReadWriteStEth } from "src/token/steth/ReadWriteStEth"; -// Errors // - -export { BlockNotFoundError } from "src/errors/BlockNotFoundError"; -export { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; -export { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; - // Drift // export type { diff --git a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts index 039ce7b8f..854ed175d 100644 --- a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts @@ -9,6 +9,7 @@ import { MergeKeys, ReadContract, } from "@delvtech/drift"; +import { HyperdriveSdkError } from "src/HyperdriveSdkError"; import { assertNever } from "src/base/assertNever"; import { MAX_UINT256, SECONDS_PER_YEAR } from "src/base/constants"; import { getCheckpointTime } from "src/checkpoint/getCheckpointTime"; @@ -21,7 +22,6 @@ import { import { ReadContractClientOptions } from "src/drift/ContractClient"; import { ReadClient } from "src/drift/ReadClient"; import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; -import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; import { fixed } from "src/fixed-point"; import { HyperdriveAbi, hyperdriveAbi } from "src/hyperdrive/base/abi"; import { MAX_ITERATIONS, NULL_BYTES } from "src/hyperdrive/constants"; diff --git a/packages/hyperdrive-js/src/pool/parseAssetType.ts b/packages/hyperdrive-js/src/pool/parseAssetType.ts index 73c8e6dae..807cbfe39 100644 --- a/packages/hyperdrive-js/src/pool/parseAssetType.ts +++ b/packages/hyperdrive-js/src/pool/parseAssetType.ts @@ -1,4 +1,4 @@ -import { HyperdriveSdkError } from "src/errors/HyperdriveSdkError"; +import { HyperdriveSdkError } from "src/HyperdriveSdkError"; export type AssetType = "LP" | "LONG" | "SHORT" | "WITHDRAWAL_SHARE"; export function parseAssetType(identifier: number): AssetType { diff --git a/packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts b/packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts index e7f85bf9a..6128d7ede 100644 --- a/packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts +++ b/packages/hyperdrive-js/src/token/eth/ReadWriteEth.ts @@ -1,8 +1,8 @@ import { Drift, ReadWriteAdapter } from "@delvtech/drift"; import { ReadWriteClientOptions } from "src/drift/ReadWriteClient"; -import { MethodNotImplementedError } from "src/errors/MethodNotImplementedError"; -import { ReadWriteToken } from "src/token/ReadWriteToken"; +import { HyperdriveSdkError } from "src/HyperdriveSdkError"; import { ReadEth } from "src/token/eth/ReadEth"; +import { ReadWriteToken } from "src/token/ReadWriteToken"; export interface ReadWriteEthOptions extends ReadWriteClientOptions {} @@ -15,12 +15,22 @@ export class ReadWriteEth extends ReadEth implements ReadWriteToken { /** * This method is not available for the native ETH token. - * @throws A {@linkcode MethodNotImplementedError} + * @throws A {@linkcode HyperdriveSdkError} */ async approve(): Promise<`0x${string}`> { - throw new MethodNotImplementedError({ - objectName: this.debugName, - methodName: "approve", - }); + throw new HyperdriveSdkError( + "This method is not available for the native ETH token.", + ); } } + +export interface MethodNotImplementedErrorOptions { + /** + * The name of the object that the method was not implemented in. + */ + objectName: string; + /** + * The name of the method that was not implemented. + */ + methodName: string; +} From 4fcdbbce478aad99ff964cbebd03207bc50cfbe3 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Thu, 7 Nov 2024 22:44:58 -0600 Subject: [PATCH 37/43] Consolidate hyperdrive dirs --- .../calculateAprFromPrice.test.ts | 2 +- .../utils => base}/calculateAprFromPrice.ts | 0 packages/hyperdrive-js/src/exports/index.ts | 24 +++++++------ packages/hyperdrive-js/src/exports/v1.0.14.ts | 4 +-- .../hyperdrive-js/src/factory/ReadFactory.ts | 2 +- .../src/factory/ReadWriteFactory.ts | 2 +- .../{base => }/ReadHyperdrive.test.ts | 10 +++--- .../hyperdrive/{base => }/ReadHyperdrive.ts | 36 +++++++++---------- .../{base => }/ReadWriteHyperdrive.ts | 4 +-- .../src/hyperdrive/{base => }/abi.ts | 0 .../v1.0.14/ReadWriteHyperdrive_v1_0_14.ts | 6 ---- .../checkpoint/getCheckpointTime.ts | 0 .../src/{ => hyperdrive}/checkpoint/types.ts | 2 +- .../decodeAssetFromTransferSingleEventData.ts | 2 +- .../erc4626/ReadErc4626Hyperdrive.ts | 2 +- .../erc4626/ReadMockErc4626Hyperdrive.ts | 2 +- .../erc4626/ReadWriteErc4626Hyperdrive.ts | 2 +- .../v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts | 2 +- .../ReadWriteErc4626Hyperdrive_v1_0_14.ts | 2 +- .../hyperdrive/ezeth/ReadEzEthHyperdrive.ts | 2 +- .../ezeth/ReadWriteEzEthHyperdrive.ts | 2 +- .../v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts | 2 +- .../ReadWriteEzEthHyperdrive_v1_0_14.ts | 2 +- .../src/hyperdrive/getHyperdrive.ts | 10 +++--- .../calculateMatureLongYieldAfterFees.test.ts | 2 +- .../calculateMatureLongYieldAfterFees.ts | 0 .../src/{ => hyperdrive}/longs/types.ts | 0 .../src/{ => hyperdrive}/lp/ClosedLpShares.ts | 0 .../src/{ => hyperdrive}/lp/assetId.ts | 0 .../hyperdrive/lseth/ReadLsEthHyperdrive.ts | 2 +- .../lseth/ReadWriteLsEthHyperdrive.ts | 2 +- .../v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts | 2 +- .../ReadWriteLsEthHyperdrive_v1_0_14.ts | 2 +- .../{pool => hyperdrive}/parseAssetType.ts | 0 .../src/hyperdrive/reth/ReadREthHyperdrive.ts | 2 +- .../reth/ReadWriteREthHyperdrive.ts | 2 +- .../v1.0.14/ReadREthHyperdrive_v1_0_14.ts | 2 +- .../ReadWriteREthHyperdrive_v1_0_14.ts | 2 +- .../shorts/calculateShortAccruedYield.test.ts | 2 +- .../shorts/calculateShortAccruedYield.ts | 0 .../src/{ => hyperdrive}/shorts/types.ts | 0 .../hyperdrive/steth/ReadStEthHyperdrive.ts | 2 +- .../steth/ReadWriteStEthHyperdrive.ts | 2 +- .../v1.0.14/ReadStEthHyperdrive_v1_0_14.ts | 2 +- .../ReadWriteStEthHyperdrive_v1_0_14.ts | 2 +- .../testing/PoolConfig.ts | 2 +- .../{pool => hyperdrive}/testing/PoolInfo.ts | 2 +- .../{base => }/testing/setupReadHyperdrive.ts | 2 +- .../src/{pool => hyperdrive}/types.ts | 2 +- .../v1.0.14/ReadHyperdrive_v1_0_14.ts | 2 +- .../v1.0.14/ReadWriteHyperdrive_v1_0_14.ts | 6 ++++ .../RedeemedWithdrawalShares.ts | 0 .../withdrawalShares/assetId.ts | 0 .../src/registry/ReadRegistry.ts | 2 +- .../src/registry/ReadWriteRegistry.ts | 2 +- 55 files changed, 87 insertions(+), 83 deletions(-) rename packages/hyperdrive-js/src/{hyperdrive/utils => base}/calculateAprFromPrice.test.ts (80%) rename packages/hyperdrive-js/src/{hyperdrive/utils => base}/calculateAprFromPrice.ts (100%) rename packages/hyperdrive-js/src/hyperdrive/{base => }/ReadHyperdrive.test.ts (99%) rename packages/hyperdrive-js/src/hyperdrive/{base => }/ReadHyperdrive.ts (98%) rename packages/hyperdrive-js/src/hyperdrive/{base => }/ReadWriteHyperdrive.ts (99%) rename packages/hyperdrive-js/src/hyperdrive/{base => }/abi.ts (100%) delete mode 100644 packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts rename packages/hyperdrive-js/src/{ => hyperdrive}/checkpoint/getCheckpointTime.ts (100%) rename packages/hyperdrive-js/src/{ => hyperdrive}/checkpoint/types.ts (95%) rename packages/hyperdrive-js/src/{pool => hyperdrive}/decodeAssetFromTransferSingleEventData.ts (87%) rename packages/hyperdrive-js/src/{ => hyperdrive}/longs/calculateMatureLongYieldAfterFees.test.ts (86%) rename packages/hyperdrive-js/src/{ => hyperdrive}/longs/calculateMatureLongYieldAfterFees.ts (100%) rename packages/hyperdrive-js/src/{ => hyperdrive}/longs/types.ts (100%) rename packages/hyperdrive-js/src/{ => hyperdrive}/lp/ClosedLpShares.ts (100%) rename packages/hyperdrive-js/src/{ => hyperdrive}/lp/assetId.ts (100%) rename packages/hyperdrive-js/src/{pool => hyperdrive}/parseAssetType.ts (100%) rename packages/hyperdrive-js/src/{ => hyperdrive}/shorts/calculateShortAccruedYield.test.ts (84%) rename packages/hyperdrive-js/src/{ => hyperdrive}/shorts/calculateShortAccruedYield.ts (100%) rename packages/hyperdrive-js/src/{ => hyperdrive}/shorts/types.ts (100%) rename packages/hyperdrive-js/src/{pool => hyperdrive}/testing/PoolConfig.ts (95%) rename packages/hyperdrive-js/src/{pool => hyperdrive}/testing/PoolInfo.ts (91%) rename packages/hyperdrive-js/src/hyperdrive/{base => }/testing/setupReadHyperdrive.ts (92%) rename packages/hyperdrive-js/src/{pool => hyperdrive}/types.ts (82%) rename packages/hyperdrive-js/src/hyperdrive/{base => }/v1.0.14/ReadHyperdrive_v1_0_14.ts (97%) create mode 100644 packages/hyperdrive-js/src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts rename packages/hyperdrive-js/src/{ => hyperdrive}/withdrawalShares/RedeemedWithdrawalShares.ts (100%) rename packages/hyperdrive-js/src/{ => hyperdrive}/withdrawalShares/assetId.ts (100%) diff --git a/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.test.ts b/packages/hyperdrive-js/src/base/calculateAprFromPrice.test.ts similarity index 80% rename from packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.test.ts rename to packages/hyperdrive-js/src/base/calculateAprFromPrice.test.ts index a76928fcf..5cbbbd160 100644 --- a/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.test.ts +++ b/packages/hyperdrive-js/src/base/calculateAprFromPrice.test.ts @@ -1,4 +1,4 @@ -import { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; +import { calculateAprFromPrice } from "src/base/calculateAprFromPrice"; import { expect, test } from "vitest"; test("calculateAprFromPrice should return fixed rate an open long position is currently earning", async () => { diff --git a/packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.ts b/packages/hyperdrive-js/src/base/calculateAprFromPrice.ts similarity index 100% rename from packages/hyperdrive-js/src/hyperdrive/utils/calculateAprFromPrice.ts rename to packages/hyperdrive-js/src/base/calculateAprFromPrice.ts diff --git a/packages/hyperdrive-js/src/exports/index.ts b/packages/hyperdrive-js/src/exports/index.ts index 9ee4c7943..419df7227 100644 --- a/packages/hyperdrive-js/src/exports/index.ts +++ b/packages/hyperdrive-js/src/exports/index.ts @@ -8,15 +8,15 @@ export { type HyperdriveOptions, } from "src/hyperdrive/getHyperdrive"; -export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/base/abi"; +export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/abi"; export { ReadHyperdrive, type ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; +} from "src/hyperdrive/ReadHyperdrive"; export { ReadWriteHyperdrive, type ReadWriteHyperdriveOptions, -} from "src/hyperdrive/base/ReadWriteHyperdrive"; +} from "src/hyperdrive/ReadWriteHyperdrive"; // erc-4626 export { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; @@ -50,27 +50,31 @@ export { type ReadWriteStEthHyperdriveOptions, } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; -export { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; +export { calculateAprFromPrice } from "src/base/calculateAprFromPrice"; // pool -export type { PoolConfig, PoolInfo } from "src/pool/types"; +export type { PoolConfig, PoolInfo } from "src/hyperdrive/types"; // shorts -export type { ClosedShort, OpenShort, Short } from "src/shorts/types"; +export type { + ClosedShort, + OpenShort, + Short, +} from "src/hyperdrive/shorts/types"; // longs -export { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; +export { calculateMatureLongYieldAfterFees } from "src/hyperdrive/longs/calculateMatureLongYieldAfterFees"; export type { ClosedLong, Long, OpenLongPositionReceived, -} from "src/longs/types"; +} from "src/hyperdrive/longs/types"; // lp -export type { ClosedLpShares } from "src/lp/ClosedLpShares"; +export type { ClosedLpShares } from "src/hyperdrive/lp/ClosedLpShares"; // withdrawal shares -export type { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; +export type { RedeemedWithdrawalShares } from "src/hyperdrive/withdrawalShares/RedeemedWithdrawalShares"; // Registry // diff --git a/packages/hyperdrive-js/src/exports/v1.0.14.ts b/packages/hyperdrive-js/src/exports/v1.0.14.ts index ccd7f5935..46bc42e7e 100644 --- a/packages/hyperdrive-js/src/exports/v1.0.14.ts +++ b/packages/hyperdrive-js/src/exports/v1.0.14.ts @@ -1,6 +1,6 @@ // base -export { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; -export { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +export { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; +export { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14"; // erc-4626 export { ReadErc4626Hyperdrive_v1_0_14 } from "src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14"; diff --git a/packages/hyperdrive-js/src/factory/ReadFactory.ts b/packages/hyperdrive-js/src/factory/ReadFactory.ts index dc3812d28..936b6b607 100644 --- a/packages/hyperdrive-js/src/factory/ReadFactory.ts +++ b/packages/hyperdrive-js/src/factory/ReadFactory.ts @@ -3,7 +3,7 @@ import { Address } from "abitype"; import { ReadContractClientOptions } from "src/drift/ContractClient"; import { ReadClient } from "src/drift/ReadClient"; import { FactoryAbi, factoryAbi } from "src/factory/abi"; -import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadHyperdrive } from "src/hyperdrive/ReadHyperdrive"; export interface ReadFactoryOptions extends ReadContractClientOptions {} diff --git a/packages/hyperdrive-js/src/factory/ReadWriteFactory.ts b/packages/hyperdrive-js/src/factory/ReadWriteFactory.ts index 04036fbcc..f37740105 100644 --- a/packages/hyperdrive-js/src/factory/ReadWriteFactory.ts +++ b/packages/hyperdrive-js/src/factory/ReadWriteFactory.ts @@ -8,7 +8,7 @@ import { import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; import { ReadFactory, ReadFactoryOptions } from "src/factory/ReadFactory"; import { FactoryAbi } from "src/factory/abi"; -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteHyperdrive } from "src/hyperdrive/ReadWriteHyperdrive"; export interface ReadWriteFactoryOptions extends ReplaceProps {} diff --git a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.test.ts b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts similarity index 99% rename from packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.test.ts rename to packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts index 881928679..c622fdef6 100644 --- a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.test.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts @@ -1,14 +1,14 @@ import { ZERO_ADDRESS } from "@delvtech/drift"; import { fixed, parseFixed } from "@delvtech/fixed-point-wasm"; import { ALICE, BOB } from "src/base/testing/accounts"; -import { CheckpointEvent } from "src/checkpoint/types"; -import { setupReadHyperdrive } from "src/hyperdrive/base/testing/setupReadHyperdrive"; -import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; +import { CheckpointEvent } from "src/hyperdrive/checkpoint/types"; +import { decodeAssetFromTransferSingleEventData } from "src/hyperdrive/decodeAssetFromTransferSingleEventData"; import { simplePoolConfig30Days, simplePoolConfig7Days, -} from "src/pool/testing/PoolConfig"; -import { simplePoolInfo } from "src/pool/testing/PoolInfo"; +} from "src/hyperdrive/testing/PoolConfig"; +import { simplePoolInfo } from "src/hyperdrive/testing/PoolInfo"; +import { setupReadHyperdrive } from "src/hyperdrive/testing/setupReadHyperdrive"; import { assert, expect, test } from "vitest"; test("getVersion should return the parsed version of the contract", async () => { diff --git a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts similarity index 98% rename from packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts rename to packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts index 854ed175d..30aad534e 100644 --- a/packages/hyperdrive-js/src/hyperdrive/base/ReadHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts @@ -11,37 +11,37 @@ import { } from "@delvtech/drift"; import { HyperdriveSdkError } from "src/HyperdriveSdkError"; import { assertNever } from "src/base/assertNever"; +import { calculateAprFromPrice } from "src/base/calculateAprFromPrice"; import { MAX_UINT256, SECONDS_PER_YEAR } from "src/base/constants"; -import { getCheckpointTime } from "src/checkpoint/getCheckpointTime"; +import { ReadContractClientOptions } from "src/drift/ContractClient"; +import { ReadClient } from "src/drift/ReadClient"; +import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; +import { fixed } from "src/fixed-point"; +import { HyperdriveAbi, hyperdriveAbi } from "src/hyperdrive/abi"; +import { getCheckpointTime } from "src/hyperdrive/checkpoint/getCheckpointTime"; import { Checkpoint, CheckpointEvent, GetCheckpointParams, GetCheckpointTimeParams, -} from "src/checkpoint/types"; -import { ReadContractClientOptions } from "src/drift/ContractClient"; -import { ReadClient } from "src/drift/ReadClient"; -import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; -import { fixed } from "src/fixed-point"; -import { HyperdriveAbi, hyperdriveAbi } from "src/hyperdrive/base/abi"; +} from "src/hyperdrive/checkpoint/types"; import { MAX_ITERATIONS, NULL_BYTES } from "src/hyperdrive/constants"; -import { calculateAprFromPrice } from "src/hyperdrive/utils/calculateAprFromPrice"; -import { hyperwasm } from "src/hyperwasm"; +import { decodeAssetFromTransferSingleEventData } from "src/hyperdrive/decodeAssetFromTransferSingleEventData"; import { ClosedLong, Long, OpenLongPositionReceivedWithoutDetails, -} from "src/longs/types"; -import { ClosedLpShares } from "src/lp/ClosedLpShares"; -import { LP_ASSET_ID } from "src/lp/assetId"; -import { decodeAssetFromTransferSingleEventData } from "src/pool/decodeAssetFromTransferSingleEventData"; -import { MarketState, PoolConfig, PoolInfo } from "src/pool/types"; -import { calculateShortAccruedYield } from "src/shorts/calculateShortAccruedYield"; -import { ClosedShort, OpenShort } from "src/shorts/types"; +} from "src/hyperdrive/longs/types"; +import { ClosedLpShares } from "src/hyperdrive/lp/ClosedLpShares"; +import { LP_ASSET_ID } from "src/hyperdrive/lp/assetId"; +import { calculateShortAccruedYield } from "src/hyperdrive/shorts/calculateShortAccruedYield"; +import { ClosedShort, OpenShort } from "src/hyperdrive/shorts/types"; +import { MarketState, PoolConfig, PoolInfo } from "src/hyperdrive/types"; +import { RedeemedWithdrawalShares } from "src/hyperdrive/withdrawalShares/RedeemedWithdrawalShares"; +import { WITHDRAW_SHARES_ASSET_ID } from "src/hyperdrive/withdrawalShares/assetId"; +import { hyperwasm } from "src/hyperwasm"; import { ReadErc20 } from "src/token/erc20/ReadErc20"; import { ReadEth } from "src/token/eth/ReadEth"; -import { RedeemedWithdrawalShares } from "src/withdrawalShares/RedeemedWithdrawalShares"; -import { WITHDRAW_SHARES_ASSET_ID } from "src/withdrawalShares/assetId"; export interface ReadHyperdriveOptions extends ReadContractClientOptions {} diff --git a/packages/hyperdrive-js/src/hyperdrive/base/ReadWriteHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts similarity index 99% rename from packages/hyperdrive-js/src/hyperdrive/base/ReadWriteHyperdrive.ts rename to packages/hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts index e9b3f7c34..9ac7b67b5 100644 --- a/packages/hyperdrive-js/src/hyperdrive/base/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts @@ -6,9 +6,9 @@ import { ReadWriteContract, } from "@delvtech/drift"; import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; -import { HyperdriveAbi } from "src/hyperdrive/base/abi"; -import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { HyperdriveAbi } from "src/hyperdrive/abi"; import { NULL_BYTES } from "src/hyperdrive/constants"; +import { ReadHyperdrive } from "src/hyperdrive/ReadHyperdrive"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; diff --git a/packages/hyperdrive-js/src/hyperdrive/base/abi.ts b/packages/hyperdrive-js/src/hyperdrive/abi.ts similarity index 100% rename from packages/hyperdrive-js/src/hyperdrive/base/abi.ts rename to packages/hyperdrive-js/src/hyperdrive/abi.ts diff --git a/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts deleted file mode 100644 index 1df627632..000000000 --- a/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; -import { readHyperdriveMixin_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; - -export class ReadWriteHyperdrive_v1_0_14 extends readHyperdriveMixin_v1_0_14( - ReadWriteHyperdrive, -) {} diff --git a/packages/hyperdrive-js/src/checkpoint/getCheckpointTime.ts b/packages/hyperdrive-js/src/hyperdrive/checkpoint/getCheckpointTime.ts similarity index 100% rename from packages/hyperdrive-js/src/checkpoint/getCheckpointTime.ts rename to packages/hyperdrive-js/src/hyperdrive/checkpoint/getCheckpointTime.ts diff --git a/packages/hyperdrive-js/src/checkpoint/types.ts b/packages/hyperdrive-js/src/hyperdrive/checkpoint/types.ts similarity index 95% rename from packages/hyperdrive-js/src/checkpoint/types.ts rename to packages/hyperdrive-js/src/hyperdrive/checkpoint/types.ts index 12189c98b..67b0c0450 100644 --- a/packages/hyperdrive-js/src/checkpoint/types.ts +++ b/packages/hyperdrive-js/src/hyperdrive/checkpoint/types.ts @@ -4,7 +4,7 @@ import { FunctionReturn, Pretty, } from "@delvtech/drift"; -import { HyperdriveAbi } from "src/hyperdrive/base/abi"; +import { HyperdriveAbi } from "src/hyperdrive/abi"; export type Checkpoint = Pretty< { diff --git a/packages/hyperdrive-js/src/pool/decodeAssetFromTransferSingleEventData.ts b/packages/hyperdrive-js/src/hyperdrive/decodeAssetFromTransferSingleEventData.ts similarity index 87% rename from packages/hyperdrive-js/src/pool/decodeAssetFromTransferSingleEventData.ts rename to packages/hyperdrive-js/src/hyperdrive/decodeAssetFromTransferSingleEventData.ts index 2e5d3695b..513ab533e 100644 --- a/packages/hyperdrive-js/src/pool/decodeAssetFromTransferSingleEventData.ts +++ b/packages/hyperdrive-js/src/hyperdrive/decodeAssetFromTransferSingleEventData.ts @@ -1,4 +1,4 @@ -import { AssetType, parseAssetType } from "src/pool/parseAssetType"; +import { AssetType, parseAssetType } from "src/hyperdrive/parseAssetType"; export function decodeAssetFromTransferSingleEventData( eventData: `0x${string}`, diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts index 70d851039..0d571bdcd 100644 --- a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadErc4626Hyperdrive.ts @@ -3,7 +3,7 @@ import { Constructor } from "src/base/types"; import { ReadHyperdrive, ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; +} from "src/hyperdrive/ReadHyperdrive"; import { ReadErc4626 } from "src/token/erc4626/ReadErc4626"; export class ReadErc4626Hyperdrive extends readErc4626HyperdriveMixin( diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts index ba9c38c47..598ed4e22 100644 --- a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadMockErc4626Hyperdrive.ts @@ -1,6 +1,6 @@ import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; -import { ReadHyperdriveOptions } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadHyperdriveOptions } from "src/hyperdrive/ReadHyperdrive"; import { ReadErc4626Hyperdrive } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; import { ReadMockErc4626 } from "src/token/erc4626/ReadMockErc4626"; diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts index 0db4b1511..dd3765b9c 100644 --- a/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive.ts @@ -1,6 +1,6 @@ import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteHyperdrive } from "src/hyperdrive/ReadWriteHyperdrive"; import { ReadErc4626HyperdriveMixin, readErc4626HyperdriveMixin, diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts index 2decde5e7..53027b227 100644 --- a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadErc4626Hyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; import { readErc4626HyperdriveMixin } from "src/hyperdrive/erc4626/ReadErc4626Hyperdrive"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; export class ReadErc4626Hyperdrive_v1_0_14 extends readErc4626HyperdriveMixin( ReadHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts index a888094f3..d15d937ba 100644 --- a/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/erc4626/v1.0.14/ReadWriteErc4626Hyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; import { readWriteErc4626HyperdriveMixin } from "src/hyperdrive/erc4626/ReadWriteErc4626Hyperdrive"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14"; export class ReadWriteErc4626Hyperdrive_v1_0_14 extends readWriteErc4626HyperdriveMixin( ReadWriteHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts index 05c7e2ec4..3371f388e 100644 --- a/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadEzEthHyperdrive.ts @@ -1,6 +1,6 @@ import { Contract, ContractReadOptions, ReadContract } from "@delvtech/drift"; import { Constructor } from "src/base/types"; -import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadHyperdrive } from "src/hyperdrive/ReadHyperdrive"; import { EzEthHyperdriveAbi, ezEthHyperdriveAbi, diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts index 9db9b52dc..9b46bdc3d 100644 --- a/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive.ts @@ -1,6 +1,6 @@ import { ContractReadOptions, ReadWriteContract } from "@delvtech/drift"; import { Constructor } from "src/base/types"; -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteHyperdrive } from "src/hyperdrive/ReadWriteHyperdrive"; import { ReadEzEthHyperdriveMixin, readEzEthHyperdriveMixin, diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts index d1e240984..d4988ed07 100644 --- a/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadEzEthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; import { readEzEthHyperdriveMixin } from "src/hyperdrive/ezeth/ReadEzEthHyperdrive"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; export class ReadEzEthHyperdrive_v1_0_14 extends readEzEthHyperdriveMixin( ReadHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts index 7d8c1ddc8..5df3ff2bd 100644 --- a/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ezeth/v1.0.14/ReadWriteEzEthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; import { readWriteEzEthHyperdriveMixin } from "src/hyperdrive/ezeth/ReadWriteEzEthHyperdrive"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14"; export class ReadWriteEzEthHyperdrive_v1_0_14 extends readWriteEzEthHyperdriveMixin( ReadWriteHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts index fde57e04a..062016ff7 100644 --- a/packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/getHyperdrive.ts @@ -1,20 +1,20 @@ import { Drift, ReadWriteAdapter } from "@delvtech/drift"; import semver from "semver"; -import { hyperdriveAbi } from "src/hyperdrive/base/abi"; +import { hyperdriveAbi } from "src/hyperdrive/abi"; import { ReadHyperdrive, ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; +} from "src/hyperdrive/ReadHyperdrive"; import { ReadWriteHyperdrive, ReadWriteHyperdriveOptions, -} from "src/hyperdrive/base/ReadWriteHyperdrive"; -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; -import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; +} from "src/hyperdrive/ReadWriteHyperdrive"; import { ReadStEthHyperdrive } from "src/hyperdrive/steth/ReadStEthHyperdrive"; import { ReadWriteStEthHyperdrive } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; import { ReadStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14"; import { ReadWriteStEthHyperdrive_v1_0_14 } from "src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14"; export interface HyperdriveOptions extends ReadHyperdriveOptions { diff --git a/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.test.ts b/packages/hyperdrive-js/src/hyperdrive/longs/calculateMatureLongYieldAfterFees.test.ts similarity index 86% rename from packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.test.ts rename to packages/hyperdrive-js/src/hyperdrive/longs/calculateMatureLongYieldAfterFees.test.ts index 7ad8e9be7..59e8c0693 100644 --- a/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.test.ts +++ b/packages/hyperdrive-js/src/hyperdrive/longs/calculateMatureLongYieldAfterFees.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "vitest"; -import { calculateMatureLongYieldAfterFees } from "src/longs/calculateMatureLongYieldAfterFees"; +import { calculateMatureLongYieldAfterFees } from "src/hyperdrive/longs/calculateMatureLongYieldAfterFees"; test("calculateMatureLongYieldAfterFees should return the yield a mature long has earned after fees", async () => { const value = calculateMatureLongYieldAfterFees({ diff --git a/packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.ts b/packages/hyperdrive-js/src/hyperdrive/longs/calculateMatureLongYieldAfterFees.ts similarity index 100% rename from packages/hyperdrive-js/src/longs/calculateMatureLongYieldAfterFees.ts rename to packages/hyperdrive-js/src/hyperdrive/longs/calculateMatureLongYieldAfterFees.ts diff --git a/packages/hyperdrive-js/src/longs/types.ts b/packages/hyperdrive-js/src/hyperdrive/longs/types.ts similarity index 100% rename from packages/hyperdrive-js/src/longs/types.ts rename to packages/hyperdrive-js/src/hyperdrive/longs/types.ts diff --git a/packages/hyperdrive-js/src/lp/ClosedLpShares.ts b/packages/hyperdrive-js/src/hyperdrive/lp/ClosedLpShares.ts similarity index 100% rename from packages/hyperdrive-js/src/lp/ClosedLpShares.ts rename to packages/hyperdrive-js/src/hyperdrive/lp/ClosedLpShares.ts diff --git a/packages/hyperdrive-js/src/lp/assetId.ts b/packages/hyperdrive-js/src/hyperdrive/lp/assetId.ts similarity index 100% rename from packages/hyperdrive-js/src/lp/assetId.ts rename to packages/hyperdrive-js/src/hyperdrive/lp/assetId.ts diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts index 3f90a02b4..d3cc5f1c4 100644 --- a/packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadLsEthHyperdrive.ts @@ -3,7 +3,7 @@ import { Constructor } from "src/base/types"; import { ReadHyperdrive, ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; +} from "src/hyperdrive/ReadHyperdrive"; import { ReadEth } from "src/token/eth/ReadEth"; import { ReadLsEth } from "src/token/lseth/ReadLsEth"; diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts index ddca694a7..c612beac8 100644 --- a/packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/ReadWriteLsEthHyperdrive.ts @@ -1,6 +1,6 @@ import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteHyperdrive } from "src/hyperdrive/ReadWriteHyperdrive"; import { ReadLsEthHyperdriveMixin, readLsEthHyperdriveMixin, diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts index ea5012d91..dda8c19ff 100644 --- a/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadLsEthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; import { readLsEthHyperdriveMixin } from "src/hyperdrive/lseth/ReadLsEthHyperdrive"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; export class ReadLsEthHyperdrive_v1_0_14 extends readLsEthHyperdriveMixin( ReadHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts index 6fa9d551b..9c1af2886 100644 --- a/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/lseth/v1.0.14/ReadWriteLsEthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; import { readWriteLsEthHyperdriveMixin } from "src/hyperdrive/lseth/ReadWriteLsEthHyperdrive"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14"; export class ReadWriteLsEthHyperdrive_v1_0_14 extends readWriteLsEthHyperdriveMixin( ReadWriteHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/pool/parseAssetType.ts b/packages/hyperdrive-js/src/hyperdrive/parseAssetType.ts similarity index 100% rename from packages/hyperdrive-js/src/pool/parseAssetType.ts rename to packages/hyperdrive-js/src/hyperdrive/parseAssetType.ts diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts index 708c1b57c..379f9744f 100644 --- a/packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/reth/ReadREthHyperdrive.ts @@ -4,7 +4,7 @@ import { Constructor } from "src/base/types"; import { ReadHyperdrive, ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; +} from "src/hyperdrive/ReadHyperdrive"; import { ReadEth } from "src/token/eth/ReadEth"; import { ReadREth } from "src/token/reth/ReadREth"; diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts index 0fa108bf3..6c3f708d3 100644 --- a/packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/reth/ReadWriteREthHyperdrive.ts @@ -1,6 +1,6 @@ import { ContractReadOptions } from "@delvtech/drift"; import { Constructor } from "src/base/types"; -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteHyperdrive } from "src/hyperdrive/ReadWriteHyperdrive"; import { readREthHyperdriveMixin } from "src/hyperdrive/reth/ReadREthHyperdrive"; import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; import { ReadWriteREth } from "src/token/reth/ReadWriteREth"; diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts index 07af3d1d0..210b61cd8 100644 --- a/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadREthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; import { readREthHyperdriveMixin } from "src/hyperdrive/reth/ReadREthHyperdrive"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; export class ReadREthHyperdrive_v1_0_14 extends readREthHyperdriveMixin( ReadHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts index 8f801c7e8..9e0fe9a60 100644 --- a/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/reth/v1.0.14/ReadWriteREthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; import { readWriteREthHyperdriveMixin } from "src/hyperdrive/reth/ReadWriteREthHyperdrive"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14"; export class ReadWriteREthHyperdrive_v1_0_14 extends readWriteREthHyperdriveMixin( ReadWriteHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.test.ts b/packages/hyperdrive-js/src/hyperdrive/shorts/calculateShortAccruedYield.test.ts similarity index 84% rename from packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.test.ts rename to packages/hyperdrive-js/src/hyperdrive/shorts/calculateShortAccruedYield.test.ts index 52bc43e9d..52cfb34f7 100644 --- a/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.test.ts +++ b/packages/hyperdrive-js/src/hyperdrive/shorts/calculateShortAccruedYield.test.ts @@ -1,4 +1,4 @@ -import { calculateShortAccruedYield } from "src/shorts/calculateShortAccruedYield"; +import { calculateShortAccruedYield } from "src/hyperdrive/shorts/calculateShortAccruedYield"; import { expect, test } from "vitest"; test("calculateShortAccruedYield should return the yield a short has accrued since it was opened", async () => { diff --git a/packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.ts b/packages/hyperdrive-js/src/hyperdrive/shorts/calculateShortAccruedYield.ts similarity index 100% rename from packages/hyperdrive-js/src/shorts/calculateShortAccruedYield.ts rename to packages/hyperdrive-js/src/hyperdrive/shorts/calculateShortAccruedYield.ts diff --git a/packages/hyperdrive-js/src/shorts/types.ts b/packages/hyperdrive-js/src/hyperdrive/shorts/types.ts similarity index 100% rename from packages/hyperdrive-js/src/shorts/types.ts rename to packages/hyperdrive-js/src/hyperdrive/shorts/types.ts diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts index a77b69474..b6fffb32e 100644 --- a/packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/steth/ReadStEthHyperdrive.ts @@ -4,7 +4,7 @@ import { fixed } from "src/fixed-point"; import { ReadHyperdrive, ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; +} from "src/hyperdrive/ReadHyperdrive"; import { ReadEth } from "src/token/eth/ReadEth"; import { ReadStEth } from "src/token/steth/ReadStEth"; diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts index 17a0e466d..2e9713b95 100644 --- a/packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/steth/ReadWriteStEthHyperdrive.ts @@ -3,7 +3,7 @@ import { Constructor } from "src/base/types"; import { ReadWriteHyperdrive, ReadWriteHyperdriveOptions, -} from "src/hyperdrive/base/ReadWriteHyperdrive"; +} from "src/hyperdrive/ReadWriteHyperdrive"; import { ReadStEthHyperdriveMixin, readStEthHyperdriveMixin, diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts index 918a64606..5e0fcec8c 100644 --- a/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadStEthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; import { readStEthHyperdriveMixin } from "src/hyperdrive/steth/ReadStEthHyperdrive"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; export class ReadStEthHyperdrive_v1_0_14 extends readStEthHyperdriveMixin( ReadHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts index c09a4db22..fceb48f75 100644 --- a/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/steth/v1.0.14/ReadWriteStEthHyperdrive_v1_0_14.ts @@ -1,5 +1,5 @@ -import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadWriteHyperdrive_v1_0_14"; import { readWriteStEthHyperdriveMixin } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; +import { ReadWriteHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14"; export class ReadWriteStEthHyperdrive_v1_0_14 extends readWriteStEthHyperdriveMixin( ReadWriteHyperdrive_v1_0_14, diff --git a/packages/hyperdrive-js/src/pool/testing/PoolConfig.ts b/packages/hyperdrive-js/src/hyperdrive/testing/PoolConfig.ts similarity index 95% rename from packages/hyperdrive-js/src/pool/testing/PoolConfig.ts rename to packages/hyperdrive-js/src/hyperdrive/testing/PoolConfig.ts index e33846877..8a4b9ddb9 100644 --- a/packages/hyperdrive-js/src/pool/testing/PoolConfig.ts +++ b/packages/hyperdrive-js/src/hyperdrive/testing/PoolConfig.ts @@ -1,5 +1,5 @@ import { ZERO_ADDRESS } from "src/base/constants"; -import { PoolConfig } from "src/pool/types"; +import { PoolConfig } from "src/hyperdrive/types"; const SEVEN_DAYS = 604_800n; export const simplePoolConfig7Days: PoolConfig = { diff --git a/packages/hyperdrive-js/src/pool/testing/PoolInfo.ts b/packages/hyperdrive-js/src/hyperdrive/testing/PoolInfo.ts similarity index 91% rename from packages/hyperdrive-js/src/pool/testing/PoolInfo.ts rename to packages/hyperdrive-js/src/hyperdrive/testing/PoolInfo.ts index eab8000b6..e5c0eab58 100644 --- a/packages/hyperdrive-js/src/pool/testing/PoolInfo.ts +++ b/packages/hyperdrive-js/src/hyperdrive/testing/PoolInfo.ts @@ -1,4 +1,4 @@ -import { PoolInfo } from "src/pool/types"; +import { PoolInfo } from "src/hyperdrive/types"; export const simplePoolInfo: PoolInfo = { shareReserves: 10000000000000000000000000n, diff --git a/packages/hyperdrive-js/src/hyperdrive/base/testing/setupReadHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/testing/setupReadHyperdrive.ts similarity index 92% rename from packages/hyperdrive-js/src/hyperdrive/base/testing/setupReadHyperdrive.ts rename to packages/hyperdrive-js/src/hyperdrive/testing/setupReadHyperdrive.ts index 8b438f490..9a66e09ee 100644 --- a/packages/hyperdrive-js/src/hyperdrive/base/testing/setupReadHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/testing/setupReadHyperdrive.ts @@ -1,6 +1,6 @@ import { ZERO_ADDRESS } from "@delvtech/drift"; import { MockDrift } from "@delvtech/drift/testing"; -import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14"; +import { ReadHyperdrive_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; // No need to explicitly set return types as they are already set in the Stubs // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types diff --git a/packages/hyperdrive-js/src/pool/types.ts b/packages/hyperdrive-js/src/hyperdrive/types.ts similarity index 82% rename from packages/hyperdrive-js/src/pool/types.ts rename to packages/hyperdrive-js/src/hyperdrive/types.ts index 36c6d73f1..a32a85a16 100644 --- a/packages/hyperdrive-js/src/pool/types.ts +++ b/packages/hyperdrive-js/src/hyperdrive/types.ts @@ -1,5 +1,5 @@ import { FunctionReturn } from "@delvtech/drift"; -import { HyperdriveAbi } from "src/hyperdrive/base/abi"; +import { HyperdriveAbi } from "src/hyperdrive/abi"; export type PoolConfig = FunctionReturn; export type PoolInfo = FunctionReturn; diff --git a/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14.ts similarity index 97% rename from packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts rename to packages/hyperdrive-js/src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14.ts index 4c03e7e9c..167b4df45 100644 --- a/packages/hyperdrive-js/src/hyperdrive/base/v1.0.14/ReadHyperdrive_v1_0_14.ts +++ b/packages/hyperdrive-js/src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14.ts @@ -4,7 +4,7 @@ import { fixed } from "src/fixed-point"; import { ReadHyperdrive, ReadHyperdriveOptions, -} from "src/hyperdrive/base/ReadHyperdrive"; +} from "src/hyperdrive/ReadHyperdrive"; /** * A Hyperdrive instance that is compatible with Hyperdrive <= v1.0.14. diff --git a/packages/hyperdrive-js/src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts b/packages/hyperdrive-js/src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts new file mode 100644 index 000000000..904c72b86 --- /dev/null +++ b/packages/hyperdrive-js/src/hyperdrive/v1.0.14/ReadWriteHyperdrive_v1_0_14.ts @@ -0,0 +1,6 @@ +import { ReadWriteHyperdrive } from "src/hyperdrive/ReadWriteHyperdrive"; +import { readHyperdriveMixin_v1_0_14 } from "src/hyperdrive/v1.0.14/ReadHyperdrive_v1_0_14"; + +export class ReadWriteHyperdrive_v1_0_14 extends readHyperdriveMixin_v1_0_14( + ReadWriteHyperdrive, +) {} diff --git a/packages/hyperdrive-js/src/withdrawalShares/RedeemedWithdrawalShares.ts b/packages/hyperdrive-js/src/hyperdrive/withdrawalShares/RedeemedWithdrawalShares.ts similarity index 100% rename from packages/hyperdrive-js/src/withdrawalShares/RedeemedWithdrawalShares.ts rename to packages/hyperdrive-js/src/hyperdrive/withdrawalShares/RedeemedWithdrawalShares.ts diff --git a/packages/hyperdrive-js/src/withdrawalShares/assetId.ts b/packages/hyperdrive-js/src/hyperdrive/withdrawalShares/assetId.ts similarity index 100% rename from packages/hyperdrive-js/src/withdrawalShares/assetId.ts rename to packages/hyperdrive-js/src/hyperdrive/withdrawalShares/assetId.ts diff --git a/packages/hyperdrive-js/src/registry/ReadRegistry.ts b/packages/hyperdrive-js/src/registry/ReadRegistry.ts index 4bfe1514f..267cacab3 100644 --- a/packages/hyperdrive-js/src/registry/ReadRegistry.ts +++ b/packages/hyperdrive-js/src/registry/ReadRegistry.ts @@ -3,7 +3,7 @@ import { Address } from "abitype"; import { ReadContractClientOptions } from "src/drift/ContractClient"; import { ReadClient } from "src/drift/ReadClient"; import { ReadFactory } from "src/factory/ReadFactory"; -import { ReadHyperdrive } from "src/hyperdrive/base/ReadHyperdrive"; +import { ReadHyperdrive } from "src/hyperdrive/ReadHyperdrive"; import { RegistryAbi, registryAbi } from "src/registry/abi"; import { FactoryInfoWithMetadata, diff --git a/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts b/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts index dc67671cf..91055374d 100644 --- a/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts +++ b/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts @@ -8,7 +8,7 @@ import { import { Address } from "abitype"; import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; import { ReadWriteFactory } from "src/factory/ReadWriteFactory"; -import { ReadWriteHyperdrive } from "src/hyperdrive/base/ReadWriteHyperdrive"; +import { ReadWriteHyperdrive } from "src/hyperdrive/ReadWriteHyperdrive"; import { ReadRegistry, ReadRegistryOptions } from "src/registry/ReadRegistry"; import { RegistryAbi } from "src/registry/abi"; import { ReadWriteInstanceInfoWithMetadata } from "src/registry/types"; From fc346ef64d14a624cda41eea6321df47c810b40b Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Fri, 8 Nov 2024 15:40:15 -0600 Subject: [PATCH 38/43] Move `NULL_BYTES` to base, assetId utils to new dir --- packages/hyperdrive-js/src/base/constants.ts | 2 ++ .../hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts | 2 +- packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts | 6 +++--- .../hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts | 2 +- .../{ => assetId}/decodeAssetFromTransferSingleEventData.ts | 5 ++++- .../src/hyperdrive/{ => assetId}/parseAssetType.ts | 0 packages/hyperdrive-js/src/hyperdrive/constants.ts | 3 --- 7 files changed, 11 insertions(+), 9 deletions(-) rename packages/hyperdrive-js/src/hyperdrive/{ => assetId}/decodeAssetFromTransferSingleEventData.ts (85%) rename packages/hyperdrive-js/src/hyperdrive/{ => assetId}/parseAssetType.ts (100%) diff --git a/packages/hyperdrive-js/src/base/constants.ts b/packages/hyperdrive-js/src/base/constants.ts index 68e3c47c4..e26a49b3b 100644 --- a/packages/hyperdrive-js/src/base/constants.ts +++ b/packages/hyperdrive-js/src/base/constants.ts @@ -4,3 +4,5 @@ export const MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n; export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; + +export const NULL_BYTES = "0x"; diff --git a/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts index c622fdef6..347d55c07 100644 --- a/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.test.ts @@ -1,8 +1,8 @@ import { ZERO_ADDRESS } from "@delvtech/drift"; import { fixed, parseFixed } from "@delvtech/fixed-point-wasm"; import { ALICE, BOB } from "src/base/testing/accounts"; +import { decodeAssetFromTransferSingleEventData } from "src/hyperdrive/assetId/decodeAssetFromTransferSingleEventData"; import { CheckpointEvent } from "src/hyperdrive/checkpoint/types"; -import { decodeAssetFromTransferSingleEventData } from "src/hyperdrive/decodeAssetFromTransferSingleEventData"; import { simplePoolConfig30Days, simplePoolConfig7Days, diff --git a/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts index 30aad534e..4890df155 100644 --- a/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ReadHyperdrive.ts @@ -12,12 +12,13 @@ import { import { HyperdriveSdkError } from "src/HyperdriveSdkError"; import { assertNever } from "src/base/assertNever"; import { calculateAprFromPrice } from "src/base/calculateAprFromPrice"; -import { MAX_UINT256, SECONDS_PER_YEAR } from "src/base/constants"; +import { MAX_UINT256, NULL_BYTES, SECONDS_PER_YEAR } from "src/base/constants"; import { ReadContractClientOptions } from "src/drift/ContractClient"; import { ReadClient } from "src/drift/ReadClient"; import { getBlockOrThrow } from "src/drift/getBlockOrThrow"; import { fixed } from "src/fixed-point"; import { HyperdriveAbi, hyperdriveAbi } from "src/hyperdrive/abi"; +import { decodeAssetFromTransferSingleEventData } from "src/hyperdrive/assetId/decodeAssetFromTransferSingleEventData"; import { getCheckpointTime } from "src/hyperdrive/checkpoint/getCheckpointTime"; import { Checkpoint, @@ -25,8 +26,7 @@ import { GetCheckpointParams, GetCheckpointTimeParams, } from "src/hyperdrive/checkpoint/types"; -import { MAX_ITERATIONS, NULL_BYTES } from "src/hyperdrive/constants"; -import { decodeAssetFromTransferSingleEventData } from "src/hyperdrive/decodeAssetFromTransferSingleEventData"; +import { MAX_ITERATIONS } from "src/hyperdrive/constants"; import { ClosedLong, Long, diff --git a/packages/hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts index 9ac7b67b5..9b4506979 100644 --- a/packages/hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/ReadWriteHyperdrive.ts @@ -5,9 +5,9 @@ import { ReadWriteAdapter, ReadWriteContract, } from "@delvtech/drift"; +import { NULL_BYTES } from "src/base/constants"; import { ReadWriteContractClientOptions } from "src/drift/ContractClient"; import { HyperdriveAbi } from "src/hyperdrive/abi"; -import { NULL_BYTES } from "src/hyperdrive/constants"; import { ReadHyperdrive } from "src/hyperdrive/ReadHyperdrive"; import { ReadWriteErc20 } from "src/token/erc20/ReadWriteErc20"; import { ReadWriteEth } from "src/token/eth/ReadWriteEth"; diff --git a/packages/hyperdrive-js/src/hyperdrive/decodeAssetFromTransferSingleEventData.ts b/packages/hyperdrive-js/src/hyperdrive/assetId/decodeAssetFromTransferSingleEventData.ts similarity index 85% rename from packages/hyperdrive-js/src/hyperdrive/decodeAssetFromTransferSingleEventData.ts rename to packages/hyperdrive-js/src/hyperdrive/assetId/decodeAssetFromTransferSingleEventData.ts index 513ab533e..fd5bbd464 100644 --- a/packages/hyperdrive-js/src/hyperdrive/decodeAssetFromTransferSingleEventData.ts +++ b/packages/hyperdrive-js/src/hyperdrive/assetId/decodeAssetFromTransferSingleEventData.ts @@ -1,4 +1,7 @@ -import { AssetType, parseAssetType } from "src/hyperdrive/parseAssetType"; +import { + AssetType, + parseAssetType, +} from "src/hyperdrive/assetId/parseAssetType"; export function decodeAssetFromTransferSingleEventData( eventData: `0x${string}`, diff --git a/packages/hyperdrive-js/src/hyperdrive/parseAssetType.ts b/packages/hyperdrive-js/src/hyperdrive/assetId/parseAssetType.ts similarity index 100% rename from packages/hyperdrive-js/src/hyperdrive/parseAssetType.ts rename to packages/hyperdrive-js/src/hyperdrive/assetId/parseAssetType.ts diff --git a/packages/hyperdrive-js/src/hyperdrive/constants.ts b/packages/hyperdrive-js/src/hyperdrive/constants.ts index 48b50f611..362892bfb 100644 --- a/packages/hyperdrive-js/src/hyperdrive/constants.ts +++ b/packages/hyperdrive-js/src/hyperdrive/constants.ts @@ -1,5 +1,2 @@ -// This is the null bytes, which is different than the zero address -export const NULL_BYTES = "0x"; - // The maximum number of iterations to run the Newton's method for. Used in `readHyperdrive.getMaxShort`. export const MAX_ITERATIONS = 14; From 8b034cfb31ac2e30cc35a375d56dcd8061cd7b8b Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Fri, 8 Nov 2024 15:46:49 -0600 Subject: [PATCH 39/43] add `MarketState` to exports --- packages/hyperdrive-js/src/exports/index.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/hyperdrive-js/src/exports/index.ts b/packages/hyperdrive-js/src/exports/index.ts index 419df7227..9c7ac4d6f 100644 --- a/packages/hyperdrive-js/src/exports/index.ts +++ b/packages/hyperdrive-js/src/exports/index.ts @@ -8,6 +8,8 @@ export { type HyperdriveOptions, } from "src/hyperdrive/getHyperdrive"; +export type { MarketState, PoolConfig, PoolInfo } from "src/hyperdrive/types"; + export { hyperdriveAbi, type HyperdriveAbi } from "src/hyperdrive/abi"; export { ReadHyperdrive, @@ -50,11 +52,6 @@ export { type ReadWriteStEthHyperdriveOptions, } from "src/hyperdrive/steth/ReadWriteStEthHyperdrive"; -export { calculateAprFromPrice } from "src/base/calculateAprFromPrice"; - -// pool -export type { PoolConfig, PoolInfo } from "src/hyperdrive/types"; - // shorts export type { ClosedShort, @@ -160,6 +157,7 @@ export { // Base // export { adjustAmountByPercentage } from "src/base/adjustAmountByPercentage"; +export { calculateAprFromPrice } from "src/base/calculateAprFromPrice"; export { getHprFromApr } from "src/base/getHprFromApr"; export { getHprFromApy } from "src/base/getHprFromApy"; export type { Constructor } from "src/base/types"; From 634f6e45b1514943b27754edb4441da5c00ea90e Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Fri, 8 Nov 2024 15:51:12 -0600 Subject: [PATCH 40/43] Fix exports in viem sdk --- packages/hyperdrive-viem/src/exports/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/hyperdrive-viem/src/exports/index.ts b/packages/hyperdrive-viem/src/exports/index.ts index 3244ef865..9f724f516 100644 --- a/packages/hyperdrive-viem/src/exports/index.ts +++ b/packages/hyperdrive-viem/src/exports/index.ts @@ -82,7 +82,6 @@ export type { BaseReadClientOptions, BaseReadWriteClientOptions }; export { adjustAmountByPercentage, - BlockNotFoundError, calculateAprFromPrice, calculateMatureLongYieldAfterFees, erc20Abi, @@ -94,7 +93,6 @@ export { hyperdriveAbi, HyperdriveSdkError, lsEthAbi, - MethodNotImplementedError, mockErc4626Abi, ReadClient, ReadErc20, @@ -127,6 +125,7 @@ export { type HyperdriveAbi, type Long, type LsEthAbi, + type MarketState, type MockErc4626Abi, type OpenLongPositionReceived, type OpenShort, From 2d0728213dd3773d92464db5a89cc049ac44c36f Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Sat, 9 Nov 2024 00:44:02 -0600 Subject: [PATCH 41/43] Remove comment --- .../src/hyperdrive/testing/setupReadHyperdrive.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/hyperdrive-js/src/hyperdrive/testing/setupReadHyperdrive.ts b/packages/hyperdrive-js/src/hyperdrive/testing/setupReadHyperdrive.ts index 9a66e09ee..dc618f56f 100644 --- a/packages/hyperdrive-js/src/hyperdrive/testing/setupReadHyperdrive.ts +++ b/packages/hyperdrive-js/src/hyperdrive/testing/setupReadHyperdrive.ts @@ -16,8 +16,7 @@ export function setupReadHyperdrive() { drift, }); - // The ReadHyperdrive class doesn't infer that the contract is a MockContract, - // so we need to cast it to the correct type. + // The ReadHyperdrive class doesn't infer that the contract is a MockContract. const contract = drift.contract({ abi: readHyperdrive.contract.abi, address: readHyperdrive.contract.address, From dbf5544bdd8e9ed5f0f6c4a9972763dca97b681e Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Sat, 9 Nov 2024 21:00:52 -0600 Subject: [PATCH 42/43] Add changesets --- .changeset/gentle-llamas-glow.md | 5 +++++ .changeset/tall-plants-appear.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/gentle-llamas-glow.md create mode 100644 .changeset/tall-plants-appear.md diff --git a/.changeset/gentle-llamas-glow.md b/.changeset/gentle-llamas-glow.md new file mode 100644 index 000000000..2fe8fbdd8 --- /dev/null +++ b/.changeset/gentle-llamas-glow.md @@ -0,0 +1,5 @@ +--- +"@delvtech/hyperdrive-js": patch +--- + +Initial release of drift based SDK diff --git a/.changeset/tall-plants-appear.md b/.changeset/tall-plants-appear.md new file mode 100644 index 000000000..43efb59a2 --- /dev/null +++ b/.changeset/tall-plants-appear.md @@ -0,0 +1,5 @@ +--- +"@delvtech/hyperdrive-viem": minor +--- + +Refactored to drift under the hood From 33c5b2044e4baf3759b67131b27991b38e174781 Mon Sep 17 00:00:00 2001 From: Ryan Goree Date: Mon, 11 Nov 2024 15:56:40 -0600 Subject: [PATCH 43/43] Remove overwriting of Registry data type --- apps/hyperdrive-trading/src/registry/data.ts | 57 ++++--------------- .../src/ui/chainlog/FactoriesTable.tsx | 6 +- .../src/ui/chainlog/PoolsTable.tsx | 8 +-- .../src/registry/ReadRegistry.ts | 31 +++------- .../src/registry/ReadWriteRegistry.ts | 14 ++--- packages/hyperdrive-js/src/registry/types.ts | 17 +----- 6 files changed, 33 insertions(+), 100 deletions(-) diff --git a/apps/hyperdrive-trading/src/registry/data.ts b/apps/hyperdrive-trading/src/registry/data.ts index c39daf3af..5943120f6 100644 --- a/apps/hyperdrive-trading/src/registry/data.ts +++ b/apps/hyperdrive-trading/src/registry/data.ts @@ -1,52 +1,19 @@ -import { Hex } from "viem"; - -export const statusById = { - "1": "active", - "2": "sunset", -} as const; - -/** - * An ID used to represent status in the registry. - */ -export type StatusId = keyof typeof statusById; - /** * The status of an instance or factory in the registry. */ -export type Status = (typeof statusById)[StatusId]; - -/** - * The decoded data of an instance in the registry. - */ -export interface InstanceData { - status: Status; -} - -/** - * Decodes the `data` field of an instance in the registry according to the - * ElementDAO registry schema. - */ -export function decodeInstanceData(data: Hex): InstanceData { - const statusId = BigInt(data).toString() as StatusId; - return { - status: statusById[statusId], - }; -} - -/** - * The decoded data of a factory in the registry. - */ -export interface FactoryData { - status: Status; -} +export type Status = "active" | "sunset"; /** - * Decodes the `data` field of a factory in the registry according to the - * ElementDAO registry schema. + * Returns the status of an instance or factory in the registry according to the + * ElementDAO registry data schema. */ -export function decodeFactoryData(data: Hex): FactoryData { - const statusId = BigInt(data).toString() as StatusId; - return { - status: statusById[statusId], - }; +export function getStatus(statusId: bigint): Status { + switch (statusId) { + case 1n: + return "active"; + case 2n: + return "sunset"; + default: + throw new Error(`Unknown status ID: ${statusId}`); + } } diff --git a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx index 515aeea3a..5680a941d 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/FactoriesTable.tsx @@ -12,7 +12,7 @@ import classNames from "classnames"; import { ReactElement } from "react"; import { makeQueryKey } from "src/base/makeQueryKey"; import { getDrift } from "src/drift/getDrift"; -import { Status, decodeFactoryData } from "src/registry/data"; +import { Status, getStatus } from "src/registry/data"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { NonIdealState } from "src/ui/base/components/NonIdealState"; import { TableSkeleton } from "src/ui/base/components/TableSkeleton"; @@ -161,7 +161,7 @@ interface Factory { status: Status; } -function useFactoriesQuery(): UseQueryResult { +function useFactoriesQuery(): UseQueryResult { const connectedAppConfig = useAppConfigForConnectedChain(); const chainIds = Object.keys(connectedAppConfig.registries).map(Number); @@ -185,7 +185,7 @@ function useFactoriesQuery(): UseQueryResult { const metas = await registry.getFactoryInfos(factoryAddresses); for (const [i, { data, name, version }] of metas.entries()) { - const { status } = decodeFactoryData(data); + const status = getStatus(data); factories.push({ name, address: factoryAddresses[i], diff --git a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx index eb31e4aea..2a31d0cfe 100644 --- a/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx +++ b/apps/hyperdrive-trading/src/ui/chainlog/PoolsTable.tsx @@ -1,6 +1,6 @@ import { ReadRegistry } from "@delvtech/hyperdrive-js"; import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; -import { UseQueryResult, useQuery } from "@tanstack/react-query"; +import { useQuery, UseQueryResult } from "@tanstack/react-query"; import { Link } from "@tanstack/react-router"; import { createColumnHelper, @@ -13,7 +13,7 @@ import classNames from "classnames"; import { ReactElement } from "react"; import { makeQueryKey } from "src/base/makeQueryKey"; import { getDrift } from "src/drift/getDrift"; -import { Status, decodeInstanceData } from "src/registry/data"; +import { getStatus, Status } from "src/registry/data"; import { useAppConfigForConnectedChain } from "src/ui/appconfig/useAppConfigForConnectedChain"; import { NonIdealState } from "src/ui/base/components/NonIdealState"; import { TableSkeleton } from "src/ui/base/components/TableSkeleton"; @@ -207,7 +207,7 @@ interface Pool { vaultToken: Address; } -function usePoolsQuery(): UseQueryResult { +function usePoolsQuery(): UseQueryResult { const connectedAppConfig = useAppConfigForConnectedChain(); const chainIds = Object.keys(connectedAppConfig.registries).map(Number); @@ -234,7 +234,7 @@ function usePoolsQuery(): UseQueryResult { return registry .getInstanceInfo(pool.address) .then(({ data, factory, name, version }) => { - const { status } = decodeInstanceData(data); + const status = getStatus(data); return Promise.all([ pool.getPoolConfig(), diff --git a/packages/hyperdrive-js/src/registry/ReadRegistry.ts b/packages/hyperdrive-js/src/registry/ReadRegistry.ts index 267cacab3..1ea364381 100644 --- a/packages/hyperdrive-js/src/registry/ReadRegistry.ts +++ b/packages/hyperdrive-js/src/registry/ReadRegistry.ts @@ -77,17 +77,11 @@ export class ReadRegistry extends ReadClient { factoryAddress: Address, options?: ContractReadOptions, ): Promise { - const { kind, name, version, data } = await this.contract.read( + return this.contract.read( "getFactoryInfoWithMetadata", { _factory: factoryAddress }, options, ); - return { - kind, - name, - version, - data: `0x${data.toString(16)}`, - }; } /** @@ -98,17 +92,12 @@ export class ReadRegistry extends ReadClient { factoryAddresses: Address[], options?: ContractReadOptions, ): Promise { - const infos = await this.contract.read( + const readonlyInfos = await this.contract.read( "getFactoryInfosWithMetadata", { __factories: factoryAddresses }, options, ); - return infos.map(({ kind, name, version, data }) => ({ - kind, - name, - version, - data: `0x${data.toString(16)}`, - })); + return readonlyInfos.slice(); } /** @@ -158,22 +147,19 @@ export class ReadRegistry extends ReadClient { instanceAddress: Address, options?: ContractReadOptions, ): Promise { - const { kind, name, version, data, factory } = await this.contract.read( + const { factory, ...rest } = await this.contract.read( "getInstanceInfoWithMetadata", { _instance: instanceAddress }, options, ); return { - kind, - name, - version, - data: `0x${data.toString(16)}`, factory: new ReadFactory({ address: factory, drift: this.drift, cache: this.contract.cache, cacheNamespace: this.contract.cacheNamespace, }), + ...rest, }; } @@ -189,17 +175,14 @@ export class ReadRegistry extends ReadClient { { __instances: instanceAddresses }, options, ); - return infos.map(({ kind, name, version, data, factory }) => ({ - kind, - name, - version, - data: `0x${data.toString(16)}`, + return infos.map(({ factory, ...rest }) => ({ factory: new ReadFactory({ address: factory, drift: this.drift, cache: this.contract.cache, cacheNamespace: this.contract.cacheNamespace, }), + ...rest, })); } } diff --git a/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts b/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts index 91055374d..a539c77b0 100644 --- a/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts +++ b/packages/hyperdrive-js/src/registry/ReadWriteRegistry.ts @@ -78,22 +78,19 @@ export class ReadWriteRegistry extends ReadRegistry { instanceAddress: Address, options?: ContractReadOptions, ): Promise { - const { kind, name, version, data, factory } = await this.contract.read( + const { factory, ...rest } = await this.contract.read( "getInstanceInfoWithMetadata", { _instance: instanceAddress }, options, ); return { - kind, - name, - version, - data: `0x${data.toString(16)}`, factory: new ReadWriteFactory({ address: factory, drift: this.drift, cache: this.contract.cache, cacheNamespace: this.contract.cacheNamespace, }), + ...rest, }; } @@ -109,17 +106,14 @@ export class ReadWriteRegistry extends ReadRegistry { { __instances: instanceAddresses }, options, ); - return infos.map(({ kind, name, version, data, factory }) => ({ - kind, - name, - version, - data: `0x${data.toString(16)}`, + return infos.map(({ factory, ...rest }) => ({ factory: new ReadWriteFactory({ address: factory, drift: this.drift, cache: this.contract.cache, cacheNamespace: this.contract.cacheNamespace, }), + ...rest, })); } } diff --git a/packages/hyperdrive-js/src/registry/types.ts b/packages/hyperdrive-js/src/registry/types.ts index 987bab0c9..137c7469e 100644 --- a/packages/hyperdrive-js/src/registry/types.ts +++ b/packages/hyperdrive-js/src/registry/types.ts @@ -7,15 +7,9 @@ import { RegistryAbi } from "src/registry/abi"; * The info collected for each Hyperdrive factory along with the metadata * associated with each instance. */ -export type FactoryInfoWithMetadata = ReplaceProps< - FunctionReturn, - { - /** - * Data about the factory. Different registries can utilize different - * schemas for these values. - */ - data: `0x${string}`; - } +export type FactoryInfoWithMetadata = FunctionReturn< + RegistryAbi, + "getFactoryInfoWithMetadata" >; /** @@ -25,11 +19,6 @@ export type FactoryInfoWithMetadata = ReplaceProps< export type ReadInstanceInfoWithMetadata = ReplaceProps< FunctionReturn, { - /** - * Data about the instance. Different registries can utilize different - * schemas for these values. - */ - data: `0x${string}`; /** * The factory that deployed this instance. */