Skip to content

Commit 15c5a39

Browse files
committed
feat: escape hatch that allows overriding addresses in address provider
1 parent dc3d89e commit 15c5a39

File tree

5 files changed

+77
-10
lines changed

5 files changed

+77
-10
lines changed

src/sdk/core/address-provider/AbstractAddressProviderContract.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,34 @@ import type { VersionRange } from "../../constants/index.js";
66
import { NO_VERSION } from "../../constants/index.js";
77
import type { AddressProviderV3StateHuman } from "../../types/index.js";
88
import { TypedObjectUtils } from "../../utils/mappers.js";
9-
import type { AddressProviderState } from "./types.js";
9+
import type {
10+
AddressProviderAddresses,
11+
AddressProviderState,
12+
} from "./types.js";
1013

1114
export default abstract class AbstractAddressProviderContract<
1215
abi extends Abi | readonly unknown[],
1316
> extends BaseContract<abi> {
14-
#addresses: Record<string, Record<number, Address>> = {};
17+
readonly #addresses: Record<string, Record<number, Address>>;
18+
readonly #overrides: Record<string, Record<number, Address>>;
1519

1620
constructor(
1721
options: ConstructOptions,
1822
args: BaseContractArgs<abi>,
19-
addresses: Record<string, Record<number, Address>> = {},
23+
addresses?: AddressProviderAddresses,
2024
) {
2125
super(options, args);
22-
this.#addresses = addresses;
26+
this.#addresses = addresses?.addresses ?? {};
27+
this.#overrides = addresses?.overrides ?? {};
28+
29+
for (const [contract, vs] of TypedObjectUtils.entries(this.#overrides)) {
30+
for (const [version, address] of TypedObjectUtils.entries(vs)) {
31+
this.#addresses[contract] = {
32+
...this.#addresses[contract],
33+
[version]: address,
34+
};
35+
}
36+
}
2337
}
2438

2539
protected setInternalAddress(key: string, address: Address, version: number) {
@@ -29,6 +43,14 @@ export default abstract class AbstractAddressProviderContract<
2943
}
3044
this.#addresses[k][version] = address;
3145
this.logger?.debug(`Set address for ${k}@${version} to ${address}`);
46+
47+
const overriden = this.#overrides[k]?.[version];
48+
if (overriden) {
49+
this.logger?.warn(
50+
`address for ${k}@${version} was overriden, hardcode ${overriden} instead of ${address}`,
51+
);
52+
this.#addresses[k][version] = overriden;
53+
}
3254
}
3355

3456
public getAddress(contract: string, version = NO_VERSION): Address {

src/sdk/core/address-provider/AddressProviderV300Contract.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import type { ConstructOptions } from "../../base/Construct.js";
1111
import type { GearboxChain } from "../../chain/index.js";
1212
import { getLogsSafe } from "../../utils/viem/index.js";
1313
import AbstractAddressProviderContract from "./AbstractAddressProviderContract.js";
14-
import type { IAddressProviderContract } from "./types.js";
14+
import type {
15+
AddressProviderAddresses,
16+
IAddressProviderContract,
17+
} from "./types.js";
1518

1619
const abi = iAddressProviderV300Abi;
1720
type abi = typeof abi;
@@ -24,7 +27,7 @@ export class AddressProviderV300Contract
2427
options: ConstructOptions,
2528
address: Address,
2629
version: number,
27-
addresses: Record<string, Record<number, Address>> = {},
30+
addresses?: AddressProviderAddresses,
2831
) {
2932
super(
3033
options,

src/sdk/core/address-provider/AddressProviderV310Contract.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { bytesToString, parseEventLogs, toBytes } from "viem";
99
import { iAddressProviderV310Abi } from "../../../abi/310/generated.js";
1010
import type { ConstructOptions } from "../../base/Construct.js";
1111
import AbstractAddressProviderContract from "./AbstractAddressProviderContract.js";
12-
import type { IAddressProviderContract } from "./types.js";
12+
import type {
13+
AddressProviderAddresses,
14+
IAddressProviderContract,
15+
} from "./types.js";
1316

1417
const abi = iAddressProviderV310Abi;
1518
type abi = typeof abi;
@@ -22,7 +25,7 @@ export class AddressProviderV310Contract
2225
options: ConstructOptions,
2326
address: Address,
2427
version: number = 310,
25-
addresses: Record<string, Record<number, Address>> = {},
28+
addresses?: AddressProviderAddresses,
2629
) {
2730
super(
2831
options,

src/sdk/core/address-provider/createAddressProvider.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import type { Address } from "viem";
22

33
import { iVersionAbi } from "../../../abi/iVersion.js";
4+
import type { NetworkType } from "../../chain/chains.js";
45
import {
56
ADDRESS_PROVIDER_V310,
7+
AP_MARKET_COMPRESSOR,
8+
AP_PRICE_FEED_COMPRESSOR,
69
isV300,
710
isV310,
811
} from "../../constants/index.js";
@@ -11,10 +14,26 @@ import { hexEq } from "../../utils/hex.js";
1114
import { AddressProviderV300Contract } from "./AddressProviderV300Contract.js";
1215
import { AddressProviderV310Contract } from "./AddressProviderV310Contract.js";
1316
import type {
17+
AddressProviderAddresses,
1418
AddressProviderState,
1519
IAddressProviderContract,
1620
} from "./types.js";
1721

22+
const OVERRIDE_ADDRESSES: Partial<
23+
Record<NetworkType, AddressProviderAddresses["overrides"]>
24+
> = {
25+
// Override price feed compressor and market feed compressor
26+
// we urgently deployed fix and it has not been added to the address provider yet
27+
Mainnet: {
28+
[AP_PRICE_FEED_COMPRESSOR]: {
29+
311: "0x1fA2637B9fab0CD14290A7EE908DDc9688a15120",
30+
},
31+
[AP_MARKET_COMPRESSOR]: {
32+
311: "0x0C27F242f6e9F2A9AD3261bE6e439De3B948bcA2",
33+
},
34+
},
35+
};
36+
1837
export async function createAddressProvider(
1938
sdk: GearboxSDK,
2039
address: Address,
@@ -46,11 +65,15 @@ function newAddressProvider(
4665
version: number,
4766
addresses?: Record<string, Record<number, Address>>,
4867
): IAddressProviderContract {
68+
const addrOptions: AddressProviderAddresses = {
69+
addresses,
70+
overrides: OVERRIDE_ADDRESSES[sdk.networkType],
71+
};
4972
if (isV300(version)) {
50-
return new AddressProviderV300Contract(sdk, address, version, addresses);
73+
return new AddressProviderV300Contract(sdk, address, version, addrOptions);
5174
}
5275
if (isV310(version)) {
53-
return new AddressProviderV310Contract(sdk, address, version, addresses);
76+
return new AddressProviderV310Contract(sdk, address, version, addrOptions);
5477
}
5578
throw new Error(`unsupported address provider version: ${version}`);
5679
}

src/sdk/core/address-provider/types.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@ import type { BaseParams, IBaseContract } from "../../base/index.js";
44
import type { VersionRange } from "../../constants/versions.js";
55
import type { AddressProviderV3StateHuman } from "../../types/index.js";
66

7+
export interface AddressProviderAddresses {
8+
/**
9+
* Initialize address provider with these addresses
10+
* Used in hydration
11+
*/
12+
addresses?: Record<string, Record<number, Address>>;
13+
/**
14+
* Override addresses for this address provider
15+
* These addresses will precede over addresses loaded from chain
16+
*
17+
* This is an escape hatch.
18+
* We used it when we need to fix price feed compressor/market compressor urgently
19+
*/
20+
overrides?: Record<string, Record<number, Address>>;
21+
}
22+
723
export interface AddressProviderState {
824
baseParams: BaseParams;
925
addresses: Record<string, Record<number, Address>>;

0 commit comments

Comments
 (0)