@avalabs/fusion-sdk 0.2.0 → 0.4.0

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.
Files changed (35) hide show
  1. package/dist/_utils/math.cjs +1 -1
  2. package/dist/_utils/math.cjs.map +1 -1
  3. package/dist/_utils/math.js +1 -1
  4. package/dist/_utils/math.js.map +1 -1
  5. package/dist/errors.cjs +1 -1
  6. package/dist/errors.cjs.map +1 -1
  7. package/dist/errors.d.cts +2 -0
  8. package/dist/errors.d.ts +2 -0
  9. package/dist/errors.js +1 -1
  10. package/dist/errors.js.map +1 -1
  11. package/dist/transfer-manager.cjs +1 -1
  12. package/dist/transfer-manager.cjs.map +1 -1
  13. package/dist/transfer-manager.js +1 -1
  14. package/dist/transfer-manager.js.map +1 -1
  15. package/dist/transfer-service/markr/_handlers/analyze-support.cjs +1 -1
  16. package/dist/transfer-service/markr/_handlers/analyze-support.cjs.map +1 -1
  17. package/dist/transfer-service/markr/_handlers/analyze-support.js +1 -1
  18. package/dist/transfer-service/markr/_handlers/analyze-support.js.map +1 -1
  19. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs +1 -1
  20. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs.map +1 -1
  21. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js +1 -1
  22. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js.map +1 -1
  23. package/dist/transfer-service/markr/_schema.cjs +1 -1
  24. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  25. package/dist/transfer-service/markr/_schema.js +1 -1
  26. package/dist/transfer-service/markr/_schema.js.map +1 -1
  27. package/dist/transfer-service/markr/_utils.cjs +1 -1
  28. package/dist/transfer-service/markr/_utils.cjs.map +1 -1
  29. package/dist/transfer-service/markr/_utils.js +1 -1
  30. package/dist/transfer-service/markr/_utils.js.map +1 -1
  31. package/dist/transfer-service/markr/markr-service.cjs +1 -1
  32. package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
  33. package/dist/transfer-service/markr/markr-service.js +1 -1
  34. package/dist/transfer-service/markr/markr-service.js.map +1 -1
  35. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- function e({amountOut:e,assetOut:t,slippageBps:n}){if(!Number.isInteger(n))throw RangeError(`slippageBps must be an integer, got: ${n}`);if(n<0)throw RangeError(`slippageBps must be non-negative, got: ${n}`);let r=t.decimals,i=10n**BigInt(r);return e*(i-BigInt(n)*i/10000n)/i}exports.calculateMinimumAmountOut=e;
1
+ function e({amountOut:e,assetOut:t,slippageBps:n}){if(!Number.isInteger(n))throw RangeError(`slippageBps must be an integer, got: ${n}`);if(n<0)throw RangeError(`slippageBps must be non-negative, got: ${n}`);let r=t.decimals,i=10n**BigInt(r);return(e*(i-BigInt(n)*i/10000n)+i-1n)/i}exports.calculateMinimumAmountOut=e;
2
2
  //# sourceMappingURL=math.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.cjs","names":[],"sources":["../../src/_utils/math.ts"],"sourcesContent":["import type { Quote } from '../types/quote';\n\n/**\n * @internal\n *\n * Converts a number to a bigint representation based on the specified decimals.\n *\n * @param value - The number to convert.\n * @param decimals - The number of decimal places.\n * @returns The bigint representation of the number.\n *\n * @throws {RangeError} If decimals is negative.\n *\n * @example\n * ```ts\n * const bigIntValue = numberToBigInt(1.23, 6); // returns 1230000n\n * ```\n */\nexport function numberToBigInt(value: number, decimals: number): bigint {\n const factor = 10 ** decimals;\n\n return BigInt(Math.floor(value * factor));\n}\n\n/**\n * @internal\n *\n * Calculates the minimum acceptable amount out after accounting for slippage.\n *\n * @param quote - The quote object containing amountOut, assetOut, and slippageBps.\n * @returns The minimum acceptable amount out as a bigint.\n *\n * @throws {RangeError} If slippageBps is negative or not an integer.\n *\n * @example\n * ```ts\n * const minAmountOut = calculateMinimumAmountOut({\n * amountOut: 1_000_000n,\n * assetOut: { decimals: 6, ... },\n * slippageBps: 50, // 0.5%\n * }); // returns 995_000n\n * ```\n */\nexport function calculateMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n if (!Number.isInteger(slippageBps)) {\n throw new RangeError(`slippageBps must be an integer, got: ${slippageBps}`);\n }\n\n if (slippageBps < 0) {\n throw new RangeError(`slippageBps must be non-negative, got: ${slippageBps}`);\n }\n\n const decimals = assetOut.decimals;\n\n const factor = 10n ** BigInt(decimals);\n\n const slippageMultiplier = factor - (BigInt(slippageBps) * factor) / 10_000n;\n\n const minAmountOut = (amountOut * slippageMultiplier) / factor;\n\n return minAmountOut;\n}\n"],"mappings":"AA2CA,SAAgB,EAA0B,CACxC,YACA,WACA,eACgE,CAChE,GAAI,CAAC,OAAO,UAAU,EAAY,CAChC,MAAU,WAAW,wCAAwC,IAAc,CAG7E,GAAI,EAAc,EAChB,MAAU,WAAW,0CAA0C,IAAc,CAG/E,IAAM,EAAW,EAAS,SAEpB,EAAS,KAAO,OAAO,EAAS,CAMtC,OAFsB,GAFK,EAAU,OAAO,EAAY,CAAG,EAAU,QAEb"}
1
+ {"version":3,"file":"math.cjs","names":[],"sources":["../../src/_utils/math.ts"],"sourcesContent":["import type { Quote } from '../types/quote';\n\n/**\n * @internal\n *\n * Converts a number to a bigint representation based on the specified decimals.\n *\n * @param value - The number to convert.\n * @param decimals - The number of decimal places.\n * @returns The bigint representation of the number.\n *\n * @throws {RangeError} If decimals is negative.\n *\n * @example\n * ```ts\n * const bigIntValue = numberToBigInt(1.23, 6); // returns 1230000n\n * ```\n */\nexport function numberToBigInt(value: number, decimals: number): bigint {\n const factor = 10 ** decimals;\n\n return BigInt(Math.floor(value * factor));\n}\n\n/**\n * @internal\n *\n * Calculates the minimum acceptable amount out after accounting for slippage.\n * Uses ceil division so very small amounts are not undercut by truncation.\n *\n * @param quote - The quote object containing amountOut, assetOut, and slippageBps.\n * @returns The minimum acceptable amount out as a bigint.\n *\n * @throws {RangeError} If slippageBps is negative or not an integer.\n *\n * @example\n * ```ts\n * const minAmountOut = calculateMinimumAmountOut({\n * amountOut: 1_000_000n,\n * assetOut: { decimals: 6, ... },\n * slippageBps: 50, // 0.5%\n * }); // returns 995_000n\n * ```\n */\nexport function calculateMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n if (!Number.isInteger(slippageBps)) {\n throw new RangeError(`slippageBps must be an integer, got: ${slippageBps}`);\n }\n\n if (slippageBps < 0) {\n throw new RangeError(`slippageBps must be non-negative, got: ${slippageBps}`);\n }\n\n const decimals = assetOut.decimals;\n\n const factor = 10n ** BigInt(decimals);\n\n const slippageMultiplier = factor - (BigInt(slippageBps) * factor) / 10_000n;\n\n const minAmountOut = (amountOut * slippageMultiplier + factor - 1n) / factor;\n\n return minAmountOut;\n}\n"],"mappings":"AA4CA,SAAgB,EAA0B,CACxC,YACA,WACA,eACgE,CAChE,GAAI,CAAC,OAAO,UAAU,EAAY,CAChC,MAAU,WAAW,wCAAwC,IAAc,CAG7E,GAAI,EAAc,EAChB,MAAU,WAAW,0CAA0C,IAAc,CAG/E,IAAM,EAAW,EAAS,SAEpB,EAAS,KAAO,OAAO,EAAS,CAMtC,OAFsB,GAFK,EAAU,OAAO,EAAY,CAAG,EAAU,QAEd,EAAS,IAAM"}
@@ -1,2 +1,2 @@
1
- function e({amountOut:e,assetOut:t,slippageBps:n}){if(!Number.isInteger(n))throw RangeError(`slippageBps must be an integer, got: ${n}`);if(n<0)throw RangeError(`slippageBps must be non-negative, got: ${n}`);let r=t.decimals,i=10n**BigInt(r);return e*(i-BigInt(n)*i/10000n)/i}export{e as calculateMinimumAmountOut};
1
+ function e({amountOut:e,assetOut:t,slippageBps:n}){if(!Number.isInteger(n))throw RangeError(`slippageBps must be an integer, got: ${n}`);if(n<0)throw RangeError(`slippageBps must be non-negative, got: ${n}`);let r=t.decimals,i=10n**BigInt(r);return(e*(i-BigInt(n)*i/10000n)+i-1n)/i}export{e as calculateMinimumAmountOut};
2
2
  //# sourceMappingURL=math.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","names":[],"sources":["../../src/_utils/math.ts"],"sourcesContent":["import type { Quote } from '../types/quote';\n\n/**\n * @internal\n *\n * Converts a number to a bigint representation based on the specified decimals.\n *\n * @param value - The number to convert.\n * @param decimals - The number of decimal places.\n * @returns The bigint representation of the number.\n *\n * @throws {RangeError} If decimals is negative.\n *\n * @example\n * ```ts\n * const bigIntValue = numberToBigInt(1.23, 6); // returns 1230000n\n * ```\n */\nexport function numberToBigInt(value: number, decimals: number): bigint {\n const factor = 10 ** decimals;\n\n return BigInt(Math.floor(value * factor));\n}\n\n/**\n * @internal\n *\n * Calculates the minimum acceptable amount out after accounting for slippage.\n *\n * @param quote - The quote object containing amountOut, assetOut, and slippageBps.\n * @returns The minimum acceptable amount out as a bigint.\n *\n * @throws {RangeError} If slippageBps is negative or not an integer.\n *\n * @example\n * ```ts\n * const minAmountOut = calculateMinimumAmountOut({\n * amountOut: 1_000_000n,\n * assetOut: { decimals: 6, ... },\n * slippageBps: 50, // 0.5%\n * }); // returns 995_000n\n * ```\n */\nexport function calculateMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n if (!Number.isInteger(slippageBps)) {\n throw new RangeError(`slippageBps must be an integer, got: ${slippageBps}`);\n }\n\n if (slippageBps < 0) {\n throw new RangeError(`slippageBps must be non-negative, got: ${slippageBps}`);\n }\n\n const decimals = assetOut.decimals;\n\n const factor = 10n ** BigInt(decimals);\n\n const slippageMultiplier = factor - (BigInt(slippageBps) * factor) / 10_000n;\n\n const minAmountOut = (amountOut * slippageMultiplier) / factor;\n\n return minAmountOut;\n}\n"],"mappings":"AA2CA,SAAgB,EAA0B,CACxC,YACA,WACA,eACgE,CAChE,GAAI,CAAC,OAAO,UAAU,EAAY,CAChC,MAAU,WAAW,wCAAwC,IAAc,CAG7E,GAAI,EAAc,EAChB,MAAU,WAAW,0CAA0C,IAAc,CAG/E,IAAM,EAAW,EAAS,SAEpB,EAAS,KAAO,OAAO,EAAS,CAMtC,OAFsB,GAFK,EAAU,OAAO,EAAY,CAAG,EAAU,QAEb"}
1
+ {"version":3,"file":"math.js","names":[],"sources":["../../src/_utils/math.ts"],"sourcesContent":["import type { Quote } from '../types/quote';\n\n/**\n * @internal\n *\n * Converts a number to a bigint representation based on the specified decimals.\n *\n * @param value - The number to convert.\n * @param decimals - The number of decimal places.\n * @returns The bigint representation of the number.\n *\n * @throws {RangeError} If decimals is negative.\n *\n * @example\n * ```ts\n * const bigIntValue = numberToBigInt(1.23, 6); // returns 1230000n\n * ```\n */\nexport function numberToBigInt(value: number, decimals: number): bigint {\n const factor = 10 ** decimals;\n\n return BigInt(Math.floor(value * factor));\n}\n\n/**\n * @internal\n *\n * Calculates the minimum acceptable amount out after accounting for slippage.\n * Uses ceil division so very small amounts are not undercut by truncation.\n *\n * @param quote - The quote object containing amountOut, assetOut, and slippageBps.\n * @returns The minimum acceptable amount out as a bigint.\n *\n * @throws {RangeError} If slippageBps is negative or not an integer.\n *\n * @example\n * ```ts\n * const minAmountOut = calculateMinimumAmountOut({\n * amountOut: 1_000_000n,\n * assetOut: { decimals: 6, ... },\n * slippageBps: 50, // 0.5%\n * }); // returns 995_000n\n * ```\n */\nexport function calculateMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n if (!Number.isInteger(slippageBps)) {\n throw new RangeError(`slippageBps must be an integer, got: ${slippageBps}`);\n }\n\n if (slippageBps < 0) {\n throw new RangeError(`slippageBps must be non-negative, got: ${slippageBps}`);\n }\n\n const decimals = assetOut.decimals;\n\n const factor = 10n ** BigInt(decimals);\n\n const slippageMultiplier = factor - (BigInt(slippageBps) * factor) / 10_000n;\n\n const minAmountOut = (amountOut * slippageMultiplier + factor - 1n) / factor;\n\n return minAmountOut;\n}\n"],"mappings":"AA4CA,SAAgB,EAA0B,CACxC,YACA,WACA,eACgE,CAChE,GAAI,CAAC,OAAO,UAAU,EAAY,CAChC,MAAU,WAAW,wCAAwC,IAAc,CAG7E,GAAI,EAAc,EAChB,MAAU,WAAW,0CAA0C,IAAc,CAG/E,IAAM,EAAW,EAAS,SAEpB,EAAS,KAAO,OAAO,EAAS,CAMtC,OAFsB,GAFK,EAAU,OAAO,EAAY,CAAG,EAAU,QAEd,EAAS,IAAM"}
package/dist/errors.cjs CHANGED
@@ -1,2 +1,2 @@
1
- let e=function(e){return e[e.NOT_IMPLEMENTED=5e3]=`NOT_IMPLEMENTED`,e[e.SERVICE_NOT_AVAILABLE=5001]=`SERVICE_NOT_AVAILABLE`,e[e.INITIALIZATION_FAILED=5002]=`INITIALIZATION_FAILED`,e[e.INVALID_PARAMS=5003]=`INVALID_PARAMS`,e[e.TIMEOUT=5004]=`TIMEOUT`,e[e.VIEM_ERROR=5005]=`VIEM_ERROR`,e[e.TRANSACTION_REVERTED=5006]=`TRANSACTION_REVERTED`,e[e.NOTARIZATION_FAILED=5007]=`NOTARIZATION_FAILED`,e[e.SIGNING_FAILED=5008]=`SIGNING_FAILED`,e[e.SOLANA_ERROR=5009]=`SOLANA_ERROR`,e[e.UNKNOWN=5999]=`UNKNOWN`,e}({}),t=function(e){return e.ASSET_NOT_SUPPORTED=`ASSET_NOT_SUPPORTED`,e.CHAIN_NOT_SUPPORTED=`CHAIN_NOT_SUPPORTED`,e.CONFIG_NOT_AVAILABLE=`CONFIG_NOT_AVAILABLE`,e.CONFIRMATION_COUNT_UNKNOWN=`CONFIRMATION_COUNT_UNKNOWN`,e.DUPLICATE_SERVICE_INITIALIZATION=`DUPLICATE_SERVICE_INITIALIZATION`,e.ENVIRONMENT_NOT_SUPPORTED=`ENVIRONMENT_NOT_SUPPORTED`,e.IDENTICAL_CHAINS_PROVIDED=`IDENTICAL_CHAINS_PROVIDED`,e.INCORRECT_ADDRESS_PROVIDED=`INCORRECT_ADDRESS_PROVIDED`,e.INCORRECT_AMOUNT_PROVIDED=`INCORRECT_AMOUNT_PROVIDED`,e.INCORRECT_HASH_PROVIDED=`INCORRECT_HASH_PROVIDED`,e.INCORRECT_PROVIDER_PROVIDED=`INCORRECT_PROVIDER_PROVIDED`,e.INCORRECT_SIGNER_PROVIDED=`INCORRECT_SIGNER_PROVIDED`,e.INCORRECT_TXHASH_PROVIDED=`INCORRECT_TXHASH_PROVIDED`,e.INVALID_PARAMS=`INVALID_PARAMS`,e.SERVICE_TYPE_NOT_CONFIGURED=`SERVICE_TYPE_NOT_CONFIGURED`,e.UNKNOWN=`UNKNOWN`,e.VULNERABLE_TOKEN_APPROVAL_ADDRESS=`VULNERABLE_TOKEN_APPROVAL_ADDRESS`,e.WARDEN_CONFIG_MISMATCH=`WARDEN_CONFIG_MISMATCH`,e.WARDEN_CONFIG_MISSING_NETWORK=`WARDEN_CONFIG_MISSING_NETWORK`,e.ADDRESS_IS_BLOCKED=`ADDRESS_IS_BLOCKED`,e.QUOTE_EXPIRED=`QUOTE_EXPIRED`,e}({});var n=class extends Error{name=`SdkError`;constructor(e,t,n){super(e,{cause:n?.cause}),this.code=t,this.options=n}};function r(e){return e instanceof n}var i=class extends Error{name=`HttpError`;status;statusText;response;data;constructor(e,t,n){super(e),this.name=`HttpError`,this.status=t.status,this.statusText=t.statusText,this.response=t,this.data=n}};function a(e){return e instanceof i}var o=class extends Error{name=`TimeoutError`;constructor(e=`Request timed out.`){super(e),this.name=`TimeoutError`}};function s(e){return e instanceof o}var c=class extends Error{name=`AbortedError`;constructor(e=`Operation was aborted.`){super(e),this.name=`AbortedError`}};function l(e){return e instanceof c}var u=class extends Error{name=`ResponseValidationError`;issues;rawResponse;constructor(e=`Response validation failed.`,t,n){super(e),this.name=`ResponseValidationError`,this.issues=t,this.rawResponse=n}};function d(e){return e instanceof u}var f=class extends n{name=`ServiceInitializationError`;constructor(n=t.UNKNOWN,r,i){super(n,e.INITIALIZATION_FAILED,{cause:i,details:r})}};function p(e){return e instanceof f}var m=class extends n{name=`ServiceUnavailableError`;constructor(n=t.UNKNOWN,r){super(n,e.SERVICE_NOT_AVAILABLE,{details:r})}};function h(e){return e instanceof m}var g=class extends n{name=`InvalidParamsError`;constructor(n=t.INVALID_PARAMS,r){super(n,e.INVALID_PARAMS,{details:r})}};function _(e){return e instanceof g}exports.AbortedError=c,exports.ErrorCode=e,exports.ErrorReason=t,exports.HttpError=i,exports.InvalidParamsError=g,exports.ResponseValidationError=u,exports.SdkError=n,exports.ServiceInitializationError=f,exports.ServiceUnavailableError=m,exports.TimeoutError=o,exports.isAbortedError=l,exports.isHttpError=a,exports.isInvalidParamsError=_,exports.isResponseValidationError=d,exports.isSdkError=r,exports.isServiceInitializationError=p,exports.isServiceUnavailableError=h,exports.isTimeoutError=s;
1
+ let e=function(e){return e[e.NOT_IMPLEMENTED=5e3]=`NOT_IMPLEMENTED`,e[e.SERVICE_NOT_AVAILABLE=5001]=`SERVICE_NOT_AVAILABLE`,e[e.INITIALIZATION_FAILED=5002]=`INITIALIZATION_FAILED`,e[e.INVALID_PARAMS=5003]=`INVALID_PARAMS`,e[e.TIMEOUT=5004]=`TIMEOUT`,e[e.VIEM_ERROR=5005]=`VIEM_ERROR`,e[e.TRANSACTION_REVERTED=5006]=`TRANSACTION_REVERTED`,e[e.NOTARIZATION_FAILED=5007]=`NOTARIZATION_FAILED`,e[e.SIGNING_FAILED=5008]=`SIGNING_FAILED`,e[e.SOLANA_ERROR=5009]=`SOLANA_ERROR`,e[e.UNKNOWN=5999]=`UNKNOWN`,e}({}),t=function(e){return e.ASSET_NOT_SUPPORTED=`ASSET_NOT_SUPPORTED`,e.CHAIN_NOT_SUPPORTED=`CHAIN_NOT_SUPPORTED`,e.CONFIG_NOT_AVAILABLE=`CONFIG_NOT_AVAILABLE`,e.CONFIRMATION_COUNT_UNKNOWN=`CONFIRMATION_COUNT_UNKNOWN`,e.DUPLICATE_SERVICE_INITIALIZATION=`DUPLICATE_SERVICE_INITIALIZATION`,e.ENVIRONMENT_NOT_SUPPORTED=`ENVIRONMENT_NOT_SUPPORTED`,e.IDENTICAL_CHAINS_PROVIDED=`IDENTICAL_CHAINS_PROVIDED`,e.INCORRECT_ADDRESS_PROVIDED=`INCORRECT_ADDRESS_PROVIDED`,e.INCORRECT_AMOUNT_PROVIDED=`INCORRECT_AMOUNT_PROVIDED`,e.INCORRECT_HASH_PROVIDED=`INCORRECT_HASH_PROVIDED`,e.INCORRECT_PROVIDER_PROVIDED=`INCORRECT_PROVIDER_PROVIDED`,e.INCORRECT_SIGNER_PROVIDED=`INCORRECT_SIGNER_PROVIDED`,e.INCORRECT_TXHASH_PROVIDED=`INCORRECT_TXHASH_PROVIDED`,e.INVALID_PARAMS=`INVALID_PARAMS`,e.SERVICE_TYPE_NOT_CONFIGURED=`SERVICE_TYPE_NOT_CONFIGURED`,e.UNKNOWN=`UNKNOWN`,e.VULNERABLE_TOKEN_APPROVAL_ADDRESS=`VULNERABLE_TOKEN_APPROVAL_ADDRESS`,e.WARDEN_CONFIG_MISMATCH=`WARDEN_CONFIG_MISMATCH`,e.WARDEN_CONFIG_MISSING_NETWORK=`WARDEN_CONFIG_MISSING_NETWORK`,e.ADDRESS_IS_BLOCKED=`ADDRESS_IS_BLOCKED`,e.QUOTE_EXPIRED=`QUOTE_EXPIRED`,e}({});var n=class extends Error{name=`SdkError`;constructor(e,t,n){super(e,{cause:n?.cause}),this.code=t,this.options=n}walk(e){return r(this,e)}};function r(e,t){return t?.(e)?e:e&&typeof e==`object`&&`cause`in e&&e.cause!==void 0?r(e.cause,t):t?null:e}function i(e){return e instanceof n}var a=class extends Error{name=`HttpError`;status;statusText;response;data;constructor(e,t,n){super(e),this.name=`HttpError`,this.status=t.status,this.statusText=t.statusText,this.response=t,this.data=n}};function o(e){return e instanceof a}var s=class extends Error{name=`TimeoutError`;constructor(e=`Request timed out.`){super(e),this.name=`TimeoutError`}};function c(e){return e instanceof s}var l=class extends Error{name=`AbortedError`;constructor(e=`Operation was aborted.`){super(e),this.name=`AbortedError`}};function u(e){return e instanceof l}var d=class extends Error{name=`ResponseValidationError`;issues;rawResponse;constructor(e=`Response validation failed.`,t,n){super(e),this.name=`ResponseValidationError`,this.issues=t,this.rawResponse=n}};function f(e){return e instanceof d}var p=class extends n{name=`ServiceInitializationError`;constructor(n=t.UNKNOWN,r,i){super(n,e.INITIALIZATION_FAILED,{cause:i,details:r})}};function m(e){return e instanceof p}var h=class extends n{name=`ServiceUnavailableError`;constructor(n=t.UNKNOWN,r){super(n,e.SERVICE_NOT_AVAILABLE,{details:r})}};function g(e){return e instanceof h}var _=class extends n{name=`InvalidParamsError`;constructor(n=t.INVALID_PARAMS,r){super(n,e.INVALID_PARAMS,{details:r})}};function v(e){return e instanceof _}exports.AbortedError=l,exports.ErrorCode=e,exports.ErrorReason=t,exports.HttpError=a,exports.InvalidParamsError=_,exports.ResponseValidationError=d,exports.SdkError=n,exports.ServiceInitializationError=p,exports.ServiceUnavailableError=h,exports.TimeoutError=s,exports.isAbortedError=u,exports.isHttpError=o,exports.isInvalidParamsError=v,exports.isResponseValidationError=f,exports.isSdkError=i,exports.isServiceInitializationError=m,exports.isServiceUnavailableError=g,exports.isTimeoutError=c;
2
2
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export enum ErrorCode {\n NOT_IMPLEMENTED = 5_000,\n SERVICE_NOT_AVAILABLE = 5_001,\n INITIALIZATION_FAILED = 5_002,\n INVALID_PARAMS = 5_003,\n TIMEOUT = 5_004,\n VIEM_ERROR = 5_005,\n TRANSACTION_REVERTED = 5_006,\n NOTARIZATION_FAILED = 5_007,\n SIGNING_FAILED = 5_008,\n SOLANA_ERROR = 5_009,\n UNKNOWN = 5_999,\n}\n\nexport enum ErrorReason {\n /** the provided asset is not supported by the bridge */\n ASSET_NOT_SUPPORTED = 'ASSET_NOT_SUPPORTED',\n /** the provided source or target chain is not supported by the bridge */\n CHAIN_NOT_SUPPORTED = 'CHAIN_NOT_SUPPORTED',\n /** error while fetching or parsing the config */\n CONFIG_NOT_AVAILABLE = 'CONFIG_NOT_AVAILABLE',\n /** required confirmation count of the source or target chain is unknown */\n CONFIRMATION_COUNT_UNKNOWN = 'CONFIRMATION_COUNT_UNKNOWN',\n /** service is being initialized more than once */\n DUPLICATE_SERVICE_INITIALIZATION = 'DUPLICATE_SERVICE_INITIALIZATION',\n /** bridge does not support specified environment */\n ENVIRONMENT_NOT_SUPPORTED = 'ENVIRONMENT_NOT_SUPPORTED',\n /** provided source and target chains are the same */\n IDENTICAL_CHAINS_PROVIDED = 'IDENTICAL_CHAINS_PROVIDED',\n /** the sender or recipient address is incorrect */\n INCORRECT_ADDRESS_PROVIDED = 'INCORRECT_ADDRESS_PROVIDED',\n /** the transfer amount is incorrect (e.g.: lesser than or equal to zero) */\n INCORRECT_AMOUNT_PROVIDED = 'INCORRECT_AMOUNT_PROVIDED',\n /** the transaction is not hex */\n INCORRECT_HASH_PROVIDED = 'INCORRECT_HASH_PROVIDED',\n /** The provided provider is incorrect type (Provider VS BitcoinProvider) */\n INCORRECT_PROVIDER_PROVIDED = 'INCORRECT_PROVIDER_PROVIDED',\n /** The provided signer is incorrect type */\n INCORRECT_SIGNER_PROVIDED = 'INCORRECT_SIGNER_PROVIDED',\n /** the sourceTxHash or targetTxHash is incorrect */\n INCORRECT_TXHASH_PROVIDED = 'INCORRECT_TXHASH_PROVIDED',\n /** generic error with the params */\n INVALID_PARAMS = 'INVALID_PARAMS',\n /** ServiceType requested not available */\n SERVICE_TYPE_NOT_CONFIGURED = 'SERVICE_TYPE_NOT_CONFIGURED',\n /** generic, not specified error */\n UNKNOWN = 'UNKNOWN',\n /** error when the address has token approvals for addresses involved in the multichain incident */\n VULNERABLE_TOKEN_APPROVAL_ADDRESS = 'VULNERABLE_TOKEN_APPROVAL_ADDRESS',\n /** error when warden config was not found or it is over the mismatch threshold */\n WARDEN_CONFIG_MISMATCH = 'WARDEN_CONFIG_MISMATCH',\n /** fetched warden config does not contain network IDs */\n WARDEN_CONFIG_MISSING_NETWORK = 'WARDEN_CONFIG_MISSING_NETWORK',\n /** address is blocked */\n ADDRESS_IS_BLOCKED = 'ADDRESS_IS_BLOCKED',\n /** Quote expired */\n QUOTE_EXPIRED = 'QUOTE_EXPIRED',\n}\n\nexport class SdkError extends Error {\n override name = 'SdkError';\n\n constructor(\n message: string,\n public code: ErrorCode,\n public options?: {\n cause?: unknown;\n details?: string;\n },\n ) {\n super(message, { cause: options?.cause });\n }\n}\n\nexport function isSdkError(error: unknown): error is SdkError {\n return error instanceof SdkError;\n}\n\nexport class HttpError extends Error {\n override name = 'HttpError';\n\n readonly status: number;\n readonly statusText: string;\n readonly response: Response;\n readonly data?: unknown;\n\n constructor(message: string, response: Response, data?: unknown) {\n super(message);\n this.name = 'HttpError';\n this.status = response.status;\n this.statusText = response.statusText;\n this.response = response;\n this.data = data;\n }\n}\n\nexport function isHttpError(error: unknown): error is HttpError {\n return error instanceof HttpError;\n}\n\nexport class TimeoutError extends Error {\n override name = 'TimeoutError';\n\n constructor(message = 'Request timed out.') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError;\n}\n\nexport class AbortedError extends Error {\n override name = 'AbortedError';\n\n constructor(message = 'Operation was aborted.') {\n super(message);\n this.name = 'AbortedError';\n }\n}\n\nexport function isAbortedError(error: unknown): error is AbortedError {\n return error instanceof AbortedError;\n}\n\nexport class ResponseValidationError extends Error {\n override name = 'ResponseValidationError';\n\n readonly issues?: unknown;\n readonly rawResponse?: unknown;\n\n constructor(message = 'Response validation failed.', issues?: unknown, rawResponse?: unknown) {\n super(message);\n this.name = 'ResponseValidationError';\n this.issues = issues;\n this.rawResponse = rawResponse;\n }\n}\n\nexport function isResponseValidationError(error: unknown): error is ResponseValidationError {\n return error instanceof ResponseValidationError;\n}\n\nexport class ServiceInitializationError extends SdkError {\n override name = 'ServiceInitializationError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string, cause?: unknown) {\n super(message, ErrorCode.INITIALIZATION_FAILED, { cause, details });\n }\n}\n\nexport function isServiceInitializationError(error: unknown): error is ServiceInitializationError {\n return error instanceof ServiceInitializationError;\n}\n\nexport class ServiceUnavailableError extends SdkError {\n override name = 'ServiceUnavailableError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.SERVICE_NOT_AVAILABLE, { details });\n }\n}\n\nexport function isServiceUnavailableError(error: unknown): error is ServiceUnavailableError {\n return error instanceof ServiceUnavailableError;\n}\n\nexport class InvalidParamsError extends SdkError {\n override name = 'InvalidParamsError';\n\n constructor(message: string = ErrorReason.INVALID_PARAMS, details?: string) {\n super(message, ErrorCode.INVALID_PARAMS, { details });\n }\n}\n\nexport function isInvalidParamsError(error: unknown): error is InvalidParamsError {\n return error instanceof InvalidParamsError;\n}\n\n/**\n * @internal\n *\n * Error to indicate that a functionality has not yet been implemented.\n * Do not export from entrypoint.\n */\nexport class NotImplementedError extends SdkError {\n constructor() {\n super('This functionality is not yet implemented.', ErrorCode.NOT_IMPLEMENTED);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export enum ErrorCode {\n NOT_IMPLEMENTED = 5_000,\n SERVICE_NOT_AVAILABLE = 5_001,\n INITIALIZATION_FAILED = 5_002,\n INVALID_PARAMS = 5_003,\n TIMEOUT = 5_004,\n VIEM_ERROR = 5_005,\n TRANSACTION_REVERTED = 5_006,\n NOTARIZATION_FAILED = 5_007,\n SIGNING_FAILED = 5_008,\n SOLANA_ERROR = 5_009,\n UNKNOWN = 5_999,\n}\n\nexport enum ErrorReason {\n /** the provided asset is not supported by the bridge */\n ASSET_NOT_SUPPORTED = 'ASSET_NOT_SUPPORTED',\n /** the provided source or target chain is not supported by the bridge */\n CHAIN_NOT_SUPPORTED = 'CHAIN_NOT_SUPPORTED',\n /** error while fetching or parsing the config */\n CONFIG_NOT_AVAILABLE = 'CONFIG_NOT_AVAILABLE',\n /** required confirmation count of the source or target chain is unknown */\n CONFIRMATION_COUNT_UNKNOWN = 'CONFIRMATION_COUNT_UNKNOWN',\n /** service is being initialized more than once */\n DUPLICATE_SERVICE_INITIALIZATION = 'DUPLICATE_SERVICE_INITIALIZATION',\n /** bridge does not support specified environment */\n ENVIRONMENT_NOT_SUPPORTED = 'ENVIRONMENT_NOT_SUPPORTED',\n /** provided source and target chains are the same */\n IDENTICAL_CHAINS_PROVIDED = 'IDENTICAL_CHAINS_PROVIDED',\n /** the sender or recipient address is incorrect */\n INCORRECT_ADDRESS_PROVIDED = 'INCORRECT_ADDRESS_PROVIDED',\n /** the transfer amount is incorrect (e.g.: lesser than or equal to zero) */\n INCORRECT_AMOUNT_PROVIDED = 'INCORRECT_AMOUNT_PROVIDED',\n /** the transaction is not hex */\n INCORRECT_HASH_PROVIDED = 'INCORRECT_HASH_PROVIDED',\n /** The provided provider is incorrect type (Provider VS BitcoinProvider) */\n INCORRECT_PROVIDER_PROVIDED = 'INCORRECT_PROVIDER_PROVIDED',\n /** The provided signer is incorrect type */\n INCORRECT_SIGNER_PROVIDED = 'INCORRECT_SIGNER_PROVIDED',\n /** the sourceTxHash or targetTxHash is incorrect */\n INCORRECT_TXHASH_PROVIDED = 'INCORRECT_TXHASH_PROVIDED',\n /** generic error with the params */\n INVALID_PARAMS = 'INVALID_PARAMS',\n /** ServiceType requested not available */\n SERVICE_TYPE_NOT_CONFIGURED = 'SERVICE_TYPE_NOT_CONFIGURED',\n /** generic, not specified error */\n UNKNOWN = 'UNKNOWN',\n /** error when the address has token approvals for addresses involved in the multichain incident */\n VULNERABLE_TOKEN_APPROVAL_ADDRESS = 'VULNERABLE_TOKEN_APPROVAL_ADDRESS',\n /** error when warden config was not found or it is over the mismatch threshold */\n WARDEN_CONFIG_MISMATCH = 'WARDEN_CONFIG_MISMATCH',\n /** fetched warden config does not contain network IDs */\n WARDEN_CONFIG_MISSING_NETWORK = 'WARDEN_CONFIG_MISSING_NETWORK',\n /** address is blocked */\n ADDRESS_IS_BLOCKED = 'ADDRESS_IS_BLOCKED',\n /** Quote expired */\n QUOTE_EXPIRED = 'QUOTE_EXPIRED',\n}\n\nexport class SdkError extends Error {\n override name = 'SdkError';\n\n constructor(\n message: string,\n public code: ErrorCode,\n public options?: {\n cause?: unknown;\n details?: string;\n },\n ) {\n super(message, { cause: options?.cause });\n }\n\n walk(): Error;\n walk(fn: (err: unknown) => boolean): Error | null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n walk(fn?: any): any {\n return walkError(this, fn);\n }\n}\n\nfunction walkError(err: unknown): unknown;\nfunction walkError(err: unknown, fn: (err: unknown) => boolean): unknown | null;\nfunction walkError(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown | null;\nfunction walkError(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown | null {\n if (fn?.(err)) {\n return err;\n }\n\n if (err && typeof err === 'object' && 'cause' in err && err.cause !== undefined) {\n return walkError(err.cause, fn);\n }\n\n return fn ? null : err;\n}\n\nexport function isSdkError(error: unknown): error is SdkError {\n return error instanceof SdkError;\n}\n\nexport class HttpError extends Error {\n override name = 'HttpError';\n\n readonly status: number;\n readonly statusText: string;\n readonly response: Response;\n readonly data?: unknown;\n\n constructor(message: string, response: Response, data?: unknown) {\n super(message);\n this.name = 'HttpError';\n this.status = response.status;\n this.statusText = response.statusText;\n this.response = response;\n this.data = data;\n }\n}\n\nexport function isHttpError(error: unknown): error is HttpError {\n return error instanceof HttpError;\n}\n\nexport class TimeoutError extends Error {\n override name = 'TimeoutError';\n\n constructor(message = 'Request timed out.') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError;\n}\n\nexport class AbortedError extends Error {\n override name = 'AbortedError';\n\n constructor(message = 'Operation was aborted.') {\n super(message);\n this.name = 'AbortedError';\n }\n}\n\nexport function isAbortedError(error: unknown): error is AbortedError {\n return error instanceof AbortedError;\n}\n\nexport class ResponseValidationError extends Error {\n override name = 'ResponseValidationError';\n\n readonly issues?: unknown;\n readonly rawResponse?: unknown;\n\n constructor(message = 'Response validation failed.', issues?: unknown, rawResponse?: unknown) {\n super(message);\n this.name = 'ResponseValidationError';\n this.issues = issues;\n this.rawResponse = rawResponse;\n }\n}\n\nexport function isResponseValidationError(error: unknown): error is ResponseValidationError {\n return error instanceof ResponseValidationError;\n}\n\nexport class ServiceInitializationError extends SdkError {\n override name = 'ServiceInitializationError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string, cause?: unknown) {\n super(message, ErrorCode.INITIALIZATION_FAILED, { cause, details });\n }\n}\n\nexport function isServiceInitializationError(error: unknown): error is ServiceInitializationError {\n return error instanceof ServiceInitializationError;\n}\n\nexport class ServiceUnavailableError extends SdkError {\n override name = 'ServiceUnavailableError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.SERVICE_NOT_AVAILABLE, { details });\n }\n}\n\nexport function isServiceUnavailableError(error: unknown): error is ServiceUnavailableError {\n return error instanceof ServiceUnavailableError;\n}\n\nexport class InvalidParamsError extends SdkError {\n override name = 'InvalidParamsError';\n\n constructor(message: string = ErrorReason.INVALID_PARAMS, details?: string) {\n super(message, ErrorCode.INVALID_PARAMS, { details });\n }\n}\n\nexport function isInvalidParamsError(error: unknown): error is InvalidParamsError {\n return error instanceof InvalidParamsError;\n}\n\n/**\n * @internal\n *\n * Error to indicate that a functionality has not yet been implemented.\n * Do not export from entrypoint.\n */\nexport class NotImplementedError extends SdkError {\n constructor() {\n super('This functionality is not yet implemented.', ErrorCode.NOT_IMPLEMENTED);\n }\n}\n"],"mappings":"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"}
package/dist/errors.d.cts CHANGED
@@ -67,6 +67,8 @@ declare class SdkError extends Error {
67
67
  cause?: unknown;
68
68
  details?: string;
69
69
  } | undefined);
70
+ walk(): Error;
71
+ walk(fn: (err: unknown) => boolean): Error | null;
70
72
  }
71
73
  declare function isSdkError(error: unknown): error is SdkError;
72
74
  declare class HttpError extends Error {
package/dist/errors.d.ts CHANGED
@@ -67,6 +67,8 @@ declare class SdkError extends Error {
67
67
  cause?: unknown;
68
68
  details?: string;
69
69
  } | undefined);
70
+ walk(): Error;
71
+ walk(fn: (err: unknown) => boolean): Error | null;
70
72
  }
71
73
  declare function isSdkError(error: unknown): error is SdkError;
72
74
  declare class HttpError extends Error {
package/dist/errors.js CHANGED
@@ -1,2 +1,2 @@
1
- let e=function(e){return e[e.NOT_IMPLEMENTED=5e3]=`NOT_IMPLEMENTED`,e[e.SERVICE_NOT_AVAILABLE=5001]=`SERVICE_NOT_AVAILABLE`,e[e.INITIALIZATION_FAILED=5002]=`INITIALIZATION_FAILED`,e[e.INVALID_PARAMS=5003]=`INVALID_PARAMS`,e[e.TIMEOUT=5004]=`TIMEOUT`,e[e.VIEM_ERROR=5005]=`VIEM_ERROR`,e[e.TRANSACTION_REVERTED=5006]=`TRANSACTION_REVERTED`,e[e.NOTARIZATION_FAILED=5007]=`NOTARIZATION_FAILED`,e[e.SIGNING_FAILED=5008]=`SIGNING_FAILED`,e[e.SOLANA_ERROR=5009]=`SOLANA_ERROR`,e[e.UNKNOWN=5999]=`UNKNOWN`,e}({}),t=function(e){return e.ASSET_NOT_SUPPORTED=`ASSET_NOT_SUPPORTED`,e.CHAIN_NOT_SUPPORTED=`CHAIN_NOT_SUPPORTED`,e.CONFIG_NOT_AVAILABLE=`CONFIG_NOT_AVAILABLE`,e.CONFIRMATION_COUNT_UNKNOWN=`CONFIRMATION_COUNT_UNKNOWN`,e.DUPLICATE_SERVICE_INITIALIZATION=`DUPLICATE_SERVICE_INITIALIZATION`,e.ENVIRONMENT_NOT_SUPPORTED=`ENVIRONMENT_NOT_SUPPORTED`,e.IDENTICAL_CHAINS_PROVIDED=`IDENTICAL_CHAINS_PROVIDED`,e.INCORRECT_ADDRESS_PROVIDED=`INCORRECT_ADDRESS_PROVIDED`,e.INCORRECT_AMOUNT_PROVIDED=`INCORRECT_AMOUNT_PROVIDED`,e.INCORRECT_HASH_PROVIDED=`INCORRECT_HASH_PROVIDED`,e.INCORRECT_PROVIDER_PROVIDED=`INCORRECT_PROVIDER_PROVIDED`,e.INCORRECT_SIGNER_PROVIDED=`INCORRECT_SIGNER_PROVIDED`,e.INCORRECT_TXHASH_PROVIDED=`INCORRECT_TXHASH_PROVIDED`,e.INVALID_PARAMS=`INVALID_PARAMS`,e.SERVICE_TYPE_NOT_CONFIGURED=`SERVICE_TYPE_NOT_CONFIGURED`,e.UNKNOWN=`UNKNOWN`,e.VULNERABLE_TOKEN_APPROVAL_ADDRESS=`VULNERABLE_TOKEN_APPROVAL_ADDRESS`,e.WARDEN_CONFIG_MISMATCH=`WARDEN_CONFIG_MISMATCH`,e.WARDEN_CONFIG_MISSING_NETWORK=`WARDEN_CONFIG_MISSING_NETWORK`,e.ADDRESS_IS_BLOCKED=`ADDRESS_IS_BLOCKED`,e.QUOTE_EXPIRED=`QUOTE_EXPIRED`,e}({});var n=class extends Error{name=`SdkError`;constructor(e,t,n){super(e,{cause:n?.cause}),this.code=t,this.options=n}};function r(e){return e instanceof n}var i=class extends Error{name=`HttpError`;status;statusText;response;data;constructor(e,t,n){super(e),this.name=`HttpError`,this.status=t.status,this.statusText=t.statusText,this.response=t,this.data=n}};function a(e){return e instanceof i}var o=class extends Error{name=`TimeoutError`;constructor(e=`Request timed out.`){super(e),this.name=`TimeoutError`}};function s(e){return e instanceof o}var c=class extends Error{name=`AbortedError`;constructor(e=`Operation was aborted.`){super(e),this.name=`AbortedError`}};function l(e){return e instanceof c}var u=class extends Error{name=`ResponseValidationError`;issues;rawResponse;constructor(e=`Response validation failed.`,t,n){super(e),this.name=`ResponseValidationError`,this.issues=t,this.rawResponse=n}};function d(e){return e instanceof u}var f=class extends n{name=`ServiceInitializationError`;constructor(n=t.UNKNOWN,r,i){super(n,e.INITIALIZATION_FAILED,{cause:i,details:r})}};function p(e){return e instanceof f}var m=class extends n{name=`ServiceUnavailableError`;constructor(n=t.UNKNOWN,r){super(n,e.SERVICE_NOT_AVAILABLE,{details:r})}};function h(e){return e instanceof m}var g=class extends n{name=`InvalidParamsError`;constructor(n=t.INVALID_PARAMS,r){super(n,e.INVALID_PARAMS,{details:r})}};function _(e){return e instanceof g}export{c as AbortedError,e as ErrorCode,t as ErrorReason,i as HttpError,g as InvalidParamsError,u as ResponseValidationError,n as SdkError,f as ServiceInitializationError,m as ServiceUnavailableError,o as TimeoutError,l as isAbortedError,a as isHttpError,_ as isInvalidParamsError,d as isResponseValidationError,r as isSdkError,p as isServiceInitializationError,h as isServiceUnavailableError,s as isTimeoutError};
1
+ let e=function(e){return e[e.NOT_IMPLEMENTED=5e3]=`NOT_IMPLEMENTED`,e[e.SERVICE_NOT_AVAILABLE=5001]=`SERVICE_NOT_AVAILABLE`,e[e.INITIALIZATION_FAILED=5002]=`INITIALIZATION_FAILED`,e[e.INVALID_PARAMS=5003]=`INVALID_PARAMS`,e[e.TIMEOUT=5004]=`TIMEOUT`,e[e.VIEM_ERROR=5005]=`VIEM_ERROR`,e[e.TRANSACTION_REVERTED=5006]=`TRANSACTION_REVERTED`,e[e.NOTARIZATION_FAILED=5007]=`NOTARIZATION_FAILED`,e[e.SIGNING_FAILED=5008]=`SIGNING_FAILED`,e[e.SOLANA_ERROR=5009]=`SOLANA_ERROR`,e[e.UNKNOWN=5999]=`UNKNOWN`,e}({}),t=function(e){return e.ASSET_NOT_SUPPORTED=`ASSET_NOT_SUPPORTED`,e.CHAIN_NOT_SUPPORTED=`CHAIN_NOT_SUPPORTED`,e.CONFIG_NOT_AVAILABLE=`CONFIG_NOT_AVAILABLE`,e.CONFIRMATION_COUNT_UNKNOWN=`CONFIRMATION_COUNT_UNKNOWN`,e.DUPLICATE_SERVICE_INITIALIZATION=`DUPLICATE_SERVICE_INITIALIZATION`,e.ENVIRONMENT_NOT_SUPPORTED=`ENVIRONMENT_NOT_SUPPORTED`,e.IDENTICAL_CHAINS_PROVIDED=`IDENTICAL_CHAINS_PROVIDED`,e.INCORRECT_ADDRESS_PROVIDED=`INCORRECT_ADDRESS_PROVIDED`,e.INCORRECT_AMOUNT_PROVIDED=`INCORRECT_AMOUNT_PROVIDED`,e.INCORRECT_HASH_PROVIDED=`INCORRECT_HASH_PROVIDED`,e.INCORRECT_PROVIDER_PROVIDED=`INCORRECT_PROVIDER_PROVIDED`,e.INCORRECT_SIGNER_PROVIDED=`INCORRECT_SIGNER_PROVIDED`,e.INCORRECT_TXHASH_PROVIDED=`INCORRECT_TXHASH_PROVIDED`,e.INVALID_PARAMS=`INVALID_PARAMS`,e.SERVICE_TYPE_NOT_CONFIGURED=`SERVICE_TYPE_NOT_CONFIGURED`,e.UNKNOWN=`UNKNOWN`,e.VULNERABLE_TOKEN_APPROVAL_ADDRESS=`VULNERABLE_TOKEN_APPROVAL_ADDRESS`,e.WARDEN_CONFIG_MISMATCH=`WARDEN_CONFIG_MISMATCH`,e.WARDEN_CONFIG_MISSING_NETWORK=`WARDEN_CONFIG_MISSING_NETWORK`,e.ADDRESS_IS_BLOCKED=`ADDRESS_IS_BLOCKED`,e.QUOTE_EXPIRED=`QUOTE_EXPIRED`,e}({});var n=class extends Error{name=`SdkError`;constructor(e,t,n){super(e,{cause:n?.cause}),this.code=t,this.options=n}walk(e){return r(this,e)}};function r(e,t){return t?.(e)?e:e&&typeof e==`object`&&`cause`in e&&e.cause!==void 0?r(e.cause,t):t?null:e}function i(e){return e instanceof n}var a=class extends Error{name=`HttpError`;status;statusText;response;data;constructor(e,t,n){super(e),this.name=`HttpError`,this.status=t.status,this.statusText=t.statusText,this.response=t,this.data=n}};function o(e){return e instanceof a}var s=class extends Error{name=`TimeoutError`;constructor(e=`Request timed out.`){super(e),this.name=`TimeoutError`}};function c(e){return e instanceof s}var l=class extends Error{name=`AbortedError`;constructor(e=`Operation was aborted.`){super(e),this.name=`AbortedError`}};function u(e){return e instanceof l}var d=class extends Error{name=`ResponseValidationError`;issues;rawResponse;constructor(e=`Response validation failed.`,t,n){super(e),this.name=`ResponseValidationError`,this.issues=t,this.rawResponse=n}};function f(e){return e instanceof d}var p=class extends n{name=`ServiceInitializationError`;constructor(n=t.UNKNOWN,r,i){super(n,e.INITIALIZATION_FAILED,{cause:i,details:r})}};function m(e){return e instanceof p}var h=class extends n{name=`ServiceUnavailableError`;constructor(n=t.UNKNOWN,r){super(n,e.SERVICE_NOT_AVAILABLE,{details:r})}};function g(e){return e instanceof h}var _=class extends n{name=`InvalidParamsError`;constructor(n=t.INVALID_PARAMS,r){super(n,e.INVALID_PARAMS,{details:r})}};function v(e){return e instanceof _}export{l as AbortedError,e as ErrorCode,t as ErrorReason,a as HttpError,_ as InvalidParamsError,d as ResponseValidationError,n as SdkError,p as ServiceInitializationError,h as ServiceUnavailableError,s as TimeoutError,u as isAbortedError,o as isHttpError,v as isInvalidParamsError,f as isResponseValidationError,i as isSdkError,m as isServiceInitializationError,g as isServiceUnavailableError,c as isTimeoutError};
2
2
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export enum ErrorCode {\n NOT_IMPLEMENTED = 5_000,\n SERVICE_NOT_AVAILABLE = 5_001,\n INITIALIZATION_FAILED = 5_002,\n INVALID_PARAMS = 5_003,\n TIMEOUT = 5_004,\n VIEM_ERROR = 5_005,\n TRANSACTION_REVERTED = 5_006,\n NOTARIZATION_FAILED = 5_007,\n SIGNING_FAILED = 5_008,\n SOLANA_ERROR = 5_009,\n UNKNOWN = 5_999,\n}\n\nexport enum ErrorReason {\n /** the provided asset is not supported by the bridge */\n ASSET_NOT_SUPPORTED = 'ASSET_NOT_SUPPORTED',\n /** the provided source or target chain is not supported by the bridge */\n CHAIN_NOT_SUPPORTED = 'CHAIN_NOT_SUPPORTED',\n /** error while fetching or parsing the config */\n CONFIG_NOT_AVAILABLE = 'CONFIG_NOT_AVAILABLE',\n /** required confirmation count of the source or target chain is unknown */\n CONFIRMATION_COUNT_UNKNOWN = 'CONFIRMATION_COUNT_UNKNOWN',\n /** service is being initialized more than once */\n DUPLICATE_SERVICE_INITIALIZATION = 'DUPLICATE_SERVICE_INITIALIZATION',\n /** bridge does not support specified environment */\n ENVIRONMENT_NOT_SUPPORTED = 'ENVIRONMENT_NOT_SUPPORTED',\n /** provided source and target chains are the same */\n IDENTICAL_CHAINS_PROVIDED = 'IDENTICAL_CHAINS_PROVIDED',\n /** the sender or recipient address is incorrect */\n INCORRECT_ADDRESS_PROVIDED = 'INCORRECT_ADDRESS_PROVIDED',\n /** the transfer amount is incorrect (e.g.: lesser than or equal to zero) */\n INCORRECT_AMOUNT_PROVIDED = 'INCORRECT_AMOUNT_PROVIDED',\n /** the transaction is not hex */\n INCORRECT_HASH_PROVIDED = 'INCORRECT_HASH_PROVIDED',\n /** The provided provider is incorrect type (Provider VS BitcoinProvider) */\n INCORRECT_PROVIDER_PROVIDED = 'INCORRECT_PROVIDER_PROVIDED',\n /** The provided signer is incorrect type */\n INCORRECT_SIGNER_PROVIDED = 'INCORRECT_SIGNER_PROVIDED',\n /** the sourceTxHash or targetTxHash is incorrect */\n INCORRECT_TXHASH_PROVIDED = 'INCORRECT_TXHASH_PROVIDED',\n /** generic error with the params */\n INVALID_PARAMS = 'INVALID_PARAMS',\n /** ServiceType requested not available */\n SERVICE_TYPE_NOT_CONFIGURED = 'SERVICE_TYPE_NOT_CONFIGURED',\n /** generic, not specified error */\n UNKNOWN = 'UNKNOWN',\n /** error when the address has token approvals for addresses involved in the multichain incident */\n VULNERABLE_TOKEN_APPROVAL_ADDRESS = 'VULNERABLE_TOKEN_APPROVAL_ADDRESS',\n /** error when warden config was not found or it is over the mismatch threshold */\n WARDEN_CONFIG_MISMATCH = 'WARDEN_CONFIG_MISMATCH',\n /** fetched warden config does not contain network IDs */\n WARDEN_CONFIG_MISSING_NETWORK = 'WARDEN_CONFIG_MISSING_NETWORK',\n /** address is blocked */\n ADDRESS_IS_BLOCKED = 'ADDRESS_IS_BLOCKED',\n /** Quote expired */\n QUOTE_EXPIRED = 'QUOTE_EXPIRED',\n}\n\nexport class SdkError extends Error {\n override name = 'SdkError';\n\n constructor(\n message: string,\n public code: ErrorCode,\n public options?: {\n cause?: unknown;\n details?: string;\n },\n ) {\n super(message, { cause: options?.cause });\n }\n}\n\nexport function isSdkError(error: unknown): error is SdkError {\n return error instanceof SdkError;\n}\n\nexport class HttpError extends Error {\n override name = 'HttpError';\n\n readonly status: number;\n readonly statusText: string;\n readonly response: Response;\n readonly data?: unknown;\n\n constructor(message: string, response: Response, data?: unknown) {\n super(message);\n this.name = 'HttpError';\n this.status = response.status;\n this.statusText = response.statusText;\n this.response = response;\n this.data = data;\n }\n}\n\nexport function isHttpError(error: unknown): error is HttpError {\n return error instanceof HttpError;\n}\n\nexport class TimeoutError extends Error {\n override name = 'TimeoutError';\n\n constructor(message = 'Request timed out.') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError;\n}\n\nexport class AbortedError extends Error {\n override name = 'AbortedError';\n\n constructor(message = 'Operation was aborted.') {\n super(message);\n this.name = 'AbortedError';\n }\n}\n\nexport function isAbortedError(error: unknown): error is AbortedError {\n return error instanceof AbortedError;\n}\n\nexport class ResponseValidationError extends Error {\n override name = 'ResponseValidationError';\n\n readonly issues?: unknown;\n readonly rawResponse?: unknown;\n\n constructor(message = 'Response validation failed.', issues?: unknown, rawResponse?: unknown) {\n super(message);\n this.name = 'ResponseValidationError';\n this.issues = issues;\n this.rawResponse = rawResponse;\n }\n}\n\nexport function isResponseValidationError(error: unknown): error is ResponseValidationError {\n return error instanceof ResponseValidationError;\n}\n\nexport class ServiceInitializationError extends SdkError {\n override name = 'ServiceInitializationError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string, cause?: unknown) {\n super(message, ErrorCode.INITIALIZATION_FAILED, { cause, details });\n }\n}\n\nexport function isServiceInitializationError(error: unknown): error is ServiceInitializationError {\n return error instanceof ServiceInitializationError;\n}\n\nexport class ServiceUnavailableError extends SdkError {\n override name = 'ServiceUnavailableError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.SERVICE_NOT_AVAILABLE, { details });\n }\n}\n\nexport function isServiceUnavailableError(error: unknown): error is ServiceUnavailableError {\n return error instanceof ServiceUnavailableError;\n}\n\nexport class InvalidParamsError extends SdkError {\n override name = 'InvalidParamsError';\n\n constructor(message: string = ErrorReason.INVALID_PARAMS, details?: string) {\n super(message, ErrorCode.INVALID_PARAMS, { details });\n }\n}\n\nexport function isInvalidParamsError(error: unknown): error is InvalidParamsError {\n return error instanceof InvalidParamsError;\n}\n\n/**\n * @internal\n *\n * Error to indicate that a functionality has not yet been implemented.\n * Do not export from entrypoint.\n */\nexport class NotImplementedError extends SdkError {\n constructor() {\n super('This functionality is not yet implemented.', ErrorCode.NOT_IMPLEMENTED);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export enum ErrorCode {\n NOT_IMPLEMENTED = 5_000,\n SERVICE_NOT_AVAILABLE = 5_001,\n INITIALIZATION_FAILED = 5_002,\n INVALID_PARAMS = 5_003,\n TIMEOUT = 5_004,\n VIEM_ERROR = 5_005,\n TRANSACTION_REVERTED = 5_006,\n NOTARIZATION_FAILED = 5_007,\n SIGNING_FAILED = 5_008,\n SOLANA_ERROR = 5_009,\n UNKNOWN = 5_999,\n}\n\nexport enum ErrorReason {\n /** the provided asset is not supported by the bridge */\n ASSET_NOT_SUPPORTED = 'ASSET_NOT_SUPPORTED',\n /** the provided source or target chain is not supported by the bridge */\n CHAIN_NOT_SUPPORTED = 'CHAIN_NOT_SUPPORTED',\n /** error while fetching or parsing the config */\n CONFIG_NOT_AVAILABLE = 'CONFIG_NOT_AVAILABLE',\n /** required confirmation count of the source or target chain is unknown */\n CONFIRMATION_COUNT_UNKNOWN = 'CONFIRMATION_COUNT_UNKNOWN',\n /** service is being initialized more than once */\n DUPLICATE_SERVICE_INITIALIZATION = 'DUPLICATE_SERVICE_INITIALIZATION',\n /** bridge does not support specified environment */\n ENVIRONMENT_NOT_SUPPORTED = 'ENVIRONMENT_NOT_SUPPORTED',\n /** provided source and target chains are the same */\n IDENTICAL_CHAINS_PROVIDED = 'IDENTICAL_CHAINS_PROVIDED',\n /** the sender or recipient address is incorrect */\n INCORRECT_ADDRESS_PROVIDED = 'INCORRECT_ADDRESS_PROVIDED',\n /** the transfer amount is incorrect (e.g.: lesser than or equal to zero) */\n INCORRECT_AMOUNT_PROVIDED = 'INCORRECT_AMOUNT_PROVIDED',\n /** the transaction is not hex */\n INCORRECT_HASH_PROVIDED = 'INCORRECT_HASH_PROVIDED',\n /** The provided provider is incorrect type (Provider VS BitcoinProvider) */\n INCORRECT_PROVIDER_PROVIDED = 'INCORRECT_PROVIDER_PROVIDED',\n /** The provided signer is incorrect type */\n INCORRECT_SIGNER_PROVIDED = 'INCORRECT_SIGNER_PROVIDED',\n /** the sourceTxHash or targetTxHash is incorrect */\n INCORRECT_TXHASH_PROVIDED = 'INCORRECT_TXHASH_PROVIDED',\n /** generic error with the params */\n INVALID_PARAMS = 'INVALID_PARAMS',\n /** ServiceType requested not available */\n SERVICE_TYPE_NOT_CONFIGURED = 'SERVICE_TYPE_NOT_CONFIGURED',\n /** generic, not specified error */\n UNKNOWN = 'UNKNOWN',\n /** error when the address has token approvals for addresses involved in the multichain incident */\n VULNERABLE_TOKEN_APPROVAL_ADDRESS = 'VULNERABLE_TOKEN_APPROVAL_ADDRESS',\n /** error when warden config was not found or it is over the mismatch threshold */\n WARDEN_CONFIG_MISMATCH = 'WARDEN_CONFIG_MISMATCH',\n /** fetched warden config does not contain network IDs */\n WARDEN_CONFIG_MISSING_NETWORK = 'WARDEN_CONFIG_MISSING_NETWORK',\n /** address is blocked */\n ADDRESS_IS_BLOCKED = 'ADDRESS_IS_BLOCKED',\n /** Quote expired */\n QUOTE_EXPIRED = 'QUOTE_EXPIRED',\n}\n\nexport class SdkError extends Error {\n override name = 'SdkError';\n\n constructor(\n message: string,\n public code: ErrorCode,\n public options?: {\n cause?: unknown;\n details?: string;\n },\n ) {\n super(message, { cause: options?.cause });\n }\n\n walk(): Error;\n walk(fn: (err: unknown) => boolean): Error | null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n walk(fn?: any): any {\n return walkError(this, fn);\n }\n}\n\nfunction walkError(err: unknown): unknown;\nfunction walkError(err: unknown, fn: (err: unknown) => boolean): unknown | null;\nfunction walkError(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown | null;\nfunction walkError(err: unknown, fn?: ((err: unknown) => boolean) | undefined): unknown | null {\n if (fn?.(err)) {\n return err;\n }\n\n if (err && typeof err === 'object' && 'cause' in err && err.cause !== undefined) {\n return walkError(err.cause, fn);\n }\n\n return fn ? null : err;\n}\n\nexport function isSdkError(error: unknown): error is SdkError {\n return error instanceof SdkError;\n}\n\nexport class HttpError extends Error {\n override name = 'HttpError';\n\n readonly status: number;\n readonly statusText: string;\n readonly response: Response;\n readonly data?: unknown;\n\n constructor(message: string, response: Response, data?: unknown) {\n super(message);\n this.name = 'HttpError';\n this.status = response.status;\n this.statusText = response.statusText;\n this.response = response;\n this.data = data;\n }\n}\n\nexport function isHttpError(error: unknown): error is HttpError {\n return error instanceof HttpError;\n}\n\nexport class TimeoutError extends Error {\n override name = 'TimeoutError';\n\n constructor(message = 'Request timed out.') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError;\n}\n\nexport class AbortedError extends Error {\n override name = 'AbortedError';\n\n constructor(message = 'Operation was aborted.') {\n super(message);\n this.name = 'AbortedError';\n }\n}\n\nexport function isAbortedError(error: unknown): error is AbortedError {\n return error instanceof AbortedError;\n}\n\nexport class ResponseValidationError extends Error {\n override name = 'ResponseValidationError';\n\n readonly issues?: unknown;\n readonly rawResponse?: unknown;\n\n constructor(message = 'Response validation failed.', issues?: unknown, rawResponse?: unknown) {\n super(message);\n this.name = 'ResponseValidationError';\n this.issues = issues;\n this.rawResponse = rawResponse;\n }\n}\n\nexport function isResponseValidationError(error: unknown): error is ResponseValidationError {\n return error instanceof ResponseValidationError;\n}\n\nexport class ServiceInitializationError extends SdkError {\n override name = 'ServiceInitializationError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string, cause?: unknown) {\n super(message, ErrorCode.INITIALIZATION_FAILED, { cause, details });\n }\n}\n\nexport function isServiceInitializationError(error: unknown): error is ServiceInitializationError {\n return error instanceof ServiceInitializationError;\n}\n\nexport class ServiceUnavailableError extends SdkError {\n override name = 'ServiceUnavailableError';\n\n constructor(message: string = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.SERVICE_NOT_AVAILABLE, { details });\n }\n}\n\nexport function isServiceUnavailableError(error: unknown): error is ServiceUnavailableError {\n return error instanceof ServiceUnavailableError;\n}\n\nexport class InvalidParamsError extends SdkError {\n override name = 'InvalidParamsError';\n\n constructor(message: string = ErrorReason.INVALID_PARAMS, details?: string) {\n super(message, ErrorCode.INVALID_PARAMS, { details });\n }\n}\n\nexport function isInvalidParamsError(error: unknown): error is InvalidParamsError {\n return error instanceof InvalidParamsError;\n}\n\n/**\n * @internal\n *\n * Error to indicate that a functionality has not yet been implemented.\n * Do not export from entrypoint.\n */\nexport class NotImplementedError extends SdkError {\n constructor() {\n super('This functionality is not yet implemented.', ErrorCode.NOT_IMPLEMENTED);\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`./constants.cjs`),t=require(`./errors.cjs`),n=require(`./type-guards.cjs`),r=require(`./quoter/quoter.cjs`),i=require(`./utils/caip.cjs`),a=require(`./_utils/merge-assets.cjs`),o=e=>{if(!n.isEnvironment(e))throw new t.ServiceInitializationError(t.ErrorReason.ENVIRONMENT_NOT_SUPPORTED)},s=e=>{if(e.length===0)throw new t.ServiceInitializationError(`No service initializers provided.`);if(e.some(e=>!n.isServiceInitializer(e)))throw new t.ServiceInitializationError(`One or more service initializers are invalid.`);let r=new Set;for(let n of e){if(r.has(n.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${n.type}" has been initialized more than once.`);r.add(n.type)}},c=async({environment:n,serviceInitializers:r,fetch:i})=>{let a=new Map,o={},s=(e,n)=>{if(n instanceof t.ServiceInitializationError)return n;let r=n instanceof Error?n.message:String(n);return new t.ServiceInitializationError(t.ErrorReason.UNKNOWN,`Failed to initialize service type "${e}". ${r}`,n)},c=async(e,t)=>{try{let n=await t();a.set(e,n),o[e]={status:`initialized`}}catch(t){let n=s(e,t);throw o[e]={status:`error`,error:n},n}};for(let s of r){if(a.has(s.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${s.type}" has been initialized more than once.`);switch(s.type){case e.ServiceType.AVALANCHE_EVM:await c(e.ServiceType.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await Promise.resolve().then(()=>require(`./transfer-service/avalanche-evm/avalanche-evm-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTCB_TO_BTC:await c(e.ServiceType.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btcb-to-btc-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTC_TO_BTCB:await c(e.ServiceType.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btc-to-btcb-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,btcSigner:s.btcSigner,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.MARKR:if(n!==e.Environment.PROD){o[e.ServiceType.MARKR]={status:`unsupported-environment`,message:`Service type "${e.ServiceType.MARKR}" is only supported in production environment.`};break}await c(e.ServiceType.MARKR,async()=>{let{createMarkrService:e}=await Promise.resolve().then(()=>require(`./transfer-service/markr/markr-service.cjs`));return await e({apiBaseUrl:s.markrApiUrl,apiToken:s.markrApiToken,appId:s.markrAppId,fetch:i,environment:n,evmSigner:s.evmSigner,solanaSigner:s.solanaSigner})});break;case e.ServiceType.WRAP_UNWRAP:await c(e.ServiceType.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await Promise.resolve().then(()=>require(`./transfer-service/wrap-unwrap/wrap-unwrap-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;default:break}}return{services:a,status:{environment:n,services:o}}},l=async e=>{let t=[];for(let n of e.values()){let e=await n.getAssets();t.push(e)}return a.mergeChainAssetMaps(t)},u=async({environment:n,fetch:a,serviceInitializers:u})=>{o(n),s(u);let{services:d,status:f}=await c({environment:n,serviceInitializers:u,fetch:a});return{id:crypto.randomUUID(),estimateNativeFee:async(e,n)=>{let r=Math.floor(Date.now()/1e3);if(e.expiresAt<=r){let n=r-e.expiresAt;throw new t.InvalidParamsError(t.ErrorReason.QUOTE_EXPIRED,`Quote expired ${n} seconds ago.`)}let i=d.get(e.serviceType);if(!i)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await i.estimateNativeFee(e,n)},getAssetBridgeMap:async({sourceAsset:t,sourceChainId:n})=>{let r=await l(d),a=r[n];if(!a)return null;let o=a.find(n=>t.type===e.TokenType.NATIVE?n.type===e.TokenType.NATIVE:n.type===t.type&&n.address===t.address);if(!o||!o.destinations)return null;let s=o.destinations,c={};for(let[t,n]of Object.entries(s)){if(!i.isCaip2ChainId(t))continue;let a=r[t];if(!a)continue;let o=a.find(t=>n.address===e.TokenType.NATIVE?t.type===e.TokenType.NATIVE:t.type!==e.TokenType.NATIVE&&t.address===n.address);if(!o)continue;let{destinations:s,swapProviders:l,...u}=o;c[t]={bridgedAsset:u,bridgeProviders:n.bridgeProviders}}return Object.keys(c).length>0?c:null},getMinimumTransferAmount:async e=>{let t={};for(let n of d.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(d.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new r.Quoter(e,Array.from(d.values()),t),status:()=>f,trackTransfer:e=>{let{transfer:n}=e,r=d.get(n.type);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return r.trackTransfer(e)},transferAsset:async e=>{let{quote:n}=e,r=d.get(n.serviceType);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await r.transferAsset(e)}}};exports.createTransferManager=u;
1
+ const e=require(`./constants.cjs`),t=require(`./errors.cjs`),n=require(`./type-guards.cjs`),r=require(`./quoter/quoter.cjs`),i=require(`./utils/caip.cjs`),a=require(`./_utils/merge-assets.cjs`),o=e=>{if(!n.isEnvironment(e))throw new t.ServiceInitializationError(t.ErrorReason.ENVIRONMENT_NOT_SUPPORTED)},s=e=>{if(e.length===0)throw new t.ServiceInitializationError(`No service initializers provided.`);if(e.some(e=>!n.isServiceInitializer(e)))throw new t.ServiceInitializationError(`One or more service initializers are invalid.`);let r=new Set;for(let n of e){if(r.has(n.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${n.type}" has been initialized more than once.`);r.add(n.type)}},c=async({environment:n,serviceInitializers:r,fetch:i})=>{let a=new Map,o={},s=(e,n)=>{if(n instanceof t.ServiceInitializationError)return n;let r=n instanceof Error?n.message:String(n);return new t.ServiceInitializationError(t.ErrorReason.UNKNOWN,`Failed to initialize service type "${e}". ${r}`,n)},c=async(e,t)=>{try{let n=await t();a.set(e,n),o[e]={status:`initialized`}}catch(t){o[e]={status:`error`,error:s(e,t)}}};for(let s of r){if(a.has(s.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${s.type}" has been initialized more than once.`);switch(s.type){case e.ServiceType.AVALANCHE_EVM:await c(e.ServiceType.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await Promise.resolve().then(()=>require(`./transfer-service/avalanche-evm/avalanche-evm-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTCB_TO_BTC:await c(e.ServiceType.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btcb-to-btc-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTC_TO_BTCB:await c(e.ServiceType.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btc-to-btcb-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,btcSigner:s.btcSigner,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.MARKR:if(n!==e.Environment.PROD){o[e.ServiceType.MARKR]={status:`unsupported-environment`,message:`Service type "${e.ServiceType.MARKR}" is only supported in production environment.`};break}await c(e.ServiceType.MARKR,async()=>{let{createMarkrService:e}=await Promise.resolve().then(()=>require(`./transfer-service/markr/markr-service.cjs`));return await e({apiBaseUrl:s.markrApiUrl,apiToken:s.markrApiToken,appId:s.markrAppId,fetch:i,environment:n,evmSigner:s.evmSigner,solanaSigner:s.solanaSigner})});break;case e.ServiceType.WRAP_UNWRAP:await c(e.ServiceType.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await Promise.resolve().then(()=>require(`./transfer-service/wrap-unwrap/wrap-unwrap-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;default:break}}return{services:a,status:{environment:n,services:o}}},l=async e=>{let t=[];for(let n of e.values()){let e=await n.getAssets();t.push(e)}return a.mergeChainAssetMaps(t)},u=async({environment:n,fetch:a,serviceInitializers:u})=>{o(n),s(u);let{services:d,status:f}=await c({environment:n,serviceInitializers:u,fetch:a});return{id:crypto.randomUUID(),estimateNativeFee:async(e,n)=>{let r=Math.floor(Date.now()/1e3);if(e.expiresAt<=r){let n=r-e.expiresAt;throw new t.InvalidParamsError(t.ErrorReason.QUOTE_EXPIRED,`Quote expired ${n} seconds ago.`)}let i=d.get(e.serviceType);if(!i)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await i.estimateNativeFee(e,n)},getAssetBridgeMap:async({sourceAsset:t,sourceChainId:n})=>{let r=await l(d),a=r[n];if(!a)return null;let o=a.find(n=>t.type===e.TokenType.NATIVE?n.type===e.TokenType.NATIVE:n.type===t.type&&n.address===t.address);if(!o||!o.destinations)return null;let s=o.destinations,c={};for(let[t,n]of Object.entries(s)){if(!i.isCaip2ChainId(t))continue;let a=r[t];if(!a)continue;let o=a.find(t=>n.address===e.TokenType.NATIVE?t.type===e.TokenType.NATIVE:t.type!==e.TokenType.NATIVE&&t.address===n.address);if(!o)continue;let{destinations:s,swapProviders:l,...u}=o;c[t]={bridgedAsset:u,bridgeProviders:n.bridgeProviders}}return Object.keys(c).length>0?c:null},getMinimumTransferAmount:async e=>{let t={};for(let n of d.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(d.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new r.Quoter(e,Array.from(d.values()),t),status:()=>f,trackTransfer:e=>{let{transfer:n}=e,r=d.get(n.type);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return r.trackTransfer(e)},transferAsset:async e=>{let{quote:n}=e,r=d.get(n.serviceType);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await r.transferAsset(e)}}};exports.createTransferManager=u;
2
2
  //# sourceMappingURL=transfer-manager.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-manager.cjs","names":["isEnvironment","ServiceInitializationError","ErrorReason","isServiceInitializer","ServiceType","Environment","mergeChainAssetMaps","InvalidParamsError","ServiceUnavailableError","TokenType","isCaip2ChainId","Quoter"],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType, TokenType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { Asset, ChainAssetMap } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { mergeChainAssetMaps } from './_utils/merge-assets';\nimport { isCaip2ChainId } from './utils/caip';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n\n throw wrappedError;\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\nconst _getAssets = async (services: Map<ServiceType, TransferService>): Promise<ChainAssetMap> => {\n const assetMaps: ChainAssetMap[] = [];\n\n for (const service of services.values()) {\n const serviceAssets = await service.getAssets();\n assetMaps.push(serviceAssets);\n }\n\n return mergeChainAssetMaps(assetMaps);\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getAssetBridgeMap: async ({ sourceAsset, sourceChainId }) => {\n const assets = await _getAssets(services);\n\n const chainAssets = assets[sourceChainId];\n\n if (!chainAssets) {\n return null;\n }\n\n const chainAsset = chainAssets.find((asset) => {\n if (sourceAsset.type === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n } else {\n return asset.type === sourceAsset.type && asset.address === sourceAsset.address;\n }\n });\n\n if (!chainAsset || !chainAsset.destinations) {\n return null;\n }\n\n const destinations = chainAsset.destinations;\n\n // map destinations to the required format, lookup bridged asset from assets map\n const result: {\n [chainId: string]: {\n bridgedAsset: Asset;\n bridgeProviders: readonly ServiceType[];\n };\n } = {};\n\n for (const [destChainId, destInfo] of Object.entries(destinations)) {\n if (!isCaip2ChainId(destChainId)) {\n continue;\n }\n\n const destChainAssets = assets[destChainId];\n\n if (!destChainAssets) {\n continue;\n }\n\n // bridgedAsset is the asset from the assets map that matches the destInfo address\n const bridgedAsset = destChainAssets.find((asset) => {\n if (destInfo.address === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n }\n\n return asset.type !== TokenType.NATIVE && asset.address === destInfo.address;\n });\n\n if (!bridgedAsset) {\n continue;\n }\n\n // Convert the TransferableAsset to Asset by omitting the 'destinations' field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { destinations: _omit, swapProviders: _omitSwapProviders, ...convertedBridgedAsset } = bridgedAsset;\n\n result[destChainId] = {\n bridgedAsset: convertedBridgedAsset,\n bridgeProviders: destInfo.bridgeProviders,\n };\n }\n\n return Object.keys(result).length > 0 ? result : null;\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n } satisfies TransferManager;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer-manager.cjs","names":["isEnvironment","ServiceInitializationError","ErrorReason","isServiceInitializer","ServiceType","Environment","mergeChainAssetMaps","InvalidParamsError","ServiceUnavailableError","TokenType","isCaip2ChainId","Quoter"],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType, TokenType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { Asset, ChainAssetMap } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { mergeChainAssetMaps } from './_utils/merge-assets';\nimport { isCaip2ChainId } from './utils/caip';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\nconst _getAssets = async (services: Map<ServiceType, TransferService>): Promise<ChainAssetMap> => {\n const assetMaps: ChainAssetMap[] = [];\n\n for (const service of services.values()) {\n const serviceAssets = await service.getAssets();\n assetMaps.push(serviceAssets);\n }\n\n return mergeChainAssetMaps(assetMaps);\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getAssetBridgeMap: async ({ sourceAsset, sourceChainId }) => {\n const assets = await _getAssets(services);\n\n const chainAssets = assets[sourceChainId];\n\n if (!chainAssets) {\n return null;\n }\n\n const chainAsset = chainAssets.find((asset) => {\n if (sourceAsset.type === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n } else {\n return asset.type === sourceAsset.type && asset.address === sourceAsset.address;\n }\n });\n\n if (!chainAsset || !chainAsset.destinations) {\n return null;\n }\n\n const destinations = chainAsset.destinations;\n\n // map destinations to the required format, lookup bridged asset from assets map\n const result: {\n [chainId: string]: {\n bridgedAsset: Asset;\n bridgeProviders: readonly ServiceType[];\n };\n } = {};\n\n for (const [destChainId, destInfo] of Object.entries(destinations)) {\n if (!isCaip2ChainId(destChainId)) {\n continue;\n }\n\n const destChainAssets = assets[destChainId];\n\n if (!destChainAssets) {\n continue;\n }\n\n // bridgedAsset is the asset from the assets map that matches the destInfo address\n const bridgedAsset = destChainAssets.find((asset) => {\n if (destInfo.address === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n }\n\n return asset.type !== TokenType.NATIVE && asset.address === destInfo.address;\n });\n\n if (!bridgedAsset) {\n continue;\n }\n\n // Convert the TransferableAsset to Asset by omitting the 'destinations' field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { destinations: _omit, swapProviders: _omitSwapProviders, ...convertedBridgedAsset } = bridgedAsset;\n\n result[destChainId] = {\n bridgedAsset: convertedBridgedAsset,\n bridgeProviders: destInfo.bridgeProviders,\n };\n }\n\n return Object.keys(result).length > 0 ? result : null;\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n } satisfies TransferManager;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{Environment as e,ServiceType as t,TokenType as n}from"./constants.js";import{ErrorReason as r,InvalidParamsError as i,ServiceInitializationError as a,ServiceUnavailableError as o}from"./errors.js";import{isEnvironment as s,isServiceInitializer as c}from"./type-guards.js";import{Quoter as l}from"./quoter/quoter.js";import{isCaip2ChainId as u}from"./utils/caip.js";import{mergeChainAssetMaps as d}from"./_utils/merge-assets.js";const f=e=>{if(!s(e))throw new a(r.ENVIRONMENT_NOT_SUPPORTED)},p=e=>{if(e.length===0)throw new a(`No service initializers provided.`);if(e.some(e=>!c(e)))throw new a(`One or more service initializers are invalid.`);let t=new Set;for(let n of e){if(t.has(n.type))throw new a(r.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${n.type}" has been initialized more than once.`);t.add(n.type)}},m=async({environment:n,serviceInitializers:i,fetch:o})=>{let s=new Map,c={},l=(e,t)=>{if(t instanceof a)return t;let n=t instanceof Error?t.message:String(t);return new a(r.UNKNOWN,`Failed to initialize service type "${e}". ${n}`,t)},u=async(e,t)=>{try{let n=await t();s.set(e,n),c[e]={status:`initialized`}}catch(t){let n=l(e,t);throw c[e]={status:`error`,error:n},n}};for(let l of i){if(s.has(l.type))throw new a(r.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${l.type}" has been initialized more than once.`);switch(l.type){case t.AVALANCHE_EVM:await u(t.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await import(`./transfer-service/avalanche-evm/avalanche-evm-service.js`);return await e({environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTCB_TO_BTC:await u(t.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await import(`./transfer-service/lombard/btcb-to-btc-service.js`);return await e({bitcoinFunctions:l.btcFunctions,environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTC_TO_BTCB:await u(t.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await import(`./transfer-service/lombard/btc-to-btcb-service.js`);return await e({bitcoinFunctions:l.btcFunctions,btcSigner:l.btcSigner,environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.MARKR:if(n!==e.PROD){c[t.MARKR]={status:`unsupported-environment`,message:`Service type "${t.MARKR}" is only supported in production environment.`};break}await u(t.MARKR,async()=>{let{createMarkrService:e}=await import(`./transfer-service/markr/markr-service.js`);return await e({apiBaseUrl:l.markrApiUrl,apiToken:l.markrApiToken,appId:l.markrAppId,fetch:o,environment:n,evmSigner:l.evmSigner,solanaSigner:l.solanaSigner})});break;case t.WRAP_UNWRAP:await u(t.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await import(`./transfer-service/wrap-unwrap/wrap-unwrap-service.js`);return await e({environment:n,evmSigner:l.evmSigner,fetch:o})});break;default:break}}return{services:s,status:{environment:n,services:c}}},h=async e=>{let t=[];for(let n of e.values()){let e=await n.getAssets();t.push(e)}return d(t)},g=async({environment:e,fetch:t,serviceInitializers:a})=>{f(e),p(a);let{services:s,status:c}=await m({environment:e,serviceInitializers:a,fetch:t});return{id:crypto.randomUUID(),estimateNativeFee:async(e,t)=>{let n=Math.floor(Date.now()/1e3);if(e.expiresAt<=n){let t=n-e.expiresAt;throw new i(r.QUOTE_EXPIRED,`Quote expired ${t} seconds ago.`)}let a=s.get(e.serviceType);if(!a)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return await a.estimateNativeFee(e,t)},getAssetBridgeMap:async({sourceAsset:e,sourceChainId:t})=>{let r=await h(s),i=r[t];if(!i)return null;let a=i.find(t=>e.type===n.NATIVE?t.type===n.NATIVE:t.type===e.type&&t.address===e.address);if(!a||!a.destinations)return null;let o=a.destinations,c={};for(let[e,t]of Object.entries(o)){if(!u(e))continue;let i=r[e];if(!i)continue;let a=i.find(e=>t.address===n.NATIVE?e.type===n.NATIVE:e.type!==n.NATIVE&&e.address===t.address);if(!a)continue;let{destinations:o,swapProviders:s,...l}=a;c[e]={bridgedAsset:l,bridgeProviders:t.bridgeProviders}}return Object.keys(c).length>0?c:null},getMinimumTransferAmount:async e=>{let t={};for(let n of s.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(s.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new l(e,Array.from(s.values()),t),status:()=>c,trackTransfer:e=>{let{transfer:t}=e,n=s.get(t.type);if(!n)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return n.trackTransfer(e)},transferAsset:async e=>{let{quote:t}=e,n=s.get(t.serviceType);if(!n)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return await n.transferAsset(e)}}};export{g as createTransferManager};
1
+ import{Environment as e,ServiceType as t,TokenType as n}from"./constants.js";import{ErrorReason as r,InvalidParamsError as i,ServiceInitializationError as a,ServiceUnavailableError as o}from"./errors.js";import{isEnvironment as s,isServiceInitializer as c}from"./type-guards.js";import{Quoter as l}from"./quoter/quoter.js";import{isCaip2ChainId as u}from"./utils/caip.js";import{mergeChainAssetMaps as d}from"./_utils/merge-assets.js";const f=e=>{if(!s(e))throw new a(r.ENVIRONMENT_NOT_SUPPORTED)},p=e=>{if(e.length===0)throw new a(`No service initializers provided.`);if(e.some(e=>!c(e)))throw new a(`One or more service initializers are invalid.`);let t=new Set;for(let n of e){if(t.has(n.type))throw new a(r.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${n.type}" has been initialized more than once.`);t.add(n.type)}},m=async({environment:n,serviceInitializers:i,fetch:o})=>{let s=new Map,c={},l=(e,t)=>{if(t instanceof a)return t;let n=t instanceof Error?t.message:String(t);return new a(r.UNKNOWN,`Failed to initialize service type "${e}". ${n}`,t)},u=async(e,t)=>{try{let n=await t();s.set(e,n),c[e]={status:`initialized`}}catch(t){c[e]={status:`error`,error:l(e,t)}}};for(let l of i){if(s.has(l.type))throw new a(r.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${l.type}" has been initialized more than once.`);switch(l.type){case t.AVALANCHE_EVM:await u(t.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await import(`./transfer-service/avalanche-evm/avalanche-evm-service.js`);return await e({environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTCB_TO_BTC:await u(t.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await import(`./transfer-service/lombard/btcb-to-btc-service.js`);return await e({bitcoinFunctions:l.btcFunctions,environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTC_TO_BTCB:await u(t.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await import(`./transfer-service/lombard/btc-to-btcb-service.js`);return await e({bitcoinFunctions:l.btcFunctions,btcSigner:l.btcSigner,environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.MARKR:if(n!==e.PROD){c[t.MARKR]={status:`unsupported-environment`,message:`Service type "${t.MARKR}" is only supported in production environment.`};break}await u(t.MARKR,async()=>{let{createMarkrService:e}=await import(`./transfer-service/markr/markr-service.js`);return await e({apiBaseUrl:l.markrApiUrl,apiToken:l.markrApiToken,appId:l.markrAppId,fetch:o,environment:n,evmSigner:l.evmSigner,solanaSigner:l.solanaSigner})});break;case t.WRAP_UNWRAP:await u(t.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await import(`./transfer-service/wrap-unwrap/wrap-unwrap-service.js`);return await e({environment:n,evmSigner:l.evmSigner,fetch:o})});break;default:break}}return{services:s,status:{environment:n,services:c}}},h=async e=>{let t=[];for(let n of e.values()){let e=await n.getAssets();t.push(e)}return d(t)},g=async({environment:e,fetch:t,serviceInitializers:a})=>{f(e),p(a);let{services:s,status:c}=await m({environment:e,serviceInitializers:a,fetch:t});return{id:crypto.randomUUID(),estimateNativeFee:async(e,t)=>{let n=Math.floor(Date.now()/1e3);if(e.expiresAt<=n){let t=n-e.expiresAt;throw new i(r.QUOTE_EXPIRED,`Quote expired ${t} seconds ago.`)}let a=s.get(e.serviceType);if(!a)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return await a.estimateNativeFee(e,t)},getAssetBridgeMap:async({sourceAsset:e,sourceChainId:t})=>{let r=await h(s),i=r[t];if(!i)return null;let a=i.find(t=>e.type===n.NATIVE?t.type===n.NATIVE:t.type===e.type&&t.address===e.address);if(!a||!a.destinations)return null;let o=a.destinations,c={};for(let[e,t]of Object.entries(o)){if(!u(e))continue;let i=r[e];if(!i)continue;let a=i.find(e=>t.address===n.NATIVE?e.type===n.NATIVE:e.type!==n.NATIVE&&e.address===t.address);if(!a)continue;let{destinations:o,swapProviders:s,...l}=a;c[e]={bridgedAsset:l,bridgeProviders:t.bridgeProviders}}return Object.keys(c).length>0?c:null},getMinimumTransferAmount:async e=>{let t={};for(let n of s.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(s.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new l(e,Array.from(s.values()),t),status:()=>c,trackTransfer:e=>{let{transfer:t}=e,n=s.get(t.type);if(!n)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return n.trackTransfer(e)},transferAsset:async e=>{let{quote:t}=e,n=s.get(t.serviceType);if(!n)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return await n.transferAsset(e)}}};export{g as createTransferManager};
2
2
  //# sourceMappingURL=transfer-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-manager.js","names":[],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType, TokenType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { Asset, ChainAssetMap } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { mergeChainAssetMaps } from './_utils/merge-assets';\nimport { isCaip2ChainId } from './utils/caip';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n\n throw wrappedError;\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\nconst _getAssets = async (services: Map<ServiceType, TransferService>): Promise<ChainAssetMap> => {\n const assetMaps: ChainAssetMap[] = [];\n\n for (const service of services.values()) {\n const serviceAssets = await service.getAssets();\n assetMaps.push(serviceAssets);\n }\n\n return mergeChainAssetMaps(assetMaps);\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getAssetBridgeMap: async ({ sourceAsset, sourceChainId }) => {\n const assets = await _getAssets(services);\n\n const chainAssets = assets[sourceChainId];\n\n if (!chainAssets) {\n return null;\n }\n\n const chainAsset = chainAssets.find((asset) => {\n if (sourceAsset.type === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n } else {\n return asset.type === sourceAsset.type && asset.address === sourceAsset.address;\n }\n });\n\n if (!chainAsset || !chainAsset.destinations) {\n return null;\n }\n\n const destinations = chainAsset.destinations;\n\n // map destinations to the required format, lookup bridged asset from assets map\n const result: {\n [chainId: string]: {\n bridgedAsset: Asset;\n bridgeProviders: readonly ServiceType[];\n };\n } = {};\n\n for (const [destChainId, destInfo] of Object.entries(destinations)) {\n if (!isCaip2ChainId(destChainId)) {\n continue;\n }\n\n const destChainAssets = assets[destChainId];\n\n if (!destChainAssets) {\n continue;\n }\n\n // bridgedAsset is the asset from the assets map that matches the destInfo address\n const bridgedAsset = destChainAssets.find((asset) => {\n if (destInfo.address === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n }\n\n return asset.type !== TokenType.NATIVE && asset.address === destInfo.address;\n });\n\n if (!bridgedAsset) {\n continue;\n }\n\n // Convert the TransferableAsset to Asset by omitting the 'destinations' field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { destinations: _omit, swapProviders: _omitSwapProviders, ...convertedBridgedAsset } = bridgedAsset;\n\n result[destChainId] = {\n bridgedAsset: convertedBridgedAsset,\n bridgeProviders: destInfo.bridgeProviders,\n };\n }\n\n return Object.keys(result).length > 0 ? result : null;\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n } satisfies TransferManager;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer-manager.js","names":[],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType, TokenType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { Asset, ChainAssetMap } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { mergeChainAssetMaps } from './_utils/merge-assets';\nimport { isCaip2ChainId } from './utils/caip';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\nconst _getAssets = async (services: Map<ServiceType, TransferService>): Promise<ChainAssetMap> => {\n const assetMaps: ChainAssetMap[] = [];\n\n for (const service of services.values()) {\n const serviceAssets = await service.getAssets();\n assetMaps.push(serviceAssets);\n }\n\n return mergeChainAssetMaps(assetMaps);\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getAssetBridgeMap: async ({ sourceAsset, sourceChainId }) => {\n const assets = await _getAssets(services);\n\n const chainAssets = assets[sourceChainId];\n\n if (!chainAssets) {\n return null;\n }\n\n const chainAsset = chainAssets.find((asset) => {\n if (sourceAsset.type === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n } else {\n return asset.type === sourceAsset.type && asset.address === sourceAsset.address;\n }\n });\n\n if (!chainAsset || !chainAsset.destinations) {\n return null;\n }\n\n const destinations = chainAsset.destinations;\n\n // map destinations to the required format, lookup bridged asset from assets map\n const result: {\n [chainId: string]: {\n bridgedAsset: Asset;\n bridgeProviders: readonly ServiceType[];\n };\n } = {};\n\n for (const [destChainId, destInfo] of Object.entries(destinations)) {\n if (!isCaip2ChainId(destChainId)) {\n continue;\n }\n\n const destChainAssets = assets[destChainId];\n\n if (!destChainAssets) {\n continue;\n }\n\n // bridgedAsset is the asset from the assets map that matches the destInfo address\n const bridgedAsset = destChainAssets.find((asset) => {\n if (destInfo.address === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n }\n\n return asset.type !== TokenType.NATIVE && asset.address === destInfo.address;\n });\n\n if (!bridgedAsset) {\n continue;\n }\n\n // Convert the TransferableAsset to Asset by omitting the 'destinations' field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { destinations: _omit, swapProviders: _omitSwapProviders, ...convertedBridgedAsset } = bridgedAsset;\n\n result[destChainId] = {\n bridgedAsset: convertedBridgedAsset,\n bridgeProviders: destInfo.bridgeProviders,\n };\n }\n\n return Object.keys(result).length > 0 ? result : null;\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n } satisfies TransferManager;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../constants.cjs`);function t({hasSolanaSigner:t,supportedChains:n}){return({sourceAsset:r,sourceChainId:i,targetAsset:a,targetChainId:o})=>{let s=r.type===e.TokenType.NATIVE||r.type===e.TokenType.ERC20||r.type===e.TokenType.SPL&&t,c=a.type===e.TokenType.NATIVE||a.type===e.TokenType.ERC20||a.type===e.TokenType.SPL&&t;if(!s||!c)return!1;let l=n.get(i),u=n.get(o);return!l||!u?!1:i===o?l.swapEnabled:l.crossChainSwapEnabled&&u.crossChainSwapEnabled}}exports.analyzeSupportFactory=t;
1
+ const e=require(`../../../constants.cjs`);function t({hasSolanaSigner:t,supportedChains:n}){return({sourceAsset:r,sourceChainId:i,targetAsset:a,targetChainId:o})=>{let s=r.type===e.TokenType.NATIVE||r.type===e.TokenType.ERC20||r.type===e.TokenType.SPL&&t,c=a.type===e.TokenType.NATIVE||a.type===e.TokenType.ERC20||a.type===e.TokenType.SPL&&t;if(!s||!c)return!1;let l=n.get(i),u=n.get(o);return!l||!u?!1:i===o?l.swapEnabled:l.crossChainSwapEnabled&&l.crossChainTargetChainIds.has(o)}}exports.analyzeSupportFactory=t;
2
2
  //# sourceMappingURL=analyze-support.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-support.cjs","names":["TokenType"],"sources":["../../../../src/transfer-service/markr/_handlers/analyze-support.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport type { SupportedChainsMap } from '../_utils';\n\nexport interface AnalyzeSupportFactoryConfig {\n hasSolanaSigner: boolean;\n supportedChains: SupportedChainsMap;\n}\n\nexport function analyzeSupportFactory({\n hasSolanaSigner,\n supportedChains,\n}: AnalyzeSupportFactoryConfig): TransferService['analyzeSupport'] {\n return ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n const validSourceAssetType =\n sourceAsset.type === TokenType.NATIVE ||\n sourceAsset.type === TokenType.ERC20 ||\n (sourceAsset.type === TokenType.SPL && hasSolanaSigner);\n const validTargetAssetType =\n targetAsset.type === TokenType.NATIVE ||\n targetAsset.type === TokenType.ERC20 ||\n (targetAsset.type === TokenType.SPL && hasSolanaSigner);\n\n if (!validSourceAssetType || !validTargetAssetType) {\n return false;\n }\n\n const supportedSourceChain = supportedChains.get(sourceChainId);\n const supportedTargetChain = supportedChains.get(targetChainId);\n\n // Validate chains are supported.\n if (!supportedSourceChain || !supportedTargetChain) {\n return false;\n }\n\n // Validate same-chain swaps are supported if source and target chains are the same.\n if (sourceChainId === targetChainId) {\n return supportedSourceChain.swapEnabled;\n }\n\n // Validate cross-chain swaps are supported if source and target chains are different.\n return supportedSourceChain.crossChainSwapEnabled && supportedTargetChain.crossChainSwapEnabled;\n };\n}\n"],"mappings":"0CASA,SAAgB,EAAsB,CACpC,kBACA,mBACiE,CACjE,OAAQ,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CACrE,IAAM,EACJ,EAAY,OAASA,EAAAA,UAAU,QAC/B,EAAY,OAASA,EAAAA,UAAU,OAC9B,EAAY,OAASA,EAAAA,UAAU,KAAO,EACnC,EACJ,EAAY,OAASA,EAAAA,UAAU,QAC/B,EAAY,OAASA,EAAAA,UAAU,OAC9B,EAAY,OAASA,EAAAA,UAAU,KAAO,EAEzC,GAAI,CAAC,GAAwB,CAAC,EAC5B,MAAO,GAGT,IAAM,EAAuB,EAAgB,IAAI,EAAc,CACzD,EAAuB,EAAgB,IAAI,EAAc,CAa/D,MAVI,CAAC,GAAwB,CAAC,EACrB,GAIL,IAAkB,EACb,EAAqB,YAIvB,EAAqB,uBAAyB,EAAqB"}
1
+ {"version":3,"file":"analyze-support.cjs","names":["TokenType"],"sources":["../../../../src/transfer-service/markr/_handlers/analyze-support.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport type { SupportedChainsMap } from '../_utils';\n\nexport interface AnalyzeSupportFactoryConfig {\n hasSolanaSigner: boolean;\n supportedChains: SupportedChainsMap;\n}\n\nexport function analyzeSupportFactory({\n hasSolanaSigner,\n supportedChains,\n}: AnalyzeSupportFactoryConfig): TransferService['analyzeSupport'] {\n return ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n const validSourceAssetType =\n sourceAsset.type === TokenType.NATIVE ||\n sourceAsset.type === TokenType.ERC20 ||\n (sourceAsset.type === TokenType.SPL && hasSolanaSigner);\n const validTargetAssetType =\n targetAsset.type === TokenType.NATIVE ||\n targetAsset.type === TokenType.ERC20 ||\n (targetAsset.type === TokenType.SPL && hasSolanaSigner);\n\n if (!validSourceAssetType || !validTargetAssetType) {\n return false;\n }\n\n const supportedSourceChain = supportedChains.get(sourceChainId);\n const supportedTargetChain = supportedChains.get(targetChainId);\n\n // Validate chains are supported.\n if (!supportedSourceChain || !supportedTargetChain) {\n return false;\n }\n\n // Validate same-chain swaps are supported if source and target chains are the same.\n if (sourceChainId === targetChainId) {\n return supportedSourceChain.swapEnabled;\n }\n\n // Validate cross-chain swaps are supported for the explicit source -> target route.\n return (\n supportedSourceChain.crossChainSwapEnabled && supportedSourceChain.crossChainTargetChainIds.has(targetChainId)\n );\n };\n}\n"],"mappings":"0CASA,SAAgB,EAAsB,CACpC,kBACA,mBACiE,CACjE,OAAQ,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CACrE,IAAM,EACJ,EAAY,OAASA,EAAAA,UAAU,QAC/B,EAAY,OAASA,EAAAA,UAAU,OAC9B,EAAY,OAASA,EAAAA,UAAU,KAAO,EACnC,EACJ,EAAY,OAASA,EAAAA,UAAU,QAC/B,EAAY,OAASA,EAAAA,UAAU,OAC9B,EAAY,OAASA,EAAAA,UAAU,KAAO,EAEzC,GAAI,CAAC,GAAwB,CAAC,EAC5B,MAAO,GAGT,IAAM,EAAuB,EAAgB,IAAI,EAAc,CACzD,EAAuB,EAAgB,IAAI,EAAc,CAa/D,MAVI,CAAC,GAAwB,CAAC,EACrB,GAIL,IAAkB,EACb,EAAqB,YAK5B,EAAqB,uBAAyB,EAAqB,yBAAyB,IAAI,EAAc"}
@@ -1,2 +1,2 @@
1
- import{TokenType as e}from"../../../constants.js";function t({hasSolanaSigner:t,supportedChains:n}){return({sourceAsset:r,sourceChainId:i,targetAsset:a,targetChainId:o})=>{let s=r.type===e.NATIVE||r.type===e.ERC20||r.type===e.SPL&&t,c=a.type===e.NATIVE||a.type===e.ERC20||a.type===e.SPL&&t;if(!s||!c)return!1;let l=n.get(i),u=n.get(o);return!l||!u?!1:i===o?l.swapEnabled:l.crossChainSwapEnabled&&u.crossChainSwapEnabled}}export{t as analyzeSupportFactory};
1
+ import{TokenType as e}from"../../../constants.js";function t({hasSolanaSigner:t,supportedChains:n}){return({sourceAsset:r,sourceChainId:i,targetAsset:a,targetChainId:o})=>{let s=r.type===e.NATIVE||r.type===e.ERC20||r.type===e.SPL&&t,c=a.type===e.NATIVE||a.type===e.ERC20||a.type===e.SPL&&t;if(!s||!c)return!1;let l=n.get(i),u=n.get(o);return!l||!u?!1:i===o?l.swapEnabled:l.crossChainSwapEnabled&&l.crossChainTargetChainIds.has(o)}}export{t as analyzeSupportFactory};
2
2
  //# sourceMappingURL=analyze-support.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-support.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/analyze-support.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport type { SupportedChainsMap } from '../_utils';\n\nexport interface AnalyzeSupportFactoryConfig {\n hasSolanaSigner: boolean;\n supportedChains: SupportedChainsMap;\n}\n\nexport function analyzeSupportFactory({\n hasSolanaSigner,\n supportedChains,\n}: AnalyzeSupportFactoryConfig): TransferService['analyzeSupport'] {\n return ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n const validSourceAssetType =\n sourceAsset.type === TokenType.NATIVE ||\n sourceAsset.type === TokenType.ERC20 ||\n (sourceAsset.type === TokenType.SPL && hasSolanaSigner);\n const validTargetAssetType =\n targetAsset.type === TokenType.NATIVE ||\n targetAsset.type === TokenType.ERC20 ||\n (targetAsset.type === TokenType.SPL && hasSolanaSigner);\n\n if (!validSourceAssetType || !validTargetAssetType) {\n return false;\n }\n\n const supportedSourceChain = supportedChains.get(sourceChainId);\n const supportedTargetChain = supportedChains.get(targetChainId);\n\n // Validate chains are supported.\n if (!supportedSourceChain || !supportedTargetChain) {\n return false;\n }\n\n // Validate same-chain swaps are supported if source and target chains are the same.\n if (sourceChainId === targetChainId) {\n return supportedSourceChain.swapEnabled;\n }\n\n // Validate cross-chain swaps are supported if source and target chains are different.\n return supportedSourceChain.crossChainSwapEnabled && supportedTargetChain.crossChainSwapEnabled;\n };\n}\n"],"mappings":"kDASA,SAAgB,EAAsB,CACpC,kBACA,mBACiE,CACjE,OAAQ,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CACrE,IAAM,EACJ,EAAY,OAAS,EAAU,QAC/B,EAAY,OAAS,EAAU,OAC9B,EAAY,OAAS,EAAU,KAAO,EACnC,EACJ,EAAY,OAAS,EAAU,QAC/B,EAAY,OAAS,EAAU,OAC9B,EAAY,OAAS,EAAU,KAAO,EAEzC,GAAI,CAAC,GAAwB,CAAC,EAC5B,MAAO,GAGT,IAAM,EAAuB,EAAgB,IAAI,EAAc,CACzD,EAAuB,EAAgB,IAAI,EAAc,CAa/D,MAVI,CAAC,GAAwB,CAAC,EACrB,GAIL,IAAkB,EACb,EAAqB,YAIvB,EAAqB,uBAAyB,EAAqB"}
1
+ {"version":3,"file":"analyze-support.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/analyze-support.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport type { SupportedChainsMap } from '../_utils';\n\nexport interface AnalyzeSupportFactoryConfig {\n hasSolanaSigner: boolean;\n supportedChains: SupportedChainsMap;\n}\n\nexport function analyzeSupportFactory({\n hasSolanaSigner,\n supportedChains,\n}: AnalyzeSupportFactoryConfig): TransferService['analyzeSupport'] {\n return ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n const validSourceAssetType =\n sourceAsset.type === TokenType.NATIVE ||\n sourceAsset.type === TokenType.ERC20 ||\n (sourceAsset.type === TokenType.SPL && hasSolanaSigner);\n const validTargetAssetType =\n targetAsset.type === TokenType.NATIVE ||\n targetAsset.type === TokenType.ERC20 ||\n (targetAsset.type === TokenType.SPL && hasSolanaSigner);\n\n if (!validSourceAssetType || !validTargetAssetType) {\n return false;\n }\n\n const supportedSourceChain = supportedChains.get(sourceChainId);\n const supportedTargetChain = supportedChains.get(targetChainId);\n\n // Validate chains are supported.\n if (!supportedSourceChain || !supportedTargetChain) {\n return false;\n }\n\n // Validate same-chain swaps are supported if source and target chains are the same.\n if (sourceChainId === targetChainId) {\n return supportedSourceChain.swapEnabled;\n }\n\n // Validate cross-chain swaps are supported for the explicit source -> target route.\n return (\n supportedSourceChain.crossChainSwapEnabled && supportedSourceChain.crossChainTargetChainIds.has(targetChainId)\n );\n };\n}\n"],"mappings":"kDASA,SAAgB,EAAsB,CACpC,kBACA,mBACiE,CACjE,OAAQ,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CACrE,IAAM,EACJ,EAAY,OAAS,EAAU,QAC/B,EAAY,OAAS,EAAU,OAC9B,EAAY,OAAS,EAAU,KAAO,EACnC,EACJ,EAAY,OAAS,EAAU,QAC/B,EAAY,OAAS,EAAU,OAC9B,EAAY,OAAS,EAAU,KAAO,EAEzC,GAAI,CAAC,GAAwB,CAAC,EAC5B,MAAO,GAGT,IAAM,EAAuB,EAAgB,IAAI,EAAc,CACzD,EAAuB,EAAgB,IAAI,EAAc,CAa/D,MAVI,CAAC,GAAwB,CAAC,EACrB,GAIL,IAAkB,EACb,EAAqB,YAK5B,EAAqB,uBAAyB,EAAqB,yBAAyB,IAAI,EAAc"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../errors.cjs`),t=1n,n=200n;function r({analyzeSupport:r,partnerFeeBps:i}){return async({sourceAsset:a,sourceChainId:o,targetAsset:s,targetChainId:c})=>{if(!Number.isInteger(i)||i<0)throw new e.SdkError(e.ErrorReason.UNKNOWN,e.ErrorCode.INVALID_PARAMS,{details:`Invalid partner fee basis points: ${i}`});if(i===0)return t;if(!r({sourceAsset:a,sourceChainId:o,targetAsset:s,targetChainId:c}))throw new e.SdkError(e.ErrorReason.UNKNOWN,e.ErrorCode.INVALID_PARAMS,{details:`Transfer not supported by Markr. Unable to get minimum transfer amount.`});return(BigInt(t*10000n/BigInt(i))*10000n+(10000n-n)-1n)/(10000n-n)}}exports.getMinimumTransferAmountFactory=r;
1
+ const e=require(`../../../errors.cjs`),t=1n,n=10000n;function r({analyzeSupport:t,partnerFeeBps:n}){return async({sourceAsset:r,sourceChainId:i,targetAsset:s,targetChainId:u})=>{if(!Number.isInteger(n)||n<0)throw new e.SdkError(e.ErrorReason.UNKNOWN,e.ErrorCode.INVALID_PARAMS,{details:`Invalid partner fee basis points: ${n}`});if(!t({sourceAsset:r,sourceChainId:i,targetAsset:s,targetChainId:u}))throw new e.SdkError(e.ErrorReason.UNKNOWN,e.ErrorCode.INVALID_PARAMS,{details:`Transfer not supported by Markr. Unable to get minimum transfer amount.`});return o(r.decimals),a(c(n),l(r.decimals))}}function i(e,t){return(e+t-1n)/t}function a(e,t){return e>t?e:t}function o(t){if(!Number.isInteger(t)||t<0)throw new e.SdkError(e.ErrorReason.UNKNOWN,e.ErrorCode.INVALID_PARAMS,{details:`Invalid source asset decimals: ${t}`})}function s(e,t,n){return i(10n**BigInt(e)*t,n)}function c(e){return i((e===0?t:i(t*n,BigInt(e)))*(n+500n),n)}function l(e){return s(e,10n,100000n)}exports.getMinimumTransferAmountFactory=r;
2
2
  //# sourceMappingURL=get-minimum-transfer-amount.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["SdkError","ErrorReason","ErrorCode"],"sources":["../../../../src/transfer-service/markr/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\n\nexport const MINIMUM_CORE_FEE = 1n; // 1 unit of the source asset\nconst SLIPPAGE_BUFFER_BPS = 200n; // 2% buffer \"slippage\" buffer.\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * The minimum transfer amount is calculated based on the partner fee basis points.\n *\n * The minimum here guarantees that Core can extract a fee of at least MINIMUM_CORE_FEE.\n */\nexport function getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // Verify partnerFeeBps is positive integer\n if (!Number.isInteger(partnerFeeBps) || partnerFeeBps < 0) {\n // We shouldn't hit this given our Zod validation at service creation time.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid partner fee basis points: ${partnerFeeBps}`,\n });\n }\n\n if (partnerFeeBps === 0) {\n // No fee, so minimum is just the base minimum.\n return MINIMUM_CORE_FEE;\n }\n\n if (!analyzeSupport({ sourceAsset, sourceChainId, targetAsset, targetChainId })) {\n // This should never happen given the analyzeSupport check that happens in the TransferManager.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: 'Transfer not supported by Markr. Unable to get minimum transfer amount.',\n });\n }\n\n const minimumAmount = BigInt((MINIMUM_CORE_FEE * 10_000n) / BigInt(partnerFeeBps));\n\n const minimumAmountWithBuffer =\n (minimumAmount * 10_000n + (10_000n - SLIPPAGE_BUFFER_BPS) - 1n) / (10_000n - SLIPPAGE_BUFFER_BPS);\n\n return minimumAmountWithBuffer;\n };\n}\n"],"mappings":"uCAGa,EAAmB,GAC1B,EAAsB,KAY5B,SAAgB,EAAgC,CAC9C,iBACA,iBACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAE3E,GAAI,CAAC,OAAO,UAAU,EAAc,EAAI,EAAgB,EAEtD,MAAM,IAAIA,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,qCAAqC,IAC/C,CAAC,CAGJ,GAAI,IAAkB,EAEpB,OAAO,EAGT,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAIF,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAQJ,OALsB,OAAQ,EAAmB,OAAW,OAAO,EAAc,CAAC,CAG/D,QAAW,OAAU,GAAuB,KAAO,OAAU"}
1
+ {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["SdkError","ErrorReason","ErrorCode"],"sources":["../../../../src/transfer-service/markr/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\n\n/** Minimum core fee captured from a transfer, expressed in source-asset base units. */\nexport const MINIMUM_CORE_FEE_BASE_UNITS = 1n;\nconst BPS_SCALE = 10_000n;\nconst PARTNER_FEE_FLOOR_MARGIN_BPS = 500n; // 5%\n/**\n * Scale used for the token-asset floor calculation.\n *\n * This has been separated _just in case_ we want to adjust the value\n * lower than 10,000 (0.01%) in the future to allow smaller transfer amounts.\n */\nconst TOKEN_ASSET_SCALE = 100_000n;\n\n// Token floor target represented in units of `TOKEN_ASSET_SCALE` for one source token.\n// Converted to base units using `sourceAsset.decimals` so the floor is precision-aware.\n/**\n * Token floor target represented in units of `TOKEN_ASSET_SCALE` for one source token.\n * Converted to base units using `sourceAsset.decimals` so the floor is precision-aware.\n *\n * We are using a different scale here in case we want to allow smaller transfer amounts,\n * but for now, this is effectively the same using 10,000 scale.\n */\nconst TOKEN_ASSET_FLOOR_UNITS = 10n; // 0.010% when TOKEN_ASSET_SCALE is 100_000\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * Computes the minimum source amount for Markr transfers.\n *\n * Calculation summary:\n * 1) Compute `partnerFeeFloor` from `partnerFeeBps` (10_000 scale), then apply 5% margin.\n * 2) Compute `tokenAssetFloor` from source token decimals and token-asset floor units (100_000 scale).\n * 3) Return the larger value between `partnerFeeFloor` and `tokenAssetFloor`.\n *\n * Example:\n * - USDC (6 decimals) with partnerFeeBps=85 -> `partnerFeeFloor` (124) is greater than `tokenAssetFloor` (100).\n * - AVAX (18 decimals) with partnerFeeBps=85 -> `tokenAssetFloor` (100_000_000_000_000) is greater.\n */\nexport function getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // Verify partnerFeeBps is positive integer\n if (!Number.isInteger(partnerFeeBps) || partnerFeeBps < 0) {\n // We shouldn't hit this given our Zod validation at service creation time.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid partner fee basis points: ${partnerFeeBps}`,\n });\n }\n\n if (!analyzeSupport({ sourceAsset, sourceChainId, targetAsset, targetChainId })) {\n // This should never happen given the analyzeSupport check that happens in the TransferManager.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: 'Transfer not supported by Markr. Unable to get minimum transfer amount.',\n });\n }\n\n validateSourceAssetDecimals(sourceAsset.decimals);\n\n const partnerFeeFloor = computePartnerFeeFloor(partnerFeeBps);\n const tokenAssetFloor = computeTokenAssetFloor(sourceAsset.decimals);\n\n return maxBigInt(partnerFeeFloor, tokenAssetFloor);\n };\n}\n\nfunction ceilDiv(value: bigint, divisor: bigint): bigint {\n return (value + divisor - 1n) / divisor;\n}\n\nfunction maxBigInt(left: bigint, right: bigint): bigint {\n return left > right ? left : right;\n}\n\nfunction validateSourceAssetDecimals(decimals: number): void {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid source asset decimals: ${decimals}`,\n });\n }\n}\n\nfunction toBaseUnitsOfOneTokenWithScale(decimals: number, units: bigint, scale: bigint): bigint {\n return ceilDiv(10n ** BigInt(decimals) * units, scale);\n}\n\nfunction computePartnerFeeFloor(partnerFeeBps: number): bigint {\n const basePartnerFeeFloor =\n partnerFeeBps === 0\n ? MINIMUM_CORE_FEE_BASE_UNITS\n : ceilDiv(MINIMUM_CORE_FEE_BASE_UNITS * BPS_SCALE, BigInt(partnerFeeBps));\n\n return ceilDiv(basePartnerFeeFloor * (BPS_SCALE + PARTNER_FEE_FLOOR_MARGIN_BPS), BPS_SCALE);\n}\n\nfunction computeTokenAssetFloor(sourceAssetDecimals: number): bigint {\n return toBaseUnitsOfOneTokenWithScale(sourceAssetDecimals, TOKEN_ASSET_FLOOR_UNITS, TOKEN_ASSET_SCALE);\n}\n"],"mappings":"uCAIa,EAA8B,GACrC,EAAY,OAsClB,SAAgB,EAAgC,CAC9C,iBACA,iBACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAE3E,GAAI,CAAC,OAAO,UAAU,EAAc,EAAI,EAAgB,EAEtD,MAAM,IAAIA,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,qCAAqC,IAC/C,CAAC,CAGJ,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAIF,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAQJ,OALA,EAA4B,EAAY,SAAS,CAK1C,EAHiB,EAAuB,EAAc,CACrC,EAAuB,EAAY,SAAS,CAElB,EAItD,SAAS,EAAQ,EAAe,EAAyB,CACvD,OAAQ,EAAQ,EAAU,IAAM,EAGlC,SAAS,EAAU,EAAc,EAAuB,CACtD,OAAO,EAAO,EAAQ,EAAO,EAG/B,SAAS,EAA4B,EAAwB,CAC3D,GAAI,CAAC,OAAO,UAAU,EAAS,EAAI,EAAW,EAC5C,MAAM,IAAIF,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,kCAAkC,IAC5C,CAAC,CAIN,SAAS,EAA+B,EAAkB,EAAe,EAAuB,CAC9F,OAAO,EAAQ,KAAO,OAAO,EAAS,CAAG,EAAO,EAAM,CAGxD,SAAS,EAAuB,EAA+B,CAM7D,OAAO,GAJL,IAAkB,EACd,EACA,EAAQ,EAA8B,EAAW,OAAO,EAAc,CAAC,GAEvC,EAAY,MAA+B,EAAU,CAG7F,SAAS,EAAuB,EAAqC,CACnE,OAAO,EAA+B,EAAqB,IAAyB,QAAkB"}
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e,ErrorReason as t,SdkError as n}from"../../../errors.js";const r=1n,i=200n;function a({analyzeSupport:a,partnerFeeBps:o}){return async({sourceAsset:s,sourceChainId:c,targetAsset:l,targetChainId:u})=>{if(!Number.isInteger(o)||o<0)throw new n(t.UNKNOWN,e.INVALID_PARAMS,{details:`Invalid partner fee basis points: ${o}`});if(o===0)return r;if(!a({sourceAsset:s,sourceChainId:c,targetAsset:l,targetChainId:u}))throw new n(t.UNKNOWN,e.INVALID_PARAMS,{details:`Transfer not supported by Markr. Unable to get minimum transfer amount.`});return(BigInt(r*10000n/BigInt(o))*10000n+(10000n-i)-1n)/(10000n-i)}}export{a as getMinimumTransferAmountFactory};
1
+ import{ErrorCode as e,ErrorReason as t,SdkError as n}from"../../../errors.js";const r=1n,i=10000n;function a({analyzeSupport:r,partnerFeeBps:i}){return async({sourceAsset:a,sourceChainId:o,targetAsset:l,targetChainId:f})=>{if(!Number.isInteger(i)||i<0)throw new n(t.UNKNOWN,e.INVALID_PARAMS,{details:`Invalid partner fee basis points: ${i}`});if(!r({sourceAsset:a,sourceChainId:o,targetAsset:l,targetChainId:f}))throw new n(t.UNKNOWN,e.INVALID_PARAMS,{details:`Transfer not supported by Markr. Unable to get minimum transfer amount.`});return c(a.decimals),s(u(i),d(a.decimals))}}function o(e,t){return(e+t-1n)/t}function s(e,t){return e>t?e:t}function c(r){if(!Number.isInteger(r)||r<0)throw new n(t.UNKNOWN,e.INVALID_PARAMS,{details:`Invalid source asset decimals: ${r}`})}function l(e,t,n){return o(10n**BigInt(e)*t,n)}function u(e){return o((e===0?r:o(r*i,BigInt(e)))*(i+500n),i)}function d(e){return l(e,10n,100000n)}export{a as getMinimumTransferAmountFactory};
2
2
  //# sourceMappingURL=get-minimum-transfer-amount.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-minimum-transfer-amount.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\n\nexport const MINIMUM_CORE_FEE = 1n; // 1 unit of the source asset\nconst SLIPPAGE_BUFFER_BPS = 200n; // 2% buffer \"slippage\" buffer.\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * The minimum transfer amount is calculated based on the partner fee basis points.\n *\n * The minimum here guarantees that Core can extract a fee of at least MINIMUM_CORE_FEE.\n */\nexport function getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // Verify partnerFeeBps is positive integer\n if (!Number.isInteger(partnerFeeBps) || partnerFeeBps < 0) {\n // We shouldn't hit this given our Zod validation at service creation time.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid partner fee basis points: ${partnerFeeBps}`,\n });\n }\n\n if (partnerFeeBps === 0) {\n // No fee, so minimum is just the base minimum.\n return MINIMUM_CORE_FEE;\n }\n\n if (!analyzeSupport({ sourceAsset, sourceChainId, targetAsset, targetChainId })) {\n // This should never happen given the analyzeSupport check that happens in the TransferManager.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: 'Transfer not supported by Markr. Unable to get minimum transfer amount.',\n });\n }\n\n const minimumAmount = BigInt((MINIMUM_CORE_FEE * 10_000n) / BigInt(partnerFeeBps));\n\n const minimumAmountWithBuffer =\n (minimumAmount * 10_000n + (10_000n - SLIPPAGE_BUFFER_BPS) - 1n) / (10_000n - SLIPPAGE_BUFFER_BPS);\n\n return minimumAmountWithBuffer;\n };\n}\n"],"mappings":"8EAGA,MAAa,EAAmB,GAC1B,EAAsB,KAY5B,SAAgB,EAAgC,CAC9C,iBACA,iBACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAE3E,GAAI,CAAC,OAAO,UAAU,EAAc,EAAI,EAAgB,EAEtD,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,qCAAqC,IAC/C,CAAC,CAGJ,GAAI,IAAkB,EAEpB,OAAO,EAGT,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAQJ,OALsB,OAAQ,EAAmB,OAAW,OAAO,EAAc,CAAC,CAG/D,QAAW,OAAU,GAAuB,KAAO,OAAU"}
1
+ {"version":3,"file":"get-minimum-transfer-amount.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\n\n/** Minimum core fee captured from a transfer, expressed in source-asset base units. */\nexport const MINIMUM_CORE_FEE_BASE_UNITS = 1n;\nconst BPS_SCALE = 10_000n;\nconst PARTNER_FEE_FLOOR_MARGIN_BPS = 500n; // 5%\n/**\n * Scale used for the token-asset floor calculation.\n *\n * This has been separated _just in case_ we want to adjust the value\n * lower than 10,000 (0.01%) in the future to allow smaller transfer amounts.\n */\nconst TOKEN_ASSET_SCALE = 100_000n;\n\n// Token floor target represented in units of `TOKEN_ASSET_SCALE` for one source token.\n// Converted to base units using `sourceAsset.decimals` so the floor is precision-aware.\n/**\n * Token floor target represented in units of `TOKEN_ASSET_SCALE` for one source token.\n * Converted to base units using `sourceAsset.decimals` so the floor is precision-aware.\n *\n * We are using a different scale here in case we want to allow smaller transfer amounts,\n * but for now, this is effectively the same using 10,000 scale.\n */\nconst TOKEN_ASSET_FLOOR_UNITS = 10n; // 0.010% when TOKEN_ASSET_SCALE is 100_000\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * Computes the minimum source amount for Markr transfers.\n *\n * Calculation summary:\n * 1) Compute `partnerFeeFloor` from `partnerFeeBps` (10_000 scale), then apply 5% margin.\n * 2) Compute `tokenAssetFloor` from source token decimals and token-asset floor units (100_000 scale).\n * 3) Return the larger value between `partnerFeeFloor` and `tokenAssetFloor`.\n *\n * Example:\n * - USDC (6 decimals) with partnerFeeBps=85 -> `partnerFeeFloor` (124) is greater than `tokenAssetFloor` (100).\n * - AVAX (18 decimals) with partnerFeeBps=85 -> `tokenAssetFloor` (100_000_000_000_000) is greater.\n */\nexport function getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // Verify partnerFeeBps is positive integer\n if (!Number.isInteger(partnerFeeBps) || partnerFeeBps < 0) {\n // We shouldn't hit this given our Zod validation at service creation time.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid partner fee basis points: ${partnerFeeBps}`,\n });\n }\n\n if (!analyzeSupport({ sourceAsset, sourceChainId, targetAsset, targetChainId })) {\n // This should never happen given the analyzeSupport check that happens in the TransferManager.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: 'Transfer not supported by Markr. Unable to get minimum transfer amount.',\n });\n }\n\n validateSourceAssetDecimals(sourceAsset.decimals);\n\n const partnerFeeFloor = computePartnerFeeFloor(partnerFeeBps);\n const tokenAssetFloor = computeTokenAssetFloor(sourceAsset.decimals);\n\n return maxBigInt(partnerFeeFloor, tokenAssetFloor);\n };\n}\n\nfunction ceilDiv(value: bigint, divisor: bigint): bigint {\n return (value + divisor - 1n) / divisor;\n}\n\nfunction maxBigInt(left: bigint, right: bigint): bigint {\n return left > right ? left : right;\n}\n\nfunction validateSourceAssetDecimals(decimals: number): void {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid source asset decimals: ${decimals}`,\n });\n }\n}\n\nfunction toBaseUnitsOfOneTokenWithScale(decimals: number, units: bigint, scale: bigint): bigint {\n return ceilDiv(10n ** BigInt(decimals) * units, scale);\n}\n\nfunction computePartnerFeeFloor(partnerFeeBps: number): bigint {\n const basePartnerFeeFloor =\n partnerFeeBps === 0\n ? MINIMUM_CORE_FEE_BASE_UNITS\n : ceilDiv(MINIMUM_CORE_FEE_BASE_UNITS * BPS_SCALE, BigInt(partnerFeeBps));\n\n return ceilDiv(basePartnerFeeFloor * (BPS_SCALE + PARTNER_FEE_FLOOR_MARGIN_BPS), BPS_SCALE);\n}\n\nfunction computeTokenAssetFloor(sourceAssetDecimals: number): bigint {\n return toBaseUnitsOfOneTokenWithScale(sourceAssetDecimals, TOKEN_ASSET_FLOOR_UNITS, TOKEN_ASSET_SCALE);\n}\n"],"mappings":"8EAIA,MAAa,EAA8B,GACrC,EAAY,OAsClB,SAAgB,EAAgC,CAC9C,iBACA,iBACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAE3E,GAAI,CAAC,OAAO,UAAU,EAAc,EAAI,EAAgB,EAEtD,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,qCAAqC,IAC/C,CAAC,CAGJ,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAQJ,OALA,EAA4B,EAAY,SAAS,CAK1C,EAHiB,EAAuB,EAAc,CACrC,EAAuB,EAAY,SAAS,CAElB,EAItD,SAAS,EAAQ,EAAe,EAAyB,CACvD,OAAQ,EAAQ,EAAU,IAAM,EAGlC,SAAS,EAAU,EAAc,EAAuB,CACtD,OAAO,EAAO,EAAQ,EAAO,EAG/B,SAAS,EAA4B,EAAwB,CAC3D,GAAI,CAAC,OAAO,UAAU,EAAS,EAAI,EAAW,EAC5C,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,kCAAkC,IAC5C,CAAC,CAIN,SAAS,EAA+B,EAAkB,EAAe,EAAuB,CAC9F,OAAO,EAAQ,KAAO,OAAO,EAAS,CAAG,EAAO,EAAM,CAGxD,SAAS,EAAuB,EAA+B,CAM7D,OAAO,GAJL,IAAkB,EACd,EACA,EAAQ,EAA8B,EAAW,OAAO,EAAc,CAAC,GAEvC,EAAY,MAA+B,EAAU,CAG7F,SAAS,EAAuB,EAAqC,CACnE,OAAO,EAA+B,EAAqB,IAAyB,QAAkB"}
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../utils/caip.cjs`),t=require(`../service-schemas.cjs`);let n=require(`zod`);const r=n.z.string().refine(t=>e.isCaip2ChainId(t),{message:`Invalid CAIP-2 chain ID`}).transform(e=>e),i=n.z.object({chainId:n.z.union([n.z.number(),n.z.string()]),chainType:n.z.string(),enabled_services:n.z.array(n.z.enum([`cross-chain-swap`,`cross-chain-quote`,`quote`,`swap`,`token-list`])),logo_url:n.z.url(),name:n.z.string()}),a=i.extend({chainId:n.z.coerce.number().int().nonnegative(),chainType:n.z.literal(`evm`),router:t.EvmAddressSchema,wrapped_token:t.EvmAddressSchema}),o=i.extend({chainId:n.z.string().refine(t=>e.isCaip2ChainId(t)&&t.startsWith(`solana:`),{error:`Is not a valid Solana CAIP-2 ID`}).transform(e=>e),chainType:n.z.literal(`svm`)}),s=n.z.array(n.z.union([a,o,i.refine(e=>e.chainType!==`evm`&&e.chainType!==`svm`,`Known chain types must match their expected schema`)])),c=n.z.array(n.z.object({address:t.EvmAddressSchema,decimals:n.z.number().int().nonnegative().max(18),logo_url:n.z.url(),name:n.z.string(),symbol:n.z.string()})),l=n.z.union([n.z.object({aggregator:n.z.object({id:n.z.string(),logo_url:n.z.url(),name:n.z.string()}),amountIn:n.z.coerce.bigint().nonnegative(),amountOut:n.z.coerce.bigint().nonnegative(),chainId:n.z.union([n.z.number().int().nonnegative(),r]),expiredAt:n.z.number().int().nonnegative(),fees:n.z.array(n.z.object({type:n.z.enum([`protocol`,`gas`,`bridge`,`slippage`,`swap`,`other`]),name:n.z.string(),amount:n.z.coerce.bigint().nonnegative(),token:n.z.object({chainId:n.z.union([n.z.number().int().nonnegative(),r]),address:n.z.union([t.EvmAddressSchema,t.SolAddressSchema])})})).optional(),gasEstimate:n.z.coerce.bigint().nonnegative().optional(),recommendedSlippage:n.z.number().int().nonnegative(),tokenIn:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),tokenInDecimals:n.z.number().int().nonnegative().max(18),tokenOut:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),tokenOutDecimals:n.z.number().int().nonnegative().max(18),uuid:n.z.uuid()}),n.z.object({done:n.z.literal(!0)})]),u=n.z.object({data:t.HexSchema,to:t.EvmAddressSchema,value:n.z.coerce.bigint().nonnegative()}),d=n.z.object({chainType:n.z.literal(`svm`),swapTransaction:n.z.base64()}),f=n.z.union([u,d]),p=n.z.object({fee:n.z.int().nonnegative(),name:n.z.string()}),m=/[zZ]|[+-]\d{2}:?\d{2}$/,h=n.z.iso.datetime({local:!0}).refine(e=>{let t=m.test(e)?e:e+`Z`;return n.z.iso.datetime().safeParse(t).success},{error:`Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)`}).transform(e=>m.test(e)?e:e+`Z`),g=n.z.object({messageId:n.z.string().nullable(),status:n.z.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`unknown`]),description:n.z.string(),sourceChain:n.z.object({name:n.z.string(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]),timestamp:h,finalized:h.or(n.z.boolean()).nullable()}),destinationChain:n.z.object({name:n.z.string().nullable(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]).nullable(),timestamp:h.nullable(),finalized:h.nullable()}),progress:n.z.object({committed:n.z.boolean(),commitTimestamp:h.nullable().optional(),executed:n.z.boolean()}),fees:n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]).nullable(),amount:n.z.coerce.bigint().nonnegative().nullable()}),transferredTokens:n.z.array(n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),amount:n.z.coerce.bigint().nonnegative()}))}),_=n.z.object({address:t.EvmAddressSchema});exports.CrossChainStatusResponseSchema=g,exports.PartnerInfoResponseSchema=p,exports.QuoteResponseSchema=l,exports.SpenderAddressResponseSchema=_,exports.SupportedChainsResponseSchema=s,exports.SwapResponseSchema=f,exports.TokenListResponseSchema=c;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../utils/caip.cjs`),t=require(`../service-schemas.cjs`);let n=require(`zod`);const r=n.z.string().refine(t=>e.isCaip2ChainId(t),{message:`Invalid CAIP-2 chain ID`}).transform(e=>e),i=n.z.object({chainId:n.z.union([n.z.number(),n.z.string()]),chainType:n.z.string(),enabled_services:n.z.array(n.z.enum([`cross-chain-swap`,`cross-chain-quote`,`quote`,`swap`,`token-list`])),logo_url:n.z.url(),name:n.z.string(),lanes:n.z.array(n.z.union([n.z.coerce.number().int().nonnegative(),r]))}),a=i.extend({chainId:n.z.coerce.number().int().nonnegative(),chainType:n.z.literal(`evm`),router:t.EvmAddressSchema.optional(),wrapped_token:t.EvmAddressSchema.optional()}),o=i.extend({chainId:n.z.string().refine(t=>e.isCaip2ChainId(t)&&t.startsWith(`solana:`),{error:`Is not a valid Solana CAIP-2 ID`}).transform(e=>e),chainType:n.z.literal(`svm`)}),s=n.z.array(n.z.union([a,o,i.refine(e=>e.chainType!==`evm`&&e.chainType!==`svm`,`Known chain types must match their expected schema`)])),c=n.z.array(n.z.object({address:t.EvmAddressSchema,decimals:n.z.number().int().nonnegative().max(18),logo_url:n.z.url(),name:n.z.string(),symbol:n.z.string()})),l=n.z.union([n.z.object({aggregator:n.z.object({id:n.z.string(),logo_url:n.z.url(),name:n.z.string()}),amountIn:n.z.coerce.bigint().nonnegative(),amountOut:n.z.coerce.bigint().nonnegative(),chainId:n.z.union([n.z.number().int().nonnegative(),r]),expiredAt:n.z.number().int().nonnegative(),fees:n.z.array(n.z.object({type:n.z.enum([`protocol`,`gas`,`bridge`,`slippage`,`swap`,`other`]),name:n.z.string(),amount:n.z.coerce.bigint().nonnegative(),token:n.z.object({chainId:n.z.union([n.z.number().int().nonnegative(),r]),address:n.z.union([t.EvmAddressSchema,t.SolAddressSchema])})})).optional(),gasEstimate:n.z.coerce.bigint().nonnegative().optional(),recommendedSlippage:n.z.number().int().nonnegative(),tokenIn:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),tokenInDecimals:n.z.number().int().nonnegative().max(18),tokenOut:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),tokenOutDecimals:n.z.number().int().nonnegative().max(18),uuid:n.z.uuid()}),n.z.object({done:n.z.literal(!0)})]),u=n.z.object({data:t.HexSchema,to:t.EvmAddressSchema,value:n.z.coerce.bigint().nonnegative()}),d=n.z.object({chainType:n.z.literal(`svm`),swapTransaction:n.z.base64()}),f=n.z.union([u,d]),p=n.z.object({fee:n.z.int().nonnegative(),name:n.z.string()}),m=/[zZ]|[+-]\d{2}:?\d{2}$/,h=n.z.iso.datetime({local:!0}).refine(e=>{let t=m.test(e)?e:e+`Z`;return n.z.iso.datetime().safeParse(t).success},{error:`Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)`}).transform(e=>m.test(e)?e:e+`Z`),g=n.z.object({messageId:n.z.string().nullable(),status:n.z.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`unknown`]),description:n.z.string(),sourceChain:n.z.object({name:n.z.string(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]),timestamp:h,finalized:h.or(n.z.boolean()).nullable()}),destinationChain:n.z.object({name:n.z.string().nullable(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]).nullable(),timestamp:h.nullable(),finalized:h.nullable()}),progress:n.z.object({committed:n.z.boolean(),commitTimestamp:h.nullable().optional(),executed:n.z.boolean()}),fees:n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]).nullable(),amount:n.z.coerce.bigint().nonnegative().nullable()}),transferredTokens:n.z.array(n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),amount:n.z.coerce.bigint().nonnegative()}))}),_=n.z.object({address:t.EvmAddressSchema});exports.CrossChainStatusResponseSchema=g,exports.PartnerInfoResponseSchema=p,exports.QuoteResponseSchema=l,exports.SpenderAddressResponseSchema=_,exports.SupportedChainsResponseSchema=s,exports.SwapResponseSchema=f,exports.TokenListResponseSchema=c;
2
2
  //# sourceMappingURL=_schema.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_schema.cjs","names":["z","isCaip2ChainId","EvmAddressSchema","SolAddressSchema","HexSchema","HashSchema","SolSignatureSchema"],"sources":["../../../src/transfer-service/markr/_schema.ts"],"sourcesContent":["import type { Signature, Address as SolAddress } from '@solana/kit';\nimport { z } from 'zod';\nimport type { Address as EvmAddress, Hash } from 'viem';\nimport { EvmAddressSchema, HashSchema, HexSchema, SolAddressSchema, SolSignatureSchema } from '../service-schemas';\nimport { isCaip2ChainId } from '../../utils/caip';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Hex } from '../../types/signer';\n\ninterface SupportedChainsResponseItemBase {\n chainId: number | string;\n chainType: string;\n /** Available services on the chain. Each service has specific functionality */\n enabled_services: Array<'cross-chain-swap' | 'cross-chain-quote' | 'quote' | 'swap' | 'token-list'>;\n /** Chain logo URL */\n logo_url: string;\n /** Chain display name */\n name: string;\n}\n\nexport interface SupportedChainsResponseItemEvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: number;\n /** Chain virtual machine type */\n chainType: 'evm';\n /** Router contract address */\n router: EvmAddress;\n /** Native token wrapped contract address */\n wrapped_token: EvmAddress;\n}\n\nexport interface SupportedChainsResponseItemSvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: Caip2ChainId;\n /** Chain virtual machine type */\n chainType: 'svm';\n}\n\nexport type SupportedChainsResponse = Array<\n SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm | SupportedChainsResponseItemBase\n>;\n\nexport const Caip2ChainIdSchema: z.ZodType<Caip2ChainId> = z\n .string()\n .refine((value) => isCaip2ChainId(value), {\n message: 'Invalid CAIP-2 chain ID',\n })\n .transform((value) => value as Caip2ChainId);\n\nconst SupportedChainsResponseItemBaseSchema = z.object({\n chainId: z.union([z.number(), z.string()]),\n chainType: z.string(),\n enabled_services: z.array(z.enum(['cross-chain-swap', 'cross-chain-quote', 'quote', 'swap', 'token-list'])),\n logo_url: z.url(),\n name: z.string(),\n});\n\nconst SupportedChainsResponseItemEvmSchema: z.ZodType<SupportedChainsResponseItemEvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z.coerce.number().int().nonnegative(),\n chainType: z.literal('evm'),\n router: EvmAddressSchema,\n wrapped_token: EvmAddressSchema,\n });\n\nconst SupportedChainsResponseItemSvmSchema: z.ZodType<SupportedChainsResponseItemSvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z\n .string()\n .refine((value) => isCaip2ChainId(value) && value.startsWith('solana:'), {\n error: 'Is not a valid Solana CAIP-2 ID',\n })\n .transform((value) => value as Caip2ChainId),\n chainType: z.literal('svm'),\n });\n\n/**\n * Schema for the response from Markr's /info/chains endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1info~1chains/get\n */\nexport const SupportedChainsResponseSchema: z.ZodType<SupportedChainsResponse> = z.array(\n z.union([\n SupportedChainsResponseItemEvmSchema,\n SupportedChainsResponseItemSvmSchema,\n SupportedChainsResponseItemBaseSchema.refine(\n (item) => item.chainType !== 'evm' && item.chainType !== 'svm',\n 'Known chain types must match their expected schema',\n ),\n ]),\n);\n\nexport type TokenListResponse = Array<{\n address: EvmAddress;\n decimals: number;\n logo_url: string;\n name: string;\n symbol: string;\n}>;\n\n/**\n * Schema for the response Markr's /tokens/{chainId}/list endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1tokens~1%7BchainId%7D~1list/get\n */\nexport const TokenListResponseSchema: z.ZodType<TokenListResponse> = z.array(\n z.object({\n address: EvmAddressSchema,\n decimals: z.number().int().nonnegative().max(18),\n logo_url: z.url(),\n name: z.string(),\n symbol: z.string(),\n }),\n);\n\nexport interface QuoteResponseData {\n aggregator: {\n id: string;\n logo_url: string;\n name: string;\n };\n amountIn: bigint;\n amountOut: bigint;\n /** Chain identifier (number for EVM chains, CAIP-2 ID for SVM chains) */\n chainId: number | Caip2ChainId;\n expiredAt: number;\n /**\n * Fee breakdown for cross-chain bridge transactions.\n *\n * Only included in quotes from cross-chain aggregators (DeBridge, LiFi).\n */\n fees?: ReadonlyArray<{\n type: 'protocol' | 'gas' | 'bridge' | 'slippage' | 'swap' | 'other';\n /** Human-readable fee name */\n name: string;\n /** Fee amount in token's smallest unit */\n amount: bigint;\n /** Token the fee is deducted from */\n token: {\n /** Chain ID where fee is deducted */\n chainId: number | Caip2ChainId;\n /** Token address (EVM hex or Solana base58) */\n address: EvmAddress | SolAddress;\n };\n }>;\n gasEstimate?: bigint;\n recommendedSlippage: number;\n /** Input token address (EVM hex or Solana base58) */\n tokenIn: EvmAddress | SolAddress;\n tokenInDecimals: number;\n /** Output token address (EVM hex or Solana base58) */\n tokenOut: EvmAddress | SolAddress;\n tokenOutDecimals: number;\n uuid: string;\n}\n\nexport interface QuoteResponseDataDone {\n done: true;\n}\n\nexport type QuoteResponse = QuoteResponseData | QuoteResponseDataDone;\n\n/**\n * Schema for the response from Markr's /quote endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1quote/post\n */\nexport const QuoteResponseSchema: z.ZodType<QuoteResponse> = z.union([\n z.object({\n aggregator: z.object({\n id: z.string(),\n logo_url: z.url(),\n name: z.string(),\n }),\n amountIn: z.coerce.bigint().nonnegative(),\n amountOut: z.coerce.bigint().nonnegative(),\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n /**\n * Unix time in seconds when the quote expires.\n */\n expiredAt: z.number().int().nonnegative(),\n fees: z\n .array(\n z.object({\n type: z.enum(['protocol', 'gas', 'bridge', 'slippage', 'swap', 'other']),\n name: z.string(),\n amount: z.coerce.bigint().nonnegative(),\n token: z.object({\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n address: z.union([EvmAddressSchema, SolAddressSchema]),\n }),\n }),\n )\n .optional(),\n /**\n * Estimated gas for the swap transaction.\n * Markr estimates already include a buffer.\n *\n * The API docs do not specify this field as optional, but in practice it can be missing.\n */\n gasEstimate: z.coerce.bigint().nonnegative().optional(),\n /** Recommended slippage in basis points. */\n recommendedSlippage: z.number().int().nonnegative(),\n tokenIn: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenInDecimals: z.number().int().nonnegative().max(18),\n tokenOut: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenOutDecimals: z.number().int().nonnegative().max(18),\n uuid: z.uuid(),\n }),\n z.object({\n done: z.literal(true),\n }),\n]);\n\n/**\n * Response type for Markr's /swap endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1swap/post\n */\nexport interface WrappedSwapTransactionResponse {\n data: Hex;\n to: EvmAddress;\n value: bigint;\n}\n\nexport const WrappedSwapTransactionResponseSchema: z.ZodType<WrappedSwapTransactionResponse> = z.object({\n data: HexSchema,\n to: EvmAddressSchema,\n value: z.coerce.bigint().nonnegative(),\n});\n\n/**\n * Solana swap transaction (returned for SVM chains).\n */\nexport interface SolanaSwapTransactionResponse {\n /** Chain type identifier */\n chainType: 'svm';\n /** Base64-encoded Solana transaction to be signed and sent by the client */\n swapTransaction: string;\n}\n\nexport const SolanaSwapTransactionResponseSchema: z.ZodType<SolanaSwapTransactionResponse> = z.object({\n chainType: z.literal('svm'),\n swapTransaction: z.base64(),\n});\n\nexport type SwapResponse = WrappedSwapTransactionResponse | SolanaSwapTransactionResponse;\n\nexport const SwapResponseSchema: z.ZodType<SwapResponse> = z.union([\n WrappedSwapTransactionResponseSchema,\n SolanaSwapTransactionResponseSchema,\n]);\n\nexport interface PartnerInfoResponse {\n /**\n * The partner fee in basis points collected on each swap.\n */\n fee: number;\n name: string;\n}\n\nexport const PartnerInfoResponseSchema: z.ZodType<PartnerInfoResponse> = z.object({\n fee: z.int().nonnegative(),\n name: z.string(),\n});\n\n/**\n * If the destination token is USDC, the flow is:\n * - pending -> committed -> completed\n *\n * If the destination token is not USDC, the flow is:\n * - pending -> committed -> pending_execution -> completed\n *\n * If the transaction fails at any point, the status will be 'failed'.\n */\nexport type CrossChainStatus =\n | /** Transaction submitted to CCIP */\n 'pending'\n /** Message committed, awaiting execution on destination chain */\n | 'committed'\n /** Message received on destination, swap pending execution by relayer */\n | 'pending_execution'\n /** Message executed successfully on destination chain */\n | 'completed'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /** CCIP message ID */\n messageId: string | null;\n /** Current status of the cross-chain transaction. */\n status: CrossChainStatus;\n /** Human-readable status description */\n description: string;\n /** Source chain information */\n sourceChain: {\n /** Source chain network name */\n name: string;\n /** Source chain transaction hash */\n transactionHash: Hash | Signature;\n /** Transaction timestamp on source chain (ISO 8601) */\n timestamp: string;\n /** When the source transaction was finalized (ISO 8601) */\n finalized: string | boolean | null;\n };\n /** Destination chain information */\n destinationChain: {\n /** Destination chain network name */\n name: string | null;\n /** Destination chain transaction hash (null if not yet executed) */\n transactionHash: Hash | Signature | null;\n /** Transaction timestamp on destination chain (null if not yet executed) (ISO 8601) */\n timestamp: string | null;\n /** When the destination transaction was finalized (null if not yet executed) (ISO 8601) */\n finalized: string | null;\n };\n /** Transaction progress information */\n progress: {\n /** Whether the message has been committed on destination chain */\n committed: boolean;\n /** When the message was committed (null if not committed) (ISO 8601) */\n commitTimestamp?: string | null;\n /** Whether the message has been executed on destination chain */\n executed: boolean;\n };\n /** Fee information */\n fees: {\n /** Fee token address */\n token: EvmAddress | SolAddress | null;\n /** Fee amount in wei */\n amount: bigint | null;\n };\n /** Tokens transferred in this cross-chain transaction */\n transferredTokens: ReadonlyArray<{\n /** Token address */\n token: EvmAddress | SolAddress;\n /** Token amount */\n amount: bigint;\n }>;\n}\n\nconst ISO_8601_TIMEZONE_DESIGNATOR_REGEX = /[zZ]|[+-]\\d{2}:?\\d{2}$/;\n\n// Markr API returns ISO-8601 datetime strings that are sometimes missing a timezone designator (\"local\" ISO).\n// We assume these are meant to be UTC and append 'Z' if missing, then validate as strict ISO-8601 with timezone.\nconst datetime = z.iso\n .datetime({ local: true })\n .refine(\n (value) => {\n // Accept at least local ISO format\n // If missing timezone, treat as UTC\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n const isoString = hasTimezone ? value : value + 'Z';\n // Validate as strict ISO-8601 with timezone\n return z.iso.datetime().safeParse(isoString).success;\n },\n {\n error: 'Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)',\n },\n )\n .transform((value) => {\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n return hasTimezone ? value : value + 'Z';\n });\n\nexport const CrossChainStatusResponseSchema: z.ZodType<CrossChainStatusResponse> = z.object({\n messageId: z.string().nullable(),\n status: z.enum(['pending', 'committed', 'pending_execution', 'completed', 'failed', 'unknown']),\n description: z.string(),\n sourceChain: z.object({\n name: z.string(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]),\n timestamp: datetime,\n finalized: datetime.or(z.boolean()).nullable(),\n }),\n destinationChain: z.object({\n name: z.string().nullable(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]).nullable(),\n timestamp: datetime.nullable(),\n finalized: datetime.nullable(),\n }),\n progress: z.object({\n committed: z.boolean(),\n commitTimestamp: datetime.nullable().optional(),\n executed: z.boolean(),\n }),\n fees: z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n }),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n});\n\nexport interface SpenderAddressResponse {\n address: EvmAddress;\n}\n\nexport const SpenderAddressResponseSchema: z.ZodType<SpenderAddressResponse> = z.object({\n address: EvmAddressSchema,\n});\n"],"mappings":"iJAyCA,MAAa,EAA8CA,EAAAA,EACxD,QAAQ,CACR,OAAQ,GAAUC,EAAAA,eAAe,EAAM,CAAE,CACxC,QAAS,0BACV,CAAC,CACD,UAAW,GAAU,EAAsB,CAExC,EAAwCD,EAAAA,EAAE,OAAO,CACrD,QAASA,EAAAA,EAAE,MAAM,CAACA,EAAAA,EAAE,QAAQ,CAAEA,EAAAA,EAAE,QAAQ,CAAC,CAAC,CAC1C,UAAWA,EAAAA,EAAE,QAAQ,CACrB,iBAAkBA,EAAAA,EAAE,MAAMA,EAAAA,EAAE,KAAK,CAAC,mBAAoB,oBAAqB,QAAS,OAAQ,aAAa,CAAC,CAAC,CAC3G,SAAUA,EAAAA,EAAE,KAAK,CACjB,KAAMA,EAAAA,EAAE,QAAQ,CACjB,CAAC,CAEI,EACJ,EAAsC,OAAO,CAC3C,QAASA,EAAAA,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAC9C,UAAWA,EAAAA,EAAE,QAAQ,MAAM,CAC3B,OAAQE,EAAAA,iBACR,cAAeA,EAAAA,iBAChB,CAAC,CAEE,EACJ,EAAsC,OAAO,CAC3C,QAASF,EAAAA,EACN,QAAQ,CACR,OAAQ,GAAUC,EAAAA,eAAe,EAAM,EAAI,EAAM,WAAW,UAAU,CAAE,CACvE,MAAO,kCACR,CAAC,CACD,UAAW,GAAU,EAAsB,CAC9C,UAAWD,EAAAA,EAAE,QAAQ,MAAM,CAC5B,CAAC,CAOS,EAAoEA,EAAAA,EAAE,MACjFA,EAAAA,EAAE,MAAM,CACN,EACA,EACA,EAAsC,OACnC,GAAS,EAAK,YAAc,OAAS,EAAK,YAAc,MACzD,qDACD,CACF,CAAC,CACH,CAeY,EAAwDA,EAAAA,EAAE,MACrEA,EAAAA,EAAE,OAAO,CACP,QAASE,EAAAA,iBACT,SAAUF,EAAAA,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,CAChD,SAAUA,EAAAA,EAAE,KAAK,CACjB,KAAMA,EAAAA,EAAE,QAAQ,CAChB,OAAQA,EAAAA,EAAE,QAAQ,CACnB,CAAC,CACH,CAsDY,EAAgDA,EAAAA,EAAE,MAAM,CACnEA,EAAAA,EAAE,OAAO,CACP,WAAYA,EAAAA,EAAE,OAAO,CACnB,GAAIA,EAAAA,EAAE,QAAQ,CACd,SAAUA,EAAAA,EAAE,KAAK,CACjB,KAAMA,EAAAA,EAAE,QAAQ,CACjB,CAAC,CACF,SAAUA,EAAAA,EAAE,OAAO,QAAQ,CAAC,aAAa,CACzC,UAAWA,EAAAA,EAAE,OAAO,QAAQ,CAAC,aAAa,CAC1C,QAASA,EAAAA,EAAE,MAAM,CAACA,EAAAA,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAE,EAAmB,CAAC,CAItE,UAAWA,EAAAA,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CACzC,KAAMA,EAAAA,EACH,MACCA,EAAAA,EAAE,OAAO,CACP,KAAMA,EAAAA,EAAE,KAAK,CAAC,WAAY,MAAO,SAAU,WAAY,OAAQ,QAAQ,CAAC,CACxE,KAAMA,EAAAA,EAAE,QAAQ,CAChB,OAAQA,EAAAA,EAAE,OAAO,QAAQ,CAAC,aAAa,CACvC,MAAOA,EAAAA,EAAE,OAAO,CACd,QAASA,EAAAA,EAAE,MAAM,CAACA,EAAAA,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAE,EAAmB,CAAC,CACtE,QAASA,EAAAA,EAAE,MAAM,CAACE,EAAAA,iBAAkBC,EAAAA,iBAAiB,CAAC,CACvD,CAAC,CACH,CAAC,CACH,CACA,UAAU,CAOb,YAAaH,EAAAA,EAAE,OAAO,QAAQ,CAAC,aAAa,CAAC,UAAU,CAEvD,oBAAqBA,EAAAA,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CACnD,QAASA,EAAAA,EAAE,MAAM,CAACE,EAAAA,iBAAkBC,EAAAA,iBAAiB,CAAC,CACtD,gBAAiBH,EAAAA,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,CACvD,SAAUA,EAAAA,EAAE,MAAM,CAACE,EAAAA,iBAAkBC,EAAAA,iBAAiB,CAAC,CACvD,iBAAkBH,EAAAA,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,CACxD,KAAMA,EAAAA,EAAE,MAAM,CACf,CAAC,CACFA,EAAAA,EAAE,OAAO,CACP,KAAMA,EAAAA,EAAE,QAAQ,GAAK,CACtB,CAAC,CACH,CAAC,CAaW,EAAkFA,EAAAA,EAAE,OAAO,CACtG,KAAMI,EAAAA,UACN,GAAIF,EAAAA,iBACJ,MAAOF,EAAAA,EAAE,OAAO,QAAQ,CAAC,aAAa,CACvC,CAAC,CAYW,EAAgFA,EAAAA,EAAE,OAAO,CACpG,UAAWA,EAAAA,EAAE,QAAQ,MAAM,CAC3B,gBAAiBA,EAAAA,EAAE,QAAQ,CAC5B,CAAC,CAIW,EAA8CA,EAAAA,EAAE,MAAM,CACjE,EACA,EACD,CAAC,CAUW,EAA4DA,EAAAA,EAAE,OAAO,CAChF,IAAKA,EAAAA,EAAE,KAAK,CAAC,aAAa,CAC1B,KAAMA,EAAAA,EAAE,QAAQ,CACjB,CAAC,CA+EI,EAAqC,yBAIrC,EAAWA,EAAAA,EAAE,IAChB,SAAS,CAAE,MAAO,GAAM,CAAC,CACzB,OACE,GAAU,CAIT,IAAM,EADc,EAAmC,KAAK,EAAM,CAClC,EAAQ,EAAQ,IAEhD,OAAOA,EAAAA,EAAE,IAAI,UAAU,CAAC,UAAU,EAAU,CAAC,SAE/C,CACE,MAAO,gFACR,CACF,CACA,UAAW,GACU,EAAmC,KAAK,EAAM,CAC7C,EAAQ,EAAQ,IACrC,CAES,EAAsEA,EAAAA,EAAE,OAAO,CAC1F,UAAWA,EAAAA,EAAE,QAAQ,CAAC,UAAU,CAChC,OAAQA,EAAAA,EAAE,KAAK,CAAC,UAAW,YAAa,oBAAqB,YAAa,SAAU,UAAU,CAAC,CAC/F,YAAaA,EAAAA,EAAE,QAAQ,CACvB,YAAaA,EAAAA,EAAE,OAAO,CACpB,KAAMA,EAAAA,EAAE,QAAQ,CAChB,gBAAiBA,EAAAA,EAAE,MAAM,CAACK,EAAAA,WAAYC,EAAAA,mBAAmB,CAAC,CAC1D,UAAW,EACX,UAAW,EAAS,GAAGN,EAAAA,EAAE,SAAS,CAAC,CAAC,UAAU,CAC/C,CAAC,CACF,iBAAkBA,EAAAA,EAAE,OAAO,CACzB,KAAMA,EAAAA,EAAE,QAAQ,CAAC,UAAU,CAC3B,gBAAiBA,EAAAA,EAAE,MAAM,CAACK,EAAAA,WAAYC,EAAAA,mBAAmB,CAAC,CAAC,UAAU,CACrE,UAAW,EAAS,UAAU,CAC9B,UAAW,EAAS,UAAU,CAC/B,CAAC,CACF,SAAUN,EAAAA,EAAE,OAAO,CACjB,UAAWA,EAAAA,EAAE,SAAS,CACtB,gBAAiB,EAAS,UAAU,CAAC,UAAU,CAC/C,SAAUA,EAAAA,EAAE,SAAS,CACtB,CAAC,CACF,KAAMA,EAAAA,EAAE,OAAO,CACb,MAAOA,EAAAA,EAAE,MAAM,CAACE,EAAAA,iBAAkBC,EAAAA,iBAAiB,CAAC,CAAC,UAAU,CAC/D,OAAQH,EAAAA,EAAE,OAAO,QAAQ,CAAC,aAAa,CAAC,UAAU,CACnD,CAAC,CACF,kBAAmBA,EAAAA,EAAE,MACnBA,EAAAA,EAAE,OAAO,CACP,MAAOA,EAAAA,EAAE,MAAM,CAACE,EAAAA,iBAAkBC,EAAAA,iBAAiB,CAAC,CACpD,OAAQH,EAAAA,EAAE,OAAO,QAAQ,CAAC,aAAa,CACxC,CAAC,CACH,CACF,CAAC,CAMW,EAAkEA,EAAAA,EAAE,OAAO,CACtF,QAASE,EAAAA,iBACV,CAAC"}
1
+ {"version":3,"file":"_schema.cjs","names":["z","isCaip2ChainId","EvmAddressSchema","SolAddressSchema","HexSchema","HashSchema","SolSignatureSchema"],"sources":["../../../src/transfer-service/markr/_schema.ts"],"sourcesContent":["import type { Signature, Address as SolAddress } from '@solana/kit';\nimport { z } from 'zod';\nimport type { Address as EvmAddress, Hash } from 'viem';\nimport { EvmAddressSchema, HashSchema, HexSchema, SolAddressSchema, SolSignatureSchema } from '../service-schemas';\nimport { isCaip2ChainId } from '../../utils/caip';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Hex } from '../../types/signer';\n\ninterface SupportedChainsResponseItemBase {\n chainId: number | string;\n chainType: string;\n /** Available services on the chain. Each service has specific functionality */\n enabled_services: Array<'cross-chain-swap' | 'cross-chain-quote' | 'quote' | 'swap' | 'token-list'>;\n /** Chain logo URL */\n logo_url: string;\n /** Chain display name */\n name: string;\n /**\n * List of chain IDs that this chain can swap to via cross-chain aggregators.\n *\n * Empty array means no cross-chain routes available.\n */\n lanes: ReadonlyArray<number | Caip2ChainId>;\n}\n\nexport interface SupportedChainsResponseItemEvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: number;\n /** Chain virtual machine type */\n chainType: 'evm';\n /** Router contract address */\n router?: EvmAddress;\n /** Native token wrapped contract address */\n wrapped_token?: EvmAddress;\n}\n\nexport interface SupportedChainsResponseItemSvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: Caip2ChainId;\n /** Chain virtual machine type */\n chainType: 'svm';\n}\n\nexport type SupportedChainsResponse = Array<\n SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm | SupportedChainsResponseItemBase\n>;\n\nexport const Caip2ChainIdSchema: z.ZodType<Caip2ChainId> = z\n .string()\n .refine((value) => isCaip2ChainId(value), {\n message: 'Invalid CAIP-2 chain ID',\n })\n .transform((value) => value as Caip2ChainId);\n\nconst SupportedChainsResponseItemBaseSchema = z.object({\n chainId: z.union([z.number(), z.string()]),\n chainType: z.string(),\n enabled_services: z.array(z.enum(['cross-chain-swap', 'cross-chain-quote', 'quote', 'swap', 'token-list'])),\n logo_url: z.url(),\n name: z.string(),\n lanes: z.array(z.union([z.coerce.number().int().nonnegative(), Caip2ChainIdSchema])),\n});\n\nconst SupportedChainsResponseItemEvmSchema: z.ZodType<SupportedChainsResponseItemEvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z.coerce.number().int().nonnegative(),\n chainType: z.literal('evm'),\n router: EvmAddressSchema.optional(),\n wrapped_token: EvmAddressSchema.optional(),\n });\n\nconst SupportedChainsResponseItemSvmSchema: z.ZodType<SupportedChainsResponseItemSvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z\n .string()\n .refine((value) => isCaip2ChainId(value) && value.startsWith('solana:'), {\n error: 'Is not a valid Solana CAIP-2 ID',\n })\n .transform((value) => value as Caip2ChainId),\n chainType: z.literal('svm'),\n });\n\n/**\n * Schema for the response from Markr's /info/chains endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1info~1chains/get\n */\nexport const SupportedChainsResponseSchema: z.ZodType<SupportedChainsResponse> = z.array(\n z.union([\n SupportedChainsResponseItemEvmSchema,\n SupportedChainsResponseItemSvmSchema,\n SupportedChainsResponseItemBaseSchema.refine(\n (item) => item.chainType !== 'evm' && item.chainType !== 'svm',\n 'Known chain types must match their expected schema',\n ),\n ]),\n);\n\nexport type TokenListResponse = Array<{\n address: EvmAddress;\n decimals: number;\n logo_url: string;\n name: string;\n symbol: string;\n}>;\n\n/**\n * Schema for the response Markr's /tokens/{chainId}/list endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1tokens~1%7BchainId%7D~1list/get\n */\nexport const TokenListResponseSchema: z.ZodType<TokenListResponse> = z.array(\n z.object({\n address: EvmAddressSchema,\n decimals: z.number().int().nonnegative().max(18),\n logo_url: z.url(),\n name: z.string(),\n symbol: z.string(),\n }),\n);\n\nexport interface QuoteResponseData {\n aggregator: {\n id: string;\n logo_url: string;\n name: string;\n };\n amountIn: bigint;\n amountOut: bigint;\n /** Chain identifier (number for EVM chains, CAIP-2 ID for SVM chains) */\n chainId: number | Caip2ChainId;\n expiredAt: number;\n /**\n * Fee breakdown for cross-chain bridge transactions.\n *\n * Only included in quotes from cross-chain aggregators (DeBridge, LiFi).\n */\n fees?: ReadonlyArray<{\n type: 'protocol' | 'gas' | 'bridge' | 'slippage' | 'swap' | 'other';\n /** Human-readable fee name */\n name: string;\n /** Fee amount in token's smallest unit */\n amount: bigint;\n /** Token the fee is deducted from */\n token: {\n /** Chain ID where fee is deducted */\n chainId: number | Caip2ChainId;\n /** Token address (EVM hex or Solana base58) */\n address: EvmAddress | SolAddress;\n };\n }>;\n gasEstimate?: bigint;\n recommendedSlippage: number;\n /** Input token address (EVM hex or Solana base58) */\n tokenIn: EvmAddress | SolAddress;\n tokenInDecimals: number;\n /** Output token address (EVM hex or Solana base58) */\n tokenOut: EvmAddress | SolAddress;\n tokenOutDecimals: number;\n uuid: string;\n}\n\nexport interface QuoteResponseDataDone {\n done: true;\n}\n\nexport type QuoteResponse = QuoteResponseData | QuoteResponseDataDone;\n\n/**\n * Schema for the response from Markr's /quote endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1quote/post\n */\nexport const QuoteResponseSchema: z.ZodType<QuoteResponse> = z.union([\n z.object({\n aggregator: z.object({\n id: z.string(),\n logo_url: z.url(),\n name: z.string(),\n }),\n amountIn: z.coerce.bigint().nonnegative(),\n amountOut: z.coerce.bigint().nonnegative(),\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n /**\n * Unix time in seconds when the quote expires.\n */\n expiredAt: z.number().int().nonnegative(),\n fees: z\n .array(\n z.object({\n type: z.enum(['protocol', 'gas', 'bridge', 'slippage', 'swap', 'other']),\n name: z.string(),\n amount: z.coerce.bigint().nonnegative(),\n token: z.object({\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n address: z.union([EvmAddressSchema, SolAddressSchema]),\n }),\n }),\n )\n .optional(),\n /**\n * Estimated gas for the swap transaction.\n * Markr estimates already include a buffer.\n *\n * The API docs do not specify this field as optional, but in practice it can be missing.\n */\n gasEstimate: z.coerce.bigint().nonnegative().optional(),\n /** Recommended slippage in basis points. */\n recommendedSlippage: z.number().int().nonnegative(),\n tokenIn: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenInDecimals: z.number().int().nonnegative().max(18),\n tokenOut: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenOutDecimals: z.number().int().nonnegative().max(18),\n uuid: z.uuid(),\n }),\n z.object({\n done: z.literal(true),\n }),\n]);\n\n/**\n * Response type for Markr's /swap endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1swap/post\n */\nexport interface WrappedSwapTransactionResponse {\n data: Hex;\n to: EvmAddress;\n value: bigint;\n}\n\nexport const WrappedSwapTransactionResponseSchema: z.ZodType<WrappedSwapTransactionResponse> = z.object({\n data: HexSchema,\n to: EvmAddressSchema,\n value: z.coerce.bigint().nonnegative(),\n});\n\n/**\n * Solana swap transaction (returned for SVM chains).\n */\nexport interface SolanaSwapTransactionResponse {\n /** Chain type identifier */\n chainType: 'svm';\n /** Base64-encoded Solana transaction to be signed and sent by the client */\n swapTransaction: string;\n}\n\nexport const SolanaSwapTransactionResponseSchema: z.ZodType<SolanaSwapTransactionResponse> = z.object({\n chainType: z.literal('svm'),\n swapTransaction: z.base64(),\n});\n\nexport type SwapResponse = WrappedSwapTransactionResponse | SolanaSwapTransactionResponse;\n\nexport const SwapResponseSchema: z.ZodType<SwapResponse> = z.union([\n WrappedSwapTransactionResponseSchema,\n SolanaSwapTransactionResponseSchema,\n]);\n\nexport interface PartnerInfoResponse {\n /**\n * The partner fee in basis points collected on each swap.\n */\n fee: number;\n name: string;\n}\n\nexport const PartnerInfoResponseSchema: z.ZodType<PartnerInfoResponse> = z.object({\n fee: z.int().nonnegative(),\n name: z.string(),\n});\n\n/**\n * If the destination token is USDC, the flow is:\n * - pending -> committed -> completed\n *\n * If the destination token is not USDC, the flow is:\n * - pending -> committed -> pending_execution -> completed\n *\n * If the transaction fails at any point, the status will be 'failed'.\n */\nexport type CrossChainStatus =\n | /** Transaction submitted to CCIP */\n 'pending'\n /** Message committed, awaiting execution on destination chain */\n | 'committed'\n /** Message received on destination, swap pending execution by relayer */\n | 'pending_execution'\n /** Message executed successfully on destination chain */\n | 'completed'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /** CCIP message ID */\n messageId: string | null;\n /** Current status of the cross-chain transaction. */\n status: CrossChainStatus;\n /** Human-readable status description */\n description: string;\n /** Source chain information */\n sourceChain: {\n /** Source chain network name */\n name: string;\n /** Source chain transaction hash */\n transactionHash: Hash | Signature;\n /** Transaction timestamp on source chain (ISO 8601) */\n timestamp: string;\n /** When the source transaction was finalized (ISO 8601) */\n finalized: string | boolean | null;\n };\n /** Destination chain information */\n destinationChain: {\n /** Destination chain network name */\n name: string | null;\n /** Destination chain transaction hash (null if not yet executed) */\n transactionHash: Hash | Signature | null;\n /** Transaction timestamp on destination chain (null if not yet executed) (ISO 8601) */\n timestamp: string | null;\n /** When the destination transaction was finalized (null if not yet executed) (ISO 8601) */\n finalized: string | null;\n };\n /** Transaction progress information */\n progress: {\n /** Whether the message has been committed on destination chain */\n committed: boolean;\n /** When the message was committed (null if not committed) (ISO 8601) */\n commitTimestamp?: string | null;\n /** Whether the message has been executed on destination chain */\n executed: boolean;\n };\n /** Fee information */\n fees: {\n /** Fee token address */\n token: EvmAddress | SolAddress | null;\n /** Fee amount in wei */\n amount: bigint | null;\n };\n /** Tokens transferred in this cross-chain transaction */\n transferredTokens: ReadonlyArray<{\n /** Token address */\n token: EvmAddress | SolAddress;\n /** Token amount */\n amount: bigint;\n }>;\n}\n\nconst ISO_8601_TIMEZONE_DESIGNATOR_REGEX = /[zZ]|[+-]\\d{2}:?\\d{2}$/;\n\n// Markr API returns ISO-8601 datetime strings that are sometimes missing a timezone designator (\"local\" ISO).\n// We assume these are meant to be UTC and append 'Z' if missing, then validate as strict ISO-8601 with timezone.\nconst datetime = z.iso\n .datetime({ local: true })\n .refine(\n (value) => {\n // Accept at least local ISO format\n // If missing timezone, treat as UTC\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n const isoString = hasTimezone ? value : value + 'Z';\n // Validate as strict ISO-8601 with timezone\n return z.iso.datetime().safeParse(isoString).success;\n },\n {\n error: 'Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)',\n },\n )\n .transform((value) => {\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n return hasTimezone ? value : value + 'Z';\n });\n\nexport const CrossChainStatusResponseSchema: z.ZodType<CrossChainStatusResponse> = z.object({\n messageId: z.string().nullable(),\n status: z.enum(['pending', 'committed', 'pending_execution', 'completed', 'failed', 'unknown']),\n description: z.string(),\n sourceChain: z.object({\n name: z.string(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]),\n timestamp: datetime,\n finalized: datetime.or(z.boolean()).nullable(),\n }),\n destinationChain: z.object({\n name: z.string().nullable(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]).nullable(),\n timestamp: datetime.nullable(),\n finalized: datetime.nullable(),\n }),\n progress: z.object({\n committed: z.boolean(),\n commitTimestamp: datetime.nullable().optional(),\n executed: z.boolean(),\n }),\n fees: z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n }),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n});\n\nexport interface SpenderAddressResponse {\n address: EvmAddress;\n}\n\nexport const SpenderAddressResponseSchema: z.ZodType<SpenderAddressResponse> = z.object({\n address: EvmAddressSchema,\n});\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{isCaip2ChainId as e}from"../../utils/caip.js";import{EvmAddressSchema as t,HashSchema as n,HexSchema as r,SolAddressSchema as i,SolSignatureSchema as a}from"../service-schemas.js";import{z as o}from"zod";const s=o.string().refine(t=>e(t),{message:`Invalid CAIP-2 chain ID`}).transform(e=>e),c=o.object({chainId:o.union([o.number(),o.string()]),chainType:o.string(),enabled_services:o.array(o.enum([`cross-chain-swap`,`cross-chain-quote`,`quote`,`swap`,`token-list`])),logo_url:o.url(),name:o.string()}),l=c.extend({chainId:o.coerce.number().int().nonnegative(),chainType:o.literal(`evm`),router:t,wrapped_token:t}),u=c.extend({chainId:o.string().refine(t=>e(t)&&t.startsWith(`solana:`),{error:`Is not a valid Solana CAIP-2 ID`}).transform(e=>e),chainType:o.literal(`svm`)}),d=o.array(o.union([l,u,c.refine(e=>e.chainType!==`evm`&&e.chainType!==`svm`,`Known chain types must match their expected schema`)])),f=o.array(o.object({address:t,decimals:o.number().int().nonnegative().max(18),logo_url:o.url(),name:o.string(),symbol:o.string()})),p=o.union([o.object({aggregator:o.object({id:o.string(),logo_url:o.url(),name:o.string()}),amountIn:o.coerce.bigint().nonnegative(),amountOut:o.coerce.bigint().nonnegative(),chainId:o.union([o.number().int().nonnegative(),s]),expiredAt:o.number().int().nonnegative(),fees:o.array(o.object({type:o.enum([`protocol`,`gas`,`bridge`,`slippage`,`swap`,`other`]),name:o.string(),amount:o.coerce.bigint().nonnegative(),token:o.object({chainId:o.union([o.number().int().nonnegative(),s]),address:o.union([t,i])})})).optional(),gasEstimate:o.coerce.bigint().nonnegative().optional(),recommendedSlippage:o.number().int().nonnegative(),tokenIn:o.union([t,i]),tokenInDecimals:o.number().int().nonnegative().max(18),tokenOut:o.union([t,i]),tokenOutDecimals:o.number().int().nonnegative().max(18),uuid:o.uuid()}),o.object({done:o.literal(!0)})]),m=o.object({data:r,to:t,value:o.coerce.bigint().nonnegative()}),h=o.object({chainType:o.literal(`svm`),swapTransaction:o.base64()}),g=o.union([m,h]),_=o.object({fee:o.int().nonnegative(),name:o.string()}),v=/[zZ]|[+-]\d{2}:?\d{2}$/,y=o.iso.datetime({local:!0}).refine(e=>{let t=v.test(e)?e:e+`Z`;return o.iso.datetime().safeParse(t).success},{error:`Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)`}).transform(e=>v.test(e)?e:e+`Z`),b=o.object({messageId:o.string().nullable(),status:o.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`unknown`]),description:o.string(),sourceChain:o.object({name:o.string(),transactionHash:o.union([n,a]),timestamp:y,finalized:y.or(o.boolean()).nullable()}),destinationChain:o.object({name:o.string().nullable(),transactionHash:o.union([n,a]).nullable(),timestamp:y.nullable(),finalized:y.nullable()}),progress:o.object({committed:o.boolean(),commitTimestamp:y.nullable().optional(),executed:o.boolean()}),fees:o.object({token:o.union([t,i]).nullable(),amount:o.coerce.bigint().nonnegative().nullable()}),transferredTokens:o.array(o.object({token:o.union([t,i]),amount:o.coerce.bigint().nonnegative()}))}),x=o.object({address:t});export{b as CrossChainStatusResponseSchema,_ as PartnerInfoResponseSchema,p as QuoteResponseSchema,x as SpenderAddressResponseSchema,d as SupportedChainsResponseSchema,g as SwapResponseSchema,f as TokenListResponseSchema};
1
+ import{isCaip2ChainId as e}from"../../utils/caip.js";import{EvmAddressSchema as t,HashSchema as n,HexSchema as r,SolAddressSchema as i,SolSignatureSchema as a}from"../service-schemas.js";import{z as o}from"zod";const s=o.string().refine(t=>e(t),{message:`Invalid CAIP-2 chain ID`}).transform(e=>e),c=o.object({chainId:o.union([o.number(),o.string()]),chainType:o.string(),enabled_services:o.array(o.enum([`cross-chain-swap`,`cross-chain-quote`,`quote`,`swap`,`token-list`])),logo_url:o.url(),name:o.string(),lanes:o.array(o.union([o.coerce.number().int().nonnegative(),s]))}),l=c.extend({chainId:o.coerce.number().int().nonnegative(),chainType:o.literal(`evm`),router:t.optional(),wrapped_token:t.optional()}),u=c.extend({chainId:o.string().refine(t=>e(t)&&t.startsWith(`solana:`),{error:`Is not a valid Solana CAIP-2 ID`}).transform(e=>e),chainType:o.literal(`svm`)}),d=o.array(o.union([l,u,c.refine(e=>e.chainType!==`evm`&&e.chainType!==`svm`,`Known chain types must match their expected schema`)])),f=o.array(o.object({address:t,decimals:o.number().int().nonnegative().max(18),logo_url:o.url(),name:o.string(),symbol:o.string()})),p=o.union([o.object({aggregator:o.object({id:o.string(),logo_url:o.url(),name:o.string()}),amountIn:o.coerce.bigint().nonnegative(),amountOut:o.coerce.bigint().nonnegative(),chainId:o.union([o.number().int().nonnegative(),s]),expiredAt:o.number().int().nonnegative(),fees:o.array(o.object({type:o.enum([`protocol`,`gas`,`bridge`,`slippage`,`swap`,`other`]),name:o.string(),amount:o.coerce.bigint().nonnegative(),token:o.object({chainId:o.union([o.number().int().nonnegative(),s]),address:o.union([t,i])})})).optional(),gasEstimate:o.coerce.bigint().nonnegative().optional(),recommendedSlippage:o.number().int().nonnegative(),tokenIn:o.union([t,i]),tokenInDecimals:o.number().int().nonnegative().max(18),tokenOut:o.union([t,i]),tokenOutDecimals:o.number().int().nonnegative().max(18),uuid:o.uuid()}),o.object({done:o.literal(!0)})]),m=o.object({data:r,to:t,value:o.coerce.bigint().nonnegative()}),h=o.object({chainType:o.literal(`svm`),swapTransaction:o.base64()}),g=o.union([m,h]),_=o.object({fee:o.int().nonnegative(),name:o.string()}),v=/[zZ]|[+-]\d{2}:?\d{2}$/,y=o.iso.datetime({local:!0}).refine(e=>{let t=v.test(e)?e:e+`Z`;return o.iso.datetime().safeParse(t).success},{error:`Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)`}).transform(e=>v.test(e)?e:e+`Z`),b=o.object({messageId:o.string().nullable(),status:o.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`unknown`]),description:o.string(),sourceChain:o.object({name:o.string(),transactionHash:o.union([n,a]),timestamp:y,finalized:y.or(o.boolean()).nullable()}),destinationChain:o.object({name:o.string().nullable(),transactionHash:o.union([n,a]).nullable(),timestamp:y.nullable(),finalized:y.nullable()}),progress:o.object({committed:o.boolean(),commitTimestamp:y.nullable().optional(),executed:o.boolean()}),fees:o.object({token:o.union([t,i]).nullable(),amount:o.coerce.bigint().nonnegative().nullable()}),transferredTokens:o.array(o.object({token:o.union([t,i]),amount:o.coerce.bigint().nonnegative()}))}),x=o.object({address:t});export{b as CrossChainStatusResponseSchema,_ as PartnerInfoResponseSchema,p as QuoteResponseSchema,x as SpenderAddressResponseSchema,d as SupportedChainsResponseSchema,g as SwapResponseSchema,f as TokenListResponseSchema};
2
2
  //# sourceMappingURL=_schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_schema.js","names":[],"sources":["../../../src/transfer-service/markr/_schema.ts"],"sourcesContent":["import type { Signature, Address as SolAddress } from '@solana/kit';\nimport { z } from 'zod';\nimport type { Address as EvmAddress, Hash } from 'viem';\nimport { EvmAddressSchema, HashSchema, HexSchema, SolAddressSchema, SolSignatureSchema } from '../service-schemas';\nimport { isCaip2ChainId } from '../../utils/caip';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Hex } from '../../types/signer';\n\ninterface SupportedChainsResponseItemBase {\n chainId: number | string;\n chainType: string;\n /** Available services on the chain. Each service has specific functionality */\n enabled_services: Array<'cross-chain-swap' | 'cross-chain-quote' | 'quote' | 'swap' | 'token-list'>;\n /** Chain logo URL */\n logo_url: string;\n /** Chain display name */\n name: string;\n}\n\nexport interface SupportedChainsResponseItemEvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: number;\n /** Chain virtual machine type */\n chainType: 'evm';\n /** Router contract address */\n router: EvmAddress;\n /** Native token wrapped contract address */\n wrapped_token: EvmAddress;\n}\n\nexport interface SupportedChainsResponseItemSvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: Caip2ChainId;\n /** Chain virtual machine type */\n chainType: 'svm';\n}\n\nexport type SupportedChainsResponse = Array<\n SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm | SupportedChainsResponseItemBase\n>;\n\nexport const Caip2ChainIdSchema: z.ZodType<Caip2ChainId> = z\n .string()\n .refine((value) => isCaip2ChainId(value), {\n message: 'Invalid CAIP-2 chain ID',\n })\n .transform((value) => value as Caip2ChainId);\n\nconst SupportedChainsResponseItemBaseSchema = z.object({\n chainId: z.union([z.number(), z.string()]),\n chainType: z.string(),\n enabled_services: z.array(z.enum(['cross-chain-swap', 'cross-chain-quote', 'quote', 'swap', 'token-list'])),\n logo_url: z.url(),\n name: z.string(),\n});\n\nconst SupportedChainsResponseItemEvmSchema: z.ZodType<SupportedChainsResponseItemEvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z.coerce.number().int().nonnegative(),\n chainType: z.literal('evm'),\n router: EvmAddressSchema,\n wrapped_token: EvmAddressSchema,\n });\n\nconst SupportedChainsResponseItemSvmSchema: z.ZodType<SupportedChainsResponseItemSvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z\n .string()\n .refine((value) => isCaip2ChainId(value) && value.startsWith('solana:'), {\n error: 'Is not a valid Solana CAIP-2 ID',\n })\n .transform((value) => value as Caip2ChainId),\n chainType: z.literal('svm'),\n });\n\n/**\n * Schema for the response from Markr's /info/chains endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1info~1chains/get\n */\nexport const SupportedChainsResponseSchema: z.ZodType<SupportedChainsResponse> = z.array(\n z.union([\n SupportedChainsResponseItemEvmSchema,\n SupportedChainsResponseItemSvmSchema,\n SupportedChainsResponseItemBaseSchema.refine(\n (item) => item.chainType !== 'evm' && item.chainType !== 'svm',\n 'Known chain types must match their expected schema',\n ),\n ]),\n);\n\nexport type TokenListResponse = Array<{\n address: EvmAddress;\n decimals: number;\n logo_url: string;\n name: string;\n symbol: string;\n}>;\n\n/**\n * Schema for the response Markr's /tokens/{chainId}/list endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1tokens~1%7BchainId%7D~1list/get\n */\nexport const TokenListResponseSchema: z.ZodType<TokenListResponse> = z.array(\n z.object({\n address: EvmAddressSchema,\n decimals: z.number().int().nonnegative().max(18),\n logo_url: z.url(),\n name: z.string(),\n symbol: z.string(),\n }),\n);\n\nexport interface QuoteResponseData {\n aggregator: {\n id: string;\n logo_url: string;\n name: string;\n };\n amountIn: bigint;\n amountOut: bigint;\n /** Chain identifier (number for EVM chains, CAIP-2 ID for SVM chains) */\n chainId: number | Caip2ChainId;\n expiredAt: number;\n /**\n * Fee breakdown for cross-chain bridge transactions.\n *\n * Only included in quotes from cross-chain aggregators (DeBridge, LiFi).\n */\n fees?: ReadonlyArray<{\n type: 'protocol' | 'gas' | 'bridge' | 'slippage' | 'swap' | 'other';\n /** Human-readable fee name */\n name: string;\n /** Fee amount in token's smallest unit */\n amount: bigint;\n /** Token the fee is deducted from */\n token: {\n /** Chain ID where fee is deducted */\n chainId: number | Caip2ChainId;\n /** Token address (EVM hex or Solana base58) */\n address: EvmAddress | SolAddress;\n };\n }>;\n gasEstimate?: bigint;\n recommendedSlippage: number;\n /** Input token address (EVM hex or Solana base58) */\n tokenIn: EvmAddress | SolAddress;\n tokenInDecimals: number;\n /** Output token address (EVM hex or Solana base58) */\n tokenOut: EvmAddress | SolAddress;\n tokenOutDecimals: number;\n uuid: string;\n}\n\nexport interface QuoteResponseDataDone {\n done: true;\n}\n\nexport type QuoteResponse = QuoteResponseData | QuoteResponseDataDone;\n\n/**\n * Schema for the response from Markr's /quote endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1quote/post\n */\nexport const QuoteResponseSchema: z.ZodType<QuoteResponse> = z.union([\n z.object({\n aggregator: z.object({\n id: z.string(),\n logo_url: z.url(),\n name: z.string(),\n }),\n amountIn: z.coerce.bigint().nonnegative(),\n amountOut: z.coerce.bigint().nonnegative(),\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n /**\n * Unix time in seconds when the quote expires.\n */\n expiredAt: z.number().int().nonnegative(),\n fees: z\n .array(\n z.object({\n type: z.enum(['protocol', 'gas', 'bridge', 'slippage', 'swap', 'other']),\n name: z.string(),\n amount: z.coerce.bigint().nonnegative(),\n token: z.object({\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n address: z.union([EvmAddressSchema, SolAddressSchema]),\n }),\n }),\n )\n .optional(),\n /**\n * Estimated gas for the swap transaction.\n * Markr estimates already include a buffer.\n *\n * The API docs do not specify this field as optional, but in practice it can be missing.\n */\n gasEstimate: z.coerce.bigint().nonnegative().optional(),\n /** Recommended slippage in basis points. */\n recommendedSlippage: z.number().int().nonnegative(),\n tokenIn: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenInDecimals: z.number().int().nonnegative().max(18),\n tokenOut: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenOutDecimals: z.number().int().nonnegative().max(18),\n uuid: z.uuid(),\n }),\n z.object({\n done: z.literal(true),\n }),\n]);\n\n/**\n * Response type for Markr's /swap endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1swap/post\n */\nexport interface WrappedSwapTransactionResponse {\n data: Hex;\n to: EvmAddress;\n value: bigint;\n}\n\nexport const WrappedSwapTransactionResponseSchema: z.ZodType<WrappedSwapTransactionResponse> = z.object({\n data: HexSchema,\n to: EvmAddressSchema,\n value: z.coerce.bigint().nonnegative(),\n});\n\n/**\n * Solana swap transaction (returned for SVM chains).\n */\nexport interface SolanaSwapTransactionResponse {\n /** Chain type identifier */\n chainType: 'svm';\n /** Base64-encoded Solana transaction to be signed and sent by the client */\n swapTransaction: string;\n}\n\nexport const SolanaSwapTransactionResponseSchema: z.ZodType<SolanaSwapTransactionResponse> = z.object({\n chainType: z.literal('svm'),\n swapTransaction: z.base64(),\n});\n\nexport type SwapResponse = WrappedSwapTransactionResponse | SolanaSwapTransactionResponse;\n\nexport const SwapResponseSchema: z.ZodType<SwapResponse> = z.union([\n WrappedSwapTransactionResponseSchema,\n SolanaSwapTransactionResponseSchema,\n]);\n\nexport interface PartnerInfoResponse {\n /**\n * The partner fee in basis points collected on each swap.\n */\n fee: number;\n name: string;\n}\n\nexport const PartnerInfoResponseSchema: z.ZodType<PartnerInfoResponse> = z.object({\n fee: z.int().nonnegative(),\n name: z.string(),\n});\n\n/**\n * If the destination token is USDC, the flow is:\n * - pending -> committed -> completed\n *\n * If the destination token is not USDC, the flow is:\n * - pending -> committed -> pending_execution -> completed\n *\n * If the transaction fails at any point, the status will be 'failed'.\n */\nexport type CrossChainStatus =\n | /** Transaction submitted to CCIP */\n 'pending'\n /** Message committed, awaiting execution on destination chain */\n | 'committed'\n /** Message received on destination, swap pending execution by relayer */\n | 'pending_execution'\n /** Message executed successfully on destination chain */\n | 'completed'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /** CCIP message ID */\n messageId: string | null;\n /** Current status of the cross-chain transaction. */\n status: CrossChainStatus;\n /** Human-readable status description */\n description: string;\n /** Source chain information */\n sourceChain: {\n /** Source chain network name */\n name: string;\n /** Source chain transaction hash */\n transactionHash: Hash | Signature;\n /** Transaction timestamp on source chain (ISO 8601) */\n timestamp: string;\n /** When the source transaction was finalized (ISO 8601) */\n finalized: string | boolean | null;\n };\n /** Destination chain information */\n destinationChain: {\n /** Destination chain network name */\n name: string | null;\n /** Destination chain transaction hash (null if not yet executed) */\n transactionHash: Hash | Signature | null;\n /** Transaction timestamp on destination chain (null if not yet executed) (ISO 8601) */\n timestamp: string | null;\n /** When the destination transaction was finalized (null if not yet executed) (ISO 8601) */\n finalized: string | null;\n };\n /** Transaction progress information */\n progress: {\n /** Whether the message has been committed on destination chain */\n committed: boolean;\n /** When the message was committed (null if not committed) (ISO 8601) */\n commitTimestamp?: string | null;\n /** Whether the message has been executed on destination chain */\n executed: boolean;\n };\n /** Fee information */\n fees: {\n /** Fee token address */\n token: EvmAddress | SolAddress | null;\n /** Fee amount in wei */\n amount: bigint | null;\n };\n /** Tokens transferred in this cross-chain transaction */\n transferredTokens: ReadonlyArray<{\n /** Token address */\n token: EvmAddress | SolAddress;\n /** Token amount */\n amount: bigint;\n }>;\n}\n\nconst ISO_8601_TIMEZONE_DESIGNATOR_REGEX = /[zZ]|[+-]\\d{2}:?\\d{2}$/;\n\n// Markr API returns ISO-8601 datetime strings that are sometimes missing a timezone designator (\"local\" ISO).\n// We assume these are meant to be UTC and append 'Z' if missing, then validate as strict ISO-8601 with timezone.\nconst datetime = z.iso\n .datetime({ local: true })\n .refine(\n (value) => {\n // Accept at least local ISO format\n // If missing timezone, treat as UTC\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n const isoString = hasTimezone ? value : value + 'Z';\n // Validate as strict ISO-8601 with timezone\n return z.iso.datetime().safeParse(isoString).success;\n },\n {\n error: 'Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)',\n },\n )\n .transform((value) => {\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n return hasTimezone ? value : value + 'Z';\n });\n\nexport const CrossChainStatusResponseSchema: z.ZodType<CrossChainStatusResponse> = z.object({\n messageId: z.string().nullable(),\n status: z.enum(['pending', 'committed', 'pending_execution', 'completed', 'failed', 'unknown']),\n description: z.string(),\n sourceChain: z.object({\n name: z.string(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]),\n timestamp: datetime,\n finalized: datetime.or(z.boolean()).nullable(),\n }),\n destinationChain: z.object({\n name: z.string().nullable(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]).nullable(),\n timestamp: datetime.nullable(),\n finalized: datetime.nullable(),\n }),\n progress: z.object({\n committed: z.boolean(),\n commitTimestamp: datetime.nullable().optional(),\n executed: z.boolean(),\n }),\n fees: z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n }),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n});\n\nexport interface SpenderAddressResponse {\n address: EvmAddress;\n}\n\nexport const SpenderAddressResponseSchema: z.ZodType<SpenderAddressResponse> = z.object({\n address: EvmAddressSchema,\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"_schema.js","names":[],"sources":["../../../src/transfer-service/markr/_schema.ts"],"sourcesContent":["import type { Signature, Address as SolAddress } from '@solana/kit';\nimport { z } from 'zod';\nimport type { Address as EvmAddress, Hash } from 'viem';\nimport { EvmAddressSchema, HashSchema, HexSchema, SolAddressSchema, SolSignatureSchema } from '../service-schemas';\nimport { isCaip2ChainId } from '../../utils/caip';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Hex } from '../../types/signer';\n\ninterface SupportedChainsResponseItemBase {\n chainId: number | string;\n chainType: string;\n /** Available services on the chain. Each service has specific functionality */\n enabled_services: Array<'cross-chain-swap' | 'cross-chain-quote' | 'quote' | 'swap' | 'token-list'>;\n /** Chain logo URL */\n logo_url: string;\n /** Chain display name */\n name: string;\n /**\n * List of chain IDs that this chain can swap to via cross-chain aggregators.\n *\n * Empty array means no cross-chain routes available.\n */\n lanes: ReadonlyArray<number | Caip2ChainId>;\n}\n\nexport interface SupportedChainsResponseItemEvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: number;\n /** Chain virtual machine type */\n chainType: 'evm';\n /** Router contract address */\n router?: EvmAddress;\n /** Native token wrapped contract address */\n wrapped_token?: EvmAddress;\n}\n\nexport interface SupportedChainsResponseItemSvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: Caip2ChainId;\n /** Chain virtual machine type */\n chainType: 'svm';\n}\n\nexport type SupportedChainsResponse = Array<\n SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm | SupportedChainsResponseItemBase\n>;\n\nexport const Caip2ChainIdSchema: z.ZodType<Caip2ChainId> = z\n .string()\n .refine((value) => isCaip2ChainId(value), {\n message: 'Invalid CAIP-2 chain ID',\n })\n .transform((value) => value as Caip2ChainId);\n\nconst SupportedChainsResponseItemBaseSchema = z.object({\n chainId: z.union([z.number(), z.string()]),\n chainType: z.string(),\n enabled_services: z.array(z.enum(['cross-chain-swap', 'cross-chain-quote', 'quote', 'swap', 'token-list'])),\n logo_url: z.url(),\n name: z.string(),\n lanes: z.array(z.union([z.coerce.number().int().nonnegative(), Caip2ChainIdSchema])),\n});\n\nconst SupportedChainsResponseItemEvmSchema: z.ZodType<SupportedChainsResponseItemEvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z.coerce.number().int().nonnegative(),\n chainType: z.literal('evm'),\n router: EvmAddressSchema.optional(),\n wrapped_token: EvmAddressSchema.optional(),\n });\n\nconst SupportedChainsResponseItemSvmSchema: z.ZodType<SupportedChainsResponseItemSvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z\n .string()\n .refine((value) => isCaip2ChainId(value) && value.startsWith('solana:'), {\n error: 'Is not a valid Solana CAIP-2 ID',\n })\n .transform((value) => value as Caip2ChainId),\n chainType: z.literal('svm'),\n });\n\n/**\n * Schema for the response from Markr's /info/chains endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1info~1chains/get\n */\nexport const SupportedChainsResponseSchema: z.ZodType<SupportedChainsResponse> = z.array(\n z.union([\n SupportedChainsResponseItemEvmSchema,\n SupportedChainsResponseItemSvmSchema,\n SupportedChainsResponseItemBaseSchema.refine(\n (item) => item.chainType !== 'evm' && item.chainType !== 'svm',\n 'Known chain types must match their expected schema',\n ),\n ]),\n);\n\nexport type TokenListResponse = Array<{\n address: EvmAddress;\n decimals: number;\n logo_url: string;\n name: string;\n symbol: string;\n}>;\n\n/**\n * Schema for the response Markr's /tokens/{chainId}/list endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1tokens~1%7BchainId%7D~1list/get\n */\nexport const TokenListResponseSchema: z.ZodType<TokenListResponse> = z.array(\n z.object({\n address: EvmAddressSchema,\n decimals: z.number().int().nonnegative().max(18),\n logo_url: z.url(),\n name: z.string(),\n symbol: z.string(),\n }),\n);\n\nexport interface QuoteResponseData {\n aggregator: {\n id: string;\n logo_url: string;\n name: string;\n };\n amountIn: bigint;\n amountOut: bigint;\n /** Chain identifier (number for EVM chains, CAIP-2 ID for SVM chains) */\n chainId: number | Caip2ChainId;\n expiredAt: number;\n /**\n * Fee breakdown for cross-chain bridge transactions.\n *\n * Only included in quotes from cross-chain aggregators (DeBridge, LiFi).\n */\n fees?: ReadonlyArray<{\n type: 'protocol' | 'gas' | 'bridge' | 'slippage' | 'swap' | 'other';\n /** Human-readable fee name */\n name: string;\n /** Fee amount in token's smallest unit */\n amount: bigint;\n /** Token the fee is deducted from */\n token: {\n /** Chain ID where fee is deducted */\n chainId: number | Caip2ChainId;\n /** Token address (EVM hex or Solana base58) */\n address: EvmAddress | SolAddress;\n };\n }>;\n gasEstimate?: bigint;\n recommendedSlippage: number;\n /** Input token address (EVM hex or Solana base58) */\n tokenIn: EvmAddress | SolAddress;\n tokenInDecimals: number;\n /** Output token address (EVM hex or Solana base58) */\n tokenOut: EvmAddress | SolAddress;\n tokenOutDecimals: number;\n uuid: string;\n}\n\nexport interface QuoteResponseDataDone {\n done: true;\n}\n\nexport type QuoteResponse = QuoteResponseData | QuoteResponseDataDone;\n\n/**\n * Schema for the response from Markr's /quote endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1quote/post\n */\nexport const QuoteResponseSchema: z.ZodType<QuoteResponse> = z.union([\n z.object({\n aggregator: z.object({\n id: z.string(),\n logo_url: z.url(),\n name: z.string(),\n }),\n amountIn: z.coerce.bigint().nonnegative(),\n amountOut: z.coerce.bigint().nonnegative(),\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n /**\n * Unix time in seconds when the quote expires.\n */\n expiredAt: z.number().int().nonnegative(),\n fees: z\n .array(\n z.object({\n type: z.enum(['protocol', 'gas', 'bridge', 'slippage', 'swap', 'other']),\n name: z.string(),\n amount: z.coerce.bigint().nonnegative(),\n token: z.object({\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n address: z.union([EvmAddressSchema, SolAddressSchema]),\n }),\n }),\n )\n .optional(),\n /**\n * Estimated gas for the swap transaction.\n * Markr estimates already include a buffer.\n *\n * The API docs do not specify this field as optional, but in practice it can be missing.\n */\n gasEstimate: z.coerce.bigint().nonnegative().optional(),\n /** Recommended slippage in basis points. */\n recommendedSlippage: z.number().int().nonnegative(),\n tokenIn: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenInDecimals: z.number().int().nonnegative().max(18),\n tokenOut: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenOutDecimals: z.number().int().nonnegative().max(18),\n uuid: z.uuid(),\n }),\n z.object({\n done: z.literal(true),\n }),\n]);\n\n/**\n * Response type for Markr's /swap endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1swap/post\n */\nexport interface WrappedSwapTransactionResponse {\n data: Hex;\n to: EvmAddress;\n value: bigint;\n}\n\nexport const WrappedSwapTransactionResponseSchema: z.ZodType<WrappedSwapTransactionResponse> = z.object({\n data: HexSchema,\n to: EvmAddressSchema,\n value: z.coerce.bigint().nonnegative(),\n});\n\n/**\n * Solana swap transaction (returned for SVM chains).\n */\nexport interface SolanaSwapTransactionResponse {\n /** Chain type identifier */\n chainType: 'svm';\n /** Base64-encoded Solana transaction to be signed and sent by the client */\n swapTransaction: string;\n}\n\nexport const SolanaSwapTransactionResponseSchema: z.ZodType<SolanaSwapTransactionResponse> = z.object({\n chainType: z.literal('svm'),\n swapTransaction: z.base64(),\n});\n\nexport type SwapResponse = WrappedSwapTransactionResponse | SolanaSwapTransactionResponse;\n\nexport const SwapResponseSchema: z.ZodType<SwapResponse> = z.union([\n WrappedSwapTransactionResponseSchema,\n SolanaSwapTransactionResponseSchema,\n]);\n\nexport interface PartnerInfoResponse {\n /**\n * The partner fee in basis points collected on each swap.\n */\n fee: number;\n name: string;\n}\n\nexport const PartnerInfoResponseSchema: z.ZodType<PartnerInfoResponse> = z.object({\n fee: z.int().nonnegative(),\n name: z.string(),\n});\n\n/**\n * If the destination token is USDC, the flow is:\n * - pending -> committed -> completed\n *\n * If the destination token is not USDC, the flow is:\n * - pending -> committed -> pending_execution -> completed\n *\n * If the transaction fails at any point, the status will be 'failed'.\n */\nexport type CrossChainStatus =\n | /** Transaction submitted to CCIP */\n 'pending'\n /** Message committed, awaiting execution on destination chain */\n | 'committed'\n /** Message received on destination, swap pending execution by relayer */\n | 'pending_execution'\n /** Message executed successfully on destination chain */\n | 'completed'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /** CCIP message ID */\n messageId: string | null;\n /** Current status of the cross-chain transaction. */\n status: CrossChainStatus;\n /** Human-readable status description */\n description: string;\n /** Source chain information */\n sourceChain: {\n /** Source chain network name */\n name: string;\n /** Source chain transaction hash */\n transactionHash: Hash | Signature;\n /** Transaction timestamp on source chain (ISO 8601) */\n timestamp: string;\n /** When the source transaction was finalized (ISO 8601) */\n finalized: string | boolean | null;\n };\n /** Destination chain information */\n destinationChain: {\n /** Destination chain network name */\n name: string | null;\n /** Destination chain transaction hash (null if not yet executed) */\n transactionHash: Hash | Signature | null;\n /** Transaction timestamp on destination chain (null if not yet executed) (ISO 8601) */\n timestamp: string | null;\n /** When the destination transaction was finalized (null if not yet executed) (ISO 8601) */\n finalized: string | null;\n };\n /** Transaction progress information */\n progress: {\n /** Whether the message has been committed on destination chain */\n committed: boolean;\n /** When the message was committed (null if not committed) (ISO 8601) */\n commitTimestamp?: string | null;\n /** Whether the message has been executed on destination chain */\n executed: boolean;\n };\n /** Fee information */\n fees: {\n /** Fee token address */\n token: EvmAddress | SolAddress | null;\n /** Fee amount in wei */\n amount: bigint | null;\n };\n /** Tokens transferred in this cross-chain transaction */\n transferredTokens: ReadonlyArray<{\n /** Token address */\n token: EvmAddress | SolAddress;\n /** Token amount */\n amount: bigint;\n }>;\n}\n\nconst ISO_8601_TIMEZONE_DESIGNATOR_REGEX = /[zZ]|[+-]\\d{2}:?\\d{2}$/;\n\n// Markr API returns ISO-8601 datetime strings that are sometimes missing a timezone designator (\"local\" ISO).\n// We assume these are meant to be UTC and append 'Z' if missing, then validate as strict ISO-8601 with timezone.\nconst datetime = z.iso\n .datetime({ local: true })\n .refine(\n (value) => {\n // Accept at least local ISO format\n // If missing timezone, treat as UTC\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n const isoString = hasTimezone ? value : value + 'Z';\n // Validate as strict ISO-8601 with timezone\n return z.iso.datetime().safeParse(isoString).success;\n },\n {\n error: 'Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)',\n },\n )\n .transform((value) => {\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n return hasTimezone ? value : value + 'Z';\n });\n\nexport const CrossChainStatusResponseSchema: z.ZodType<CrossChainStatusResponse> = z.object({\n messageId: z.string().nullable(),\n status: z.enum(['pending', 'committed', 'pending_execution', 'completed', 'failed', 'unknown']),\n description: z.string(),\n sourceChain: z.object({\n name: z.string(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]),\n timestamp: datetime,\n finalized: datetime.or(z.boolean()).nullable(),\n }),\n destinationChain: z.object({\n name: z.string().nullable(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]).nullable(),\n timestamp: datetime.nullable(),\n finalized: datetime.nullable(),\n }),\n progress: z.object({\n committed: z.boolean(),\n commitTimestamp: datetime.nullable().optional(),\n executed: z.boolean(),\n }),\n fees: z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n }),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n});\n\nexport interface SpenderAddressResponse {\n address: EvmAddress;\n}\n\nexport const SpenderAddressResponseSchema: z.ZodType<SpenderAddressResponse> = z.object({\n address: EvmAddressSchema,\n});\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`../../utils/caip.cjs`),r=require(`../../utils/evm-address.cjs`),i=require(`../../_utils/chain.cjs`),a=require(`./_api.cjs`),o=require(`../../_utils/math.cjs`),s=require(`../../utils/sol-address.cjs`);let c=require(`viem`);async function l(e){let r=new Map;try{let t=(await a.markrGetInfoChains(e)).filter(e=>e.chainType===`evm`||e.chainType===`svm`);for(let e of t){let t=typeof e.chainId==`number`?n.eip155ChainIdToCaip2(e.chainId):e.chainId,i=e.enabled_services.includes(`cross-chain-quote`)&&e.enabled_services.includes(`cross-chain-swap`),a=e.enabled_services.includes(`quote`)&&e.enabled_services.includes(`swap`);!i&&!a||r.set(t,{chainId:e.chainId,crossChainSwapEnabled:i,swapEnabled:a,tokenList:e.enabled_services.includes(`token-list`)})}}catch(e){throw new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch supported chains from Markr API.`})}return r}async function u(e,t){let n=new Map;for(let[r,i]of t.entries())if(typeof i.chainId==`number`&&i.tokenList&&(i.crossChainSwapEnabled||i.swapEnabled))try{let t=a.markrGetTokenList(e,i.chainId);n.set(r,t)}catch{}return n}function d(t){return t===e.ERC_ZERO_ADDRESS||t===e.SOL_MINT_ADDRESS}function f(t,n){return t.type===e.TokenType.NATIVE?i.isSolanaNamespace(n)?e.SOL_MINT_ADDRESS:e.ERC_ZERO_ADDRESS:t.address}function p({amountOut:e,assetOut:t,slippageBps:n}){let r=o.calculateMinimumAmountOut({amountOut:e,assetOut:t,slippageBps:n});return e>0n&&r===0n?1n:r}function m(t,n,r){let i=t.amountOut*BigInt(r)/10000n,a=t.amountOut-i,o=[...g(t.fees),{type:`partner`,name:`Core Fee`,amount:i,chainId:n.targetChain.chainId,token:_(n.targetAsset)}];return{aggregator:{id:t.aggregator.id,logoUrl:t.aggregator.logo_url,name:t.aggregator.name},amountIn:t.amountIn,amountOut:a,assetIn:n.sourceAsset,assetOut:n.targetAsset,expiresAt:t.expiredAt,fees:o,fromAddress:n.fromAddress,gasEstimate:t.gasEstimate,id:t.uuid,partnerFeeBps:r,serviceType:e.ServiceType.MARKR,slippageBps:n.slippageBps??t.recommendedSlippage,sourceChain:n.sourceChain,targetChain:n.targetChain,toAddress:n.toAddress}}async function h(e){try{return(await a.markrGetPartnerInfo(e)).fee}catch(e){throw new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch partner info from Markr API.`})}}function g(t){if(!t)return[];let i=[];for(let a of t){let t=typeof a.token.chainId==`number`?n.eip155ChainIdToCaip2(a.token.chainId):a.token.chainId,o;d(a.token.address)?o={type:e.TokenType.NATIVE}:r.isEvmAddress(a.token.address)?o={type:e.TokenType.ERC20,address:a.token.address}:s.isSolAddress(a.token.address)&&(o={type:e.TokenType.SPL,address:a.token.address}),o&&i.push({type:a.type,name:a.name,amount:a.amount,chainId:t,token:o})}return i}function _(t){return t.type===e.TokenType.NATIVE?{type:e.TokenType.NATIVE}:t.type===e.TokenType.SPL?{type:e.TokenType.SPL,address:t.address}:{type:e.TokenType.ERC20,address:t.address}}async function v(e){return e?(await Promise.resolve().then(()=>require(`./_abis/cross-chain-swap-wrapper-abi.cjs`))).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI:(await Promise.resolve().then(()=>require(`./_abis/swap-wrapper-abi.cjs`))).MARKR_SWAP_WRAPPER_ABI}function y(e){if(e instanceof c.BaseError){let t=e.data;if((0,c.isHex)(t))return t;let n;if(e.walk(e=>{let t=e.data;return!n&&(0,c.isHex)(t)&&(n=t),!1}),n)return n;let r=e.cause?.data;if((0,c.isHex)(r))return r}if(!e||typeof e!=`object`)return;let t=e;if((0,c.isHex)(t.data))return t.data;if((0,c.isHex)(t.error?.data))return t.error.data;if((0,c.isHex)(t.cause?.data))return t.cause.data;if((0,c.isHex)(t.response?.data))return t.response.data;if((0,c.isHex)(t.body?.error?.data))return t.body.error.data}function b(e,t){let n=y(t);if(!n)return null;try{let t=(0,c.decodeErrorResult)({abi:e,data:n}),r=t.args.length>0?`(${t.args.map(String).join(`, `)})`:`()`;return`${t.errorName}${r}`}catch{let t=n.slice(0,10).toLowerCase();for(let n of e)if(n.type===`error`&&(0,c.toFunctionSelector)(`${n.name}(${n.inputs.map(e=>e.type).join(`,`)})`).toLowerCase()===t)return`${n.name}()`}return null}exports.assetToAddressString=f,exports.calculateMarkrMinimumAmountOut=p,exports.decodeMarkrRevertError=b,exports.getMarkrSwapWrapperAbi=v,exports.getPartnerFeeBps=h,exports.getSupportedChains=l,exports.getSupportedTokens=u,exports.isTokenAddressNative=d,exports.quoteFromMarkrQuoteResponseData=m;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`../../utils/caip.cjs`),r=require(`../../utils/evm-address.cjs`),i=require(`../../_utils/chain.cjs`),a=require(`./_api.cjs`),o=require(`../../_utils/math.cjs`),s=require(`../../utils/sol-address.cjs`);let c=require(`viem`);async function l(e){let r=new Map;try{let t=(await a.markrGetInfoChains(e)).filter(e=>e.chainType===`evm`||e.chainType===`svm`);for(let e of t){let t=typeof e.chainId==`number`?n.eip155ChainIdToCaip2(e.chainId):e.chainId,i=e.enabled_services.includes(`cross-chain-quote`)&&e.enabled_services.includes(`cross-chain-swap`),a=e.enabled_services.includes(`quote`)&&e.enabled_services.includes(`swap`),o=new Set;for(let r of e.lanes){let e=typeof r==`number`?n.eip155ChainIdToCaip2(r):r;e!==t&&o.add(e)}let s=i?o:new Set;!a&&s.size===0||r.set(t,{chainId:e.chainId,crossChainSwapEnabled:i,crossChainTargetChainIds:s,swapEnabled:a,tokenList:e.enabled_services.includes(`token-list`)})}}catch(e){throw new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch supported chains from Markr API.`})}return r}async function u(e,t){let n=new Map;for(let[r,i]of t.entries())if(typeof i.chainId==`number`&&i.tokenList&&(i.crossChainSwapEnabled||i.swapEnabled))try{let t=a.markrGetTokenList(e,i.chainId);n.set(r,t)}catch{}return n}function d(t){return t===e.ERC_ZERO_ADDRESS||t===e.SOL_MINT_ADDRESS}function f(t,n){return t.type===e.TokenType.NATIVE?i.isSolanaNamespace(n)?e.SOL_MINT_ADDRESS:e.ERC_ZERO_ADDRESS:t.address}function p({amountOut:e,assetOut:t,slippageBps:n}){let r=o.calculateMinimumAmountOut({amountOut:e,assetOut:t,slippageBps:n});return e>0n&&r===0n?1n:r}function m(t,n,r){let i=t.amountOut*BigInt(r)/10000n,a=t.amountOut-i,o=[...g(t.fees),{type:`partner`,name:`Core Fee`,amount:i,chainId:n.targetChain.chainId,token:_(n.targetAsset)}];return{aggregator:{id:t.aggregator.id,logoUrl:t.aggregator.logo_url,name:t.aggregator.name},amountIn:t.amountIn,amountOut:a,assetIn:n.sourceAsset,assetOut:n.targetAsset,expiresAt:t.expiredAt,fees:o,fromAddress:n.fromAddress,gasEstimate:t.gasEstimate,id:t.uuid,partnerFeeBps:r,serviceType:e.ServiceType.MARKR,slippageBps:n.slippageBps??t.recommendedSlippage,sourceChain:n.sourceChain,targetChain:n.targetChain,toAddress:n.toAddress}}async function h(e){try{return(await a.markrGetPartnerInfo(e)).fee}catch(e){throw new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch partner info from Markr API.`})}}function g(t){if(!t)return[];let i=[];for(let a of t){let t=typeof a.token.chainId==`number`?n.eip155ChainIdToCaip2(a.token.chainId):a.token.chainId,o;d(a.token.address)?o={type:e.TokenType.NATIVE}:r.isEvmAddress(a.token.address)?o={type:e.TokenType.ERC20,address:a.token.address}:s.isSolAddress(a.token.address)&&(o={type:e.TokenType.SPL,address:a.token.address}),o&&i.push({type:a.type,name:a.name,amount:a.amount,chainId:t,token:o})}return i}function _(t){return t.type===e.TokenType.NATIVE?{type:e.TokenType.NATIVE}:t.type===e.TokenType.SPL?{type:e.TokenType.SPL,address:t.address}:{type:e.TokenType.ERC20,address:t.address}}async function v(e){return e?(await Promise.resolve().then(()=>require(`./_abis/cross-chain-swap-wrapper-abi.cjs`))).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI:(await Promise.resolve().then(()=>require(`./_abis/swap-wrapper-abi.cjs`))).MARKR_SWAP_WRAPPER_ABI}function y(e){if(e instanceof c.BaseError){let t=e.data;if((0,c.isHex)(t))return t;let n;if(e.walk(e=>{let t=e.data;return!n&&(0,c.isHex)(t)&&(n=t),!1}),n)return n;let r=e.cause?.data;if((0,c.isHex)(r))return r}if(!e||typeof e!=`object`)return;let t=e;if((0,c.isHex)(t.data))return t.data;if((0,c.isHex)(t.error?.data))return t.error.data;if((0,c.isHex)(t.cause?.data))return t.cause.data;if((0,c.isHex)(t.response?.data))return t.response.data;if((0,c.isHex)(t.body?.error?.data))return t.body.error.data}function b(e,t){let n=y(t);if(!n)return null;try{let t=(0,c.decodeErrorResult)({abi:e,data:n}),r=t.args.length>0?`(${t.args.map(String).join(`, `)})`:`()`;return`${t.errorName}${r}`}catch{let t=n.slice(0,10).toLowerCase();for(let n of e)if(n.type===`error`&&(0,c.toFunctionSelector)(`${n.name}(${n.inputs.map(e=>e.type).join(`,`)})`).toLowerCase()===t)return`${n.name}()`}return null}exports.assetToAddressString=f,exports.calculateMarkrMinimumAmountOut=p,exports.decodeMarkrRevertError=b,exports.getMarkrSwapWrapperAbi=v,exports.getPartnerFeeBps=h,exports.getSupportedChains=l,exports.getSupportedTokens=u,exports.isTokenAddressNative=d,exports.quoteFromMarkrQuoteResponseData=m;
2
2
  //# sourceMappingURL=_utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.cjs","names":["markrGetInfoChains","eip155ChainIdToCaip2","SdkError","ErrorReason","ErrorCode","markrGetTokenList","ERC_ZERO_ADDRESS","SOL_MINT_ADDRESS","TokenType","isSolanaNamespace","calculateMinimumAmountOut","ServiceType","markrGetPartnerInfo","isEvmAddress","isSolAddress","BaseError"],"sources":["../../../src/transfer-service/markr/_utils.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../errors';\nimport { BaseError, decodeErrorResult, type Hex, isHex, toFunctionSelector } from 'viem';\nimport {\n type QuoteResponseData,\n type SupportedChainsResponseItemEvm,\n type SupportedChainsResponseItemSvm,\n type TokenListResponse,\n} from './_schema';\nimport { ERC_ZERO_ADDRESS, SOL_MINT_ADDRESS, ServiceType, TokenType } from '../../constants';\nimport { isSolanaNamespace } from '../../_utils/chain';\nimport { calculateMinimumAmountOut } from '../../_utils/math';\nimport { eip155ChainIdToCaip2 } from '../../utils/caip';\nimport type { Asset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Quote, QuoteFee, QuoteFees, QuoteFeeToken, QuoterProps } from '../../types/quote';\nimport { markrGetInfoChains, markrGetPartnerInfo, markrGetTokenList, type ApiOptions } from './_api';\nimport { isEvmAddress } from '../../utils/evm-address';\nimport { isSolAddress } from '../../utils/sol-address';\n\nexport type SupportedChainsMap = Map<\n Caip2ChainId,\n {\n /** `number` for EVM, `Caip2ChainId` for SVM */\n chainId: number | Caip2ChainId;\n crossChainSwapEnabled: boolean;\n swapEnabled: boolean;\n tokenList: boolean;\n }\n>;\n\nexport async function getSupportedChains(apiOptions: ApiOptions): Promise<SupportedChainsMap> {\n const supportedChains: SupportedChainsMap = new Map();\n\n try {\n const chains = await markrGetInfoChains(apiOptions);\n const filteredSupportedChains = chains.filter(\n (chain): chain is SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm => {\n // Only include chains types that we support in the SDK (EVM and Solana for now).\n return chain.chainType === 'evm' || chain.chainType === 'svm';\n },\n );\n\n for (const chain of filteredSupportedChains) {\n const key: Caip2ChainId = typeof chain.chainId === 'number' ? eip155ChainIdToCaip2(chain.chainId) : chain.chainId;\n\n const isCrossChainSwapEnabled =\n chain.enabled_services.includes('cross-chain-quote') && chain.enabled_services.includes('cross-chain-swap');\n const isSwapEnabled = chain.enabled_services.includes('quote') && chain.enabled_services.includes('swap');\n\n if (!isCrossChainSwapEnabled && !isSwapEnabled) {\n continue;\n }\n\n supportedChains.set(key, {\n chainId: chain.chainId,\n crossChainSwapEnabled: isCrossChainSwapEnabled,\n swapEnabled: isSwapEnabled,\n tokenList: chain.enabled_services.includes('token-list'),\n });\n }\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch supported chains from Markr API.',\n });\n }\n\n return supportedChains;\n}\n\nexport async function getSupportedTokens(\n apiOptions: ApiOptions,\n supportedChains: SupportedChainsMap,\n): Promise<Map<Caip2ChainId, Promise<TokenListResponse>>> {\n // Parallel fetch token lists for all supported chains.\n const supportedTokens: Map<Caip2ChainId, Promise<TokenListResponse>> = new Map();\n\n for (const [caip2ChainId, chainInfo] of supportedChains.entries()) {\n // Only fetch token list for EVM chains that support swaps.\n if (\n typeof chainInfo.chainId === 'number' &&\n chainInfo.tokenList &&\n (chainInfo.crossChainSwapEnabled || chainInfo.swapEnabled)\n ) {\n try {\n const tokenListPromise = markrGetTokenList(apiOptions, chainInfo.chainId);\n supportedTokens.set(caip2ChainId, tokenListPromise);\n } catch {\n // Ignore errors for individual token list fetches.\n // TODO: Logger?\n }\n }\n }\n\n return supportedTokens;\n}\n\n/**\n * Determine if the provided token address represents the native token for its chain.\n *\n * Markr represents EVM native tokens as the zero address and Solana native SOL\n * as the wrapped SOL mint address.\n */\nexport function isTokenAddressNative(address: string): boolean {\n return address === ERC_ZERO_ADDRESS || address === SOL_MINT_ADDRESS;\n}\n\n/**\n * Convert an `Asset` to the address string expected by the Markr API.\n *\n * For NATIVE assets the representation depends on the chain:\n * - EVM chains: `0x0000...0000` (ERC zero address)\n * - Solana chains: `So11111111111111111111111111111111111111112` (wrapped SOL mint)\n *\n * @param asset The asset to convert.\n * @param chainId CAIP-2 chain ID used to disambiguate NATIVE assets across chain types.\n */\nexport function assetToAddressString(asset: Asset, chainId: Caip2ChainId): string {\n if (asset.type === TokenType.NATIVE) {\n if (isSolanaNamespace(chainId)) {\n return SOL_MINT_ADDRESS;\n }\n\n return ERC_ZERO_ADDRESS;\n }\n\n return asset.address;\n}\n\n/**\n * Markr rejects `minAmountOut=0` for non-zero quotes.\n *\n * For very small quotes, integer truncation after slippage can produce `0`.\n * Clamp to `1` in that edge case to satisfy Markr API validation while\n * preserving normal slippage behavior for larger quotes.\n */\nexport function calculateMarkrMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n const minAmountOut = calculateMinimumAmountOut({ amountOut, assetOut, slippageBps });\n\n if (amountOut > 0n && minAmountOut === 0n) {\n return 1n;\n }\n\n return minAmountOut;\n}\n\nexport function quoteFromMarkrQuoteResponseData(\n data: QuoteResponseData,\n quoterProps: QuoterProps,\n partnerFeeBps: number,\n): Quote {\n const partnerFee: bigint = (data.amountOut * BigInt(partnerFeeBps)) / 10_000n;\n const amountOutAfterFees: bigint = data.amountOut - partnerFee;\n\n const fees: QuoteFees = [\n ...mapMarkrQuoteResponseDataFeesToQuoteFees(data.fees),\n // Add the partner fee as a QuoteFee component for Markr quotes.\n {\n type: 'partner',\n name: 'Core Fee',\n amount: partnerFee,\n chainId: quoterProps.targetChain.chainId,\n token: assetToFeeToken(quoterProps.targetAsset),\n },\n ];\n\n return {\n aggregator: {\n id: data.aggregator.id,\n logoUrl: data.aggregator.logo_url,\n name: data.aggregator.name,\n },\n amountIn: data.amountIn,\n amountOut: amountOutAfterFees,\n assetIn: quoterProps.sourceAsset,\n assetOut: quoterProps.targetAsset,\n expiresAt: data.expiredAt, // Markr returns `expiredAt` as Unix time in seconds; use as-is.\n fees,\n fromAddress: quoterProps.fromAddress,\n /**\n * This gasEstimate is rough or may be missing.\n * Consumers should use TransferManager.estimateGas for a more accurate estimate.\n */\n gasEstimate: data.gasEstimate,\n id: data.uuid,\n partnerFeeBps,\n serviceType: ServiceType.MARKR,\n slippageBps: quoterProps.slippageBps ?? data.recommendedSlippage,\n sourceChain: quoterProps.sourceChain,\n targetChain: quoterProps.targetChain,\n toAddress: quoterProps.toAddress,\n } satisfies Quote;\n}\n\nexport async function getPartnerFeeBps(apiOptions: ApiOptions): Promise<number> {\n try {\n const partnerInfo = await markrGetPartnerInfo(apiOptions);\n return partnerInfo.fee;\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch partner info from Markr API.',\n });\n }\n}\n\nexport function mapMarkrQuoteResponseDataFeesToQuoteFees(markrFees: QuoteResponseData['fees']): QuoteFees {\n if (!markrFees) {\n return [];\n }\n\n const fees: QuoteFee[] = [];\n\n for (const fee of markrFees) {\n const chainId = typeof fee.token.chainId === 'number' ? eip155ChainIdToCaip2(fee.token.chainId) : fee.token.chainId;\n\n let token: QuoteFeeToken | undefined;\n\n if (isTokenAddressNative(fee.token.address)) {\n token = { type: TokenType.NATIVE };\n } else if (isEvmAddress(fee.token.address)) {\n token = { type: TokenType.ERC20, address: fee.token.address };\n } else if (isSolAddress(fee.token.address)) {\n token = { type: TokenType.SPL, address: fee.token.address };\n }\n\n if (!token) {\n // Skip fee if we can't determine token type.\n continue;\n }\n\n fees.push({\n type: fee.type,\n name: fee.name,\n amount: fee.amount,\n chainId,\n token,\n });\n }\n\n return fees;\n}\n\nfunction assetToFeeToken(asset: Asset): QuoteFeeToken {\n if (asset.type === TokenType.NATIVE) {\n return { type: TokenType.NATIVE };\n }\n\n if (asset.type === TokenType.SPL) {\n return { type: TokenType.SPL, address: asset.address };\n }\n\n return { type: TokenType.ERC20, address: asset.address };\n}\n\nexport type MarkrRouterAbi =\n | (typeof import('./_abis/swap-wrapper-abi'))['MARKR_SWAP_WRAPPER_ABI']\n | (typeof import('./_abis/cross-chain-swap-wrapper-abi'))['MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI'];\n\nexport async function getMarkrSwapWrapperAbi(crossChain: boolean): Promise<MarkrRouterAbi> {\n if (crossChain) {\n return (await import('./_abis/cross-chain-swap-wrapper-abi')).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI;\n }\n\n return (await import('./_abis/swap-wrapper-abi')).MARKR_SWAP_WRAPPER_ABI;\n}\n\nexport function extractHexDataFromError(error: unknown): Hex | undefined {\n if (error instanceof BaseError) {\n const directData = (error as { data?: unknown }).data;\n if (isHex(directData)) {\n return directData;\n }\n\n let walkedData: Hex | undefined;\n error.walk((walkedError) => {\n const nestedData = (walkedError as { data?: unknown }).data;\n if (!walkedData && isHex(nestedData)) {\n walkedData = nestedData;\n }\n return false;\n });\n\n if (walkedData) {\n return walkedData;\n }\n\n const causeData = (error as { cause?: { data?: unknown } }).cause?.data;\n if (isHex(causeData)) {\n return causeData;\n }\n }\n\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const genericError = error as {\n data?: unknown;\n error?: { data?: unknown };\n cause?: { data?: unknown };\n response?: { data?: unknown };\n body?: { error?: { data?: unknown } };\n };\n\n if (isHex(genericError.data)) {\n return genericError.data;\n }\n\n if (isHex(genericError.error?.data)) {\n return genericError.error.data;\n }\n\n if (isHex(genericError.cause?.data)) {\n return genericError.cause.data;\n }\n\n if (isHex(genericError.response?.data)) {\n return genericError.response.data;\n }\n\n if (isHex(genericError.body?.error?.data)) {\n return genericError.body.error.data;\n }\n\n return undefined;\n}\n\nexport function decodeMarkrRevertError(abi: MarkrRouterAbi, error: unknown): string | null {\n const revertData = extractHexDataFromError(error);\n\n if (!revertData) {\n return null;\n }\n\n try {\n const decoded = decodeErrorResult({ abi, data: revertData });\n const decodedArgs = decoded.args.length > 0 ? `(${decoded.args.map(String).join(', ')})` : '()';\n\n return `${decoded.errorName}${decodedArgs}`;\n } catch {\n const selector = revertData.slice(0, 10).toLowerCase();\n\n for (const abiItem of abi) {\n if (abiItem.type !== 'error') {\n continue;\n }\n\n const signature = `${abiItem.name}(${abiItem.inputs.map((input) => input.type).join(',')})`;\n if (toFunctionSelector(signature).toLowerCase() === selector) {\n return `${abiItem.name}()`;\n }\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_utils.cjs","names":["markrGetInfoChains","eip155ChainIdToCaip2","SdkError","ErrorReason","ErrorCode","markrGetTokenList","ERC_ZERO_ADDRESS","SOL_MINT_ADDRESS","TokenType","isSolanaNamespace","calculateMinimumAmountOut","ServiceType","markrGetPartnerInfo","isEvmAddress","isSolAddress","BaseError"],"sources":["../../../src/transfer-service/markr/_utils.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../errors';\nimport { BaseError, decodeErrorResult, type Hex, isHex, toFunctionSelector } from 'viem';\nimport {\n type QuoteResponseData,\n type SupportedChainsResponseItemEvm,\n type SupportedChainsResponseItemSvm,\n type TokenListResponse,\n} from './_schema';\nimport { ERC_ZERO_ADDRESS, SOL_MINT_ADDRESS, ServiceType, TokenType } from '../../constants';\nimport { isSolanaNamespace } from '../../_utils/chain';\nimport { calculateMinimumAmountOut } from '../../_utils/math';\nimport { eip155ChainIdToCaip2 } from '../../utils/caip';\nimport type { Asset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Quote, QuoteFee, QuoteFees, QuoteFeeToken, QuoterProps } from '../../types/quote';\nimport { markrGetInfoChains, markrGetPartnerInfo, markrGetTokenList, type ApiOptions } from './_api';\nimport { isEvmAddress } from '../../utils/evm-address';\nimport { isSolAddress } from '../../utils/sol-address';\n\nexport type SupportedChainsMap = Map<\n Caip2ChainId,\n {\n /** `number` for EVM, `Caip2ChainId` for SVM */\n chainId: number | Caip2ChainId;\n crossChainSwapEnabled: boolean;\n crossChainTargetChainIds: ReadonlySet<Caip2ChainId>;\n swapEnabled: boolean;\n tokenList: boolean;\n }\n>;\n\nexport async function getSupportedChains(apiOptions: ApiOptions): Promise<SupportedChainsMap> {\n const supportedChains: SupportedChainsMap = new Map();\n\n try {\n const chains = await markrGetInfoChains(apiOptions);\n const filteredSupportedChains = chains.filter(\n (chain): chain is SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm => {\n // Only include chains types that we support in the SDK (EVM and Solana for now).\n return chain.chainType === 'evm' || chain.chainType === 'svm';\n },\n );\n\n for (const chain of filteredSupportedChains) {\n const key: Caip2ChainId = typeof chain.chainId === 'number' ? eip155ChainIdToCaip2(chain.chainId) : chain.chainId;\n\n const isCrossChainSwapEnabled =\n chain.enabled_services.includes('cross-chain-quote') && chain.enabled_services.includes('cross-chain-swap');\n const isSwapEnabled = chain.enabled_services.includes('quote') && chain.enabled_services.includes('swap');\n const normalizedLaneChainIds = new Set<Caip2ChainId>();\n\n for (const lane of chain.lanes) {\n const laneChainId = typeof lane === 'number' ? eip155ChainIdToCaip2(lane) : lane;\n\n if (laneChainId !== key) {\n normalizedLaneChainIds.add(laneChainId);\n }\n }\n\n const crossChainTargetChainIds = isCrossChainSwapEnabled ? normalizedLaneChainIds : new Set<Caip2ChainId>();\n\n if (!isSwapEnabled && crossChainTargetChainIds.size === 0) {\n continue;\n }\n\n supportedChains.set(key, {\n chainId: chain.chainId,\n crossChainSwapEnabled: isCrossChainSwapEnabled,\n crossChainTargetChainIds,\n swapEnabled: isSwapEnabled,\n tokenList: chain.enabled_services.includes('token-list'),\n });\n }\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch supported chains from Markr API.',\n });\n }\n\n return supportedChains;\n}\n\nexport async function getSupportedTokens(\n apiOptions: ApiOptions,\n supportedChains: SupportedChainsMap,\n): Promise<Map<Caip2ChainId, Promise<TokenListResponse>>> {\n // Parallel fetch token lists for all supported chains.\n const supportedTokens: Map<Caip2ChainId, Promise<TokenListResponse>> = new Map();\n\n for (const [caip2ChainId, chainInfo] of supportedChains.entries()) {\n // Only fetch token list for EVM chains that support swaps.\n if (\n typeof chainInfo.chainId === 'number' &&\n chainInfo.tokenList &&\n (chainInfo.crossChainSwapEnabled || chainInfo.swapEnabled)\n ) {\n try {\n const tokenListPromise = markrGetTokenList(apiOptions, chainInfo.chainId);\n supportedTokens.set(caip2ChainId, tokenListPromise);\n } catch {\n // Ignore errors for individual token list fetches.\n // TODO: Logger?\n }\n }\n }\n\n return supportedTokens;\n}\n\n/**\n * Determine if the provided token address represents the native token for its chain.\n *\n * Markr represents EVM native tokens as the zero address and Solana native SOL\n * as the wrapped SOL mint address.\n */\nexport function isTokenAddressNative(address: string): boolean {\n return address === ERC_ZERO_ADDRESS || address === SOL_MINT_ADDRESS;\n}\n\n/**\n * Convert an `Asset` to the address string expected by the Markr API.\n *\n * For NATIVE assets the representation depends on the chain:\n * - EVM chains: `0x0000...0000` (ERC zero address)\n * - Solana chains: `So11111111111111111111111111111111111111112` (wrapped SOL mint)\n *\n * @param asset The asset to convert.\n * @param chainId CAIP-2 chain ID used to disambiguate NATIVE assets across chain types.\n */\nexport function assetToAddressString(asset: Asset, chainId: Caip2ChainId): string {\n if (asset.type === TokenType.NATIVE) {\n if (isSolanaNamespace(chainId)) {\n return SOL_MINT_ADDRESS;\n }\n\n return ERC_ZERO_ADDRESS;\n }\n\n return asset.address;\n}\n\n/**\n * Markr rejects `minAmountOut=0` for non-zero quotes.\n *\n * For very small quotes, integer truncation after slippage can produce `0`.\n * Clamp to `1` in that edge case to satisfy Markr API validation while\n * preserving normal slippage behavior for larger quotes.\n */\nexport function calculateMarkrMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n const minAmountOut = calculateMinimumAmountOut({ amountOut, assetOut, slippageBps });\n\n if (amountOut > 0n && minAmountOut === 0n) {\n return 1n;\n }\n\n return minAmountOut;\n}\n\nexport function quoteFromMarkrQuoteResponseData(\n data: QuoteResponseData,\n quoterProps: QuoterProps,\n partnerFeeBps: number,\n): Quote {\n const partnerFee: bigint = (data.amountOut * BigInt(partnerFeeBps)) / 10_000n;\n const amountOutAfterFees: bigint = data.amountOut - partnerFee;\n\n const fees: QuoteFees = [\n ...mapMarkrQuoteResponseDataFeesToQuoteFees(data.fees),\n // Add the partner fee as a QuoteFee component for Markr quotes.\n {\n type: 'partner',\n name: 'Core Fee',\n amount: partnerFee,\n chainId: quoterProps.targetChain.chainId,\n token: assetToFeeToken(quoterProps.targetAsset),\n },\n ];\n\n return {\n aggregator: {\n id: data.aggregator.id,\n logoUrl: data.aggregator.logo_url,\n name: data.aggregator.name,\n },\n amountIn: data.amountIn,\n amountOut: amountOutAfterFees,\n assetIn: quoterProps.sourceAsset,\n assetOut: quoterProps.targetAsset,\n expiresAt: data.expiredAt, // Markr returns `expiredAt` as Unix time in seconds; use as-is.\n fees,\n fromAddress: quoterProps.fromAddress,\n /**\n * This gasEstimate is rough or may be missing.\n * Consumers should use TransferManager.estimateGas for a more accurate estimate.\n */\n gasEstimate: data.gasEstimate,\n id: data.uuid,\n partnerFeeBps,\n serviceType: ServiceType.MARKR,\n slippageBps: quoterProps.slippageBps ?? data.recommendedSlippage,\n sourceChain: quoterProps.sourceChain,\n targetChain: quoterProps.targetChain,\n toAddress: quoterProps.toAddress,\n } satisfies Quote;\n}\n\nexport async function getPartnerFeeBps(apiOptions: ApiOptions): Promise<number> {\n try {\n const partnerInfo = await markrGetPartnerInfo(apiOptions);\n return partnerInfo.fee;\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch partner info from Markr API.',\n });\n }\n}\n\nexport function mapMarkrQuoteResponseDataFeesToQuoteFees(markrFees: QuoteResponseData['fees']): QuoteFees {\n if (!markrFees) {\n return [];\n }\n\n const fees: QuoteFee[] = [];\n\n for (const fee of markrFees) {\n const chainId = typeof fee.token.chainId === 'number' ? eip155ChainIdToCaip2(fee.token.chainId) : fee.token.chainId;\n\n let token: QuoteFeeToken | undefined;\n\n if (isTokenAddressNative(fee.token.address)) {\n token = { type: TokenType.NATIVE };\n } else if (isEvmAddress(fee.token.address)) {\n token = { type: TokenType.ERC20, address: fee.token.address };\n } else if (isSolAddress(fee.token.address)) {\n token = { type: TokenType.SPL, address: fee.token.address };\n }\n\n if (!token) {\n // Skip fee if we can't determine token type.\n continue;\n }\n\n fees.push({\n type: fee.type,\n name: fee.name,\n amount: fee.amount,\n chainId,\n token,\n });\n }\n\n return fees;\n}\n\nfunction assetToFeeToken(asset: Asset): QuoteFeeToken {\n if (asset.type === TokenType.NATIVE) {\n return { type: TokenType.NATIVE };\n }\n\n if (asset.type === TokenType.SPL) {\n return { type: TokenType.SPL, address: asset.address };\n }\n\n return { type: TokenType.ERC20, address: asset.address };\n}\n\nexport type MarkrRouterAbi =\n | (typeof import('./_abis/swap-wrapper-abi'))['MARKR_SWAP_WRAPPER_ABI']\n | (typeof import('./_abis/cross-chain-swap-wrapper-abi'))['MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI'];\n\nexport async function getMarkrSwapWrapperAbi(crossChain: boolean): Promise<MarkrRouterAbi> {\n if (crossChain) {\n return (await import('./_abis/cross-chain-swap-wrapper-abi')).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI;\n }\n\n return (await import('./_abis/swap-wrapper-abi')).MARKR_SWAP_WRAPPER_ABI;\n}\n\nexport function extractHexDataFromError(error: unknown): Hex | undefined {\n if (error instanceof BaseError) {\n const directData = (error as { data?: unknown }).data;\n if (isHex(directData)) {\n return directData;\n }\n\n let walkedData: Hex | undefined;\n error.walk((walkedError) => {\n const nestedData = (walkedError as { data?: unknown }).data;\n if (!walkedData && isHex(nestedData)) {\n walkedData = nestedData;\n }\n return false;\n });\n\n if (walkedData) {\n return walkedData;\n }\n\n const causeData = (error as { cause?: { data?: unknown } }).cause?.data;\n if (isHex(causeData)) {\n return causeData;\n }\n }\n\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const genericError = error as {\n data?: unknown;\n error?: { data?: unknown };\n cause?: { data?: unknown };\n response?: { data?: unknown };\n body?: { error?: { data?: unknown } };\n };\n\n if (isHex(genericError.data)) {\n return genericError.data;\n }\n\n if (isHex(genericError.error?.data)) {\n return genericError.error.data;\n }\n\n if (isHex(genericError.cause?.data)) {\n return genericError.cause.data;\n }\n\n if (isHex(genericError.response?.data)) {\n return genericError.response.data;\n }\n\n if (isHex(genericError.body?.error?.data)) {\n return genericError.body.error.data;\n }\n\n return undefined;\n}\n\nexport function decodeMarkrRevertError(abi: MarkrRouterAbi, error: unknown): string | null {\n const revertData = extractHexDataFromError(error);\n\n if (!revertData) {\n return null;\n }\n\n try {\n const decoded = decodeErrorResult({ abi, data: revertData });\n const decodedArgs = decoded.args.length > 0 ? `(${decoded.args.map(String).join(', ')})` : '()';\n\n return `${decoded.errorName}${decodedArgs}`;\n } catch {\n const selector = revertData.slice(0, 10).toLowerCase();\n\n for (const abiItem of abi) {\n if (abiItem.type !== 'error') {\n continue;\n }\n\n const signature = `${abiItem.name}(${abiItem.inputs.map((input) => input.type).join(',')})`;\n if (toFunctionSelector(signature).toLowerCase() === selector) {\n return `${abiItem.name}()`;\n }\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ERC_ZERO_ADDRESS as e,SOL_MINT_ADDRESS as t,ServiceType as n,TokenType as r}from"../../constants.js";import{ErrorCode as i,ErrorReason as a,SdkError as o}from"../../errors.js";import{eip155ChainIdToCaip2 as s}from"../../utils/caip.js";import{isEvmAddress as c}from"../../utils/evm-address.js";import{isSolanaNamespace as l}from"../../_utils/chain.js";import{markrGetInfoChains as u,markrGetPartnerInfo as d,markrGetTokenList as f}from"./_api.js";import{calculateMinimumAmountOut as p}from"../../_utils/math.js";import{isSolAddress as m}from"../../utils/sol-address.js";import{BaseError as h,decodeErrorResult as g,isHex as _,toFunctionSelector as v}from"viem";async function y(e){let t=new Map;try{let n=(await u(e)).filter(e=>e.chainType===`evm`||e.chainType===`svm`);for(let e of n){let n=typeof e.chainId==`number`?s(e.chainId):e.chainId,r=e.enabled_services.includes(`cross-chain-quote`)&&e.enabled_services.includes(`cross-chain-swap`),i=e.enabled_services.includes(`quote`)&&e.enabled_services.includes(`swap`);!r&&!i||t.set(n,{chainId:e.chainId,crossChainSwapEnabled:r,swapEnabled:i,tokenList:e.enabled_services.includes(`token-list`)})}}catch(e){throw new o(a.UNKNOWN,i.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch supported chains from Markr API.`})}return t}async function b(e,t){let n=new Map;for(let[r,i]of t.entries())if(typeof i.chainId==`number`&&i.tokenList&&(i.crossChainSwapEnabled||i.swapEnabled))try{let t=f(e,i.chainId);n.set(r,t)}catch{}return n}function x(n){return n===e||n===t}function S(n,i){return n.type===r.NATIVE?l(i)?t:e:n.address}function C({amountOut:e,assetOut:t,slippageBps:n}){let r=p({amountOut:e,assetOut:t,slippageBps:n});return e>0n&&r===0n?1n:r}function w(e,t,r){let i=e.amountOut*BigInt(r)/10000n,a=e.amountOut-i,o=[...E(e.fees),{type:`partner`,name:`Core Fee`,amount:i,chainId:t.targetChain.chainId,token:D(t.targetAsset)}];return{aggregator:{id:e.aggregator.id,logoUrl:e.aggregator.logo_url,name:e.aggregator.name},amountIn:e.amountIn,amountOut:a,assetIn:t.sourceAsset,assetOut:t.targetAsset,expiresAt:e.expiredAt,fees:o,fromAddress:t.fromAddress,gasEstimate:e.gasEstimate,id:e.uuid,partnerFeeBps:r,serviceType:n.MARKR,slippageBps:t.slippageBps??e.recommendedSlippage,sourceChain:t.sourceChain,targetChain:t.targetChain,toAddress:t.toAddress}}async function T(e){try{return(await d(e)).fee}catch(e){throw new o(a.UNKNOWN,i.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch partner info from Markr API.`})}}function E(e){if(!e)return[];let t=[];for(let n of e){let e=typeof n.token.chainId==`number`?s(n.token.chainId):n.token.chainId,i;x(n.token.address)?i={type:r.NATIVE}:c(n.token.address)?i={type:r.ERC20,address:n.token.address}:m(n.token.address)&&(i={type:r.SPL,address:n.token.address}),i&&t.push({type:n.type,name:n.name,amount:n.amount,chainId:e,token:i})}return t}function D(e){return e.type===r.NATIVE?{type:r.NATIVE}:e.type===r.SPL?{type:r.SPL,address:e.address}:{type:r.ERC20,address:e.address}}async function O(e){return e?(await import(`./_abis/cross-chain-swap-wrapper-abi.js`)).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI:(await import(`./_abis/swap-wrapper-abi.js`)).MARKR_SWAP_WRAPPER_ABI}function k(e){if(e instanceof h){let t=e.data;if(_(t))return t;let n;if(e.walk(e=>{let t=e.data;return!n&&_(t)&&(n=t),!1}),n)return n;let r=e.cause?.data;if(_(r))return r}if(!e||typeof e!=`object`)return;let t=e;if(_(t.data))return t.data;if(_(t.error?.data))return t.error.data;if(_(t.cause?.data))return t.cause.data;if(_(t.response?.data))return t.response.data;if(_(t.body?.error?.data))return t.body.error.data}function A(e,t){let n=k(t);if(!n)return null;try{let t=g({abi:e,data:n}),r=t.args.length>0?`(${t.args.map(String).join(`, `)})`:`()`;return`${t.errorName}${r}`}catch{let t=n.slice(0,10).toLowerCase();for(let n of e)if(n.type===`error`&&v(`${n.name}(${n.inputs.map(e=>e.type).join(`,`)})`).toLowerCase()===t)return`${n.name}()`}return null}export{S as assetToAddressString,C as calculateMarkrMinimumAmountOut,A as decodeMarkrRevertError,O as getMarkrSwapWrapperAbi,T as getPartnerFeeBps,y as getSupportedChains,b as getSupportedTokens,x as isTokenAddressNative,w as quoteFromMarkrQuoteResponseData};
1
+ import{ERC_ZERO_ADDRESS as e,SOL_MINT_ADDRESS as t,ServiceType as n,TokenType as r}from"../../constants.js";import{ErrorCode as i,ErrorReason as a,SdkError as o}from"../../errors.js";import{eip155ChainIdToCaip2 as s}from"../../utils/caip.js";import{isEvmAddress as c}from"../../utils/evm-address.js";import{isSolanaNamespace as l}from"../../_utils/chain.js";import{markrGetInfoChains as u,markrGetPartnerInfo as d,markrGetTokenList as f}from"./_api.js";import{calculateMinimumAmountOut as p}from"../../_utils/math.js";import{isSolAddress as m}from"../../utils/sol-address.js";import{BaseError as h,decodeErrorResult as g,isHex as _,toFunctionSelector as v}from"viem";async function y(e){let t=new Map;try{let n=(await u(e)).filter(e=>e.chainType===`evm`||e.chainType===`svm`);for(let e of n){let n=typeof e.chainId==`number`?s(e.chainId):e.chainId,r=e.enabled_services.includes(`cross-chain-quote`)&&e.enabled_services.includes(`cross-chain-swap`),i=e.enabled_services.includes(`quote`)&&e.enabled_services.includes(`swap`),a=new Set;for(let t of e.lanes){let e=typeof t==`number`?s(t):t;e!==n&&a.add(e)}let o=r?a:new Set;!i&&o.size===0||t.set(n,{chainId:e.chainId,crossChainSwapEnabled:r,crossChainTargetChainIds:o,swapEnabled:i,tokenList:e.enabled_services.includes(`token-list`)})}}catch(e){throw new o(a.UNKNOWN,i.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch supported chains from Markr API.`})}return t}async function b(e,t){let n=new Map;for(let[r,i]of t.entries())if(typeof i.chainId==`number`&&i.tokenList&&(i.crossChainSwapEnabled||i.swapEnabled))try{let t=f(e,i.chainId);n.set(r,t)}catch{}return n}function x(n){return n===e||n===t}function S(n,i){return n.type===r.NATIVE?l(i)?t:e:n.address}function C({amountOut:e,assetOut:t,slippageBps:n}){let r=p({amountOut:e,assetOut:t,slippageBps:n});return e>0n&&r===0n?1n:r}function w(e,t,r){let i=e.amountOut*BigInt(r)/10000n,a=e.amountOut-i,o=[...E(e.fees),{type:`partner`,name:`Core Fee`,amount:i,chainId:t.targetChain.chainId,token:D(t.targetAsset)}];return{aggregator:{id:e.aggregator.id,logoUrl:e.aggregator.logo_url,name:e.aggregator.name},amountIn:e.amountIn,amountOut:a,assetIn:t.sourceAsset,assetOut:t.targetAsset,expiresAt:e.expiredAt,fees:o,fromAddress:t.fromAddress,gasEstimate:e.gasEstimate,id:e.uuid,partnerFeeBps:r,serviceType:n.MARKR,slippageBps:t.slippageBps??e.recommendedSlippage,sourceChain:t.sourceChain,targetChain:t.targetChain,toAddress:t.toAddress}}async function T(e){try{return(await d(e)).fee}catch(e){throw new o(a.UNKNOWN,i.INITIALIZATION_FAILED,{cause:e,details:`Failed to fetch partner info from Markr API.`})}}function E(e){if(!e)return[];let t=[];for(let n of e){let e=typeof n.token.chainId==`number`?s(n.token.chainId):n.token.chainId,i;x(n.token.address)?i={type:r.NATIVE}:c(n.token.address)?i={type:r.ERC20,address:n.token.address}:m(n.token.address)&&(i={type:r.SPL,address:n.token.address}),i&&t.push({type:n.type,name:n.name,amount:n.amount,chainId:e,token:i})}return t}function D(e){return e.type===r.NATIVE?{type:r.NATIVE}:e.type===r.SPL?{type:r.SPL,address:e.address}:{type:r.ERC20,address:e.address}}async function O(e){return e?(await import(`./_abis/cross-chain-swap-wrapper-abi.js`)).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI:(await import(`./_abis/swap-wrapper-abi.js`)).MARKR_SWAP_WRAPPER_ABI}function k(e){if(e instanceof h){let t=e.data;if(_(t))return t;let n;if(e.walk(e=>{let t=e.data;return!n&&_(t)&&(n=t),!1}),n)return n;let r=e.cause?.data;if(_(r))return r}if(!e||typeof e!=`object`)return;let t=e;if(_(t.data))return t.data;if(_(t.error?.data))return t.error.data;if(_(t.cause?.data))return t.cause.data;if(_(t.response?.data))return t.response.data;if(_(t.body?.error?.data))return t.body.error.data}function A(e,t){let n=k(t);if(!n)return null;try{let t=g({abi:e,data:n}),r=t.args.length>0?`(${t.args.map(String).join(`, `)})`:`()`;return`${t.errorName}${r}`}catch{let t=n.slice(0,10).toLowerCase();for(let n of e)if(n.type===`error`&&v(`${n.name}(${n.inputs.map(e=>e.type).join(`,`)})`).toLowerCase()===t)return`${n.name}()`}return null}export{S as assetToAddressString,C as calculateMarkrMinimumAmountOut,A as decodeMarkrRevertError,O as getMarkrSwapWrapperAbi,T as getPartnerFeeBps,y as getSupportedChains,b as getSupportedTokens,x as isTokenAddressNative,w as quoteFromMarkrQuoteResponseData};
2
2
  //# sourceMappingURL=_utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_utils.js","names":[],"sources":["../../../src/transfer-service/markr/_utils.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../errors';\nimport { BaseError, decodeErrorResult, type Hex, isHex, toFunctionSelector } from 'viem';\nimport {\n type QuoteResponseData,\n type SupportedChainsResponseItemEvm,\n type SupportedChainsResponseItemSvm,\n type TokenListResponse,\n} from './_schema';\nimport { ERC_ZERO_ADDRESS, SOL_MINT_ADDRESS, ServiceType, TokenType } from '../../constants';\nimport { isSolanaNamespace } from '../../_utils/chain';\nimport { calculateMinimumAmountOut } from '../../_utils/math';\nimport { eip155ChainIdToCaip2 } from '../../utils/caip';\nimport type { Asset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Quote, QuoteFee, QuoteFees, QuoteFeeToken, QuoterProps } from '../../types/quote';\nimport { markrGetInfoChains, markrGetPartnerInfo, markrGetTokenList, type ApiOptions } from './_api';\nimport { isEvmAddress } from '../../utils/evm-address';\nimport { isSolAddress } from '../../utils/sol-address';\n\nexport type SupportedChainsMap = Map<\n Caip2ChainId,\n {\n /** `number` for EVM, `Caip2ChainId` for SVM */\n chainId: number | Caip2ChainId;\n crossChainSwapEnabled: boolean;\n swapEnabled: boolean;\n tokenList: boolean;\n }\n>;\n\nexport async function getSupportedChains(apiOptions: ApiOptions): Promise<SupportedChainsMap> {\n const supportedChains: SupportedChainsMap = new Map();\n\n try {\n const chains = await markrGetInfoChains(apiOptions);\n const filteredSupportedChains = chains.filter(\n (chain): chain is SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm => {\n // Only include chains types that we support in the SDK (EVM and Solana for now).\n return chain.chainType === 'evm' || chain.chainType === 'svm';\n },\n );\n\n for (const chain of filteredSupportedChains) {\n const key: Caip2ChainId = typeof chain.chainId === 'number' ? eip155ChainIdToCaip2(chain.chainId) : chain.chainId;\n\n const isCrossChainSwapEnabled =\n chain.enabled_services.includes('cross-chain-quote') && chain.enabled_services.includes('cross-chain-swap');\n const isSwapEnabled = chain.enabled_services.includes('quote') && chain.enabled_services.includes('swap');\n\n if (!isCrossChainSwapEnabled && !isSwapEnabled) {\n continue;\n }\n\n supportedChains.set(key, {\n chainId: chain.chainId,\n crossChainSwapEnabled: isCrossChainSwapEnabled,\n swapEnabled: isSwapEnabled,\n tokenList: chain.enabled_services.includes('token-list'),\n });\n }\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch supported chains from Markr API.',\n });\n }\n\n return supportedChains;\n}\n\nexport async function getSupportedTokens(\n apiOptions: ApiOptions,\n supportedChains: SupportedChainsMap,\n): Promise<Map<Caip2ChainId, Promise<TokenListResponse>>> {\n // Parallel fetch token lists for all supported chains.\n const supportedTokens: Map<Caip2ChainId, Promise<TokenListResponse>> = new Map();\n\n for (const [caip2ChainId, chainInfo] of supportedChains.entries()) {\n // Only fetch token list for EVM chains that support swaps.\n if (\n typeof chainInfo.chainId === 'number' &&\n chainInfo.tokenList &&\n (chainInfo.crossChainSwapEnabled || chainInfo.swapEnabled)\n ) {\n try {\n const tokenListPromise = markrGetTokenList(apiOptions, chainInfo.chainId);\n supportedTokens.set(caip2ChainId, tokenListPromise);\n } catch {\n // Ignore errors for individual token list fetches.\n // TODO: Logger?\n }\n }\n }\n\n return supportedTokens;\n}\n\n/**\n * Determine if the provided token address represents the native token for its chain.\n *\n * Markr represents EVM native tokens as the zero address and Solana native SOL\n * as the wrapped SOL mint address.\n */\nexport function isTokenAddressNative(address: string): boolean {\n return address === ERC_ZERO_ADDRESS || address === SOL_MINT_ADDRESS;\n}\n\n/**\n * Convert an `Asset` to the address string expected by the Markr API.\n *\n * For NATIVE assets the representation depends on the chain:\n * - EVM chains: `0x0000...0000` (ERC zero address)\n * - Solana chains: `So11111111111111111111111111111111111111112` (wrapped SOL mint)\n *\n * @param asset The asset to convert.\n * @param chainId CAIP-2 chain ID used to disambiguate NATIVE assets across chain types.\n */\nexport function assetToAddressString(asset: Asset, chainId: Caip2ChainId): string {\n if (asset.type === TokenType.NATIVE) {\n if (isSolanaNamespace(chainId)) {\n return SOL_MINT_ADDRESS;\n }\n\n return ERC_ZERO_ADDRESS;\n }\n\n return asset.address;\n}\n\n/**\n * Markr rejects `minAmountOut=0` for non-zero quotes.\n *\n * For very small quotes, integer truncation after slippage can produce `0`.\n * Clamp to `1` in that edge case to satisfy Markr API validation while\n * preserving normal slippage behavior for larger quotes.\n */\nexport function calculateMarkrMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n const minAmountOut = calculateMinimumAmountOut({ amountOut, assetOut, slippageBps });\n\n if (amountOut > 0n && minAmountOut === 0n) {\n return 1n;\n }\n\n return minAmountOut;\n}\n\nexport function quoteFromMarkrQuoteResponseData(\n data: QuoteResponseData,\n quoterProps: QuoterProps,\n partnerFeeBps: number,\n): Quote {\n const partnerFee: bigint = (data.amountOut * BigInt(partnerFeeBps)) / 10_000n;\n const amountOutAfterFees: bigint = data.amountOut - partnerFee;\n\n const fees: QuoteFees = [\n ...mapMarkrQuoteResponseDataFeesToQuoteFees(data.fees),\n // Add the partner fee as a QuoteFee component for Markr quotes.\n {\n type: 'partner',\n name: 'Core Fee',\n amount: partnerFee,\n chainId: quoterProps.targetChain.chainId,\n token: assetToFeeToken(quoterProps.targetAsset),\n },\n ];\n\n return {\n aggregator: {\n id: data.aggregator.id,\n logoUrl: data.aggregator.logo_url,\n name: data.aggregator.name,\n },\n amountIn: data.amountIn,\n amountOut: amountOutAfterFees,\n assetIn: quoterProps.sourceAsset,\n assetOut: quoterProps.targetAsset,\n expiresAt: data.expiredAt, // Markr returns `expiredAt` as Unix time in seconds; use as-is.\n fees,\n fromAddress: quoterProps.fromAddress,\n /**\n * This gasEstimate is rough or may be missing.\n * Consumers should use TransferManager.estimateGas for a more accurate estimate.\n */\n gasEstimate: data.gasEstimate,\n id: data.uuid,\n partnerFeeBps,\n serviceType: ServiceType.MARKR,\n slippageBps: quoterProps.slippageBps ?? data.recommendedSlippage,\n sourceChain: quoterProps.sourceChain,\n targetChain: quoterProps.targetChain,\n toAddress: quoterProps.toAddress,\n } satisfies Quote;\n}\n\nexport async function getPartnerFeeBps(apiOptions: ApiOptions): Promise<number> {\n try {\n const partnerInfo = await markrGetPartnerInfo(apiOptions);\n return partnerInfo.fee;\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch partner info from Markr API.',\n });\n }\n}\n\nexport function mapMarkrQuoteResponseDataFeesToQuoteFees(markrFees: QuoteResponseData['fees']): QuoteFees {\n if (!markrFees) {\n return [];\n }\n\n const fees: QuoteFee[] = [];\n\n for (const fee of markrFees) {\n const chainId = typeof fee.token.chainId === 'number' ? eip155ChainIdToCaip2(fee.token.chainId) : fee.token.chainId;\n\n let token: QuoteFeeToken | undefined;\n\n if (isTokenAddressNative(fee.token.address)) {\n token = { type: TokenType.NATIVE };\n } else if (isEvmAddress(fee.token.address)) {\n token = { type: TokenType.ERC20, address: fee.token.address };\n } else if (isSolAddress(fee.token.address)) {\n token = { type: TokenType.SPL, address: fee.token.address };\n }\n\n if (!token) {\n // Skip fee if we can't determine token type.\n continue;\n }\n\n fees.push({\n type: fee.type,\n name: fee.name,\n amount: fee.amount,\n chainId,\n token,\n });\n }\n\n return fees;\n}\n\nfunction assetToFeeToken(asset: Asset): QuoteFeeToken {\n if (asset.type === TokenType.NATIVE) {\n return { type: TokenType.NATIVE };\n }\n\n if (asset.type === TokenType.SPL) {\n return { type: TokenType.SPL, address: asset.address };\n }\n\n return { type: TokenType.ERC20, address: asset.address };\n}\n\nexport type MarkrRouterAbi =\n | (typeof import('./_abis/swap-wrapper-abi'))['MARKR_SWAP_WRAPPER_ABI']\n | (typeof import('./_abis/cross-chain-swap-wrapper-abi'))['MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI'];\n\nexport async function getMarkrSwapWrapperAbi(crossChain: boolean): Promise<MarkrRouterAbi> {\n if (crossChain) {\n return (await import('./_abis/cross-chain-swap-wrapper-abi')).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI;\n }\n\n return (await import('./_abis/swap-wrapper-abi')).MARKR_SWAP_WRAPPER_ABI;\n}\n\nexport function extractHexDataFromError(error: unknown): Hex | undefined {\n if (error instanceof BaseError) {\n const directData = (error as { data?: unknown }).data;\n if (isHex(directData)) {\n return directData;\n }\n\n let walkedData: Hex | undefined;\n error.walk((walkedError) => {\n const nestedData = (walkedError as { data?: unknown }).data;\n if (!walkedData && isHex(nestedData)) {\n walkedData = nestedData;\n }\n return false;\n });\n\n if (walkedData) {\n return walkedData;\n }\n\n const causeData = (error as { cause?: { data?: unknown } }).cause?.data;\n if (isHex(causeData)) {\n return causeData;\n }\n }\n\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const genericError = error as {\n data?: unknown;\n error?: { data?: unknown };\n cause?: { data?: unknown };\n response?: { data?: unknown };\n body?: { error?: { data?: unknown } };\n };\n\n if (isHex(genericError.data)) {\n return genericError.data;\n }\n\n if (isHex(genericError.error?.data)) {\n return genericError.error.data;\n }\n\n if (isHex(genericError.cause?.data)) {\n return genericError.cause.data;\n }\n\n if (isHex(genericError.response?.data)) {\n return genericError.response.data;\n }\n\n if (isHex(genericError.body?.error?.data)) {\n return genericError.body.error.data;\n }\n\n return undefined;\n}\n\nexport function decodeMarkrRevertError(abi: MarkrRouterAbi, error: unknown): string | null {\n const revertData = extractHexDataFromError(error);\n\n if (!revertData) {\n return null;\n }\n\n try {\n const decoded = decodeErrorResult({ abi, data: revertData });\n const decodedArgs = decoded.args.length > 0 ? `(${decoded.args.map(String).join(', ')})` : '()';\n\n return `${decoded.errorName}${decodedArgs}`;\n } catch {\n const selector = revertData.slice(0, 10).toLowerCase();\n\n for (const abiItem of abi) {\n if (abiItem.type !== 'error') {\n continue;\n }\n\n const signature = `${abiItem.name}(${abiItem.inputs.map((input) => input.type).join(',')})`;\n if (toFunctionSelector(signature).toLowerCase() === selector) {\n return `${abiItem.name}()`;\n }\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"_utils.js","names":[],"sources":["../../../src/transfer-service/markr/_utils.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../errors';\nimport { BaseError, decodeErrorResult, type Hex, isHex, toFunctionSelector } from 'viem';\nimport {\n type QuoteResponseData,\n type SupportedChainsResponseItemEvm,\n type SupportedChainsResponseItemSvm,\n type TokenListResponse,\n} from './_schema';\nimport { ERC_ZERO_ADDRESS, SOL_MINT_ADDRESS, ServiceType, TokenType } from '../../constants';\nimport { isSolanaNamespace } from '../../_utils/chain';\nimport { calculateMinimumAmountOut } from '../../_utils/math';\nimport { eip155ChainIdToCaip2 } from '../../utils/caip';\nimport type { Asset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Quote, QuoteFee, QuoteFees, QuoteFeeToken, QuoterProps } from '../../types/quote';\nimport { markrGetInfoChains, markrGetPartnerInfo, markrGetTokenList, type ApiOptions } from './_api';\nimport { isEvmAddress } from '../../utils/evm-address';\nimport { isSolAddress } from '../../utils/sol-address';\n\nexport type SupportedChainsMap = Map<\n Caip2ChainId,\n {\n /** `number` for EVM, `Caip2ChainId` for SVM */\n chainId: number | Caip2ChainId;\n crossChainSwapEnabled: boolean;\n crossChainTargetChainIds: ReadonlySet<Caip2ChainId>;\n swapEnabled: boolean;\n tokenList: boolean;\n }\n>;\n\nexport async function getSupportedChains(apiOptions: ApiOptions): Promise<SupportedChainsMap> {\n const supportedChains: SupportedChainsMap = new Map();\n\n try {\n const chains = await markrGetInfoChains(apiOptions);\n const filteredSupportedChains = chains.filter(\n (chain): chain is SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm => {\n // Only include chains types that we support in the SDK (EVM and Solana for now).\n return chain.chainType === 'evm' || chain.chainType === 'svm';\n },\n );\n\n for (const chain of filteredSupportedChains) {\n const key: Caip2ChainId = typeof chain.chainId === 'number' ? eip155ChainIdToCaip2(chain.chainId) : chain.chainId;\n\n const isCrossChainSwapEnabled =\n chain.enabled_services.includes('cross-chain-quote') && chain.enabled_services.includes('cross-chain-swap');\n const isSwapEnabled = chain.enabled_services.includes('quote') && chain.enabled_services.includes('swap');\n const normalizedLaneChainIds = new Set<Caip2ChainId>();\n\n for (const lane of chain.lanes) {\n const laneChainId = typeof lane === 'number' ? eip155ChainIdToCaip2(lane) : lane;\n\n if (laneChainId !== key) {\n normalizedLaneChainIds.add(laneChainId);\n }\n }\n\n const crossChainTargetChainIds = isCrossChainSwapEnabled ? normalizedLaneChainIds : new Set<Caip2ChainId>();\n\n if (!isSwapEnabled && crossChainTargetChainIds.size === 0) {\n continue;\n }\n\n supportedChains.set(key, {\n chainId: chain.chainId,\n crossChainSwapEnabled: isCrossChainSwapEnabled,\n crossChainTargetChainIds,\n swapEnabled: isSwapEnabled,\n tokenList: chain.enabled_services.includes('token-list'),\n });\n }\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch supported chains from Markr API.',\n });\n }\n\n return supportedChains;\n}\n\nexport async function getSupportedTokens(\n apiOptions: ApiOptions,\n supportedChains: SupportedChainsMap,\n): Promise<Map<Caip2ChainId, Promise<TokenListResponse>>> {\n // Parallel fetch token lists for all supported chains.\n const supportedTokens: Map<Caip2ChainId, Promise<TokenListResponse>> = new Map();\n\n for (const [caip2ChainId, chainInfo] of supportedChains.entries()) {\n // Only fetch token list for EVM chains that support swaps.\n if (\n typeof chainInfo.chainId === 'number' &&\n chainInfo.tokenList &&\n (chainInfo.crossChainSwapEnabled || chainInfo.swapEnabled)\n ) {\n try {\n const tokenListPromise = markrGetTokenList(apiOptions, chainInfo.chainId);\n supportedTokens.set(caip2ChainId, tokenListPromise);\n } catch {\n // Ignore errors for individual token list fetches.\n // TODO: Logger?\n }\n }\n }\n\n return supportedTokens;\n}\n\n/**\n * Determine if the provided token address represents the native token for its chain.\n *\n * Markr represents EVM native tokens as the zero address and Solana native SOL\n * as the wrapped SOL mint address.\n */\nexport function isTokenAddressNative(address: string): boolean {\n return address === ERC_ZERO_ADDRESS || address === SOL_MINT_ADDRESS;\n}\n\n/**\n * Convert an `Asset` to the address string expected by the Markr API.\n *\n * For NATIVE assets the representation depends on the chain:\n * - EVM chains: `0x0000...0000` (ERC zero address)\n * - Solana chains: `So11111111111111111111111111111111111111112` (wrapped SOL mint)\n *\n * @param asset The asset to convert.\n * @param chainId CAIP-2 chain ID used to disambiguate NATIVE assets across chain types.\n */\nexport function assetToAddressString(asset: Asset, chainId: Caip2ChainId): string {\n if (asset.type === TokenType.NATIVE) {\n if (isSolanaNamespace(chainId)) {\n return SOL_MINT_ADDRESS;\n }\n\n return ERC_ZERO_ADDRESS;\n }\n\n return asset.address;\n}\n\n/**\n * Markr rejects `minAmountOut=0` for non-zero quotes.\n *\n * For very small quotes, integer truncation after slippage can produce `0`.\n * Clamp to `1` in that edge case to satisfy Markr API validation while\n * preserving normal slippage behavior for larger quotes.\n */\nexport function calculateMarkrMinimumAmountOut({\n amountOut,\n assetOut,\n slippageBps,\n}: Pick<Quote, 'amountOut' | 'assetOut' | 'slippageBps'>): bigint {\n const minAmountOut = calculateMinimumAmountOut({ amountOut, assetOut, slippageBps });\n\n if (amountOut > 0n && minAmountOut === 0n) {\n return 1n;\n }\n\n return minAmountOut;\n}\n\nexport function quoteFromMarkrQuoteResponseData(\n data: QuoteResponseData,\n quoterProps: QuoterProps,\n partnerFeeBps: number,\n): Quote {\n const partnerFee: bigint = (data.amountOut * BigInt(partnerFeeBps)) / 10_000n;\n const amountOutAfterFees: bigint = data.amountOut - partnerFee;\n\n const fees: QuoteFees = [\n ...mapMarkrQuoteResponseDataFeesToQuoteFees(data.fees),\n // Add the partner fee as a QuoteFee component for Markr quotes.\n {\n type: 'partner',\n name: 'Core Fee',\n amount: partnerFee,\n chainId: quoterProps.targetChain.chainId,\n token: assetToFeeToken(quoterProps.targetAsset),\n },\n ];\n\n return {\n aggregator: {\n id: data.aggregator.id,\n logoUrl: data.aggregator.logo_url,\n name: data.aggregator.name,\n },\n amountIn: data.amountIn,\n amountOut: amountOutAfterFees,\n assetIn: quoterProps.sourceAsset,\n assetOut: quoterProps.targetAsset,\n expiresAt: data.expiredAt, // Markr returns `expiredAt` as Unix time in seconds; use as-is.\n fees,\n fromAddress: quoterProps.fromAddress,\n /**\n * This gasEstimate is rough or may be missing.\n * Consumers should use TransferManager.estimateGas for a more accurate estimate.\n */\n gasEstimate: data.gasEstimate,\n id: data.uuid,\n partnerFeeBps,\n serviceType: ServiceType.MARKR,\n slippageBps: quoterProps.slippageBps ?? data.recommendedSlippage,\n sourceChain: quoterProps.sourceChain,\n targetChain: quoterProps.targetChain,\n toAddress: quoterProps.toAddress,\n } satisfies Quote;\n}\n\nexport async function getPartnerFeeBps(apiOptions: ApiOptions): Promise<number> {\n try {\n const partnerInfo = await markrGetPartnerInfo(apiOptions);\n return partnerInfo.fee;\n } catch (error) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INITIALIZATION_FAILED, {\n cause: error,\n details: 'Failed to fetch partner info from Markr API.',\n });\n }\n}\n\nexport function mapMarkrQuoteResponseDataFeesToQuoteFees(markrFees: QuoteResponseData['fees']): QuoteFees {\n if (!markrFees) {\n return [];\n }\n\n const fees: QuoteFee[] = [];\n\n for (const fee of markrFees) {\n const chainId = typeof fee.token.chainId === 'number' ? eip155ChainIdToCaip2(fee.token.chainId) : fee.token.chainId;\n\n let token: QuoteFeeToken | undefined;\n\n if (isTokenAddressNative(fee.token.address)) {\n token = { type: TokenType.NATIVE };\n } else if (isEvmAddress(fee.token.address)) {\n token = { type: TokenType.ERC20, address: fee.token.address };\n } else if (isSolAddress(fee.token.address)) {\n token = { type: TokenType.SPL, address: fee.token.address };\n }\n\n if (!token) {\n // Skip fee if we can't determine token type.\n continue;\n }\n\n fees.push({\n type: fee.type,\n name: fee.name,\n amount: fee.amount,\n chainId,\n token,\n });\n }\n\n return fees;\n}\n\nfunction assetToFeeToken(asset: Asset): QuoteFeeToken {\n if (asset.type === TokenType.NATIVE) {\n return { type: TokenType.NATIVE };\n }\n\n if (asset.type === TokenType.SPL) {\n return { type: TokenType.SPL, address: asset.address };\n }\n\n return { type: TokenType.ERC20, address: asset.address };\n}\n\nexport type MarkrRouterAbi =\n | (typeof import('./_abis/swap-wrapper-abi'))['MARKR_SWAP_WRAPPER_ABI']\n | (typeof import('./_abis/cross-chain-swap-wrapper-abi'))['MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI'];\n\nexport async function getMarkrSwapWrapperAbi(crossChain: boolean): Promise<MarkrRouterAbi> {\n if (crossChain) {\n return (await import('./_abis/cross-chain-swap-wrapper-abi')).MARKR_CROSS_CHAIN_SWAP_WRAPPER_ABI;\n }\n\n return (await import('./_abis/swap-wrapper-abi')).MARKR_SWAP_WRAPPER_ABI;\n}\n\nexport function extractHexDataFromError(error: unknown): Hex | undefined {\n if (error instanceof BaseError) {\n const directData = (error as { data?: unknown }).data;\n if (isHex(directData)) {\n return directData;\n }\n\n let walkedData: Hex | undefined;\n error.walk((walkedError) => {\n const nestedData = (walkedError as { data?: unknown }).data;\n if (!walkedData && isHex(nestedData)) {\n walkedData = nestedData;\n }\n return false;\n });\n\n if (walkedData) {\n return walkedData;\n }\n\n const causeData = (error as { cause?: { data?: unknown } }).cause?.data;\n if (isHex(causeData)) {\n return causeData;\n }\n }\n\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n const genericError = error as {\n data?: unknown;\n error?: { data?: unknown };\n cause?: { data?: unknown };\n response?: { data?: unknown };\n body?: { error?: { data?: unknown } };\n };\n\n if (isHex(genericError.data)) {\n return genericError.data;\n }\n\n if (isHex(genericError.error?.data)) {\n return genericError.error.data;\n }\n\n if (isHex(genericError.cause?.data)) {\n return genericError.cause.data;\n }\n\n if (isHex(genericError.response?.data)) {\n return genericError.response.data;\n }\n\n if (isHex(genericError.body?.error?.data)) {\n return genericError.body.error.data;\n }\n\n return undefined;\n}\n\nexport function decodeMarkrRevertError(abi: MarkrRouterAbi, error: unknown): string | null {\n const revertData = extractHexDataFromError(error);\n\n if (!revertData) {\n return null;\n }\n\n try {\n const decoded = decodeErrorResult({ abi, data: revertData });\n const decodedArgs = decoded.args.length > 0 ? `(${decoded.args.map(String).join(', ')})` : '()';\n\n return `${decoded.errorName}${decodedArgs}`;\n } catch {\n const selector = revertData.slice(0, 10).toLowerCase();\n\n for (const abiItem of abi) {\n if (abiItem.type !== 'error') {\n continue;\n }\n\n const signature = `${abiItem.name}(${abiItem.inputs.map((input) => input.type).join(',')})`;\n if (toFunctionSelector(signature).toLowerCase() === selector) {\n return `${abiItem.name}()`;\n }\n }\n }\n\n return null;\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../constants.cjs`),t=require(`./_handlers/analyze-support.cjs`),n=require(`./_utils.cjs`),r=require(`./_handlers/estimate-native-fee.cjs`),i=require(`./_handlers/get-assets.cjs`),a=require(`./_handlers/get-minimum-transfer-amount.cjs`),o=require(`./_handlers/stream-quotes.cjs`),s=require(`./constants.cjs`),c=require(`./_handlers/track-transfer.cjs`),l=require(`./_handlers/transfer-asset.cjs`);async function u({apiBaseUrl:u,apiToken:d,appId:f,environment:p,evmSigner:m,fetch:h,solanaSigner:g}){let _={apiBaseUrl:new URL(u??s.DEFAULT_MARKR_API_URL),apiToken:d,fetch:h},[v,y]=await Promise.all([n.getPartnerFeeBps(_),n.getSupportedChains(_)]),b=await n.getSupportedTokens(_,y),x=t.analyzeSupportFactory({hasSolanaSigner:!!g,supportedChains:y});return{analyzeSupport:x,estimateNativeFee:r.estimateNativeFeeFactory({apiOptions:_,appId:f}),getAssets:i.getAssetsFactory({supportedChains:y,supportedTokens:b}),getMinimumTransferAmount:a.getMinimumTransferAmountFactory({analyzeSupport:x,partnerFeeBps:v}),getSupportedChains:async()=>{let e=new Map,t=Array.from(y.entries()).filter(([,e])=>e.crossChainSwapEnabled).map(([e])=>e);for(let[n,{crossChainSwapEnabled:r,swapEnabled:i}]of y.entries()){if(!r&&!i)continue;let a=new Set;if(i&&a.add(n),r)for(let e of t)e!==n&&a.add(e);e.set(n,a)}return e},streamQuotes:o.streamQuotesFactory({apiOptions:_,appId:f,partnerFeeBps:v}),trackTransfer:c.trackTransferFactory({apiOptions:_}),transferAsset:l.transferAssetFactory({apiOptions:_,appId:f,environment:p,evmSigner:m,solanaSigner:g}),type:e.ServiceType.MARKR}}exports.createMarkrService=u;
1
+ const e=require(`../../constants.cjs`),t=require(`./_handlers/analyze-support.cjs`),n=require(`./_utils.cjs`),r=require(`./_handlers/estimate-native-fee.cjs`),i=require(`./_handlers/get-assets.cjs`),a=require(`./_handlers/get-minimum-transfer-amount.cjs`),o=require(`./_handlers/stream-quotes.cjs`),s=require(`./constants.cjs`),c=require(`./_handlers/track-transfer.cjs`),l=require(`./_handlers/transfer-asset.cjs`);async function u({apiBaseUrl:u,apiToken:d,appId:f,environment:p,evmSigner:m,fetch:h,solanaSigner:g}){let _={apiBaseUrl:new URL(u??s.DEFAULT_MARKR_API_URL),apiToken:d,fetch:h},[v,y]=await Promise.all([n.getPartnerFeeBps(_),n.getSupportedChains(_)]),b=await n.getSupportedTokens(_,y),x=t.analyzeSupportFactory({hasSolanaSigner:!!g,supportedChains:y});return{analyzeSupport:x,estimateNativeFee:r.estimateNativeFeeFactory({apiOptions:_,appId:f}),getAssets:i.getAssetsFactory({supportedChains:y,supportedTokens:b}),getMinimumTransferAmount:a.getMinimumTransferAmountFactory({analyzeSupport:x,partnerFeeBps:v}),getSupportedChains:async()=>{let e=new Map;for(let[t,{crossChainTargetChainIds:n,swapEnabled:r}]of y.entries()){if(!r&&n.size===0)continue;let i=new Set;r&&i.add(t);for(let e of n)e!==t&&y.has(e)&&i.add(e);i.size>0&&e.set(t,i)}return e},streamQuotes:o.streamQuotesFactory({apiOptions:_,appId:f,partnerFeeBps:v}),trackTransfer:c.trackTransferFactory({apiOptions:_}),transferAsset:l.transferAssetFactory({apiOptions:_,appId:f,environment:p,evmSigner:m,solanaSigner:g}),type:e.ServiceType.MARKR}}exports.createMarkrService=u;
2
2
  //# sourceMappingURL=markr-service.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markr-service.cjs","names":["DEFAULT_MARKR_API_URL","getPartnerFeeBps","getSupportedChains","getSupportedTokens","analyzeSupportFactory","estimateNativeFeeFactory","getAssetsFactory","getMinimumTransferAmountFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { EvmSigner, SolanaSigner } from '../../types/signer';\nimport type { MutableGetSupportedChainsResult, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getPartnerFeeBps, getSupportedChains, getSupportedTokens } from './_utils';\nimport { DEFAULT_MARKR_API_URL } from './constants';\nimport type { ApiOptions } from './_api';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface MarkrServiceOptions {\n apiBaseUrl?: string;\n apiToken?: string;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n fetch?: Fetch;\n solanaSigner?: SolanaSigner;\n}\n\nexport async function createMarkrService({\n apiBaseUrl: apiBaseUrlString,\n apiToken,\n appId,\n environment,\n evmSigner,\n fetch: customFetch,\n solanaSigner,\n}: MarkrServiceOptions): Promise<TransferService> {\n const apiBaseUrl = new URL(apiBaseUrlString ?? DEFAULT_MARKR_API_URL);\n\n const apiOptions: ApiOptions = {\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n };\n\n // Parallelize fetching.\n const [partnerFeeBps, supportedChains] = await Promise.all([\n getPartnerFeeBps(apiOptions),\n getSupportedChains(apiOptions),\n ]);\n\n const supportedTokens = await getSupportedTokens(apiOptions, supportedChains);\n\n const hasSolanaSigner = Boolean(solanaSigner);\n const analyzeSupport = analyzeSupportFactory({ hasSolanaSigner, supportedChains });\n\n return {\n analyzeSupport,\n estimateNativeFee: estimateNativeFeeFactory({ apiOptions, appId }),\n getAssets: getAssetsFactory({ supportedChains, supportedTokens }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n }),\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n const crossChainSwapEnabledChainIds: readonly Caip2ChainId[] = Array.from(supportedChains.entries())\n .filter(([, info]) => info.crossChainSwapEnabled)\n .map(([chainId]) => chainId);\n\n for (const [sourceChainId, { crossChainSwapEnabled, swapEnabled }] of supportedChains.entries()) {\n if (!crossChainSwapEnabled && !swapEnabled) {\n // If neither swap nor cross-chain swap is enabled, skip this chain as a source.\n continue;\n }\n\n const supportedTargetChainIds = new Set<Caip2ChainId>();\n\n // Add self as supported target if same-chain swap is enabled.\n if (swapEnabled) {\n supportedTargetChainIds.add(sourceChainId);\n }\n\n if (crossChainSwapEnabled) {\n for (const chainId of crossChainSwapEnabledChainIds) {\n if (chainId !== sourceChainId) {\n supportedTargetChainIds.add(chainId);\n }\n }\n }\n\n supportedChainsMap.set(sourceChainId, supportedTargetChainIds);\n }\n\n return supportedChainsMap;\n },\n streamQuotes: streamQuotesFactory({ apiOptions, appId, partnerFeeBps }),\n trackTransfer: trackTransferFactory({ apiOptions }),\n transferAsset: transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n }),\n type: ServiceType.MARKR,\n } satisfies TransferService;\n}\n"],"mappings":"gaA2BA,eAAsB,EAAmB,CACvC,WAAY,EACZ,WACA,QACA,cACA,YACA,MAAO,EACP,gBACgD,CAGhD,IAAM,EAAyB,CAC7B,WAHiB,IAAI,IAAI,GAAoBA,EAAAA,sBAAsB,CAInE,WACA,MAAO,EACR,CAGK,CAAC,EAAe,GAAmB,MAAM,QAAQ,IAAI,CACzDC,EAAAA,iBAAiB,EAAW,CAC5BC,EAAAA,mBAAmB,EAAW,CAC/B,CAAC,CAEI,EAAkB,MAAMC,EAAAA,mBAAmB,EAAY,EAAgB,CAGvE,EAAiBC,EAAAA,sBAAsB,CAAE,gBADvB,EAAQ,EACgC,kBAAiB,CAAC,CAElF,MAAO,CACL,iBACA,kBAAmBC,EAAAA,yBAAyB,CAAE,aAAY,QAAO,CAAC,CAClE,UAAWC,EAAAA,iBAAiB,CAAE,kBAAiB,kBAAiB,CAAC,CACjE,yBAA0BC,EAAAA,gCAAgC,CACxD,iBACA,gBACD,CAAC,CACF,mBAAoB,SAAY,CAC9B,IAAM,EAAsD,IAAI,IAC1D,EAAyD,MAAM,KAAK,EAAgB,SAAS,CAAC,CACjG,QAAQ,EAAG,KAAU,EAAK,sBAAsB,CAChD,KAAK,CAAC,KAAa,EAAQ,CAE9B,IAAK,GAAM,CAAC,EAAe,CAAE,wBAAuB,kBAAkB,EAAgB,SAAS,CAAE,CAC/F,GAAI,CAAC,GAAyB,CAAC,EAE7B,SAGF,IAAM,EAA0B,IAAI,IAOpC,GAJI,GACF,EAAwB,IAAI,EAAc,CAGxC,MACG,IAAM,KAAW,EAChB,IAAY,GACd,EAAwB,IAAI,EAAQ,CAK1C,EAAmB,IAAI,EAAe,EAAwB,CAGhE,OAAO,GAET,aAAcC,EAAAA,oBAAoB,CAAE,aAAY,QAAO,gBAAe,CAAC,CACvE,cAAeC,EAAAA,qBAAqB,CAAE,aAAY,CAAC,CACnD,cAAeC,EAAAA,qBAAqB,CAClC,aACA,QACA,cACA,YACA,eACD,CAAC,CACF,KAAMC,EAAAA,YAAY,MACnB"}
1
+ {"version":3,"file":"markr-service.cjs","names":["DEFAULT_MARKR_API_URL","getPartnerFeeBps","getSupportedChains","getSupportedTokens","analyzeSupportFactory","estimateNativeFeeFactory","getAssetsFactory","getMinimumTransferAmountFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { EvmSigner, SolanaSigner } from '../../types/signer';\nimport type { MutableGetSupportedChainsResult, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getPartnerFeeBps, getSupportedChains, getSupportedTokens } from './_utils';\nimport { DEFAULT_MARKR_API_URL } from './constants';\nimport type { ApiOptions } from './_api';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface MarkrServiceOptions {\n apiBaseUrl?: string;\n apiToken?: string;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n fetch?: Fetch;\n solanaSigner?: SolanaSigner;\n}\n\nexport async function createMarkrService({\n apiBaseUrl: apiBaseUrlString,\n apiToken,\n appId,\n environment,\n evmSigner,\n fetch: customFetch,\n solanaSigner,\n}: MarkrServiceOptions): Promise<TransferService> {\n const apiBaseUrl = new URL(apiBaseUrlString ?? DEFAULT_MARKR_API_URL);\n\n const apiOptions: ApiOptions = {\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n };\n\n // Parallelize fetching.\n const [partnerFeeBps, supportedChains] = await Promise.all([\n getPartnerFeeBps(apiOptions),\n getSupportedChains(apiOptions),\n ]);\n\n const supportedTokens = await getSupportedTokens(apiOptions, supportedChains);\n\n const hasSolanaSigner = Boolean(solanaSigner);\n const analyzeSupport = analyzeSupportFactory({ hasSolanaSigner, supportedChains });\n\n return {\n analyzeSupport,\n estimateNativeFee: estimateNativeFeeFactory({ apiOptions, appId }),\n getAssets: getAssetsFactory({ supportedChains, supportedTokens }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n }),\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n for (const [sourceChainId, { crossChainTargetChainIds, swapEnabled }] of supportedChains.entries()) {\n if (!swapEnabled && crossChainTargetChainIds.size === 0) {\n // If neither swap nor cross-chain swap is enabled, skip this chain as a source.\n continue;\n }\n\n const supportedTargetChainIds = new Set<Caip2ChainId>();\n\n // Add self as supported target if same-chain swap is enabled.\n if (swapEnabled) {\n supportedTargetChainIds.add(sourceChainId);\n }\n\n for (const chainId of crossChainTargetChainIds) {\n if (chainId !== sourceChainId && supportedChains.has(chainId)) {\n supportedTargetChainIds.add(chainId);\n }\n }\n\n if (supportedTargetChainIds.size > 0) {\n supportedChainsMap.set(sourceChainId, supportedTargetChainIds);\n }\n }\n\n return supportedChainsMap;\n },\n streamQuotes: streamQuotesFactory({ apiOptions, appId, partnerFeeBps }),\n trackTransfer: trackTransferFactory({ apiOptions }),\n transferAsset: transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n }),\n type: ServiceType.MARKR,\n } satisfies TransferService;\n}\n"],"mappings":"gaA2BA,eAAsB,EAAmB,CACvC,WAAY,EACZ,WACA,QACA,cACA,YACA,MAAO,EACP,gBACgD,CAGhD,IAAM,EAAyB,CAC7B,WAHiB,IAAI,IAAI,GAAoBA,EAAAA,sBAAsB,CAInE,WACA,MAAO,EACR,CAGK,CAAC,EAAe,GAAmB,MAAM,QAAQ,IAAI,CACzDC,EAAAA,iBAAiB,EAAW,CAC5BC,EAAAA,mBAAmB,EAAW,CAC/B,CAAC,CAEI,EAAkB,MAAMC,EAAAA,mBAAmB,EAAY,EAAgB,CAGvE,EAAiBC,EAAAA,sBAAsB,CAAE,gBADvB,EAAQ,EACgC,kBAAiB,CAAC,CAElF,MAAO,CACL,iBACA,kBAAmBC,EAAAA,yBAAyB,CAAE,aAAY,QAAO,CAAC,CAClE,UAAWC,EAAAA,iBAAiB,CAAE,kBAAiB,kBAAiB,CAAC,CACjE,yBAA0BC,EAAAA,gCAAgC,CACxD,iBACA,gBACD,CAAC,CACF,mBAAoB,SAAY,CAC9B,IAAM,EAAsD,IAAI,IAEhE,IAAK,GAAM,CAAC,EAAe,CAAE,2BAA0B,kBAAkB,EAAgB,SAAS,CAAE,CAClG,GAAI,CAAC,GAAe,EAAyB,OAAS,EAEpD,SAGF,IAAM,EAA0B,IAAI,IAGhC,GACF,EAAwB,IAAI,EAAc,CAG5C,IAAK,IAAM,KAAW,EAChB,IAAY,GAAiB,EAAgB,IAAI,EAAQ,EAC3D,EAAwB,IAAI,EAAQ,CAIpC,EAAwB,KAAO,GACjC,EAAmB,IAAI,EAAe,EAAwB,CAIlE,OAAO,GAET,aAAcC,EAAAA,oBAAoB,CAAE,aAAY,QAAO,gBAAe,CAAC,CACvE,cAAeC,EAAAA,qBAAqB,CAAE,aAAY,CAAC,CACnD,cAAeC,EAAAA,qBAAqB,CAClC,aACA,QACA,cACA,YACA,eACD,CAAC,CACF,KAAMC,EAAAA,YAAY,MACnB"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e}from"../../constants.js";import{analyzeSupportFactory as t}from"./_handlers/analyze-support.js";import{getPartnerFeeBps as n,getSupportedChains as r,getSupportedTokens as i}from"./_utils.js";import{estimateNativeFeeFactory as a}from"./_handlers/estimate-native-fee.js";import{getAssetsFactory as o}from"./_handlers/get-assets.js";import{getMinimumTransferAmountFactory as s}from"./_handlers/get-minimum-transfer-amount.js";import{streamQuotesFactory as c}from"./_handlers/stream-quotes.js";import{DEFAULT_MARKR_API_URL as l}from"./constants.js";import{trackTransferFactory as u}from"./_handlers/track-transfer.js";import{transferAssetFactory as d}from"./_handlers/transfer-asset.js";async function f({apiBaseUrl:f,apiToken:p,appId:m,environment:h,evmSigner:g,fetch:_,solanaSigner:v}){let y={apiBaseUrl:new URL(f??l),apiToken:p,fetch:_},[b,x]=await Promise.all([n(y),r(y)]),S=await i(y,x),C=t({hasSolanaSigner:!!v,supportedChains:x});return{analyzeSupport:C,estimateNativeFee:a({apiOptions:y,appId:m}),getAssets:o({supportedChains:x,supportedTokens:S}),getMinimumTransferAmount:s({analyzeSupport:C,partnerFeeBps:b}),getSupportedChains:async()=>{let e=new Map,t=Array.from(x.entries()).filter(([,e])=>e.crossChainSwapEnabled).map(([e])=>e);for(let[n,{crossChainSwapEnabled:r,swapEnabled:i}]of x.entries()){if(!r&&!i)continue;let a=new Set;if(i&&a.add(n),r)for(let e of t)e!==n&&a.add(e);e.set(n,a)}return e},streamQuotes:c({apiOptions:y,appId:m,partnerFeeBps:b}),trackTransfer:u({apiOptions:y}),transferAsset:d({apiOptions:y,appId:m,environment:h,evmSigner:g,solanaSigner:v}),type:e.MARKR}}export{f as createMarkrService};
1
+ import{ServiceType as e}from"../../constants.js";import{analyzeSupportFactory as t}from"./_handlers/analyze-support.js";import{getPartnerFeeBps as n,getSupportedChains as r,getSupportedTokens as i}from"./_utils.js";import{estimateNativeFeeFactory as a}from"./_handlers/estimate-native-fee.js";import{getAssetsFactory as o}from"./_handlers/get-assets.js";import{getMinimumTransferAmountFactory as s}from"./_handlers/get-minimum-transfer-amount.js";import{streamQuotesFactory as c}from"./_handlers/stream-quotes.js";import{DEFAULT_MARKR_API_URL as l}from"./constants.js";import{trackTransferFactory as u}from"./_handlers/track-transfer.js";import{transferAssetFactory as d}from"./_handlers/transfer-asset.js";async function f({apiBaseUrl:f,apiToken:p,appId:m,environment:h,evmSigner:g,fetch:_,solanaSigner:v}){let y={apiBaseUrl:new URL(f??l),apiToken:p,fetch:_},[b,x]=await Promise.all([n(y),r(y)]),S=await i(y,x),C=t({hasSolanaSigner:!!v,supportedChains:x});return{analyzeSupport:C,estimateNativeFee:a({apiOptions:y,appId:m}),getAssets:o({supportedChains:x,supportedTokens:S}),getMinimumTransferAmount:s({analyzeSupport:C,partnerFeeBps:b}),getSupportedChains:async()=>{let e=new Map;for(let[t,{crossChainTargetChainIds:n,swapEnabled:r}]of x.entries()){if(!r&&n.size===0)continue;let i=new Set;r&&i.add(t);for(let e of n)e!==t&&x.has(e)&&i.add(e);i.size>0&&e.set(t,i)}return e},streamQuotes:c({apiOptions:y,appId:m,partnerFeeBps:b}),trackTransfer:u({apiOptions:y}),transferAsset:d({apiOptions:y,appId:m,environment:h,evmSigner:g,solanaSigner:v}),type:e.MARKR}}export{f as createMarkrService};
2
2
  //# sourceMappingURL=markr-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markr-service.js","names":[],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { EvmSigner, SolanaSigner } from '../../types/signer';\nimport type { MutableGetSupportedChainsResult, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getPartnerFeeBps, getSupportedChains, getSupportedTokens } from './_utils';\nimport { DEFAULT_MARKR_API_URL } from './constants';\nimport type { ApiOptions } from './_api';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface MarkrServiceOptions {\n apiBaseUrl?: string;\n apiToken?: string;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n fetch?: Fetch;\n solanaSigner?: SolanaSigner;\n}\n\nexport async function createMarkrService({\n apiBaseUrl: apiBaseUrlString,\n apiToken,\n appId,\n environment,\n evmSigner,\n fetch: customFetch,\n solanaSigner,\n}: MarkrServiceOptions): Promise<TransferService> {\n const apiBaseUrl = new URL(apiBaseUrlString ?? DEFAULT_MARKR_API_URL);\n\n const apiOptions: ApiOptions = {\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n };\n\n // Parallelize fetching.\n const [partnerFeeBps, supportedChains] = await Promise.all([\n getPartnerFeeBps(apiOptions),\n getSupportedChains(apiOptions),\n ]);\n\n const supportedTokens = await getSupportedTokens(apiOptions, supportedChains);\n\n const hasSolanaSigner = Boolean(solanaSigner);\n const analyzeSupport = analyzeSupportFactory({ hasSolanaSigner, supportedChains });\n\n return {\n analyzeSupport,\n estimateNativeFee: estimateNativeFeeFactory({ apiOptions, appId }),\n getAssets: getAssetsFactory({ supportedChains, supportedTokens }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n }),\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n const crossChainSwapEnabledChainIds: readonly Caip2ChainId[] = Array.from(supportedChains.entries())\n .filter(([, info]) => info.crossChainSwapEnabled)\n .map(([chainId]) => chainId);\n\n for (const [sourceChainId, { crossChainSwapEnabled, swapEnabled }] of supportedChains.entries()) {\n if (!crossChainSwapEnabled && !swapEnabled) {\n // If neither swap nor cross-chain swap is enabled, skip this chain as a source.\n continue;\n }\n\n const supportedTargetChainIds = new Set<Caip2ChainId>();\n\n // Add self as supported target if same-chain swap is enabled.\n if (swapEnabled) {\n supportedTargetChainIds.add(sourceChainId);\n }\n\n if (crossChainSwapEnabled) {\n for (const chainId of crossChainSwapEnabledChainIds) {\n if (chainId !== sourceChainId) {\n supportedTargetChainIds.add(chainId);\n }\n }\n }\n\n supportedChainsMap.set(sourceChainId, supportedTargetChainIds);\n }\n\n return supportedChainsMap;\n },\n streamQuotes: streamQuotesFactory({ apiOptions, appId, partnerFeeBps }),\n trackTransfer: trackTransferFactory({ apiOptions }),\n transferAsset: transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n }),\n type: ServiceType.MARKR,\n } satisfies TransferService;\n}\n"],"mappings":"msBA2BA,eAAsB,EAAmB,CACvC,WAAY,EACZ,WACA,QACA,cACA,YACA,MAAO,EACP,gBACgD,CAGhD,IAAM,EAAyB,CAC7B,WAHiB,IAAI,IAAI,GAAoB,EAAsB,CAInE,WACA,MAAO,EACR,CAGK,CAAC,EAAe,GAAmB,MAAM,QAAQ,IAAI,CACzD,EAAiB,EAAW,CAC5B,EAAmB,EAAW,CAC/B,CAAC,CAEI,EAAkB,MAAM,EAAmB,EAAY,EAAgB,CAGvE,EAAiB,EAAsB,CAAE,gBADvB,EAAQ,EACgC,kBAAiB,CAAC,CAElF,MAAO,CACL,iBACA,kBAAmB,EAAyB,CAAE,aAAY,QAAO,CAAC,CAClE,UAAW,EAAiB,CAAE,kBAAiB,kBAAiB,CAAC,CACjE,yBAA0B,EAAgC,CACxD,iBACA,gBACD,CAAC,CACF,mBAAoB,SAAY,CAC9B,IAAM,EAAsD,IAAI,IAC1D,EAAyD,MAAM,KAAK,EAAgB,SAAS,CAAC,CACjG,QAAQ,EAAG,KAAU,EAAK,sBAAsB,CAChD,KAAK,CAAC,KAAa,EAAQ,CAE9B,IAAK,GAAM,CAAC,EAAe,CAAE,wBAAuB,kBAAkB,EAAgB,SAAS,CAAE,CAC/F,GAAI,CAAC,GAAyB,CAAC,EAE7B,SAGF,IAAM,EAA0B,IAAI,IAOpC,GAJI,GACF,EAAwB,IAAI,EAAc,CAGxC,MACG,IAAM,KAAW,EAChB,IAAY,GACd,EAAwB,IAAI,EAAQ,CAK1C,EAAmB,IAAI,EAAe,EAAwB,CAGhE,OAAO,GAET,aAAc,EAAoB,CAAE,aAAY,QAAO,gBAAe,CAAC,CACvE,cAAe,EAAqB,CAAE,aAAY,CAAC,CACnD,cAAe,EAAqB,CAClC,aACA,QACA,cACA,YACA,eACD,CAAC,CACF,KAAM,EAAY,MACnB"}
1
+ {"version":3,"file":"markr-service.js","names":[],"sources":["../../../src/transfer-service/markr/markr-service.ts"],"sourcesContent":["import { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport type { EvmSigner, SolanaSigner } from '../../types/signer';\nimport type { MutableGetSupportedChainsResult, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { getAssetsFactory } from './_handlers/get-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { getPartnerFeeBps, getSupportedChains, getSupportedTokens } from './_utils';\nimport { DEFAULT_MARKR_API_URL } from './constants';\nimport type { ApiOptions } from './_api';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface MarkrServiceOptions {\n apiBaseUrl?: string;\n apiToken?: string;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n fetch?: Fetch;\n solanaSigner?: SolanaSigner;\n}\n\nexport async function createMarkrService({\n apiBaseUrl: apiBaseUrlString,\n apiToken,\n appId,\n environment,\n evmSigner,\n fetch: customFetch,\n solanaSigner,\n}: MarkrServiceOptions): Promise<TransferService> {\n const apiBaseUrl = new URL(apiBaseUrlString ?? DEFAULT_MARKR_API_URL);\n\n const apiOptions: ApiOptions = {\n apiBaseUrl,\n apiToken,\n fetch: customFetch,\n };\n\n // Parallelize fetching.\n const [partnerFeeBps, supportedChains] = await Promise.all([\n getPartnerFeeBps(apiOptions),\n getSupportedChains(apiOptions),\n ]);\n\n const supportedTokens = await getSupportedTokens(apiOptions, supportedChains);\n\n const hasSolanaSigner = Boolean(solanaSigner);\n const analyzeSupport = analyzeSupportFactory({ hasSolanaSigner, supportedChains });\n\n return {\n analyzeSupport,\n estimateNativeFee: estimateNativeFeeFactory({ apiOptions, appId }),\n getAssets: getAssetsFactory({ supportedChains, supportedTokens }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n }),\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n for (const [sourceChainId, { crossChainTargetChainIds, swapEnabled }] of supportedChains.entries()) {\n if (!swapEnabled && crossChainTargetChainIds.size === 0) {\n // If neither swap nor cross-chain swap is enabled, skip this chain as a source.\n continue;\n }\n\n const supportedTargetChainIds = new Set<Caip2ChainId>();\n\n // Add self as supported target if same-chain swap is enabled.\n if (swapEnabled) {\n supportedTargetChainIds.add(sourceChainId);\n }\n\n for (const chainId of crossChainTargetChainIds) {\n if (chainId !== sourceChainId && supportedChains.has(chainId)) {\n supportedTargetChainIds.add(chainId);\n }\n }\n\n if (supportedTargetChainIds.size > 0) {\n supportedChainsMap.set(sourceChainId, supportedTargetChainIds);\n }\n }\n\n return supportedChainsMap;\n },\n streamQuotes: streamQuotesFactory({ apiOptions, appId, partnerFeeBps }),\n trackTransfer: trackTransferFactory({ apiOptions }),\n transferAsset: transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n }),\n type: ServiceType.MARKR,\n } satisfies TransferService;\n}\n"],"mappings":"msBA2BA,eAAsB,EAAmB,CACvC,WAAY,EACZ,WACA,QACA,cACA,YACA,MAAO,EACP,gBACgD,CAGhD,IAAM,EAAyB,CAC7B,WAHiB,IAAI,IAAI,GAAoB,EAAsB,CAInE,WACA,MAAO,EACR,CAGK,CAAC,EAAe,GAAmB,MAAM,QAAQ,IAAI,CACzD,EAAiB,EAAW,CAC5B,EAAmB,EAAW,CAC/B,CAAC,CAEI,EAAkB,MAAM,EAAmB,EAAY,EAAgB,CAGvE,EAAiB,EAAsB,CAAE,gBADvB,EAAQ,EACgC,kBAAiB,CAAC,CAElF,MAAO,CACL,iBACA,kBAAmB,EAAyB,CAAE,aAAY,QAAO,CAAC,CAClE,UAAW,EAAiB,CAAE,kBAAiB,kBAAiB,CAAC,CACjE,yBAA0B,EAAgC,CACxD,iBACA,gBACD,CAAC,CACF,mBAAoB,SAAY,CAC9B,IAAM,EAAsD,IAAI,IAEhE,IAAK,GAAM,CAAC,EAAe,CAAE,2BAA0B,kBAAkB,EAAgB,SAAS,CAAE,CAClG,GAAI,CAAC,GAAe,EAAyB,OAAS,EAEpD,SAGF,IAAM,EAA0B,IAAI,IAGhC,GACF,EAAwB,IAAI,EAAc,CAG5C,IAAK,IAAM,KAAW,EAChB,IAAY,GAAiB,EAAgB,IAAI,EAAQ,EAC3D,EAAwB,IAAI,EAAQ,CAIpC,EAAwB,KAAO,GACjC,EAAmB,IAAI,EAAe,EAAwB,CAIlE,OAAO,GAET,aAAc,EAAoB,CAAE,aAAY,QAAO,gBAAe,CAAC,CACvE,cAAe,EAAqB,CAAE,aAAY,CAAC,CACnD,cAAe,EAAqB,CAClC,aACA,QACA,cACA,YACA,eACD,CAAC,CACF,KAAM,EAAY,MACnB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@avalabs/fusion-sdk",
3
3
  "license": "Limited Ecosystem License",
4
- "version": "0.2.0",
4
+ "version": "0.4.0",
5
5
  "type": "module",
6
6
  "main": "./dist/mod.cjs",
7
7
  "module": "./dist/mod.js",