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-20231128103028 to 0.0.0-feat-unified-api-interface-20231128133651

src/bridges/cctp/handlers/track-transfer.test.ts

2

CHANGELOG.md
# @avalabs/unified-bridge
## 0.0.0-feat-unified-api-interface-20231128103028
## 0.0.0-feat-unified-api-interface-20231128133651

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

import { merge } from 'lodash';
import { custom, http, createWalletClient, publicActions, encodeFunctionData, decodeEventLog } from 'viem';
var I=(a=>(a.NATIVE="native",a.ERC20="erc20",a))(I||{});var h=(n=>(n.CCTP="cctp",n))(h||{});var E=(a=>(a.PROD="production",a.TEST="test",a))(E||{});var j={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(j[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(a=>a.chainId);return e.config.reduce((a,i)=>(a[i.chainId]=i.tokens.map(r=>({...r,type:"erc20",destinations:n.reduce((t,s)=>(i.chainId!==s&&(t[s]||(t[s]=[]),t[s]?.push("cctp")),t),{})})),a),{})}var X=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=X(e),i=n?custom(n):http(e.rpcUrl);return createWalletClient({chain:a,transport:i}).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:a,asset:i},r)=>{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=r.find(o=>o.chainId===e.chainId);if(!t)throw new Error(`Not supported on source chain "${e.chainId}"`);let s=r.find(o=>o.chainId===n.chainId);if(!s)throw new Error(`Not supported on target chain "${n.chainId}"`);let c=t.tokens.find(o=>o.symbol===i.symbol),u=s.tokens.find(o=>o.symbol===i.symbol);if(!c||!u)throw new Error(`Not supported asset "${i.symbol}"`);return {sourceChainData:t,targetChainData:s,burnToken:c,mintToken:u}};async function N(e,n){await e.ensureHasConfig();let{sourceChain:a,targetChain:i,asset:r,amount:t,provider:s}=n,{sourceChainData:c,targetChainData:u,burnToken:o}=b({sourceChain:a,targetChain:i,asset:r,amount:t},e.config),p=await f({chain:a,provider:s}).readContract({address:c.tokenRouterAddress,abi:g,functionName:"calculateFee",args:[t,u.domain]});return {[o.address]:p}}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 J=async(e,n)=>{let{sourceChain:a,targetChain:i,asset:r,amount:t,addressC:s,sourceProvider:c}=n,{sourceChainData:u,targetChainData:o,burnToken:d}=b({sourceChain:a,targetChain:i,asset:r,amount:t},e.config),p=f({chain:a,provider:c});if(await p.readContract({address:d.address,abi:v,functionName:"allowance",args:[s,u.tokenRouterAddress]})<t)if(c.sign){let m=encodeFunctionData({abi:v,functionName:"approve",args:[u.tokenRouterAddress,t]}),y=await c.sign({from:s,to:d.address,data:m}),T=await p.sendRawTransaction({serializedTransaction:y});await p.waitForTransactionReceipt({hash:T,pollingInterval:1e3});}else {let{request:m}=await p.simulateContract({account:s,address:d.address,abi:v,functionName:"approve",args:[u.tokenRouterAddress,t]}),y=await p.writeContract(m);await p.waitForTransactionReceipt({hash:y,pollingInterval:1e3});}if(c.sign){let m=encodeFunctionData({abi:g,functionName:"transferTokens",args:[t,o.domain,s,d.address]}),y=await c.sign({from:s,to:u.tokenRouterAddress,data:m});return p.sendRawTransaction({serializedTransaction:y})}else {let{request:m}=await p.simulateContract({account:s,address:u.tokenRouterAddress,abi:g,functionName:"transferTokens",args:[t,o.domain,s,d.address]});return p.writeContract(m)}};async function _(e,n,a){await e.ensureHasConfig();let{minimumConfirmations:i}=e.config.find(p=>p.chainId===n.sourceChain.chainId)??{},{minimumConfirmations:r}=e.config.find(p=>p.chainId===n.targetChain.chainId)??{};if(!i||!r)throw new Error("BridgeTransfer: unable to determine required confirmation counts for the given chains.");let t=await e.getFees({...n,provider:n.sourceProvider}),s=(n.asset.address&&t[n.asset.address])??0n,c=await J(e,n),u=Date.now(),d=await f({chain:n.targetChain,provider:n.targetProvider}).getBlockNumber();return {type:e.type,environment:a,addressC:n.addressC,addressBtc:n.addressBtc,amount:n.amount,symbol:n.asset.symbol,bridgeFee:s,sourceChain:n.sourceChain,sourceStartedAt:u,sourceTxHash:c,sourceConfirmationCount:0,requiredSourceConfirmationCount:i,targetChain:n.targetChain,targetConfirmationCount:0,requiredTargetConfirmationCount:r,startBlockNumber:d}}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 a=!1,i=!1,r=0,t,s,c=d=>{t&&a&&(a=!1,t(d));},u=()=>{i=!0,s&&a&&(a=!1,s("cancelled"));};return {result:new Promise((d,p)=>{a=!0,t=d,s=p;let l=async()=>{if(!(!a||i)){try{await e(c),await A(n);}catch(m){console.error(m.message),r+=1,await A(2**r*n);}await l();}};l();}),cancel:u}};var U=1e3*60*60*3,Q=2048n,Y=async(e,n)=>{let{sourceProvider:a,targetProvider:i,updateListener:r,bridgeTransfer:t}=n,s=f({chain:t.sourceChain,provider:a}),c=e.find(p=>p.chainId===t.sourceChain.chainId),u=f({chain:t.targetChain,provider:i}),o=e.find(p=>p.chainId===t.targetChain.chainId);if(!c)throw new Error(`BridgeTransfer: unknown source chain "${t.sourceChain.chainId}"`);if(!o)throw new Error(`BridgeTransfer: unknown target chain "${t.targetChain.chainId}"`);return B({promise:async p=>{if(t.completedAt||t.metadata?.nonce)return p(t);if(t.sourceStartedAt+U<=Date.now())return t.completedAt=Date.now(),t.error="timeout",p(t);let l=await s.getTransactionReceipt({hash:t.sourceTxHash});if(!t.sourceNetworkFee){let C=await s.getTransaction({hash:t.sourceTxHash}),w=k(C,l);w&&(t.sourceNetworkFee=w,r(t));}if(l.status==="reverted")return t.completedAt=Date.now(),t.error=`source transaction "${t.sourceTxHash}" reverted`,p(t);let m=await s.getTransactionConfirmations({hash:t.sourceTxHash}),y=m>t.sourceConfirmationCount,T=m>=t.requiredSourceConfirmationCount;if(y&&(t.sourceConfirmationCount=Number(m),T||(t.startBlockNumber=await u.getBlockNumber()),r(t)),!T)return;let P=l.logs.find(C=>C.address===c.tokenRouterAddress?decodeEventLog({abi:g,...C}).eventName==="TransferTokens":!1);if(!P)throw new Error(`BridgeTransfer: can't find a TransferTokens event in source transaction "${t.sourceTxHash}"`);let K=decodeEventLog({abi:g,eventName:"TransferTokens",...P}).args.nonce,M={...n.bridgeTransfer,targetStartedAt:Date.now(),metadata:{nonce:K}};return r(M),p(M)},delay:x(c.chainId)})},Z=async(e,n)=>{let{targetProvider:a,updateListener:i,bridgeTransfer:r}=n;if(!r.completedAt&&!r.metadata?.nonce)throw new Error("BridgeTransfer: nonce is missing");if(!r.startBlockNumber)throw new Error("BridgeTransfer: startBlockNumber is missing");let t=f({chain:r.targetChain,provider:a}),s=e.find(u=>u.chainId===r.targetChain.chainId);if(!s)throw new Error(`BridgeTransfer: unknown target chain "${r.targetChain.chainId}"`);return B({promise:async u=>{if(r.completedAt)return u(r);if(r.sourceStartedAt+U<=Date.now())return r.completedAt=Date.now(),r.error="timeout",u(r);if(!r.targetTxHash){let m=await t.getLogs({address:s.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:r.metadata.nonce},fromBlock:r.startBlockNumber-5n,toBlock:r.startBlockNumber+Q});if(m[0]?.transactionHash)r.targetTxHash=m[0].transactionHash,i(r);else return}let o=await t.getTransactionReceipt({hash:r.targetTxHash});if(!r.targetNetworkFee){let m=await t.getTransaction({hash:r.targetTxHash}),y=k(m,o);y&&(r.targetNetworkFee=y,i(r));}if(o.status==="reverted")return r.completedAt=Date.now(),r.error=`target transaction "${r.targetTxHash}" reverted`,u(r);let d=await t.getTransactionConfirmations({hash:r.targetTxHash}),p=d>r.targetConfirmationCount,l=d>=r.requiredTargetConfirmationCount;if(p&&(r.targetConfirmationCount=Number(d),i(r)),!!l)return r.completedAt=Date.now(),i(r),u(r)},delay:x(s.chainId)})};function L(e,n){let a;return {result:(async()=>{await e.ensureHasConfig();let{result:r,cancel:t}=await Y(e.config,n);a=t;let s=await r,{result:c,cancel:u}=await Z(e.config,{...n,bridgeTransfer:s});return a=u,c})(),cancel:a}}var $=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 L(this,n)}});var ee=new Map([["cctp",$]]),q=(e,n)=>new Map([...ee].filter(([a])=>!n?.includes(a)).map(([a,i])=>[a,i(e)])),F=(e,n,a)=>{let i=n.destinations[a]?.find(r=>e.has(r));if(!i)throw new Error(`No enabled implementation found for transfering ${n.symbol} to ${a}`);return {type:i,bridge:e.get(i)}};var ut=({environment:e,disabledBridgeTypes:n})=>{let a=q(e,n),i=async()=>Promise.all(Array.from(a).map(([,o])=>o.updateConfig()));return {bridges:a,init:async()=>{await i();},updateConfigs:i,getAssets:async()=>(await Promise.all(Array.from(a).map(([,d])=>d.getAssets()))).flat().reduce(merge),getFees:async o=>{let{bridge:d}=F(a,o.asset,o.targetChain.chainId);return d.getFees(o)},transferAsset:async o=>{let{bridge:d}=F(a,o.asset,o.targetChain.chainId);return d.transferAsset(o)},trackTransfer:o=>{let d=a.get(o.bridgeTransfer.type);if(!d)throw new Error(`No enabled implementation found for tracking ${o.bridgeTransfer.type} transactions.`);return d.trackTransfer(o)}}};
var I=(a=>(a.NATIVE="native",a.ERC20="erc20",a))(I||{});var C=(t=>(t.CCTP="cctp",t))(C||{});var E=(a=>(a.PROD="production",a.TEST="test",a))(E||{});var j={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(j[e])).json()}catch(t){throw new Error(`Error while fetching CCTP config: ${t.message}`)}},x=e=>{switch(e){case 43114:case 43113:return 1e3;default:return 2e4}};async function S(e){await e.ensureHasConfig();let t=e.config.map(a=>a.chainId);return e.config.reduce((a,s)=>(a[s.chainId]=s.tokens.map(n=>({...n,type:"erc20",destinations:t.reduce((i,o)=>(s.chainId!==o&&(i[o]||(i[o]=[]),i[o]?.push("cctp")),i),{})})),a),{})}var X=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:t})=>{let a=X(e),s=t?custom(t):http(e.rpcUrl);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:t,amount:a,asset:s},n)=>{if(e.chainId===t.chainId)throw new Error("Source and target chains are the same");if(a<=0n)throw new Error("Amount must be greater than zero");let i=n.find(p=>p.chainId===e.chainId);if(!i)throw new Error(`Not supported on source chain "${e.chainId}"`);let o=n.find(p=>p.chainId===t.chainId);if(!o)throw new Error(`Not supported on target chain "${t.chainId}"`);let d=i.tokens.find(p=>p.symbol===s.symbol),u=o.tokens.find(p=>p.symbol===s.symbol);if(!d||!u)throw new Error(`Not supported asset "${s.symbol}"`);return {sourceChainData:i,targetChainData:o,burnToken:d,mintToken:u}};async function N(e,t){await e.ensureHasConfig();let{sourceChain:a,targetChain:s,asset:n,amount:i,provider:o}=t,{sourceChainData:d,targetChainData:u,burnToken:p}=h({sourceChain:a,targetChain:s,asset:n,amount:i},e.config),c=await f({chain:a,provider:o}).readContract({address:d.tokenRouterAddress,abi:g,functionName:"calculateFee",args:[i,u.domain]});return {[p.address]:c}}var b=[{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 J=async(e,t)=>{let{sourceChain:a,targetChain:s,asset:n,amount:i,addressC:o,sourceProvider:d}=t,{sourceChainData:u,targetChainData:p,burnToken:r}=h({sourceChain:a,targetChain:s,asset:n,amount:i},e.config),c=f({chain:a,provider:d});if(await c.readContract({address:r.address,abi:b,functionName:"allowance",args:[o,u.tokenRouterAddress]})<i)if(d.sign){let m=encodeFunctionData({abi:b,functionName:"approve",args:[u.tokenRouterAddress,i]}),l=await d.sign({from:o,to:r.address,data:m}),v=await c.sendRawTransaction({serializedTransaction:l});await c.waitForTransactionReceipt({hash:v,pollingInterval:1e3});}else {let{request:m}=await c.simulateContract({account:o,address:r.address,abi:b,functionName:"approve",args:[u.tokenRouterAddress,i]}),l=await c.writeContract(m);await c.waitForTransactionReceipt({hash:l,pollingInterval:1e3});}if(d.sign){let m=encodeFunctionData({abi:g,functionName:"transferTokens",args:[i,p.domain,o,r.address]}),l=await d.sign({from:o,to:u.tokenRouterAddress,data:m});return c.sendRawTransaction({serializedTransaction:l})}else {let{request:m}=await c.simulateContract({account:o,address:u.tokenRouterAddress,abi:g,functionName:"transferTokens",args:[i,p.domain,o,r.address]});return c.writeContract(m)}};async function _(e,t,a){await e.ensureHasConfig();let{minimumConfirmations:s}=e.config.find(c=>c.chainId===t.sourceChain.chainId)??{},{minimumConfirmations:n}=e.config.find(c=>c.chainId===t.targetChain.chainId)??{};if(!s||!n)throw new Error("BridgeTransfer: unable to determine required confirmation counts for the given chains.");let i=await e.getFees({...t,provider:t.sourceProvider}),o=(t.asset.address&&i[t.asset.address])??0n,d=await J(e,t),u=Date.now(),r=await f({chain:t.targetChain,provider:t.targetProvider}).getBlockNumber();return {type:e.type,environment:a,addressC:t.addressC,addressBtc:t.addressBtc,amount:t.amount,symbol:t.asset.symbol,bridgeFee:o,sourceChain:t.sourceChain,sourceStartedAt:u,sourceTxHash:d,sourceConfirmationCount:0,requiredSourceConfirmationCount:s,targetChain:t.targetChain,targetConfirmationCount:0,requiredTargetConfirmationCount:n,startBlockNumber:r}}async function H(e){if(!e.config&&(await e.updateConfig(),!e.config))throw new Error("Config is not available")}var k=(e,t)=>e.gasPrice&&BigInt(e.gasPrice*t.gasUsed);var A=async e=>new Promise(t=>{setTimeout(t,e);});var B=({promise:e,delay:t})=>{let a=!1,s=!1,n=0,i,o,d=r=>{i&&a&&(a=!1,i(r));},u=()=>{s=!0,o&&a&&(a=!1,o("cancelled"));};return {result:new Promise((r,c)=>{a=!0,i=r,o=c;let y=async()=>{if(!(!a||s)){try{await e(d),await A(t);}catch(m){console.error(m.message),n+=1,await A(2**n*t);}await y();}};y();}),cancel:u}};var U=1e3*60*60*3,Q=2048n,Y=async(e,t)=>{let{sourceProvider:a,targetProvider:s,updateListener:n,bridgeTransfer:i}=t,o=f({chain:i.sourceChain,provider:a}),d=e.find(y=>y.chainId===i.sourceChain.chainId),u=f({chain:i.targetChain,provider:s}),p=e.find(y=>y.chainId===i.targetChain.chainId),r={...i};if(!d)throw new Error(`BridgeTransfer: unknown source chain "${i.sourceChain.chainId}"`);if(!p)throw new Error(`BridgeTransfer: unknown target chain "${i.targetChain.chainId}"`);return B({promise:async y=>{if(r.completedAt||r.metadata?.nonce)return y(r);if(r.sourceStartedAt+U<=Date.now())return r.completedAt=Date.now(),r.error="timeout",y(r);let m=await o.getTransactionReceipt({hash:r.sourceTxHash});if(!r.sourceNetworkFee){let T=await o.getTransaction({hash:r.sourceTxHash}),w=k(T,m);w&&(r.sourceNetworkFee=w,n(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}),v=l>r.sourceConfirmationCount,P=l>=r.requiredSourceConfirmationCount;if(v&&(r.sourceConfirmationCount=Number(l),P||(r.startBlockNumber=await u.getBlockNumber()),n(r)),!P)return;let M=m.logs.find(T=>T.address===d.tokenRouterAddress?decodeEventLog({abi:g,...T}).eventName==="TransferTokens":!1);if(!M)throw new Error(`BridgeTransfer: can't find a TransferTokens event in source transaction "${r.sourceTxHash}"`);let K=decodeEventLog({abi:g,eventName:"TransferTokens",...M}).args.nonce;return r.targetStartedAt=Date.now(),r.metadata={nonce:K},n(r),y(r)},delay:x(d.chainId)})},Z=async(e,t)=>{let{targetProvider:a,updateListener:s,bridgeTransfer:n}=t;if(!n.completedAt&&!n.metadata?.nonce)throw new Error("BridgeTransfer: nonce is missing");if(!n.startBlockNumber)throw new Error("BridgeTransfer: startBlockNumber is missing");let i=f({chain:n.targetChain,provider:a}),o=e.find(u=>u.chainId===n.targetChain.chainId);if(!o)throw new Error(`BridgeTransfer: unknown target chain "${n.targetChain.chainId}"`);return B({promise:async u=>{if(n.completedAt)return u(n);if(n.sourceStartedAt+U<=Date.now())return n.completedAt=Date.now(),n.error="timeout",u(n);if(!n.targetTxHash){let m=await i.getLogs({address:o.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:n.metadata.nonce},fromBlock:n.startBlockNumber-5n,toBlock:n.startBlockNumber+Q});if(m[0]?.transactionHash)n.targetTxHash=m[0].transactionHash,s(n);else return}let p=await i.getTransactionReceipt({hash:n.targetTxHash});if(!n.targetNetworkFee){let m=await i.getTransaction({hash:n.targetTxHash}),l=k(m,p);l&&(n.targetNetworkFee=l,s(n));}if(p.status==="reverted")return n.completedAt=Date.now(),n.error=`target transaction "${n.targetTxHash}" reverted`,u(n);let r=await i.getTransactionConfirmations({hash:n.targetTxHash}),c=r>n.targetConfirmationCount,y=r>=n.requiredTargetConfirmationCount;if(c&&(n.targetConfirmationCount=Number(r),s(n)),!!y)return n.completedAt=Date.now(),s(n),u(n)},delay:x(o.chainId)})};function L(e,t){let a;return {result:(async()=>{await e.ensureHasConfig();let{result:n,cancel:i}=await Y(e.config,t);a=i;let o=await n,{result:d,cancel:u}=await Z(e.config,{...t,bridgeTransfer:o});return a=u,d})(),cancel:a}}var $=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(t){return N(this,t)},transferAsset:async function(t){return _(this,t,e)},trackTransfer:function(t){return L(this,t)}});var ee=new Map([["cctp",$]]),q=(e,t)=>new Map([...ee].filter(([a])=>!t?.includes(a)).map(([a,s])=>[a,s(e)])),F=(e,t,a)=>{let s=t.destinations[a]?.find(n=>e.has(n));if(!s)throw new Error(`No enabled implementation found for transfering ${t.symbol} to ${a}`);return {type:s,bridge:e.get(s)}};var ut=({environment:e,disabledBridgeTypes:t})=>{let a=q(e,t),s=async()=>Promise.all(Array.from(a).map(([,p])=>p.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 p=>{let{bridge:r}=F(a,p.asset,p.targetChain.chainId);return r.getFees(p)},transferAsset:async p=>{let{bridge:r}=F(a,p.asset,p.targetChain.chainId);return r.transferAsset(p)},trackTransfer:p=>{let r=a.get(p.bridgeTransfer.type);if(!r)throw new Error(`No enabled implementation found for tracking ${p.bridgeTransfer.type} transactions.`);return r.trackTransfer(p)}}};
export { h as BridgeType, E as Environment, I as TokenType, ut as createUnifiedBridgeService };
export { C as BridgeType, E as Environment, I as TokenType, ut as createUnifiedBridgeService };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=index.js.map
{
"name": "@avalabs/bridge-unified",
"version": "0.0.0-feat-unified-api-interface-20231128103028",
"version": "0.0.0-feat-unified-api-interface-20231128133651",
"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-20231128103028"
"eslint-config-custom": "0.0.0-feat-unified-api-interface-20231128133651"
},

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

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

import { BridgeType, type BridgeTransfer, Environment } from '../../../types';
import { BridgeType, type BridgeTransfer, Environment, type Provider, type TrackingParams } from '../../../types';
import { SOURCE_CHAIN, TARGET_CHAIN } from './chain.mocks';

@@ -28,1 +28,22 @@ import { SOURCE_MINIMUM_CONFIRMATIONS, TARGET_MINIMUM_CONFIRMATIONS } from './config.mock';

});
export const getBridgeTrackinParams = ({
bridgeTransfer,
sourceProvider,
targetProvider,
updateListener,
}: {
bridgeTransfer?: Partial<BridgeTransfer>;
sourceProvider?: Provider;
targetProvider?: Provider;
updateListener: (transfer: BridgeTransfer) => void;
}) =>
({
bridgeTransfer: {
...BRIDGE_TRANSFER_MOCK,
...(bridgeTransfer ?? {}),
},
sourceProvider,
targetProvider,
updateListener,
}) as unknown as TrackingParams;

@@ -10,5 +10,5 @@ import { decodeEventLog, type Address } from 'viem';

// Maximum time (in ms) before the transaction is considered "timed out"
const TRACKING_LIMIT_MS = 1000 * 60 * 60 * 3;
export const TRACKING_LIMIT_MS = 1000 * 60 * 60 * 3;
// The max blocks that can be queried before receiving an error response
const MAX_BLOCKS = 2048n;
export const MAX_BLOCKS = 2048n;

@@ -19,3 +19,3 @@ /**

*/
const trackSourceTx = async (config: BridgeConfig, params: TrackingParams) => {
export const trackSourceTx = async (config: BridgeConfig, params: TrackingParams) => {
const { sourceProvider, targetProvider, updateListener, bridgeTransfer } = params;

@@ -26,2 +26,3 @@ const sourceClient = getClientForChain({ chain: bridgeTransfer.sourceChain, provider: sourceProvider });

const targetChainData = config.find((chainData) => chainData.chainId === bridgeTransfer.targetChain.chainId);
const updateableTransfer = { ...bridgeTransfer };

@@ -42,4 +43,4 @@ if (!sourceChainData) {

*/
if (bridgeTransfer.completedAt || bridgeTransfer.metadata?.nonce) {
return done(bridgeTransfer);
if (updateableTransfer.completedAt || updateableTransfer.metadata?.nonce) {
return done(updateableTransfer);
}

@@ -50,6 +51,6 @@

*/
if (bridgeTransfer.sourceStartedAt + TRACKING_LIMIT_MS <= Date.now()) {
bridgeTransfer.completedAt = Date.now();
bridgeTransfer.error = 'timeout';
return done(bridgeTransfer);
if (updateableTransfer.sourceStartedAt + TRACKING_LIMIT_MS <= Date.now()) {
updateableTransfer.completedAt = Date.now();
updateableTransfer.error = 'timeout';
return done(updateableTransfer);
}

@@ -62,3 +63,3 @@

const txReceipt = await sourceClient.getTransactionReceipt({
hash: bridgeTransfer.sourceTxHash as Address,
hash: updateableTransfer.sourceTxHash as Address,
});

@@ -69,9 +70,9 @@

*/
if (!bridgeTransfer.sourceNetworkFee) {
const tx = await sourceClient.getTransaction({ hash: bridgeTransfer.sourceTxHash as Address });
if (!updateableTransfer.sourceNetworkFee) {
const tx = await sourceClient.getTransaction({ hash: updateableTransfer.sourceTxHash as Address });
const networkFee = getNetworkFeeEVM(tx, txReceipt);
if (networkFee) {
bridgeTransfer.sourceNetworkFee = networkFee;
updateListener(bridgeTransfer);
updateableTransfer.sourceNetworkFee = networkFee;
updateListener(updateableTransfer);
}

@@ -84,5 +85,5 @@ }

if (txReceipt.status === 'reverted') {
bridgeTransfer.completedAt = Date.now();
bridgeTransfer.error = `source transaction "${bridgeTransfer.sourceTxHash}" reverted`;
return done(bridgeTransfer);
updateableTransfer.completedAt = Date.now();
updateableTransfer.error = `source transaction "${updateableTransfer.sourceTxHash}" reverted`;
return done(updateableTransfer);
}

@@ -97,15 +98,15 @@

const confirmationCount = await sourceClient.getTransactionConfirmations({
hash: bridgeTransfer.sourceTxHash as Address,
hash: updateableTransfer.sourceTxHash as Address,
});
const hasMoreConfirmations = confirmationCount > bridgeTransfer.sourceConfirmationCount;
const hasRequiredConfirmations = confirmationCount >= bridgeTransfer.requiredSourceConfirmationCount;
const hasMoreConfirmations = confirmationCount > updateableTransfer.sourceConfirmationCount;
const hasRequiredConfirmations = confirmationCount >= updateableTransfer.requiredSourceConfirmationCount;
if (hasMoreConfirmations) {
bridgeTransfer.sourceConfirmationCount = Number(confirmationCount);
updateableTransfer.sourceConfirmationCount = Number(confirmationCount);
if (!hasRequiredConfirmations) {
bridgeTransfer.startBlockNumber = await targetClient.getBlockNumber();
updateableTransfer.startBlockNumber = await targetClient.getBlockNumber();
}
updateListener(bridgeTransfer);
updateListener(updateableTransfer);
}

@@ -135,3 +136,3 @@

throw new Error(
`BridgeTransfer: can't find a TransferTokens event in source transaction "${bridgeTransfer.sourceTxHash}"`,
`BridgeTransfer: can't find a TransferTokens event in source transaction "${updateableTransfer.sourceTxHash}"`,
);

@@ -152,5 +153,6 @@ }

const nonce = transferEvent.args.nonce;
const transfer = { ...params.bridgeTransfer, targetStartedAt: Date.now(), metadata: { nonce } };
updateListener(transfer);
return done(transfer);
updateableTransfer.targetStartedAt = Date.now();
updateableTransfer.metadata = { nonce };
updateListener(updateableTransfer);
return done(updateableTransfer);
};

@@ -157,0 +159,0 @@

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