Skip to content

Commit

Permalink
refactor: supported adapters util (#224)
Browse files Browse the repository at this point in the history
Refactored supported adapters util to return non empty arrays
  • Loading branch information
palace22 authored Feb 7, 2025
1 parent fe51c16 commit c7a44ac
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 8 deletions.
5 changes: 5 additions & 0 deletions .changeset/modern-moose-attack.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@folks-finance/xchain-sdk": patch
---

Refactored supported adapters util to return non empty arrays
5 changes: 3 additions & 2 deletions src/common/types/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { FolksChainId } from "./chain.js";
import type { AccountId, LoanId, LoanName, Nonce } from "./lending.js";
import type { LoanTypeId } from "./module.js";
import type { FolksTokenId, FolksSpokeTokenType, FolksHubTokenType } from "./token.js";
import type { NonEmptyArray } from "../../types/generics.js";
import type {
FINALITY,
HUB_ACTIONS,
Expand Down Expand Up @@ -72,8 +73,8 @@ export type MessageAdapters = {
};

export type SupportedMessageAdapters = {
adapterId: Array<AdapterType>;
returnAdapterId: Array<AdapterType>;
adapterIds: NonEmptyArray<AdapterType>;
returnAdapterIds: NonEmptyArray<AdapterType>;
};

export type FeeParams = {
Expand Down
21 changes: 15 additions & 6 deletions src/common/utils/adapter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { getHubTokenData, isHubChain } from "../../chains/evm/hub/utils/chain.js";
import { intersect } from "../../utils/array.js";
import { ensureNonEmpty, intersect } from "../../utils/array.js";
import { exhaustiveCheck } from "../../utils/exhaustive-check.js";
import { FolksCore } from "../../xchain/core/folks-core.js";
import { DATA_ADAPTERS } from "../constants/adapter.js";
Expand All @@ -9,13 +9,16 @@ import { TokenType } from "../types/token.js";

import { getSpokeChain } from "./chain.js";

import type { NonEmptyArray } from "../../types/generics.js";
import type { MessageAdapterParams, ReceiveTokenMessageAdapterParams } from "../types/adapter.js";
import type { FolksChainId, NetworkType } from "../types/chain.js";
import type { SupportedMessageAdapters } from "../types/message.js";
import type { CrossChainTokenType, FolksTokenId } from "../types/token.js";

export function getSpokeAdapterIds(folksChainId: FolksChainId, network: NetworkType) {
export function getSpokeAdapterIds(folksChainId: FolksChainId, network: NetworkType): NonEmptyArray<AdapterType> {
const spokeChain = getSpokeChain(folksChainId, network);
return Object.keys(spokeChain.adapters).map<AdapterType>(parseInt);
const adapterIds = Object.keys(spokeChain.adapters).map<AdapterType>(parseInt);
return ensureNonEmpty(adapterIds, `No adapters found for chain ${folksChainId}`);
}

export function doesAdapterSupportDataMessage(folksChainId: FolksChainId, adapterId: AdapterType): boolean {
Expand Down Expand Up @@ -101,10 +104,13 @@ function getReturnMessageAdapterIds({ folksTokenId, network }: ReceiveTokenMessa
return getSendTokenAdapterIds(folksTokenId, network);
}

export function getSupportedMessageAdapters(params: MessageAdapterParams) {
export function getSupportedMessageAdapters(params: MessageAdapterParams): SupportedMessageAdapters {
const { messageAdapterParamType, sourceFolksChainId, network } = params;
const spokeAdapterIds = getSpokeAdapterIds(sourceFolksChainId, network);
const supportedAdapterIds = getMessageAdapterIds(params).filter(intersect(spokeAdapterIds));
const supportedAdapterIds = ensureNonEmpty(
getMessageAdapterIds(params).filter(intersect(spokeAdapterIds)),
`No supported adapters found for chain ${sourceFolksChainId}`,
);

switch (messageAdapterParamType) {
case MessageAdapterParamsType.SendToken: {
Expand All @@ -115,7 +121,10 @@ export function getSupportedMessageAdapters(params: MessageAdapterParams) {
}
case MessageAdapterParamsType.ReceiveToken: {
const destSpokeAdapterIds = getSpokeAdapterIds(params.destFolksChainId, network);
const supportedReturnAdapterIds = getReturnMessageAdapterIds(params).filter(intersect(destSpokeAdapterIds));
const supportedReturnAdapterIds = ensureNonEmpty(
getReturnMessageAdapterIds(params).filter(intersect(destSpokeAdapterIds)),
`No supported return adapters found for chain ${params.destFolksChainId}`,
);
return {
adapterIds: supportedAdapterIds,
returnAdapterIds: supportedReturnAdapterIds,
Expand Down
1 change: 1 addition & 0 deletions src/types/generics.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type NonEmptyArray<T> = [T, ...Array<T>];
7 changes: 7 additions & 0 deletions src/utils/array.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import type { NonEmptyArray } from "../types/generics.js";

export const intersect =
<T>(arr: Array<T>) =>
(x: T) =>
arr.includes(x);

export const ensureNonEmpty = <T>(arr: Array<T>, errMsg?: string): NonEmptyArray<T> => {
if (arr.length === 0) throw new Error(errMsg ?? "Array cannot be empty");
return arr as NonEmptyArray<T>;
};

0 comments on commit c7a44ac

Please sign in to comment.