Skip to content

Commit 75e8ba5

Browse files
committed
refactor(blue-sdk)!: encapsulate addresses customization
BREAKING CHANGE: addressesRegistry can only be updated with `registerCustomAddresses`
1 parent 439b04e commit 75e8ba5

File tree

3 files changed

+73
-41
lines changed

3 files changed

+73
-41
lines changed

packages/blue-sdk/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
"test": "vitest"
2020
},
2121
"dependencies": {
22-
"@noble/hashes": "^1.6.1"
22+
"@noble/hashes": "^1.6.1",
23+
"@types/lodash": "^4.17.12",
24+
"lodash": "^4.17.21"
2325
},
2426
"peerDependencies": {
2527
"@morpho-org/morpho-ts": "workspace:^"

packages/blue-sdk/src/addresses.ts

Lines changed: 64 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
import { type DottedKeys, entries } from "@morpho-org/morpho-ts";
2-
1+
import {
2+
type DeepPartial,
3+
type DottedKeys,
4+
entries,
5+
} from "@morpho-org/morpho-ts";
6+
import isPlainObject from "lodash/isPlainObject";
7+
import mergeWith from "lodash/mergeWith";
38
import { ChainId } from "./chain.js";
49
import { UnsupportedChainIdError } from "./errors.js";
510
import type { Address } from "./types.js";
@@ -54,7 +59,7 @@ export interface ChainAddresses {
5459
wstEth?: Address;
5560
}
5661

57-
export const addressesRegistry = {
62+
const _addressesRegistry = {
5863
[ChainId.EthMainnet]: {
5964
morpho: "0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb",
6065
permit2: "0x000000000022D473030F116dDEE9F6B43aC78BA3",
@@ -363,9 +368,9 @@ export const addressesRegistry = {
363368
},
364369
} as const;
365370

366-
export const addresses = addressesRegistry as Record<number, ChainAddresses>;
371+
export const addresses = _addressesRegistry as Record<number, ChainAddresses>;
367372

368-
export type AddressLabel = DottedKeys<(typeof addressesRegistry)[ChainId]>;
373+
export type AddressLabel = DottedKeys<(typeof _addressesRegistry)[ChainId]>;
369374

370375
export const getChainAddresses = (chainId: number): ChainAddresses => {
371376
const chainAddresses = addresses[chainId];
@@ -383,33 +388,34 @@ export const unwrappedTokensMapping: Record<
383388
Record<Address, Address>
384389
> = {
385390
[ChainId.EthMainnet]: {
386-
[addressesRegistry[ChainId.EthMainnet].wbIB01]:
387-
addressesRegistry[ChainId.EthMainnet].bIB01,
388-
[addressesRegistry[ChainId.EthMainnet].wbC3M]:
389-
addressesRegistry[ChainId.EthMainnet].bC3M,
390-
[addressesRegistry[ChainId.EthMainnet].wNative]: NATIVE_ADDRESS,
391-
[addressesRegistry[ChainId.EthMainnet].stEth]: NATIVE_ADDRESS,
392-
[addressesRegistry[ChainId.EthMainnet].wstEth]:
393-
addressesRegistry[ChainId.EthMainnet].stEth,
394-
[addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDTWBTCWETH-morpho"]]:
395-
addressesRegistry[ChainId.EthMainnet].crvUSDTWBTCWETH,
396-
[addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDCWBTCWETH-morpho"]]:
397-
addressesRegistry[ChainId.EthMainnet].crvUSDCWBTCWETH,
398-
[addressesRegistry[ChainId.EthMainnet]["stkcvxcrvCRVUSDTBTCWSTETH-morpho"]]:
399-
addressesRegistry[ChainId.EthMainnet].crvCRVUSDTBTCWSTETH,
400-
[addressesRegistry[ChainId.EthMainnet]["stkcvxTryLSD-morpho"]]:
401-
addressesRegistry[ChainId.EthMainnet].tryLSD,
402-
[addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDETHCRV-morpho"]]:
403-
addressesRegistry[ChainId.EthMainnet].crvUSDETHCRV,
404-
[addressesRegistry[ChainId.EthMainnet]["stkcvx2BTC-f-morpho"]]:
405-
addressesRegistry[ChainId.EthMainnet]["2BTC-f"],
391+
[_addressesRegistry[ChainId.EthMainnet].wbIB01]:
392+
_addressesRegistry[ChainId.EthMainnet].bIB01,
393+
[_addressesRegistry[ChainId.EthMainnet].wbC3M]:
394+
_addressesRegistry[ChainId.EthMainnet].bC3M,
395+
[_addressesRegistry[ChainId.EthMainnet].wNative]: NATIVE_ADDRESS,
396+
[_addressesRegistry[ChainId.EthMainnet].stEth]: NATIVE_ADDRESS,
397+
[_addressesRegistry[ChainId.EthMainnet].wstEth]:
398+
_addressesRegistry[ChainId.EthMainnet].stEth,
399+
[_addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDTWBTCWETH-morpho"]]:
400+
_addressesRegistry[ChainId.EthMainnet].crvUSDTWBTCWETH,
401+
[_addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDCWBTCWETH-morpho"]]:
402+
_addressesRegistry[ChainId.EthMainnet].crvUSDCWBTCWETH,
403+
[_addressesRegistry[ChainId.EthMainnet][
404+
"stkcvxcrvCRVUSDTBTCWSTETH-morpho"
405+
]]: _addressesRegistry[ChainId.EthMainnet].crvCRVUSDTBTCWSTETH,
406+
[_addressesRegistry[ChainId.EthMainnet]["stkcvxTryLSD-morpho"]]:
407+
_addressesRegistry[ChainId.EthMainnet].tryLSD,
408+
[_addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDETHCRV-morpho"]]:
409+
_addressesRegistry[ChainId.EthMainnet].crvUSDETHCRV,
410+
[_addressesRegistry[ChainId.EthMainnet]["stkcvx2BTC-f-morpho"]]:
411+
_addressesRegistry[ChainId.EthMainnet]["2BTC-f"],
406412
},
407413
[ChainId.BaseMainnet]: {
408-
[addressesRegistry[ChainId.BaseMainnet].wNative]: NATIVE_ADDRESS,
409-
[addressesRegistry[ChainId.BaseMainnet].verUsdc]:
410-
addressesRegistry[ChainId.BaseMainnet].usdc,
411-
[addressesRegistry[ChainId.BaseMainnet].testUsdc]:
412-
addressesRegistry[ChainId.BaseMainnet].usdc,
414+
[_addressesRegistry[ChainId.BaseMainnet].wNative]: NATIVE_ADDRESS,
415+
[_addressesRegistry[ChainId.BaseMainnet].verUsdc]:
416+
_addressesRegistry[ChainId.BaseMainnet].usdc,
417+
[_addressesRegistry[ChainId.BaseMainnet].testUsdc]:
418+
_addressesRegistry[ChainId.BaseMainnet].usdc,
413419
},
414420
[ChainId.PolygonMainnet]: {},
415421
[ChainId.ArbitrumMainnet]: {},
@@ -441,7 +447,7 @@ export const erc20WrapperTokens: Record<number, Set<Address>> = {};
441447
*/
442448
export const permissionedWrapperTokens: Record<number, Set<Address>> = {
443449
[ChainId.BaseMainnet]: new Set([
444-
addressesRegistry[ChainId.BaseMainnet].testUsdc,
450+
_addressesRegistry[ChainId.BaseMainnet].testUsdc,
445451
]),
446452
};
447453

@@ -451,8 +457,8 @@ export const permissionedWrapperTokens: Record<number, Set<Address>> = {
451457
*/
452458
export const permissionedBackedTokens: Record<number, Set<Address>> = {
453459
[ChainId.EthMainnet]: new Set([
454-
addressesRegistry[ChainId.EthMainnet].wbIB01,
455-
addressesRegistry[ChainId.EthMainnet].wbC3M,
460+
_addressesRegistry[ChainId.EthMainnet].wbIB01,
461+
_addressesRegistry[ChainId.EthMainnet].wbC3M,
456462
]),
457463
};
458464

@@ -462,7 +468,7 @@ export const permissionedBackedTokens: Record<number, Set<Address>> = {
462468
*/
463469
export const permissionedCoinbaseTokens: Record<number, Set<Address>> = {
464470
[ChainId.BaseMainnet]: new Set([
465-
addressesRegistry[ChainId.BaseMainnet].verUsdc,
471+
_addressesRegistry[ChainId.BaseMainnet].verUsdc,
466472
]),
467473
};
468474

@@ -492,11 +498,29 @@ entries(permissionedWrapperTokens).forEach(([chainId, tokens]) => {
492498
*/
493499
export const convexWrapperTokens: Record<number, Set<Address>> = {
494500
[ChainId.EthMainnet]: new Set([
495-
addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDTWBTCWETH-morpho"],
496-
addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDCWBTCWETH-morpho"],
497-
addressesRegistry[ChainId.EthMainnet]["stkcvxcrvCRVUSDTBTCWSTETH-morpho"],
498-
addressesRegistry[ChainId.EthMainnet]["stkcvxTryLSD-morpho"],
499-
addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDETHCRV-morpho"],
500-
addressesRegistry[ChainId.EthMainnet]["stkcvx2BTC-f-morpho"],
501+
_addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDTWBTCWETH-morpho"],
502+
_addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDCWBTCWETH-morpho"],
503+
_addressesRegistry[ChainId.EthMainnet]["stkcvxcrvCRVUSDTBTCWSTETH-morpho"],
504+
_addressesRegistry[ChainId.EthMainnet]["stkcvxTryLSD-morpho"],
505+
_addressesRegistry[ChainId.EthMainnet]["stkcvxcrvUSDETHCRV-morpho"],
506+
_addressesRegistry[ChainId.EthMainnet]["stkcvx2BTC-f-morpho"],
501507
]),
502508
};
509+
510+
export let addressesRegistry = Object.freeze(_addressesRegistry);
511+
512+
export function registerCustomAddresses(
513+
customAddresses:
514+
| Record<keyof typeof _addressesRegistry, DeepPartial<ChainAddresses>>
515+
| Record<number, ChainAddresses>,
516+
) {
517+
// biome-ignore lint/suspicious/noExplicitAny: type is not trivial and not important here
518+
const customizer = (objValue: any, _srcValue: any, key: string) => {
519+
if (objValue !== undefined && !isPlainObject(objValue))
520+
throw new Error(`Cannot override existing address: ${key}`);
521+
};
522+
523+
addressesRegistry = Object.freeze(
524+
mergeWith({}, _addressesRegistry, customAddresses, customizer),
525+
);
526+
}

pnpm-lock.yaml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)