@circle-fin/w3s-pw-react-native-sdk
Version:
React Native SDK for Circle Programmable Wallet
473 lines (444 loc) • 19.4 kB
text/typescript
// Copyright (c) 2024, Circle Internet Financial, LTD. All rights reserved.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import type { ImageSourcePropType } from 'react-native/Libraries/Image/Image'
export interface IWalletSdk {
sdkVersion: SdkVersion;
deviceId: string;
init: (configuration: Configuration) => Promise<void>;
setSecurityQuestions: (securityQuestions: SecurityQuestion[]) => void;
addListener: (listener: EventListener) => void;
removeAllListeners: () => void;
getDeviceId: () => string;
execute: (
userToken: string,
encryptionKey: string,
challengeIds: string[],
successCallback: SuccessCallback,
errorCallback: ErrorCallback,
) => void;
setBiometricsPin: (
userToken: string,
encryptionKey: string,
successCallback: SuccessCallback,
errorCallback: ErrorCallback,
) => void;
performLogin: (
provider: SocialProvider,
deviceToken: string,
deviceEncryptionKey: string,
successCallback: LoginSuccessCallback,
errorCallback: ErrorCallback,
) => void;
verifyOTP: (
otpToken: string,
deviceToken: string,
deviceEncryptionKey: string,
successCallback: LoginSuccessCallback,
errorCallback: ErrorCallback,
) => void;
performLogout: (
provider: SocialProvider,
completeCallback: CompleteCallback,
errorCallback: ErrorCallback,
) => void;
setDismissOnCallbackMap: (map: Map<ErrorCode, boolean>) => void;
moveTaskToFront: () => void;
moveRnTaskToFront: () => void;
setTextConfigsMap: (map: Map<TextsKey, TextConfig[]>) => void;
setIconTextConfigsMap: (
map: Map<IconTextsKey, Array<IconTextConfig>>,
) => void;
setTextConfigMap: (map: Map<TextKey, TextConfig>) => void;
setImageMap: (map: Map<ImageKey, ImageSourcePropType>) => void;
setDateFormat: (format: DateFormat) => void;
setDebugging: (debugging: boolean) => void;
setCustomUserAgent: (userAgent: string) => void;
setErrorStringMap: (map: Map<ErrorCode, string>) => void;
}
export enum TextsKey {
newPinCodeHeadline = 'newPinCodeHeadline',
enterPinCodeHeadline = 'enterPinCodeHeadline',
securityIntroHeadline = 'securityIntroHeadline',
securityIntroLink = 'securityIntroLink',
securityQuestionHeaders = 'securityQuestionHeaders',
securitySummaryQuestionHeaders = 'securitySummaryQuestionHeaders',
recoverPinCodeHeadline = 'recoverPinCodeHeadline',
}
export enum IconTextsKey {
securityConfirmationItems = 'securityConfirmationItems',
}
export enum TextKey {
circlepw_continue = 'circlepw_continue',
circlepw_next = 'circlepw_next',
circlepw_skip = 'circlepw_skip',
circlepw_question_label = 'circlepw_question_label',
circlepw_answer_label = 'circlepw_answer_label',
circlepw_hint_label = 'circlepw_hint_label',
circlepw_hint_tag = 'circlepw_hint_tag',
circlepw_confirm = 'circlepw_confirm',
circlepw_pin_remain_attemps_template = 'circlepw_pin_remain_attemps_template',
circlepw_pin_lock_period_template = 'circlepw_pin_lock_period_template',
circlepw_answer_remain_attemps_template = 'circlepw_answer_remain_attemps_template',
circlepw_answer_lock_period_template = 'circlepw_answer_lock_period_template',
circlepw_pin_digit_config = 'circlepw_pin_digit_config',
circlepw_pincode_error_config = 'circlepw_pincode_error_config',
circlepw_enter_pincode_subhead = 'circlepw_enter_pincode_subhead',
circlepw_enter_pincode_forgot_pin = 'circlepw_enter_pincode_forgot_pin',
circlepw_enter_pincode_use_biometrics = 'circlepw_enter_pincode_use_biometrics',
circlepw_new_pincode_subhead = 'circlepw_new_pincode_subhead',
circlepw_confirm_pincode_headline = 'circlepw_confirm_pincode_headline',
circlepw_confirm_pincode_subhead = 'circlepw_confirm_pincode_subhead',
circlepw_security_intros_description = 'circlepw_security_intros_description',
circlepw_security_questions_title = 'circlepw_security_questions_title',
circlepw_security_questions_required_mark = 'circlepw_security_questions_required_mark',
circlepw_security_questions_question_placeholder = 'circlepw_security_questions_question_placeholder',
circlepw_security_questions_answer_header = 'circlepw_security_questions_answer_header',
circlepw_security_questions_answer_placeholder = 'circlepw_security_questions_answer_placeholder',
circlepw_security_questions_answer_hint_header = 'circlepw_security_questions_answer_hint_header',
circlepw_security_questions_answer_hint_placeholder = 'circlepw_security_questions_answer_hint_placeholder',
circlepw_security_questions_answer_input_config = 'circlepw_security_questions_answer_input_config',
circlepw_security_questions_answer_hint_input_config = 'circlepw_security_questions_answer_hint_input_config',
circlepw_security_questions_question_input_config = 'circlepw_security_questions_question_input_config',
circlepw_security_questions_error_config = 'circlepw_security_questions_error_config',
// SelectQuestion
circlepw_select_question_title = 'circlepw_select_question_title',
circlepw_select_question_item_config = 'circlepw_select_question_item_config',
// SecuritySummary
circlepw_security_summary_title = 'circlepw_security_summary_title',
circlepw_security_summary_question_value_config = 'circlepw_security_summary_question_value_config',
circlepw_security_summary_answer_value_config = 'circlepw_security_summary_answer_value_config',
circlepw_security_summary_hint_value_config = 'circlepw_security_summary_hint_value_config',
// SecurityConfirm
circlepw_security_confirm_title = 'circlepw_security_confirm_title',
circlepw_security_confirm_headline = 'circlepw_security_confirm_headline',
circlepw_security_confirm_input_headline = 'circlepw_security_confirm_input_headline',
circlepw_security_confirm_input_config = 'circlepw_security_confirm_input_config',
circlepw_security_confirm_input_placeholder = 'circlepw_security_confirm_input_placeholder',
circlepw_security_confirm_input_match = 'circlepw_security_confirm_input_match',
// RecoverPINCode
circlepw_recover_pincode_answer_input_header = 'circlepw_recover_pincode_answer_input_header',
circlepw_recover_pincode_answer_input_placeholder = 'circlepw_recover_pincode_answer_input_placeholder',
circlepw_recover_pincode_input_config = 'circlepw_recover_pincode_input_config',
circlepw_recover_pincode_answer_hint_config = 'circlepw_recover_pincode_answer_hint_config',
circlepw_recover_pincode_error_config = 'circlepw_recover_pincode_error_config',
circlepw_recover_pincode_question_config = 'circlepw_recover_pincode_question_config',
// BiometricsAllow
circlepw_pin_biometrics_allow_title = 'circlepw_pin_biometrics_allow_title',
circlepw_pin_biometrics_allow_subtitle = 'circlepw_pin_biometrics_allow_subtitle',
circlepw_pin_biometrics_disable = 'circlepw_pin_biometrics_disable',
circlepw_pin_biometrics_encrypt_title = 'circlepw_pin_biometrics_encrypt_title',
circlepw_pin_biometrics_encrypt_subtitle = 'circlepw_pin_biometrics_encrypt_subtitle',
circlepw_pin_biometrics_encrypt_desc = 'circlepw_pin_biometrics_encrypt_desc',
circlepw_pin_biometrics_encrypt_negative_text = 'circlepw_pin_biometrics_encrypt_negative_text',
circlepw_pin_biometrics_decrypt_title = 'circlepw_pin_biometrics_decrypt_title',
circlepw_pin_biometrics_decrypt_subtitle = 'circlepw_pin_biometrics_decrypt_subtitle',
circlepw_pin_biometrics_decrypt_desc = 'circlepw_pin_biometrics_decrypt_desc',
circlepw_pin_biometrics_decrypt_negative_text = 'circlepw_pin_biometrics_decrypt_negative_text',
circlepw_pin_biometrics_update_title = 'circlepw_pin_biometrics_update_title',
circlepw_pin_biometrics_update_subtitle = 'circlepw_pin_biometrics_update_subtitle',
circlepw_alert_pop_window_title = 'circlepw_alert_pop_window_title',
circlepw_alert_pop_window_description_config = 'circlepw_alert_pop_window_description_config',
circlepw_alert_pop_window_confirm = 'circlepw_alert_pop_window_confirm',
circlepw_swipe_confirm_headline = 'circlepw_swipe_confirm_headline',
circlepw_swipe_confirm_subhead = 'circlepw_swipe_confirm_subhead',
circlepw_swipe_to_confirm = 'circlepw_swipe_to_confirm',
circlepw_swipe_bt_confirming = 'circlepw_swipe_bt_confirming',
circlepw_swipe_bt_confirmed = 'circlepw_swipe_bt_confirmed',
circlepw_swipe_bt_try_again = 'circlepw_swipe_bt_try_again',
circlepw_transaction_request_title = 'circlepw_transaction_request_title',
circlepw_transaction_request_subtitle = 'circlepw_transaction_request_subtitle',
circlepw_transaction_request_main_currency = 'circlepw_transaction_request_main_currency',
circlepw_transaction_request_exchange_value = 'circlepw_transaction_request_exchange_value',
circlepw_transaction_request_from_label = 'circlepw_transaction_request_from_label',
circlepw_transaction_request_from = 'circlepw_transaction_request_from',
circlepw_transaction_request_to_label = 'circlepw_transaction_request_to_label',
circlepw_transaction_request_to_config = 'circlepw_transaction_request_to_config',
circlepw_transaction_request_to_contract_name = 'circlepw_transaction_request_to_contract_name',
circlepw_transaction_request_to_contract_url = 'circlepw_transaction_request_to_contract_url',
circlepw_transaction_request_network_fee_label = 'circlepw_transaction_request_network_fee_label',
circlepw_transaction_request_network_fee = 'circlepw_transaction_request_network_fee',
circlepw_transaction_request_exchange_network_fee = 'circlepw_transaction_request_exchange_network_fee',
circlepw_transaction_request_total_label = 'circlepw_transaction_request_total_label',
circlepw_transaction_request_total_config = 'circlepw_transaction_request_total_config',
circlepw_transaction_request_exchange_total_value = 'circlepw_transaction_request_exchange_total_value',
circlepw_transaction_request_error_config = 'circlepw_transaction_request_error_config',
circlepw_transaction_request_fee_tip = 'circlepw_transaction_request_fee_tip',
circlepw_contract_interaction_contract_address_label = 'circlepw_contract_interaction_contract_address_label',
circlepw_contract_interaction_contract_address_config = 'circlepw_contract_interaction_contract_address_config',
circlepw_contract_interaction_data_details = 'circlepw_contract_interaction_data_details',
circlepw_contract_interaction_abi_function_label = 'circlepw_contract_interaction_abi_function_label',
circlepw_contract_interaction_abi_function_config = 'circlepw_contract_interaction_abi_function_config',
circlepw_contract_interaction_abi_parameter_label = 'circlepw_contract_interaction_abi_parameter_label',
circlepw_contract_interaction_call_data_label = 'circlepw_contract_interaction_call_data_label',
circlepw_contract_interaction_call_data_config = 'circlepw_contract_interaction_call_data_config',
circlepw_transaction_request_raw_tx_description = 'circlepw_transaction_request_raw_tx_description',
circlepw_transaction_request_raw_tx_config = 'circlepw_transaction_request_raw_tx_config',
circlepw_signature_request_title = 'circlepw_signature_request_title',
circlepw_signature_request_contract_name = 'circlepw_signature_request_contract_name',
circlepw_signature_request_contract_url = 'circlepw_signature_request_contract_url',
circlepw_signature_request_subtitle = 'circlepw_signature_request_subtitle',
circlepw_signature_request_description = 'circlepw_signature_request_description',
circlepw_signature_request_msg_config = 'circlepw_signature_request_msg_config',
circlepw_sign = 'circlepw_sign',
circlepw_try_again = 'circlepw_try_again',
circlepw_email_otp_title = 'circlepw_email_otp_title',
circlepw_email_otp_description = 'circlepw_email_otp_description',
circlepw_email_otp_email = 'circlepw_email_otp_email',
circlepw_email_otp_head_config = 'circlepw_email_otp_head_config',
circlepw_email_otp_dash = 'circlepw_email_otp_dash',
circlepw_email_otp_send_again_hint = 'circlepw_email_otp_send_again_hint',
circlepw_email_otp_send_again = 'circlepw_email_otp_send_again',
}
export enum ImageKey {
naviBack = 'back',
naviClose = 'close',
securityIntroMain = 'securityIntroMain',
selectCheckMark = 'selectCheckMark',
dropdownArrow = 'dropdownArrow',
errorInfo = 'errorInfo',
securityConfirmMain = 'securityConfirmMain',
biometricsAllowMain = 'biometricsAllowMain',
showPin = 'showPin',
hidePin = 'hidePin',
alertWindowIcon = 'alertWindowIcon',
transactionTokenIcon = 'transactionTokenIcon',
networkFeeTipIcon = 'networkFeeTipIcon',
showLessDetailArrow = 'showLessDetailArrow',
showMoreDetailArrow = 'showMoreDetailArrow',
requestIcon = 'requestIcon',
}
export enum DateFormat {
YYYYMMDD_HYPHEN = 'yyyy-MM-dd',
DDMMYYYY_SLASH = 'dd/MM/yyyy',
MMDDYYYY_SLASH = 'MM/dd/yyyy',
}
export enum ErrorCode {
unknown = '-1',
success = '0',
apiParameterMissing = '1',
apiParameterInvalid = '2',
forbidden = '3',
unauthorized = '4',
retry = '9',
customerSuspended = '10',
pending = '11',
invalidSession = '12',
invalidPartnerId = '13',
invalidMessage = '14',
invalidPhone = '15',
// Common 156001 - 156999,
walletIdNotFound = '156001',
tokenIdNotFound = '156002',
transactionIdNotFound = '156003',
walletSetIdNotFound = '156004',
// Transaction related - 155201 - 155499,
notEnoughFounds = '155201',
notEnoughBalance = '155202',
exceedWithdrawLimit = '155203',
minimumFundsRequired = '155204',
invalidTransactionFee = '155205',
rejectedOnAmlScreening = '155206',
tagRequired = '155207',
gasLimitTooLow = '155208',
transactionDataNotEncodedProperly = '155209',
fullNodeReturnedError = '155210',
walletSetupRequired = '155211',
lowerThenMinimumAccountBalance = '155212',
rejectedByBlockchain = '155213',
droppedAsPartOfReorg = '155214',
operationNotSupport = '155215',
amountBelowMinimum = '155216',
wrongNftTokenIdNumber = '155217',
invalidDestinationAddress = '155218',
tokenWalletChainMismatch = '155219',
wrongAmountsNumber = '155220',
// User related - 155101 - 155199,
userAlreadyExisted = '155101',
userNotFound = '155102',
userTokenNotFound = '155103',
userTokenExpired = '155104',
invalidUserToken = '155105',
userWasInitialized = '155106',
userHasSetPin = '155107',
userHasSetSecurityQuestion = '155108',
userWasDisabled = '155109',
userDoesNotSetPinYet = '155110',
userDoesNotSetSecurityQuestionYet = '155111',
incorrectUserPin = '155112',
incorrectDeviceId = '155113',
incorrectAppId = '155114',
incorrectSecurityAnswers = '155115',
invalidChallengeId = '155116',
invalidApproveContent = '155117',
invalidEncryptionKey = '155118',
userPinLocked = '155119',
securityAnswersLocked = '155120',
// Wallet- 155501 - 155599,
walletIsFrozen = '155501',
maxWalletLimitReached = '155502',
walletSetIdMutuallyExclusive = '155503',
metadataUnmatched = '155504',
// WalletSet - 155601 - 155699,
// SDK UI - 155701 - 155799,
userCanceled = '155701',
launchUiFailed = '155702',
pinCodeNotMatched = '155703',
insecurePinCode = '155704',
hintsMatchAnswers = '155705',
networkError = '155706',
biometricsSettingNotEnabled = '155708',
deviceNotSupportBiometrics = '155709',
biometricsKeyPermanentlyInvalidated = '155710',
biometricsUserSkip = '155711',
biometricsUserDisableForPin = '155712',
biometricsUserLockout = '155713',
biometricsUserLockoutPermanent = '155714',
biometricsUserNotAllowPermission = '155715',
biometricsInternalError = '155716',
userSecretMissing = '155717',
invalidUserTokenFormat = '155718',
userTokenMismatch = '155719',
socialLoginFailed = '155720',
loginInfoMissing = '155721',
}
export class SecurityQuestion {
title: string
inputType?: InputType
constructor(title: string, inputType?: InputType) {
this.title = title
this.inputType = inputType
}
}
export interface Configuration {
endpoint: string;
appId: string;
settingsManagement?: SettingsManagement;
}
export type EventListener = (event: ExecuteEvent) => void
export type SuccessCallback = (result: SuccessResult) => void
export type LoginSuccessCallback = (result: LoginResult) => void
export type CompleteCallback = () => void
export type ErrorCallback = (error: Error) => void
export interface SdkVersion {
native: string;
rn?: string;
}
export interface SuccessResult {
result: ExecuteResult;
warning?: ExecuteWarning;
}
export interface Error {
code?: string;
message: string;
}
export interface LoginResult {
userToken?: string;
encryptionKey?: string;
refreshToken?: string;
oauthInfo?: OauthInfo;
}
export interface OauthInfo {
provider?: string;
scope?: string[];
socialUserUUID?: string;
socialUserInfo?: SocialUserInfo;
}
export interface SocialUserInfo {
name?: string;
email?: string;
phone?: string;
}
export interface ExecuteResult {
resultType: ExecuteResultType;
status: ExecuteResultStatus;
data?: ExecuteResultData;
}
export interface ExecuteWarning {
warningType: ErrorCode;
warningString: string;
}
export interface ExecuteResultData {
signature?: string;
signedTransaction?: string;
txHash?: string;
}
export interface SettingsManagement {
enableBiometricsPin: boolean;
}
export class IconTextConfig {
image: ImageSourcePropType
textConfig: TextConfig
constructor(image: ImageSourcePropType, textConfig: TextConfig) {
this.image = image
this.textConfig = textConfig
}
}
export class TextConfig {
text?: string
gradientColors?: string[]
textColor?: string
font?: string
constructor(
text?: string,
gradientColorsOrTextColor?: string[] | string,
font?: string,
) {
this.text = text
if(Array.isArray(gradientColorsOrTextColor)){
this.gradientColors = gradientColorsOrTextColor
} else {
this.textColor = gradientColorsOrTextColor
}
this.font = font
}
}
export enum ExecuteResultStatus {
UNKNOWN = 'UNKNOWN',
PENDING = 'PENDING',
IN_PROGRESS = 'IN_PROGRESS',
COMPLETE = 'COMPLETE',
FAILED = 'FAILED',
EXPIRED = 'EXPIRED',
}
export enum ExecuteEvent {
forgotPin = 'forgotPin',
resendOtp = 'resendOtp',
}
export enum ExecuteResultType {
UNKNOWN = 'UNKNOWN',
SET_PIN = 'SET_PIN',
RESTORE_PIN = 'RESTORE_PIN',
SET_SECURITY_QUESTIONS = 'SET_SECURITY_QUESTIONS',
CREATE_WALLET = 'CREATE_WALLET',
CREATE_TRANSACTION = 'CREATE_TRANSACTION',
ACCELERATE_TRANSACTION = 'ACCELERATE_TRANSACTION',
CANCEL_TRANSACTION = 'CANCEL_TRANSACTION',
CONTRACT_EXECUTION = 'CONTRACT_EXECUTION',
SIGN_MESSAGE = 'SIGN_MESSAGE',
SIGN_TYPEDDATA = 'SIGN_TYPEDDATA',
INITIALIZE = 'INITIALIZE',
SET_BIOMETRICS_PIN = 'SET_BIOMETRICS_PIN',
WALLET_UPGRADE = 'WALLET_UPGRADE',
}
export enum InputType {
text = 'text',
datePicker = 'datePicker',
}
export enum SocialProvider {
Google = 'Google',
Facebook = 'Facebook',
Apple = 'Apple',
}