@avalabs/fusion-sdk 0.15.1 → 0.17.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 (169) hide show
  1. package/dist/constants.cjs +1 -1
  2. package/dist/constants.cjs.map +1 -1
  3. package/dist/constants.d.cts +21 -1
  4. package/dist/constants.d.ts +21 -1
  5. package/dist/constants.js +1 -1
  6. package/dist/constants.js.map +1 -1
  7. package/dist/errors.cjs +1 -1
  8. package/dist/errors.cjs.map +1 -1
  9. package/dist/errors.js +1 -1
  10. package/dist/errors.js.map +1 -1
  11. package/dist/mod.cjs +1 -1
  12. package/dist/mod.d.cts +7 -5
  13. package/dist/mod.d.ts +7 -5
  14. package/dist/mod.js +1 -1
  15. package/dist/quoter/quoter.cjs +1 -1
  16. package/dist/quoter/quoter.cjs.map +1 -1
  17. package/dist/quoter/quoter.js +1 -1
  18. package/dist/quoter/quoter.js.map +1 -1
  19. package/dist/transfer-manager.cjs +1 -1
  20. package/dist/transfer-manager.cjs.map +1 -1
  21. package/dist/transfer-manager.js +1 -1
  22. package/dist/transfer-manager.js.map +1 -1
  23. package/dist/transfer-service/_evm-gas.cjs +1 -1
  24. package/dist/transfer-service/_evm-gas.js +1 -1
  25. package/dist/transfer-service/_utils.cjs +1 -1
  26. package/dist/transfer-service/_utils.cjs.map +1 -1
  27. package/dist/transfer-service/_utils.js +1 -1
  28. package/dist/transfer-service/_utils.js.map +1 -1
  29. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs +2 -0
  30. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs.map +1 -0
  31. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js +2 -0
  32. package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js.map +1 -0
  33. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs +2 -0
  34. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs.map +1 -0
  35. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js +2 -0
  36. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js.map +1 -0
  37. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs +2 -0
  38. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs.map +1 -0
  39. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js +2 -0
  40. package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js.map +1 -0
  41. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs +2 -0
  42. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  43. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js +2 -0
  44. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js.map +1 -0
  45. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs +2 -0
  46. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs.map +1 -0
  47. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js +2 -0
  48. package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js.map +1 -0
  49. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs +2 -0
  50. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs.map +1 -0
  51. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js +2 -0
  52. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js.map +1 -0
  53. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs +2 -0
  54. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs.map +1 -0
  55. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js +2 -0
  56. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js.map +1 -0
  57. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +2 -0
  58. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs.map +1 -0
  59. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +2 -0
  60. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js.map +1 -0
  61. package/dist/transfer-service/avalanche-cct/_type-guards.cjs +2 -0
  62. package/dist/transfer-service/avalanche-cct/_type-guards.cjs.map +1 -0
  63. package/dist/transfer-service/avalanche-cct/_type-guards.js +2 -0
  64. package/dist/transfer-service/avalanche-cct/_type-guards.js.map +1 -0
  65. package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs +2 -0
  66. package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs.map +1 -0
  67. package/dist/transfer-service/avalanche-cct/_utils/addresses.js +2 -0
  68. package/dist/transfer-service/avalanche-cct/_utils/addresses.js.map +1 -0
  69. package/dist/transfer-service/avalanche-cct/_utils/fees.cjs +2 -0
  70. package/dist/transfer-service/avalanche-cct/_utils/fees.cjs.map +1 -0
  71. package/dist/transfer-service/avalanche-cct/_utils/fees.js +2 -0
  72. package/dist/transfer-service/avalanche-cct/_utils/fees.js.map +1 -0
  73. package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs +2 -0
  74. package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs.map +1 -0
  75. package/dist/transfer-service/avalanche-cct/_utils/p-chain.js +2 -0
  76. package/dist/transfer-service/avalanche-cct/_utils/p-chain.js.map +1 -0
  77. package/dist/transfer-service/avalanche-cct/_utils/polling.cjs +2 -0
  78. package/dist/transfer-service/avalanche-cct/_utils/polling.cjs.map +1 -0
  79. package/dist/transfer-service/avalanche-cct/_utils/polling.js +2 -0
  80. package/dist/transfer-service/avalanche-cct/_utils/polling.js.map +1 -0
  81. package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs +2 -0
  82. package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs.map +1 -0
  83. package/dist/transfer-service/avalanche-cct/_utils/transactions.js +2 -0
  84. package/dist/transfer-service/avalanche-cct/_utils/transactions.js.map +1 -0
  85. package/dist/transfer-service/avalanche-cct/_utils.cjs +2 -0
  86. package/dist/transfer-service/avalanche-cct/_utils.cjs.map +1 -0
  87. package/dist/transfer-service/avalanche-cct/_utils.js +2 -0
  88. package/dist/transfer-service/avalanche-cct/_utils.js.map +1 -0
  89. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs +2 -0
  90. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs.map +1 -0
  91. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js +2 -0
  92. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js.map +1 -0
  93. package/dist/transfer-service/avalanche-cct/constants.cjs +2 -0
  94. package/dist/transfer-service/avalanche-cct/constants.cjs.map +1 -0
  95. package/dist/transfer-service/avalanche-cct/constants.js +2 -0
  96. package/dist/transfer-service/avalanche-cct/constants.js.map +1 -0
  97. package/dist/transfer-service/avalanche-cct/types.d.cts +33 -0
  98. package/dist/transfer-service/avalanche-cct/types.d.ts +33 -0
  99. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs +1 -1
  100. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs.map +1 -1
  101. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js +1 -1
  102. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js.map +1 -1
  103. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +1 -1
  104. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +1 -1
  105. package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +1 -1
  106. package/dist/transfer-service/avalanche-evm/_utils/wrap.js +1 -1
  107. package/dist/transfer-service/fetch-utilities.cjs +1 -1
  108. package/dist/transfer-service/fetch-utilities.cjs.map +1 -1
  109. package/dist/transfer-service/fetch-utilities.js +1 -1
  110. package/dist/transfer-service/fetch-utilities.js.map +1 -1
  111. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs +1 -1
  112. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs.map +1 -1
  113. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js +1 -1
  114. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js.map +1 -1
  115. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs +1 -1
  116. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs.map +1 -1
  117. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js +1 -1
  118. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js.map +1 -1
  119. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
  120. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
  121. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs +1 -1
  122. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs.map +1 -1
  123. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js +1 -1
  124. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js.map +1 -1
  125. package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
  126. package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
  127. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
  128. package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
  129. package/dist/transfer-service/markr/_schema.cjs +1 -1
  130. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  131. package/dist/transfer-service/markr/_schema.js +1 -1
  132. package/dist/transfer-service/markr/_schema.js.map +1 -1
  133. package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
  134. package/dist/transfer-service/markr/markr-service.js.map +1 -1
  135. package/dist/transfer-service/service-schemas.cjs +1 -1
  136. package/dist/transfer-service/service-schemas.cjs.map +1 -1
  137. package/dist/transfer-service/service-schemas.js +1 -1
  138. package/dist/transfer-service/service-schemas.js.map +1 -1
  139. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs +1 -1
  140. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs.map +1 -1
  141. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js +1 -1
  142. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js.map +1 -1
  143. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +1 -1
  144. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +1 -1
  145. package/dist/types/asset.d.cts +18 -2
  146. package/dist/types/asset.d.ts +18 -2
  147. package/dist/types/quote.d.cts +1 -1
  148. package/dist/types/quote.d.ts +1 -1
  149. package/dist/types/service.d.cts +95 -7
  150. package/dist/types/service.d.ts +95 -7
  151. package/dist/types/transfer-manager.d.cts +19 -10
  152. package/dist/types/transfer-manager.d.ts +19 -10
  153. package/dist/types/utility-types.d.cts +8 -1
  154. package/dist/types/utility-types.d.ts +8 -1
  155. package/dist/utils/asset-id.cjs +1 -1
  156. package/dist/utils/asset-id.cjs.map +1 -1
  157. package/dist/utils/asset-id.js +1 -1
  158. package/dist/utils/asset-id.js.map +1 -1
  159. package/dist/utils/bridgeable-assets.cjs +2 -0
  160. package/dist/utils/bridgeable-assets.cjs.map +1 -0
  161. package/dist/utils/bridgeable-assets.d.cts +16 -0
  162. package/dist/utils/bridgeable-assets.d.ts +16 -0
  163. package/dist/utils/bridgeable-assets.js +2 -0
  164. package/dist/utils/bridgeable-assets.js.map +1 -0
  165. package/dist/utils/transfer-utils.cjs +1 -1
  166. package/dist/utils/transfer-utils.cjs.map +1 -1
  167. package/dist/utils/transfer-utils.js +1 -1
  168. package/dist/utils/transfer-utils.js.map +1 -1
  169. package/package.json +5 -3
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`../../_utils.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../../../utils/solana.cjs`);let u=require(`viem`),d=require(`@solana/kit`);function f(t){return async(r,i)=>{if(n.isEvmNamespace(r.sourceChain.chainId))return await p(r,i,t);if(n.isSolanaNamespace(r.sourceChain.chainId))return await m(r,i,t);throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${r.sourceChain.chainId}`)}}async function p(n,l,{apiOptions:d,appId:f}){if(!(0,u.isAddress)(n.fromAddress))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${n.fromAddress}`);let p=r.getEvmClientForChain({chain:n.sourceChain}),m=s.assetToAddressString(n.assetIn,n.sourceChain.chainId);if(!(0,u.isAddress)(m))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let g=s.isTokenAddressNative(m),_=n.sourceChain.chainId.toLowerCase()!==n.targetChain.chainId.toLowerCase(),v=n.amountIn+s.getAdditiveSourceAssetFeeAmount(n),y=0n;if(!g){let r,{address:i}=await o.markrGetSpenderAddress(d,{chainId:t.caip2ToEip155ChainId(n.sourceChain.chainId),crossChainSwap:_,quoteId:n.id});try{r=await p.readContract({address:m,abi:u.erc20Abi,functionName:`allowance`,args:[n.fromAddress,i]})}catch(t){throw new e.SdkError(`Error during allowance check`,e.ErrorCode.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}r<v&&(y=await a.estimateGasWithRevert(p,{account:n.fromAddress,to:m,data:(0,u.encodeFunctionData)({abi:u.erc20Abi,functionName:`approve`,args:[i,v]})},u.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`))}let b=y>0n,x=s.calculateMarkrMinimumAmountOut({amountOut:n.amountOut,assetOut:n.assetOut,slippageBps:n.slippageBps}),S=await o.markrSwap(d,{amountIn:n.amountIn.toString(),appId:f,minAmountOut:x.toString(),tokenIn:m,tokenOut:s.assetToAddressString(n.assetOut,n.targetChain.chainId),uuid:n.id});if(!c.isEvmSwapResponse(S))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${S.chainType}.`});let C=0n;C=b?n.gasEstimate?n.gasEstimate:n.fees.filter(e=>e.type===`gas`&&e.chainId===n.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await h({crossChain:_,fromAddress:n.fromAddress,sourceClient:p,swap:S});let w=await i.estimateEvmFeesPerGas(p,n.sourceChain,l?.overrides?.feeRateTier),T=l?.overrides?.maxFeePerGas??w.maxFeePerGas,E=l?.overrides?.maxPriorityFeePerGas??w.maxPriorityFeePerGas,D=(C+y)*T;return{asset:n.sourceChain.networkToken,totalFee:r.applyFeeUnitsBpsMargin(D,l?.feeUnitsMarginBps),totalFeeWithoutMargin:D,meta:{approvalFee:b?y*T:void 0,maxFeePerGas:T,maxPriorityFeePerGas:E}}}async function m(t,n,{apiOptions:i,appId:a}){let u=s.assetToAddressString(t.assetIn,t.sourceChain.chainId);if(!(0,d.isAddress)(u))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let f=s.getAdditiveSourceNativeAssetFeeAmount(t),p=t.amountIn+f,m=s.calculateMarkrMinimumAmountOut({amountOut:t.amountOut,assetOut:t.assetOut,slippageBps:t.slippageBps}),h=await o.markrSwap(i,{amountIn:t.amountIn.toString(),appId:a,minAmountOut:m.toString(),tokenIn:u,tokenOut:s.assetToAddressString(t.assetOut,t.targetChain.chainId),userPublicKey:t.fromAddress,uuid:t.id});if(!c.isSolanaSwapResponse(h))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:g,priorityFeeLamports:_,...v}=await l.estimateSolanaFee(r.getSolanaRpcForChain({chain:t.sourceChain}),h.swapTransaction),y=v.feePayerBalanceDiffLamports-p;return{asset:t.sourceChain.networkToken,totalFee:r.applyFeeUnitsBpsMargin(y,n?.feeUnitsMarginBps),totalFeeWithoutMargin:y,meta:{...v,baseFee:g,priorityFee:_}}}async function h({crossChain:e,feeUnitsMarginBps:t,fromAddress:n,sourceClient:i,swap:o}){let c=await s.getMarkrSwapWrapperAbi(e);return r.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(i,{account:n,to:o.to,data:o.data,value:o.value},c,`Failed to estimate gas for Markr swap transaction.`),t)}exports._estimateGasFromSwapResponse=h,exports.estimateNativeFeeFactory=f;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../../_evm-gas.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../../../utils/solana.cjs`);let u=require(`viem`),d=require(`@solana/kit`);function f(t){return async(n,i)=>{if(r.isEvmNamespace(n.sourceChain.chainId))return await p(n,i,t);if(r.isSolanaNamespace(n.sourceChain.chainId))return await m(n,i,t);throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${n.sourceChain.chainId}`)}}async function p(r,l,{apiOptions:d,appId:f}){if(!(0,u.isAddress)(r.fromAddress))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${r.fromAddress}`);let p=n.getEvmClientForChain({chain:r.sourceChain}),m=s.assetToAddressString(r.assetIn,r.sourceChain.chainId);if(!(0,u.isAddress)(m))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let g=s.isTokenAddressNative(m),_=r.sourceChain.chainId.toLowerCase()!==r.targetChain.chainId.toLowerCase(),v=r.amountIn+s.getAdditiveSourceAssetFeeAmount(r),y=0n;if(!g){let n,{address:i}=await o.markrGetSpenderAddress(d,{chainId:t.caip2ToEip155ChainId(r.sourceChain.chainId),crossChainSwap:_,quoteId:r.id});try{n=await p.readContract({address:m,abi:u.erc20Abi,functionName:`allowance`,args:[r.fromAddress,i]})}catch(t){throw new e.SdkError(`Error during allowance check`,e.ErrorCode.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}n<v&&(y=await a.estimateGasWithRevert(p,{account:r.fromAddress,to:m,data:(0,u.encodeFunctionData)({abi:u.erc20Abi,functionName:`approve`,args:[i,v]})},u.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`))}let b=y>0n,x=s.calculateMarkrMinimumAmountOut({amountOut:r.amountOut,assetOut:r.assetOut,slippageBps:r.slippageBps}),S=await o.markrSwap(d,{amountIn:r.amountIn.toString(),appId:f,minAmountOut:x.toString(),tokenIn:m,tokenOut:s.assetToAddressString(r.assetOut,r.targetChain.chainId),uuid:r.id});if(!c.isEvmSwapResponse(S))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${S.chainType}.`});let C=0n;C=b?r.gasEstimate?r.gasEstimate:r.fees.filter(e=>e.type===`gas`&&e.chainId===r.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await h({crossChain:_,fromAddress:r.fromAddress,sourceClient:p,swap:S});let w=await i.estimateEvmFeesPerGas(p,r.sourceChain,l?.overrides?.feeRateTier),T=l?.overrides?.maxFeePerGas??w.maxFeePerGas,E=l?.overrides?.maxPriorityFeePerGas??w.maxPriorityFeePerGas,D=(C+y)*T;return{asset:r.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(D,l?.feeUnitsMarginBps),totalFeeWithoutMargin:D,meta:{approvalFee:b?y*T:void 0,maxFeePerGas:T,maxPriorityFeePerGas:E}}}async function m(t,r,{apiOptions:i,appId:a}){let u=s.assetToAddressString(t.assetIn,t.sourceChain.chainId);if(!(0,d.isAddress)(u))throw new e.SdkError(e.ErrorReason.INVALID_PARAMS,e.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let f=s.getAdditiveSourceNativeAssetFeeAmount(t),p=t.amountIn+f,m=s.calculateMarkrMinimumAmountOut({amountOut:t.amountOut,assetOut:t.assetOut,slippageBps:t.slippageBps}),h=await o.markrSwap(i,{amountIn:t.amountIn.toString(),appId:a,minAmountOut:m.toString(),tokenIn:u,tokenOut:s.assetToAddressString(t.assetOut,t.targetChain.chainId),userPublicKey:t.fromAddress,uuid:t.id});if(!c.isSolanaSwapResponse(h))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:g,priorityFeeLamports:_,...v}=await l.estimateSolanaFee(n.getSolanaRpcForChain({chain:t.sourceChain}),h.swapTransaction),y=v.feePayerBalanceDiffLamports-p;return{asset:t.sourceChain.networkToken,totalFee:n.applyFeeUnitsBpsMargin(y,r?.feeUnitsMarginBps),totalFeeWithoutMargin:y,meta:{...v,baseFee:g,priorityFee:_}}}async function h({crossChain:e,feeUnitsMarginBps:t,fromAddress:r,sourceClient:i,swap:o}){let c=await s.getMarkrSwapWrapperAbi(e);return n.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(i,{account:r,to:o.to,data:o.data,value:o.value},c,`Failed to estimate gas for Markr swap transaction.`),t)}exports._estimateGasFromSwapResponse=h,exports.estimateNativeFeeFactory=f;
2
2
  //# sourceMappingURL=estimate-native-fee.cjs.map
@@ -1,2 +1,2 @@
1
- import{ErrorCode as e,ErrorReason as t,InvalidParamsError as n,SdkError as r}from"../../../errors.js";import{caip2ToEip155ChainId as i}from"../../../utils/caip.js";import{isEvmNamespace as a,isSolanaNamespace as o}from"../../../_utils/chain.js";import{applyFeeUnitsBpsMargin as s,getEvmClientForChain as c,getSolanaRpcForChain as l}from"../../_utils.js";import{estimateEvmFeesPerGas as u}from"../../_evm-gas.js";import{estimateGasWithRevert as d}from"../../_evm-errors.js";import{markrGetSpenderAddress as f,markrSwap as p}from"../_api.js";import{assetToAddressString as m,calculateMarkrMinimumAmountOut as h,getAdditiveSourceAssetFeeAmount as g,getAdditiveSourceNativeAssetFeeAmount as _,getMarkrSwapWrapperAbi as v,isTokenAddressNative as y}from"../_utils.js";import{isEvmSwapResponse as b,isSolanaSwapResponse as x}from"../_type-guards.js";import{estimateSolanaFee as S}from"../../../utils/solana.js";import{encodeFunctionData as C,erc20Abi as w,isAddress as T}from"viem";import{isAddress as E}from"@solana/kit";function D(e){return async(r,i)=>{if(a(r.sourceChain.chainId))return await O(r,i,e);if(o(r.sourceChain.chainId))return await k(r,i,e);throw new n(t.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${r.sourceChain.chainId}`)}}async function O(a,o,{apiOptions:l,appId:_}){if(!T(a.fromAddress))throw new n(t.INVALID_PARAMS,`Invalid fromAddress: ${a.fromAddress}`);let v=c({chain:a.sourceChain}),x=m(a.assetIn,a.sourceChain.chainId);if(!T(x))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let S=y(x),E=a.sourceChain.chainId.toLowerCase()!==a.targetChain.chainId.toLowerCase(),D=a.amountIn+g(a),O=0n;if(!S){let t,{address:n}=await f(l,{chainId:i(a.sourceChain.chainId),crossChainSwap:E,quoteId:a.id});try{t=await v.readContract({address:x,abi:w,functionName:`allowance`,args:[a.fromAddress,n]})}catch(t){throw new r(`Error during allowance check`,e.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}t<D&&(O=await d(v,{account:a.fromAddress,to:x,data:C({abi:w,functionName:`approve`,args:[n,D]})},w,`Failed to estimate gas for ERC20 approval transaction.`))}let k=O>0n,j=h({amountOut:a.amountOut,assetOut:a.assetOut,slippageBps:a.slippageBps}),M=await p(l,{amountIn:a.amountIn.toString(),appId:_,minAmountOut:j.toString(),tokenIn:x,tokenOut:m(a.assetOut,a.targetChain.chainId),uuid:a.id});if(!b(M))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${M.chainType}.`});let N=0n;N=k?a.gasEstimate?a.gasEstimate:a.fees.filter(e=>e.type===`gas`&&e.chainId===a.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await A({crossChain:E,fromAddress:a.fromAddress,sourceClient:v,swap:M});let P=await u(v,a.sourceChain,o?.overrides?.feeRateTier),F=o?.overrides?.maxFeePerGas??P.maxFeePerGas,I=o?.overrides?.maxPriorityFeePerGas??P.maxPriorityFeePerGas,L=(N+O)*F;return{asset:a.sourceChain.networkToken,totalFee:s(L,o?.feeUnitsMarginBps),totalFeeWithoutMargin:L,meta:{approvalFee:k?O*F:void 0,maxFeePerGas:F,maxPriorityFeePerGas:I}}}async function k(n,i,{apiOptions:a,appId:o}){let c=m(n.assetIn,n.sourceChain.chainId);if(!E(c))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let u=_(n),d=n.amountIn+u,f=h({amountOut:n.amountOut,assetOut:n.assetOut,slippageBps:n.slippageBps}),g=await p(a,{amountIn:n.amountIn.toString(),appId:o,minAmountOut:f.toString(),tokenIn:c,tokenOut:m(n.assetOut,n.targetChain.chainId),userPublicKey:n.fromAddress,uuid:n.id});if(!x(g))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:v,priorityFeeLamports:y,...b}=await S(l({chain:n.sourceChain}),g.swapTransaction),C=b.feePayerBalanceDiffLamports-d;return{asset:n.sourceChain.networkToken,totalFee:s(C,i?.feeUnitsMarginBps),totalFeeWithoutMargin:C,meta:{...b,baseFee:v,priorityFee:y}}}async function A({crossChain:e,feeUnitsMarginBps:t,fromAddress:n,sourceClient:r,swap:i}){let a=await v(e);return s(await d(r,{account:n,to:i.to,data:i.data,value:i.value},a,`Failed to estimate gas for Markr swap transaction.`),t)}export{A as _estimateGasFromSwapResponse,D as estimateNativeFeeFactory};
1
+ import{ErrorCode as e,ErrorReason as t,InvalidParamsError as n,SdkError as r}from"../../../errors.js";import{caip2ToEip155ChainId as i}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as a,getEvmClientForChain as o,getSolanaRpcForChain as s}from"../../_utils.js";import{isEvmNamespace as c,isSolanaNamespace as l}from"../../../_utils/chain.js";import{estimateEvmFeesPerGas as u}from"../../_evm-gas.js";import{estimateGasWithRevert as d}from"../../_evm-errors.js";import{markrGetSpenderAddress as f,markrSwap as p}from"../_api.js";import{assetToAddressString as m,calculateMarkrMinimumAmountOut as h,getAdditiveSourceAssetFeeAmount as g,getAdditiveSourceNativeAssetFeeAmount as _,getMarkrSwapWrapperAbi as v,isTokenAddressNative as y}from"../_utils.js";import{isEvmSwapResponse as b,isSolanaSwapResponse as x}from"../_type-guards.js";import{estimateSolanaFee as S}from"../../../utils/solana.js";import{encodeFunctionData as C,erc20Abi as w,isAddress as T}from"viem";import{isAddress as E}from"@solana/kit";function D(e){return async(r,i)=>{if(c(r.sourceChain.chainId))return await O(r,i,e);if(l(r.sourceChain.chainId))return await k(r,i,e);throw new n(t.INVALID_PARAMS,`Unsupported source chain namespace for estimateNativeFee: ${r.sourceChain.chainId}`)}}async function O(s,c,{apiOptions:l,appId:_}){if(!T(s.fromAddress))throw new n(t.INVALID_PARAMS,`Invalid fromAddress: ${s.fromAddress}`);let v=o({chain:s.sourceChain}),x=m(s.assetIn,s.sourceChain.chainId);if(!T(x))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address. Can not call estimateGas.`});let S=y(x),E=s.sourceChain.chainId.toLowerCase()!==s.targetChain.chainId.toLowerCase(),D=s.amountIn+g(s),O=0n;if(!S){let t,{address:n}=await f(l,{chainId:i(s.sourceChain.chainId),crossChainSwap:E,quoteId:s.id});try{t=await v.readContract({address:x,abi:w,functionName:`allowance`,args:[s.fromAddress,n]})}catch(t){throw new r(`Error during allowance check`,e.VIEM_ERROR,{cause:t,details:`Failed to read ERC20 allowance for Markr spender.`})}t<D&&(O=await d(v,{account:s.fromAddress,to:x,data:C({abi:w,functionName:`approve`,args:[n,D]})},w,`Failed to estimate gas for ERC20 approval transaction.`))}let k=O>0n,j=h({amountOut:s.amountOut,assetOut:s.assetOut,slippageBps:s.slippageBps}),M=await p(l,{amountIn:s.amountIn.toString(),appId:_,minAmountOut:j.toString(),tokenIn:x,tokenOut:m(s.assetOut,s.targetChain.chainId),uuid:s.id});if(!b(M))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${M.chainType}.`});let N=0n;N=k?s.gasEstimate?s.gasEstimate:s.fees.filter(e=>e.type===`gas`&&e.chainId===s.sourceChain.chainId).reduce((e,t)=>e+t.amount,0n)||700000n:await A({crossChain:E,fromAddress:s.fromAddress,sourceClient:v,swap:M});let P=await u(v,s.sourceChain,c?.overrides?.feeRateTier),F=c?.overrides?.maxFeePerGas??P.maxFeePerGas,I=c?.overrides?.maxPriorityFeePerGas??P.maxPriorityFeePerGas,L=(N+O)*F;return{asset:s.sourceChain.networkToken,totalFee:a(L,c?.feeUnitsMarginBps),totalFeeWithoutMargin:L,meta:{approvalFee:k?O*F:void 0,maxFeePerGas:F,maxPriorityFeePerGas:I}}}async function k(n,i,{apiOptions:o,appId:c}){let l=m(n.assetIn,n.sourceChain.chainId);if(!E(l))throw new r(t.INVALID_PARAMS,e.INVALID_PARAMS,{details:`assetIn address is not a valid Solana address. Can not call estimateGas.`});let u=_(n),d=n.amountIn+u,f=h({amountOut:n.amountOut,assetOut:n.assetOut,slippageBps:n.slippageBps}),g=await p(o,{amountIn:n.amountIn.toString(),appId:c,minAmountOut:f.toString(),tokenIn:l,tokenOut:m(n.assetOut,n.targetChain.chainId),userPublicKey:n.fromAddress,uuid:n.id});if(!x(g))throw new r(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.`});let{baseFeeLamports:v,priorityFeeLamports:y,...b}=await S(s({chain:n.sourceChain}),g.swapTransaction),C=b.feePayerBalanceDiffLamports-d;return{asset:n.sourceChain.networkToken,totalFee:a(C,i?.feeUnitsMarginBps),totalFeeWithoutMargin:C,meta:{...b,baseFee:v,priorityFee:y}}}async function A({crossChain:e,feeUnitsMarginBps:t,fromAddress:n,sourceClient:r,swap:i}){let o=await v(e);return a(await d(r,{account:n,to:i.to,data:i.data,value:i.value},o,`Failed to estimate gas for Markr swap transaction.`),t)}export{A as _estimateGasFromSwapResponse,D as estimateNativeFeeFactory};
2
2
  //# sourceMappingURL=estimate-native-fee.js.map
@@ -1,2 +1,2 @@
1
- const e=require(`../../../constants.cjs`),t=require(`../_utils.cjs`);function n({getTargetChainAssets:n,supportedChains:r}){return async({sourceChainId:i,targetChainId:a})=>t.isRouteSupported(r,i,a)?(await n(a)).map(t=>({...t,bridgeProviders:[e.ServiceType.MARKR]})):[]}exports.getBridgeableAssetsFactory=n;
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`),n=require(`../_utils.cjs`);function r({getTargetChainAssets:r,supportedChains:i}){return async({sourceChainId:a,targetChainId:o,search:s,limit:c,page:l})=>{let u=l??1;if(!n.isRouteSupported(i,a,o))return{assets:[],meta:{currentPage:u,hasMore:!1}};let d=await r({search:s,limit:c??100,page:u,targetChainId:o});return{assets:d.assets.map(n=>({...n,id:t.getAssetId(o,n),bridgeProviders:[e.ServiceType.MARKR]})),meta:d.meta}}}exports.getBridgeableAssetsFactory=r;
2
2
  //# sourceMappingURL=get-bridgeable-assets.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.cjs","names":["isRouteSupported","ServiceType"],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { Asset, BridgeableUiAsset } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { isRouteSupported, type SupportedChainsMap } from '../_utils';\n\nexport function getBridgeableAssetsFactory({\n getTargetChainAssets,\n supportedChains,\n}: {\n getTargetChainAssets: (targetChainId: Caip2ChainId) => Promise<readonly Asset[]>;\n supportedChains: SupportedChainsMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({ sourceChainId, targetChainId }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n if (!isRouteSupported(supportedChains, sourceChainId, targetChainId)) return [];\n\n const assets = await getTargetChainAssets(targetChainId);\n return assets.map((asset) => ({ ...asset, bridgeProviders: [ServiceType.MARKR] as const }));\n };\n}\n"],"mappings":"qEAMA,SAAgB,EAA2B,CACzC,uBACA,mBAIyC,CACzC,OAAO,MAAO,CAAE,gBAAe,mBACxBA,EAAAA,iBAAiB,EAAiB,EAAe,EAAc,EAErD,MAAM,EAAqB,EAAc,EAC1C,IAAK,IAAW,CAAE,GAAG,EAAO,gBAAiB,CAACC,EAAAA,YAAY,MAAM,CAAW,EAAE,CAHd,EAAE"}
1
+ {"version":3,"file":"get-bridgeable-assets.cjs","names":["isRouteSupported","getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { AssetWithExtras } from '../../../types/asset';\nimport type { AssetSearchQuery } from '../../../types/service';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { getAssetId } from '../../../utils/asset-id';\nimport { isRouteSupported, type SupportedChainsMap } from '../_utils';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nexport function getBridgeableAssetsFactory({\n getTargetChainAssets,\n supportedChains,\n}: {\n getTargetChainAssets: (queryProps: {\n search?: AssetSearchQuery;\n limit: number;\n page: number;\n targetChainId: Caip2ChainId;\n }) => Promise<{\n readonly assets: readonly AssetWithExtras[];\n readonly meta: { readonly currentPage: number; readonly hasMore: boolean; readonly nextPage?: number };\n }>;\n supportedChains: SupportedChainsMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceChainId,\n targetChainId,\n search,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (!isRouteSupported(supportedChains, sourceChainId, targetChainId)) {\n return {\n assets: [],\n meta: {\n currentPage,\n hasMore: false,\n },\n };\n }\n\n const response = await getTargetChainAssets({\n search,\n limit: limit ?? DEFAULT_LIMIT,\n page: currentPage,\n targetChainId,\n });\n\n return {\n assets: response.assets.map((asset) => ({\n ...asset,\n id: getAssetId(targetChainId, asset),\n bridgeProviders: [ServiceType.MARKR] as const,\n })),\n meta: response.meta,\n };\n };\n}\n"],"mappings":"8GAWA,SAAgB,EAA2B,CACzC,uBACA,mBAYyC,CACzC,OAAO,MAAO,CACZ,gBACA,gBACA,SACA,QACA,UACkE,CAClE,IAAM,EAAc,GAAQ,EAE5B,GAAI,CAACA,EAAAA,iBAAiB,EAAiB,EAAe,EAAc,CAClE,MAAO,CACL,OAAQ,EAAE,CACV,KAAM,CACJ,cACA,QAAS,GACV,CACF,CAGH,IAAM,EAAW,MAAM,EAAqB,CAC1C,SACA,MAAO,GAAS,IAChB,KAAM,EACN,gBACD,CAAC,CAEF,MAAO,CACL,OAAQ,EAAS,OAAO,IAAK,IAAW,CACtC,GAAG,EACH,GAAIC,EAAAA,WAAW,EAAe,EAAM,CACpC,gBAAiB,CAACC,EAAAA,YAAY,MAAM,CACrC,EAAE,CACH,KAAM,EAAS,KAChB"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e}from"../../../constants.js";import{isRouteSupported as t}from"../_utils.js";function n({getTargetChainAssets:n,supportedChains:r}){return async({sourceChainId:i,targetChainId:a})=>t(r,i,a)?(await n(a)).map(t=>({...t,bridgeProviders:[e.MARKR]})):[]}export{n as getBridgeableAssetsFactory};
1
+ import{ServiceType as e}from"../../../constants.js";import{getAssetId as t}from"../../../utils/asset-id.js";import{isRouteSupported as n}from"../_utils.js";function r({getTargetChainAssets:r,supportedChains:i}){return async({sourceChainId:a,targetChainId:o,search:s,limit:c,page:l})=>{let u=l??1;if(!n(i,a,o))return{assets:[],meta:{currentPage:u,hasMore:!1}};let d=await r({search:s,limit:c??100,page:u,targetChainId:o});return{assets:d.assets.map(n=>({...n,id:t(o,n),bridgeProviders:[e.MARKR]})),meta:d.meta}}}export{r as getBridgeableAssetsFactory};
2
2
  //# sourceMappingURL=get-bridgeable-assets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { Asset, BridgeableUiAsset } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { isRouteSupported, type SupportedChainsMap } from '../_utils';\n\nexport function getBridgeableAssetsFactory({\n getTargetChainAssets,\n supportedChains,\n}: {\n getTargetChainAssets: (targetChainId: Caip2ChainId) => Promise<readonly Asset[]>;\n supportedChains: SupportedChainsMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({ sourceChainId, targetChainId }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n if (!isRouteSupported(supportedChains, sourceChainId, targetChainId)) return [];\n\n const assets = await getTargetChainAssets(targetChainId);\n return assets.map((asset) => ({ ...asset, bridgeProviders: [ServiceType.MARKR] as const }));\n };\n}\n"],"mappings":"oGAMA,SAAgB,EAA2B,CACzC,uBACA,mBAIyC,CACzC,OAAO,MAAO,CAAE,gBAAe,mBACxB,EAAiB,EAAiB,EAAe,EAAc,EAErD,MAAM,EAAqB,EAAc,EAC1C,IAAK,IAAW,CAAE,GAAG,EAAO,gBAAiB,CAAC,EAAY,MAAM,CAAW,EAAE,CAHd,EAAE"}
1
+ {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { AssetWithExtras } from '../../../types/asset';\nimport type { AssetSearchQuery } from '../../../types/service';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { getAssetId } from '../../../utils/asset-id';\nimport { isRouteSupported, type SupportedChainsMap } from '../_utils';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nexport function getBridgeableAssetsFactory({\n getTargetChainAssets,\n supportedChains,\n}: {\n getTargetChainAssets: (queryProps: {\n search?: AssetSearchQuery;\n limit: number;\n page: number;\n targetChainId: Caip2ChainId;\n }) => Promise<{\n readonly assets: readonly AssetWithExtras[];\n readonly meta: { readonly currentPage: number; readonly hasMore: boolean; readonly nextPage?: number };\n }>;\n supportedChains: SupportedChainsMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceChainId,\n targetChainId,\n search,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const currentPage = page ?? DEFAULT_PAGE;\n\n if (!isRouteSupported(supportedChains, sourceChainId, targetChainId)) {\n return {\n assets: [],\n meta: {\n currentPage,\n hasMore: false,\n },\n };\n }\n\n const response = await getTargetChainAssets({\n search,\n limit: limit ?? DEFAULT_LIMIT,\n page: currentPage,\n targetChainId,\n });\n\n return {\n assets: response.assets.map((asset) => ({\n ...asset,\n id: getAssetId(targetChainId, asset),\n bridgeProviders: [ServiceType.MARKR] as const,\n })),\n meta: response.meta,\n };\n };\n}\n"],"mappings":"4JAWA,SAAgB,EAA2B,CACzC,uBACA,mBAYyC,CACzC,OAAO,MAAO,CACZ,gBACA,gBACA,SACA,QACA,UACkE,CAClE,IAAM,EAAc,GAAQ,EAE5B,GAAI,CAAC,EAAiB,EAAiB,EAAe,EAAc,CAClE,MAAO,CACL,OAAQ,EAAE,CACV,KAAM,CACJ,cACA,QAAS,GACV,CACF,CAGH,IAAM,EAAW,MAAM,EAAqB,CAC1C,SACA,MAAO,GAAS,IAChB,KAAM,EACN,gBACD,CAAC,CAEF,MAAO,CACL,OAAQ,EAAS,OAAO,IAAK,IAAW,CACtC,GAAG,EACH,GAAI,EAAW,EAAe,EAAM,CACpC,gBAAiB,CAAC,EAAY,MAAM,CACrC,EAAE,CACH,KAAM,EAAS,KAChB"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`../../_utils.cjs`),i=require(`../_api.cjs`),a=require(`../../_tracking-utilities.cjs`),o=require(`../constants.cjs`);let s=require(`viem`),c=require(`@solana/kit`);function l({apiOptions:e}){return({transfer:t,updateListener:r})=>t.sourceChain.chainId===t.targetChain.chainId?n.isSolanaNamespace(t.sourceChain.chainId)?u({transfer:t,updateListener:r}):a.trackSameChainEvmTransfer({transfer:t,updateListener:r}):f({transfer:t,updateListener:r},e)}function u({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:d(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function d(e,n,i){let{txHash:a}=e.source;try{(0,c.assertIsSignature)(a)}catch{let r={...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return n(r),r}let s=r.getSolanaRpcForChain({chain:e.sourceChain}),l=Date.now();for(;!i.aborted;){if(Date.now()-l>12e4)return e;try{let{value:c}=await s.getSignatureStatuses([a],{searchTransactionHistory:!0}).send(),l=c[0];if(!l){await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i});continue}if(l.err!==null){let r={...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return n(r),r}if(l.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return n(t),t}let u=Number(l.confirmations??0),d=Math.min(u,e.source.requiredConfirmationCount-1);d!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:d}},n(e)),await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i})}catch{return e}}return e}function f({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await p(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=g(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function p(e,a,o){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!x(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(n.isEvmNamespace(e.sourceChain.chainId)){let n=e.source.txHash;if(!(0,s.isHash)(n))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let i=r.getEvmClientForChain({chain:e.sourceChain});try{let a=await r.awaitOrAbort(i.waitForTransactionReceipt({hash:n}),o);if(a.status===`aborted`)return e;let s=a.value;return s.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await m(i,e.sourceChain.chainId,e.sourceChain.chainName,s.blockNumber,o)).status===`aborted`?e:C(e)}catch{return e}}if(n.isSolanaNamespace(e.sourceChain.chainId)){let n=e.source.txHash;try{(0,c.assertIsSignature)(n)}catch{return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await b(e.sourceChain,n,o);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:C(e)}}try{let n=await i.markrGetCrossChainStatus(a,e.source.txHash,{signal:o}),r=w(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:A(n),status:`failed`};case`pending`:return S(n.sourceChain.finalized)?C(r):r;case`committed`:case`pending_execution`:return T(r,n);case`completed`:return E(r,n);case`refunded`:return D(r,n);default:return k(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function m(e,t,n,i,a){let o=h(t,n);for(;!a.aborted;){let t=await r.awaitOrAbort(e.getBlock({blockTag:`finalized`}),a);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=i)return{status:`ok`};await r.waitForTimeoutOrAbort({timeoutMs:o,signal:a})}return{status:`aborted`}}function h(e,t){return o.CROSS_CHAIN_POLLING_INTERVAL_MS[y(_(e,t))]}function g(e){return e.status===`source-pending`?h(e.sourceChain.chainId,e.sourceChain.chainName):h(e.targetChain.chainId,e.targetChain.chainName)}function _(e,t){let n=o.FINALITY_MS_BY_CHAIN_ID[e];if(n!==void 0)return n;let r=v(t);return o.FINALITY_MS_BY_CHAIN_NAME_ALIAS.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function v(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function y(e){return e===void 0?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.fast?`fast`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.medium?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.slow?`slow`:`verySlow`}async function b(e,t,n){let i=r.getSolanaRpcForChain({chain:e}),a=Date.now();for(;!n.aborted;){if(Date.now()-a>12e4)return{status:`unknown`};try{let{value:e}=await i.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),a=e[0];if(!a){await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:n});continue}if(a.err!==null)return{status:`reverted`};if(a.confirmationStatus===`finalized`)return{status:`ok`};await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:n})}catch{return{status:`unknown`}}}return{status:`aborted`}}function x(e,t){if(n.isEvmNamespace(t))return(0,s.isHash)(e);if(n.isSolanaNamespace(t))try{return(0,c.assertIsSignature)(e),!0}catch{return!1}return!1}function S(e){return e===!0||typeof e==`string`}function C(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function w(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function T(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function E(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:A(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function D(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?O(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:A(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function O(t,r){if(n.isSolanaNamespace(t))return(0,c.isAddress)(r)?{address:r,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.SPL}:void 0;if(n.isEvmNamespace(t))return(0,s.isAddress)(r)?{address:r,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.ERC20}:void 0}function k(e,t){return t.progress.executed===!0?E(e,t):t.progress.committed===!0?T(e,t):S(t.sourceChain.finalized)?C(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function A(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}exports.trackTransferFactory=l;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../_api.cjs`),a=require(`../../_tracking-utilities.cjs`),o=require(`../constants.cjs`);let s=require(`viem`),c=require(`@solana/kit`);function l({apiOptions:e}){return({transfer:t,updateListener:n})=>t.sourceChain.chainId===t.targetChain.chainId?r.isSolanaNamespace(t.sourceChain.chainId)?u({transfer:t,updateListener:n}):a.trackSameChainEvmTransfer({transfer:t,updateListener:n}):f({transfer:t,updateListener:n},e)}function u({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:d(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function d(e,r,i){let{txHash:a}=e.source;try{(0,c.assertIsSignature)(a)}catch{let n={...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return r(n),n}let s=n.getSolanaRpcForChain({chain:e.sourceChain}),l=Date.now();for(;!i.aborted;){if(Date.now()-l>12e4)return e;try{let{value:c}=await s.getSignatureStatuses([a],{searchTransactionHistory:!0}).send(),l=c[0];if(!l){await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i});continue}if(l.err!==null){let n={...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return r(n),n}if(l.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return r(t),t}let u=Number(l.confirmations??0),d=Math.min(u,e.source.requiredConfirmationCount-1);d!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:d}},r(e)),await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i})}catch{return e}}return e}function f({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await p(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=g(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function p(e,a,o){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!x(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(r.isEvmNamespace(e.sourceChain.chainId)){let r=e.source.txHash;if(!(0,s.isHash)(r))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let i=n.getEvmClientForChain({chain:e.sourceChain});try{let a=await n.awaitOrAbort(i.waitForTransactionReceipt({hash:r}),o);if(a.status===`aborted`)return e;let s=a.value;return s.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await m(i,e.sourceChain.chainId,e.sourceChain.chainName,s.blockNumber,o)).status===`aborted`?e:C(e)}catch{return e}}if(r.isSolanaNamespace(e.sourceChain.chainId)){let n=e.source.txHash;try{(0,c.assertIsSignature)(n)}catch{return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await b(e.sourceChain,n,o);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:C(e)}}try{let n=await i.markrGetCrossChainStatus(a,e.source.txHash,{signal:o}),r=w(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:A(n),status:`failed`};case`pending`:return S(n.sourceChain.finalized)?C(r):r;case`committed`:case`pending_execution`:return T(r,n);case`completed`:return E(r,n);case`refunded`:return D(r,n);default:return k(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function m(e,t,r,i,a){let o=h(t,r);for(;!a.aborted;){let t=await n.awaitOrAbort(e.getBlock({blockTag:`finalized`}),a);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=i)return{status:`ok`};await n.waitForTimeoutOrAbort({timeoutMs:o,signal:a})}return{status:`aborted`}}function h(e,t){return o.CROSS_CHAIN_POLLING_INTERVAL_MS[y(_(e,t))]}function g(e){return e.status===`source-pending`?h(e.sourceChain.chainId,e.sourceChain.chainName):h(e.targetChain.chainId,e.targetChain.chainName)}function _(e,t){let n=o.FINALITY_MS_BY_CHAIN_ID[e];if(n!==void 0)return n;let r=v(t);return o.FINALITY_MS_BY_CHAIN_NAME_ALIAS.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function v(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function y(e){return e===void 0?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.fast?`fast`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.medium?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.slow?`slow`:`verySlow`}async function b(e,t,r){let i=n.getSolanaRpcForChain({chain:e}),a=Date.now();for(;!r.aborted;){if(Date.now()-a>12e4)return{status:`unknown`};try{let{value:e}=await i.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),a=e[0];if(!a){await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:r});continue}if(a.err!==null)return{status:`reverted`};if(a.confirmationStatus===`finalized`)return{status:`ok`};await n.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:r})}catch{return{status:`unknown`}}}return{status:`aborted`}}function x(e,t){if(r.isEvmNamespace(t))return(0,s.isHash)(e);if(r.isSolanaNamespace(t))try{return(0,c.assertIsSignature)(e),!0}catch{return!1}return!1}function S(e){return e===!0||typeof e==`string`}function C(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function w(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function T(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function E(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:A(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function D(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?O(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:A(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function O(t,n){if(r.isSolanaNamespace(t))return(0,c.isAddress)(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.SPL}:void 0;if(r.isEvmNamespace(t))return(0,s.isAddress)(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.ERC20}:void 0}function k(e,t){return t.progress.executed===!0?E(e,t):t.progress.committed===!0?T(e,t):S(t.sourceChain.finalized)?C(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function A(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}exports.trackTransferFactory=l;
2
2
  //# sourceMappingURL=track-transfer.cjs.map
@@ -1,2 +1,2 @@
1
- import{TokenType as e}from"../../../constants.js";import{ErrorCode as t}from"../../../errors.js";import{isEvmNamespace as n,isSolanaNamespace as r}from"../../../_utils/chain.js";import{awaitOrAbort as i,getEvmClientForChain as a,getSolanaRpcForChain as o,waitForTimeoutOrAbort as s}from"../../_utils.js";import{markrGetCrossChainStatus as c}from"../_api.js";import{trackSameChainEvmTransfer as l}from"../../_tracking-utilities.js";import{CROSS_CHAIN_POLLING_INTERVAL_MS as u,FINALITY_MS_BY_CHAIN_ID as d,FINALITY_MS_BY_CHAIN_NAME_ALIAS as f,FINALITY_TIER_MAX_FINALITY_MS as p,SOLANA_POLLING_INTERVAL_MS as m}from"../constants.js";import{isAddress as h,isHash as g}from"viem";import{assertIsSignature as _,isAddress as v}from"@solana/kit";function y({apiOptions:e}){return({transfer:t,updateListener:n})=>t.sourceChain.chainId===t.targetChain.chainId?r(t.sourceChain.chainId)?b({transfer:t,updateListener:n}):l({transfer:t,updateListener:n}):S({transfer:t,updateListener:n},e)}function b({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:x(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function x(e,n,r){let{txHash:i}=e.source;try{_(i)}catch{let r={...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return n(r),r}let a=o({chain:e.sourceChain}),c=Date.now();for(;!r.aborted;){if(Date.now()-c>12e4)return e;try{let{value:o}=await a.getSignatureStatuses([i],{searchTransactionHistory:!0}).send(),c=o[0];if(!c){await s({timeoutMs:m,signal:r});continue}if(c.err!==null){let r={...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return n(r),r}if(c.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return n(t),t}let l=Number(c.confirmations??0),u=Math.min(l,e.source.requiredConfirmationCount-1);u!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:u}},n(e)),await s({timeoutMs:m,signal:r})}catch{return e}}return e}function S({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await C(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=E(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function C(e,o,s){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!j(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(n(e.sourceChain.chainId)){let n=e.source.txHash;if(!g(n))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let r=a({chain:e.sourceChain});try{let a=await i(r.waitForTransactionReceipt({hash:n}),s);if(a.status===`aborted`)return e;let o=a.value;return o.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await w(r,e.sourceChain.chainId,e.sourceChain.chainName,o.blockNumber,s)).status===`aborted`?e:N(e)}catch{return e}}if(r(e.sourceChain.chainId)){let n=e.source.txHash;try{_(n)}catch{return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await A(e.sourceChain,n,s);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:N(e)}}try{let n=await c(o,e.source.txHash,{signal:s}),r=P(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:B(n),status:`failed`};case`pending`:return M(n.sourceChain.finalized)?N(r):r;case`committed`:case`pending_execution`:return F(r,n);case`completed`:return I(r,n);case`refunded`:return L(r,n);default:return z(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function w(e,t,n,r,a){let o=T(t,n);for(;!a.aborted;){let t=await i(e.getBlock({blockTag:`finalized`}),a);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=r)return{status:`ok`};await s({timeoutMs:o,signal:a})}return{status:`aborted`}}function T(e,t){return u[k(D(e,t))]}function E(e){return e.status===`source-pending`?T(e.sourceChain.chainId,e.sourceChain.chainName):T(e.targetChain.chainId,e.targetChain.chainName)}function D(e,t){let n=d[e];if(n!==void 0)return n;let r=O(t);return f.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function O(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function k(e){return e===void 0?`medium`:e<=p.fast?`fast`:e<=p.medium?`medium`:e<=p.slow?`slow`:`verySlow`}async function A(e,t,n){let r=o({chain:e}),i=Date.now();for(;!n.aborted;){if(Date.now()-i>12e4)return{status:`unknown`};try{let{value:e}=await r.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),i=e[0];if(!i){await s({timeoutMs:m,signal:n});continue}if(i.err!==null)return{status:`reverted`};if(i.confirmationStatus===`finalized`)return{status:`ok`};await s({timeoutMs:m,signal:n})}catch{return{status:`unknown`}}}return{status:`aborted`}}function j(e,t){if(n(t))return g(e);if(r(t))try{return _(e),!0}catch{return!1}return!1}function M(e){return e===!0||typeof e==`string`}function N(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function P(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function F(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function I(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:B(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function L(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?R(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:B(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function R(t,i){if(r(t))return v(i)?{address:i,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.SPL}:void 0;if(n(t))return h(i)?{address:i,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.ERC20}:void 0}function z(e,t){return t.progress.executed===!0?I(e,t):t.progress.committed===!0?F(e,t):M(t.sourceChain.finalized)?N(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function B(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}export{y as trackTransferFactory};
1
+ import{TokenType as e}from"../../../constants.js";import{ErrorCode as t}from"../../../errors.js";import{awaitOrAbort as n,getEvmClientForChain as r,getSolanaRpcForChain as i,waitForTimeoutOrAbort as a}from"../../_utils.js";import{isEvmNamespace as o,isSolanaNamespace as s}from"../../../_utils/chain.js";import{markrGetCrossChainStatus as c}from"../_api.js";import{trackSameChainEvmTransfer as l}from"../../_tracking-utilities.js";import{CROSS_CHAIN_POLLING_INTERVAL_MS as u,FINALITY_MS_BY_CHAIN_ID as d,FINALITY_MS_BY_CHAIN_NAME_ALIAS as f,FINALITY_TIER_MAX_FINALITY_MS as p,SOLANA_POLLING_INTERVAL_MS as m}from"../constants.js";import{isAddress as h,isHash as g}from"viem";import{assertIsSignature as _,isAddress as v}from"@solana/kit";function y({apiOptions:e}){return({transfer:t,updateListener:n})=>t.sourceChain.chainId===t.targetChain.chainId?s(t.sourceChain.chainId)?b({transfer:t,updateListener:n}):l({transfer:t,updateListener:n}):S({transfer:t,updateListener:n},e)}function b({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:x(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function x(e,n,r){let{txHash:o}=e.source;try{_(o)}catch{let r={...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return n(r),r}let s=i({chain:e.sourceChain}),c=Date.now();for(;!r.aborted;){if(Date.now()-c>12e4)return e;try{let{value:i}=await s.getSignatureStatuses([o],{searchTransactionHistory:!0}).send(),c=i[0];if(!c){await a({timeoutMs:m,signal:r});continue}if(c.err!==null){let r={...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return n(r),r}if(c.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return n(t),t}let l=Number(c.confirmations??0),u=Math.min(l,e.source.requiredConfirmationCount-1);u!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:u}},n(e)),await a({timeoutMs:m,signal:r})}catch{return e}}return e}function S({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await C(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=E(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function C(e,i,a){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!j(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(o(e.sourceChain.chainId)){let i=e.source.txHash;if(!g(i))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let o=r({chain:e.sourceChain});try{let r=await n(o.waitForTransactionReceipt({hash:i}),a);if(r.status===`aborted`)return e;let s=r.value;return s.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await w(o,e.sourceChain.chainId,e.sourceChain.chainName,s.blockNumber,a)).status===`aborted`?e:N(e)}catch{return e}}if(s(e.sourceChain.chainId)){let n=e.source.txHash;try{_(n)}catch{return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await A(e.sourceChain,n,a);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:N(e)}}try{let n=await c(i,e.source.txHash,{signal:a}),r=P(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:B(n),status:`failed`};case`pending`:return M(n.sourceChain.finalized)?N(r):r;case`committed`:case`pending_execution`:return F(r,n);case`completed`:return I(r,n);case`refunded`:return L(r,n);default:return z(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function w(e,t,r,i,o){let s=T(t,r);for(;!o.aborted;){let t=await n(e.getBlock({blockTag:`finalized`}),o);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=i)return{status:`ok`};await a({timeoutMs:s,signal:o})}return{status:`aborted`}}function T(e,t){return u[k(D(e,t))]}function E(e){return e.status===`source-pending`?T(e.sourceChain.chainId,e.sourceChain.chainName):T(e.targetChain.chainId,e.targetChain.chainName)}function D(e,t){let n=d[e];if(n!==void 0)return n;let r=O(t);return f.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function O(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function k(e){return e===void 0?`medium`:e<=p.fast?`fast`:e<=p.medium?`medium`:e<=p.slow?`slow`:`verySlow`}async function A(e,t,n){let r=i({chain:e}),o=Date.now();for(;!n.aborted;){if(Date.now()-o>12e4)return{status:`unknown`};try{let{value:e}=await r.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),i=e[0];if(!i){await a({timeoutMs:m,signal:n});continue}if(i.err!==null)return{status:`reverted`};if(i.confirmationStatus===`finalized`)return{status:`ok`};await a({timeoutMs:m,signal:n})}catch{return{status:`unknown`}}}return{status:`aborted`}}function j(e,t){if(o(t))return g(e);if(s(t))try{return _(e),!0}catch{return!1}return!1}function M(e){return e===!0||typeof e==`string`}function N(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function P(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function F(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function I(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:B(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function L(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?R(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:B(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function R(t,n){if(s(t))return v(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.SPL}:void 0;if(o(t))return h(n)?{address:n,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.ERC20}:void 0}function z(e,t){return t.progress.executed===!0?I(e,t):t.progress.committed===!0?F(e,t):M(t.sourceChain.finalized)?N(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function B(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}export{y as trackTransferFactory};
2
2
  //# sourceMappingURL=track-transfer.js.map
@@ -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/chain.cjs`),i=require(`../../_utils.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../../../utils/sol-address.cjs`),c=require(`../_utils.cjs`),l=require(`../_type-guards.cjs`),u=require(`../../../utils/solana.cjs`),d=require(`./estimate-native-fee.cjs`);let f=require(`viem`);function p({apiOptions:n,appId:i,environment:a,evmSigner:o,solanaSigner:s}){return async({quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d})=>{if(c.serviceType!==e.ServiceType.MARKR)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=Math.floor(Date.now()/1e3);if(c.expiresAt<=f)throw new t.SdkError(t.ErrorReason.QUOTE_EXPIRED,t.ErrorCode.INVALID_PARAMS);let p=c.sourceChain.chainId;if(r.isSolanaNamespace(p))return h({apiOptions:n,appId:i,environment:a,solanaSigner:s,quote:c,onStepChange:d});if(r.isEvmNamespace(p))return m({apiOptions:n,appId:i,environment:a,evmSigner:o,quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d});throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${p}`})}}async function m({apiOptions:r,appId:s,environment:u,evmSigner:p,quote:m,gasSettings:h,fallbackToDefaultOnBatchFailure:_,onStepChange:v}){let y=m.fromAddress;if(!(0,f.isAddress)(y))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let b=c.calculateMarkrMinimumAmountOut({amountOut:m.amountOut,assetOut:m.assetOut,slippageBps:m.slippageBps}),x=i.getEvmClientForChain({chain:m.sourceChain}),S=c.assetToAddressString(m.assetIn,m.sourceChain.chainId),C=c.assetToAddressString(m.assetOut,m.targetChain.chainId);if(!(0,f.isAddress)(S))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let w=S,T=c.isTokenAddressNative(w),E=m.sourceChain.chainId.toLowerCase()!==m.targetChain.chainId.toLowerCase(),D=m.amountIn+c.getAdditiveSourceAssetFeeAmount(m),{address:O}=await o.markrGetSpenderAddress(r,{chainId:n.caip2ToEip155ChainId(m.sourceChain.chainId),crossChainSwap:E,quoteId:m.id});if(!T&&!O)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${m.sourceChain.chainId}.`});let k=!1,A;if(!T&&O&&await x.readContract({address:w,abi:f.erc20Abi,functionName:`allowance`,args:[y,O]})<D){k=!0;let e=(0,f.encodeFunctionData)({abi:f.erc20Abi,functionName:`approve`,args:[O,D]}),t=i.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(x,{account:y,to:w,data:e},f.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`),h?.estimateGasMarginBps);A={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:e,from:y,gas:t,to:w,value:0n,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}}}let j=g({approvalRequest:A,requiresApprovalSignature:k,signBatch:p.signBatch,sourceChainId:m.sourceChain.chainId,targetChainId:m.targetChain.chainId}),M=await o.markrSwap(r,{amountIn:m.amountIn.toString(),appId:s,minAmountOut:b.toString(),tokenIn:S,tokenOut:C,uuid:m.id});if(!l.isEvmSwapResponse(M))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let N=(t,n=Date.now())=>{let r=m.sourceChain.chainId===m.targetChain.chainId;return{amountIn:m.amountIn,amountOut:m.amountOut,environment:u,fees:m.fees,fromAddress:m.fromAddress,id:m.id,partnerFeeBps:m.partnerFeeBps,sourceAsset:m.assetIn,sourceChain:m.sourceChain,status:`source-pending`,targetAsset:m.assetOut,targetChain:m.targetChain,toAddress:m.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(j&&A){let r={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:m,requiredSignatures:1},i=p.signBatch;if(!i)throw new t.SdkError(`One-click batch signer is not available.`,t.ErrorCode.SIGNING_FAILED);let a={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:M.data,from:y,gas:void 0,to:M.to,value:M.value,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}};v?.(r);try{let e=(await i([A,a],async e=>x.sendRawTransaction({serializedTransaction:e}),r)).at(-1);if(!e)throw new t.SdkError(`One-click batch signing returned no transaction hashes.`,t.ErrorCode.SIGNING_FAILED);return N(e)}catch(e){if(!_)throw e}}if(k&&A){let n={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:m,requiredSignatures:2};v?.(n);let r=await p.sign(A,async e=>x.sendRawTransaction({serializedTransaction:e}),n);if((await x.waitForTransactionReceipt({hash:r})).status===`reverted`)return i.makeFailedTransferFromQuote(m,{environment:u,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let P=await d._estimateGasFromSwapResponse({crossChain:E,fromAddress:y,feeUnitsMarginBps:h?.estimateGasMarginBps,sourceClient:x,swap:M}),F={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:M.data,from:y,gas:P,to:M.to,value:M.value,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}},I={currentSignature:k?2:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:m,requiredSignatures:k?2:1};v?.(I);let L=Date.now();return N(await p.sign(F,async e=>x.sendRawTransaction({serializedTransaction:e}),I),L)}async function h({apiOptions:n,appId:r,environment:a,solanaSigner:d,quote:f,onStepChange:p}){if(!d)throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!s.isSolAddress(f.fromAddress))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let m=c.calculateMarkrMinimumAmountOut({amountOut:f.amountOut,assetOut:f.assetOut,slippageBps:f.slippageBps}),h=c.assetToAddressString(f.assetIn,f.sourceChain.chainId),g=c.assetToAddressString(f.assetOut,f.targetChain.chainId),_=await o.markrSwap(n,{amountIn:f.amountIn.toString(),appId:r,minAmountOut:m.toString(),tokenIn:h,tokenOut:g,userPublicKey:f.fromAddress,uuid:f.id});if(!l.isSolanaSwapResponse(_))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,_.swapTransaction);let v=await u.refreshSolanaSwapTransactionBlockhash(_.swapTransaction,i.getSolanaRpcForChain({chain:f.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,v);let y={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:f,requiredSignatures:1};p?.(y);let b=Date.now(),x=await d.signAndSend({account:f.fromAddress,serializedTx:v},y),S=f.sourceChain.chainId.toLowerCase()!==f.targetChain.chainId.toLowerCase();return{amountIn:f.amountIn,amountOut:f.amountOut,environment:a,fees:f.fees,fromAddress:f.fromAddress,id:f.id,partnerFeeBps:f.partnerFeeBps,sourceAsset:f.assetIn,sourceChain:f.sourceChain,status:`source-pending`,targetAsset:f.assetOut,targetChain:f.targetChain,toAddress:f.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:S?2:32,startedAtMs:b,txHash:x}}}function g({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:i,targetChainId:a}){return r.isEvmNamespace(i)&&r.isEvmNamespace(a)&&i===a&&t&&e!==void 0&&typeof n==`function`}exports.transferAssetFactory=p;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`),r=require(`../../_utils.cjs`),i=require(`../../../_utils/chain.cjs`),a=require(`../../_evm-errors.cjs`),o=require(`../_api.cjs`),s=require(`../../../utils/sol-address.cjs`),c=require(`../_utils.cjs`),l=require(`../_type-guards.cjs`),u=require(`../../../utils/solana.cjs`),d=require(`./estimate-native-fee.cjs`);let f=require(`viem`);function p({apiOptions:n,appId:r,environment:a,evmSigner:o,solanaSigner:s}){return async({quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d})=>{if(c.serviceType!==e.ServiceType.MARKR)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=Math.floor(Date.now()/1e3);if(c.expiresAt<=f)throw new t.SdkError(t.ErrorReason.QUOTE_EXPIRED,t.ErrorCode.INVALID_PARAMS);let p=c.sourceChain.chainId;if(i.isSolanaNamespace(p))return h({apiOptions:n,appId:r,environment:a,solanaSigner:s,quote:c,onStepChange:d});if(i.isEvmNamespace(p))return m({apiOptions:n,appId:r,environment:a,evmSigner:o,quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d});throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${p}`})}}async function m({apiOptions:i,appId:s,environment:u,evmSigner:p,quote:m,gasSettings:h,fallbackToDefaultOnBatchFailure:_,onStepChange:v}){let y=m.fromAddress;if(!(0,f.isAddress)(y))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let b=c.calculateMarkrMinimumAmountOut({amountOut:m.amountOut,assetOut:m.assetOut,slippageBps:m.slippageBps}),x=r.getEvmClientForChain({chain:m.sourceChain}),S=c.assetToAddressString(m.assetIn,m.sourceChain.chainId),C=c.assetToAddressString(m.assetOut,m.targetChain.chainId);if(!(0,f.isAddress)(S))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let w=S,T=c.isTokenAddressNative(w),E=m.sourceChain.chainId.toLowerCase()!==m.targetChain.chainId.toLowerCase(),D=m.amountIn+c.getAdditiveSourceAssetFeeAmount(m),{address:O}=await o.markrGetSpenderAddress(i,{chainId:n.caip2ToEip155ChainId(m.sourceChain.chainId),crossChainSwap:E,quoteId:m.id});if(!T&&!O)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${m.sourceChain.chainId}.`});let k=!1,A;if(!T&&O&&await x.readContract({address:w,abi:f.erc20Abi,functionName:`allowance`,args:[y,O]})<D){k=!0;let e=(0,f.encodeFunctionData)({abi:f.erc20Abi,functionName:`approve`,args:[O,D]}),t=r.applyFeeUnitsBpsMargin(await a.estimateGasWithRevert(x,{account:y,to:w,data:e},f.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`),h?.estimateGasMarginBps);A={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:e,from:y,gas:t,to:w,value:0n,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}}}let j=g({approvalRequest:A,requiresApprovalSignature:k,signBatch:p.signBatch,sourceChainId:m.sourceChain.chainId,targetChainId:m.targetChain.chainId}),M=await o.markrSwap(i,{amountIn:m.amountIn.toString(),appId:s,minAmountOut:b.toString(),tokenIn:S,tokenOut:C,uuid:m.id});if(!l.isEvmSwapResponse(M))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let N=(t,n=Date.now())=>{let r=m.sourceChain.chainId===m.targetChain.chainId;return{amountIn:m.amountIn,amountOut:m.amountOut,environment:u,fees:m.fees,fromAddress:m.fromAddress,id:m.id,partnerFeeBps:m.partnerFeeBps,sourceAsset:m.assetIn,sourceChain:m.sourceChain,status:`source-pending`,targetAsset:m.assetOut,targetChain:m.targetChain,toAddress:m.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(j&&A){let r={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:m,requiredSignatures:1},i=p.signBatch;if(!i)throw new t.SdkError(`One-click batch signer is not available.`,t.ErrorCode.SIGNING_FAILED);let a={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:M.data,from:y,gas:void 0,to:M.to,value:M.value,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}};v?.(r);try{let e=(await i([A,a],async e=>x.sendRawTransaction({serializedTransaction:e}),r)).at(-1);if(!e)throw new t.SdkError(`One-click batch signing returned no transaction hashes.`,t.ErrorCode.SIGNING_FAILED);return N(e)}catch(e){if(!_)throw e}}if(k&&A){let n={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:m,requiredSignatures:2};v?.(n);let i=await p.sign(A,async e=>x.sendRawTransaction({serializedTransaction:e}),n);if((await x.waitForTransactionReceipt({hash:i})).status===`reverted`)return r.makeFailedTransferFromQuote(m,{environment:u,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let P=await d._estimateGasFromSwapResponse({crossChain:E,fromAddress:y,feeUnitsMarginBps:h?.estimateGasMarginBps,sourceClient:x,swap:M}),F={chainId:n.caip2ToEip155HexChainId(m.sourceChain.chainId),data:M.data,from:y,gas:P,to:M.to,value:M.value,...h?.maxFeePerGas===void 0?null:{maxFeePerGas:h.maxFeePerGas,maxPriorityFeePerGas:h.maxPriorityFeePerGas}},I={currentSignature:k?2:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:m,requiredSignatures:k?2:1};v?.(I);let L=Date.now();return N(await p.sign(F,async e=>x.sendRawTransaction({serializedTransaction:e}),I),L)}async function h({apiOptions:n,appId:i,environment:a,solanaSigner:d,quote:f,onStepChange:p}){if(!d)throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!s.isSolAddress(f.fromAddress))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let m=c.calculateMarkrMinimumAmountOut({amountOut:f.amountOut,assetOut:f.assetOut,slippageBps:f.slippageBps}),h=c.assetToAddressString(f.assetIn,f.sourceChain.chainId),g=c.assetToAddressString(f.assetOut,f.targetChain.chainId),_=await o.markrSwap(n,{amountIn:f.amountIn.toString(),appId:i,minAmountOut:m.toString(),tokenIn:h,tokenOut:g,userPublicKey:f.fromAddress,uuid:f.id});if(!l.isSolanaSwapResponse(_))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,_.swapTransaction);let v=await u.refreshSolanaSwapTransactionBlockhash(_.swapTransaction,r.getSolanaRpcForChain({chain:f.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,v);let y={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:f,requiredSignatures:1};p?.(y);let b=Date.now(),x=await d.signAndSend({account:f.fromAddress,serializedTx:v},y),S=f.sourceChain.chainId.toLowerCase()!==f.targetChain.chainId.toLowerCase();return{amountIn:f.amountIn,amountOut:f.amountOut,environment:a,fees:f.fees,fromAddress:f.fromAddress,id:f.id,partnerFeeBps:f.partnerFeeBps,sourceAsset:f.assetIn,sourceChain:f.sourceChain,status:`source-pending`,targetAsset:f.assetOut,targetChain:f.targetChain,toAddress:f.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:S?2:32,startedAtMs:b,txHash:x}}}function g({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:a}){return i.isEvmNamespace(r)&&i.isEvmNamespace(a)&&r===a&&t&&e!==void 0&&typeof n==`function`}exports.transferAssetFactory=p;
2
2
  //# sourceMappingURL=transfer-asset.cjs.map
@@ -1,2 +1,2 @@
1
- import{ServiceType as e,TransferSignatureReason as t}from"../../../constants.js";import{ErrorCode as n,ErrorReason as r,SdkError as i}from"../../../errors.js";import{caip2ToEip155ChainId as a,caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{isEvmNamespace as s,isSolanaNamespace as c}from"../../../_utils/chain.js";import{applyFeeUnitsBpsMargin as l,getEvmClientForChain as u,getSolanaRpcForChain as d,makeFailedTransferFromQuote as f}from"../../_utils.js";import{estimateGasWithRevert as p}from"../../_evm-errors.js";import{markrGetSpenderAddress as m,markrSwap as h}from"../_api.js";import{isSolAddress as g}from"../../../utils/sol-address.js";import{assetToAddressString as _,calculateMarkrMinimumAmountOut as v,getAdditiveSourceAssetFeeAmount as y,isTokenAddressNative as b}from"../_utils.js";import{isEvmSwapResponse as x,isSolanaSwapResponse as S}from"../_type-guards.js";import{refreshSolanaSwapTransactionBlockhash as C}from"../../../utils/solana.js";import{_estimateGasFromSwapResponse as w}from"./estimate-native-fee.js";import{encodeFunctionData as T,erc20Abi as E,isAddress as D}from"viem";function O({apiOptions:t,appId:a,environment:o,evmSigner:l,solanaSigner:u}){return async({quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m})=>{if(d.serviceType!==e.MARKR)throw new i(r.INCORRECT_PROVIDER_PROVIDED,n.INVALID_PARAMS);let h=Math.floor(Date.now()/1e3);if(d.expiresAt<=h)throw new i(r.QUOTE_EXPIRED,n.INVALID_PARAMS);let g=d.sourceChain.chainId;if(c(g))return A({apiOptions:t,appId:a,environment:o,solanaSigner:u,quote:d,onStepChange:m});if(s(g))return k({apiOptions:t,appId:a,environment:o,evmSigner:l,quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m});throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${g}`})}}async function k({apiOptions:s,appId:c,environment:d,evmSigner:g,quote:S,gasSettings:C,fallbackToDefaultOnBatchFailure:O,onStepChange:k}){let A=S.fromAddress;if(!D(A))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let M=v({amountOut:S.amountOut,assetOut:S.assetOut,slippageBps:S.slippageBps}),N=u({chain:S.sourceChain}),P=_(S.assetIn,S.sourceChain.chainId),F=_(S.assetOut,S.targetChain.chainId);if(!D(P))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let I=P,L=b(I),R=S.sourceChain.chainId.toLowerCase()!==S.targetChain.chainId.toLowerCase(),z=S.amountIn+y(S),{address:B}=await m(s,{chainId:a(S.sourceChain.chainId),crossChainSwap:R,quoteId:S.id});if(!L&&!B)throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${S.sourceChain.chainId}.`});let V=!1,H;if(!L&&B&&await N.readContract({address:I,abi:E,functionName:`allowance`,args:[A,B]})<z){V=!0;let e=T({abi:E,functionName:`approve`,args:[B,z]}),t=l(await p(N,{account:A,to:I,data:e},E,`Failed to estimate gas for ERC20 approval transaction.`),C?.estimateGasMarginBps);H={chainId:o(S.sourceChain.chainId),data:e,from:A,gas:t,to:I,value:0n,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}}}let U=j({approvalRequest:H,requiresApprovalSignature:V,signBatch:g.signBatch,sourceChainId:S.sourceChain.chainId,targetChainId:S.targetChain.chainId}),W=await h(s,{amountIn:S.amountIn.toString(),appId:c,minAmountOut:M.toString(),tokenIn:P,tokenOut:F,uuid:S.id});if(!x(W))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let G=(t,n=Date.now())=>{let r=S.sourceChain.chainId===S.targetChain.chainId;return{amountIn:S.amountIn,amountOut:S.amountOut,environment:d,fees:S.fees,fromAddress:S.fromAddress,id:S.id,partnerFeeBps:S.partnerFeeBps,sourceAsset:S.assetIn,sourceChain:S.sourceChain,status:`source-pending`,targetAsset:S.assetOut,targetChain:S.targetChain,toAddress:S.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(U&&H){let e={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:S,requiredSignatures:1},r=g.signBatch;if(!r)throw new i(`One-click batch signer is not available.`,n.SIGNING_FAILED);let a={chainId:o(S.sourceChain.chainId),data:W.data,from:A,gas:void 0,to:W.to,value:W.value,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}};k?.(e);try{let t=(await r([H,a],async e=>N.sendRawTransaction({serializedTransaction:e}),e)).at(-1);if(!t)throw new i(`One-click batch signing returned no transaction hashes.`,n.SIGNING_FAILED);return G(t)}catch(e){if(!O)throw e}}if(V&&H){let e={currentSignature:1,currentSignatureReason:t.AllowanceApproval,quote:S,requiredSignatures:2};k?.(e);let r=await g.sign(H,async e=>N.sendRawTransaction({serializedTransaction:e}),e);if((await N.waitForTransactionReceipt({hash:r})).status===`reverted`)return f(S,{environment:d,errorCode:n.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let K=await w({crossChain:R,fromAddress:A,feeUnitsMarginBps:C?.estimateGasMarginBps,sourceClient:N,swap:W}),q={chainId:o(S.sourceChain.chainId),data:W.data,from:A,gas:K,to:W.to,value:W.value,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}},J={currentSignature:V?2:1,currentSignatureReason:t.TokensTransfer,quote:S,requiredSignatures:V?2:1};k?.(J);let Y=Date.now();return G(await g.sign(q,async e=>N.sendRawTransaction({serializedTransaction:e}),J),Y)}async function A({apiOptions:a,appId:o,environment:s,solanaSigner:c,quote:l,onStepChange:u}){if(!c)throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!g(l.fromAddress))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let f=v({amountOut:l.amountOut,assetOut:l.assetOut,slippageBps:l.slippageBps}),p=_(l.assetIn,l.sourceChain.chainId),m=_(l.assetOut,l.targetChain.chainId),y=await h(a,{amountIn:l.amountIn.toString(),appId:o,minAmountOut:f.toString(),tokenIn:p,tokenOut:m,userPublicKey:l.fromAddress,uuid:l.id});if(!S(y))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,y.swapTransaction);let b=await C(y.swapTransaction,d({chain:l.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,b);let x={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:l,requiredSignatures:1};u?.(x);let w=Date.now(),T=await c.signAndSend({account:l.fromAddress,serializedTx:b},x),E=l.sourceChain.chainId.toLowerCase()!==l.targetChain.chainId.toLowerCase();return{amountIn:l.amountIn,amountOut:l.amountOut,environment:s,fees:l.fees,fromAddress:l.fromAddress,id:l.id,partnerFeeBps:l.partnerFeeBps,sourceAsset:l.assetIn,sourceChain:l.sourceChain,status:`source-pending`,targetAsset:l.assetOut,targetChain:l.targetChain,toAddress:l.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:E?2:32,startedAtMs:w,txHash:T}}}function j({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:i}){return s(r)&&s(i)&&r===i&&t&&e!==void 0&&typeof n==`function`}export{O as transferAssetFactory};
1
+ import{ServiceType as e,TransferSignatureReason as t}from"../../../constants.js";import{ErrorCode as n,ErrorReason as r,SdkError as i}from"../../../errors.js";import{caip2ToEip155ChainId as a,caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{applyFeeUnitsBpsMargin as s,getEvmClientForChain as c,getSolanaRpcForChain as l,makeFailedTransferFromQuote as u}from"../../_utils.js";import{isEvmNamespace as d,isSolanaNamespace as f}from"../../../_utils/chain.js";import{estimateGasWithRevert as p}from"../../_evm-errors.js";import{markrGetSpenderAddress as m,markrSwap as h}from"../_api.js";import{isSolAddress as g}from"../../../utils/sol-address.js";import{assetToAddressString as _,calculateMarkrMinimumAmountOut as v,getAdditiveSourceAssetFeeAmount as y,isTokenAddressNative as b}from"../_utils.js";import{isEvmSwapResponse as x,isSolanaSwapResponse as S}from"../_type-guards.js";import{refreshSolanaSwapTransactionBlockhash as C}from"../../../utils/solana.js";import{_estimateGasFromSwapResponse as w}from"./estimate-native-fee.js";import{encodeFunctionData as T,erc20Abi as E,isAddress as D}from"viem";function O({apiOptions:t,appId:a,environment:o,evmSigner:s,solanaSigner:c}){return async({quote:l,gasSettings:u,fallbackToDefaultOnBatchFailure:p,onStepChange:m})=>{if(l.serviceType!==e.MARKR)throw new i(r.INCORRECT_PROVIDER_PROVIDED,n.INVALID_PARAMS);let h=Math.floor(Date.now()/1e3);if(l.expiresAt<=h)throw new i(r.QUOTE_EXPIRED,n.INVALID_PARAMS);let g=l.sourceChain.chainId;if(f(g))return A({apiOptions:t,appId:a,environment:o,solanaSigner:c,quote:l,onStepChange:m});if(d(g))return k({apiOptions:t,appId:a,environment:o,evmSigner:s,quote:l,gasSettings:u,fallbackToDefaultOnBatchFailure:p,onStepChange:m});throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${g}`})}}async function k({apiOptions:l,appId:d,environment:f,evmSigner:g,quote:S,gasSettings:C,fallbackToDefaultOnBatchFailure:O,onStepChange:k}){let A=S.fromAddress;if(!D(A))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let M=v({amountOut:S.amountOut,assetOut:S.assetOut,slippageBps:S.slippageBps}),N=c({chain:S.sourceChain}),P=_(S.assetIn,S.sourceChain.chainId),F=_(S.assetOut,S.targetChain.chainId);if(!D(P))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let I=P,L=b(I),R=S.sourceChain.chainId.toLowerCase()!==S.targetChain.chainId.toLowerCase(),z=S.amountIn+y(S),{address:B}=await m(l,{chainId:a(S.sourceChain.chainId),crossChainSwap:R,quoteId:S.id});if(!L&&!B)throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${S.sourceChain.chainId}.`});let V=!1,H;if(!L&&B&&await N.readContract({address:I,abi:E,functionName:`allowance`,args:[A,B]})<z){V=!0;let e=T({abi:E,functionName:`approve`,args:[B,z]}),t=s(await p(N,{account:A,to:I,data:e},E,`Failed to estimate gas for ERC20 approval transaction.`),C?.estimateGasMarginBps);H={chainId:o(S.sourceChain.chainId),data:e,from:A,gas:t,to:I,value:0n,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}}}let U=j({approvalRequest:H,requiresApprovalSignature:V,signBatch:g.signBatch,sourceChainId:S.sourceChain.chainId,targetChainId:S.targetChain.chainId}),W=await h(l,{amountIn:S.amountIn.toString(),appId:d,minAmountOut:M.toString(),tokenIn:P,tokenOut:F,uuid:S.id});if(!x(W))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let G=(t,n=Date.now())=>{let r=S.sourceChain.chainId===S.targetChain.chainId;return{amountIn:S.amountIn,amountOut:S.amountOut,environment:f,fees:S.fees,fromAddress:S.fromAddress,id:S.id,partnerFeeBps:S.partnerFeeBps,sourceAsset:S.assetIn,sourceChain:S.sourceChain,status:`source-pending`,targetAsset:S.assetOut,targetChain:S.targetChain,toAddress:S.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(U&&H){let e={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:S,requiredSignatures:1},r=g.signBatch;if(!r)throw new i(`One-click batch signer is not available.`,n.SIGNING_FAILED);let a={chainId:o(S.sourceChain.chainId),data:W.data,from:A,gas:void 0,to:W.to,value:W.value,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}};k?.(e);try{let t=(await r([H,a],async e=>N.sendRawTransaction({serializedTransaction:e}),e)).at(-1);if(!t)throw new i(`One-click batch signing returned no transaction hashes.`,n.SIGNING_FAILED);return G(t)}catch(e){if(!O)throw e}}if(V&&H){let e={currentSignature:1,currentSignatureReason:t.AllowanceApproval,quote:S,requiredSignatures:2};k?.(e);let r=await g.sign(H,async e=>N.sendRawTransaction({serializedTransaction:e}),e);if((await N.waitForTransactionReceipt({hash:r})).status===`reverted`)return u(S,{environment:f,errorCode:n.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let K=await w({crossChain:R,fromAddress:A,feeUnitsMarginBps:C?.estimateGasMarginBps,sourceClient:N,swap:W}),q={chainId:o(S.sourceChain.chainId),data:W.data,from:A,gas:K,to:W.to,value:W.value,...C?.maxFeePerGas===void 0?null:{maxFeePerGas:C.maxFeePerGas,maxPriorityFeePerGas:C.maxPriorityFeePerGas}},J={currentSignature:V?2:1,currentSignatureReason:t.TokensTransfer,quote:S,requiredSignatures:V?2:1};k?.(J);let Y=Date.now();return G(await g.sign(q,async e=>N.sendRawTransaction({serializedTransaction:e}),J),Y)}async function A({apiOptions:a,appId:o,environment:s,solanaSigner:c,quote:u,onStepChange:d}){if(!c)throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!g(u.fromAddress))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let f=v({amountOut:u.amountOut,assetOut:u.assetOut,slippageBps:u.slippageBps}),p=_(u.assetIn,u.sourceChain.chainId),m=_(u.assetOut,u.targetChain.chainId),y=await h(a,{amountIn:u.amountIn.toString(),appId:o,minAmountOut:f.toString(),tokenIn:p,tokenOut:m,userPublicKey:u.fromAddress,uuid:u.id});if(!S(y))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,y.swapTransaction);let b=await C(y.swapTransaction,l({chain:u.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,b);let x={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:u,requiredSignatures:1};d?.(x);let w=Date.now(),T=await c.signAndSend({account:u.fromAddress,serializedTx:b},x),E=u.sourceChain.chainId.toLowerCase()!==u.targetChain.chainId.toLowerCase();return{amountIn:u.amountIn,amountOut:u.amountOut,environment:s,fees:u.fees,fromAddress:u.fromAddress,id:u.id,partnerFeeBps:u.partnerFeeBps,sourceAsset:u.assetIn,sourceChain:u.sourceChain,status:`source-pending`,targetAsset:u.assetOut,targetChain:u.targetChain,toAddress:u.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:E?2:32,startedAtMs:w,txHash:T}}}function j({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:i}){return d(r)&&d(i)&&r===i&&t&&e!==void 0&&typeof n==`function`}export{O as transferAssetFactory};
2
2
  //# sourceMappingURL=transfer-asset.js.map
@@ -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(),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])}),extra:n.z.boolean().optional()})).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`,`refunded`,`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(),bridgeHash:n.z.union([t.HashSchema,t.SolSignatureSchema]).nullable().optional(),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()}).nullable(),transferredTokens:n.z.array(n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),amount:n.z.coerce.bigint().nonnegative()})),debug:n.z.looseObject({messageId:n.z.string(),status:n.z.string(),destinationChain:n.z.string(),destinationTxHash:n.z.string(),relayTxHash:n.z.string(),retryCount:n.z.number().int().nonnegative(),lastRetryAt:n.z.iso.datetime(),sourceChain:n.z.string(),sourceTxHash:n.z.string(),createdAt:n.z.iso.datetime()}).partial().nullable().optional()}),_=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`);require(`viem`);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([t.EvmAddressSchema,t.SolAddressSchema,t.HyperliquidAddressSchema]),u=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`,`relay`]),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:l}),extra:n.z.boolean().optional()})).optional(),gasEstimate:n.z.coerce.bigint().nonnegative().optional(),recommendedSlippage:n.z.number().int().nonnegative(),tokenIn:l,tokenInDecimals:n.z.number().int().nonnegative().max(18),tokenOut:l,tokenOutDecimals:n.z.number().int().nonnegative().max(18),uuid:n.z.uuid()}),n.z.object({done:n.z.literal(!0)})]),d=n.z.object({data:t.HexSchema,to:t.EvmAddressSchema,value:n.z.coerce.bigint().nonnegative()}),f=n.z.object({chainType:n.z.literal(`svm`),swapTransaction:n.z.base64()}),p=n.z.union([d,f]),m=n.z.object({fee:n.z.int().nonnegative(),name:n.z.string()}),h=/[zZ]|[+-]\d{2}:?\d{2}$/,g=n.z.iso.datetime({local:!0}).refine(e=>{let t=h.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=>h.test(e)?e:`${e}Z`),_=n.z.object({messageId:n.z.string().nullable(),status:n.z.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`refunded`,`unknown`]),description:n.z.string(),sourceChain:n.z.object({name:n.z.string(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]),timestamp:g,finalized:g.or(n.z.boolean()).nullable()}),destinationChain:n.z.object({name:n.z.string().nullable(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]).nullable(),bridgeHash:n.z.union([t.HashSchema,t.SolSignatureSchema]).nullable().optional(),timestamp:g.nullable(),finalized:g.nullable()}),progress:n.z.object({committed:n.z.boolean(),commitTimestamp:g.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()}).nullable(),transferredTokens:n.z.array(n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),amount:n.z.coerce.bigint().nonnegative()})),debug:n.z.looseObject({messageId:n.z.string(),status:n.z.string(),destinationChain:n.z.string(),destinationTxHash:n.z.string(),relayTxHash:n.z.string(),retryCount:n.z.number().int().nonnegative(),lastRetryAt:n.z.iso.datetime(),sourceChain:n.z.string(),sourceTxHash:n.z.string(),createdAt:n.z.iso.datetime()}).partial().nullable().optional()}),v=n.z.object({address:t.EvmAddressSchema});exports.CrossChainStatusResponseSchema=_,exports.PartnerInfoResponseSchema=m,exports.QuoteResponseSchema=u,exports.SpenderAddressResponseSchema=v,exports.SupportedChainsResponseSchema=s,exports.SwapResponseSchema=p,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 * 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 /**\n * When `true`, indicates the fee is an additional fee on top of the input\n * amount that the user needs to pay. These fees need checked against the user's\n * balance to prevent insufficient balance errors.\n */\n extra?: boolean;\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 extra: z.boolean().optional(),\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 /** Swap expired, and funds were refunded (CCIP only) */\n | 'refunded'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /**\n * Cross-chain transaction identifier.\n *\n * For CCIP: The CCIP message ID.\n * For DeBridge: The DeBridge order ID.\n */\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 /**\n * Destination chain tx hash.\n *\n * - For direct transfers (USDC -> USDC): The CCIP bridge transaction hash.\n * - For successful swaps: The actual swap transaction hash from the relayer.\n * - For pending swaps: null (swap not yet executed).\n */\n transactionHash: Hash | Signature | null;\n /**\n * CCIP bridge tx hash (only present for swaps, not direct transfers).\n *\n * This is the transaction that delivered USDC to the destination chain via CCIP.\n * The `transactionHash` field contains the subsequent swap transaction.\n */\n bridgeHash?: 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 } | null;\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 * Debug information from Markr transaction API (only present for swaps that have been executed).\n *\n * Contains detailed information about the relayer execution, retry attempts, and transaction details.\n */\n debug?: Partial<{\n /** CCIP message ID */\n messageId: string;\n /** Execution status from relayer */\n status: string;\n /** Destination chain name */\n destinationChain: string;\n /** Destination swap transaction hash */\n destinationTxHash: string;\n /** Relay transaction hash */\n relayTxHash: string;\n /** Number of retry attempts */\n retryCount: number;\n /** Timestamp of last retry attempt (ISO 8601) */\n lastRetryAt: string;\n /** Source chain name */\n sourceChain: string;\n /** Source transaction hash */\n sourceTxHash: string;\n /** When the record was created (ISO 8601) */\n createdAt: string;\n }> | null;\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', 'refunded', '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 bridgeHash: z.union([HashSchema, SolSignatureSchema]).nullable().optional(),\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\n .object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n })\n .nullable(),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n debug: z\n .looseObject({\n messageId: z.string(),\n status: z.string(),\n destinationChain: z.string(),\n destinationTxHash: z.string(),\n relayTxHash: z.string(),\n retryCount: z.number().int().nonnegative(),\n lastRetryAt: z.iso.datetime(),\n sourceChain: z.string(),\n sourceTxHash: z.string(),\n createdAt: z.iso.datetime(),\n })\n .partial()\n .nullable()\n .optional(),\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.cjs","names":["z","isCaip2ChainId","EvmAddressSchema","SolAddressSchema","HyperliquidAddressSchema","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, type Hash } from 'viem';\nimport {\n EvmAddressSchema,\n HashSchema,\n HexSchema,\n HyperliquidAddressSchema,\n SolAddressSchema,\n SolSignatureSchema,\n} 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' | 'relay';\n /** Human-readable fee name */\n name: string;\n /** Fee amount in token's smallest unit */\n amount: bigint;\n /**\n * When `true`, indicates the fee is an additional fee on top of the input\n * amount that the user needs to pay. These fees need checked against the user's\n * balance to prevent insufficient balance errors.\n */\n extra?: boolean;\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\nconst MarkrQuoteTokenAddressSchema = z.union([EvmAddressSchema, SolAddressSchema, HyperliquidAddressSchema]);\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', 'relay']),\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: MarkrQuoteTokenAddressSchema,\n }),\n extra: z.boolean().optional(),\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: MarkrQuoteTokenAddressSchema,\n tokenInDecimals: z.number().int().nonnegative().max(18),\n tokenOut: MarkrQuoteTokenAddressSchema,\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 /** Swap expired, and funds were refunded (CCIP only) */\n | 'refunded'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /**\n * Cross-chain transaction identifier.\n *\n * For CCIP: The CCIP message ID.\n * For DeBridge: The DeBridge order ID.\n */\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 /**\n * Destination chain tx hash.\n *\n * - For direct transfers (USDC -> USDC): The CCIP bridge transaction hash.\n * - For successful swaps: The actual swap transaction hash from the relayer.\n * - For pending swaps: null (swap not yet executed).\n */\n transactionHash: Hash | Signature | null;\n /**\n * CCIP bridge tx hash (only present for swaps, not direct transfers).\n *\n * This is the transaction that delivered USDC to the destination chain via CCIP.\n * The `transactionHash` field contains the subsequent swap transaction.\n */\n bridgeHash?: 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 } | null;\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 * Debug information from Markr transaction API (only present for swaps that have been executed).\n *\n * Contains detailed information about the relayer execution, retry attempts, and transaction details.\n */\n debug?: Partial<{\n /** CCIP message ID */\n messageId: string;\n /** Execution status from relayer */\n status: string;\n /** Destination chain name */\n destinationChain: string;\n /** Destination swap transaction hash */\n destinationTxHash: string;\n /** Relay transaction hash */\n relayTxHash: string;\n /** Number of retry attempts */\n retryCount: number;\n /** Timestamp of last retry attempt (ISO 8601) */\n lastRetryAt: string;\n /** Source chain name */\n sourceChain: string;\n /** Source transaction hash */\n sourceTxHash: string;\n /** When the record was created (ISO 8601) */\n createdAt: string;\n }> | null;\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', 'refunded', '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 bridgeHash: z.union([HashSchema, SolSignatureSchema]).nullable().optional(),\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\n .object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n })\n .nullable(),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n debug: z\n .looseObject({\n messageId: z.string(),\n status: z.string(),\n destinationChain: z.string(),\n destinationTxHash: z.string(),\n relayTxHash: z.string(),\n retryCount: z.number().int().nonnegative(),\n lastRetryAt: z.iso.datetime(),\n sourceChain: z.string(),\n sourceTxHash: z.string(),\n createdAt: z.iso.datetime(),\n })\n .partial()\n .nullable()\n .optional(),\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(),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])}),extra:o.boolean().optional()})).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`,`refunded`,`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(),bridgeHash:o.union([n,a]).nullable().optional(),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()}).nullable(),transferredTokens:o.array(o.object({token:o.union([t,i]),amount:o.coerce.bigint().nonnegative()})),debug:o.looseObject({messageId:o.string(),status:o.string(),destinationChain:o.string(),destinationTxHash:o.string(),relayTxHash:o.string(),retryCount:o.number().int().nonnegative(),lastRetryAt:o.iso.datetime(),sourceChain:o.string(),sourceTxHash:o.string(),createdAt:o.iso.datetime()}).partial().nullable().optional()}),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,HyperliquidAddressSchema as i,SolAddressSchema as a,SolSignatureSchema as o}from"../service-schemas.js";import{z as s}from"zod";import"viem";const c=s.string().refine(t=>e(t),{message:`Invalid CAIP-2 chain ID`}).transform(e=>e),l=s.object({chainId:s.union([s.number(),s.string()]),chainType:s.string(),enabled_services:s.array(s.enum([`cross-chain-swap`,`cross-chain-quote`,`quote`,`swap`,`token-list`])),logo_url:s.url(),name:s.string(),lanes:s.array(s.union([s.coerce.number().int().nonnegative(),c]))}),u=l.extend({chainId:s.coerce.number().int().nonnegative(),chainType:s.literal(`evm`),router:t.optional(),wrapped_token:t.optional()}),d=l.extend({chainId:s.string().refine(t=>e(t)&&t.startsWith(`solana:`),{error:`Is not a valid Solana CAIP-2 ID`}).transform(e=>e),chainType:s.literal(`svm`)}),f=s.array(s.union([u,d,l.refine(e=>e.chainType!==`evm`&&e.chainType!==`svm`,`Known chain types must match their expected schema`)])),p=s.array(s.object({address:t,decimals:s.number().int().nonnegative().max(18),logo_url:s.url(),name:s.string(),symbol:s.string()})),m=s.union([t,a,i]),h=s.union([s.object({aggregator:s.object({id:s.string(),logo_url:s.url(),name:s.string()}),amountIn:s.coerce.bigint().nonnegative(),amountOut:s.coerce.bigint().nonnegative(),chainId:s.union([s.number().int().nonnegative(),c]),expiredAt:s.number().int().nonnegative(),fees:s.array(s.object({type:s.enum([`protocol`,`gas`,`bridge`,`slippage`,`swap`,`other`,`relay`]),name:s.string(),amount:s.coerce.bigint().nonnegative(),token:s.object({chainId:s.union([s.number().int().nonnegative(),c]),address:m}),extra:s.boolean().optional()})).optional(),gasEstimate:s.coerce.bigint().nonnegative().optional(),recommendedSlippage:s.number().int().nonnegative(),tokenIn:m,tokenInDecimals:s.number().int().nonnegative().max(18),tokenOut:m,tokenOutDecimals:s.number().int().nonnegative().max(18),uuid:s.uuid()}),s.object({done:s.literal(!0)})]),g=s.object({data:r,to:t,value:s.coerce.bigint().nonnegative()}),_=s.object({chainType:s.literal(`svm`),swapTransaction:s.base64()}),v=s.union([g,_]),y=s.object({fee:s.int().nonnegative(),name:s.string()}),b=/[zZ]|[+-]\d{2}:?\d{2}$/,x=s.iso.datetime({local:!0}).refine(e=>{let t=b.test(e)?e:`${e}Z`;return s.iso.datetime().safeParse(t).success},{error:`Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)`}).transform(e=>b.test(e)?e:`${e}Z`),S=s.object({messageId:s.string().nullable(),status:s.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`refunded`,`unknown`]),description:s.string(),sourceChain:s.object({name:s.string(),transactionHash:s.union([n,o]),timestamp:x,finalized:x.or(s.boolean()).nullable()}),destinationChain:s.object({name:s.string().nullable(),transactionHash:s.union([n,o]).nullable(),bridgeHash:s.union([n,o]).nullable().optional(),timestamp:x.nullable(),finalized:x.nullable()}),progress:s.object({committed:s.boolean(),commitTimestamp:x.nullable().optional(),executed:s.boolean()}),fees:s.object({token:s.union([t,a]).nullable(),amount:s.coerce.bigint().nonnegative().nullable()}).nullable(),transferredTokens:s.array(s.object({token:s.union([t,a]),amount:s.coerce.bigint().nonnegative()})),debug:s.looseObject({messageId:s.string(),status:s.string(),destinationChain:s.string(),destinationTxHash:s.string(),relayTxHash:s.string(),retryCount:s.number().int().nonnegative(),lastRetryAt:s.iso.datetime(),sourceChain:s.string(),sourceTxHash:s.string(),createdAt:s.iso.datetime()}).partial().nullable().optional()}),C=s.object({address:t});export{S as CrossChainStatusResponseSchema,y as PartnerInfoResponseSchema,h as QuoteResponseSchema,C as SpenderAddressResponseSchema,f as SupportedChainsResponseSchema,v as SwapResponseSchema,p 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 * 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 /**\n * When `true`, indicates the fee is an additional fee on top of the input\n * amount that the user needs to pay. These fees need checked against the user's\n * balance to prevent insufficient balance errors.\n */\n extra?: boolean;\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 extra: z.boolean().optional(),\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 /** Swap expired, and funds were refunded (CCIP only) */\n | 'refunded'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /**\n * Cross-chain transaction identifier.\n *\n * For CCIP: The CCIP message ID.\n * For DeBridge: The DeBridge order ID.\n */\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 /**\n * Destination chain tx hash.\n *\n * - For direct transfers (USDC -> USDC): The CCIP bridge transaction hash.\n * - For successful swaps: The actual swap transaction hash from the relayer.\n * - For pending swaps: null (swap not yet executed).\n */\n transactionHash: Hash | Signature | null;\n /**\n * CCIP bridge tx hash (only present for swaps, not direct transfers).\n *\n * This is the transaction that delivered USDC to the destination chain via CCIP.\n * The `transactionHash` field contains the subsequent swap transaction.\n */\n bridgeHash?: 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 } | null;\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 * Debug information from Markr transaction API (only present for swaps that have been executed).\n *\n * Contains detailed information about the relayer execution, retry attempts, and transaction details.\n */\n debug?: Partial<{\n /** CCIP message ID */\n messageId: string;\n /** Execution status from relayer */\n status: string;\n /** Destination chain name */\n destinationChain: string;\n /** Destination swap transaction hash */\n destinationTxHash: string;\n /** Relay transaction hash */\n relayTxHash: string;\n /** Number of retry attempts */\n retryCount: number;\n /** Timestamp of last retry attempt (ISO 8601) */\n lastRetryAt: string;\n /** Source chain name */\n sourceChain: string;\n /** Source transaction hash */\n sourceTxHash: string;\n /** When the record was created (ISO 8601) */\n createdAt: string;\n }> | null;\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', 'refunded', '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 bridgeHash: z.union([HashSchema, SolSignatureSchema]).nullable().optional(),\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\n .object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n })\n .nullable(),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n debug: z\n .looseObject({\n messageId: z.string(),\n status: z.string(),\n destinationChain: z.string(),\n destinationTxHash: z.string(),\n relayTxHash: z.string(),\n retryCount: z.number().int().nonnegative(),\n lastRetryAt: z.iso.datetime(),\n sourceChain: z.string(),\n sourceTxHash: z.string(),\n createdAt: z.iso.datetime(),\n })\n .partial()\n .nullable()\n .optional(),\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, type Hash } from 'viem';\nimport {\n EvmAddressSchema,\n HashSchema,\n HexSchema,\n HyperliquidAddressSchema,\n SolAddressSchema,\n SolSignatureSchema,\n} 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' | 'relay';\n /** Human-readable fee name */\n name: string;\n /** Fee amount in token's smallest unit */\n amount: bigint;\n /**\n * When `true`, indicates the fee is an additional fee on top of the input\n * amount that the user needs to pay. These fees need checked against the user's\n * balance to prevent insufficient balance errors.\n */\n extra?: boolean;\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\nconst MarkrQuoteTokenAddressSchema = z.union([EvmAddressSchema, SolAddressSchema, HyperliquidAddressSchema]);\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', 'relay']),\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: MarkrQuoteTokenAddressSchema,\n }),\n extra: z.boolean().optional(),\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: MarkrQuoteTokenAddressSchema,\n tokenInDecimals: z.number().int().nonnegative().max(18),\n tokenOut: MarkrQuoteTokenAddressSchema,\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 /** Swap expired, and funds were refunded (CCIP only) */\n | 'refunded'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /**\n * Cross-chain transaction identifier.\n *\n * For CCIP: The CCIP message ID.\n * For DeBridge: The DeBridge order ID.\n */\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 /**\n * Destination chain tx hash.\n *\n * - For direct transfers (USDC -> USDC): The CCIP bridge transaction hash.\n * - For successful swaps: The actual swap transaction hash from the relayer.\n * - For pending swaps: null (swap not yet executed).\n */\n transactionHash: Hash | Signature | null;\n /**\n * CCIP bridge tx hash (only present for swaps, not direct transfers).\n *\n * This is the transaction that delivered USDC to the destination chain via CCIP.\n * The `transactionHash` field contains the subsequent swap transaction.\n */\n bridgeHash?: 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 } | null;\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 * Debug information from Markr transaction API (only present for swaps that have been executed).\n *\n * Contains detailed information about the relayer execution, retry attempts, and transaction details.\n */\n debug?: Partial<{\n /** CCIP message ID */\n messageId: string;\n /** Execution status from relayer */\n status: string;\n /** Destination chain name */\n destinationChain: string;\n /** Destination swap transaction hash */\n destinationTxHash: string;\n /** Relay transaction hash */\n relayTxHash: string;\n /** Number of retry attempts */\n retryCount: number;\n /** Timestamp of last retry attempt (ISO 8601) */\n lastRetryAt: string;\n /** Source chain name */\n sourceChain: string;\n /** Source transaction hash */\n sourceTxHash: string;\n /** When the record was created (ISO 8601) */\n createdAt: string;\n }> | null;\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', 'refunded', '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 bridgeHash: z.union([HashSchema, SolSignatureSchema]).nullable().optional(),\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\n .object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n })\n .nullable(),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n debug: z\n .looseObject({\n messageId: z.string(),\n status: z.string(),\n destinationChain: z.string(),\n destinationTxHash: z.string(),\n relayTxHash: z.string(),\n retryCount: z.number().int().nonnegative(),\n lastRetryAt: z.iso.datetime(),\n sourceChain: z.string(),\n sourceTxHash: z.string(),\n createdAt: z.iso.datetime(),\n })\n .partial()\n .nullable()\n .optional(),\n});\n\nexport interface SpenderAddressResponse {\n address: EvmAddress;\n}\n\nexport const SpenderAddressResponseSchema: z.ZodType<SpenderAddressResponse> = z.object({\n address: EvmAddressSchema,\n});\n"],"mappings":"8PAsDA,MAAa,EAA8C,EACxD,QAAQ,CACR,OAAQ,GAAU,EAAe,EAAM,CAAE,CACxC,QAAS,0BACV,CAAC,CACD,UAAW,GAAU,EAAsB,CAExC,EAAwC,EAAE,OAAO,CACrD,QAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAE,EAAE,QAAQ,CAAC,CAAC,CAC1C,UAAW,EAAE,QAAQ,CACrB,iBAAkB,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAoB,oBAAqB,QAAS,OAAQ,aAAa,CAAC,CAAC,CAC3G,SAAU,EAAE,KAAK,CACjB,KAAM,EAAE,QAAQ,CAChB,MAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAE,EAAmB,CAAC,CAAC,CACrF,CAAC,CAEI,EACJ,EAAsC,OAAO,CAC3C,QAAS,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,aAAa,CAC9C,UAAW,EAAE,QAAQ,MAAM,CAC3B,OAAQ,EAAiB,UAAU,CACnC,cAAe,EAAiB,UAAU,CAC3C,CAAC,CAEE,EACJ,EAAsC,OAAO,CAC3C,QAAS,EACN,QAAQ,CACR,OAAQ,GAAU,EAAe,EAAM,EAAI,EAAM,WAAW,UAAU,CAAE,CACvE,MAAO,kCACR,CAAC,CACD,UAAW,GAAU,EAAsB,CAC9C,UAAW,EAAE,QAAQ,MAAM,CAC5B,CAAC,CAOS,EAAoE,EAAE,MACjF,EAAE,MAAM,CACN,EACA,EACA,EAAsC,OACnC,GAAS,EAAK,YAAc,OAAS,EAAK,YAAc,MACzD,qDACD,CACF,CAAC,CACH,CAeY,EAAwD,EAAE,MACrE,EAAE,OAAO,CACP,QAAS,EACT,SAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,CAChD,SAAU,EAAE,KAAK,CACjB,KAAM,EAAE,QAAQ,CAChB,OAAQ,EAAE,QAAQ,CACnB,CAAC,CACH,CAuDK,EAA+B,EAAE,MAAM,CAAC,EAAkB,EAAkB,EAAyB,CAAC,CAO/F,EAAgD,EAAE,MAAM,CACnE,EAAE,OAAO,CACP,WAAY,EAAE,OAAO,CACnB,GAAI,EAAE,QAAQ,CACd,SAAU,EAAE,KAAK,CACjB,KAAM,EAAE,QAAQ,CACjB,CAAC,CACF,SAAU,EAAE,OAAO,QAAQ,CAAC,aAAa,CACzC,UAAW,EAAE,OAAO,QAAQ,CAAC,aAAa,CAC1C,QAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAE,EAAmB,CAAC,CAItE,UAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CACzC,KAAM,EACH,MACC,EAAE,OAAO,CACP,KAAM,EAAE,KAAK,CAAC,WAAY,MAAO,SAAU,WAAY,OAAQ,QAAS,QAAQ,CAAC,CACjF,KAAM,EAAE,QAAQ,CAChB,OAAQ,EAAE,OAAO,QAAQ,CAAC,aAAa,CACvC,MAAO,EAAE,OAAO,CACd,QAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAE,EAAmB,CAAC,CACtE,QAAS,EACV,CAAC,CACF,MAAO,EAAE,SAAS,CAAC,UAAU,CAC9B,CAAC,CACH,CACA,UAAU,CAOb,YAAa,EAAE,OAAO,QAAQ,CAAC,aAAa,CAAC,UAAU,CAEvD,oBAAqB,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CACnD,QAAS,EACT,gBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,CACvD,SAAU,EACV,iBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,GAAG,CACxD,KAAM,EAAE,MAAM,CACf,CAAC,CACF,EAAE,OAAO,CACP,KAAM,EAAE,QAAQ,GAAK,CACtB,CAAC,CACH,CAAC,CAaW,EAAkF,EAAE,OAAO,CACtG,KAAM,EACN,GAAI,EACJ,MAAO,EAAE,OAAO,QAAQ,CAAC,aAAa,CACvC,CAAC,CAYW,EAAgF,EAAE,OAAO,CACpG,UAAW,EAAE,QAAQ,MAAM,CAC3B,gBAAiB,EAAE,QAAQ,CAC5B,CAAC,CAIW,EAA8C,EAAE,MAAM,CACjE,EACA,EACD,CAAC,CAUW,EAA4D,EAAE,OAAO,CAChF,IAAK,EAAE,KAAK,CAAC,aAAa,CAC1B,KAAM,EAAE,QAAQ,CACjB,CAAC,CA8HI,EAAqC,yBAIrC,EAAW,EAAE,IAChB,SAAS,CAAE,MAAO,GAAM,CAAC,CACzB,OACE,GAAU,CAIT,IAAM,EADc,EAAmC,KAAK,EAAM,CAClC,EAAQ,GAAG,EAAM,GAEjD,OAAO,EAAE,IAAI,UAAU,CAAC,UAAU,EAAU,CAAC,SAE/C,CACE,MAAO,gFACR,CACF,CACA,UAAW,GACU,EAAmC,KAAK,EAAM,CAC7C,EAAQ,GAAG,EAAM,GACtC,CAES,EAAsE,EAAE,OAAO,CAC1F,UAAW,EAAE,QAAQ,CAAC,UAAU,CAChC,OAAQ,EAAE,KAAK,CAAC,UAAW,YAAa,oBAAqB,YAAa,SAAU,WAAY,UAAU,CAAC,CAC3G,YAAa,EAAE,QAAQ,CACvB,YAAa,EAAE,OAAO,CACpB,KAAM,EAAE,QAAQ,CAChB,gBAAiB,EAAE,MAAM,CAAC,EAAY,EAAmB,CAAC,CAC1D,UAAW,EACX,UAAW,EAAS,GAAG,EAAE,SAAS,CAAC,CAAC,UAAU,CAC/C,CAAC,CACF,iBAAkB,EAAE,OAAO,CACzB,KAAM,EAAE,QAAQ,CAAC,UAAU,CAC3B,gBAAiB,EAAE,MAAM,CAAC,EAAY,EAAmB,CAAC,CAAC,UAAU,CACrE,WAAY,EAAE,MAAM,CAAC,EAAY,EAAmB,CAAC,CAAC,UAAU,CAAC,UAAU,CAC3E,UAAW,EAAS,UAAU,CAC9B,UAAW,EAAS,UAAU,CAC/B,CAAC,CACF,SAAU,EAAE,OAAO,CACjB,UAAW,EAAE,SAAS,CACtB,gBAAiB,EAAS,UAAU,CAAC,UAAU,CAC/C,SAAU,EAAE,SAAS,CACtB,CAAC,CACF,KAAM,EACH,OAAO,CACN,MAAO,EAAE,MAAM,CAAC,EAAkB,EAAiB,CAAC,CAAC,UAAU,CAC/D,OAAQ,EAAE,OAAO,QAAQ,CAAC,aAAa,CAAC,UAAU,CACnD,CAAC,CACD,UAAU,CACb,kBAAmB,EAAE,MACnB,EAAE,OAAO,CACP,MAAO,EAAE,MAAM,CAAC,EAAkB,EAAiB,CAAC,CACpD,OAAQ,EAAE,OAAO,QAAQ,CAAC,aAAa,CACxC,CAAC,CACH,CACD,MAAO,EACJ,YAAY,CACX,UAAW,EAAE,QAAQ,CACrB,OAAQ,EAAE,QAAQ,CAClB,iBAAkB,EAAE,QAAQ,CAC5B,kBAAmB,EAAE,QAAQ,CAC7B,YAAa,EAAE,QAAQ,CACvB,WAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa,CAC1C,YAAa,EAAE,IAAI,UAAU,CAC7B,YAAa,EAAE,QAAQ,CACvB,aAAc,EAAE,QAAQ,CACxB,UAAW,EAAE,IAAI,UAAU,CAC5B,CAAC,CACD,SAAS,CACT,UAAU,CACV,UAAU,CACd,CAAC,CAMW,EAAkE,EAAE,OAAO,CACtF,QAAS,EACV,CAAC"}