|
1 | 1 | import { readFile, writeFile } from "node:fs/promises"; |
2 | 2 |
|
3 | 3 | import type { Address } from "viem"; |
4 | | -import { createPublicClient, createWalletClient, http, isAddress } from "viem"; |
| 4 | +import { |
| 5 | + createPublicClient, |
| 6 | + createWalletClient, |
| 7 | + http, |
| 8 | + isAddress, |
| 9 | + stringToHex, |
| 10 | +} from "viem"; |
5 | 11 | import { privateKeyToAccount } from "viem/accounts"; |
6 | 12 |
|
7 | | -import type { ILogger } from "../sdk"; |
8 | | -import { GearboxSDK, json_stringify, sendRawTx } from "../sdk"; |
| 13 | +import type { ILogger, NetworkType } from "../sdk"; |
| 14 | +import { |
| 15 | + ADDRESS_PROVIDER, |
| 16 | + chains, |
| 17 | + GearboxSDK, |
| 18 | + iAddressProviderV3_1Abi, |
| 19 | + iAddressProviderV3Abi, |
| 20 | + json_stringify, |
| 21 | + sendRawTx, |
| 22 | +} from "../sdk"; |
| 23 | +import { createAnvilClient } from "./createAnvilClient"; |
9 | 24 |
|
10 | 25 | export interface SDKExampleOptions { |
11 | 26 | addressProvider?: string; |
@@ -52,6 +67,12 @@ export class SDKExample { |
52 | 67 | ignoreUpdateablePrices: true, |
53 | 68 | marketConfigurators: [marketConfigurator], |
54 | 69 | }); |
| 70 | + await this.#safeMigrateFaucet( |
| 71 | + anvilUrl, |
| 72 | + this.#sdk.provider.networkType, |
| 73 | + addressProvider, |
| 74 | + ); |
| 75 | + |
55 | 76 | const puTx = await this.#sdk.priceFeeds.getUpdatePriceFeedsTx([ |
56 | 77 | marketConfigurator, |
57 | 78 | ]); |
@@ -110,6 +131,69 @@ export class SDKExample { |
110 | 131 | return result; |
111 | 132 | } |
112 | 133 |
|
| 134 | + async #safeMigrateFaucet( |
| 135 | + anvilURL: string, |
| 136 | + network: NetworkType, |
| 137 | + addressProvider: Address, |
| 138 | + ): Promise<void> { |
| 139 | + try { |
| 140 | + await this.#migrateFaucet(anvilURL, network, addressProvider); |
| 141 | + this.#logger?.info("faucet migrated successfully"); |
| 142 | + } catch (e) { |
| 143 | + this.#logger?.error(`faucet migration failed: ${e}`); |
| 144 | + } |
| 145 | + } |
| 146 | + |
| 147 | + /** |
| 148 | + * Migrates faucet from address provider v3 to v3.1 |
| 149 | + * @param anvilURL |
| 150 | + * @param network |
| 151 | + * @param addressProvider |
| 152 | + */ |
| 153 | + async #migrateFaucet( |
| 154 | + anvilURL: string, |
| 155 | + network: NetworkType, |
| 156 | + addressProvider: Address, |
| 157 | + ): Promise<void> { |
| 158 | + const anvil = createAnvilClient({ |
| 159 | + chain: chains[network], |
| 160 | + transport: http(anvilURL), |
| 161 | + }); |
| 162 | + |
| 163 | + const [faucetAddr, owner] = await anvil.multicall({ |
| 164 | + contracts: [ |
| 165 | + { |
| 166 | + abi: iAddressProviderV3Abi, |
| 167 | + address: ADDRESS_PROVIDER[network], |
| 168 | + functionName: "getAddressOrRevert", |
| 169 | + args: [stringToHex("FAUCET", { size: 32 }), 0n], |
| 170 | + }, |
| 171 | + { |
| 172 | + abi: iAddressProviderV3_1Abi, |
| 173 | + address: addressProvider, |
| 174 | + functionName: "owner", |
| 175 | + args: [], |
| 176 | + }, |
| 177 | + ], |
| 178 | + allowFailure: false, |
| 179 | + }); |
| 180 | + this.#logger?.debug(`faucet address: ${faucetAddr}, owner: ${owner}`); |
| 181 | + await anvil.impersonateAccount({ address: owner }); |
| 182 | + const hash = await anvil.writeContract({ |
| 183 | + chain: chains[network], |
| 184 | + account: owner, |
| 185 | + address: addressProvider, |
| 186 | + abi: iAddressProviderV3_1Abi, |
| 187 | + functionName: "setAddress", |
| 188 | + args: [stringToHex("FAUCET", { size: 32 }), faucetAddr, true], |
| 189 | + }); |
| 190 | + const receipt = await anvil.waitForTransactionReceipt({ hash }); |
| 191 | + await anvil.stopImpersonatingAccount({ address: owner }); |
| 192 | + if (receipt.status === "reverted") { |
| 193 | + throw new Error("faucet migration reverted"); |
| 194 | + } |
| 195 | + } |
| 196 | + |
113 | 197 | public get sdk(): GearboxSDK { |
114 | 198 | if (!this.#sdk) { |
115 | 199 | throw new Error("sdk is not attached"); |
|
0 commit comments