Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] Expose substatuses in Typescript #178

Open
cyrilchapon opened this issue Jun 16, 2023 · 0 comments
Open

[Feature Request] Expose substatuses in Typescript #178

cyrilchapon opened this issue Jun 16, 2023 · 0 comments
Assignees
Labels
enhancement New feature or request

Comments

@cyrilchapon
Copy link

Is your feature request related to a problem? Please describe.
I've been surprised not to find substatuses Enum or Union in Typescript; and found myself to recode it.

The trouble is now I'll have to follow Fireblocks releases and enrich it over the months

Describe the solution you'd like
Some types and runtime exposed to help with substatutes.

Additional context

Here is a proposal :

export const fireblocksSubstatusesPending3rdParty = [
  '3RD_PARTY_PROCESSING',
] as const

export type FireblocksSubstatusPending3rdParty =
  (typeof fireblocksSubstatusesPending3rdParty)[number]

export const isFireblocksSubstatusPending3rdParty = (
  substatus: string,
): substatus is FireblocksSubstatusPending3rdParty =>
  fireblocksSubstatusesPending3rdParty.includes(
    substatus as FireblocksSubstatusPending3rdParty,
  )

export const fireblocksSubstatusesConfirming = [
  '3RD_PARTY_CONFIRMING',
  'PENDING_BLOCKCHAIN_CONFIRMATIONS',
] as const

export type FireblocksSubstatusConfirming =
  (typeof fireblocksSubstatusesConfirming)[number]

export const isFireblocksSubstatusConfirming = (
  substatus: string,
): substatus is FireblocksSubstatusConfirming =>
  fireblocksSubstatusesConfirming.includes(
    substatus as FireblocksSubstatusConfirming,
  )

export type FireblocksSubstatusPending =
  | FireblocksSubstatusPending3rdParty
  | FireblocksSubstatusConfirming

export const isFireblocksSubstatusPending = (
  substatus: string,
): substatus is FireblocksSubstatusPending =>
  isFireblocksSubstatusPending3rdParty(substatus) ||
  isFireblocksSubstatusConfirming(substatus)

export const fireblocksSubstatusesCompleted = [
  '3RD_PARTY_COMPLETED',
  'COMPLETED_BUT_3RD_PARTY_FAILED',
  'COMPLETED_BUT_3RD_PARTY_REJECTED',
  'CONFIRMED',
] as const

export type FireblocksSubstatusCompleted =
  (typeof fireblocksSubstatusesCompleted)[number]

export const isFireblocksSubstatusCompleted = (
  substatus: string,
): substatus is FireblocksSubstatusCompleted =>
  fireblocksSubstatusesCompleted.includes(
    substatus as FireblocksSubstatusCompleted,
  )

export const fireblocksSubstatusesBlocked = ['BLOCKED_BY_POLICY'] as const

export type FireblocksSubstatusBlocked =
  (typeof fireblocksSubstatusesBlocked)[number]

export const isFireblocksSubstatusBlocked = (
  substatus: string,
): substatus is FireblocksSubstatusBlocked =>
  fireblocksSubstatusesBlocked.includes(substatus as FireblocksSubstatusBlocked)

export const fireblocksSubstatusesCancelled = [
  '3RD_PARTY_CANCELLED',
  '3RD_PARTY_REJECTED',
  'CANCELLED_BY_USER',
  'CANCELLED_BY_USER_REQUEST',
  'REJECTED_BY_USER',
] as const

export type FireblocksSubstatusCancelled =
  (typeof fireblocksSubstatusesCancelled)[number]

export const isFireblocksSubstatusCancelled = (
  substatus: string,
): substatus is FireblocksSubstatusCancelled =>
  fireblocksSubstatusesCancelled.includes(
    substatus as FireblocksSubstatusCancelled,
  )

export const fireblocksSubstatusesRejected = [
  'AUTO_FREEZE',
  'FROZEN_MANUALLY',
  'REJECTED_AML_SCREENING',
] as const

export type FireblocksSubstatusRejected =
  (typeof fireblocksSubstatusesRejected)[number]

export const isFireblocksSubstatusRejected = (
  substatus: string,
): substatus is FireblocksSubstatusRejected =>
  fireblocksSubstatusesRejected.includes(
    substatus as FireblocksSubstatusRejected,
  )

export const fireblocksSubstatusesFailedUserInput = [
  'ACTUAL_FEE_TOO_HIGH',
  'ADDRESS_WHITELISTING_SUSPENDED',
  'AMOUNT_TOO_SMALL',
  'AUTHORIZATION_FAILED',
  'AUTHORIZER_NOT_FOUND',
  'ENV_UNSUPPORTED_ASSET',
  'ERROR_UNSUPPORTED_TRANSACTION_TYPE',
  'FAIL_ON_LOW_FEE',
  'GAS_LIMIT_TOO_LOW',
  'GAS_PRICE_TOO_LOW_FOR_RBF',
  'INCOMPLETE_USER_SETUP',
  'INSUFFICIENT_FUNDS',
  'INSUFFICIENT_FUNDS_FOR_FEE',
  'INTEGRATION_SUSPENDED',
  'INVALID_ADDRESS',
  'INVALID_CONTRACT_CALL_DATA',
  'INVALID_FEE_PARAMS',
  'INVALID_NONCE_FOR_RBF',
  'INVALID_TAG_OR_MEMO',
  'INVALID_UNMANAGED_WALLET',
  'MAX_FEE_EXCEEDED',
  'MISSING_TAG_OR_MEMO',
  'NEED_MORE_TO_CREATE_DESTINATION',
  'NO_MORE_PREPROCESSED_INDEXES',
  'NON_EXISTING_ACCOUNT_NAME',
  'RAW_MSG_EMPTY_OR_INVALID',
  'RAW_MSG_LEN_INVALID',
  'TOO_MANY_INPUTS',
  'UNAUTHORISED_DEVICE',
  'UNAUTHORISED_USER',
  'UNALLOWED_RAW_PARAM_COMBINATION',
  'UNSUPPORTED_OPERATION',
  'UNSUPPORTED_TRANSACTION_TYPE',
  'ZERO_BALANCE_IN_PERMANENT_ADDRESS',
] as const

export type FireblocksSubstatusFailedUserInput =
  (typeof fireblocksSubstatusesFailedUserInput)[number]

export const isFireblocksSubstatusFailedUserInput = (
  substatus: string,
): substatus is FireblocksSubstatusFailedUserInput =>
  fireblocksSubstatusesFailedUserInput.includes(
    substatus as FireblocksSubstatusFailedUserInput,
  )

export const fireblocksSubstatusesFailedSystemIssue = [
  'CONNECTIVITY_ERROR',
  'ERROR_ASYNC_TX_IN_FLIGHT',
  'INTERNAL_ERROR',
  'INVALID_NONCE_TOO_HIGH',
  'INVALID_NONCE_TOO_LOW',
  'INVALID_ROUTING_DESTINATION',
  'LOCKING_NONCE_ACCOUNT_TIMEOUT',
  'NETWORK_ROUTING_MISMATCH',
  'NONCE_ALLOCATION_FAILED',
  'RESOURCE_ALREADY_EXISTS',
  'SIGNER_NOT_FOUND',
  'SIGNING_ERROR',
  'TIMEOUT',
  'TX_OUTDATED',
  'UNKNOWN_ERROR',
  'UNSUPPORTED_MEDIA_TYPE',
  'VAULT_WALLET_NOT_READY',
] as const

export type FireblocksSubstatusFailedSystemIssue =
  (typeof fireblocksSubstatusesFailedSystemIssue)[number]

export const isFireblocksSubstatusFailedSystemIssue = (
  substatus: string,
): substatus is FireblocksSubstatusFailedSystemIssue =>
  fireblocksSubstatusesFailedSystemIssue.includes(
    substatus as FireblocksSubstatusFailedSystemIssue,
  )

export const fireblocksSubstatusesFailedThirdParty = [
  'ADDRESS_NOT_WHITELISTED',
  'API_KEY_MISMATCH',
  'ASSET_NOT_ENABLED_ON_DESTINATION',
  'DEST_TYPE_NOT_SUPPORTED',
  'EXCEEDED_DECIMAL_PRECISION',
  'EXCHANGE_CONFIGURATION_MISMATCH',
  'EXCHANGE_VERSION_INCOMPATIBLE',
  'INVALID_EXCHANGE_ACCOUNT',
  'METHOD_NOT_ALLOWED',
  'NON_EXISTENT_AUTO_ACCOUNT',
  'ON_PREMISE_CONNECTIVITY_ERROR',
  'PEER_ACCOUNT_DOES_NOT_EXIST',
  'THIRD_PARTY_MISSING_ACCOUNT',
  'UNAUTHORISED_IP_WHITELISTING',
  'UNAUTHORISED_MISSING_CREDENTIALS',
  'UNAUTHORISED_MISSING_PERMISSION',
  'UNAUTHORISED_OTP_FAILED',
  'WITHDRAW_LIMIT',
] as const

export type FireblocksSubstatusFailedThirdParty =
  (typeof fireblocksSubstatusesFailedThirdParty)[number]

export const isFireblocksSubstatusFailedThirdParty = (
  substatus: string,
): substatus is FireblocksSubstatusFailedThirdParty =>
  fireblocksSubstatusesFailedThirdParty.includes(
    substatus as FireblocksSubstatusFailedThirdParty,
  )

export const fireblocksSubstatusesFailedBlockchain = [
  'DOUBLE_SPENDING',
  'DROPPED_BY_BLOCKCHAIN',
  'INSUFFICIENT_RESERVED_FUNDING',
  'INVALID_SIGNATURE',
  'PARTIALLY_FAILED',
  'POWERUP_SUGGESTION_FAILURE',
  'REACHED_MEMPOOL_LIMIT_FOR_ACCOUNT',
  'REJECTED_BY_BLOCKCHAIN',
  'TOO_LONG_MEMPOOL_CHAIN',
] as const

export type FireblocksSubstatusFailedBlockchain =
  (typeof fireblocksSubstatusesFailedBlockchain)[number]

export const isFireblocksSubstatusFailedBlockchain = (
  substatus: string,
): substatus is FireblocksSubstatusFailedBlockchain =>
  fireblocksSubstatusesFailedBlockchain.includes(
    substatus as FireblocksSubstatusFailedBlockchain,
  )

export type FireblocksSubstatusFailed =
  | FireblocksSubstatusFailedUserInput
  | FireblocksSubstatusFailedSystemIssue
  | FireblocksSubstatusFailedThirdParty
  | FireblocksSubstatusFailedBlockchain

export const isFireblocksSubstatusFailed = (
  substatus: string,
): substatus is FireblocksSubstatusFailed =>
  isFireblocksSubstatusFailedUserInput(substatus) ||
  isFireblocksSubstatusFailedSystemIssue(substatus) ||
  isFireblocksSubstatusFailedThirdParty(substatus) ||
  isFireblocksSubstatusFailedBlockchain(substatus)

export type FireblocksSubstatusNotCompleted =
  | FireblocksSubstatusBlocked
  | FireblocksSubstatusCancelled
  | FireblocksSubstatusRejected
  | FireblocksSubstatusFailed

export const isFireblocksSubstatusNotCompleted = (
  substatus: string,
): substatus is FireblocksSubstatusNotCompleted =>
  isFireblocksSubstatusBlocked(substatus) ||
  isFireblocksSubstatusCancelled(substatus) ||
  isFireblocksSubstatusRejected(substatus) ||
  isFireblocksSubstatusFailed(substatus)

export type FireblocksSubstatus =
  | FireblocksSubstatusPending
  | FireblocksSubstatusCompleted
  | FireblocksSubstatusNotCompleted

export const isFireblocksSubstatus = (
  substatus: string,
): substatus is FireblocksSubstatus =>
  isFireblocksSubstatusPending(substatus) ||
  isFireblocksSubstatusCompleted(substatus) ||
  isFireblocksSubstatusNotCompleted(substatus)

Types, arrays and typeguards

@cyrilchapon cyrilchapon added the enhancement New feature or request label Jun 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants