@funkit/api-base 1.6.1 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/index.js +42 -4
- package/dist/index.js.map +4 -4
- package/dist/src/consts/customers.d.ts +1 -0
- package/dist/src/services/checkout/endpoints.d.ts +1 -2
- package/dist/src/services/checkout/types.d.ts +9 -3
- package/dist/src/services/direct-execution/endpoints.d.ts +1 -1
- package/dist/src/services/direct-execution/types.d.ts +5 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @funkit/api-base
|
|
2
2
|
|
|
3
|
+
## 1.7.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8567438: refactor: reorganize checkout state consts
|
|
8
|
+
- 96e5bd7: feat(api-base,apps): add Bankr theme
|
|
9
|
+
- 9f7c7c4: feat: add direct execution type
|
|
10
|
+
- Updated dependencies [5e940e8]
|
|
11
|
+
- Updated dependencies [b499231]
|
|
12
|
+
- Updated dependencies [3b53dab]
|
|
13
|
+
- @funkit/utils@1.0.11
|
|
14
|
+
|
|
15
|
+
## 1.7.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- c3f4863: deprecate expiration fields
|
|
20
|
+
|
|
3
21
|
## 1.6.1
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,7 @@ var POLYMARKET_API_KEY = "Y53dikxXdT4E3afI1l8BMBSWgyhKvf65k6Dut1k6";
|
|
|
38
38
|
var VERTEX_API_KEY = "OQXhzzkLHE2vHAK8nZBS76el5utuw3527RmnYn26";
|
|
39
39
|
var OSTIUM_API_KEY = "SMbBD7DS9b3EPcyBVg4a8az1rRWR9xB068chHoUN";
|
|
40
40
|
var DEV_API_KEY = "Z9SZaOwpmE40KX61mUKWm5hrpGh7WHVkaTvQJpQk";
|
|
41
|
+
var BANKR_API_KEY = "vWe20Dfyui2ouvfOhtSTY3Czeo8lFdbo5xXQBALZ";
|
|
41
42
|
|
|
42
43
|
// src/utils/checkout.ts
|
|
43
44
|
import { toHex } from "viem";
|
|
@@ -356,6 +357,28 @@ var CheckoutState = /* @__PURE__ */ ((CheckoutState2) => {
|
|
|
356
357
|
CheckoutState2["CANCELLED"] = "CANCELLED";
|
|
357
358
|
return CheckoutState2;
|
|
358
359
|
})(CheckoutState || {});
|
|
360
|
+
var FROM_PROGRESS_CHECKOUT_STATES = [
|
|
361
|
+
"FROM_UNFUNDED" /* FROM_UNFUNDED */,
|
|
362
|
+
"FROM_FUNDED" /* FROM_FUNDED */,
|
|
363
|
+
"FROM_POOLED" /* FROM_POOLED */
|
|
364
|
+
];
|
|
365
|
+
var TO_PROGRESS_CHECKOUT_STATES = [
|
|
366
|
+
"TO_UNFUNDED" /* TO_UNFUNDED */,
|
|
367
|
+
"TO_FUNDED" /* TO_FUNDED */,
|
|
368
|
+
"TO_POOLED" /* TO_POOLED */,
|
|
369
|
+
"TO_READY" /* TO_READY */,
|
|
370
|
+
"PENDING_RECEIVAL" /* PENDING_RECEIVAL */
|
|
371
|
+
];
|
|
372
|
+
var IN_PROGRESS_CHECKOUT_STATES = [
|
|
373
|
+
...TO_PROGRESS_CHECKOUT_STATES,
|
|
374
|
+
...FROM_PROGRESS_CHECKOUT_STATES
|
|
375
|
+
];
|
|
376
|
+
var TERMINAL_CHECKOUT_STATES = [
|
|
377
|
+
"EXPIRED" /* EXPIRED */,
|
|
378
|
+
"CHECKOUT_ERROR" /* CHECKOUT_ERROR */,
|
|
379
|
+
"COMPLETED" /* COMPLETED */,
|
|
380
|
+
"CANCELLED" /* CANCELLED */
|
|
381
|
+
];
|
|
359
382
|
var CheckoutRefundState = /* @__PURE__ */ ((CheckoutRefundState2) => {
|
|
360
383
|
CheckoutRefundState2["INITIATED"] = "INITIATED";
|
|
361
384
|
CheckoutRefundState2["ERROR"] = "ERROR";
|
|
@@ -367,6 +390,7 @@ var CheckoutRefundState = /* @__PURE__ */ ((CheckoutRefundState2) => {
|
|
|
367
390
|
})(CheckoutRefundState || {});
|
|
368
391
|
|
|
369
392
|
// src/services/checkout/endpoints.ts
|
|
393
|
+
var DEFAULT_EXPIRATION_TIMESTAMP_MS = 15 * 60 * 1e3;
|
|
370
394
|
async function getCheckoutQuote({
|
|
371
395
|
fromChainId,
|
|
372
396
|
fromTokenAddress,
|
|
@@ -375,7 +399,6 @@ async function getCheckoutQuote({
|
|
|
375
399
|
toTokenAddress,
|
|
376
400
|
toTokenDecimals,
|
|
377
401
|
toTokenAmount,
|
|
378
|
-
expirationTimestampMs,
|
|
379
402
|
sponsorInitialTransferGasLimit,
|
|
380
403
|
recipientAddr,
|
|
381
404
|
userId,
|
|
@@ -397,7 +420,7 @@ async function getCheckoutQuote({
|
|
|
397
420
|
// Reference: https://vintage-heaven-3cd.notion.site/API-Gateway-Caching-and-Pre-Warming-System-Draft-ee7909d9b85f43c793ce7bd2607bec02?pvs=4
|
|
398
421
|
// Note: Rounding *down* instead of a regular round to safeguard against edge case of timing passing frontend range validation but failing backend range validation
|
|
399
422
|
checkoutExpirationTimestampSeconds: roundToNearestBottomTenth(
|
|
400
|
-
Math.round((Date.now() +
|
|
423
|
+
Math.round((Date.now() + DEFAULT_EXPIRATION_TIMESTAMP_MS) / 1e3)
|
|
401
424
|
).toString(),
|
|
402
425
|
sponsorInitialTransferGasLimit
|
|
403
426
|
};
|
|
@@ -608,7 +631,8 @@ async function createDirectExecution({
|
|
|
608
631
|
estTotalUsd,
|
|
609
632
|
sourceOfFund,
|
|
610
633
|
clientMetadata,
|
|
611
|
-
apiKey
|
|
634
|
+
apiKey,
|
|
635
|
+
type
|
|
612
636
|
}) {
|
|
613
637
|
const body = {
|
|
614
638
|
txHash,
|
|
@@ -622,7 +646,8 @@ async function createDirectExecution({
|
|
|
622
646
|
fromAmountBaseUnit,
|
|
623
647
|
toAmountBaseUnit,
|
|
624
648
|
estTotalUsd,
|
|
625
|
-
clientMetadata
|
|
649
|
+
clientMetadata,
|
|
650
|
+
type
|
|
626
651
|
};
|
|
627
652
|
const res = await sendPostRequest({
|
|
628
653
|
uri: `${API_BASE_URL}/direct-execution`,
|
|
@@ -632,6 +657,13 @@ async function createDirectExecution({
|
|
|
632
657
|
return res;
|
|
633
658
|
}
|
|
634
659
|
|
|
660
|
+
// src/services/direct-execution/types.ts
|
|
661
|
+
var DirectExecutionType = /* @__PURE__ */ ((DirectExecutionType2) => {
|
|
662
|
+
DirectExecutionType2["TEST_EXECUTION"] = "TEST_EXECUTION";
|
|
663
|
+
DirectExecutionType2["VERTEX_DEPOSIT_COLLATERAL_WITH_REFERRAL"] = "VERTEX_DEPOSIT_COLLATERAL_WITH_REFERRAL";
|
|
664
|
+
return DirectExecutionType2;
|
|
665
|
+
})(DirectExecutionType || {});
|
|
666
|
+
|
|
635
667
|
// src/services/faucet/endpoints.ts
|
|
636
668
|
async function getAssetFromFaucet({
|
|
637
669
|
token,
|
|
@@ -1308,13 +1340,17 @@ async function sendSupportMessage({
|
|
|
1308
1340
|
export {
|
|
1309
1341
|
API_BASE_URL,
|
|
1310
1342
|
AuthType,
|
|
1343
|
+
BANKR_API_KEY,
|
|
1311
1344
|
CheckoutRefundState,
|
|
1312
1345
|
CheckoutState,
|
|
1313
1346
|
DEFAULT_RETRY_OPTIONS,
|
|
1314
1347
|
DEGEN_API_KEY,
|
|
1315
1348
|
DEV_API_KEY,
|
|
1316
1349
|
DYDX_API_KEY,
|
|
1350
|
+
DirectExecutionType,
|
|
1351
|
+
FROM_PROGRESS_CHECKOUT_STATES,
|
|
1317
1352
|
FUN_FAUCET_URL,
|
|
1353
|
+
IN_PROGRESS_CHECKOUT_STATES,
|
|
1318
1354
|
MESH_API_BASE_URL,
|
|
1319
1355
|
MeshExecuteTransferMfaType,
|
|
1320
1356
|
MeshExecuteTransferStatus,
|
|
@@ -1323,6 +1359,8 @@ export {
|
|
|
1323
1359
|
OperationType,
|
|
1324
1360
|
POLYMARKET_API_KEY,
|
|
1325
1361
|
PaymasterType,
|
|
1362
|
+
TERMINAL_CHECKOUT_STATES,
|
|
1363
|
+
TO_PROGRESS_CHECKOUT_STATES,
|
|
1326
1364
|
VERTEX_API_KEY,
|
|
1327
1365
|
addTransaction,
|
|
1328
1366
|
addUserToWallet,
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/consts/api.ts", "../src/utils/error.ts", "../src/consts/retry.ts", "../src/consts/customers.ts", "../src/utils/checkout.ts", "../src/utils/request.ts", "../src/services/assets/endpoints.ts", "../src/services/checkout/endpoints.ts", "../src/services/checkout/types.ts", "../src/services/direct-execution/endpoints.ts", "../src/services/faucet/endpoints.ts", "../src/services/fw-access/endpoints.ts", "../src/services/fw-group/endpoints.ts", "../src/services/fw-info/endpoints.ts", "../src/services/fw-operation/endpoints.ts", "../src/services/fw-operation/types.ts", "../src/services/fw-paymaster/endpoints.ts", "../src/services/fw-paymaster/types.ts", "../src/services/fw-user/endpoints.ts", "../src/services/mesh/endpoints.ts", "../src/services/mesh/types.ts", "../src/services/moonpay/endpoints.ts", "../src/services/stripe/endpoints.ts", "../src/services/support/endpoints.ts"],
|
|
4
|
-
"sourcesContent": ["export const API_BASE_URL = process.env.API_BASE_URL || 'https://api.fun.xyz/v1' // Production\n\n// TODO: change it to fun.xyz domain\nexport const MESH_API_BASE_URL = 'https://frog.fun.xyz'\n\nexport const FUN_FAUCET_URL = 'https://api.fun.xyz/demo-faucet'\n", "import {\n InvalidParameterError,\n ResourceNotFoundError,\n UserOpFailureError,\n} from '@funkit/utils'\nimport type { AttemptContext } from '@lifeomic/attempt'\n\nexport const errorAbortHandler = (err: Error, context: AttemptContext) => {\n if (\n err instanceof ResourceNotFoundError ||\n err instanceof InvalidParameterError ||\n err instanceof UserOpFailureError\n ) {\n context.abort()\n }\n}\n", "import type { PartialAttemptOptions } from '@lifeomic/attempt'\n\nimport { errorAbortHandler } from '../utils/error'\n\nexport type BaseResponse = unknown\n\nexport type RetryOptions<T = BaseResponse> = PartialAttemptOptions<T>\n\nexport const DEFAULT_RETRY_OPTIONS = {\n delay: 100,\n initialDelay: 0,\n maxDelay: 3000,\n factor: 2,\n maxAttempts: 5,\n timeout: 0,\n jitter: true,\n minDelay: 0,\n handleError: errorAbortHandler,\n handleTimeout: null,\n beforeAttempt: null,\n calculateDelay: null,\n} as RetryOptions\n", "export const DEGEN_API_KEY = 'm4iHIILHcL4gN8EXCMzGe8zIdhuCXxck49mWajzJ'\nexport const DYDX_API_KEY = 'NJq0CGrsE19xBbP1vHyBOp8xJvzYo9kayJHqDFP5'\nexport const POLYMARKET_API_KEY = 'Y53dikxXdT4E3afI1l8BMBSWgyhKvf65k6Dut1k6'\nexport const VERTEX_API_KEY = 'OQXhzzkLHE2vHAK8nZBS76el5utuw3527RmnYn26'\nexport const OSTIUM_API_KEY = 'SMbBD7DS9b3EPcyBVg4a8az1rRWR9xB068chHoUN'\nexport const DEV_API_KEY = 'Z9SZaOwpmE40KX61mUKWm5hrpGh7WHVkaTvQJpQk'\n", "import { toHex } from 'viem'\n\nexport function randomBytes(length: number) {\n const bytes = new Uint8Array(length)\n for (let i = 0; i < length; i++) {\n bytes[i] = Math.floor(Math.random() * 256)\n }\n return toHex(bytes)\n}\n\nexport function generateRandomCheckoutSalt() {\n return toHex(BigInt(randomBytes(32)))\n}\n\nexport function roundToNearestBottomTenth(n: number) {\n return Math.floor(n / 10) * 10\n}\n", "import { retry } from '@lifeomic/attempt'\n\nimport type { BaseRequest } from '../consts/request'\nimport {\n type BaseResponse,\n DEFAULT_RETRY_OPTIONS,\n type RetryOptions,\n} from '../consts/retry'\n\nimport {\n AccessDeniedError,\n ErrorCode,\n InternalFailureError,\n InvalidParameterError,\n ResourceNotFoundError,\n ThrottlingError,\n UserOpFailureError,\n jsonStringifyWithBigIntSanitization,\n} from '@funkit/utils'\nimport type {\n DeleteRequest,\n GetRequest,\n PostRequest,\n PutRequest,\n} from './../consts/request'\n\ntype RequestError = {\n errorMsg: string\n errorCode: string\n}\n\nexport async function sendRequest<T = BaseResponse>({\n uri,\n method,\n apiKey,\n body = {},\n logger,\n retryOptions = {},\n signal,\n}: BaseRequest): Promise<T> {\n const headers = {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'X-Api-Key': apiKey } : {}),\n }\n\n try {\n const finalRetryOptions = {\n ...DEFAULT_RETRY_OPTIONS,\n ...retryOptions,\n } as RetryOptions<T>\n\n return retry<T>(async (context) => {\n const startTimeMs = Date.now()\n const fetchParams = {\n method,\n headers,\n redirect: 'follow',\n signal,\n body:\n method !== 'GET'\n ? jsonStringifyWithBigIntSanitization(body)\n : undefined,\n } as RequestInit\n\n logger?.info('api-base:sendRequest_before', {\n uri,\n fetchParams,\n startTimeMs,\n })\n const response = await fetch(uri, fetchParams)\n const json = await response.json()\n const endTimeMs = Date.now()\n logger?.info('api-base:sendRequest_after', {\n url: uri,\n fetchParams,\n endTimeMs,\n response: {\n body: json,\n status: response.status,\n },\n durationMs: endTimeMs - startTimeMs,\n retries: context.attemptNum,\n })\n\n if (response.ok) {\n return json\n }\n\n const { errorMsg, errorCode } = json as RequestError\n\n if (response.status === 400) {\n throw new InvalidParameterError(\n ErrorCode.InvalidParameter,\n `bad request ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'check the api call parameters. its mostly because some call parameters are wrong',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 403) {\n throw new AccessDeniedError(\n ErrorCode.Unauthorized,\n 'Invalid API key or insufficient access.',\n errorMsg,\n { apiKey },\n 'Check your api key at https://app.fun.xyz and check with fun team if you believe something is off',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 404) {\n throw new ResourceNotFoundError(\n ErrorCode.ServerMissingData,\n JSON.stringify(json),\n errorMsg,\n { body },\n 'check the api call parameters. its mostly because some call parameters are wrong',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 429) {\n throw new ThrottlingError(\n ErrorCode.RequestLimitExceeded,\n `too many requests ${JSON.stringify(json)}`,\n 'Too many requests',\n { body },\n 'you are making too many requests. please slow down. Reach out to fun team if you need more quota',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 500) {\n if (errorCode === ErrorCode.UserOpFailureError) {\n throw new UserOpFailureError(\n ErrorCode.UserOpFailureError,\n JSON.stringify(json), // UserOpFailureError may JSON.parse this! Do not modify!\n errorMsg,\n { body },\n 'fix user op failure. Most of the time this is due to invalid parameters',\n 'https://docs.fun.xyz',\n )\n }\n throw new InternalFailureError(\n ErrorCode.ServerFailure,\n `server failure ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 504) {\n throw new InternalFailureError(\n ErrorCode.ServerTimeout,\n `server timeout failure ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n if (!response.ok) {\n throw new InternalFailureError(\n ErrorCode.UnknownServerError,\n `unknown server failure ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n return {}\n }, finalRetryOptions)\n } catch (err) {\n logger?.error('api-base:fetch_error', {\n url: uri,\n method,\n request: {\n body,\n headers,\n },\n error: err,\n })\n\n throw new InternalFailureError(\n ErrorCode.ServerConnectionError,\n `Cannot connect to Fun API Service ${err}`,\n '',\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n}\n\nexport async function sendGetRequest<T = BaseResponse>(\n options: GetRequest,\n): Promise<T> {\n return await sendRequest({ ...options, method: 'GET' })\n}\n\nexport async function sendPostRequest<T = BaseResponse>(\n options: PostRequest,\n): Promise<T> {\n return await sendRequest({ ...options, method: 'POST' })\n}\n\nexport async function sendPutRequest<T = BaseResponse>(\n options: PutRequest,\n): Promise<T> {\n return await sendRequest({ ...options, method: 'PUT' })\n}\n\nexport async function sendDeleteRequest(options: DeleteRequest): Promise<void> {\n await sendRequest({ ...options, method: 'DELETE' })\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest } from '../../utils'\nimport type {\n Erc20AssetInfo,\n GetAllWalletNFTsByChainIdRequest,\n GetAllWalletNFTsByChainIdResponse,\n GetAllWalletNFTsRequest,\n GetAllWalletNFTsResponse,\n GetAllWalletTokensByChainIdRequest,\n GetAllWalletTokensByChainIdResponse,\n GetAllWalletTokensRequest,\n GetAllWalletTokensResponse,\n GetAllowedAssetsRequest,\n GetAllowedAssetsResponse,\n GetAssetErc20ByChainAndSymbolRequest,\n GetAssetPriceInfoRequest,\n GetAssetPriceInfoResponse,\n GetNftAddressRequest,\n GetNftNameRequest,\n GetWalletLidoWithdrawalsByChainId,\n GetWalletLidoWithdrawalsByChainIdResponse,\n NftAssetInfo,\n} from './types'\n\n/**\n * Gets the estimated dollar unit price of a tokenAddress for checkout\n * @param chainId https://chainlist.org/ e.g. \"1\" for ethereum\n * @param assetTokenAddress tokenAddress of the asset on the given chain\n * @param apiKey\n */\nexport async function getAssetPriceInfo({\n chainId,\n assetTokenAddress,\n ...options\n}: GetAssetPriceInfoRequest): Promise<GetAssetPriceInfoResponse> {\n const priceInfo: GetAssetPriceInfoResponse = await sendGetRequest({\n uri: `${API_BASE_URL}/asset/erc20/price/${chainId}/${assetTokenAddress}`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n return priceInfo\n}\n\n/**\n * Gets the ERC20 asset info by chain and symbol\n * @param chainId https://chainlist.org/ e.g. \"1\" for ethereum\n * @param symbol symbol of the asset\n * @param apiKey\n */\nexport async function getAssetErc20ByChainAndSymbol({\n chainId,\n symbol,\n ...options\n}: GetAssetErc20ByChainAndSymbolRequest): Promise<Erc20AssetInfo> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/asset/erc20/${chainId}/${symbol}`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**\n * Get all tokens for a given wallet address\n * @param walletAddress\n * @param onlyVerifiedTokens If true, only return alchemy tokens that are verified(filters spam)\n * @param apiKey\n * @param signal AbortSignal to cancel the request when no longer needed\n */\nexport async function getAllWalletTokens({\n walletAddress,\n onlyVerifiedTokens,\n ...options\n}: GetAllWalletTokensRequest): Promise<GetAllWalletTokensResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/erc20s/${walletAddress}?onlyVerifiedTokens=${onlyVerifiedTokens}`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**\n * Get all tokens for a given wallet address on a specific chain\n * @param chainId https://chainlist.org/\n * @param walletAddress\n * @param onlyVerifiedTokens If true, only return alchemy tokens that are verified(filters spam)\n * @param apiKey\n */\nexport async function getAllWalletTokensByChainId({\n chainId,\n walletAddress,\n onlyVerifiedTokens,\n ...options\n}: GetAllWalletTokensByChainIdRequest): Promise<GetAllWalletTokensByChainIdResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/erc20s/${walletAddress}/${chainId}?onlyVerifiedTokens=${onlyVerifiedTokens}`,\n\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**\n * Get list of assets that are allowed to be used for checkout\n * @param apiKey\n */\nexport async function getAllowedAssets(\n options: GetAllowedAssetsRequest,\n): Promise<GetAllowedAssetsResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/allow`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**=======================\n * POTENTIAL DEPRECATION\n *=======================*/\n\n/**\n * Get all the NFTs owned by a wallet\n * @param walletAddress\n * @param apiKey\n */\nexport async function getAllWalletNFTs({\n walletAddress,\n ...options\n}: GetAllWalletNFTsRequest): Promise<GetAllWalletNFTsResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/nfts/${walletAddress}`,\n ...options,\n })\n}\n\n/**\n * Get all the NFTs owned by a wallet on a specific chain\n * @param chainId From https://chainlist.org/\n * @param walletAddress Address of holder\n * @param apiKey\n */\nexport async function getAllWalletNFTsByChainId({\n chainId,\n walletAddress,\n ...options\n}: GetAllWalletNFTsByChainIdRequest): Promise<GetAllWalletNFTsByChainIdResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/nfts/${walletAddress}/${chainId}`,\n ...options,\n })\n}\n\n/**\n * Get all lido withdrawal request ids for a wallet address on a specific chain\n * @param {string} chainId https://chainlist.org/ ie \"1\" for ethereum\n * @param {string} holderAddr Address of holder\n * @returns [readyToWithdrawRequestIds, notReadyToWithdrawRequestIds]\n */\nexport async function getWalletLidoWithdrawalsByChainId({\n chainId,\n walletAddress,\n ...options\n}: GetWalletLidoWithdrawalsByChainId): Promise<GetWalletLidoWithdrawalsByChainIdResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/lido-withdrawals/${walletAddress}/${chainId}`,\n ...options,\n })\n}\n\n/**\n * Get the name of an NFT collection\n * @param {string} chainId https://chainlist.org/\n * @param {string} nftAddress Address of NFT\n */\nexport async function getNftName({\n chainId,\n nftAddress,\n ...options\n}: GetNftNameRequest): Promise<NftAssetInfo> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/asset/nft/${chainId}/${nftAddress}`,\n ...options,\n })\n}\n\n/**\n * Get the address and chainId of an NFT collection\n * @param {string} name Name of NFT\n */\nexport async function getNftAddress({\n name,\n ...options\n}: GetNftAddressRequest): Promise<NftAssetInfo> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/asset/nft?name=${name}`,\n ...options,\n })\n}\n", "import Big from 'big.js'\nimport type { Address } from 'viem'\n\nimport { ErrorCode, ResourceNotFoundError } from '@funkit/utils'\nimport { API_BASE_URL, type BaseApiRequest } from '../../consts'\nimport {\n generateRandomCheckoutSalt,\n roundToNearestBottomTenth,\n sendGetRequest,\n sendPostRequest,\n} from '../../utils'\nimport {\n type CheckoutApiInitParams,\n type CheckoutApiQuoteParams,\n type CheckoutApiQuoteResponse,\n type CheckoutDeactivateParams,\n type CheckoutHistoryItem,\n type CheckoutInitParams,\n type CheckoutInitResponse,\n type CheckoutInitTokenTransferAddressParams,\n type CheckoutInitTokenTransferResponse,\n type CheckoutQuoteParams,\n type CheckoutQuoteResponse,\n CheckoutState,\n type CheckoutTransferSponsorshipApiParams,\n type CheckoutTransferSponsorshipParams,\n type CheckoutTransferSponsorshipResponse,\n type RiskAssessmentParams,\n type RiskAssessmentResponse,\n} from './types'\n\n/**\n * Gets a checkout quote (estimation).\n * @param fromChainId The ID of the chain where funds will be provided from.\n * @param fromTokenAddress The asset to fund the checkout. This must be either a chain native token or an ERC-20, on the fromChainId.\n * @param fromTokenDecimals The number of decimals for the fromTokenAddress.\n * @param toChainId The ID of the chain where the checkout operation is to be performed.\n * @param toTokenAddress The wanted asset for the checkout operation. This must be either a chain native token or an ERC-20, on the target chain.\n * @param toTokenAmount The amount of wanted asset for the checkout operation in base units.\n * @param toTokenDecimals The number of decimals for the toTokenAddress.\n * @param expirationTimestampMs The amount of time (duration) from now before the checkout operation expires.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @return {Promise<CheckoutCoreQuoteResponse>} The formatted quote object\n */\nexport async function getCheckoutQuote({\n fromChainId,\n fromTokenAddress,\n fromTokenDecimals,\n toChainId,\n toTokenAddress,\n toTokenDecimals,\n toTokenAmount,\n expirationTimestampMs,\n sponsorInitialTransferGasLimit,\n recipientAddr,\n userId,\n ...options\n}: CheckoutQuoteParams): Promise<CheckoutQuoteResponse> {\n try {\n const toMultipler = 10 ** toTokenDecimals\n const toAmountBaseUnitBI = BigInt(Math.floor(toTokenAmount * toMultipler))\n const queryParams: CheckoutApiQuoteParams = {\n userId,\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n toAmountBaseUnit: toAmountBaseUnitBI.toString(),\n // Only pass in recipientAddr if specified\n ...(recipientAddr ? { recipientAddr } : {}),\n // Rounding nearest tenth second (instead of seconds) to better support backend quote caching feature\n // Reference: https://vintage-heaven-3cd.notion.site/API-Gateway-Caching-and-Pre-Warming-System-Draft-ee7909d9b85f43c793ce7bd2607bec02?pvs=4\n // Note: Rounding *down* instead of a regular round to safeguard against edge case of timing passing frontend range validation but failing backend range validation\n checkoutExpirationTimestampSeconds: roundToNearestBottomTenth(\n Math.round((Date.now() + expirationTimestampMs) / 1000),\n ).toString(),\n sponsorInitialTransferGasLimit,\n }\n\n const searchParams = new URLSearchParams(queryParams)\n const quoteRes = (await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/quote?${searchParams}`,\n ...options,\n })) as CheckoutApiQuoteResponse\n\n const fromMultipler = 10 ** fromTokenDecimals\n // Format the response for frontend usage\n return {\n quoteId: quoteRes.quoteId,\n fromTokenAddress: quoteRes.fromTokenAddress,\n estFeesUsd: quoteRes.estFeesUsd,\n estSubtotalUsd: quoteRes.estSubtotalUsd,\n estTotalUsd: quoteRes.estTotalUsd,\n estCheckoutTimeMs: quoteRes.estCheckoutTimeMs,\n estTotalFromAmountBaseUnit: quoteRes.estTotalFromAmountBaseUnit,\n estSubtotalFromAmountBaseUnit: quoteRes.estSubtotalFromAmountBaseUnit,\n estFeesFromAmountBaseUnit: quoteRes.estFeesFromAmountBaseUnit,\n estMarketMakerGasUsd: quoteRes.estMarketMakerGasUsd,\n lpFeePercentage: quoteRes.lpFeePercentage,\n lpFeeUsd: quoteRes.lpFeeUsd,\n // Added fields\n estFeesFromAmount: new Big(quoteRes.estFeesFromAmountBaseUnit)\n .div(fromMultipler)\n .toString(),\n estSubtotalFromAmount: new Big(quoteRes.estSubtotalFromAmountBaseUnit)\n .div(fromMultipler)\n .toString(),\n estTotalFromAmount: new Big(quoteRes.estTotalFromAmountBaseUnit)\n .div(fromMultipler)\n .toString(),\n }\n } catch (err: unknown) {\n throw new Error(\n `An error occured trying to generate a checkout quote: ${\n err instanceof Error ? err.message : JSON.stringify(err)\n }`,\n )\n }\n}\n\n/**\n * Initializes a checkout\n * @param userOp The checkout UserOp, signed.\n * @param quoteId The quoteId specific to the checkout.\n * @param apiKey A valid fun api key.\n * @return {Address} The generated deposit address\n */\nexport async function initializeCheckout({\n userOp,\n quoteId,\n sourceOfFund,\n clientMetadata,\n ...options\n}: CheckoutInitParams): Promise<CheckoutInitResponse> {\n const body = {\n ...(userOp ? { userOp } : {}),\n quoteId,\n sourceOfFund,\n salt: generateRandomCheckoutSalt(),\n clientMetadata,\n } as CheckoutApiInitParams\n const res: { depositAddr?: Address } = await sendPostRequest({\n uri: `${API_BASE_URL}/checkout`,\n body,\n ...options,\n })\n if (!res?.depositAddr) {\n throw new ResourceNotFoundError(\n ErrorCode.CheckoutInitDepositAddrNotFound,\n 'Unable to initialize checkout',\n 'Unable to initialize checkout',\n body,\n '',\n 'https://docs.fun.xyz',\n )\n }\n return { depositAddr: res.depositAddr }\n}\n\nexport async function deactivateCheckout({\n depositAddress,\n ...options\n}: CheckoutDeactivateParams) {\n try {\n await sendPostRequest({\n uri: `${API_BASE_URL}/checkout/update/${depositAddress}`,\n body: {\n // Fixed state to cancel the checkout\n state: CheckoutState.CANCELLED,\n },\n ...options,\n })\n return true\n } catch (_err) {\n throw new Error('Unable to deactivate checkout')\n }\n}\n\n/**\n * Gets a checkout given a depositAddress\n * @param depositAddress A unique deposit address associated with a backend checkout item.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns The checkout object if exists. Otherwise, null.\n */\nexport async function getCheckoutByDepositAddress({\n depositAddress,\n ...options\n}: BaseApiRequest & {\n depositAddress: Address\n}): Promise<CheckoutHistoryItem | null> {\n try {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/${depositAddress}`,\n ...options,\n })\n } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return null\n }\n throw err\n }\n}\n\n/**\n * Gets all checkouts associated with a funWallet\n * @param funWalletAddress A funWallet address.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns A list of checkout objects if exists. Otherwise, an empty array.\n */\nexport async function getCheckoutsByFunWalletAddress({\n funWalletAddress,\n ...options\n}: BaseApiRequest & { funWalletAddress: Address }): Promise<\n CheckoutHistoryItem[]\n> {\n const res: CheckoutHistoryItem[] = await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/fun-wallet/${funWalletAddress}`,\n ...options,\n })\n return res || []\n}\n\n/**\n * Gets all checkouts associated with a recipient address\n * @param recipientAddress A wallet address.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns A list of checkout objects if exists. Otherwise, an empty array.\n */\nexport async function getCheckoutsByRecipientAddress({\n recipientAddress,\n ...options\n}: BaseApiRequest & { recipientAddress: Address }): Promise<\n CheckoutHistoryItem[]\n> {\n const res = await sendGetRequest<CheckoutHistoryItem[] | null>({\n uri: `${API_BASE_URL}/checkout/recipient/${recipientAddress}`,\n ...options,\n })\n return res || []\n}\n\n/**\n * Gets all checkouts associated with a funkit userId string\n * @param userId A userId string.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns A list of checkout objects if exists. Otherwise, an empty array.\n */\nexport async function getCheckoutsByUserId({\n userId,\n ...options\n}: BaseApiRequest & { userId: string }): Promise<CheckoutHistoryItem[]> {\n const res = await sendGetRequest<CheckoutHistoryItem[] | null>({\n uri: `${API_BASE_URL}/checkout/userId/${userId}`,\n ...options,\n })\n return res || []\n}\n\nexport async function getPaymasterDataForCheckoutSponsoredTransfer({\n depositAddress,\n transferUserOp,\n ...options\n}: CheckoutTransferSponsorshipParams): Promise<CheckoutTransferSponsorshipResponse> {\n const body = {\n depositAddress,\n userOp: transferUserOp,\n } as CheckoutTransferSponsorshipApiParams\n const res = await sendPostRequest({\n uri: `${API_BASE_URL}/checkout/sponsor-transfer`,\n body,\n ...options,\n })\n if (!res) {\n // TODO: Better error handling\n throw new Error('Unable to get sponsorship information')\n }\n return res as CheckoutTransferSponsorshipResponse\n}\n\nexport async function getRiskAssessmentForAddress({\n address,\n ...options\n}: RiskAssessmentParams) {\n const response = (await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/risk-assessment?address=${address}`,\n ...options,\n })) as RiskAssessmentResponse\n\n return response\n}\n\nexport async function initializeCheckoutTokenTransferAddress({\n apiKey,\n logger,\n signal,\n ...body\n}: CheckoutInitTokenTransferAddressParams): Promise<CheckoutInitTokenTransferResponse> {\n const res = await sendPostRequest<CheckoutInitTokenTransferResponse | null>({\n uri: `${API_BASE_URL}/eoa`,\n body,\n apiKey,\n logger,\n signal,\n })\n if (!res?.depositAddr) {\n throw new ResourceNotFoundError(\n ErrorCode.CheckoutInitDepositAddrNotFound,\n 'Unable to initialize checkout token transfer address',\n 'Unable to initialize checkout token transfer address',\n body,\n '',\n 'https://docs.fun.xyz',\n )\n }\n return {\n depositAddr: res.depositAddr,\n solanaAddr: res.solanaAddr,\n }\n}\n", "import type { Abi, Address, Hex } from 'viem'\n\nimport type { BaseApiRequest } from '../../consts'\nimport type { UserOperation } from '../fw-operation'\n\n// The params required for the actual /checkout/quote api\nexport type CheckoutApiQuoteParams = {\n fromChainId: string\n fromTokenAddress: Address\n toChainId: string\n toTokenAddress: Address\n toAmountBaseUnit: string\n checkoutExpirationTimestampSeconds: string\n sponsorInitialTransferGasLimit: string\n userId: string\n recipientAddr?: Address\n}\n\nexport type CheckoutQuoteParams = BaseApiRequest &\n Omit<\n CheckoutApiQuoteParams,\n 'toAmountBaseUnit' | 'checkoutExpirationTimestampSeconds'\n > & {\n fromTokenDecimals: number\n toTokenDecimals: number\n toTokenAmount: number\n expirationTimestampMs: number\n }\n\n// The response of the actual /checkout/quote api\nexport type CheckoutApiQuoteResponse = {\n quoteId: string\n estTotalFromAmountBaseUnit: string\n estSubtotalFromAmountBaseUnit: string\n estFeesFromAmountBaseUnit: string\n fromTokenAddress: Address\n estFeesUsd: number\n estSubtotalUsd: number\n estTotalUsd: number\n estCheckoutTimeMs: number\n estMarketMakerGasUsd: number\n lpFeePercentage: number\n lpFeeUsd: number\n}\n\n// The formatted response quote interface from the core sdk\nexport type CheckoutQuoteResponse = CheckoutApiQuoteResponse & {\n estTotalFromAmount: string\n estSubtotalFromAmount: string\n estFeesFromAmount: string\n}\n\n/**===============*\n * CHECKOUT INIT *\n *================*/\n\nexport type CheckoutApiInitParams = {\n userOp?: UserOperation\n quoteId: string\n sourceOfFund: string\n salt: Hex\n // TODO: Proper typing wrt _generateClientMetadata() logic\n clientMetadata: object\n}\n\nexport type CheckoutInitParams = BaseApiRequest &\n Omit<CheckoutApiInitParams, 'salt'>\n\nexport type CheckoutInitResponse = {\n depositAddr: Address\n}\n\nexport type CheckoutInitTokenTransferResponse = CheckoutInitResponse & {\n solanaAddr?: SolanaAddress\n}\n\n/**=====================*\n * CHECKOUT DEACTIVATE *\n *======================*/\n\nexport type CheckoutDeactivateParams = BaseApiRequest & {\n depositAddress: Address\n}\n\n// Reference from api server: https://github.com/fun-xyz/fun-api-server/blob/main/src/tables/FunWalletCheckout.ts#L11C1-L21C2\nexport enum CheckoutState {\n // In-progress States\n FROM_UNFUNDED = 'FROM_UNFUNDED',\n FROM_FUNDED = 'FROM_FUNDED',\n FROM_POOLED = 'FROM_POOLED',\n TO_UNFUNDED = 'TO_UNFUNDED',\n TO_FUNDED = 'TO_FUNDED',\n TO_POOLED = 'TO_POOLED',\n TO_READY = 'TO_READY',\n PENDING_RECEIVAL = 'PENDING_RECEIVAL',\n // Terminal States\n COMPLETED = 'COMPLETED',\n CHECKOUT_ERROR = 'CHECKOUT_ERROR',\n EXPIRED = 'EXPIRED',\n CANCELLED = 'CANCELLED',\n}\n\nexport enum CheckoutRefundState {\n INITIATED = 'INITIATED',\n ERROR = 'ERROR',\n REFUNDED = 'REFUNDED',\n PROCEEDED = 'PROCEEDED',\n WAITING_FOR_FULFILLMENT = 'WAITING_FOR_FULFILLMENT',\n FULFILLED = 'FULFILLED',\n}\n\nexport type CheckoutHistoryItem = {\n createdTimeMs: number\n depositAddr: Address\n currentDepositAddr: Address\n recipientAddr: Address\n expirationTimestampSeconds: number\n fromAmountBaseUnit: string\n fromChainId: string\n fromTokenAddress: Address\n funWalletAddr: Address\n lastUpdatedTimeMs: number\n salt: Hex\n state: CheckoutState\n toAmountBaseUnit: string\n toChainId: string\n toTokenAddress: Address\n userOp?: UserOperation\n version: number\n sourceOfFund: string\n clientMetadata: ApiCheckoutClientMetadata\n refundState?: CheckoutRefundState\n // Note: Optional, because BE does not retroactively update existing CheckoutHistoryItem entries\n stateTimestampMs?: Partial<Record<CheckoutState, number>>\n}\n\n/**===============================*\n * CHECKOUT TRANSFER SPONSORSHIP *\n *================================*/\n\nexport type CheckoutTransferSponsorshipParams = BaseApiRequest & {\n transferUserOp: UserOperation\n depositAddress: Address\n}\n\nexport type CheckoutTransferSponsorshipApiParams = {\n userOp: UserOperation\n depositAddress: Address\n}\n\nexport type CheckoutTransferSponsorshipResponse = {\n signerAddress: Address\n signature: Hex\n deadline: number\n paymasterAndData: Hex\n}\n\n/**===============================*\n * RISK ASSESSMENT *\n *================================*/\n\nexport type RiskAssessmentParams = BaseApiRequest & {\n address: FunAddress\n}\n\ntype AddressIdentification = {\n name: string\n address: FunAddress\n category: string\n description: string\n url: string | null\n createdAt: number\n}\n\ntype Cluster = {\n name: string\n category: string\n}\n\nexport type RiskValues = 'Severe' | 'High' | 'Medium' | 'Low'\n\ntype ExposureType = 'direct' | 'indirect'\n\ntype Exposure = {\n category: string\n value: number\n exposureType: ExposureType\n direction: string\n}\n\ntype RiskTrigger = {\n risk: string\n minThreshold: number\n maxThreshold: number\n exposureType: string\n direction: string\n}\n\ntype Trigger = {\n category: string\n percentage: number\n message: string\n ruleTriggered?: RiskTrigger\n}\n\ntype PoolMetadata = {\n fees?: number\n tokens: string[]\n}\n\n// fun.xyz uses `dydx${address}` for dydx addresses as VIP addr :/\nexport type DydxAddress = `dydx${string}`\nexport type SolanaAddress = string // TODO: Proper typing from a package\nexport type FunAddress = Address | DydxAddress | SolanaAddress\n\nexport type RiskAssessmentResponse = {\n address: FunAddress\n risk: RiskValues\n riskReason: string | null\n cluster?: Cluster\n addressType: string\n addressIdentifications: AddressIdentification[]\n exposures: Exposure[]\n triggers: Trigger[]\n status: string\n poolMetadata: PoolMetadata\n}\n\nexport type CheckoutInitTokenTransferAddressParams = BaseApiRequest & {\n toChainId: string\n toTokenAddress: Address\n userId: string\n clientMetadata: NonNullable<object>\n sourceOfFund?: string\n recipientAddr: string\n}\n\nexport interface ApiBaseCheckoutFees {\n paymentMethod: string\n marketMakerFeeUsd: number\n liquidityProviderFeeUsd: number\n totalFeesUsd: number\n totalFeesTokenWithoutGas: number\n}\n\nexport interface ApiWalletCheckoutFees extends ApiBaseCheckoutFees {\n paymentMethod: 'balance'\n eoaWalletFeeToken: number\n nativeCurrencySymbol: string\n eoaWalletFeeUsd: number\n}\n\nexport interface ApiCardCheckoutFees extends ApiBaseCheckoutFees {\n paymentMethod: 'card'\n cardProcessingFeeUsd: number\n moonpayCostUsd: number\n}\n\nexport interface ApiBrokerageCheckoutFees extends ApiBaseCheckoutFees {\n paymentMethod: 'brokerage'\n exchangeFeeUsd: number\n meshCostUsd: number\n}\n\nexport type ApiCheckoutFees =\n | ApiWalletCheckoutFees\n | ApiCardCheckoutFees\n | ApiBrokerageCheckoutFees\n\nexport type ApiFunkitCheckoutQuoteResult = {\n baseQuote: CheckoutQuoteResponse\n finalTimeEstimationMs: number\n finalPaymentTokenAmount: string\n finalPaymentFeeUsd: string\n finalTotalUsd: string\n finalFeesBreakdown: ApiCheckoutFees\n}\n\nexport interface ApiFunkitCheckoutConfig {\n /** ****************************\n * Api-related configurations *\n ******************************/\n\n /** The ID of the chain where the checkout operation is to be performed. **/\n targetChain: string\n /** The wanted asset for the checkout operation. This can be either a chain native token (by specifying NATIVE_TOKEN) or an ERC-20 token (by specifying actual token address) on the target chain. **/\n targetAsset: Address\n /** The amount of wanted asset for the checkout operation (defaults to $100 equivalent). **/\n targetAssetAmount?: number\n /** The ticker information of the wanted asset for the checkout operation. e.g. USDC. **/\n targetAssetTicker: string\n /** Timestamp (in milliseconds) after which the checkout should not be performed, and the funds will become rescuable. Min: 300000 (5 mins), Max: 3600000 (1 hour). **/\n expirationTimestampMs: number\n /** Custom recipient address of the checkout. If specified, a different checkout flow will be executed. It is not recommended to set this unless the Fun.xyz team advises it. **/\n customRecipient?: Address | string\n /** List of contract action params **/\n generateActionsParams?: string\n}\n\nexport interface ApiSelectedPaymentMethodInfo {\n paymentMethod: string\n title: string\n description: string\n meta?: object\n}\n\nexport interface ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\n\nexport interface ApiCheckoutClientMetadata {\n /** Unique identifier for frontend use only. */\n id: string\n /** Time of creation of the active checkout item. For frontend use only. **/\n startTimestampMs: number\n /** The final dollar value of the checkout. Derived from latestQuote. **/\n finalDollarValue: null | number\n latestQuote: ApiFunkitCheckoutQuoteResult | null\n depositAddress: null | Address\n initSettings: {\n config: ApiFunkitCheckoutConfig\n }\n selectedPaymentMethodInfo: ApiSelectedPaymentMethodInfo | null\n selectedSourceAssetInfo: {\n address: Address | null\n symbol: string | null\n chainId: string\n iconSrc: string | null\n }\n /** The evaluated result of initSettings.config.generateActionsParams at the point of checkout */\n evaluatedActionsParams?: ApiFunkitCheckoutActionParams[]\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n DirectExecution,\n GetDirectExecutionByTxHashRequest,\n PostDirectExecutionRequest,\n} from './types'\n\nexport async function getDirectExecutionByTxHash({\n txHash,\n apiKey,\n}: GetDirectExecutionByTxHashRequest): Promise<DirectExecution> {\n const res = (await sendGetRequest({\n uri: `${API_BASE_URL}/direct-execution/${txHash}`,\n apiKey,\n })) as DirectExecution\n return res\n}\n\nexport async function createDirectExecution({\n txHash,\n userId,\n recipientAddr,\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmountBaseUnit,\n toAmountBaseUnit,\n estTotalUsd,\n sourceOfFund,\n clientMetadata,\n apiKey,\n}: PostDirectExecutionRequest): Promise<{ txHash: DirectExecution['txHash'] }> {\n const body = {\n txHash,\n sourceOfFund,\n userId,\n recipientAddr,\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmountBaseUnit,\n toAmountBaseUnit,\n estTotalUsd,\n clientMetadata,\n }\n const res = (await sendPostRequest({\n uri: `${API_BASE_URL}/direct-execution`,\n body,\n apiKey,\n })) as { txHash: DirectExecution['txHash'] }\n\n return res\n}\n", "import { FUN_FAUCET_URL } from '../../consts'\nimport { sendGetRequest } from '../../utils'\nimport type { GetAssetFromFaucetRequest } from './types'\n\nexport async function getAssetFromFaucet({\n token,\n chain,\n walletAddress,\n ...options\n}: GetAssetFromFaucetRequest) {\n return await sendGetRequest({\n uri: `${FUN_FAUCET_URL}/get-faucet?token=${token}&testnet=${chain}&addr=${walletAddress}`,\n ...options,\n })\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n CheckWalletAccessInitializationRequest,\n InitializeWalletAccessRequest,\n} from './types'\n\nexport async function initializeWalletAccess({\n walletAddr,\n creatorAddr,\n ...options\n}: InitializeWalletAccessRequest): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/access/wallet`,\n body: { walletAddr, creatorAddr },\n ...options,\n })\n}\n\nexport async function checkWalletAccessInitialization({\n walletAddr,\n ...options\n}: CheckWalletAccessInitializationRequest): Promise<boolean> {\n return (\n await sendGetRequest<{ initialized: boolean }>({\n uri: `${API_BASE_URL}/access/wallet/${walletAddr}`,\n ...options,\n })\n ).initialized\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendPostRequest } from '../../utils'\nimport type { GetGroupsRequest, GroupMetadata } from './types'\n\nexport async function getGroups({\n groupIds,\n chainId,\n ...options\n}: GetGroupsRequest): Promise<GroupMetadata[]> {\n return (\n await sendPostRequest<{ groups: GroupMetadata[] }>({\n uri: `${API_BASE_URL}/group/get-groups`,\n body: { groupIds, chainId },\n ...options,\n })\n ).groups\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest } from '../../utils'\nimport type {\n GetChainFromIdRequest,\n GetChainFromNameRequest,\n ServerChainInfo,\n} from './types'\n\nexport async function getChainFromId({\n chainId,\n ...options\n}: GetChainFromIdRequest): Promise<ServerChainInfo> {\n const res = await sendGetRequest<ServerChainInfo>({\n uri: `${API_BASE_URL}/chain-info/${chainId}`,\n ...options,\n })\n if (!res) {\n throw new Error(JSON.stringify(res))\n }\n return res\n}\n\nexport async function getChainFromName({\n name,\n ...options\n}: GetChainFromNameRequest): Promise<ServerChainInfo> {\n const res = await sendGetRequest<ServerChainInfo>({\n uri: `${API_BASE_URL}/chain-info?name=${name}`,\n ...options,\n })\n if (!res) {\n throw new Error(JSON.stringify(res))\n }\n return res\n}\n", "import type { Address } from 'viem'\nimport { API_BASE_URL } from '../../consts'\nimport { sendDeleteRequest, sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n CreateOpRequest,\n DeleteOpRequest,\n EstimateOpInput,\n EstimatedGas,\n ExecuteOpInput,\n ExecutionReceipt,\n GetFullReceiptRequest,\n GetOpsOfWalletRequest,\n GetOpsRequest,\n GetUserOpGasPriceRequest,\n OpRequest,\n OperationData,\n ScheduleOpInput,\n SignOpRequest,\n UserOperationGasPrice,\n} from './types'\n\nexport async function createOp({\n op,\n ...options\n}: CreateOpRequest): Promise<string> {\n return (\n await sendPostRequest<{ opId: string }>({\n uri: `${API_BASE_URL}/operation`,\n body: { ...op },\n ...options,\n })\n ).opId\n}\n\ninterface OpsOfWalletResponse {\n operations: OperationData[]\n}\n\nexport async function getOpsOfWallet({\n walletAddr,\n chainId,\n status,\n ...options\n}: GetOpsOfWalletRequest): Promise<OperationData[]> {\n const endpoint = status\n ? `${API_BASE_URL}/operation/wallet/${walletAddr}/chain/${chainId}?status=${status}`\n : `${API_BASE_URL}/operation/wallet/${walletAddr}/chain/${chainId}`\n return (\n await sendGetRequest<OpsOfWalletResponse>({ uri: endpoint, ...options })\n ).operations\n}\n\nexport async function getOps({\n opIds,\n chainId,\n ...options\n}: GetOpsRequest): Promise<OperationData[]> {\n return (\n await sendPostRequest<OpsOfWalletResponse>({\n uri: `${API_BASE_URL}/operation/get-operations`,\n body: {\n opIds,\n chainId,\n },\n ...options,\n })\n ).operations\n}\n\nexport async function deleteOp({\n opId,\n chainId,\n ...options\n}: DeleteOpRequest): Promise<void> {\n await sendDeleteRequest({\n uri: `${API_BASE_URL}/operation/${opId}/chain/${chainId}`,\n ...options,\n })\n}\n\nexport async function signOp({\n opId,\n chainId,\n signature,\n signedBy,\n threshold,\n ...options\n}: SignOpRequest): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/operation/sign`,\n body: {\n opId,\n chainId,\n signature,\n signedBy,\n threshold,\n },\n ...options,\n })\n}\n\nexport async function executeOp({\n input,\n ...options\n}: OpRequest<ExecuteOpInput>): Promise<ExecutionReceipt> {\n return await sendPostRequest({\n uri: `${API_BASE_URL}/operation/execute`,\n body: input,\n ...options,\n })\n}\n\nexport async function estimateOp({\n input,\n ...options\n}: OpRequest<EstimateOpInput>): Promise<EstimatedGas> {\n return await sendPostRequest({\n uri: `${API_BASE_URL}/operation/estimate`,\n body: input,\n ...options,\n })\n}\n\nexport async function scheduleOp({\n input,\n ...options\n}: OpRequest<ScheduleOpInput>): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/operation/schedule`,\n body: input,\n ...options,\n })\n}\n\nexport const getFullReceipt = async ({\n opId,\n chainId,\n userOpHash,\n ...options\n}: GetFullReceiptRequest): Promise<ExecutionReceipt> => {\n const retries = 20\n let result: { status: string; receipt?: ExecutionReceipt } = {\n status: 'pending',\n }\n for (let i = 0; i < retries; i++) {\n try {\n result = await sendGetRequest({\n uri: `${API_BASE_URL}/operation/${opId}/chain/${chainId}/receipt?userOpHash=${userOpHash}`,\n ...options,\n })\n if (result.status === 'included') {\n break\n }\n } catch (_err) {\n /* empty */\n }\n\n await new Promise((resolve) => setTimeout(resolve, 2500))\n }\n if (!result.receipt) {\n result.receipt = {\n // TODO: this is obviously wrong but it was what we had before\n txId: 'Failed to find.' as Address,\n gasUsed: 'Failed to find.',\n opFeeUSD: 'Failed to find.',\n opFee: 'Failed to find.',\n userOpHash: 'Failed to find.',\n }\n }\n return {\n ...result.receipt,\n }\n}\n\nexport const getUserOpGasPrice = async ({\n chainId,\n ...options\n}: GetUserOpGasPriceRequest): Promise<UserOperationGasPrice> => {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/operation/chain/${chainId}/gas-price`,\n ...options,\n })\n}\n", "import type { Address, Hex } from 'viem'\n\nimport type { BaseApiRequest } from '../../consts'\n\nexport enum OperationStatus {\n ALL = '',\n PENDING_APPROVED = 'PENDING_APPROVED',\n APPROVED = 'APPROVED',\n PENDING = 'PENDING',\n OP_SUCCEED = 'OP_SUCCEED',\n OP_REVERTED = 'OP_REVERTED',\n SCHEDULED = 'SCHEDULED',\n}\n\nexport type OperationMetadata = {\n opId?: Hex\n chainId: string\n opType: OperationType\n authType: AuthType\n groupId?: Hex\n message?: string\n walletAddr: Address\n status?: OperationStatus\n proposer: string // do not use address in case we later use non-address data as the proposer\n proposedTime?: number\n executedBy?: string\n executedTime?: number\n relatedOpIds?: Hex[]\n signatures?: Signature[]\n txid?: string\n gasUsed?: string\n opFeeUSD?: string\n opFee?: string\n executedBlockNumber?: number\n executedBlockTimeStamp?: number\n}\n\nexport interface OperationData extends OperationMetadata {\n userOp: UserOperation\n}\n\nexport enum AuthType {\n ECDSA = 0,\n MULTI_SIG = 1,\n}\n\nexport type Signature = {\n userId: Hex\n signature: Hex\n signedTime: number\n}\n\nexport enum OperationType {\n SINGLE_OPERATION = 'SINGLE_OPERATION',\n GROUP_OPERATION = 'GROUP_OPERATION',\n REJECTION = 'REJECTION',\n}\n\nexport type GroupInfo = {\n threshold: number\n memberIds: Hex[]\n}\n\nexport type UserOperation = {\n sender: string\n nonce: bigint\n initCode?: string\n callData: string\n callGasLimit: bigint\n verificationGasLimit: bigint\n preVerificationGas?: bigint\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n paymasterAndData?: string\n signature?: string\n}\n\nexport interface ExecutionReceipt {\n userOpHash: string\n txId?: Hex\n gasUsed?: string\n opFeeUSD?: string\n opFee?: string\n}\n\nexport type EstimatedGas = {\n preVerificationGas: bigint\n callGasLimit: bigint\n verificationGasLimit: bigint\n}\n\nexport interface CreateOpRequest extends BaseApiRequest {\n op: OperationData\n}\n\nexport interface GetOpsOfWalletRequest extends BaseApiRequest {\n walletAddr: Address\n chainId: string\n status?: OperationStatus\n}\n\nexport interface GetOpsRequest extends BaseApiRequest {\n opIds: Hex[]\n chainId: string\n}\n\nexport interface DeleteOpRequest extends BaseApiRequest {\n opId: Hex\n chainId: string\n}\n\nexport interface SignOpRequest extends BaseApiRequest {\n opId: Hex\n chainId: string\n signature: Hex\n signedBy: Address\n threshold?: number\n}\n\nexport type OpRequest<T> = BaseApiRequest & {\n input: T\n}\n\nexport type ExecuteOpInput = {\n opId: Hex\n chainId: string\n executedBy: string\n entryPointAddress: Address\n signature: Hex\n userOp?: UserOperation\n groupInfo?: GroupInfo\n}\n\nexport type EstimateOpInput = {\n opId?: Hex\n chainId: string\n entryPointAddress?: Address\n signature?: Hex\n userOp?: UserOperation\n}\n\nexport type ScheduleOpInput = {\n opId: Hex\n chainId: string\n scheduledBy: string\n entryPointAddress: Address\n signature: Hex\n userOp?: UserOperation\n groupInfo?: GroupInfo\n}\n\nexport interface GetFullReceiptRequest extends BaseApiRequest {\n opId: string\n chainId: string\n userOpHash: string\n}\n\nexport interface GetUserOpGasPriceRequest extends BaseApiRequest {\n chainId: string\n}\n\nexport type UserOperationGasPrice = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendPostRequest } from '../../utils'\nimport type { AddPaymasterTransactionRequest } from './types'\n\nexport async function addTransaction({\n chainId,\n timestamp,\n txid,\n transaction,\n paymasterType,\n sponsorAddress,\n ...options\n}: AddPaymasterTransactionRequest): Promise<any> {\n try {\n return await sendPostRequest({\n uri: `${API_BASE_URL}/dashboard/paymasters/add-transaction`,\n body: {\n chain: chainId,\n sponsorAddress,\n type: paymasterType,\n timestamp,\n transaction,\n txid,\n },\n ...options,\n })\n } catch (_err) {\n /* empty */\n }\n}\n", "import type { BaseApiRequest } from '../../consts'\nimport type { ExecutionReceipt } from '../fw-operation'\n\nexport interface PaymasterTransaction {\n action: string\n amount: number\n from: string\n to: string\n token: string\n txid?: string\n}\n\nexport interface AddPaymasterTransactionRequest extends BaseApiRequest {\n chainId: string\n timestamp: number\n txid: ExecutionReceipt['txId'] | string\n transaction: PaymasterTransaction\n paymasterType: PaymasterType\n sponsorAddress: string\n}\n\nexport enum PaymasterType {\n BaseSponsor = 'base',\n GaslessSponsor = 'gasless',\n TokenSponsor = 'token',\n CheckoutSponsor = 'checkout',\n}\n", "import { ResourceNotFoundError } from '@funkit/utils'\nimport { type Hex, InvalidParameterError } from 'viem'\nimport { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n AddUserToWalletRequest,\n CreateUserRequest,\n GetUserUniqueIdRequest,\n GetUserWalletIdentitiesRequest,\n GetUserWalletsByAddrRequest,\n Wallet,\n} from './types'\n\nexport async function createUser({\n authId,\n addr,\n method,\n userUniqueId,\n ...options\n}: CreateUserRequest): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/user`,\n body: {\n authId,\n addr,\n method,\n userUniqueId,\n },\n ...options,\n })\n}\n\nexport async function getUserUniqueId({\n authId,\n ...options\n}: GetUserUniqueIdRequest): Promise<string> {\n try {\n return (\n await sendGetRequest<{ userUniqueId: string }>({\n uri: `${API_BASE_URL}/user/auth/${authId}/unique-id`,\n ...options,\n })\n ).userUniqueId\n } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return ''\n }\n throw err\n }\n}\n\nexport async function getUserWalletsByAddr({\n addr,\n chainId,\n ...options\n}: GetUserWalletsByAddrRequest): Promise<Wallet[]> {\n const endpoint = chainId\n ? `${API_BASE_URL}/user/addr/${addr}/wallets?chainId=${chainId}`\n : `${API_BASE_URL}/user/addr/${addr}/wallets`\n return (\n await sendGetRequest<{ wallets: Wallet[] }>({ uri: endpoint, ...options })\n ).wallets\n}\n\nexport async function addUserToWallet({\n authId,\n chainId,\n walletAddr,\n userIds,\n walletUniqueId,\n ...options\n}: AddUserToWalletRequest): Promise<void> {\n try {\n await sendPostRequest({\n uri: `${API_BASE_URL}/user/auth/${authId}/chain/${chainId}/wallet`,\n body: { walletAddr, userIds, walletUniqueId },\n ...options,\n })\n } catch (err) {\n if (err instanceof InvalidParameterError) {\n // TODO: What about any other cause of InvalidParameterError???\n // swallow the error if the wallet already exists.\n return\n }\n\n throw err\n }\n}\n\n/**\n * @returns userIds of the specified Wallet.\n */\nexport async function getUserWalletIdentities({\n authId,\n chainId,\n walletAddr,\n ...options\n}: GetUserWalletIdentitiesRequest): Promise<Hex[]> {\n return (\n (\n await sendGetRequest<{ ids: Hex[] }>({\n uri: `${API_BASE_URL}/user/auth/${authId}/chain/${chainId}/wallet/${walletAddr}/identities`,\n ...options,\n })\n ).ids ?? []\n )\n}\n", "import {\n API_BASE_URL,\n type BaseApiRequest,\n MESH_API_BASE_URL,\n} from '../../consts'\nimport { sendDeleteRequest, sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n GetCryptocurrencyHoldingsRequest,\n GetCryptocurrencyHoldingsRequestProxy,\n GetCryptocurrencyHoldingsResponse,\n GetLinkTokenRequest,\n GetLinkTokenResponse,\n GetTransferIntegrationsRequest,\n GetTransferIntegrationsResponse,\n MeshExecuteTransferRequest,\n MeshExecuteTransferRequestProxy,\n MeshExecuteTransferResponse,\n PreviewTransferRequest,\n PreviewTransferRequestProxy,\n PreviewTransferResponse,\n} from './types'\n\n/**\n * @param authToken The authentication token to send the asset from.\n * @param type The type of the integration to send the asset from.\n * @return https://docs.meshconnect.com/api-reference/portfolio/get-holdings\n */\nexport async function meshGetCryptocurrencyHoldings({\n authToken,\n type,\n ...options\n}: GetCryptocurrencyHoldingsRequest): Promise<GetCryptocurrencyHoldingsResponse> {\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/holdings/get`,\n body: { authToken, type },\n ...options,\n })\n}\n\nexport async function meshGetCryptocurrencyHoldingsProxy({\n brokerType,\n deviceId,\n ...options\n}: GetCryptocurrencyHoldingsRequestProxy): Promise<GetCryptocurrencyHoldingsResponse> {\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/mesh/holdings/get`,\n body: { brokerType, deviceId },\n ...options,\n })\n}\n\n/**\n * @return https://docs.meshconnect.com/api-reference/managed-transfers/get-integrations\n */\nexport async function meshGetTransferIntegrations(\n options: GetTransferIntegrationsRequest,\n): Promise<GetTransferIntegrationsResponse> {\n return sendGetRequest({\n uri: `${API_BASE_URL}/mesh/transfers/managed/integrations`,\n ...options,\n })\n}\n\n/**\n * @param userId A unique Id representing the end user. Typically this will be a user Id from the\nclient application. Personally identifiable information, such as an email address or phone number,\nshould not be used. 50 characters length maximum.\n * @param integrationId A unique identifier representing a specific integration obtained from the list of available integrations.\n * @param restrictMultipleAccounts The final screen of Link allows users to \u201Ccontinue\u201D back to your app or \u201CLink another account.\u201D\nIf this param is present then this button will be hidden.\n * @param transferOptions Encapsulates transaction-related parameters, including destination addresses and the amount to transfer in fiat currency.\n * @return https://docs.meshconnect.com/api-reference/managed-account-authentication/get-link-token-with-parameters\n */\nexport async function meshGetLinkToken({\n userId,\n integrationId,\n restrictMultipleAccounts,\n transferOptions,\n ...options\n}: GetLinkTokenRequest): Promise<GetLinkTokenResponse> {\n const body = {\n userId,\n ...(integrationId && { integrationId }),\n ...(restrictMultipleAccounts && { restrictMultipleAccounts }),\n ...(transferOptions && { transferOptions }),\n }\n\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/linktoken`,\n body,\n ...options,\n })\n}\n\n/**\n * @param fromAuthToken The authentication token to send the asset from.\n * @param fromType The type of the integration to send the asset from.\n * @param toAuthToken The authentication token of the target integration. Can be used alternatively to the address in the ToAddress field. If used, toType should also be provided.\n * @param toType The type of the target integration to send assets to. Used along with the toAuthToken alternatively to ToAddress.\n * @param networkId The network to send the asset over. This is generated by Mesh, it isn't a chainId or chain name.\n * @param symbol The symbol of the digital asset to send.\n * @param toAddress The target address to send the asset to.\n * @param amount The amount to send, in crypto.\n * @param amountInFiat The amount to send, in fiat currency. Can be used alternatively to Amount.\n * @param fiatCurrency Fiat currency that is to get corresponding converted fiat values of transfer and fee amounts. If not provided, defaults to USD.\n * @returns https://docs.meshconnect.com/api-reference/managed-transfers/preview-transfer\n */\nexport async function meshPreviewTransfer({\n fromAuthToken,\n fromType,\n toAuthToken,\n toType,\n networkId,\n symbol,\n toAddress,\n amount,\n amountInFiat,\n fiatCurrency,\n ...options\n}: PreviewTransferRequest): Promise<PreviewTransferResponse> {\n const body = {\n fromAuthToken,\n fromType,\n ...(toAuthToken && { toAuthToken }),\n ...(toType && { toType }),\n ...(networkId && { networkId }),\n ...(symbol && { symbol }),\n ...(toAddress && { toAddress }),\n ...(amount && { amount }),\n ...(amountInFiat && { amountInFiat }),\n ...(fiatCurrency && { fiatCurrency }),\n }\n\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/transfers/managed/preview`,\n body,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n}\n\nexport async function meshPreviewTransferProxy({\n apiKey,\n logger,\n signal,\n ...props\n}: PreviewTransferRequestProxy): Promise<PreviewTransferResponse> {\n const body = { ...props }\n\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/mesh/transfers/managed/preview`,\n body,\n apiKey,\n logger,\n retryOptions: { maxAttempts: 1 },\n signal,\n })\n}\n\n/**\n *\n * @param fromAuthToken The authentication token to send the asset from.\n * @param fromType The type of the integration to send the asset from.\n * @param previewId The preview ID of the transfer to execute.\n * @param mfaCode Multi-factor auth code that should be provided if the status of the transfer was MfaRequired.\n * @returns https://docs.meshconnect.com/api-reference/managed-transfers/execute-transfer\n */\nexport async function meshExecuteTransfer({\n fromAuthToken,\n fromType,\n previewId,\n mfaCode,\n ...options\n}: MeshExecuteTransferRequest): Promise<MeshExecuteTransferResponse> {\n const body = {\n fromAuthToken,\n fromType,\n previewId,\n ...(mfaCode && { mfaCode }),\n }\n\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/transfers/managed/execute`,\n body,\n ...options,\n })\n}\n\nexport async function meshExecuteTransferProxy({\n apiKey,\n logger,\n signal,\n ...props\n}: MeshExecuteTransferRequestProxy): Promise<MeshExecuteTransferResponse> {\n const body = { ...props }\n\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/mesh/transfers/managed/execute`,\n body,\n apiKey,\n logger,\n signal,\n })\n}\n\ninterface SaveTokensToMeshProxyRequestBody extends BaseApiRequest {\n deviceId?: string | null\n brokerType: string\n accessToken: string\n refreshToken: string | null\n accessTokenExpiresIn: number\n accessTokenExpiresAt: string\n refreshTokenExpiresAt?: string | null\n}\n\ninterface SaveTokensToMeshProxyResponseBody {\n id: number\n createdAt: Date\n updatedAt: Date\n deviceId: string\n integrationId: string\n accessToken: string\n accessTokenExpiresAt: Date | null\n accessTokenExpiresIn: number | null\n refreshToken: string | null\n refreshTokenExpiresAt: Date | null\n}\n\nexport async function saveTokensToMeshProxy({\n apiKey,\n logger,\n signal,\n ...props\n}: SaveTokensToMeshProxyRequestBody): Promise<SaveTokensToMeshProxyResponseBody> {\n const body = { ...props }\n\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/api/tokens`,\n body,\n apiKey,\n logger,\n signal,\n })\n}\n\ninterface RemoveTokensFromMeshProxyRequestBody extends BaseApiRequest {\n deviceId: string\n brokerType: string\n}\n\nexport async function removeTokensFromMeshProxy({\n deviceId,\n brokerType,\n ...options\n}: RemoveTokensFromMeshProxyRequestBody): Promise<void> {\n return await sendDeleteRequest({\n uri: `${MESH_API_BASE_URL}/api/tokens?deviceId=${deviceId}&brokerType=${brokerType}`,\n ...options,\n })\n}\n", "import type { BaseApiRequest } from '../../consts'\n\nexport interface GetCryptocurrencyHoldingsRequest extends BaseApiRequest {\n authToken: string\n type: string\n}\n\nexport interface GetCryptocurrencyHoldingsRequestProxy extends BaseApiRequest {\n deviceId: string\n brokerType: string\n}\n\nexport interface GetTransferIntegrationsRequest extends BaseApiRequest {}\n\nexport interface IntegrationNetworkInfo {\n chainId: string\n id: string\n logoUrl: string\n name: string\n nativeSymbol: string\n supportedTokens: string[]\n}\n\nexport interface TransferIntegration {\n networks: IntegrationNetworkInfo[]\n supportsIncomingTransfers: boolean\n supportsOutgoingTransfers: boolean\n type: string\n}\n\nexport interface GetTransferIntegrationsResponse {\n integrations: TransferIntegration[]\n}\n\nexport interface GetLinkTokenRequest extends BaseApiRequest {\n userId: string\n integrationId?: string | null\n restrictMultipleAccounts?: boolean\n transferOptions?: Record<string, unknown> | null\n}\n\nexport interface GetLinkTokenResponse {\n linkToken: string\n}\n\nexport interface PreviewTransferRequest extends BaseApiRequest {\n fromAuthToken: string\n fromType: string\n toAuthToken?: string | null\n toType?: string | null\n networkId?: string\n symbol?: string | null\n toAddress?: string | null\n amount?: string | null\n amountInFiat?: string | null\n fiatCurrency?: string | null\n}\n\nexport interface PreviewTransferRequestProxy\n extends Omit<PreviewTransferRequest, 'fromAuthToken' | 'fromType'> {\n deviceId: string\n brokerType: string\n}\n\nexport interface MeshExecuteTransferRequest extends BaseApiRequest {\n fromAuthToken: string\n fromType: string\n previewId: string\n mfaCode?: string | null\n}\n\nexport interface MeshExecuteTransferRequestProxy\n extends Omit<MeshExecuteTransferRequest, 'fromAuthToken' | 'fromType'> {\n deviceId: string\n brokerType: string\n}\n\n// Reference: https://docs.meshconnect.com/reference/post_api-v1-transfers-managed-execute\nexport enum MeshExecuteTransferStatus {\n succeeded = 'succeeded',\n failed = 'failed',\n mfaRequired = 'mfaRequired',\n emailConfirmationRequired = 'emailConfirmationRequired',\n emailConfirmationApprovalRequired = 'emailConfirmationApprovalRequired',\n deviceConfirmationRequired = 'deviceConfirmationRequired',\n mfaFailed = 'mfaFailed',\n addressWhitelistRequired = 'addressWhitelistRequired',\n secondMfaRequired = 'secondMfaRequired',\n}\n\nexport enum MeshExecuteTransferMfaType {\n unspecified = 'unspecified',\n phone = 'phone',\n email = 'email',\n totp = 'totp',\n face = 'face',\n tradingPin = 'tradingPin',\n mobile = 'mobile',\n}\n\nexport interface MeshExecuteTransferResponse {\n status: MeshExecuteTransferStatus\n mfaType?: MeshExecuteTransferMfaType\n verificationSteps?: MeshExecuteTransferMfaType[]\n errorMessage: string | null\n executeTransferResult: object | null\n}\n\nexport interface MeshCryptoCurrencyPosition {\n symbol: string\n amount: number\n}\n\n// the real response is flat, ie. the data we're really interested in are not in a `content` field but directly in the response root, that's why we're omitting the `content` field here and merging it with the root to be flat\nexport interface GetCryptocurrencyHoldingsResponse {\n cryptocurrencyPositions: MeshCryptoCurrencyPosition[]\n}\n\nexport interface MeshProxyUnauthorizedResponse {\n error: string\n}\n\n/*\nhttps://docs.meshconnect.com/api-reference/managed-transfers/preview-transfer\n */\nexport interface PreviewTransferResponse {\n /** The status of the operation. */\n status: 'succeeded' | 'failed' | 'requiresFunding'\n /** Error message, if the operation did not complete successfully. */\n errorMessage: string | null\n /** Result of the preview. */\n previewResult: PreviewTransferResult | null\n transferBalanceFundingAvailability: TransferBalanceFundingAvailability | null\n}\n\nexport interface PreviewTransferResult {\n previewId: string\n previewExpiresIn: number\n fromAddress: string | null\n toAddress: string | null\n addressTag: string | null\n symbol: string | null\n amount: number\n amountInFiat: number\n totalEstimatedAmount: number\n totalEstimatedAmountInFiat: number\n networkId: string\n networkName: string | null\n contractAddress: string | null\n institutionTransferFee: TransferFee | null\n estimatedNetworkGasFee: TransferFee | null\n decimalPlaces: number | null\n unitPrice: number\n clientTransactionId: string | null\n clientFee: number | null\n customClientFee: TransferFee | null\n processingFeeRetainMethod: ProcessingFeeRetainMethod | null\n transferType: TransferTypeEnum | null\n isCustomClientFeeProvided: boolean\n amountWithCustomClientFee: number\n isFeeIncluded: boolean\n amountToReceive: number\n amountToReceiveInFiat: number\n transferAmountToRequest: number\n}\n\nexport interface TransferFee {\n fee: number\n feeCurrency: string | null\n feeInFiat: number\n}\n\nexport interface ProcessingFeeRetainMethod {\n type: 'default' | 'smartDeposit'\n processingFeeAddress: string | null\n}\n\nexport type TransferTypeEnum = 'deposit' | 'payment' | 'onramp'\n\nexport interface TransferBalanceFundingAvailability {\n status:\n | 'disabled'\n | 'available'\n | 'requiresAmountLowering'\n | 'notApplicable'\n | 'unavailable'\n transferTotalAmount: number\n unitPrice: number\n gasFeeBuffer: TransferFee | null\n symbol: string | null\n transferTotalAmountInFiat: number\n}\n", "import { ErrorCode, InternalFailureError } from '@funkit/utils'\nimport { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n GetMoonpayBuyQuoteForCreditCardRequest,\n GetMoonpayBuyQuoteForCreditCardResponse,\n GetMoonpayUrlSignatureRequest,\n} from './types'\n\ninterface GetMoonpayUrlSignatureResponse {\n url: string\n}\n\nexport async function getMoonpayUrlSignature({\n url,\n isSandbox,\n ...options\n}: GetMoonpayUrlSignatureRequest): Promise<string> {\n const signature = await sendPostRequest<GetMoonpayUrlSignatureResponse>({\n uri: `${API_BASE_URL}/on-ramp/moonpay-signature/`,\n body: { url, isSandbox },\n ...options,\n })\n if (!signature || !signature?.url) {\n throw new InternalFailureError(\n ErrorCode.UnknownServerError,\n 'No onramp url found.',\n '',\n { url },\n 'This is an internal error, please contact support.',\n 'https://docs.fun.xyz',\n )\n }\n return signature.url\n}\n\nexport async function getMoonpayBuyQuoteForCreditCard({\n currencyCode,\n baseCurrencyCode,\n quoteCurrencyAmount,\n baseCurrencyAmount,\n extraFeePercentage,\n areFeesIncluded,\n ...options\n}: GetMoonpayBuyQuoteForCreditCardRequest): Promise<GetMoonpayBuyQuoteForCreditCardResponse> {\n const params = new URLSearchParams({\n currencyCode,\n baseCurrencyCode,\n quoteCurrencyAmount,\n paymentMethod: 'credit_debit_card',\n ...(baseCurrencyAmount == null\n ? {}\n : { baseCurrencyAmount: baseCurrencyAmount.toString() }),\n ...(extraFeePercentage == null\n ? {}\n : { extraFeePercentage: extraFeePercentage.toString() }),\n ...(areFeesIncluded == null\n ? {}\n : { areFeesIncluded: areFeesIncluded.toString() }),\n }).toString()\n\n return sendGetRequest({\n uri: `${API_BASE_URL}/on-ramp/moonpay-buy-quote?${params}`,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n}\n", "import { API_BASE_URL, type BaseApiRequest } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n CreateStripeBuySessionBody,\n CreateStripeBuySessionResponse,\n GetStripeBuyQuoteRequest,\n GetStripeBuyQuoteResponse,\n} from './types'\n\nexport async function getStripeBuyQuote({\n sourceCurrency,\n destinationAmount,\n destinationCurrency,\n destinationNetwork,\n isSandbox,\n ...options\n}: GetStripeBuyQuoteRequest): Promise<GetStripeBuyQuoteResponse> {\n const params = new URLSearchParams({\n isSandbox: isSandbox.toString(),\n sourceCurrency,\n destinationAmount: destinationAmount.toString(),\n // Only allow one currency in this SDK\n destinationCurrencies: destinationCurrency,\n // Only allow one network in this SDK\n destinationNetworks: destinationNetwork,\n }).toString()\n const buyQuoteResp = await sendGetRequest({\n uri: `${API_BASE_URL}/on-ramp/stripe-buy-quote?${params}`,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return buyQuoteResp as GetStripeBuyQuoteResponse\n}\n\nexport async function createStripeBuySession({\n sourceCurrency,\n destinationAmount,\n destinationCurrency,\n destinationNetwork,\n walletAddress,\n customerIpAddress,\n isSandbox,\n ...options\n}: CreateStripeBuySessionBody): Promise<CreateStripeBuySessionResponse> {\n const body = {\n isSandbox: isSandbox.toString(),\n sourceCurrency,\n destinationAmount: destinationAmount.toString(),\n // Only allow one currency in this SDK\n destinationCurrency,\n destinationCurrencies: [destinationCurrency],\n // Only allow one network in this SDK\n destinationNetwork,\n destinationNetworks: [destinationNetwork],\n // Only allow one wallet address in this SDK, and it must correspond to the destination network\n walletAddresses: {\n [destinationNetwork]: walletAddress,\n },\n ...(customerIpAddress ? { customerIpAddress } : {}),\n }\n const newBuySessionResp = await sendPostRequest({\n uri: `${API_BASE_URL}/on-ramp/stripe-checkout`,\n body,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return newBuySessionResp as CreateStripeBuySessionResponse\n}\n\nexport async function getStripeBuySession({\n sessionId,\n ...options\n}: BaseApiRequest & {\n sessionId: string\n}): Promise<CreateStripeBuySessionResponse> {\n const buySessionResp = await sendGetRequest({\n uri: `${API_BASE_URL}/on-ramp/stripe-checkout-session/${sessionId}`,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return buySessionResp as CreateStripeBuySessionResponse\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendPostRequest } from '../../utils'\nimport type { SendSupportMessageRequest } from './types'\n\nexport async function sendSupportMessage({\n title,\n description,\n userEmail,\n ...options\n}: SendSupportMessageRequest): Promise<boolean> {\n try {\n await sendPostRequest({\n uri: `${API_BASE_URL}/support/send-message`,\n body: { title, description, userEmail },\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return true\n } catch (_err) {\n return false\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["InvalidParameterError", "ResourceNotFoundError", "UserOpFailureError", "ErrorCode", "ResourceNotFoundError", "CheckoutState", "CheckoutRefundState", "ResourceNotFoundError", "ErrorCode", "OperationStatus", "AuthType", "OperationType", "PaymasterType", "ResourceNotFoundError", "InvalidParameterError", "ResourceNotFoundError", "InvalidParameterError", "MeshExecuteTransferStatus", "MeshExecuteTransferMfaType", "ErrorCode", "InternalFailureError", "InternalFailureError", "ErrorCode"]
|
|
3
|
+
"sources": ["../src/consts/api.ts", "../src/utils/error.ts", "../src/consts/retry.ts", "../src/consts/customers.ts", "../src/utils/checkout.ts", "../src/utils/request.ts", "../src/services/assets/endpoints.ts", "../src/services/checkout/endpoints.ts", "../src/services/checkout/types.ts", "../src/services/direct-execution/endpoints.ts", "../src/services/direct-execution/types.ts", "../src/services/faucet/endpoints.ts", "../src/services/fw-access/endpoints.ts", "../src/services/fw-group/endpoints.ts", "../src/services/fw-info/endpoints.ts", "../src/services/fw-operation/endpoints.ts", "../src/services/fw-operation/types.ts", "../src/services/fw-paymaster/endpoints.ts", "../src/services/fw-paymaster/types.ts", "../src/services/fw-user/endpoints.ts", "../src/services/mesh/endpoints.ts", "../src/services/mesh/types.ts", "../src/services/moonpay/endpoints.ts", "../src/services/stripe/endpoints.ts", "../src/services/support/endpoints.ts"],
|
|
4
|
+
"sourcesContent": ["export const API_BASE_URL = process.env.API_BASE_URL || 'https://api.fun.xyz/v1' // Production\n\n// TODO: change it to fun.xyz domain\nexport const MESH_API_BASE_URL = 'https://frog.fun.xyz'\n\nexport const FUN_FAUCET_URL = 'https://api.fun.xyz/demo-faucet'\n", "import {\n InvalidParameterError,\n ResourceNotFoundError,\n UserOpFailureError,\n} from '@funkit/utils'\nimport type { AttemptContext } from '@lifeomic/attempt'\n\nexport const errorAbortHandler = (err: Error, context: AttemptContext) => {\n if (\n err instanceof ResourceNotFoundError ||\n err instanceof InvalidParameterError ||\n err instanceof UserOpFailureError\n ) {\n context.abort()\n }\n}\n", "import type { PartialAttemptOptions } from '@lifeomic/attempt'\n\nimport { errorAbortHandler } from '../utils/error'\n\nexport type BaseResponse = unknown\n\nexport type RetryOptions<T = BaseResponse> = PartialAttemptOptions<T>\n\nexport const DEFAULT_RETRY_OPTIONS = {\n delay: 100,\n initialDelay: 0,\n maxDelay: 3000,\n factor: 2,\n maxAttempts: 5,\n timeout: 0,\n jitter: true,\n minDelay: 0,\n handleError: errorAbortHandler,\n handleTimeout: null,\n beforeAttempt: null,\n calculateDelay: null,\n} as RetryOptions\n", "export const DEGEN_API_KEY = 'm4iHIILHcL4gN8EXCMzGe8zIdhuCXxck49mWajzJ'\nexport const DYDX_API_KEY = 'NJq0CGrsE19xBbP1vHyBOp8xJvzYo9kayJHqDFP5'\nexport const POLYMARKET_API_KEY = 'Y53dikxXdT4E3afI1l8BMBSWgyhKvf65k6Dut1k6'\nexport const VERTEX_API_KEY = 'OQXhzzkLHE2vHAK8nZBS76el5utuw3527RmnYn26'\nexport const OSTIUM_API_KEY = 'SMbBD7DS9b3EPcyBVg4a8az1rRWR9xB068chHoUN'\nexport const DEV_API_KEY = 'Z9SZaOwpmE40KX61mUKWm5hrpGh7WHVkaTvQJpQk'\nexport const BANKR_API_KEY = 'vWe20Dfyui2ouvfOhtSTY3Czeo8lFdbo5xXQBALZ'\n", "import { toHex } from 'viem'\n\nexport function randomBytes(length: number) {\n const bytes = new Uint8Array(length)\n for (let i = 0; i < length; i++) {\n bytes[i] = Math.floor(Math.random() * 256)\n }\n return toHex(bytes)\n}\n\nexport function generateRandomCheckoutSalt() {\n return toHex(BigInt(randomBytes(32)))\n}\n\nexport function roundToNearestBottomTenth(n: number) {\n return Math.floor(n / 10) * 10\n}\n", "import { retry } from '@lifeomic/attempt'\n\nimport type { BaseRequest } from '../consts/request'\nimport {\n type BaseResponse,\n DEFAULT_RETRY_OPTIONS,\n type RetryOptions,\n} from '../consts/retry'\n\nimport {\n AccessDeniedError,\n ErrorCode,\n InternalFailureError,\n InvalidParameterError,\n ResourceNotFoundError,\n ThrottlingError,\n UserOpFailureError,\n jsonStringifyWithBigIntSanitization,\n} from '@funkit/utils'\nimport type {\n DeleteRequest,\n GetRequest,\n PostRequest,\n PutRequest,\n} from './../consts/request'\n\ntype RequestError = {\n errorMsg: string\n errorCode: string\n}\n\nexport async function sendRequest<T = BaseResponse>({\n uri,\n method,\n apiKey,\n body = {},\n logger,\n retryOptions = {},\n signal,\n}: BaseRequest): Promise<T> {\n const headers = {\n 'Content-Type': 'application/json',\n ...(apiKey ? { 'X-Api-Key': apiKey } : {}),\n }\n\n try {\n const finalRetryOptions = {\n ...DEFAULT_RETRY_OPTIONS,\n ...retryOptions,\n } as RetryOptions<T>\n\n return retry<T>(async (context) => {\n const startTimeMs = Date.now()\n const fetchParams = {\n method,\n headers,\n redirect: 'follow',\n signal,\n body:\n method !== 'GET'\n ? jsonStringifyWithBigIntSanitization(body)\n : undefined,\n } as RequestInit\n\n logger?.info('api-base:sendRequest_before', {\n uri,\n fetchParams,\n startTimeMs,\n })\n const response = await fetch(uri, fetchParams)\n const json = await response.json()\n const endTimeMs = Date.now()\n logger?.info('api-base:sendRequest_after', {\n url: uri,\n fetchParams,\n endTimeMs,\n response: {\n body: json,\n status: response.status,\n },\n durationMs: endTimeMs - startTimeMs,\n retries: context.attemptNum,\n })\n\n if (response.ok) {\n return json\n }\n\n const { errorMsg, errorCode } = json as RequestError\n\n if (response.status === 400) {\n throw new InvalidParameterError(\n ErrorCode.InvalidParameter,\n `bad request ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'check the api call parameters. its mostly because some call parameters are wrong',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 403) {\n throw new AccessDeniedError(\n ErrorCode.Unauthorized,\n 'Invalid API key or insufficient access.',\n errorMsg,\n { apiKey },\n 'Check your api key at https://app.fun.xyz and check with fun team if you believe something is off',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 404) {\n throw new ResourceNotFoundError(\n ErrorCode.ServerMissingData,\n JSON.stringify(json),\n errorMsg,\n { body },\n 'check the api call parameters. its mostly because some call parameters are wrong',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 429) {\n throw new ThrottlingError(\n ErrorCode.RequestLimitExceeded,\n `too many requests ${JSON.stringify(json)}`,\n 'Too many requests',\n { body },\n 'you are making too many requests. please slow down. Reach out to fun team if you need more quota',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 500) {\n if (errorCode === ErrorCode.UserOpFailureError) {\n throw new UserOpFailureError(\n ErrorCode.UserOpFailureError,\n JSON.stringify(json), // UserOpFailureError may JSON.parse this! Do not modify!\n errorMsg,\n { body },\n 'fix user op failure. Most of the time this is due to invalid parameters',\n 'https://docs.fun.xyz',\n )\n }\n throw new InternalFailureError(\n ErrorCode.ServerFailure,\n `server failure ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n if (response.status === 504) {\n throw new InternalFailureError(\n ErrorCode.ServerTimeout,\n `server timeout failure ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n if (!response.ok) {\n throw new InternalFailureError(\n ErrorCode.UnknownServerError,\n `unknown server failure ${JSON.stringify(json)}`,\n errorMsg,\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n return {}\n }, finalRetryOptions)\n } catch (err) {\n logger?.error('api-base:fetch_error', {\n url: uri,\n method,\n request: {\n body,\n headers,\n },\n error: err,\n })\n\n throw new InternalFailureError(\n ErrorCode.ServerConnectionError,\n `Cannot connect to Fun API Service ${err}`,\n '',\n { body },\n 'retry later. if it still fails, please contact us.',\n 'https://docs.fun.xyz',\n )\n }\n}\n\nexport async function sendGetRequest<T = BaseResponse>(\n options: GetRequest,\n): Promise<T> {\n return await sendRequest({ ...options, method: 'GET' })\n}\n\nexport async function sendPostRequest<T = BaseResponse>(\n options: PostRequest,\n): Promise<T> {\n return await sendRequest({ ...options, method: 'POST' })\n}\n\nexport async function sendPutRequest<T = BaseResponse>(\n options: PutRequest,\n): Promise<T> {\n return await sendRequest({ ...options, method: 'PUT' })\n}\n\nexport async function sendDeleteRequest(options: DeleteRequest): Promise<void> {\n await sendRequest({ ...options, method: 'DELETE' })\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest } from '../../utils'\nimport type {\n Erc20AssetInfo,\n GetAllWalletNFTsByChainIdRequest,\n GetAllWalletNFTsByChainIdResponse,\n GetAllWalletNFTsRequest,\n GetAllWalletNFTsResponse,\n GetAllWalletTokensByChainIdRequest,\n GetAllWalletTokensByChainIdResponse,\n GetAllWalletTokensRequest,\n GetAllWalletTokensResponse,\n GetAllowedAssetsRequest,\n GetAllowedAssetsResponse,\n GetAssetErc20ByChainAndSymbolRequest,\n GetAssetPriceInfoRequest,\n GetAssetPriceInfoResponse,\n GetNftAddressRequest,\n GetNftNameRequest,\n GetWalletLidoWithdrawalsByChainId,\n GetWalletLidoWithdrawalsByChainIdResponse,\n NftAssetInfo,\n} from './types'\n\n/**\n * Gets the estimated dollar unit price of a tokenAddress for checkout\n * @param chainId https://chainlist.org/ e.g. \"1\" for ethereum\n * @param assetTokenAddress tokenAddress of the asset on the given chain\n * @param apiKey\n */\nexport async function getAssetPriceInfo({\n chainId,\n assetTokenAddress,\n ...options\n}: GetAssetPriceInfoRequest): Promise<GetAssetPriceInfoResponse> {\n const priceInfo: GetAssetPriceInfoResponse = await sendGetRequest({\n uri: `${API_BASE_URL}/asset/erc20/price/${chainId}/${assetTokenAddress}`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n return priceInfo\n}\n\n/**\n * Gets the ERC20 asset info by chain and symbol\n * @param chainId https://chainlist.org/ e.g. \"1\" for ethereum\n * @param symbol symbol of the asset\n * @param apiKey\n */\nexport async function getAssetErc20ByChainAndSymbol({\n chainId,\n symbol,\n ...options\n}: GetAssetErc20ByChainAndSymbolRequest): Promise<Erc20AssetInfo> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/asset/erc20/${chainId}/${symbol}`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**\n * Get all tokens for a given wallet address\n * @param walletAddress\n * @param onlyVerifiedTokens If true, only return alchemy tokens that are verified(filters spam)\n * @param apiKey\n * @param signal AbortSignal to cancel the request when no longer needed\n */\nexport async function getAllWalletTokens({\n walletAddress,\n onlyVerifiedTokens,\n ...options\n}: GetAllWalletTokensRequest): Promise<GetAllWalletTokensResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/erc20s/${walletAddress}?onlyVerifiedTokens=${onlyVerifiedTokens}`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**\n * Get all tokens for a given wallet address on a specific chain\n * @param chainId https://chainlist.org/\n * @param walletAddress\n * @param onlyVerifiedTokens If true, only return alchemy tokens that are verified(filters spam)\n * @param apiKey\n */\nexport async function getAllWalletTokensByChainId({\n chainId,\n walletAddress,\n onlyVerifiedTokens,\n ...options\n}: GetAllWalletTokensByChainIdRequest): Promise<GetAllWalletTokensByChainIdResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/erc20s/${walletAddress}/${chainId}?onlyVerifiedTokens=${onlyVerifiedTokens}`,\n\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**\n * Get list of assets that are allowed to be used for checkout\n * @param apiKey\n */\nexport async function getAllowedAssets(\n options: GetAllowedAssetsRequest,\n): Promise<GetAllowedAssetsResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/allow`,\n retryOptions: { maxAttempts: 2 },\n ...options,\n })\n}\n\n/**=======================\n * POTENTIAL DEPRECATION\n *=======================*/\n\n/**\n * Get all the NFTs owned by a wallet\n * @param walletAddress\n * @param apiKey\n */\nexport async function getAllWalletNFTs({\n walletAddress,\n ...options\n}: GetAllWalletNFTsRequest): Promise<GetAllWalletNFTsResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/nfts/${walletAddress}`,\n ...options,\n })\n}\n\n/**\n * Get all the NFTs owned by a wallet on a specific chain\n * @param chainId From https://chainlist.org/\n * @param walletAddress Address of holder\n * @param apiKey\n */\nexport async function getAllWalletNFTsByChainId({\n chainId,\n walletAddress,\n ...options\n}: GetAllWalletNFTsByChainIdRequest): Promise<GetAllWalletNFTsByChainIdResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/nfts/${walletAddress}/${chainId}`,\n ...options,\n })\n}\n\n/**\n * Get all lido withdrawal request ids for a wallet address on a specific chain\n * @param {string} chainId https://chainlist.org/ ie \"1\" for ethereum\n * @param {string} holderAddr Address of holder\n * @returns [readyToWithdrawRequestIds, notReadyToWithdrawRequestIds]\n */\nexport async function getWalletLidoWithdrawalsByChainId({\n chainId,\n walletAddress,\n ...options\n}: GetWalletLidoWithdrawalsByChainId): Promise<GetWalletLidoWithdrawalsByChainIdResponse> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/assets/lido-withdrawals/${walletAddress}/${chainId}`,\n ...options,\n })\n}\n\n/**\n * Get the name of an NFT collection\n * @param {string} chainId https://chainlist.org/\n * @param {string} nftAddress Address of NFT\n */\nexport async function getNftName({\n chainId,\n nftAddress,\n ...options\n}: GetNftNameRequest): Promise<NftAssetInfo> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/asset/nft/${chainId}/${nftAddress}`,\n ...options,\n })\n}\n\n/**\n * Get the address and chainId of an NFT collection\n * @param {string} name Name of NFT\n */\nexport async function getNftAddress({\n name,\n ...options\n}: GetNftAddressRequest): Promise<NftAssetInfo> {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/asset/nft?name=${name}`,\n ...options,\n })\n}\n", "import Big from 'big.js'\nimport type { Address } from 'viem'\n\nimport { ErrorCode, ResourceNotFoundError } from '@funkit/utils'\nimport { API_BASE_URL, type BaseApiRequest } from '../../consts'\nimport {\n generateRandomCheckoutSalt,\n roundToNearestBottomTenth,\n sendGetRequest,\n sendPostRequest,\n} from '../../utils'\nimport {\n type CheckoutApiInitParams,\n type CheckoutApiQuoteParams,\n type CheckoutApiQuoteResponse,\n type CheckoutDeactivateParams,\n type CheckoutHistoryItem,\n type CheckoutInitParams,\n type CheckoutInitResponse,\n type CheckoutInitTokenTransferAddressParams,\n type CheckoutInitTokenTransferResponse,\n type CheckoutQuoteParams,\n type CheckoutQuoteResponse,\n CheckoutState,\n type CheckoutTransferSponsorshipApiParams,\n type CheckoutTransferSponsorshipParams,\n type CheckoutTransferSponsorshipResponse,\n type RiskAssessmentParams,\n type RiskAssessmentResponse,\n} from './types'\n\nconst DEFAULT_EXPIRATION_TIMESTAMP_MS = 15 * 60 * 1000 // 15 minutes\n\n/**\n * Gets a checkout quote (estimation).\n * @param fromChainId The ID of the chain where funds will be provided from.\n * @param fromTokenAddress The asset to fund the checkout. This must be either a chain native token or an ERC-20, on the fromChainId.\n * @param fromTokenDecimals The number of decimals for the fromTokenAddress.\n * @param toChainId The ID of the chain where the checkout operation is to be performed.\n * @param toTokenAddress The wanted asset for the checkout operation. This must be either a chain native token or an ERC-20, on the target chain.\n * @param toTokenAmount The amount of wanted asset for the checkout operation in base units.\n * @param toTokenDecimals The number of decimals for the toTokenAddress.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @return {Promise<CheckoutCoreQuoteResponse>} The formatted quote object\n */\nexport async function getCheckoutQuote({\n fromChainId,\n fromTokenAddress,\n fromTokenDecimals,\n toChainId,\n toTokenAddress,\n toTokenDecimals,\n toTokenAmount,\n sponsorInitialTransferGasLimit,\n recipientAddr,\n userId,\n ...options\n}: CheckoutQuoteParams): Promise<CheckoutQuoteResponse> {\n try {\n const toMultipler = 10 ** toTokenDecimals\n const toAmountBaseUnitBI = BigInt(Math.floor(toTokenAmount * toMultipler))\n const queryParams: CheckoutApiQuoteParams = {\n userId,\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n toAmountBaseUnit: toAmountBaseUnitBI.toString(),\n // Only pass in recipientAddr if specified\n ...(recipientAddr ? { recipientAddr } : {}),\n // Rounding nearest tenth second (instead of seconds) to better support backend quote caching feature\n // Reference: https://vintage-heaven-3cd.notion.site/API-Gateway-Caching-and-Pre-Warming-System-Draft-ee7909d9b85f43c793ce7bd2607bec02?pvs=4\n // Note: Rounding *down* instead of a regular round to safeguard against edge case of timing passing frontend range validation but failing backend range validation\n checkoutExpirationTimestampSeconds: roundToNearestBottomTenth(\n Math.round((Date.now() + DEFAULT_EXPIRATION_TIMESTAMP_MS) / 1000),\n ).toString(),\n sponsorInitialTransferGasLimit,\n }\n\n const searchParams = new URLSearchParams(queryParams)\n const quoteRes = (await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/quote?${searchParams}`,\n ...options,\n })) as CheckoutApiQuoteResponse\n\n const fromMultipler = 10 ** fromTokenDecimals\n // Format the response for frontend usage\n return {\n quoteId: quoteRes.quoteId,\n fromTokenAddress: quoteRes.fromTokenAddress,\n estFeesUsd: quoteRes.estFeesUsd,\n estSubtotalUsd: quoteRes.estSubtotalUsd,\n estTotalUsd: quoteRes.estTotalUsd,\n estCheckoutTimeMs: quoteRes.estCheckoutTimeMs,\n estTotalFromAmountBaseUnit: quoteRes.estTotalFromAmountBaseUnit,\n estSubtotalFromAmountBaseUnit: quoteRes.estSubtotalFromAmountBaseUnit,\n estFeesFromAmountBaseUnit: quoteRes.estFeesFromAmountBaseUnit,\n estMarketMakerGasUsd: quoteRes.estMarketMakerGasUsd,\n lpFeePercentage: quoteRes.lpFeePercentage,\n lpFeeUsd: quoteRes.lpFeeUsd,\n // Added fields\n estFeesFromAmount: new Big(quoteRes.estFeesFromAmountBaseUnit)\n .div(fromMultipler)\n .toString(),\n estSubtotalFromAmount: new Big(quoteRes.estSubtotalFromAmountBaseUnit)\n .div(fromMultipler)\n .toString(),\n estTotalFromAmount: new Big(quoteRes.estTotalFromAmountBaseUnit)\n .div(fromMultipler)\n .toString(),\n }\n } catch (err: unknown) {\n throw new Error(\n `An error occured trying to generate a checkout quote: ${\n err instanceof Error ? err.message : JSON.stringify(err)\n }`,\n )\n }\n}\n\n/**\n * Initializes a checkout\n * @param userOp The checkout UserOp, signed.\n * @param quoteId The quoteId specific to the checkout.\n * @param apiKey A valid fun api key.\n * @return {Address} The generated deposit address\n */\nexport async function initializeCheckout({\n userOp,\n quoteId,\n sourceOfFund,\n clientMetadata,\n ...options\n}: CheckoutInitParams): Promise<CheckoutInitResponse> {\n const body = {\n ...(userOp ? { userOp } : {}),\n quoteId,\n sourceOfFund,\n salt: generateRandomCheckoutSalt(),\n clientMetadata,\n } as CheckoutApiInitParams\n const res: { depositAddr?: Address } = await sendPostRequest({\n uri: `${API_BASE_URL}/checkout`,\n body,\n ...options,\n })\n if (!res?.depositAddr) {\n throw new ResourceNotFoundError(\n ErrorCode.CheckoutInitDepositAddrNotFound,\n 'Unable to initialize checkout',\n 'Unable to initialize checkout',\n body,\n '',\n 'https://docs.fun.xyz',\n )\n }\n return { depositAddr: res.depositAddr }\n}\n\nexport async function deactivateCheckout({\n depositAddress,\n ...options\n}: CheckoutDeactivateParams) {\n try {\n await sendPostRequest({\n uri: `${API_BASE_URL}/checkout/update/${depositAddress}`,\n body: {\n // Fixed state to cancel the checkout\n state: CheckoutState.CANCELLED,\n },\n ...options,\n })\n return true\n } catch (_err) {\n throw new Error('Unable to deactivate checkout')\n }\n}\n\n/**\n * Gets a checkout given a depositAddress\n * @param depositAddress A unique deposit address associated with a backend checkout item.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns The checkout object if exists. Otherwise, null.\n */\nexport async function getCheckoutByDepositAddress({\n depositAddress,\n ...options\n}: BaseApiRequest & {\n depositAddress: Address\n}): Promise<CheckoutHistoryItem | null> {\n try {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/${depositAddress}`,\n ...options,\n })\n } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return null\n }\n throw err\n }\n}\n\n/**\n * Gets all checkouts associated with a funWallet\n * @param funWalletAddress A funWallet address.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns A list of checkout objects if exists. Otherwise, an empty array.\n */\nexport async function getCheckoutsByFunWalletAddress({\n funWalletAddress,\n ...options\n}: BaseApiRequest & { funWalletAddress: Address }): Promise<\n CheckoutHistoryItem[]\n> {\n const res: CheckoutHistoryItem[] = await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/fun-wallet/${funWalletAddress}`,\n ...options,\n })\n return res || []\n}\n\n/**\n * Gets all checkouts associated with a recipient address\n * @param recipientAddress A wallet address.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns A list of checkout objects if exists. Otherwise, an empty array.\n */\nexport async function getCheckoutsByRecipientAddress({\n recipientAddress,\n ...options\n}: BaseApiRequest & { recipientAddress: Address }): Promise<\n CheckoutHistoryItem[]\n> {\n const res = await sendGetRequest<CheckoutHistoryItem[] | null>({\n uri: `${API_BASE_URL}/checkout/recipient/${recipientAddress}`,\n ...options,\n })\n return res || []\n}\n\n/**\n * Gets all checkouts associated with a funkit userId string\n * @param userId A userId string.\n * @param apiKey A valid fun api key.\n * @param signal AbortSignal to cancel the request when no longer needed\n * @returns A list of checkout objects if exists. Otherwise, an empty array.\n */\nexport async function getCheckoutsByUserId({\n userId,\n ...options\n}: BaseApiRequest & { userId: string }): Promise<CheckoutHistoryItem[]> {\n const res = await sendGetRequest<CheckoutHistoryItem[] | null>({\n uri: `${API_BASE_URL}/checkout/userId/${userId}`,\n ...options,\n })\n return res || []\n}\n\nexport async function getPaymasterDataForCheckoutSponsoredTransfer({\n depositAddress,\n transferUserOp,\n ...options\n}: CheckoutTransferSponsorshipParams): Promise<CheckoutTransferSponsorshipResponse> {\n const body = {\n depositAddress,\n userOp: transferUserOp,\n } as CheckoutTransferSponsorshipApiParams\n const res = await sendPostRequest({\n uri: `${API_BASE_URL}/checkout/sponsor-transfer`,\n body,\n ...options,\n })\n if (!res) {\n // TODO: Better error handling\n throw new Error('Unable to get sponsorship information')\n }\n return res as CheckoutTransferSponsorshipResponse\n}\n\nexport async function getRiskAssessmentForAddress({\n address,\n ...options\n}: RiskAssessmentParams) {\n const response = (await sendGetRequest({\n uri: `${API_BASE_URL}/checkout/risk-assessment?address=${address}`,\n ...options,\n })) as RiskAssessmentResponse\n\n return response\n}\n\nexport async function initializeCheckoutTokenTransferAddress({\n apiKey,\n logger,\n signal,\n ...body\n}: CheckoutInitTokenTransferAddressParams): Promise<CheckoutInitTokenTransferResponse> {\n const res = await sendPostRequest<CheckoutInitTokenTransferResponse | null>({\n uri: `${API_BASE_URL}/eoa`,\n body,\n apiKey,\n logger,\n signal,\n })\n if (!res?.depositAddr) {\n throw new ResourceNotFoundError(\n ErrorCode.CheckoutInitDepositAddrNotFound,\n 'Unable to initialize checkout token transfer address',\n 'Unable to initialize checkout token transfer address',\n body,\n '',\n 'https://docs.fun.xyz',\n )\n }\n return {\n depositAddr: res.depositAddr,\n solanaAddr: res.solanaAddr,\n }\n}\n", "import type { Abi, Address, Hex } from 'viem'\n\nimport type { BaseApiRequest } from '../../consts'\nimport type { UserOperation } from '../fw-operation'\n\n// The params required for the actual /checkout/quote api\nexport type CheckoutApiQuoteParams = {\n fromChainId: string\n fromTokenAddress: Address\n toChainId: string\n toTokenAddress: Address\n toAmountBaseUnit: string\n /** @deprecated */\n checkoutExpirationTimestampSeconds: string\n sponsorInitialTransferGasLimit: string\n userId: string\n recipientAddr?: Address\n}\n\nexport type CheckoutQuoteParams = BaseApiRequest &\n Omit<\n CheckoutApiQuoteParams,\n 'toAmountBaseUnit' | 'checkoutExpirationTimestampSeconds'\n > & {\n fromTokenDecimals: number\n toTokenDecimals: number\n toTokenAmount: number\n /** @deprecated */\n expirationTimestampMs?: number\n }\n\n// The response of the actual /checkout/quote api\nexport type CheckoutApiQuoteResponse = {\n quoteId: string\n estTotalFromAmountBaseUnit: string\n estSubtotalFromAmountBaseUnit: string\n estFeesFromAmountBaseUnit: string\n fromTokenAddress: Address\n estFeesUsd: number\n estSubtotalUsd: number\n estTotalUsd: number\n estCheckoutTimeMs: number\n estMarketMakerGasUsd: number\n lpFeePercentage: number\n lpFeeUsd: number\n}\n\n// The formatted response quote interface from the core sdk\nexport type CheckoutQuoteResponse = CheckoutApiQuoteResponse & {\n estTotalFromAmount: string\n estSubtotalFromAmount: string\n estFeesFromAmount: string\n}\n\n/**===============*\n * CHECKOUT INIT *\n *================*/\n\nexport type CheckoutApiInitParams = {\n userOp?: UserOperation\n quoteId: string\n sourceOfFund: string\n salt: Hex\n // TODO: Proper typing wrt _generateClientMetadata() logic\n clientMetadata: object\n}\n\nexport type CheckoutInitParams = BaseApiRequest &\n Omit<CheckoutApiInitParams, 'salt'>\n\nexport type CheckoutInitResponse = {\n depositAddr: Address\n}\n\nexport type CheckoutInitTokenTransferResponse = CheckoutInitResponse & {\n solanaAddr?: SolanaAddress\n}\n\n/**=====================*\n * CHECKOUT DEACTIVATE *\n *======================*/\n\nexport type CheckoutDeactivateParams = BaseApiRequest & {\n depositAddress: Address\n}\n\n// Reference from api server: https://github.com/fun-xyz/fun-api-server/blob/main/src/tables/FunWalletCheckout.ts#L11C1-L21C2\nexport enum CheckoutState {\n // In-progress States\n FROM_UNFUNDED = 'FROM_UNFUNDED',\n FROM_FUNDED = 'FROM_FUNDED',\n FROM_POOLED = 'FROM_POOLED',\n TO_UNFUNDED = 'TO_UNFUNDED',\n TO_FUNDED = 'TO_FUNDED',\n TO_POOLED = 'TO_POOLED',\n TO_READY = 'TO_READY',\n PENDING_RECEIVAL = 'PENDING_RECEIVAL',\n // Terminal States\n COMPLETED = 'COMPLETED',\n CHECKOUT_ERROR = 'CHECKOUT_ERROR',\n EXPIRED = 'EXPIRED',\n CANCELLED = 'CANCELLED',\n}\n\n// Checkout state categorizations\nexport const FROM_PROGRESS_CHECKOUT_STATES = [\n CheckoutState.FROM_UNFUNDED,\n CheckoutState.FROM_FUNDED,\n CheckoutState.FROM_POOLED,\n]\n\nexport const TO_PROGRESS_CHECKOUT_STATES = [\n CheckoutState.TO_UNFUNDED,\n CheckoutState.TO_FUNDED,\n CheckoutState.TO_POOLED,\n CheckoutState.TO_READY,\n CheckoutState.PENDING_RECEIVAL,\n]\n\nexport const IN_PROGRESS_CHECKOUT_STATES = [\n ...TO_PROGRESS_CHECKOUT_STATES,\n ...FROM_PROGRESS_CHECKOUT_STATES,\n]\n\nexport const TERMINAL_CHECKOUT_STATES = [\n CheckoutState.EXPIRED,\n CheckoutState.CHECKOUT_ERROR,\n CheckoutState.COMPLETED,\n CheckoutState.CANCELLED,\n]\n\nexport enum CheckoutRefundState {\n INITIATED = 'INITIATED',\n ERROR = 'ERROR',\n REFUNDED = 'REFUNDED',\n PROCEEDED = 'PROCEEDED',\n WAITING_FOR_FULFILLMENT = 'WAITING_FOR_FULFILLMENT',\n FULFILLED = 'FULFILLED',\n}\n\nexport type CheckoutHistoryItem = {\n createdTimeMs: number\n depositAddr: Address\n currentDepositAddr: Address\n recipientAddr: Address\n expirationTimestampSeconds: number\n fromAmountBaseUnit: string\n fromChainId: string\n fromTokenAddress: Address\n funWalletAddr: Address\n lastUpdatedTimeMs: number\n salt: Hex\n state: CheckoutState\n toAmountBaseUnit: string\n toChainId: string\n toTokenAddress: Address\n userOp?: UserOperation\n version: number\n sourceOfFund: string\n clientMetadata: ApiCheckoutClientMetadata\n refundState?: CheckoutRefundState\n // Note: Optional, because BE does not retroactively update existing CheckoutHistoryItem entries\n stateTimestampMs?: Partial<Record<CheckoutState, number>>\n}\n\n/**===============================*\n * CHECKOUT TRANSFER SPONSORSHIP *\n *================================*/\n\nexport type CheckoutTransferSponsorshipParams = BaseApiRequest & {\n transferUserOp: UserOperation\n depositAddress: Address\n}\n\nexport type CheckoutTransferSponsorshipApiParams = {\n userOp: UserOperation\n depositAddress: Address\n}\n\nexport type CheckoutTransferSponsorshipResponse = {\n signerAddress: Address\n signature: Hex\n deadline: number\n paymasterAndData: Hex\n}\n\n/**===============================*\n * RISK ASSESSMENT *\n *================================*/\n\nexport type RiskAssessmentParams = BaseApiRequest & {\n address: FunAddress\n}\n\ntype AddressIdentification = {\n name: string\n address: FunAddress\n category: string\n description: string\n url: string | null\n createdAt: number\n}\n\ntype Cluster = {\n name: string\n category: string\n}\n\nexport type RiskValues = 'Severe' | 'High' | 'Medium' | 'Low'\n\ntype ExposureType = 'direct' | 'indirect'\n\ntype Exposure = {\n category: string\n value: number\n exposureType: ExposureType\n direction: string\n}\n\ntype RiskTrigger = {\n risk: string\n minThreshold: number\n maxThreshold: number\n exposureType: string\n direction: string\n}\n\ntype Trigger = {\n category: string\n percentage: number\n message: string\n ruleTriggered?: RiskTrigger\n}\n\ntype PoolMetadata = {\n fees?: number\n tokens: string[]\n}\n\n// fun.xyz uses `dydx${address}` for dydx addresses as VIP addr :/\nexport type DydxAddress = `dydx${string}`\nexport type SolanaAddress = string // TODO: Proper typing from a package\nexport type FunAddress = Address | DydxAddress | SolanaAddress\n\nexport type RiskAssessmentResponse = {\n address: FunAddress\n risk: RiskValues\n riskReason: string | null\n cluster?: Cluster\n addressType: string\n addressIdentifications: AddressIdentification[]\n exposures: Exposure[]\n triggers: Trigger[]\n status: string\n poolMetadata: PoolMetadata\n}\n\nexport type CheckoutInitTokenTransferAddressParams = BaseApiRequest & {\n toChainId: string\n toTokenAddress: Address\n userId: string\n clientMetadata: NonNullable<object>\n sourceOfFund?: string\n recipientAddr: string\n}\n\nexport interface ApiBaseCheckoutFees {\n paymentMethod: string\n marketMakerFeeUsd: number\n liquidityProviderFeeUsd: number\n totalFeesUsd: number\n totalFeesTokenWithoutGas: number\n}\n\nexport interface ApiWalletCheckoutFees extends ApiBaseCheckoutFees {\n paymentMethod: 'balance'\n eoaWalletFeeToken: number\n nativeCurrencySymbol: string\n eoaWalletFeeUsd: number\n}\n\nexport interface ApiCardCheckoutFees extends ApiBaseCheckoutFees {\n paymentMethod: 'card'\n cardProcessingFeeUsd: number\n moonpayCostUsd: number\n}\n\nexport interface ApiBrokerageCheckoutFees extends ApiBaseCheckoutFees {\n paymentMethod: 'brokerage'\n exchangeFeeUsd: number\n meshCostUsd: number\n}\n\nexport type ApiCheckoutFees =\n | ApiWalletCheckoutFees\n | ApiCardCheckoutFees\n | ApiBrokerageCheckoutFees\n\nexport type ApiFunkitCheckoutQuoteResult = {\n baseQuote: CheckoutQuoteResponse\n finalTimeEstimationMs: number\n finalPaymentTokenAmount: string\n finalPaymentFeeUsd: string\n finalTotalUsd: string\n finalFeesBreakdown: ApiCheckoutFees\n}\n\nexport interface ApiFunkitCheckoutConfig {\n /** ****************************\n * Api-related configurations *\n ******************************/\n\n /** The ID of the chain where the checkout operation is to be performed. **/\n targetChain: string\n /** The wanted asset for the checkout operation. This can be either a chain native token (by specifying NATIVE_TOKEN) or an ERC-20 token (by specifying actual token address) on the target chain. **/\n targetAsset: Address\n /** The amount of wanted asset for the checkout operation (defaults to $100 equivalent). **/\n targetAssetAmount?: number\n /** The ticker information of the wanted asset for the checkout operation. e.g. USDC. **/\n targetAssetTicker: string\n /** @deprecated Timestamp (in milliseconds) after which the checkout should not be performed, and the funds will become rescuable. Min: 300000 (5 mins), Max: 3600000 (1 hour). **/\n expirationTimestampMs?: number\n /** Custom recipient address of the checkout. If specified, a different checkout flow will be executed. It is not recommended to set this unless the Fun.xyz team advises it. **/\n customRecipient?: Address | string\n /** List of contract action params **/\n generateActionsParams?: string\n}\n\nexport interface ApiSelectedPaymentMethodInfo {\n paymentMethod: string\n title: string\n description: string\n meta?: object\n}\n\nexport interface ApiFunkitCheckoutActionParams {\n contractAbi: Abi\n contractAddress: Address\n functionName: string\n functionArgs: unknown[]\n value?: bigint\n}\n\nexport interface ApiCheckoutClientMetadata {\n /** Unique identifier for frontend use only. */\n id: string\n /** Time of creation of the active checkout item. For frontend use only. **/\n startTimestampMs: number\n /** The final dollar value of the checkout. Derived from latestQuote. **/\n finalDollarValue: null | number\n latestQuote: ApiFunkitCheckoutQuoteResult | null\n depositAddress: null | Address\n initSettings: {\n config: ApiFunkitCheckoutConfig\n }\n selectedPaymentMethodInfo: ApiSelectedPaymentMethodInfo | null\n selectedSourceAssetInfo: {\n address: Address | null\n symbol: string | null\n chainId: string\n iconSrc: string | null\n }\n /** The evaluated result of initSettings.config.generateActionsParams at the point of checkout */\n evaluatedActionsParams?: ApiFunkitCheckoutActionParams[]\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n DirectExecution,\n GetDirectExecutionByTxHashRequest,\n PostDirectExecutionRequest,\n} from './types'\n\nexport async function getDirectExecutionByTxHash({\n txHash,\n apiKey,\n}: GetDirectExecutionByTxHashRequest): Promise<DirectExecution> {\n const res = (await sendGetRequest({\n uri: `${API_BASE_URL}/direct-execution/${txHash}`,\n apiKey,\n })) as DirectExecution\n return res\n}\n\nexport async function createDirectExecution({\n txHash,\n userId,\n recipientAddr,\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmountBaseUnit,\n toAmountBaseUnit,\n estTotalUsd,\n sourceOfFund,\n clientMetadata,\n apiKey,\n type,\n}: PostDirectExecutionRequest): Promise<{ txHash: DirectExecution['txHash'] }> {\n const body = {\n txHash,\n sourceOfFund,\n userId,\n recipientAddr,\n fromChainId,\n fromTokenAddress,\n toChainId,\n toTokenAddress,\n fromAmountBaseUnit,\n toAmountBaseUnit,\n estTotalUsd,\n clientMetadata,\n type,\n }\n const res = (await sendPostRequest({\n uri: `${API_BASE_URL}/direct-execution`,\n body,\n apiKey,\n })) as { txHash: DirectExecution['txHash'] }\n\n return res\n}\n", "import type { Address, Hex } from 'viem'\nimport type { BaseApiRequest } from '../../consts'\nimport type { ApiCheckoutClientMetadata } from '../checkout'\n\nexport interface GetDirectExecutionByTxHashRequest extends BaseApiRequest {\n txHash: string\n}\n\n// Reference: https://github.com/fun-xyz/fun-backend/blob/main/packages/types/src/system/direct-execution.ts#L1\nexport enum DirectExecutionType {\n TEST_EXECUTION = 'TEST_EXECUTION', // For UT purposes only, should never show up in prod table\n VERTEX_DEPOSIT_COLLATERAL_WITH_REFERRAL = 'VERTEX_DEPOSIT_COLLATERAL_WITH_REFERRAL', // Vertex deposit collateral with referral\n // TODO: Enable this when we have relay direct execution\n // RELAY_CHECKOUT = \"RELAY_CHECKOUT\",\n}\n\n// Reference: https://github.com/fun-xyz/fun-backend/blob/main/packages/types/src/system/tables/DirectExecution.ts#L7\nexport interface DirectExecution {\n txHash: Hex\n customerId: string\n userId: string\n recipientAddr: Address\n type: DirectExecutionType\n\n fromChainId: string\n fromTokenAddress: Address\n toChainId: string\n toTokenAddress: Address\n\n fromAmountBaseUnit: string\n toAmountBaseUnit: string\n estTotalUsd: number\n\n sourceOfFund: string\n clientMetadata: ApiCheckoutClientMetadata\n createdTimeMs: number\n}\n\nexport interface PostDirectExecutionRequest\n extends BaseApiRequest,\n Omit<DirectExecution, 'customerId' | 'createdTimeMs'> {}\n", "import { FUN_FAUCET_URL } from '../../consts'\nimport { sendGetRequest } from '../../utils'\nimport type { GetAssetFromFaucetRequest } from './types'\n\nexport async function getAssetFromFaucet({\n token,\n chain,\n walletAddress,\n ...options\n}: GetAssetFromFaucetRequest) {\n return await sendGetRequest({\n uri: `${FUN_FAUCET_URL}/get-faucet?token=${token}&testnet=${chain}&addr=${walletAddress}`,\n ...options,\n })\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n CheckWalletAccessInitializationRequest,\n InitializeWalletAccessRequest,\n} from './types'\n\nexport async function initializeWalletAccess({\n walletAddr,\n creatorAddr,\n ...options\n}: InitializeWalletAccessRequest): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/access/wallet`,\n body: { walletAddr, creatorAddr },\n ...options,\n })\n}\n\nexport async function checkWalletAccessInitialization({\n walletAddr,\n ...options\n}: CheckWalletAccessInitializationRequest): Promise<boolean> {\n return (\n await sendGetRequest<{ initialized: boolean }>({\n uri: `${API_BASE_URL}/access/wallet/${walletAddr}`,\n ...options,\n })\n ).initialized\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendPostRequest } from '../../utils'\nimport type { GetGroupsRequest, GroupMetadata } from './types'\n\nexport async function getGroups({\n groupIds,\n chainId,\n ...options\n}: GetGroupsRequest): Promise<GroupMetadata[]> {\n return (\n await sendPostRequest<{ groups: GroupMetadata[] }>({\n uri: `${API_BASE_URL}/group/get-groups`,\n body: { groupIds, chainId },\n ...options,\n })\n ).groups\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendGetRequest } from '../../utils'\nimport type {\n GetChainFromIdRequest,\n GetChainFromNameRequest,\n ServerChainInfo,\n} from './types'\n\nexport async function getChainFromId({\n chainId,\n ...options\n}: GetChainFromIdRequest): Promise<ServerChainInfo> {\n const res = await sendGetRequest<ServerChainInfo>({\n uri: `${API_BASE_URL}/chain-info/${chainId}`,\n ...options,\n })\n if (!res) {\n throw new Error(JSON.stringify(res))\n }\n return res\n}\n\nexport async function getChainFromName({\n name,\n ...options\n}: GetChainFromNameRequest): Promise<ServerChainInfo> {\n const res = await sendGetRequest<ServerChainInfo>({\n uri: `${API_BASE_URL}/chain-info?name=${name}`,\n ...options,\n })\n if (!res) {\n throw new Error(JSON.stringify(res))\n }\n return res\n}\n", "import type { Address } from 'viem'\nimport { API_BASE_URL } from '../../consts'\nimport { sendDeleteRequest, sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n CreateOpRequest,\n DeleteOpRequest,\n EstimateOpInput,\n EstimatedGas,\n ExecuteOpInput,\n ExecutionReceipt,\n GetFullReceiptRequest,\n GetOpsOfWalletRequest,\n GetOpsRequest,\n GetUserOpGasPriceRequest,\n OpRequest,\n OperationData,\n ScheduleOpInput,\n SignOpRequest,\n UserOperationGasPrice,\n} from './types'\n\nexport async function createOp({\n op,\n ...options\n}: CreateOpRequest): Promise<string> {\n return (\n await sendPostRequest<{ opId: string }>({\n uri: `${API_BASE_URL}/operation`,\n body: { ...op },\n ...options,\n })\n ).opId\n}\n\ninterface OpsOfWalletResponse {\n operations: OperationData[]\n}\n\nexport async function getOpsOfWallet({\n walletAddr,\n chainId,\n status,\n ...options\n}: GetOpsOfWalletRequest): Promise<OperationData[]> {\n const endpoint = status\n ? `${API_BASE_URL}/operation/wallet/${walletAddr}/chain/${chainId}?status=${status}`\n : `${API_BASE_URL}/operation/wallet/${walletAddr}/chain/${chainId}`\n return (\n await sendGetRequest<OpsOfWalletResponse>({ uri: endpoint, ...options })\n ).operations\n}\n\nexport async function getOps({\n opIds,\n chainId,\n ...options\n}: GetOpsRequest): Promise<OperationData[]> {\n return (\n await sendPostRequest<OpsOfWalletResponse>({\n uri: `${API_BASE_URL}/operation/get-operations`,\n body: {\n opIds,\n chainId,\n },\n ...options,\n })\n ).operations\n}\n\nexport async function deleteOp({\n opId,\n chainId,\n ...options\n}: DeleteOpRequest): Promise<void> {\n await sendDeleteRequest({\n uri: `${API_BASE_URL}/operation/${opId}/chain/${chainId}`,\n ...options,\n })\n}\n\nexport async function signOp({\n opId,\n chainId,\n signature,\n signedBy,\n threshold,\n ...options\n}: SignOpRequest): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/operation/sign`,\n body: {\n opId,\n chainId,\n signature,\n signedBy,\n threshold,\n },\n ...options,\n })\n}\n\nexport async function executeOp({\n input,\n ...options\n}: OpRequest<ExecuteOpInput>): Promise<ExecutionReceipt> {\n return await sendPostRequest({\n uri: `${API_BASE_URL}/operation/execute`,\n body: input,\n ...options,\n })\n}\n\nexport async function estimateOp({\n input,\n ...options\n}: OpRequest<EstimateOpInput>): Promise<EstimatedGas> {\n return await sendPostRequest({\n uri: `${API_BASE_URL}/operation/estimate`,\n body: input,\n ...options,\n })\n}\n\nexport async function scheduleOp({\n input,\n ...options\n}: OpRequest<ScheduleOpInput>): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/operation/schedule`,\n body: input,\n ...options,\n })\n}\n\nexport const getFullReceipt = async ({\n opId,\n chainId,\n userOpHash,\n ...options\n}: GetFullReceiptRequest): Promise<ExecutionReceipt> => {\n const retries = 20\n let result: { status: string; receipt?: ExecutionReceipt } = {\n status: 'pending',\n }\n for (let i = 0; i < retries; i++) {\n try {\n result = await sendGetRequest({\n uri: `${API_BASE_URL}/operation/${opId}/chain/${chainId}/receipt?userOpHash=${userOpHash}`,\n ...options,\n })\n if (result.status === 'included') {\n break\n }\n } catch (_err) {\n /* empty */\n }\n\n await new Promise((resolve) => setTimeout(resolve, 2500))\n }\n if (!result.receipt) {\n result.receipt = {\n // TODO: this is obviously wrong but it was what we had before\n txId: 'Failed to find.' as Address,\n gasUsed: 'Failed to find.',\n opFeeUSD: 'Failed to find.',\n opFee: 'Failed to find.',\n userOpHash: 'Failed to find.',\n }\n }\n return {\n ...result.receipt,\n }\n}\n\nexport const getUserOpGasPrice = async ({\n chainId,\n ...options\n}: GetUserOpGasPriceRequest): Promise<UserOperationGasPrice> => {\n return await sendGetRequest({\n uri: `${API_BASE_URL}/operation/chain/${chainId}/gas-price`,\n ...options,\n })\n}\n", "import type { Address, Hex } from 'viem'\n\nimport type { BaseApiRequest } from '../../consts'\n\nexport enum OperationStatus {\n ALL = '',\n PENDING_APPROVED = 'PENDING_APPROVED',\n APPROVED = 'APPROVED',\n PENDING = 'PENDING',\n OP_SUCCEED = 'OP_SUCCEED',\n OP_REVERTED = 'OP_REVERTED',\n SCHEDULED = 'SCHEDULED',\n}\n\nexport type OperationMetadata = {\n opId?: Hex\n chainId: string\n opType: OperationType\n authType: AuthType\n groupId?: Hex\n message?: string\n walletAddr: Address\n status?: OperationStatus\n proposer: string // do not use address in case we later use non-address data as the proposer\n proposedTime?: number\n executedBy?: string\n executedTime?: number\n relatedOpIds?: Hex[]\n signatures?: Signature[]\n txid?: string\n gasUsed?: string\n opFeeUSD?: string\n opFee?: string\n executedBlockNumber?: number\n executedBlockTimeStamp?: number\n}\n\nexport interface OperationData extends OperationMetadata {\n userOp: UserOperation\n}\n\nexport enum AuthType {\n ECDSA = 0,\n MULTI_SIG = 1,\n}\n\nexport type Signature = {\n userId: Hex\n signature: Hex\n signedTime: number\n}\n\nexport enum OperationType {\n SINGLE_OPERATION = 'SINGLE_OPERATION',\n GROUP_OPERATION = 'GROUP_OPERATION',\n REJECTION = 'REJECTION',\n}\n\nexport type GroupInfo = {\n threshold: number\n memberIds: Hex[]\n}\n\nexport type UserOperation = {\n sender: string\n nonce: bigint\n initCode?: string\n callData: string\n callGasLimit: bigint\n verificationGasLimit: bigint\n preVerificationGas?: bigint\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n paymasterAndData?: string\n signature?: string\n}\n\nexport interface ExecutionReceipt {\n userOpHash: string\n txId?: Hex\n gasUsed?: string\n opFeeUSD?: string\n opFee?: string\n}\n\nexport type EstimatedGas = {\n preVerificationGas: bigint\n callGasLimit: bigint\n verificationGasLimit: bigint\n}\n\nexport interface CreateOpRequest extends BaseApiRequest {\n op: OperationData\n}\n\nexport interface GetOpsOfWalletRequest extends BaseApiRequest {\n walletAddr: Address\n chainId: string\n status?: OperationStatus\n}\n\nexport interface GetOpsRequest extends BaseApiRequest {\n opIds: Hex[]\n chainId: string\n}\n\nexport interface DeleteOpRequest extends BaseApiRequest {\n opId: Hex\n chainId: string\n}\n\nexport interface SignOpRequest extends BaseApiRequest {\n opId: Hex\n chainId: string\n signature: Hex\n signedBy: Address\n threshold?: number\n}\n\nexport type OpRequest<T> = BaseApiRequest & {\n input: T\n}\n\nexport type ExecuteOpInput = {\n opId: Hex\n chainId: string\n executedBy: string\n entryPointAddress: Address\n signature: Hex\n userOp?: UserOperation\n groupInfo?: GroupInfo\n}\n\nexport type EstimateOpInput = {\n opId?: Hex\n chainId: string\n entryPointAddress?: Address\n signature?: Hex\n userOp?: UserOperation\n}\n\nexport type ScheduleOpInput = {\n opId: Hex\n chainId: string\n scheduledBy: string\n entryPointAddress: Address\n signature: Hex\n userOp?: UserOperation\n groupInfo?: GroupInfo\n}\n\nexport interface GetFullReceiptRequest extends BaseApiRequest {\n opId: string\n chainId: string\n userOpHash: string\n}\n\nexport interface GetUserOpGasPriceRequest extends BaseApiRequest {\n chainId: string\n}\n\nexport type UserOperationGasPrice = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendPostRequest } from '../../utils'\nimport type { AddPaymasterTransactionRequest } from './types'\n\nexport async function addTransaction({\n chainId,\n timestamp,\n txid,\n transaction,\n paymasterType,\n sponsorAddress,\n ...options\n}: AddPaymasterTransactionRequest): Promise<any> {\n try {\n return await sendPostRequest({\n uri: `${API_BASE_URL}/dashboard/paymasters/add-transaction`,\n body: {\n chain: chainId,\n sponsorAddress,\n type: paymasterType,\n timestamp,\n transaction,\n txid,\n },\n ...options,\n })\n } catch (_err) {\n /* empty */\n }\n}\n", "import type { BaseApiRequest } from '../../consts'\nimport type { ExecutionReceipt } from '../fw-operation'\n\nexport interface PaymasterTransaction {\n action: string\n amount: number\n from: string\n to: string\n token: string\n txid?: string\n}\n\nexport interface AddPaymasterTransactionRequest extends BaseApiRequest {\n chainId: string\n timestamp: number\n txid: ExecutionReceipt['txId'] | string\n transaction: PaymasterTransaction\n paymasterType: PaymasterType\n sponsorAddress: string\n}\n\nexport enum PaymasterType {\n BaseSponsor = 'base',\n GaslessSponsor = 'gasless',\n TokenSponsor = 'token',\n CheckoutSponsor = 'checkout',\n}\n", "import { ResourceNotFoundError } from '@funkit/utils'\nimport { type Hex, InvalidParameterError } from 'viem'\nimport { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n AddUserToWalletRequest,\n CreateUserRequest,\n GetUserUniqueIdRequest,\n GetUserWalletIdentitiesRequest,\n GetUserWalletsByAddrRequest,\n Wallet,\n} from './types'\n\nexport async function createUser({\n authId,\n addr,\n method,\n userUniqueId,\n ...options\n}: CreateUserRequest): Promise<void> {\n await sendPostRequest({\n uri: `${API_BASE_URL}/user`,\n body: {\n authId,\n addr,\n method,\n userUniqueId,\n },\n ...options,\n })\n}\n\nexport async function getUserUniqueId({\n authId,\n ...options\n}: GetUserUniqueIdRequest): Promise<string> {\n try {\n return (\n await sendGetRequest<{ userUniqueId: string }>({\n uri: `${API_BASE_URL}/user/auth/${authId}/unique-id`,\n ...options,\n })\n ).userUniqueId\n } catch (err) {\n if (err instanceof ResourceNotFoundError) {\n return ''\n }\n throw err\n }\n}\n\nexport async function getUserWalletsByAddr({\n addr,\n chainId,\n ...options\n}: GetUserWalletsByAddrRequest): Promise<Wallet[]> {\n const endpoint = chainId\n ? `${API_BASE_URL}/user/addr/${addr}/wallets?chainId=${chainId}`\n : `${API_BASE_URL}/user/addr/${addr}/wallets`\n return (\n await sendGetRequest<{ wallets: Wallet[] }>({ uri: endpoint, ...options })\n ).wallets\n}\n\nexport async function addUserToWallet({\n authId,\n chainId,\n walletAddr,\n userIds,\n walletUniqueId,\n ...options\n}: AddUserToWalletRequest): Promise<void> {\n try {\n await sendPostRequest({\n uri: `${API_BASE_URL}/user/auth/${authId}/chain/${chainId}/wallet`,\n body: { walletAddr, userIds, walletUniqueId },\n ...options,\n })\n } catch (err) {\n if (err instanceof InvalidParameterError) {\n // TODO: What about any other cause of InvalidParameterError???\n // swallow the error if the wallet already exists.\n return\n }\n\n throw err\n }\n}\n\n/**\n * @returns userIds of the specified Wallet.\n */\nexport async function getUserWalletIdentities({\n authId,\n chainId,\n walletAddr,\n ...options\n}: GetUserWalletIdentitiesRequest): Promise<Hex[]> {\n return (\n (\n await sendGetRequest<{ ids: Hex[] }>({\n uri: `${API_BASE_URL}/user/auth/${authId}/chain/${chainId}/wallet/${walletAddr}/identities`,\n ...options,\n })\n ).ids ?? []\n )\n}\n", "import {\n API_BASE_URL,\n type BaseApiRequest,\n MESH_API_BASE_URL,\n} from '../../consts'\nimport { sendDeleteRequest, sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n GetCryptocurrencyHoldingsRequest,\n GetCryptocurrencyHoldingsRequestProxy,\n GetCryptocurrencyHoldingsResponse,\n GetLinkTokenRequest,\n GetLinkTokenResponse,\n GetTransferIntegrationsRequest,\n GetTransferIntegrationsResponse,\n MeshExecuteTransferRequest,\n MeshExecuteTransferRequestProxy,\n MeshExecuteTransferResponse,\n PreviewTransferRequest,\n PreviewTransferRequestProxy,\n PreviewTransferResponse,\n} from './types'\n\n/**\n * @param authToken The authentication token to send the asset from.\n * @param type The type of the integration to send the asset from.\n * @return https://docs.meshconnect.com/api-reference/portfolio/get-holdings\n */\nexport async function meshGetCryptocurrencyHoldings({\n authToken,\n type,\n ...options\n}: GetCryptocurrencyHoldingsRequest): Promise<GetCryptocurrencyHoldingsResponse> {\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/holdings/get`,\n body: { authToken, type },\n ...options,\n })\n}\n\nexport async function meshGetCryptocurrencyHoldingsProxy({\n brokerType,\n deviceId,\n ...options\n}: GetCryptocurrencyHoldingsRequestProxy): Promise<GetCryptocurrencyHoldingsResponse> {\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/mesh/holdings/get`,\n body: { brokerType, deviceId },\n ...options,\n })\n}\n\n/**\n * @return https://docs.meshconnect.com/api-reference/managed-transfers/get-integrations\n */\nexport async function meshGetTransferIntegrations(\n options: GetTransferIntegrationsRequest,\n): Promise<GetTransferIntegrationsResponse> {\n return sendGetRequest({\n uri: `${API_BASE_URL}/mesh/transfers/managed/integrations`,\n ...options,\n })\n}\n\n/**\n * @param userId A unique Id representing the end user. Typically this will be a user Id from the\nclient application. Personally identifiable information, such as an email address or phone number,\nshould not be used. 50 characters length maximum.\n * @param integrationId A unique identifier representing a specific integration obtained from the list of available integrations.\n * @param restrictMultipleAccounts The final screen of Link allows users to \u201Ccontinue\u201D back to your app or \u201CLink another account.\u201D\nIf this param is present then this button will be hidden.\n * @param transferOptions Encapsulates transaction-related parameters, including destination addresses and the amount to transfer in fiat currency.\n * @return https://docs.meshconnect.com/api-reference/managed-account-authentication/get-link-token-with-parameters\n */\nexport async function meshGetLinkToken({\n userId,\n integrationId,\n restrictMultipleAccounts,\n transferOptions,\n ...options\n}: GetLinkTokenRequest): Promise<GetLinkTokenResponse> {\n const body = {\n userId,\n ...(integrationId && { integrationId }),\n ...(restrictMultipleAccounts && { restrictMultipleAccounts }),\n ...(transferOptions && { transferOptions }),\n }\n\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/linktoken`,\n body,\n ...options,\n })\n}\n\n/**\n * @param fromAuthToken The authentication token to send the asset from.\n * @param fromType The type of the integration to send the asset from.\n * @param toAuthToken The authentication token of the target integration. Can be used alternatively to the address in the ToAddress field. If used, toType should also be provided.\n * @param toType The type of the target integration to send assets to. Used along with the toAuthToken alternatively to ToAddress.\n * @param networkId The network to send the asset over. This is generated by Mesh, it isn't a chainId or chain name.\n * @param symbol The symbol of the digital asset to send.\n * @param toAddress The target address to send the asset to.\n * @param amount The amount to send, in crypto.\n * @param amountInFiat The amount to send, in fiat currency. Can be used alternatively to Amount.\n * @param fiatCurrency Fiat currency that is to get corresponding converted fiat values of transfer and fee amounts. If not provided, defaults to USD.\n * @returns https://docs.meshconnect.com/api-reference/managed-transfers/preview-transfer\n */\nexport async function meshPreviewTransfer({\n fromAuthToken,\n fromType,\n toAuthToken,\n toType,\n networkId,\n symbol,\n toAddress,\n amount,\n amountInFiat,\n fiatCurrency,\n ...options\n}: PreviewTransferRequest): Promise<PreviewTransferResponse> {\n const body = {\n fromAuthToken,\n fromType,\n ...(toAuthToken && { toAuthToken }),\n ...(toType && { toType }),\n ...(networkId && { networkId }),\n ...(symbol && { symbol }),\n ...(toAddress && { toAddress }),\n ...(amount && { amount }),\n ...(amountInFiat && { amountInFiat }),\n ...(fiatCurrency && { fiatCurrency }),\n }\n\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/transfers/managed/preview`,\n body,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n}\n\nexport async function meshPreviewTransferProxy({\n apiKey,\n logger,\n signal,\n ...props\n}: PreviewTransferRequestProxy): Promise<PreviewTransferResponse> {\n const body = { ...props }\n\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/mesh/transfers/managed/preview`,\n body,\n apiKey,\n logger,\n retryOptions: { maxAttempts: 1 },\n signal,\n })\n}\n\n/**\n *\n * @param fromAuthToken The authentication token to send the asset from.\n * @param fromType The type of the integration to send the asset from.\n * @param previewId The preview ID of the transfer to execute.\n * @param mfaCode Multi-factor auth code that should be provided if the status of the transfer was MfaRequired.\n * @returns https://docs.meshconnect.com/api-reference/managed-transfers/execute-transfer\n */\nexport async function meshExecuteTransfer({\n fromAuthToken,\n fromType,\n previewId,\n mfaCode,\n ...options\n}: MeshExecuteTransferRequest): Promise<MeshExecuteTransferResponse> {\n const body = {\n fromAuthToken,\n fromType,\n previewId,\n ...(mfaCode && { mfaCode }),\n }\n\n return sendPostRequest({\n uri: `${API_BASE_URL}/mesh/transfers/managed/execute`,\n body,\n ...options,\n })\n}\n\nexport async function meshExecuteTransferProxy({\n apiKey,\n logger,\n signal,\n ...props\n}: MeshExecuteTransferRequestProxy): Promise<MeshExecuteTransferResponse> {\n const body = { ...props }\n\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/mesh/transfers/managed/execute`,\n body,\n apiKey,\n logger,\n signal,\n })\n}\n\ninterface SaveTokensToMeshProxyRequestBody extends BaseApiRequest {\n deviceId?: string | null\n brokerType: string\n accessToken: string\n refreshToken: string | null\n accessTokenExpiresIn: number\n accessTokenExpiresAt: string\n refreshTokenExpiresAt?: string | null\n}\n\ninterface SaveTokensToMeshProxyResponseBody {\n id: number\n createdAt: Date\n updatedAt: Date\n deviceId: string\n integrationId: string\n accessToken: string\n accessTokenExpiresAt: Date | null\n accessTokenExpiresIn: number | null\n refreshToken: string | null\n refreshTokenExpiresAt: Date | null\n}\n\nexport async function saveTokensToMeshProxy({\n apiKey,\n logger,\n signal,\n ...props\n}: SaveTokensToMeshProxyRequestBody): Promise<SaveTokensToMeshProxyResponseBody> {\n const body = { ...props }\n\n return sendPostRequest({\n uri: `${MESH_API_BASE_URL}/api/tokens`,\n body,\n apiKey,\n logger,\n signal,\n })\n}\n\ninterface RemoveTokensFromMeshProxyRequestBody extends BaseApiRequest {\n deviceId: string\n brokerType: string\n}\n\nexport async function removeTokensFromMeshProxy({\n deviceId,\n brokerType,\n ...options\n}: RemoveTokensFromMeshProxyRequestBody): Promise<void> {\n return await sendDeleteRequest({\n uri: `${MESH_API_BASE_URL}/api/tokens?deviceId=${deviceId}&brokerType=${brokerType}`,\n ...options,\n })\n}\n", "import type { BaseApiRequest } from '../../consts'\n\nexport interface GetCryptocurrencyHoldingsRequest extends BaseApiRequest {\n authToken: string\n type: string\n}\n\nexport interface GetCryptocurrencyHoldingsRequestProxy extends BaseApiRequest {\n deviceId: string\n brokerType: string\n}\n\nexport interface GetTransferIntegrationsRequest extends BaseApiRequest {}\n\nexport interface IntegrationNetworkInfo {\n chainId: string\n id: string\n logoUrl: string\n name: string\n nativeSymbol: string\n supportedTokens: string[]\n}\n\nexport interface TransferIntegration {\n networks: IntegrationNetworkInfo[]\n supportsIncomingTransfers: boolean\n supportsOutgoingTransfers: boolean\n type: string\n}\n\nexport interface GetTransferIntegrationsResponse {\n integrations: TransferIntegration[]\n}\n\nexport interface GetLinkTokenRequest extends BaseApiRequest {\n userId: string\n integrationId?: string | null\n restrictMultipleAccounts?: boolean\n transferOptions?: Record<string, unknown> | null\n}\n\nexport interface GetLinkTokenResponse {\n linkToken: string\n}\n\nexport interface PreviewTransferRequest extends BaseApiRequest {\n fromAuthToken: string\n fromType: string\n toAuthToken?: string | null\n toType?: string | null\n networkId?: string\n symbol?: string | null\n toAddress?: string | null\n amount?: string | null\n amountInFiat?: string | null\n fiatCurrency?: string | null\n}\n\nexport interface PreviewTransferRequestProxy\n extends Omit<PreviewTransferRequest, 'fromAuthToken' | 'fromType'> {\n deviceId: string\n brokerType: string\n}\n\nexport interface MeshExecuteTransferRequest extends BaseApiRequest {\n fromAuthToken: string\n fromType: string\n previewId: string\n mfaCode?: string | null\n}\n\nexport interface MeshExecuteTransferRequestProxy\n extends Omit<MeshExecuteTransferRequest, 'fromAuthToken' | 'fromType'> {\n deviceId: string\n brokerType: string\n}\n\n// Reference: https://docs.meshconnect.com/reference/post_api-v1-transfers-managed-execute\nexport enum MeshExecuteTransferStatus {\n succeeded = 'succeeded',\n failed = 'failed',\n mfaRequired = 'mfaRequired',\n emailConfirmationRequired = 'emailConfirmationRequired',\n emailConfirmationApprovalRequired = 'emailConfirmationApprovalRequired',\n deviceConfirmationRequired = 'deviceConfirmationRequired',\n mfaFailed = 'mfaFailed',\n addressWhitelistRequired = 'addressWhitelistRequired',\n secondMfaRequired = 'secondMfaRequired',\n}\n\nexport enum MeshExecuteTransferMfaType {\n unspecified = 'unspecified',\n phone = 'phone',\n email = 'email',\n totp = 'totp',\n face = 'face',\n tradingPin = 'tradingPin',\n mobile = 'mobile',\n}\n\nexport interface MeshExecuteTransferResponse {\n status: MeshExecuteTransferStatus\n mfaType?: MeshExecuteTransferMfaType\n verificationSteps?: MeshExecuteTransferMfaType[]\n errorMessage: string | null\n executeTransferResult: object | null\n}\n\nexport interface MeshCryptoCurrencyPosition {\n symbol: string\n amount: number\n}\n\n// the real response is flat, ie. the data we're really interested in are not in a `content` field but directly in the response root, that's why we're omitting the `content` field here and merging it with the root to be flat\nexport interface GetCryptocurrencyHoldingsResponse {\n cryptocurrencyPositions: MeshCryptoCurrencyPosition[]\n}\n\nexport interface MeshProxyUnauthorizedResponse {\n error: string\n}\n\n/*\nhttps://docs.meshconnect.com/api-reference/managed-transfers/preview-transfer\n */\nexport interface PreviewTransferResponse {\n /** The status of the operation. */\n status: 'succeeded' | 'failed' | 'requiresFunding'\n /** Error message, if the operation did not complete successfully. */\n errorMessage: string | null\n /** Result of the preview. */\n previewResult: PreviewTransferResult | null\n transferBalanceFundingAvailability: TransferBalanceFundingAvailability | null\n}\n\nexport interface PreviewTransferResult {\n previewId: string\n previewExpiresIn: number\n fromAddress: string | null\n toAddress: string | null\n addressTag: string | null\n symbol: string | null\n amount: number\n amountInFiat: number\n totalEstimatedAmount: number\n totalEstimatedAmountInFiat: number\n networkId: string\n networkName: string | null\n contractAddress: string | null\n institutionTransferFee: TransferFee | null\n estimatedNetworkGasFee: TransferFee | null\n decimalPlaces: number | null\n unitPrice: number\n clientTransactionId: string | null\n clientFee: number | null\n customClientFee: TransferFee | null\n processingFeeRetainMethod: ProcessingFeeRetainMethod | null\n transferType: TransferTypeEnum | null\n isCustomClientFeeProvided: boolean\n amountWithCustomClientFee: number\n isFeeIncluded: boolean\n amountToReceive: number\n amountToReceiveInFiat: number\n transferAmountToRequest: number\n}\n\nexport interface TransferFee {\n fee: number\n feeCurrency: string | null\n feeInFiat: number\n}\n\nexport interface ProcessingFeeRetainMethod {\n type: 'default' | 'smartDeposit'\n processingFeeAddress: string | null\n}\n\nexport type TransferTypeEnum = 'deposit' | 'payment' | 'onramp'\n\nexport interface TransferBalanceFundingAvailability {\n status:\n | 'disabled'\n | 'available'\n | 'requiresAmountLowering'\n | 'notApplicable'\n | 'unavailable'\n transferTotalAmount: number\n unitPrice: number\n gasFeeBuffer: TransferFee | null\n symbol: string | null\n transferTotalAmountInFiat: number\n}\n", "import { ErrorCode, InternalFailureError } from '@funkit/utils'\nimport { API_BASE_URL } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n GetMoonpayBuyQuoteForCreditCardRequest,\n GetMoonpayBuyQuoteForCreditCardResponse,\n GetMoonpayUrlSignatureRequest,\n} from './types'\n\ninterface GetMoonpayUrlSignatureResponse {\n url: string\n}\n\nexport async function getMoonpayUrlSignature({\n url,\n isSandbox,\n ...options\n}: GetMoonpayUrlSignatureRequest): Promise<string> {\n const signature = await sendPostRequest<GetMoonpayUrlSignatureResponse>({\n uri: `${API_BASE_URL}/on-ramp/moonpay-signature/`,\n body: { url, isSandbox },\n ...options,\n })\n if (!signature || !signature?.url) {\n throw new InternalFailureError(\n ErrorCode.UnknownServerError,\n 'No onramp url found.',\n '',\n { url },\n 'This is an internal error, please contact support.',\n 'https://docs.fun.xyz',\n )\n }\n return signature.url\n}\n\nexport async function getMoonpayBuyQuoteForCreditCard({\n currencyCode,\n baseCurrencyCode,\n quoteCurrencyAmount,\n baseCurrencyAmount,\n extraFeePercentage,\n areFeesIncluded,\n ...options\n}: GetMoonpayBuyQuoteForCreditCardRequest): Promise<GetMoonpayBuyQuoteForCreditCardResponse> {\n const params = new URLSearchParams({\n currencyCode,\n baseCurrencyCode,\n quoteCurrencyAmount,\n paymentMethod: 'credit_debit_card',\n ...(baseCurrencyAmount == null\n ? {}\n : { baseCurrencyAmount: baseCurrencyAmount.toString() }),\n ...(extraFeePercentage == null\n ? {}\n : { extraFeePercentage: extraFeePercentage.toString() }),\n ...(areFeesIncluded == null\n ? {}\n : { areFeesIncluded: areFeesIncluded.toString() }),\n }).toString()\n\n return sendGetRequest({\n uri: `${API_BASE_URL}/on-ramp/moonpay-buy-quote?${params}`,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n}\n", "import { API_BASE_URL, type BaseApiRequest } from '../../consts'\nimport { sendGetRequest, sendPostRequest } from '../../utils'\nimport type {\n CreateStripeBuySessionBody,\n CreateStripeBuySessionResponse,\n GetStripeBuyQuoteRequest,\n GetStripeBuyQuoteResponse,\n} from './types'\n\nexport async function getStripeBuyQuote({\n sourceCurrency,\n destinationAmount,\n destinationCurrency,\n destinationNetwork,\n isSandbox,\n ...options\n}: GetStripeBuyQuoteRequest): Promise<GetStripeBuyQuoteResponse> {\n const params = new URLSearchParams({\n isSandbox: isSandbox.toString(),\n sourceCurrency,\n destinationAmount: destinationAmount.toString(),\n // Only allow one currency in this SDK\n destinationCurrencies: destinationCurrency,\n // Only allow one network in this SDK\n destinationNetworks: destinationNetwork,\n }).toString()\n const buyQuoteResp = await sendGetRequest({\n uri: `${API_BASE_URL}/on-ramp/stripe-buy-quote?${params}`,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return buyQuoteResp as GetStripeBuyQuoteResponse\n}\n\nexport async function createStripeBuySession({\n sourceCurrency,\n destinationAmount,\n destinationCurrency,\n destinationNetwork,\n walletAddress,\n customerIpAddress,\n isSandbox,\n ...options\n}: CreateStripeBuySessionBody): Promise<CreateStripeBuySessionResponse> {\n const body = {\n isSandbox: isSandbox.toString(),\n sourceCurrency,\n destinationAmount: destinationAmount.toString(),\n // Only allow one currency in this SDK\n destinationCurrency,\n destinationCurrencies: [destinationCurrency],\n // Only allow one network in this SDK\n destinationNetwork,\n destinationNetworks: [destinationNetwork],\n // Only allow one wallet address in this SDK, and it must correspond to the destination network\n walletAddresses: {\n [destinationNetwork]: walletAddress,\n },\n ...(customerIpAddress ? { customerIpAddress } : {}),\n }\n const newBuySessionResp = await sendPostRequest({\n uri: `${API_BASE_URL}/on-ramp/stripe-checkout`,\n body,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return newBuySessionResp as CreateStripeBuySessionResponse\n}\n\nexport async function getStripeBuySession({\n sessionId,\n ...options\n}: BaseApiRequest & {\n sessionId: string\n}): Promise<CreateStripeBuySessionResponse> {\n const buySessionResp = await sendGetRequest({\n uri: `${API_BASE_URL}/on-ramp/stripe-checkout-session/${sessionId}`,\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return buySessionResp as CreateStripeBuySessionResponse\n}\n", "import { API_BASE_URL } from '../../consts'\nimport { sendPostRequest } from '../../utils'\nimport type { SendSupportMessageRequest } from './types'\n\nexport async function sendSupportMessage({\n title,\n description,\n userEmail,\n ...options\n}: SendSupportMessageRequest): Promise<boolean> {\n try {\n await sendPostRequest({\n uri: `${API_BASE_URL}/support/send-message`,\n body: { title, description, userEmail },\n retryOptions: { maxAttempts: 1 },\n ...options,\n })\n return true\n } catch (_err) {\n return false\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["InvalidParameterError", "ResourceNotFoundError", "UserOpFailureError", "ErrorCode", "ResourceNotFoundError", "CheckoutState", "CheckoutRefundState", "ResourceNotFoundError", "ErrorCode", "DirectExecutionType", "OperationStatus", "AuthType", "OperationType", "PaymasterType", "ResourceNotFoundError", "InvalidParameterError", "ResourceNotFoundError", "InvalidParameterError", "MeshExecuteTransferStatus", "MeshExecuteTransferMfaType", "ErrorCode", "InternalFailureError", "InternalFailureError", "ErrorCode"]
|
|
7
7
|
}
|
|
@@ -4,3 +4,4 @@ export declare const POLYMARKET_API_KEY = "Y53dikxXdT4E3afI1l8BMBSWgyhKvf65k6Dut
|
|
|
4
4
|
export declare const VERTEX_API_KEY = "OQXhzzkLHE2vHAK8nZBS76el5utuw3527RmnYn26";
|
|
5
5
|
export declare const OSTIUM_API_KEY = "SMbBD7DS9b3EPcyBVg4a8az1rRWR9xB068chHoUN";
|
|
6
6
|
export declare const DEV_API_KEY = "Z9SZaOwpmE40KX61mUKWm5hrpGh7WHVkaTvQJpQk";
|
|
7
|
+
export declare const BANKR_API_KEY = "vWe20Dfyui2ouvfOhtSTY3Czeo8lFdbo5xXQBALZ";
|
|
@@ -10,12 +10,11 @@ import { type CheckoutDeactivateParams, type CheckoutHistoryItem, type CheckoutI
|
|
|
10
10
|
* @param toTokenAddress The wanted asset for the checkout operation. This must be either a chain native token or an ERC-20, on the target chain.
|
|
11
11
|
* @param toTokenAmount The amount of wanted asset for the checkout operation in base units.
|
|
12
12
|
* @param toTokenDecimals The number of decimals for the toTokenAddress.
|
|
13
|
-
* @param expirationTimestampMs The amount of time (duration) from now before the checkout operation expires.
|
|
14
13
|
* @param apiKey A valid fun api key.
|
|
15
14
|
* @param signal AbortSignal to cancel the request when no longer needed
|
|
16
15
|
* @return {Promise<CheckoutCoreQuoteResponse>} The formatted quote object
|
|
17
16
|
*/
|
|
18
|
-
export declare function getCheckoutQuote({ fromChainId, fromTokenAddress, fromTokenDecimals, toChainId, toTokenAddress, toTokenDecimals, toTokenAmount,
|
|
17
|
+
export declare function getCheckoutQuote({ fromChainId, fromTokenAddress, fromTokenDecimals, toChainId, toTokenAddress, toTokenDecimals, toTokenAmount, sponsorInitialTransferGasLimit, recipientAddr, userId, ...options }: CheckoutQuoteParams): Promise<CheckoutQuoteResponse>;
|
|
19
18
|
/**
|
|
20
19
|
* Initializes a checkout
|
|
21
20
|
* @param userOp The checkout UserOp, signed.
|
|
@@ -7,6 +7,7 @@ export type CheckoutApiQuoteParams = {
|
|
|
7
7
|
toChainId: string;
|
|
8
8
|
toTokenAddress: Address;
|
|
9
9
|
toAmountBaseUnit: string;
|
|
10
|
+
/** @deprecated */
|
|
10
11
|
checkoutExpirationTimestampSeconds: string;
|
|
11
12
|
sponsorInitialTransferGasLimit: string;
|
|
12
13
|
userId: string;
|
|
@@ -16,7 +17,8 @@ export type CheckoutQuoteParams = BaseApiRequest & Omit<CheckoutApiQuoteParams,
|
|
|
16
17
|
fromTokenDecimals: number;
|
|
17
18
|
toTokenDecimals: number;
|
|
18
19
|
toTokenAmount: number;
|
|
19
|
-
|
|
20
|
+
/** @deprecated */
|
|
21
|
+
expirationTimestampMs?: number;
|
|
20
22
|
};
|
|
21
23
|
export type CheckoutApiQuoteResponse = {
|
|
22
24
|
quoteId: string;
|
|
@@ -74,6 +76,10 @@ export declare enum CheckoutState {
|
|
|
74
76
|
EXPIRED = "EXPIRED",
|
|
75
77
|
CANCELLED = "CANCELLED"
|
|
76
78
|
}
|
|
79
|
+
export declare const FROM_PROGRESS_CHECKOUT_STATES: CheckoutState[];
|
|
80
|
+
export declare const TO_PROGRESS_CHECKOUT_STATES: CheckoutState[];
|
|
81
|
+
export declare const IN_PROGRESS_CHECKOUT_STATES: CheckoutState[];
|
|
82
|
+
export declare const TERMINAL_CHECKOUT_STATES: CheckoutState[];
|
|
77
83
|
export declare enum CheckoutRefundState {
|
|
78
84
|
INITIATED = "INITIATED",
|
|
79
85
|
ERROR = "ERROR",
|
|
@@ -232,8 +238,8 @@ export interface ApiFunkitCheckoutConfig {
|
|
|
232
238
|
targetAssetAmount?: number;
|
|
233
239
|
/** The ticker information of the wanted asset for the checkout operation. e.g. USDC. **/
|
|
234
240
|
targetAssetTicker: string;
|
|
235
|
-
/** Timestamp (in milliseconds) after which the checkout should not be performed, and the funds will become rescuable. Min: 300000 (5 mins), Max: 3600000 (1 hour). **/
|
|
236
|
-
expirationTimestampMs
|
|
241
|
+
/** @deprecated Timestamp (in milliseconds) after which the checkout should not be performed, and the funds will become rescuable. Min: 300000 (5 mins), Max: 3600000 (1 hour). **/
|
|
242
|
+
expirationTimestampMs?: number;
|
|
237
243
|
/** Custom recipient address of the checkout. If specified, a different checkout flow will be executed. It is not recommended to set this unless the Fun.xyz team advises it. **/
|
|
238
244
|
customRecipient?: Address | string;
|
|
239
245
|
/** List of contract action params **/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DirectExecution, GetDirectExecutionByTxHashRequest, PostDirectExecutionRequest } from './types';
|
|
2
2
|
export declare function getDirectExecutionByTxHash({ txHash, apiKey, }: GetDirectExecutionByTxHashRequest): Promise<DirectExecution>;
|
|
3
|
-
export declare function createDirectExecution({ txHash, userId, recipientAddr, fromChainId, fromTokenAddress, toChainId, toTokenAddress, fromAmountBaseUnit, toAmountBaseUnit, estTotalUsd, sourceOfFund, clientMetadata, apiKey, }: PostDirectExecutionRequest): Promise<{
|
|
3
|
+
export declare function createDirectExecution({ txHash, userId, recipientAddr, fromChainId, fromTokenAddress, toChainId, toTokenAddress, fromAmountBaseUnit, toAmountBaseUnit, estTotalUsd, sourceOfFund, clientMetadata, apiKey, type, }: PostDirectExecutionRequest): Promise<{
|
|
4
4
|
txHash: DirectExecution['txHash'];
|
|
5
5
|
}>;
|
|
@@ -4,11 +4,16 @@ import type { ApiCheckoutClientMetadata } from '../checkout';
|
|
|
4
4
|
export interface GetDirectExecutionByTxHashRequest extends BaseApiRequest {
|
|
5
5
|
txHash: string;
|
|
6
6
|
}
|
|
7
|
+
export declare enum DirectExecutionType {
|
|
8
|
+
TEST_EXECUTION = "TEST_EXECUTION",// For UT purposes only, should never show up in prod table
|
|
9
|
+
VERTEX_DEPOSIT_COLLATERAL_WITH_REFERRAL = "VERTEX_DEPOSIT_COLLATERAL_WITH_REFERRAL"
|
|
10
|
+
}
|
|
7
11
|
export interface DirectExecution {
|
|
8
12
|
txHash: Hex;
|
|
9
13
|
customerId: string;
|
|
10
14
|
userId: string;
|
|
11
15
|
recipientAddr: Address;
|
|
16
|
+
type: DirectExecutionType;
|
|
12
17
|
fromChainId: string;
|
|
13
18
|
fromTokenAddress: Address;
|
|
14
19
|
toChainId: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@funkit/api-base",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Base API for Funkit",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@lifeomic/attempt": "^3.1.0",
|
|
13
13
|
"big.js": "^6.2.1",
|
|
14
|
-
"@funkit/utils": "1.0.
|
|
14
|
+
"@funkit/utils": "1.0.11"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@types/big.js": "^6.2.2",
|