New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@avalabs/bridge-unified

Package Overview
Dependencies
Maintainers
1
Versions
188
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@avalabs/bridge-unified - npm Package Compare versions

Comparing version 0.0.0-feat-unified-api-interface-20231128161004 to 0.0.0-feat-unified-api-interface-20231128185332

2

CHANGELOG.md
# @avalabs/unified-bridge
## 0.0.0-feat-unified-api-interface-20231128161004
## 0.0.0-feat-unified-api-interface-20231128185332

@@ -5,0 +5,0 @@ ### Major Changes

import { merge } from 'lodash';
import { custom, http, createWalletClient, publicActions, encodeFunctionData, decodeEventLog } from 'viem';
var I=(r=>(r.NATIVE="native",r.ERC20="erc20",r))(I||{});var h=(n=>(n.CCTP="cctp",n))(h||{});var E=(r=>(r.PROD="production",r.TEST="test",r))(E||{});var z={test:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.test.json",production:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.json"},R=async e=>{try{return await(await fetch(z[e])).json()}catch(n){throw new Error(`Error while fetching CCTP config: ${n.message}`)}},x=e=>{switch(e){case 43114:case 43113:return 1e3;default:return 2e4}};async function S(e){await e.ensureHasConfig();let n=e.config.map(r=>r.chainId);return e.config.reduce((r,s)=>(r[s.chainId]=s.tokens.map(p=>({...p,type:"erc20",destinations:n.reduce((t,o)=>(s.chainId!==o&&(t[o]||(t[o]=[]),t[o]?.push("cctp")),t),{})})),r),{})}var J=e=>({id:e.chainId,name:e.chainName,nativeCurrency:{decimals:e.networkToken.decimals,symbol:e.networkToken.symbol,name:e.networkToken.name},network:e.chainName,rpcUrls:{default:{http:[e.rpcUrl]},public:{http:[e.rpcUrl]}},...e.utilityAddresses.multicall&&{contracts:{multicall3:{address:e.utilityAddresses.multicall}}}}),f=({chain:e,provider:n})=>{let r=J(e),s=n?custom(n):http(e.rpcUrl);return createWalletClient({chain:r,transport:s}).extend(publicActions)};var g=[{inputs:[{internalType:"address",name:"circleTokenMessenger_",type:"address"},{internalType:"address",name:"burnToken_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"AlreadyAdmin",type:"error"},{inputs:[],name:"AlreadyFeeCollector",type:"error"},{inputs:[],name:"AlreadySupportedBurnToken",type:"error"},{inputs:[],name:"AmountLessThanFee",type:"error"},{inputs:[],name:"BalanceNotIncreased",type:"error"},{inputs:[],name:"CannotRemoveLastAdmin",type:"error"},{inputs:[],name:"FeePercentageGreaterThanMax",type:"error"},{inputs:[],name:"InvalidAdminAddress",type:"error"},{inputs:[],name:"InvalidFeeCollector",type:"error"},{inputs:[],name:"InvalidMintRecipientAddress",type:"error"},{inputs:[],name:"InvalidTokenAddress",type:"error"},{inputs:[],name:"InvalidTokenMessengerAddress",type:"error"},{inputs:[],name:"MaxFeeLessThanMinFee",type:"error"},{inputs:[],name:"NotAdmin",type:"error"},{inputs:[],name:"NotFeeCollector",type:"error"},{inputs:[],name:"UnSupportedBurnToken",type:"error"},{inputs:[],name:"UnsupportedDomain",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"BurnTokenAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"BurnTokenRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"feeCollector",type:"address"}],name:"FeeCollectorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"feeCollector",type:"address"}],name:"FeeCollectorRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint32",name:"domain",type:"uint32"},{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],indexed:!1,internalType:"struct FeeCalculator.FeeConfiguration",name:"feeConfiguration",type:"tuple"}],name:"FeeConfigurationUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"account",type:"address"}],name:"Paused",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint64",name:"nonce",type:"uint64"},{indexed:!1,internalType:"address",name:"burnToken",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"depositor",type:"address"},{indexed:!1,internalType:"address",name:"mintRecipient",type:"address"},{indexed:!1,internalType:"uint32",name:"destinationDomain",type:"uint32"},{indexed:!1,internalType:"uint256",name:"totalFee",type:"uint256"}],name:"TransferTokens",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"account",type:"address"}],name:"Unpaused",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"addAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"feeCollector",type:"address"}],name:"addFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"addSupportedBurnToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint32",name:"destinationDomain",type:"uint32"}],name:"calculateFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"circleTokenMessenger",outputs:[{internalType:"contract ICircleTokenMessenger",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"circleTokenMessengerAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"collectFees",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"getFeeAmounts",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getFeeConfiguration",outputs:[{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],internalType:"struct FeeCalculator.FeeConfiguration",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getFeePercentage",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getMaxFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getMinFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getTxnFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isFeeCollector",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"isSupportedBurnToken",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"isSupportedDomain",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"pause",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"paused",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"removeAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"feeCollector",type:"address"}],name:"removeFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"removeSupportedBurnToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"},{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],internalType:"struct FeeCalculator.FeeConfiguration",name:"feeConfiguration",type:"tuple"}],name:"setFeeConfiguration",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"supportedBurnTokens",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint32",name:"destinationDomain",type:"uint32"},{internalType:"address",name:"mintRecipient",type:"address"},{internalType:"address",name:"burnToken",type:"address"}],name:"transferTokens",outputs:[{internalType:"uint64",name:"nonce",type:"uint64"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"unpause",outputs:[],stateMutability:"nonpayable",type:"function"}];var b=({sourceChain:e,targetChain:n,amount:r,asset:s},p)=>{if(e.chainId===n.chainId)throw new Error("Source and target chains are the same");if(r<=0n)throw new Error("Amount must be greater than zero");let t=p.find(i=>i.chainId===e.chainId);if(!t)throw new Error(`Not supported on source chain "${e.chainId}"`);let o=p.find(i=>i.chainId===n.chainId);if(!o)throw new Error(`Not supported on target chain "${n.chainId}"`);let u=t.tokens.find(i=>i.symbol===s.symbol),c=o.tokens.find(i=>i.symbol===s.symbol);if(!u||!c)throw new Error(`Not supported asset "${s.symbol}"`);return {sourceChainData:t,targetChainData:o,burnToken:u,mintToken:c}};async function N(e,n){await e.ensureHasConfig();let{sourceChain:r,targetChain:s,asset:p,amount:t,provider:o}=n,{sourceChainData:u,targetChainData:c,burnToken:i}=b({sourceChain:r,targetChain:s,asset:p,amount:t},e.config),d=await f({chain:r,provider:o}).readContract({address:u.tokenRouterAddress,abi:g,functionName:"calculateFee",args:[t,c.domain]});return {[i.address]:d}}var v=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}];var Q=async(e,n)=>{let{sourceChain:r,targetChain:s,asset:p,amount:t,addressC:o,sourceProvider:u}=n,{sourceChainData:c,targetChainData:i,burnToken:a}=b({sourceChain:r,targetChain:s,asset:p,amount:t},e.config),d=f({chain:r,provider:u});if(await d.readContract({address:a.address,abi:v,functionName:"allowance",args:[o,c.tokenRouterAddress]})<t)if(u.sign){let m=encodeFunctionData({abi:v,functionName:"approve",args:[c.tokenRouterAddress,t]}),l=await u.sign({from:o,to:a.address,data:m}),T=await d.sendRawTransaction({serializedTransaction:l});await d.waitForTransactionReceipt({hash:T,pollingInterval:1e3});}else {let{request:m}=await d.simulateContract({account:o,address:a.address,abi:v,functionName:"approve",args:[c.tokenRouterAddress,t]}),l=await d.writeContract(m);await d.waitForTransactionReceipt({hash:l,pollingInterval:1e3});}if(u.sign){let m=encodeFunctionData({abi:g,functionName:"transferTokens",args:[t,i.domain,o,a.address]}),l=await u.sign({from:o,to:c.tokenRouterAddress,data:m});return d.sendRawTransaction({serializedTransaction:l})}else {let{request:m}=await d.simulateContract({account:o,address:c.tokenRouterAddress,abi:g,functionName:"transferTokens",args:[t,i.domain,o,a.address]});return d.writeContract(m)}};async function _(e,n,r){await e.ensureHasConfig();let{minimumConfirmations:s}=e.config.find(d=>d.chainId===n.sourceChain.chainId)??{},{minimumConfirmations:p}=e.config.find(d=>d.chainId===n.targetChain.chainId)??{};if(!s||!p)throw new Error("BridgeTransfer: unable to determine required confirmation counts for the given chains.");let t=await e.getFees({...n,provider:n.sourceProvider}),o=(n.asset.address&&t[n.asset.address])??0n,u=await Q(e,n),c=Date.now(),a=await f({chain:n.targetChain,provider:n.targetProvider}).getBlockNumber();return {type:e.type,environment:r,addressC:n.addressC,addressBtc:n.addressBtc,amount:n.amount,symbol:n.asset.symbol,bridgeFee:o,sourceChain:n.sourceChain,sourceStartedAt:c,sourceTxHash:u,sourceConfirmationCount:0,requiredSourceConfirmationCount:s,targetChain:n.targetChain,targetConfirmationCount:0,requiredTargetConfirmationCount:p,startBlockNumber:a}}async function H(e){if(!e.config&&(await e.updateConfig(),!e.config))throw new Error("Config is not available")}var k=(e,n)=>e.gasPrice&&BigInt(e.gasPrice*n.gasUsed);var A=async e=>new Promise(n=>{setTimeout(n,e);});var B=({promise:e,delay:n})=>{let r=!1,s=!1,p=0,t,o,u=a=>{t&&r&&(r=!1,t(a));},c=()=>{s=!0,o&&r&&(r=!1,o("cancelled"));};return {result:new Promise((a,d)=>{r=!0,t=a,o=d;let y=async()=>{if(!(!r||s)){try{await e(u),await A(n);}catch(m){console.error(m.message),p+=1,await A(2**p*n);}await y();}};y();}),cancel:c}};var L=1e3*60*60*3,U=1024n,Y=async(e,n)=>{let{sourceProvider:r,targetProvider:s,updateListener:p,bridgeTransfer:t}=n,o=f({chain:t.sourceChain,provider:r}),u=e.find(y=>y.chainId===t.sourceChain.chainId),c=f({chain:t.targetChain,provider:s}),i=e.find(y=>y.chainId===t.targetChain.chainId),a={...t};if(!u)throw new Error(`BridgeTransfer: unknown source chain "${t.sourceChain.chainId}"`);if(!i)throw new Error(`BridgeTransfer: unknown target chain "${t.targetChain.chainId}"`);return B({promise:async y=>{if(a.completedAt||a.metadata?.nonce)return y(a);if(a.sourceStartedAt+L<=Date.now())return a.completedAt=Date.now(),a.error="timeout",y(a);let m=await o.getTransactionReceipt({hash:a.sourceTxHash});if(!a.sourceNetworkFee){let C=await o.getTransaction({hash:a.sourceTxHash}),w=k(C,m);w&&(a.sourceNetworkFee=w,p(a));}if(m.status==="reverted")return a.completedAt=Date.now(),a.error=`source transaction "${a.sourceTxHash}" reverted`,y(a);let l=await o.getTransactionConfirmations({hash:a.sourceTxHash}),T=l>a.sourceConfirmationCount,P=l>=a.requiredSourceConfirmationCount;if(T&&(a.sourceConfirmationCount=Number(l),P||(a.startBlockNumber=await c.getBlockNumber()),p(a)),!P)return;let M=m.logs.find(C=>C.address===u.tokenRouterAddress?decodeEventLog({abi:g,...C}).eventName==="TransferTokens":!1);if(!M)throw new Error(`BridgeTransfer: can't find a TransferTokens event in source transaction "${a.sourceTxHash}"`);let j=decodeEventLog({abi:g,eventName:"TransferTokens",...M}).args.nonce;return a.targetStartedAt=Date.now(),a.metadata={nonce:j},p(a),y(a)},delay:x(u.chainId)})},Z=async(e,n)=>{let{targetProvider:r,updateListener:s,bridgeTransfer:p}=n,t={...p};if(!p.completedAt&&!p.metadata?.nonce)throw new Error("BridgeTransfer: nonce is missing");if(!p.startBlockNumber)throw new Error("BridgeTransfer: startBlockNumber is missing");let o=f({chain:p.targetChain,provider:r}),u=e.find(i=>i.chainId===p.targetChain.chainId);if(!u)throw new Error(`BridgeTransfer: unknown target chain "${p.targetChain.chainId}"`);return B({promise:async i=>{if(t.completedAt)return i(t);if(t.sourceStartedAt+L<=Date.now())return t.completedAt=Date.now(),t.error="timeout",i(t);if(!t.targetTxHash){let l=await o.getLogs({address:u.messageTransmitterAddress,event:{name:"MessageReceived",type:"event",inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"uint32",name:"sourceDomain",type:"uint32"},{indexed:!0,internalType:"uint64",name:"nonce",type:"uint64"},{indexed:!1,internalType:"bytes32",name:"sender",type:"bytes32"},{indexed:!1,internalType:"bytes",name:"messageBody",type:"bytes"}]},args:{nonce:t.metadata.nonce},fromBlock:t.startBlockNumber-U,toBlock:t.startBlockNumber+U});if(l[0]?.transactionHash)t.targetTxHash=l[0].transactionHash,s(t);else return}let a=await o.getTransactionReceipt({hash:t.targetTxHash});if(!t.targetNetworkFee){let l=await o.getTransaction({hash:t.targetTxHash}),T=k(l,a);T&&(t.targetNetworkFee=T,s(t));}if(a.status==="reverted")return t.completedAt=Date.now(),t.error=`target transaction "${t.targetTxHash}" reverted`,i(t);let d=await o.getTransactionConfirmations({hash:t.targetTxHash}),y=d>t.targetConfirmationCount,m=d>=t.requiredTargetConfirmationCount;if(y&&(t.targetConfirmationCount=Number(d),s(t)),!!m)return t.completedAt=Date.now(),s(t),i(t)},delay:x(u.chainId)})};function $(e,n){let r;return {result:(async()=>{await e.ensureHasConfig();let{result:p,cancel:t}=await Y(e.config,n);r=t;let o=await p,{result:u,cancel:c}=await Z(e.config,{...n,bridgeTransfer:o});return r=c,u})(),cancel:r}}var q=e=>({type:"cctp",config:null,updateConfig:async function(){this.config=await R(e);},ensureHasConfig:async function(){return H(this)},getAssets:async function(){return S(this)},getFees:async function(n){return N(this,n)},transferAsset:async function(n){return _(this,n,e)},trackTransfer:function(n){return $(this,n)}});var ee=new Map([["cctp",q]]),K=(e,n)=>new Map([...ee].filter(([r])=>!n?.includes(r)).map(([r,s])=>[r,s(e)])),F=(e,n,r)=>{let s=n.destinations[r]?.find(p=>e.has(p));if(!s)throw new Error(`No enabled implementation found for transfering ${n.symbol} to ${r}`);return {type:s,bridge:e.get(s)}};var ut=({environment:e,disabledBridgeTypes:n})=>{let r=K(e,n),s=async()=>Promise.all(Array.from(r).map(([,i])=>i.updateConfig()));return {bridges:r,init:async()=>{await s();},updateConfigs:s,getAssets:async()=>(await Promise.all(Array.from(r).map(([,a])=>a.getAssets()))).flat().reduce(merge),getFees:async i=>{let{bridge:a}=F(r,i.asset,i.targetChain.chainId);return a.getFees(i)},transferAsset:async i=>{let{bridge:a}=F(r,i.asset,i.targetChain.chainId);return a.transferAsset(i)},trackTransfer:i=>{let a=r.get(i.bridgeTransfer.type);if(!a)throw new Error(`No enabled implementation found for tracking ${i.bridgeTransfer.type} transactions.`);return a.trackTransfer(i)}}};
var I=(a=>(a.NATIVE="native",a.ERC20="erc20",a))(I||{});var C=(n=>(n.CCTP="cctp",n))(C||{});var E=(a=>(a.PROD="production",a.TEST="test",a))(E||{});var z={test:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.test.json",production:"https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.json"},N=async e=>{try{return await(await fetch(z[e])).json()}catch(n){throw new Error(`Error while fetching CCTP config: ${n.message}`)}},k=e=>{switch(e){case 43114:case 43113:return 1e3;default:return 2e4}};async function R(e){await e.ensureHasConfig();let n=e.config.map(a=>a.chainId);return e.config.reduce((a,s)=>(a[s.chainId]=s.tokens.map(p=>({...p,type:"erc20",destinations:n.reduce((t,o)=>(s.chainId!==o&&(t[o]||(t[o]=[]),t[o]?.push("cctp")),t),{})})),a),{})}var J=e=>({id:e.chainId,name:e.chainName,nativeCurrency:{decimals:e.networkToken.decimals,symbol:e.networkToken.symbol,name:e.networkToken.name},network:e.chainName,rpcUrls:{default:{http:[e.rpcUrl]},public:{http:[e.rpcUrl]}},...e.utilityAddresses.multicall&&{contracts:{multicall3:{address:e.utilityAddresses.multicall}}}}),f=({chain:e,provider:n})=>{let a=J(e),s=n?custom(n):http(e.rpcUrl,{batch:!0,retryCount:0});return createWalletClient({chain:a,transport:s}).extend(publicActions)};var g=[{inputs:[{internalType:"address",name:"circleTokenMessenger_",type:"address"},{internalType:"address",name:"burnToken_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[],name:"AlreadyAdmin",type:"error"},{inputs:[],name:"AlreadyFeeCollector",type:"error"},{inputs:[],name:"AlreadySupportedBurnToken",type:"error"},{inputs:[],name:"AmountLessThanFee",type:"error"},{inputs:[],name:"BalanceNotIncreased",type:"error"},{inputs:[],name:"CannotRemoveLastAdmin",type:"error"},{inputs:[],name:"FeePercentageGreaterThanMax",type:"error"},{inputs:[],name:"InvalidAdminAddress",type:"error"},{inputs:[],name:"InvalidFeeCollector",type:"error"},{inputs:[],name:"InvalidMintRecipientAddress",type:"error"},{inputs:[],name:"InvalidTokenAddress",type:"error"},{inputs:[],name:"InvalidTokenMessengerAddress",type:"error"},{inputs:[],name:"MaxFeeLessThanMinFee",type:"error"},{inputs:[],name:"NotAdmin",type:"error"},{inputs:[],name:"NotFeeCollector",type:"error"},{inputs:[],name:"UnSupportedBurnToken",type:"error"},{inputs:[],name:"UnsupportedDomain",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"admin",type:"address"}],name:"AdminRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"BurnTokenAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"BurnTokenRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"feeCollector",type:"address"}],name:"FeeCollectorAdded",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"feeCollector",type:"address"}],name:"FeeCollectorRemoved",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint32",name:"domain",type:"uint32"},{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],indexed:!1,internalType:"struct FeeCalculator.FeeConfiguration",name:"feeConfiguration",type:"tuple"}],name:"FeeConfigurationUpdated",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"account",type:"address"}],name:"Paused",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint64",name:"nonce",type:"uint64"},{indexed:!1,internalType:"address",name:"burnToken",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"depositor",type:"address"},{indexed:!1,internalType:"address",name:"mintRecipient",type:"address"},{indexed:!1,internalType:"uint32",name:"destinationDomain",type:"uint32"},{indexed:!1,internalType:"uint256",name:"totalFee",type:"uint256"}],name:"TransferTokens",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"account",type:"address"}],name:"Unpaused",type:"event"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"addAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"feeCollector",type:"address"}],name:"addFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"addSupportedBurnToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint32",name:"destinationDomain",type:"uint32"}],name:"calculateFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"circleTokenMessenger",outputs:[{internalType:"contract ICircleTokenMessenger",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"circleTokenMessengerAddress",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"collectFees",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"getFeeAmounts",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getFeeConfiguration",outputs:[{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],internalType:"struct FeeCalculator.FeeConfiguration",name:"",type:"tuple"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getFeePercentage",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getMaxFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getMinFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"getTxnFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isAdmin",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"isFeeCollector",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"isSupportedBurnToken",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"}],name:"isSupportedDomain",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"pause",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"paused",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"removeAdmin",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"feeCollector",type:"address"}],name:"removeFeeCollector",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"token",type:"address"}],name:"removeSupportedBurnToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint32",name:"domain",type:"uint32"},{components:[{internalType:"uint256",name:"maxFee",type:"uint256"},{internalType:"uint256",name:"minFee",type:"uint256"},{internalType:"uint32",name:"feePercentage",type:"uint32"},{internalType:"uint256",name:"txnFee",type:"uint256"},{internalType:"bool",name:"supported",type:"bool"}],internalType:"struct FeeCalculator.FeeConfiguration",name:"feeConfiguration",type:"tuple"}],name:"setFeeConfiguration",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"",type:"address"}],name:"supportedBurnTokens",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint32",name:"destinationDomain",type:"uint32"},{internalType:"address",name:"mintRecipient",type:"address"},{internalType:"address",name:"burnToken",type:"address"}],name:"transferTokens",outputs:[{internalType:"uint64",name:"nonce",type:"uint64"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"unpause",outputs:[],stateMutability:"nonpayable",type:"function"}];var h=({sourceChain:e,targetChain:n,amount:a,asset:s},p)=>{if(e.chainId===n.chainId)throw new Error("Source and target chains are the same");if(a<=0n)throw new Error("Amount must be greater than zero");let t=p.find(i=>i.chainId===e.chainId);if(!t)throw new Error(`Not supported on source chain "${e.chainId}"`);let o=p.find(i=>i.chainId===n.chainId);if(!o)throw new Error(`Not supported on target chain "${n.chainId}"`);let u=t.tokens.find(i=>i.symbol===s.symbol),c=o.tokens.find(i=>i.symbol===s.symbol);if(!u||!c)throw new Error(`Not supported asset "${s.symbol}"`);return {sourceChainData:t,targetChainData:o,burnToken:u,mintToken:c}};async function S(e,n){await e.ensureHasConfig();let{sourceChain:a,targetChain:s,asset:p,amount:t,provider:o}=n,{sourceChainData:u,targetChainData:c,burnToken:i}=h({sourceChain:a,targetChain:s,asset:p,amount:t},e.config),d=await f({chain:a,provider:o}).readContract({address:u.tokenRouterAddress,abi:g,functionName:"calculateFee",args:[t,c.domain]});return {[i.address]:d}}var v=[{constant:!0,inputs:[],name:"name",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_spender",type:"address"},{name:"_value",type:"uint256"}],name:"approve",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"totalSupply",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_from",type:"address"},{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transferFrom",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[],name:"decimals",outputs:[{name:"",type:"uint8"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"}],name:"balanceOf",outputs:[{name:"balance",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{constant:!0,inputs:[],name:"symbol",outputs:[{name:"",type:"string"}],payable:!1,stateMutability:"view",type:"function"},{constant:!1,inputs:[{name:"_to",type:"address"},{name:"_value",type:"uint256"}],name:"transfer",outputs:[{name:"",type:"bool"}],payable:!1,stateMutability:"nonpayable",type:"function"},{constant:!0,inputs:[{name:"_owner",type:"address"},{name:"_spender",type:"address"}],name:"allowance",outputs:[{name:"",type:"uint256"}],payable:!1,stateMutability:"view",type:"function"},{payable:!0,stateMutability:"payable",type:"fallback"},{anonymous:!1,inputs:[{indexed:!0,name:"owner",type:"address"},{indexed:!0,name:"spender",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,name:"from",type:"address"},{indexed:!0,name:"to",type:"address"},{indexed:!1,name:"value",type:"uint256"}],name:"Transfer",type:"event"}];var Q=async(e,n)=>{let{sourceChain:a,targetChain:s,asset:p,amount:t,addressC:o,sourceProvider:u}=n,{sourceChainData:c,targetChainData:i,burnToken:r}=h({sourceChain:a,targetChain:s,asset:p,amount:t},e.config),d=f({chain:a,provider:u});if(await d.readContract({address:r.address,abi:v,functionName:"allowance",args:[o,c.tokenRouterAddress]})<t)if(u.sign){let m=encodeFunctionData({abi:v,functionName:"approve",args:[c.tokenRouterAddress,t]}),l=await u.sign({from:o,to:r.address,data:m}),T=await d.sendRawTransaction({serializedTransaction:l});await d.waitForTransactionReceipt({hash:T,pollingInterval:1e3});}else {let{request:m}=await d.simulateContract({account:o,address:r.address,abi:v,functionName:"approve",args:[c.tokenRouterAddress,t]}),l=await d.writeContract(m);await d.waitForTransactionReceipt({hash:l,pollingInterval:1e3});}if(u.sign){let m=encodeFunctionData({abi:g,functionName:"transferTokens",args:[t,i.domain,o,r.address]}),l=await u.sign({from:o,to:c.tokenRouterAddress,data:m});return d.sendRawTransaction({serializedTransaction:l})}else {let{request:m}=await d.simulateContract({account:o,address:c.tokenRouterAddress,abi:g,functionName:"transferTokens",args:[t,i.domain,o,r.address]});return d.writeContract(m)}},Y=async e=>{try{return await e.getBlockNumber()}catch{return}};async function _(e,n,a){await e.ensureHasConfig();let{minimumConfirmations:s}=e.config.find(d=>d.chainId===n.sourceChain.chainId)??{},{minimumConfirmations:p}=e.config.find(d=>d.chainId===n.targetChain.chainId)??{};if(!s||!p)throw new Error("BridgeTransfer: unable to determine required confirmation counts for the given chains.");let t=await e.getFees({...n,provider:n.sourceProvider}),o=(n.asset.address&&t[n.asset.address])??0n,u=await Q(e,n),c=Date.now(),i=f({chain:n.targetChain,provider:n.targetProvider}),r=await Y(i);return {type:e.type,environment:a,addressC:n.addressC,addressBtc:n.addressBtc,amount:n.amount,symbol:n.asset.symbol,bridgeFee:o,sourceChain:n.sourceChain,sourceStartedAt:c,sourceTxHash:u,sourceConfirmationCount:0,requiredSourceConfirmationCount:s,targetChain:n.targetChain,targetConfirmationCount:0,requiredTargetConfirmationCount:p,startBlockNumber:r}}async function H(e){if(!e.config&&(await e.updateConfig(),!e.config))throw new Error("Config is not available")}var x=(e,n)=>e.gasPrice&&BigInt(e.gasPrice*n.gasUsed);var A=async e=>new Promise(n=>{setTimeout(n,e);});var B=({promise:e,delay:n})=>{let a=!1,s=!1,p=0,t,o,u=r=>{t&&a&&(a=!1,t(r));},c=()=>{s=!0,o&&a&&(a=!1,o("cancelled"));};return {result:new Promise((r,d)=>{a=!0,t=r,o=d;let y=async()=>{if(!(!a||s)){try{await e(u),await A(n);}catch(m){console.error(m.message),p+=1,await A(2**p*n);}await y();}};y();}),cancel:c}};var L=1e3*60*60*3,U=1024n,Z=async(e,n)=>{let{sourceProvider:a,targetProvider:s,updateListener:p,bridgeTransfer:t}=n,o=f({chain:t.sourceChain,provider:a}),u=e.find(y=>y.chainId===t.sourceChain.chainId),c=f({chain:t.targetChain,provider:s}),i=e.find(y=>y.chainId===t.targetChain.chainId),r={...t};if(!u)throw new Error(`BridgeTransfer: unknown source chain "${t.sourceChain.chainId}"`);if(!i)throw new Error(`BridgeTransfer: unknown target chain "${t.targetChain.chainId}"`);return B({promise:async y=>{if(r.completedAt||r.metadata?.nonce)return y(r);if(r.sourceStartedAt+L<=Date.now())return r.completedAt=Date.now(),r.error="timeout",y(r);let m=await o.getTransactionReceipt({hash:r.sourceTxHash});if(!r.sourceNetworkFee){let b=await o.getTransaction({hash:r.sourceTxHash}),w=x(b,m);w&&(r.sourceNetworkFee=w,p(r));}if(m.status==="reverted")return r.completedAt=Date.now(),r.error=`source transaction "${r.sourceTxHash}" reverted`,y(r);let l=await o.getTransactionConfirmations({hash:r.sourceTxHash}),T=l>r.sourceConfirmationCount,P=l>=r.requiredSourceConfirmationCount;if(T&&(r.sourceConfirmationCount=Number(l),P||(r.startBlockNumber=await c.getBlockNumber()),p(r)),!P)return;r.startBlockNumber||(r.startBlockNumber=await c.getBlockNumber(),p(r));let M=m.logs.find(b=>b.address===u.tokenRouterAddress?decodeEventLog({abi:g,...b}).eventName==="TransferTokens":!1);if(!M)throw new Error(`BridgeTransfer: can't find a TransferTokens event in source transaction "${r.sourceTxHash}"`);let j=decodeEventLog({abi:g,eventName:"TransferTokens",...M}).args.nonce;return r.targetStartedAt=Date.now(),r.metadata={nonce:j},p(r),y(r)},delay:k(u.chainId)})},ee=async(e,n)=>{let{targetProvider:a,updateListener:s,bridgeTransfer:p}=n,t={...p};if(!p.completedAt&&!p.metadata?.nonce)throw new Error("BridgeTransfer: nonce is missing");if(!p.startBlockNumber)throw new Error("BridgeTransfer: startBlockNumber is missing");let o=f({chain:p.targetChain,provider:a}),u=e.find(i=>i.chainId===p.targetChain.chainId);if(!u)throw new Error(`BridgeTransfer: unknown target chain "${p.targetChain.chainId}"`);return B({promise:async i=>{if(t.completedAt)return i(t);if(t.sourceStartedAt+L<=Date.now())return t.completedAt=Date.now(),t.error="timeout",i(t);if(!t.targetTxHash){let l=await o.getLogs({address:u.messageTransmitterAddress,event:{name:"MessageReceived",type:"event",inputs:[{indexed:!0,internalType:"address",name:"caller",type:"address"},{indexed:!1,internalType:"uint32",name:"sourceDomain",type:"uint32"},{indexed:!0,internalType:"uint64",name:"nonce",type:"uint64"},{indexed:!1,internalType:"bytes32",name:"sender",type:"bytes32"},{indexed:!1,internalType:"bytes",name:"messageBody",type:"bytes"}]},args:{nonce:t.metadata.nonce},fromBlock:t.startBlockNumber-U,toBlock:t.startBlockNumber+U});if(l[0]?.transactionHash)t.targetTxHash=l[0].transactionHash,s(t);else return}let r=await o.getTransactionReceipt({hash:t.targetTxHash});if(!t.targetNetworkFee){let l=await o.getTransaction({hash:t.targetTxHash}),T=x(l,r);T&&(t.targetNetworkFee=T,s(t));}if(r.status==="reverted")return t.completedAt=Date.now(),t.error=`target transaction "${t.targetTxHash}" reverted`,i(t);let d=await o.getTransactionConfirmations({hash:t.targetTxHash}),y=d>t.targetConfirmationCount,m=d>=t.requiredTargetConfirmationCount;if(y&&(t.targetConfirmationCount=Number(d),s(t)),!!m)return t.completedAt=Date.now(),s(t),i(t)},delay:k(u.chainId)})};function $(e,n){let a,s=()=>{a?.();};return {result:(async()=>{await e.ensureHasConfig();let{result:t,cancel:o}=await Z(e.config,n);a=o;let u=await t,{result:c,cancel:i}=await ee(e.config,{...n,bridgeTransfer:u});return a=i,c})(),cancel:s}}var q=e=>({type:"cctp",config:null,updateConfig:async function(){this.config=await N(e);},ensureHasConfig:async function(){return H(this)},getAssets:async function(){return R(this)},getFees:async function(n){return S(this,n)},transferAsset:async function(n){return _(this,n,e)},trackTransfer:function(n){return $(this,n)}});var te=new Map([["cctp",q]]),K=(e,n)=>new Map([...te].filter(([a])=>!n?.includes(a)).map(([a,s])=>[a,s(e)])),F=(e,n,a)=>{let s=n.destinations[a]?.find(p=>e.has(p));if(!s)throw new Error(`No enabled implementation found for transfering ${n.symbol} to ${a}`);return {type:s,bridge:e.get(s)}};var dt=({environment:e,disabledBridgeTypes:n})=>{let a=K(e,n),s=async()=>Promise.all(Array.from(a).map(([,i])=>i.updateConfig()));return {bridges:a,init:async()=>{await s();},updateConfigs:s,getAssets:async()=>(await Promise.all(Array.from(a).map(([,r])=>r.getAssets()))).flat().reduce(merge),getFees:async i=>{let{bridge:r}=F(a,i.asset,i.targetChain.chainId);return r.getFees(i)},transferAsset:async i=>{let{bridge:r}=F(a,i.asset,i.targetChain.chainId);return r.transferAsset(i)},trackTransfer:i=>{let r=a.get(i.bridgeTransfer.type);if(!r)throw new Error(`No enabled implementation found for tracking ${i.bridgeTransfer.type} transactions.`);return r.trackTransfer(i)}}};
export { h as BridgeType, E as Environment, I as TokenType, ut as createUnifiedBridgeService };
export { C as BridgeType, E as Environment, I as TokenType, dt as createUnifiedBridgeService };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=index.js.map
{
"name": "@avalabs/bridge-unified",
"version": "0.0.0-feat-unified-api-interface-20231128161004",
"version": "0.0.0-feat-unified-api-interface-20231128185332",
"main": "dist/index.js",

@@ -18,3 +18,3 @@ "type": "module",

"@internal/tsup-config": "0.0.1",
"eslint-config-custom": "0.0.0-feat-unified-api-interface-20231128161004"
"eslint-config-custom": "0.0.0-feat-unified-api-interface-20231128185332"
},

@@ -21,0 +21,0 @@ "scripts": {

@@ -8,4 +8,5 @@ import { decodeEventLog } from 'viem';

import { CCTP_CONFIG, SOURCE_ROUTER_ADDRESS, TARGET_TRANSMITTER_ADDRESS } from '../__mocks__/config.mock';
import { getTrackingDelayByChainId } from '../utils/config';
import * as tracking from './track-transfer';
import { MAX_BLOCKS, TRACKING_LIMIT_MS, trackSourceTx, trackTargetTx, trackTransfer } from './track-transfer';
import { getTrackingDelayByChainId } from '../utils/config';
import { SOURCE_CHAIN, TARGET_CHAIN } from '../__mocks__/chain.mocks';

@@ -72,10 +73,47 @@ import { TOKEN_ROUTER_ABI } from '../abis/token-router';

it('calls ensureHasConfig', async () => {
const params = getBridgeTrackinParams({ updateListener });
const error = new Error('error');
(bridgeMock.ensureHasConfig as jest.Mock).mockRejectedValueOnce(error);
describe('combined tracking', () => {
afterEach(() => {
jest.restoreAllMocks();
});
const { result } = trackTransfer(bridgeMock, params);
it('calls ensureHasConfig', async () => {
const params = getBridgeTrackinParams({ updateListener });
const error = new Error('error');
(bridgeMock.ensureHasConfig as jest.Mock).mockRejectedValueOnce(error);
await expect(result).rejects.toThrow(error);
const { result } = trackTransfer(bridgeMock, params);
await expect(result).rejects.toThrow(error);
});
it('tracks the transactions correctly', async () => {
const initialParams = getBridgeTrackinParams({ updateListener });
const transferAfterSource = { ...initialParams.bridgeTransfer, metadata: { nonce: 1 } };
const transferAfterTarget = { ...transferAfterSource, completedAt: 999 };
const sourceCancel = jest.fn();
const targetCancel = jest.fn();
const sourceTrackerSpy = jest.spyOn(tracking, 'trackSourceTx').mockResolvedValueOnce({
result: new Promise((res) => res(transferAfterSource)),
cancel: sourceCancel,
});
const targetTrackerSpy = jest.spyOn(tracking, 'trackTargetTx').mockResolvedValueOnce({
result: new Promise((res) => res(transferAfterTarget)),
cancel: targetCancel,
});
const { result, cancel } = trackTransfer(bridgeMock, initialParams);
expect(await result).toStrictEqual(transferAfterTarget);
expect(sourceTrackerSpy).toHaveBeenCalledWith(bridgeMock.config, initialParams);
expect(targetTrackerSpy).toHaveBeenCalledWith(bridgeMock.config, {
...initialParams,
bridgeTransfer: transferAfterSource,
});
cancel();
expect(sourceCancel).not.toHaveBeenCalled();
expect(targetCancel).toHaveBeenCalled();
});
});

@@ -250,2 +288,3 @@

const confirmations = 5;
const targetBlockNumber = 50n;
const receiptMock = {

@@ -268,2 +307,3 @@ status: 'succeeded',

sourceClientMock.getTransactionConfirmations.mockResolvedValueOnce(confirmations);
targetClientMock.getBlockNumber.mockResolvedValueOnce(targetBlockNumber);

@@ -277,2 +317,3 @@ const { result } = await trackSourceTx(bridgeMock.config!, params);

targetStartedAt: now,
startBlockNumber: targetBlockNumber,
metadata: {

@@ -285,3 +326,3 @@ nonce,

expect(doneMock).toHaveBeenCalledWith(expectedResult);
expect(updateListenerWithoutReference).toHaveBeenCalledTimes(3);
expect(updateListenerWithoutReference).toHaveBeenCalledTimes(4);
expect(updateListenerWithoutReference).toHaveBeenNthCalledWith(1, {

@@ -296,3 +337,9 @@ ...params.bridgeTransfer,

});
expect(updateListenerWithoutReference).toHaveBeenNthCalledWith(3, expectedResult);
expect(updateListenerWithoutReference).toHaveBeenNthCalledWith(3, {
...params.bridgeTransfer,
sourceNetworkFee: networkFee,
sourceConfirmationCount: confirmations,
startBlockNumber: targetBlockNumber,
});
expect(updateListenerWithoutReference).toHaveBeenNthCalledWith(4, expectedResult);

@@ -299,0 +346,0 @@ expect(sourceClientMock.getTransactionReceipt).toHaveBeenCalledWith({

@@ -86,3 +86,3 @@ import { decodeEventLog, type Address } from 'viem';

* - update the sourceConfirmationCount if it increased
* - update the startBlockNumber if it increased but is not enough
* - update the startBlockNumber if confirmation count increased but is not enough
* - keeps polling until it's greater than requiredSourceConfirmationCount

@@ -110,2 +110,7 @@ */

if (!updateableTransfer.startBlockNumber) {
updateableTransfer.startBlockNumber = await targetClient.getBlockNumber();
updateListener(updateableTransfer);
}
/**

@@ -287,4 +292,8 @@ * Get the `TransferTokens` event's log entry from the receipt

export function trackTransfer(bridge: BridgeService, params: TrackingParams) {
let cancel: (() => void) | undefined;
let abortFn: (() => void) | undefined;
const cancel = () => {
abortFn?.();
};
const executeTracking = async () => {

@@ -294,3 +303,3 @@ await bridge.ensureHasConfig();

const { result: sourceTracker, cancel: cancelSourceTracking } = await trackSourceTx(bridge.config!, params);
cancel = cancelSourceTracking;
abortFn = cancelSourceTracking;
const transferAfterSourceFinished = await sourceTracker;

@@ -302,3 +311,3 @@

});
cancel = cancelTargetTracking;
abortFn = cancelTargetTracking;
return targetTracker;

@@ -305,0 +314,0 @@ };

@@ -1,2 +0,2 @@

import { encodeFunctionData } from 'viem';
import { encodeFunctionData, type PublicClient } from 'viem';
import type { BridgeService, Environment, TransferParams } from '../../../types';

@@ -80,2 +80,11 @@ import { getClientForChain } from '../../../utils/client';

const getStartBlockNumber = async (targetClient: PublicClient) => {
try {
const startBlockNumber = await targetClient.getBlockNumber();
return startBlockNumber;
} catch {
return undefined;
}
};
export async function transferAsset(bridge: BridgeService, params: TransferParams, environment: Environment) {

@@ -99,3 +108,3 @@ await bridge.ensureHasConfig();

const targetClient = getClientForChain({ chain: params.targetChain, provider: params.targetProvider });
const targetBlockNumber = await targetClient.getBlockNumber();
const targetBlockNumber = await getStartBlockNumber(targetClient);

@@ -102,0 +111,0 @@ return {

@@ -33,3 +33,3 @@ import { createWalletClient, publicActions, custom, http } from 'viem';

const chainInfo = _getChain(chain);
const transport = provider ? custom(provider) : http(chain.rpcUrl);
const transport = provider ? custom(provider) : http(chain.rpcUrl, { batch: true, retryCount: 0 });

@@ -36,0 +36,0 @@ return createWalletClient({

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc