@avalabs/bridge-unified 2.1.0 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -0
- package/README.md +40 -24
- package/dist/index.cjs +8 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -36
- package/dist/index.d.ts +11 -36
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
- package/.turbo/turbo-build.log +0 -22
- package/.turbo/turbo-lint.log +0 -4
- package/.turbo/turbo-test.log +0 -26
- package/CHANGELOG.md +0 -31
- package/jest.config.js +0 -9
- package/src/bridges/cctp/__mocks__/asset.mock.ts +0 -15
- package/src/bridges/cctp/__mocks__/bridge-transfer.mock.ts +0 -48
- package/src/bridges/cctp/__mocks__/chain.mocks.ts +0 -33
- package/src/bridges/cctp/__mocks__/config.mock.ts +0 -45
- package/src/bridges/cctp/abis/erc20.ts +0 -117
- package/src/bridges/cctp/abis/message-transmitter.ts +0 -318
- package/src/bridges/cctp/abis/token-router.ts +0 -843
- package/src/bridges/cctp/factory.test.ts +0 -73
- package/src/bridges/cctp/factory.ts +0 -36
- package/src/bridges/cctp/handlers/estimate-gas.test.ts +0 -110
- package/src/bridges/cctp/handlers/estimate-gas.ts +0 -58
- package/src/bridges/cctp/handlers/get-assets.test.ts +0 -47
- package/src/bridges/cctp/handlers/get-assets.ts +0 -27
- package/src/bridges/cctp/handlers/get-fees.test.ts +0 -61
- package/src/bridges/cctp/handlers/get-fees.ts +0 -26
- package/src/bridges/cctp/handlers/track-transfer.test.ts +0 -779
- package/src/bridges/cctp/handlers/track-transfer.ts +0 -365
- package/src/bridges/cctp/handlers/transfer-asset.test.ts +0 -429
- package/src/bridges/cctp/handlers/transfer-asset.ts +0 -179
- package/src/bridges/cctp/index.ts +0 -1
- package/src/bridges/cctp/types/chain.ts +0 -9
- package/src/bridges/cctp/types/config.ts +0 -20
- package/src/bridges/cctp/utils/build-tx.ts +0 -30
- package/src/bridges/cctp/utils/config.test.ts +0 -49
- package/src/bridges/cctp/utils/config.ts +0 -36
- package/src/bridges/cctp/utils/transfer-data.test.ts +0 -83
- package/src/bridges/cctp/utils/transfer-data.ts +0 -48
- package/src/errors/bridge-error.ts +0 -11
- package/src/errors/bridge-initialization-error.ts +0 -9
- package/src/errors/bridge-unavailable-error.ts +0 -9
- package/src/errors/index.ts +0 -4
- package/src/errors/invalid-params-error.ts +0 -9
- package/src/index.ts +0 -3
- package/src/types/asset.ts +0 -26
- package/src/types/bridge.ts +0 -64
- package/src/types/chain.ts +0 -10
- package/src/types/config.ts +0 -10
- package/src/types/environment.ts +0 -4
- package/src/types/error.ts +0 -19
- package/src/types/index.ts +0 -9
- package/src/types/provider.ts +0 -12
- package/src/types/signer.ts +0 -18
- package/src/types/transfer.ts +0 -35
- package/src/unified-bridge-service.test.ts +0 -209
- package/src/unified-bridge-service.ts +0 -97
- package/src/utils/bridge-types.test.ts +0 -103
- package/src/utils/bridge-types.ts +0 -32
- package/src/utils/caip2.test.ts +0 -44
- package/src/utils/caip2.ts +0 -41
- package/src/utils/client.test.ts +0 -97
- package/src/utils/client.ts +0 -44
- package/src/utils/ensure-config.test.ts +0 -43
- package/src/utils/ensure-config.ts +0 -12
- package/src/utils/index.ts +0 -2
- package/src/utils/network-fee.test.ts +0 -24
- package/src/utils/network-fee.ts +0 -6
- package/src/utils/retry-promise.test.ts +0 -115
- package/src/utils/retry-promise.ts +0 -72
- package/src/utils/wait.test.ts +0 -33
- package/src/utils/wait.ts +0 -4
- package/tsconfig.jest.json +0 -7
- package/tsconfig.json +0 -9
- package/tsup.config.ts +0 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/asset.ts","../src/types/bridge.ts","../src/types/environment.ts","../src/types/error.ts","../src/errors/bridge-error.ts","../src/errors/bridge-unavailable-error.ts","../src/errors/bridge-initialization-error.ts","../src/errors/invalid-params-error.ts","../src/bridges/cctp/utils/config.ts","../src/bridges/cctp/handlers/get-assets.ts","../src/utils/client.ts","../src/utils/caip2.ts","../src/bridges/cctp/abis/token-router.ts","../src/bridges/cctp/utils/transfer-data.ts","../src/bridges/cctp/handlers/get-fees.ts","../src/bridges/cctp/handlers/transfer-asset.ts","../src/bridges/cctp/abis/erc20.ts","../src/bridges/cctp/utils/build-tx.ts","../src/utils/ensure-config.ts","../src/bridges/cctp/handlers/track-transfer.ts","../src/utils/network-fee.ts","../src/utils/wait.ts","../src/utils/retry-promise.ts","../src/bridges/cctp/handlers/estimate-gas.ts","../src/bridges/cctp/factory.ts","../src/utils/bridge-types.ts","../src/unified-bridge-service.ts"],"names":["TokenType","BridgeType","BridgeSignatureReason","Environment","ErrorCode","ErrorReason","BridgeError","message","code","details","BridgeUnavailableError","BridgeInitializationError","InvalidParamsError","CONFIG_URLS","getConfig","environment","chainData","err","getTrackingDelayByChainId","chainId","getAssets","bridge","chainIds","assets","asset","destinations","createWalletClient","publicActions","custom","http","namespacePattern","referencePattern","delimeter","toJSON","identifier","namespace","reference","toString","caip2_default","_getChain","chain","getClientForChain","provider","chainInfo","transport","TOKEN_ROUTER_ABI","getTransferData","sourceChain","targetChain","amount","config","sourceChainData","targetChainData","burnToken","token","mintToken","getFees","params","feeAmount","isAddress","ERC20_ABI","encodeFunctionData","buildTransferTxData","toAddress","buildApprovalTxData","approveAndTransfer","fromAddress","maybeToAddress","sourceProvider","onStepChange","sign","client","isAllowanceApprovalRequired","requiredSignatures","data","txHash","signedTxHash","request","getStartBlockNumber","targetClient","transferAsset","requiredSourceConfirmationCount","requiredTargetConfirmationCount","fees","bridgeFee","sourceStartedAt","targetBlockNumber","ensureHasConfig","decodeEventLog","getNetworkFeeEVM","transaction","receipt","wait","time","res","retryPromise","promise","delay","startAfter","isRunning","isCancelled","errorCount","resolve","reject","done","cancel","rej","execute","TRACKING_LIMIT_MS","MAX_BLOCKS","INITIAL_DELAY","updateTransfer","initial","updated","updateListener","value","trackSourceTx","targetProvider","bridgeTransfer","sourceClient","updateableTransfer","txReceipt","tx","networkFee","confirmationCount","hasMoreConfirmations","hasRequiredConfirmations","changes","transferEventLog","log","nonce","trackTargetTx","lastBlockNumber","lowestBlockNumber","fromBlock","highestBlockNumber","toBlock","targetLogs","trackTransfer","abortFn","sourceTracker","cancelSourceTracking","transferAfterSourceFinished","targetTracker","cancelTargetTracking","ETH_APPROVAL_TX_GAS_ESTIMATE","ETH_TRANSFER_TX_GAS_ESTIMATE","AVAX_APPROVAL_TX_GAS_ESTIMATE","AVAX_TRANSFER_TX_GAS_ESTIMATE","estimateGas","allowance","isOffboarding","cctpBridgeFactory","supportedBridges","getEnabledBridgeServices","disabledBridgeTypes","bridgeType","factory","getBridgeForTransfer","enabledBridgeServices","targetChainId","isArray","mergeWith","createUnifiedBridgeService","updateConfigs","bridgeService","aggregatedAssets","chainAssetMap","bridgeAssets","existingAssets","bridgeAsset","index","symbol","objValue","srcValue"],"mappings":"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OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,uBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,kBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,uBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,aACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,eACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,sBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,SACd,KAAM,SACN,KAAM,QACR,EACA,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,gBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,YACN,KAAM,MACR,CACF,EACA,QAAS,GACT,aAAc,wCACd,KAAM,mBACN,KAAM,OACR,CACF,EACA,KAAM,0BACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,SACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,SACd,KAAM,QACN,KAAM,QACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,SACd,KAAM,oBACN,KAAM,QACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,wBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,oBACN,KAAM,QACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,uBACN,QAAS,CACP,CACE,aAAc,iCACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,8BACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,sBACN,QAAS,CACP,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,gBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,YACN,KAAM,MACR,CACF,EACA,aAAc,wCACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,mBACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,qBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,2BACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,EACA,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,gBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,YACN,KAAM,MACR,CACF,EACA,aAAc,wCACd,KAAM,mBACN,KAAM,OACR,CACF,EACA,KAAM,sBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,KAAM,sBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,oBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,QACN,KAAM,QACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,UACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,CACF,ECn0BO,IAAMC,EAAkB,CAAC,CAAE,YAAAC,EAAa,YAAAC,EAAa,OAAAC,EAAQ,MAAAzB,CAAM,EAA0B0B,IAAmB,CACrH,GAAIH,EAAY,UAAYC,EAAY,QACtC,MAAM,IAAIpC,6BAAwD,EAGpE,GAAIqC,GAAU,GACZ,MAAM,IAAIrC,8BAA0D,kCAAkC,EAGxG,IAAMuC,EAAkBD,EAAO,KAAMlC,GAAcA,EAAU,UAAY+B,EAAY,OAAO,EAE5F,GAAI,CAACI,EACH,MAAM,IAAIvC,wBAER,kCAAkCmC,EAAY,OAAO,GACvD,EAGF,IAAMK,EAAkBF,EAAO,KAAMlC,GAAcA,EAAU,UAAYgC,EAAY,OAAO,EAE5F,GAAI,CAACI,EACH,MAAM,IAAIxC,wBAER,kCAAkCoC,EAAY,OAAO,GACvD,EAGF,IAAMK,EAAYF,EAAgB,OAAO,KAAMG,GAAUA,EAAM,SAAW9B,EAAM,MAAM,EAChF+B,EAAYH,EAAgB,OAAO,KAAME,GAAUA,EAAM,SAAW9B,EAAM,MAAM,EAEtF,GAAI,CAAC6B,GAAa,CAACE,EACjB,MAAM,IAAI3C,uBAAkD,EAG9D,MAAO,CACL,gBAAAuC,EACA,gBAAAC,EACA,UAAAC,EACA,UAAAE,CACF,CACF,EC1CA,eAAsBC,EAAQnC,EAAuBoC,EAAmB,CACtE,MAAMpC,EAAO,gBAAgB,EAE7B,GAAM,CAAE,YAAA0B,EAAa,YAAAC,EAAa,MAAAxB,EAAO,OAAAyB,EAAQ,SAAAP,CAAS,EAAIe,EACxD,CAAE,gBAAAN,EAAiB,gBAAAC,EAAiB,UAAAC,CAAU,EAAIP,EACtD,CAAE,YAAAC,EAAa,YAAAC,EAAa,MAAAxB,EAAO,OAAAyB,CAAO,EAC1C5B,EAAO,MACT,EAGMqC,EAAY,MADHjB,EAAkB,CAAE,MAAOM,EAAa,SAAAL,CAAS,CAAC,EAClC,aAAa,CAC1C,QAASS,EAAgB,mBACzB,IAAKN,EACL,aAAc,eACd,KAAM,CAACI,EAAQG,EAAgB,MAAM,CACvC,CAAC,EAED,MAAO,CACL,CAACC,EAAU,OAAO,EAAGK,CACvB,CACF,CCzBA,OAAS,aAAAC,MAAoC,OCAtC,IAAMC,EAAY,CACvB,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,QAAS,CAAC,EACtC,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CAAE,KAAM,WAAY,KAAM,SAAU,EACpC,CAAE,KAAM,SAAU,KAAM,SAAU,CACpC,EACA,KAAM,UACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,MAAO,CAAC,EACpC,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,SAAU,CAAC,EACvC,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CAAE,KAAM,QAAS,KAAM,SAAU,EACjC,CAAE,KAAM,MAAO,KAAM,SAAU,EAC/B,CAAE,KAAM,SAAU,KAAM,SAAU,CACpC,EACA,KAAM,eACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,MAAO,CAAC,EACpC,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,OAAQ,CAAC,EACrC,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,CAAE,KAAM,SAAU,KAAM,SAAU,CAAC,EAC5C,KAAM,YACN,QAAS,CAAC,CAAE,KAAM,UAAW,KAAM,SAAU,CAAC,EAC9C,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,QAAS,CAAC,EACtC,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CAAE,KAAM,MAAO,KAAM,SAAU,EAC/B,CAAE,KAAM,SAAU,KAAM,SAAU,CACpC,EACA,KAAM,WACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,MAAO,CAAC,EACpC,QAAS,GACT,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,SAAU,GACV,OAAQ,CACN,CAAE,KAAM,SAAU,KAAM,SAAU,EAClC,CAAE,KAAM,WAAY,KAAM,SAAU,CACtC,EACA,KAAM,YACN,QAAS,CAAC,CAAE,KAAM,GAAI,KAAM,SAAU,CAAC,EACvC,QAAS,GACT,gBAAiB,OACjB,KAAM,UACR,EACA,CAAE,QAAS,GAAM,gBAAiB,UAAW,KAAM,UAAW,EAC9D,CACE,UAAW,GACX,OAAQ,CACN,CAAE,QAAS,GAAM,KAAM,QAAS,KAAM,SAAU,EAChD,CAAE,QAAS,GAAM,KAAM,UAAW,KAAM,SAAU,EAClD,CAAE,QAAS,GAAO,KAAM,QAAS,KAAM,SAAU,CACnD,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CAAE,QAAS,GAAM,KAAM,OAAQ,KAAM,SAAU,EAC/C,CAAE,QAAS,GAAM,KAAM,KAAM,KAAM,SAAU,EAC7C,CAAE,QAAS,GAAO,KAAM,QAAS,KAAM,SAAU,CACnD,EACA,KAAM,WACN,KAAM,OACR,CACF,ECpHA,OAAS,sBAAAC,MAA0B,OAK5B,SAASC,EAAoB,CAClC,OAAAb,EACA,UAAAI,EACA,gBAAAD,EACA,UAAAW,CACF,EAKG,CACD,OAAOF,EAAmB,CACxB,IAAKhB,EACL,aAAc,iBACd,KAAM,CAACI,EAAQG,EAAgB,OAAQW,EAAWV,EAAU,OAAO,CACrE,CAAC,CACH,CAEO,SAASW,EAAoB,CAAE,OAAAf,EAAQ,gBAAAE,CAAgB,EAAmD,CAC/G,OAAOU,EAAmB,CACxB,IAAKD,EACL,aAAc,UACd,KAAM,CAACT,EAAgB,mBAAoBF,CAAM,CACnD,CAAC,CACH,CFZA,IAAMgB,GAAqB,MAAO5C,EAAuBoC,IAA2B,CAClF,GAAM,CACJ,YAAAV,EACA,YAAAC,EACA,MAAAxB,EACA,OAAAyB,EACA,YAAAiB,EACA,UAAWC,EACX,eAAAC,EACA,aAAAC,EACA,KAAAC,CACF,EAAIb,EACEM,EAAYI,GAAkBD,EAEpC,GAAI,CAACP,EAAUO,CAAW,GAAK,CAACP,EAAUI,CAAS,EACjD,MAAM,IAAInD,8BAAyD,EAGrE,GAAM,CAAE,gBAAAuC,EAAiB,gBAAAC,EAAiB,UAAAC,CAAU,EAAIP,EACtD,CAAE,YAAAC,EAAa,YAAAC,EAAa,MAAAxB,EAAO,OAAAyB,CAAO,EAC1C5B,EAAO,MACT,EACMkD,EAAS9B,EAAkB,CAAE,MAAOM,EAAa,SAAUqB,CAAe,CAAC,EAS3EI,EAPY,MAAMD,EAAO,aAAa,CAC1C,QAASlB,EAAU,QACnB,IAAKO,EACL,aAAc,YACd,KAAM,CAACM,EAAaf,EAAgB,kBAAkB,CACxD,CAAC,EAE+CF,EAC1CwB,EAAqBD,EAA8B,EAAI,EAE7D,GAAIA,EAOF,GANAH,IAAe,CACb,iBAAkB,EAClB,4CACA,mBAAAI,CACF,CAAC,EAEGH,EAAM,CACR,IAAMI,EAAOV,EAAoB,CAC/B,OAAAf,EACA,gBAAAE,CACF,CAAC,EACKwB,EAAS,MAAML,EACnB,CACE,KAAMJ,EACN,GAAIb,EAAU,QACd,KAAAqB,CACF,EACCE,GAAsBL,EAAO,mBAAmB,CAAE,sBAAuBK,CAAa,CAAC,CAC1F,EAEA,MAAML,EAAO,0BAA0B,CAAE,KAAMI,EAAQ,gBAAiB,GAAM,CAAC,CACjF,KAAO,CACL,GAAM,CAAE,QAAAE,CAAQ,EAAI,MAAMN,EAAO,iBAAiB,CAChD,QAASL,EACT,QAASb,EAAU,QACnB,IAAKO,EACL,aAAc,UACd,KAAM,CAACT,EAAgB,mBAAoBF,CAAM,CACnD,CAAC,EAEK0B,EAAS,MAAMJ,EAAO,cAAcM,CAAO,EACjD,MAAMN,EAAO,0BAA0B,CAAE,KAAMI,EAAQ,gBAAiB,GAAM,CAAC,CACjF,CASF,GANAN,IAAe,CACb,iBAAkBG,EAA8B,EAAI,EACpD,yCACA,mBAAAC,CACF,CAAC,EAEGH,EAAM,CACR,IAAMI,EAAOZ,EAAoB,CAC/B,OAAAb,EACA,UAAAI,EACA,gBAAAD,EACA,UAAAW,CACF,CAAC,EAED,OAAOO,EACL,CACE,KAAMJ,EACN,GAAIf,EAAgB,mBACpB,KAAAuB,CACF,EACCE,GAAsBL,EAAO,mBAAmB,CAAE,sBAAuBK,CAAa,CAAC,CAC1F,CACF,KAAO,CACL,GAAM,CAAE,QAAAC,CAAQ,EAAI,MAAMN,EAAO,iBAAiB,CAChD,QAASL,EACT,QAASf,EAAgB,mBACzB,IAAKN,EACL,aAAc,iBACd,KAAM,CAACI,EAAQG,EAAgB,OAAQW,EAAWV,EAAU,OAAO,CACrE,CAAC,EAED,OAAOkB,EAAO,cAAcM,CAAO,CACrC,CACF,EAEMC,GAAsB,MAAOC,GAA+B,CAChE,GAAI,CAEF,OADyB,MAAMA,EAAa,eAAe,CAE7D,MAAQ,CACN,MACF,CACF,EAEA,eAAsBC,EACpB3D,EACAoC,EACA1C,EACyB,CACzB,MAAMM,EAAO,gBAAgB,EAE7B,GAAM,CAAE,qBAAsB4D,CAAgC,EAC5D5D,EAAO,OAAQ,KAAML,GAAcA,EAAU,UAAYyC,EAAO,YAAY,OAAO,GAAK,CAAC,EACrF,CAAE,qBAAsByB,CAAgC,EAC5D7D,EAAO,OAAQ,KAAML,GAAcA,EAAU,UAAYyC,EAAO,YAAY,OAAO,GAAK,CAAC,EAE3F,GAAI,CAACwB,GAAmC,CAACC,EACvC,MAAM,IAAItE,8BAAyD,EAGrE,IAAMuE,EAAO,MAAM9D,EAAO,QAAQ,CAAE,GAAGoC,EAAQ,SAAUA,EAAO,cAAe,CAAC,EAE1E2B,GAAa3B,EAAO,MAAM,SAAW0B,EAAK1B,EAAO,MAAM,OAAO,IAAM,GACpEkB,EAAS,MAAMV,GAAmB5C,EAAQoC,CAAM,EAChD4B,EAAkB,KAAK,IAAI,EAC3BN,EAAetC,EAAkB,CAAE,MAAOgB,EAAO,YAAa,SAAUA,EAAO,cAAe,CAAC,EAC/F6B,EAAoB,MAAMR,GAAoBC,CAAY,EAEhE,MAAO,CACL,KAAM1D,EAAO,KACb,YAAAN,EACA,YAAa0C,EAAO,YACpB,UAAWA,EAAO,WAAaA,EAAO,YACtC,OAAQA,EAAO,OACf,eAAgBA,EAAO,MAAM,SAC7B,OAAQA,EAAO,MAAM,OAErB,UAAA2B,EAEA,YAAa3B,EAAO,YACpB,gBAAA4B,EACA,aAAcV,EACd,wBAAyB,EACzB,gCAAAM,EAEA,YAAaxB,EAAO,YACpB,wBAAyB,EACzB,gCAAAyB,EAEA,iBAAkBI,CACpB,CACF,CG/KA,eAAsBC,EAAgBlE,EAAuB,CAC3D,GAAI,CAACA,EAAO,SACV,MAAMA,EAAO,aAAa,EAEtB,CAACA,EAAO,QACV,MAAM,IAAIV,wBAA0D,CAG1E,CCXA,OAAS,kBAAA6E,MAAoC,OCA7C,MAA0D,OAGnD,IAAMC,EAAmB,CAACC,EAA0BC,IAClDD,EAAY,UAAY,OAAOA,EAAY,SAAWC,EAAQ,OAAO,ECJvE,IAAMC,EAAO,MAAOC,GACzB,IAAI,QAASC,GAAQ,CACnB,WAAWA,EAAKD,CAAI,CACtB,CAAC,ECOI,IAAME,EAAe,CAAI,CAAE,QAAAC,EAAS,MAAAC,EAAO,WAAAC,CAAW,IAAiB,CAC5E,IAAIC,EAAY,GACZC,EAAc,GACdC,EAAqB,EACrBC,EACAC,EAEEC,EAAQ9B,GAAY,CACpB4B,GAAWH,IACbA,EAAY,GACZG,EAAQ5B,CAAI,EAEhB,EAEM+B,EAAS,IAAM,CACnBL,EAAc,GAEVG,GAAUJ,IACZA,EAAY,GACZI,EAAO,WAAW,EAEtB,EAoCA,MAAO,CACL,OAnCa,IAAI,QAAW,CAACT,EAAKY,IAAQ,CAC1CP,EAAY,GACZG,EAAUR,EACVS,EAASG,EAET,IAAMC,EAAU,SAA2B,CACzC,GAAI,GAACR,GAAaC,GAIlB,IAAI,CAGF,GAFA,MAAMJ,EAAQQ,CAAI,EAEd,CAACL,GAAaC,EAChB,OAGF,MAAMR,EAAKK,CAAK,CAClB,OAAShF,EAAK,CACZ,QAAQ,MAAOA,EAAc,OAAO,EACpCoF,GAAc,EACd,MAAMT,EAAK,GAAKS,EAAaJ,CAAK,CACpC,CAEA,MAAMU,EAAQ,EAChB,EAEIT,EACF,WAAWS,EAAST,CAAU,EAE9BS,EAAQ,CAEZ,CAAC,EAIC,OAAAF,CACF,CACF,EHtDO,IAAMG,GAAoB,IAAO,GAAK,GAAK,EAErCC,GAAa,MAEbC,GAAgB,IAMvBC,EAAiB,CACrBC,EACAC,EACAC,IACG,CACH,OAAO,OAAOF,EAAS,OAAO,YAAY,OAAO,QAAQC,CAAO,EAAE,OAAO,CAAC,CAAC,CAAEE,CAAK,IAAMA,IAAU,MAAS,CAAC,CAAC,EAC7GD,EAAe,CAAE,GAAGF,CAAQ,CAAC,CAC/B,EAMaI,GAAgB,MAAOlE,EAAsBO,IAA2B,CACnF,GAAM,CAAE,eAAAW,EAAgB,eAAAiD,EAAgB,eAAAH,EAAgB,eAAAI,CAAe,EAAI7D,EACrE8D,EAAe9E,EAAkB,CAAE,MAAO6E,EAAe,YAAa,SAAUlD,CAAe,CAAC,EAChGjB,EAAkBD,EAAO,KAAMlC,GAAcA,EAAU,UAAYsG,EAAe,YAAY,OAAO,EACrGvC,EAAetC,EAAkB,CAAE,MAAO6E,EAAe,YAAa,SAAUD,CAAe,CAAC,EAChGjE,EAAkBF,EAAO,KAAMlC,GAAcA,EAAU,UAAYsG,EAAe,YAAY,OAAO,EACrGE,EAAqB,CAAE,GAAGF,CAAe,EAE/C,GAAI,CAACnE,GAAmB,CAACC,EACvB,MAAM,IAAIxC,uBAAkD,EA2H9D,OAAOmF,EAA6B,CAClC,QAzHc,MAAOS,GAA+B,CAMpD,GAAIgB,EAAmB,aAAeA,EAAmB,UAAU,MACjE,OAAOhB,EAAKgB,CAAkB,EAMhC,GAAIA,EAAmB,gBAAkBZ,IAAqB,KAAK,IAAI,EACrE,OAAAG,EAAeS,EAAoB,CAAE,YAAa,KAAK,IAAI,EAAG,cAA6B,EAAGN,CAAc,EACrGV,EAAKgB,CAAkB,EAOhC,IAAMC,EAAY,MAAMF,EAAa,sBAAsB,CACzD,KAAMC,EAAmB,YAC3B,CAAC,EAKD,GAAI,CAACA,EAAmB,iBAAkB,CACxC,IAAME,EAAK,MAAMH,EAAa,eAAe,CAAE,KAAMC,EAAmB,YAAwB,CAAC,EAC3FG,EAAalC,EAAiBiC,EAAID,CAAS,EAE7CE,GACFZ,EAAeS,EAAoB,CAAE,iBAAkBG,CAAW,EAAGT,CAAc,CAEvF,CAKA,GAAIO,EAAU,SAAW,WACvB,OAAAV,EACES,EACA,CAAE,YAAa,KAAK,IAAI,EAAG,cAA0C,EACrEN,CACF,EACOV,EAAKgB,CAAkB,EAShC,IAAMI,EAAoB,MAAML,EAAa,4BAA4B,CACvE,KAAMC,EAAmB,YAC3B,CAAC,EACKK,EAAuBD,EAAoBJ,EAAmB,wBAC9DM,EAA2BF,GAAqBJ,EAAmB,gCAEzE,GAAIK,EAAsB,CACxB,IAAME,EAAU,CAAC,EACjBA,EAAQ,wBAA0B,OAAOH,CAAiB,EAErDE,IACHC,EAAQ,iBAAmB,MAAMhD,EAAa,eAAe,GAG/DgC,EAAeS,EAAoBO,EAASb,CAAc,CAC5D,CAEA,GAAI,CAACY,EACH,OAGGN,EAAmB,kBACtBT,EAAeS,EAAoB,CAAE,iBAAkB,MAAMzC,EAAa,eAAe,CAAE,EAAGmC,CAAc,EAM9G,IAAMc,EAAmBP,EAAU,KAAK,KAAMQ,GACxCA,EAAI,QAAQ,YAAY,IAAM9E,EAAgB,mBAAmB,YAAY,EACjEqC,EAAe,CAC3B,IAAK3C,EACL,GAAGoF,CACL,CAAC,EAEY,YAAc,iBAGtB,EACR,EAED,GAAI,CAACD,EACH,MAAM,IAAIpH,mBAER,gEAAgE4G,EAAmB,YAAY,GACjG,EAcF,IAAMU,EAPgB1C,EAAe,CACnC,IAAK3C,EACL,UAAW,iBACX,GAAGmF,CACL,CAAC,EAG2B,KAAK,MACjC,OAAAjB,EAAeS,EAAoB,CAAE,gBAAiB,KAAK,IAAI,EAAG,SAAU,CAAE,MAAAU,CAAM,CAAE,EAAGhB,CAAc,EAChGV,EAAKgB,CAAkB,CAChC,EAIE,MAAOtG,EAA0BiC,EAAgB,OAAO,EACxD,WAAY2D,EACd,CAAC,CACH,EAMaqB,GAAgB,MAAOjF,EAAsBO,IAA2B,CACnF,GAAM,CAAE,eAAA4D,EAAgB,eAAAH,EAAgB,eAAAI,CAAe,EAAI7D,EACrD+D,EAAqB,CAAE,GAAGF,CAAe,EAE/C,GAAI,CAACA,EAAe,aAAe,CAACA,EAAe,UAAU,MAC3D,MAAM,IAAI1G,mBAA+C,kBAAkB,EAG7E,GAAI,CAAC0G,EAAe,iBAClB,MAAM,IAAI1G,mBAA+C,6BAA6B,EAGxF,IAAMmE,EAAetC,EAAkB,CAAE,MAAO6E,EAAe,YAAa,SAAUD,CAAe,CAAC,EAChGjE,EAAkBF,EAAO,KAAMlC,GAAcA,EAAU,UAAYsG,EAAe,YAAY,OAAO,EAE3G,GAAI,CAAClE,EACH,MAAM,IAAIxC,mBAER,yBAAyB0G,EAAe,YAAY,OAAO,GAC7D,EAwHF,OAAOvB,EAA6B,CAClC,QAtHc,MAAOS,GAA+B,CAKpD,GAAIgB,EAAmB,YACrB,OAAOhB,EAAKgB,CAAkB,EAMhC,GAAI,CAACA,EAAmB,iBACtB,OAAAT,EACES,EACA,CAAE,YAAa,KAAK,IAAI,EAAG,cAAoC,EAC/DN,CACF,EACOV,EAAKgB,CAAkB,EAMhC,GAAIA,EAAmB,gBAAkBZ,IAAqB,KAAK,IAAI,EACrE,OAAAG,EAAeS,EAAoB,CAAE,YAAa,KAAK,IAAI,EAAG,cAA6B,EAAGN,CAAc,EACrGV,EAAKgB,CAAkB,EAGhC,GAAI,CAACA,EAAmB,aAAc,CACpC,IAAMY,EAAkB,MAAMrD,EAAa,eAAe,EACpDsD,EAAoBb,EAAmB,iBAAmBX,GAC1DyB,EAAYD,GAAqB,GAAKA,EAAoB,WAC1DE,EAAqBf,EAAmB,iBAAmBX,GAC3D2B,EAAUD,EAAqBH,EAAkBG,EAAqB,SAEtEE,EAAa,MAAM1D,EAAa,QAAQ,CAC5C,QAAS3B,EAAgB,0BACzB,MAAO,CACL,KAAM,kBACN,KAAM,QACN,OAAQ,CACN,CAAE,QAAS,GAAM,aAAc,UAAW,KAAM,SAAU,KAAM,SAAU,EAC1E,CAAE,QAAS,GAAO,aAAc,SAAU,KAAM,eAAgB,KAAM,QAAS,EAC/E,CAAE,QAAS,GAAM,aAAc,SAAU,KAAM,QAAS,KAAM,QAAS,EACvE,CAAE,QAAS,GAAO,aAAc,UAAW,KAAM,SAAU,KAAM,SAAU,EAC3E,CAAE,QAAS,GAAO,aAAc,QAAS,KAAM,cAAe,KAAM,OAAQ,CAC9E,CACF,EACA,KAAM,CAAE,MAAOoE,EAAmB,SAAU,KAAgB,EAC5D,UAAAc,EACA,QAAAE,CACF,CAAC,EAED,GAAIC,EAAW,CAAC,GAAG,gBACjB1B,EAAeS,EAAoB,CAAE,aAAciB,EAAW,CAAC,EAAE,eAAgB,EAAGvB,CAAc,MAC7F,CACLH,EAAeS,EAAoB,CAAE,iBAAkBY,CAAgB,EAAGlB,CAAc,EACxF,MACF,CACF,CAMA,IAAMO,EAAY,MAAM1C,EAAa,sBAAsB,CACzD,KAAMyC,EAAmB,YAC3B,CAAC,EAKD,GAAI,CAACA,EAAmB,iBAAkB,CACxC,IAAME,EAAK,MAAM3C,EAAa,eAAe,CAAE,KAAMyC,EAAmB,YAAwB,CAAC,EAC3FG,EAAalC,EAAiBiC,EAAID,CAAS,EAE7CE,GACFZ,EAAeS,EAAoB,CAAE,iBAAkBG,CAAW,EAAGT,CAAc,CAEvF,CAKA,GAAIO,EAAU,SAAW,WACvB,OAAAV,EACES,EACA,CAAE,YAAa,KAAK,IAAI,EAAG,cAA0C,EACrEN,CACF,EACOV,EAAKgB,CAAkB,EAQhC,IAAMI,EAAoB,MAAM7C,EAAa,4BAA4B,CACvE,KAAMyC,EAAmB,YAC3B,CAAC,EACKK,EAAuBD,EAAoBJ,EAAmB,wBAC9DM,EAA2BF,GAAqBJ,EAAmB,gCAMzE,GAJIK,GACFd,EAAeS,EAAoB,CAAE,wBAAyB,OAAOI,CAAiB,CAAE,EAAGV,CAAc,EAGvG,EAACY,EAIL,OAAAf,EAAeS,EAAoB,CAAE,YAAa,KAAK,IAAI,CAAE,EAAGN,CAAc,EACvEV,EAAKgB,CAAkB,CAChC,EAIE,MAAOtG,EAA0BkC,EAAgB,OAAO,EACxD,WAAY0D,EACd,CAAC,CACH,EAEO,SAAS4B,GAAcrH,EAAuBoC,EAAwB,CAC3E,IAAIkF,EAEElC,EAAS,IAAM,CACnBkC,IAAU,CACZ,EA0BA,MAAO,CACL,QAzBsB,SAAY,CAClC,MAAMtH,EAAO,gBAAgB,EAE7B,GAAM,CAAE,eAAA+C,EAAgB,eAAAiD,EAAgB,eAAAH,EAAgB,eAAAI,CAAe,EAAI7D,EAErE,CAAE,OAAQmF,EAAe,OAAQC,CAAqB,EAAI,MAAMzB,GAAc/F,EAAO,OAAS,CAClG,eAAA+C,EACA,eAAAiD,EACA,eAAAH,EACA,eAAAI,CACF,CAAC,EACDqB,EAAUE,EACV,IAAMC,EAA8B,MAAMF,EAEpC,CAAE,OAAQG,EAAe,OAAQC,CAAqB,EAAI,MAAMb,GAAc9G,EAAO,OAAS,CAClG,eAAA+C,EACA,eAAAiD,EACA,eAAAH,EACA,eAAgB4B,CAClB,CAAC,EACD,OAAAH,EAAUK,EACHD,CACT,GAG0B,EACxB,OAAAtC,CACF,CACF,CI5WA,OAAS,aAAA9C,OAAiB,OAU1B,IAAMsF,GAA+B,OAC/BC,GAA+B,QAC/BC,GAAgC,OAChCC,GAAgC,QActC,eAAsBC,GAAYhI,EAAuBoC,EAAyC,CAChG,MAAMpC,EAAO,gBAAgB,EAE7B,GAAM,CAAE,YAAA0B,EAAa,YAAAC,EAAa,MAAAxB,EAAO,OAAAyB,EAAQ,YAAAiB,EAAa,UAAWC,EAAgB,eAAAC,CAAe,EAAIX,EACtGM,EAAYI,GAAkBD,EAEpC,GAAI,CAACP,GAAUO,CAAW,GAAK,CAACP,GAAUI,CAAS,EACjD,MAAM,IAAInD,8BAAyD,EAGrE,GAAM,CAAE,gBAAAuC,EAAiB,UAAAE,CAAU,EAAIP,EAAgB,CAAE,YAAAC,EAAa,YAAAC,EAAa,MAAAxB,EAAO,OAAAyB,CAAO,EAAG5B,EAAO,MAAO,EAI5GiI,EAAY,MAFH7G,EAAkB,CAAE,MAAOM,EAAa,SAAUqB,CAAe,CAAC,EAElD,aAAa,CAC1C,QAASf,EAAU,QACnB,IAAKO,EACL,aAAc,YACd,KAAM,CAACM,EAAaf,EAAgB,kBAAkB,CACxD,CAAC,EAEKoG,EAAgBpG,EAAgB,SAAW,EAEjD,OAAImG,GAAarG,EACRsG,EAAgBH,GAAgCF,GAGlDK,EACHJ,GAAgCC,GAChCH,GAA+BC,EACrC,CChDO,IAAMM,GAA2CzI,IAC/C,CACL,YACA,OAAQ,KACR,aAAc,gBAAkB,CAC9B,KAAK,OAAS,MAAMD,EAAUC,CAAW,CAC3C,EACA,gBAAiB,gBAAkB,CACjC,OAAOwE,EAAgB,IAAI,CAC7B,EACA,YAAa,SAAU9B,EAAQ,CAC7B,OAAO4F,GAAY,KAAM5F,CAAM,CACjC,EACA,UAAW,gBAAkB,CAC3B,OAAOrC,EAAU,IAAI,CACvB,EACA,QAAS,eAAgBqC,EAAQ,CAC/B,OAAOD,EAAQ,KAAMC,CAAM,CAC7B,EACA,cAAe,eAAgBA,EAAQ,CACrC,OAAOuB,EAAc,KAAMvB,EAAQ1C,CAAW,CAChD,EACA,cAAe,SAAU0C,EAAQ,CAC/B,OAAOiF,GAAc,KAAMjF,CAAM,CACnC,CACF,GC5BK,IAAMgG,GAAmB,IAAI,IAAI,CAAC,QAAkBD,EAAiB,CAAC,CAAC,EAEjEE,GAA2B,CAAC3I,EAA0B4I,IAC1D,IAAI,IACT,CAAC,GAAGF,EAAgB,EACjB,OAAO,CAAC,CAACG,CAAU,IAAM,CAACD,GAAqB,SAASC,CAAU,CAAC,EACnE,IAAI,CAAC,CAACA,EAAYC,CAAO,IAAM,CAACD,EAAYC,EAAQ9I,CAAW,CAAC,CAAC,CACtE,EAGW+I,EAAuB,CAClCC,EACAvI,EACAwI,IACG,CACH,IAAMJ,EAAapI,EAAM,aAAawI,CAAa,GAAG,KAAMJ,GAAeG,EAAsB,IAAIH,CAAU,CAAC,EAEhH,GAAI,CAACA,EACH,MAAM,IAAIlJ,EAGZ,MAAO,CACL,KAAMkJ,EACN,OAAQG,EAAsB,IAAIH,CAAU,CAC9C,CACF,EC3BA,OAAS,WAAAK,GAAS,aAAAC,OAAiB,SAG5B,IAAMC,GAA6B,CAAC,CAAE,YAAApJ,EAAa,oBAAA4I,CAAoB,IAA2B,CACvG,IAAMI,EAAwBL,GAAyB3I,EAAa4I,CAAmB,EAEjFS,EAAgB,SAAY,CAChC,MAAM,QAAQ,WACZ,MAAM,KAAKL,CAAqB,EAAE,IAAI,CAAC,CAAC,CAAEM,CAAa,IAAMA,EAAc,aAAa,CAAC,CAC3F,CACF,EAsEA,MAAO,CACL,YAAAtJ,EACA,QAASgJ,EACT,KAvEW,SAAY,CACvB,MAAMK,EAAc,CACtB,EAsEE,cAAAA,EACA,UArEgB,UACD,MAAM,QAAQ,IAAI,MAAM,KAAKL,CAAqB,EAAE,IAAI,CAAC,CAAC,CAAE1I,CAAM,IAAMA,EAAO,UAAU,CAAC,CAAC,GAC5F,OAAsB,CAACiJ,EAAkBC,IAAkB,CACvE,OAAW,CAACpJ,EAASqJ,CAAY,IAAK,OAAO,QAAQD,CAAa,EAAG,CACnE,IAAME,EAAiBH,EAAiBnJ,CAAO,EAE/C,GAAIsJ,EACF,QAAWC,KAAeF,EAAc,CACtC,IAAMG,EAAQF,EAAe,UAAU,CAAC,CAAE,OAAAG,CAAO,IAAMA,IAAWF,EAAY,MAAM,EAEhFC,IAAU,GACZF,EAAe,KAAKC,CAAW,EAE/BR,GAAUO,EAAeE,CAAK,EAAGD,EAAa,CAACG,EAAUC,IAAa,CACpE,GAAIb,GAAQY,CAAQ,EAClB,MAAO,CAAC,GAAG,IAAI,IAAIA,EAAS,OAAOC,CAAQ,CAAC,CAAC,CAEjD,CAAC,CAEL,MAEAR,EAAiBnJ,CAAO,EAAIqJ,CAEhC,CAEA,OAAOF,CACT,EAAG,CAAC,CAAC,EA4CL,QAzCc,MAAO7G,GAAsB,CAC3C,GAAM,CAAE,OAAApC,CAAO,EAAIyI,EAAqBC,EAAuBtG,EAAO,MAAOA,EAAO,YAAY,OAAO,EACvG,OAAOpC,EAAO,QAAQoC,CAAM,CAC9B,EAuCE,YAbkB,MAAOA,GAA2B,CACpD,GAAM,CAAE,OAAApC,CAAO,EAAIyI,EAAqBC,EAAuBtG,EAAO,MAAOA,EAAO,YAAY,OAAO,EAEvG,OAAOpC,EAAO,YAAYoC,CAAM,CAClC,EAUE,iBAjCuB,CAACjC,EAAoBwI,IAA0B,CACtE,GAAI,CACF,OAAAF,EAAqBC,EAAuBvI,EAAOwI,CAAa,EACzD,EACT,MAAQ,CACN,MAAO,EACT,CACF,EA2BE,cAvCoB,MAAOvG,GAA2B,CACtD,GAAM,CAAE,OAAApC,CAAO,EAAIyI,EAAqBC,EAAuBtG,EAAO,MAAOA,EAAO,YAAY,OAAO,EACvG,OAAOpC,EAAO,cAAcoC,CAAM,CACpC,EAqCE,cA1BqBA,GAA2B,CAChD,IAAMpC,EAAS0I,EAAsB,IAAItG,EAAO,eAAe,IAAI,EAEnE,GAAI,CAACpC,EACH,MAAM,IAAIX,EAGZ,OAAOW,EAAO,cAAcoC,CAAM,CACpC,CAmBA,CACF","sourcesContent":["import type { Address } from 'viem';\nimport type { BridgeType } from './bridge';\n\nexport enum TokenType {\n NATIVE = 'native',\n ERC20 = 'erc20',\n}\n\nexport type Asset = {\n type: TokenType;\n address?: Address;\n name: string;\n symbol: string;\n decimals: number;\n};\n\n// chainId - bridge type pairs\nexport type DestinationInfo = Record<string, BridgeType[]>;\n\nexport type BridgeAsset = Asset & {\n destinations: DestinationInfo;\n};\n\nexport type ChainAssetMap = Record<string, BridgeAsset[]>;\n\nexport type AssetFeeMap = Record<Address, bigint>;\n","import type { AssetFeeMap, BridgeAsset, ChainAssetMap } from './asset';\nimport type { Chain } from './chain';\nimport type { BridgeConfig } from './config';\nimport type { Environment } from './environment';\nimport type { Provider } from './provider';\nimport type { Signer } from './signer';\nimport type { BridgeTransfer } from './transfer';\n\nexport enum BridgeType {\n CCTP = 'cctp',\n}\n\nexport type FeeParams = {\n asset: BridgeAsset;\n amount: bigint;\n sourceChain: Chain;\n targetChain: Chain;\n provider?: Provider;\n};\n\nexport enum BridgeSignatureReason {\n AllowanceApproval = 'allowance-approval',\n TokensTransfer = 'tokens-transfer',\n}\n\nexport type BridgeStepDetails = {\n currentSignature: number;\n requiredSignatures: number;\n currentSignatureReason: BridgeSignatureReason;\n};\n\nexport type TransferParams = {\n asset: BridgeAsset;\n amount: bigint;\n fromAddress: string;\n toAddress?: string;\n sourceChain: Chain;\n targetChain: Chain;\n sourceProvider?: Provider;\n targetProvider?: Provider;\n onStepChange?: (stepDetails: BridgeStepDetails) => void;\n sign?: Signer;\n};\n\nexport type TrackingParams = {\n bridgeTransfer: BridgeTransfer;\n sourceProvider?: Provider;\n targetProvider?: Provider;\n updateListener: (transfer: BridgeTransfer) => void;\n};\n\nexport type BridgeService = {\n type: BridgeType;\n config: BridgeConfig | null;\n ensureHasConfig: () => Promise<void>;\n updateConfig: () => Promise<void>;\n estimateGas: (params: TransferParams) => Promise<bigint>;\n getAssets: () => Promise<ChainAssetMap>;\n getFees: (params: FeeParams) => Promise<AssetFeeMap>;\n transferAsset: (params: TransferParams) => Promise<BridgeTransfer>;\n trackTransfer: (transfer: TrackingParams) => { cancel: () => void; result: Promise<BridgeTransfer> };\n};\n\nexport type BridgeServiceFactory = (environment: Environment) => BridgeService;\n","export enum Environment {\n PROD = 'production',\n TEST = 'test',\n}\n","export enum ErrorCode {\n BRIDGE_NOT_AVAILABLE = 5001,\n INITIALIZATION_FAILED = 5002,\n INVALID_PARAMS = 5003,\n TIMEOUT = 5004,\n TRANSACTION_REVERTED = 5005,\n}\n\nexport enum ErrorReason {\n UNKNOWN = 'UNKNOWN', // generic, not specified error\n CONFIG_NOT_AVAILABLE = 'CONFIG_NOT_AVAILABLE', // error while fetching or parsing the config\n INVALID_PARAMS = 'INVALID_PARAMS', // generic error with the params\n IDENTICAL_CHAINS_PROVIDED = 'IDENTICAL_CHAINS_PROVIDED', // provided source and target chains are the same\n INCORRECT_AMOUNT_PROVIDED = 'INCORRECT_AMOUNT_PROVIDED', // the transfer amount is incorrect (e.g.: lesser than or equal to zero)\n INCORRECT_ADDRESS_PROVIDED = 'INCORRECT_ADDRESS_PROVIDED', // the sender or recipient address is incorrect\n CHAIN_NOT_SUPPORTED = 'CHAIN_NOT_SUPPORTED', // the provided source or target chain is not supported by the bridge\n ASSET_NOT_SUPPORTED = 'ASSET_NOT_SUPPORTED', // the provided asset is not supported by the bridge\n CONFIRMATION_COUNT_UNKNOWN = 'CONFIRMATION_COUNT_UNKNOWN', // required confirmation count of the source or target chain is unknown\n}\n","import type { ErrorCode } from '../types';\n\nexport class BridgeError extends Error {\n constructor(\n message: string,\n public code: ErrorCode,\n public details?: string,\n ) {\n super(message);\n }\n}\n","import { ErrorCode, ErrorReason } from '../types';\nimport { BridgeError } from './bridge-error';\n\nexport class BridgeUnavailableError extends BridgeError {\n constructor(message = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.BRIDGE_NOT_AVAILABLE, details);\n this.name = 'BridgeUnavailableError';\n }\n}\n","import { ErrorCode, ErrorReason } from '../types';\nimport { BridgeError } from './bridge-error';\n\nexport class BridgeInitializationError extends BridgeError {\n constructor(message = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.INITIALIZATION_FAILED, details);\n this.name = 'BridgeInitializationError';\n }\n}\n","import { ErrorCode, ErrorReason } from '../types';\nimport { BridgeError } from './bridge-error';\n\nexport class InvalidParamsError extends BridgeError {\n constructor(message = ErrorReason.INVALID_PARAMS, details?: string) {\n super(message, ErrorCode.INVALID_PARAMS, details);\n this.name = 'InvalidParamsError';\n }\n}\n","import { BridgeInitializationError } from '../../../errors';\nimport { ErrorReason } from '../../../types';\nimport { Environment } from '../../../types/environment';\nimport { AvalancheChainIds } from '../types/chain';\nimport type { Config } from '../types/config';\n\nconst CONFIG_URLS: Record<Environment, string> = {\n [Environment.TEST]:\n 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.test.json',\n [Environment.PROD]:\n 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.json',\n};\n\nexport const getConfig = async (environment: Environment): Promise<Config> => {\n try {\n const response = await fetch(CONFIG_URLS[environment]!);\n const config: Config = await response.json();\n\n return config.map((chainData) => ({ ...chainData, chainId: `eip155:${chainData.chainId}` }));\n } catch (err) {\n throw new BridgeInitializationError(\n ErrorReason.CONFIG_NOT_AVAILABLE,\n `Error while fetching CCTP config: ${(err as unknown as Error).message}`,\n );\n }\n};\n\nexport const getTrackingDelayByChainId = (chainId: string) => {\n switch (chainId) {\n case AvalancheChainIds.MAINNET:\n case AvalancheChainIds.FUJI:\n return 1000;\n default:\n return 20000;\n }\n};\n","import { TokenType, type BridgeService, type ChainAssetMap, type DestinationInfo, BridgeType } from '../../../types';\n\nexport async function getAssets(bridge: BridgeService) {\n await bridge.ensureHasConfig();\n\n const chainIds = bridge.config!.map((chainData) => chainData.chainId);\n\n return bridge.config!.reduce<ChainAssetMap>((assets, chainData) => {\n assets[chainData.chainId] = chainData.tokens.map((asset) => ({\n ...asset,\n type: TokenType.ERC20,\n destinations: chainIds.reduce<DestinationInfo>((destinations, chainId) => {\n if (chainData.chainId !== chainId) {\n if (!destinations[chainId]) {\n destinations[chainId] = [];\n }\n\n destinations[chainId]?.push(BridgeType.CCTP);\n }\n\n return destinations;\n }, {}),\n }));\n\n return assets;\n }, {});\n}\n","import { createWalletClient, publicActions, custom, http } from 'viem';\nimport type { Chain } from '../types/chain';\nimport type { Provider } from '../types';\nimport caip2 from './caip2';\n\nconst _getChain = (chain: Chain) => {\n const { reference: chainId } = caip2.toJSON(chain.chainId);\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n network: chain.chainName,\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n};\n\nexport const getClientForChain = ({ chain, provider }: { chain: Chain; provider?: Provider }) => {\n const chainInfo = _getChain(chain);\n const transport = provider ? custom(provider) : http(chain.rpcUrl, { batch: true, retryCount: 0 });\n\n return createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n};\n","// ref: https://chainagnostic.org/CAIPs/caip-2\n\nexport type Caip2ChainId = {\n namespace: string;\n reference: string;\n};\n\nconst namespacePattern = '^[-a-z0-9]{3,8}$';\n// the standard allows up to 32 characters for the reference part, but we have to set it to 50 so it accepts our cb58 encoded chain IDs\nconst referencePattern = '^[-_a-zA-Z0-9]{1,50}$';\nconst delimeter = ':';\n\nconst toJSON = (identifier: string): Caip2ChainId => {\n const [namespace, reference] = identifier.split(delimeter);\n\n if (!namespace || !reference) {\n throw new Error('Invalid identifier provided.');\n }\n\n if (!new RegExp(namespacePattern).test(namespace)) {\n throw new Error('Invalid namespace provided.');\n }\n\n if (!new RegExp(referencePattern).test(reference)) {\n throw new Error('Invalid reference provided.');\n }\n\n return {\n namespace,\n reference,\n };\n};\n\nconst toString = ({ namespace, reference }: Caip2ChainId) => {\n return `${namespace}${delimeter}${reference}`;\n};\n\nexport default {\n toJSON,\n toString,\n};\n","export const TOKEN_ROUTER_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'circleTokenMessenger_',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'burnToken_',\n type: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [],\n name: 'AlreadyAdmin',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AlreadyFeeCollector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AlreadySupportedBurnToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AmountLessThanFee',\n type: 'error',\n },\n {\n inputs: [],\n name: 'BalanceNotIncreased',\n type: 'error',\n },\n {\n inputs: [],\n name: 'CannotRemoveLastAdmin',\n type: 'error',\n },\n {\n inputs: [],\n name: 'FeePercentageGreaterThanMax',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidAdminAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidFeeCollector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidMintRecipientAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidTokenAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidTokenMessengerAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'MaxFeeLessThanMinFee',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotAdmin',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotFeeCollector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'UnSupportedBurnToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'UnsupportedDomain',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'admin',\n type: 'address',\n },\n ],\n name: 'AdminAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'admin',\n type: 'address',\n },\n ],\n name: 'AdminRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'BurnTokenAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'BurnTokenRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'FeeCollectorAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'FeeCollectorRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'maxFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'minFee',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'feePercentage',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'txnFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'supported',\n type: 'bool',\n },\n ],\n indexed: false,\n internalType: 'struct FeeCalculator.FeeConfiguration',\n name: 'feeConfiguration',\n type: 'tuple',\n },\n ],\n name: 'FeeConfigurationUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'previousOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Paused',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint64',\n name: 'nonce',\n type: 'uint64',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'burnToken',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'depositor',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'mintRecipient',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint32',\n name: 'destinationDomain',\n type: 'uint32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'totalFee',\n type: 'uint256',\n },\n ],\n name: 'TransferTokens',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Unpaused',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'addAdmin',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'addFeeCollector',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'addSupportedBurnToken',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'destinationDomain',\n type: 'uint32',\n },\n ],\n name: 'calculateFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'circleTokenMessenger',\n outputs: [\n {\n internalType: 'contract ICircleTokenMessenger',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'circleTokenMessengerAddress',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'collectFees',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'getFeeAmounts',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getFeeConfiguration',\n outputs: [\n {\n components: [\n {\n internalType: 'uint256',\n name: 'maxFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'minFee',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'feePercentage',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'txnFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'supported',\n type: 'bool',\n },\n ],\n internalType: 'struct FeeCalculator.FeeConfiguration',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getFeePercentage',\n outputs: [\n {\n internalType: 'uint32',\n name: '',\n type: 'uint32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getMaxFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getMinFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getTxnFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'isAdmin',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'isFeeCollector',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'isSupportedBurnToken',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'isSupportedDomain',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'paused',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'removeAdmin',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'removeFeeCollector',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'removeSupportedBurnToken',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'renounceOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'maxFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'minFee',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'feePercentage',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'txnFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'supported',\n type: 'bool',\n },\n ],\n internalType: 'struct FeeCalculator.FeeConfiguration',\n name: 'feeConfiguration',\n type: 'tuple',\n },\n ],\n name: 'setFeeConfiguration',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n name: 'supportedBurnTokens',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'destinationDomain',\n type: 'uint32',\n },\n {\n internalType: 'address',\n name: 'mintRecipient',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'burnToken',\n type: 'address',\n },\n ],\n name: 'transferTokens',\n outputs: [\n {\n internalType: 'uint64',\n name: 'nonce',\n type: 'uint64',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'unpause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n","import { InvalidParamsError } from '../../../errors';\nimport { ErrorReason } from '../../../types';\nimport type { TransferParams } from '../../../types/bridge';\nimport type { Config } from '../types/config';\n\ntype PartialTransferParams = Pick<TransferParams, 'sourceChain' | 'targetChain' | 'amount' | 'asset'>;\n\nexport const getTransferData = ({ sourceChain, targetChain, amount, asset }: PartialTransferParams, config: Config) => {\n if (sourceChain.chainId === targetChain.chainId) {\n throw new InvalidParamsError(ErrorReason.IDENTICAL_CHAINS_PROVIDED);\n }\n\n if (amount <= 0n) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_AMOUNT_PROVIDED, 'Amount must be greater than zero');\n }\n\n const sourceChainData = config.find((chainData) => chainData.chainId === sourceChain.chainId);\n\n if (!sourceChainData) {\n throw new InvalidParamsError(\n ErrorReason.CHAIN_NOT_SUPPORTED,\n `Not supported on source chain \"${sourceChain.chainId}\"`,\n );\n }\n\n const targetChainData = config.find((chainData) => chainData.chainId === targetChain.chainId);\n\n if (!targetChainData) {\n throw new InvalidParamsError(\n ErrorReason.CHAIN_NOT_SUPPORTED,\n `Not supported on target chain \"${targetChain.chainId}\"`,\n );\n }\n\n const burnToken = sourceChainData.tokens.find((token) => token.symbol === asset.symbol);\n const mintToken = targetChainData.tokens.find((token) => token.symbol === asset.symbol);\n\n if (!burnToken || !mintToken) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED);\n }\n\n return {\n sourceChainData,\n targetChainData,\n burnToken,\n mintToken,\n };\n};\n","import type { AssetFeeMap, BridgeService, FeeParams } from '../../../types';\nimport { getClientForChain } from '../../../utils/client';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport { getTransferData } from '../utils/transfer-data';\n\nexport async function getFees(bridge: BridgeService, params: FeeParams) {\n await bridge.ensureHasConfig();\n\n const { sourceChain, targetChain, asset, amount, provider } = params;\n const { sourceChainData, targetChainData, burnToken } = getTransferData(\n { sourceChain, targetChain, asset, amount },\n bridge.config!,\n );\n\n const client = getClientForChain({ chain: sourceChain, provider });\n const feeAmount = await client.readContract({\n address: sourceChainData.tokenRouterAddress,\n abi: TOKEN_ROUTER_ABI,\n functionName: 'calculateFee',\n args: [amount, targetChainData.domain],\n });\n\n return {\n [burnToken.address]: feeAmount,\n } as AssetFeeMap;\n}\n","import { isAddress, type PublicClient } from 'viem';\nimport {\n ErrorReason,\n type BridgeService,\n type Environment,\n type TransferParams,\n type Hex,\n type BridgeTransfer,\n BridgeSignatureReason,\n} from '../../../types';\nimport { getClientForChain } from '../../../utils/client';\nimport { ERC20_ABI } from '../abis/erc20';\nimport { getTransferData } from '../utils/transfer-data';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport { InvalidParamsError } from '../../../errors';\nimport { buildApprovalTxData, buildTransferTxData } from '../utils/build-tx';\n\nconst approveAndTransfer = async (bridge: BridgeService, params: TransferParams) => {\n const {\n sourceChain,\n targetChain,\n asset,\n amount,\n fromAddress,\n toAddress: maybeToAddress,\n sourceProvider,\n onStepChange,\n sign,\n } = params;\n const toAddress = maybeToAddress ?? fromAddress;\n\n if (!isAddress(fromAddress) || !isAddress(toAddress)) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_ADDRESS_PROVIDED);\n }\n\n const { sourceChainData, targetChainData, burnToken } = getTransferData(\n { sourceChain, targetChain, asset, amount },\n bridge.config!,\n );\n const client = getClientForChain({ chain: sourceChain, provider: sourceProvider });\n\n const allowance = await client.readContract({\n address: burnToken.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, sourceChainData.tokenRouterAddress],\n });\n\n const isAllowanceApprovalRequired = allowance < amount;\n const requiredSignatures = isAllowanceApprovalRequired ? 2 : 1; // if approval is required, we'll need 2 signatures\n\n if (isAllowanceApprovalRequired) {\n onStepChange?.({\n currentSignature: 1,\n currentSignatureReason: BridgeSignatureReason.AllowanceApproval,\n requiredSignatures,\n });\n\n if (sign) {\n const data = buildApprovalTxData({\n amount,\n sourceChainData,\n });\n const txHash = await sign(\n {\n from: fromAddress,\n to: burnToken.address,\n data,\n },\n (signedTxHash: Hex) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n );\n\n await client.waitForTransactionReceipt({ hash: txHash, pollingInterval: 1_000 });\n } else {\n const { request } = await client.simulateContract({\n account: fromAddress,\n address: burnToken.address,\n abi: ERC20_ABI,\n functionName: 'approve',\n args: [sourceChainData.tokenRouterAddress, amount],\n });\n\n const txHash = await client.writeContract(request);\n await client.waitForTransactionReceipt({ hash: txHash, pollingInterval: 1_000 });\n }\n }\n\n onStepChange?.({\n currentSignature: isAllowanceApprovalRequired ? 2 : 1,\n currentSignatureReason: BridgeSignatureReason.TokensTransfer,\n requiredSignatures,\n });\n\n if (sign) {\n const data = buildTransferTxData({\n amount,\n burnToken,\n targetChainData,\n toAddress,\n });\n\n return sign(\n {\n from: fromAddress,\n to: sourceChainData.tokenRouterAddress,\n data,\n },\n (signedTxHash: Hex) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n );\n } else {\n const { request } = await client.simulateContract({\n account: fromAddress,\n address: sourceChainData.tokenRouterAddress,\n abi: TOKEN_ROUTER_ABI,\n functionName: 'transferTokens',\n args: [amount, targetChainData.domain, toAddress, burnToken.address],\n });\n\n return client.writeContract(request);\n }\n};\n\nconst getStartBlockNumber = async (targetClient: PublicClient) => {\n try {\n const startBlockNumber = await targetClient.getBlockNumber();\n return startBlockNumber;\n } catch {\n return undefined;\n }\n};\n\nexport async function transferAsset(\n bridge: BridgeService,\n params: TransferParams,\n environment: Environment,\n): Promise<BridgeTransfer> {\n await bridge.ensureHasConfig();\n\n const { minimumConfirmations: requiredSourceConfirmationCount } =\n bridge.config!.find((chainData) => chainData.chainId === params.sourceChain.chainId) ?? {};\n const { minimumConfirmations: requiredTargetConfirmationCount } =\n bridge.config!.find((chainData) => chainData.chainId === params.targetChain.chainId) ?? {};\n\n if (!requiredSourceConfirmationCount || !requiredTargetConfirmationCount) {\n throw new InvalidParamsError(ErrorReason.CONFIRMATION_COUNT_UNKNOWN);\n }\n\n const fees = await bridge.getFees({ ...params, provider: params.sourceProvider });\n\n const bridgeFee = (params.asset.address && fees[params.asset.address]) ?? 0n;\n const txHash = await approveAndTransfer(bridge, params);\n const sourceStartedAt = Date.now();\n const targetClient = getClientForChain({ chain: params.targetChain, provider: params.targetProvider });\n const targetBlockNumber = await getStartBlockNumber(targetClient);\n\n return {\n type: bridge.type,\n environment,\n fromAddress: params.fromAddress,\n toAddress: params.toAddress ?? params.fromAddress,\n amount: params.amount,\n amountDecimals: params.asset.decimals,\n symbol: params.asset.symbol,\n\n bridgeFee,\n\n sourceChain: params.sourceChain,\n sourceStartedAt,\n sourceTxHash: txHash,\n sourceConfirmationCount: 0,\n requiredSourceConfirmationCount,\n\n targetChain: params.targetChain,\n targetConfirmationCount: 0,\n requiredTargetConfirmationCount,\n\n startBlockNumber: targetBlockNumber,\n };\n}\n","export const ERC20_ABI = [\n {\n constant: true,\n inputs: [],\n name: 'name',\n outputs: [{ name: '', type: 'string' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_spender', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'approve',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'totalSupply',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_from', type: 'address' },\n { name: '_to', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'transferFrom',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '_owner', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: 'balance', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'symbol',\n outputs: [{ name: '', type: 'string' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_to', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'transfer',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n { name: '_owner', type: 'address' },\n { name: '_spender', type: 'address' },\n ],\n name: 'allowance',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n { payable: true, stateMutability: 'payable', type: 'fallback' },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'owner', type: 'address' },\n { indexed: true, name: 'spender', type: 'address' },\n { indexed: false, name: 'value', type: 'uint256' },\n ],\n name: 'Approval',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'from', type: 'address' },\n { indexed: true, name: 'to', type: 'address' },\n { indexed: false, name: 'value', type: 'uint256' },\n ],\n name: 'Transfer',\n type: 'event',\n },\n] as const;\n","import { encodeFunctionData } from 'viem';\nimport type { ChainData, Token } from '../types/config';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport { ERC20_ABI } from '../abis/erc20';\n\nexport function buildTransferTxData({\n amount,\n burnToken,\n targetChainData,\n toAddress,\n}: {\n targetChainData: ChainData;\n toAddress: `0x${string}`;\n burnToken: Token;\n amount: bigint;\n}) {\n return encodeFunctionData({\n abi: TOKEN_ROUTER_ABI,\n functionName: 'transferTokens',\n args: [amount, targetChainData.domain, toAddress, burnToken.address],\n });\n}\n\nexport function buildApprovalTxData({ amount, sourceChainData }: { amount: bigint; sourceChainData: ChainData }) {\n return encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'approve',\n args: [sourceChainData.tokenRouterAddress, amount],\n });\n}\n","import { BridgeInitializationError } from '../errors';\nimport { ErrorReason, type BridgeService } from '../types';\n\nexport async function ensureHasConfig(bridge: BridgeService) {\n if (!bridge.config) {\n await bridge.updateConfig();\n\n if (!bridge.config) {\n throw new BridgeInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE);\n }\n }\n}\n","import { decodeEventLog, type Address } from 'viem';\nimport {\n ErrorReason,\n type BridgeConfig,\n type BridgeService,\n type BridgeTransfer,\n type TrackingParams,\n ErrorCode,\n} from '../../../types';\nimport { getClientForChain } from '../../../utils/client';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport { getNetworkFeeEVM } from '../../../utils/network-fee';\nimport { retryPromise, type Done } from '../../../utils/retry-promise';\nimport { getTrackingDelayByChainId } from '../utils/config';\nimport { InvalidParamsError } from '../../../errors';\n\n// Maximum time (in ms) before the transaction is considered \"timed out\"\nexport const TRACKING_LIMIT_MS = 1000 * 60 * 60 * 3;\n// The max blocks that can be queried before receiving an error response\nexport const MAX_BLOCKS = 1024n;\n// The delay time before tracking starts\nexport const INITIAL_DELAY = 5000;\n\n/**\n * Mutates the `initial` transfer by merging it with the `updated` properties if they are not undefined\n * Invokes the `updateListener` with a copy of the updated `initial` transfer\n */\nconst updateTransfer = (\n initial: BridgeTransfer,\n updated: Partial<BridgeTransfer>,\n updateListener: TrackingParams['updateListener'],\n) => {\n Object.assign(initial, Object.fromEntries(Object.entries(updated).filter(([, value]) => value !== undefined)));\n updateListener({ ...initial });\n};\n\n/**\n * Polls the source network until it's able to get the CCTP message's `nonce` from the source transaction's logs\n * Updates the provided `BridgeTransfer` and broadcasts the changes via `updateListener`\n */\nexport const trackSourceTx = async (config: BridgeConfig, params: TrackingParams) => {\n const { sourceProvider, targetProvider, updateListener, bridgeTransfer } = params;\n const sourceClient = getClientForChain({ chain: bridgeTransfer.sourceChain, provider: sourceProvider });\n const sourceChainData = config.find((chainData) => chainData.chainId === bridgeTransfer.sourceChain.chainId);\n const targetClient = getClientForChain({ chain: bridgeTransfer.targetChain, provider: targetProvider });\n const targetChainData = config.find((chainData) => chainData.chainId === bridgeTransfer.targetChain.chainId);\n const updateableTransfer = { ...bridgeTransfer };\n\n if (!sourceChainData || !targetChainData) {\n throw new InvalidParamsError(ErrorReason.CHAIN_NOT_SUPPORTED);\n }\n\n const tracker = async (done: Done<BridgeTransfer>) => {\n /**\n * Return early if:\n * - transfer has already completed successfully or due to some error\n * - the transfer state already has the message's nonce\n */\n if (updateableTransfer.completedAt || updateableTransfer.metadata?.nonce) {\n return done(updateableTransfer);\n }\n\n /**\n * Check if the transaction has timed out\n */\n if (updateableTransfer.sourceStartedAt + TRACKING_LIMIT_MS <= Date.now()) {\n updateTransfer(updateableTransfer, { completedAt: Date.now(), errorCode: ErrorCode.TIMEOUT }, updateListener);\n return done(updateableTransfer);\n }\n\n /**\n * Get the transaction's receipt.\n * Throws if the transaction has't been processed by the network yet.\n */\n const txReceipt = await sourceClient.getTransactionReceipt({\n hash: updateableTransfer.sourceTxHash as Address,\n });\n\n /**\n * Calculate the network fee if needed.\n */\n if (!updateableTransfer.sourceNetworkFee) {\n const tx = await sourceClient.getTransaction({ hash: updateableTransfer.sourceTxHash as Address });\n const networkFee = getNetworkFeeEVM(tx, txReceipt);\n\n if (networkFee) {\n updateTransfer(updateableTransfer, { sourceNetworkFee: networkFee }, updateListener);\n }\n }\n\n /**\n * Update the state and terminate if the transaction was reverted\n */\n if (txReceipt.status === 'reverted') {\n updateTransfer(\n updateableTransfer,\n { completedAt: Date.now(), errorCode: ErrorCode.TRANSACTION_REVERTED },\n updateListener,\n );\n return done(updateableTransfer);\n }\n\n /**\n * Check the confirmation count.\n * - update the sourceConfirmationCount if it increased\n * - update the startBlockNumber if confirmation count increased but is not enough\n * - keeps polling until it's greater than requiredSourceConfirmationCount\n */\n const confirmationCount = await sourceClient.getTransactionConfirmations({\n hash: updateableTransfer.sourceTxHash as Address,\n });\n const hasMoreConfirmations = confirmationCount > updateableTransfer.sourceConfirmationCount;\n const hasRequiredConfirmations = confirmationCount >= updateableTransfer.requiredSourceConfirmationCount;\n\n if (hasMoreConfirmations) {\n const changes = {} as Partial<BridgeTransfer>;\n changes.sourceConfirmationCount = Number(confirmationCount);\n\n if (!hasRequiredConfirmations) {\n changes.startBlockNumber = await targetClient.getBlockNumber();\n }\n\n updateTransfer(updateableTransfer, changes, updateListener);\n }\n\n if (!hasRequiredConfirmations) {\n return;\n }\n\n if (!updateableTransfer.startBlockNumber) {\n updateTransfer(updateableTransfer, { startBlockNumber: await targetClient.getBlockNumber() }, updateListener);\n }\n\n /**\n * Get the `TransferTokens` event's log entry from the receipt\n */\n const transferEventLog = txReceipt.logs.find((log) => {\n if (log.address.toLowerCase() === sourceChainData.tokenRouterAddress.toLowerCase()) {\n const event = decodeEventLog({\n abi: TOKEN_ROUTER_ABI,\n ...log,\n });\n\n return event.eventName === 'TransferTokens';\n }\n\n return false;\n });\n\n if (!transferEventLog) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `unable to find a TransferTokens event in source transaction \"${updateableTransfer.sourceTxHash}\"`,\n );\n }\n\n /**\n * Get the nonce used by the message transmitter from the event's log\n * https://developers.circle.com/stablecoins/docs/evm-smart-contracts#receivemessage\n */\n const transferEvent = decodeEventLog({\n abi: TOKEN_ROUTER_ABI,\n eventName: 'TransferTokens',\n ...transferEventLog,\n });\n\n // save the nonce and broadcast\n const nonce = transferEvent.args.nonce;\n updateTransfer(updateableTransfer, { targetStartedAt: Date.now(), metadata: { nonce } }, updateListener);\n return done(updateableTransfer);\n };\n\n return retryPromise<BridgeTransfer>({\n promise: tracker,\n delay: getTrackingDelayByChainId(sourceChainData.chainId),\n startAfter: INITIAL_DELAY,\n });\n};\n\n/**\n * Polls the target network until it finds the transaction that matches the message's nonce\n * Updates the provided `BridgeTransfer` and broadcasts the changes via `updateListener`\n */\nexport const trackTargetTx = async (config: BridgeConfig, params: TrackingParams) => {\n const { targetProvider, updateListener, bridgeTransfer } = params;\n const updateableTransfer = { ...bridgeTransfer };\n\n if (!bridgeTransfer.completedAt && !bridgeTransfer.metadata?.nonce) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `nonce is missing`);\n }\n\n if (!bridgeTransfer.startBlockNumber) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `startBlockNumber is missing`);\n }\n\n const targetClient = getClientForChain({ chain: bridgeTransfer.targetChain, provider: targetProvider });\n const targetChainData = config.find((chainData) => chainData.chainId === bridgeTransfer.targetChain.chainId);\n\n if (!targetChainData) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `unknown target chain \"${bridgeTransfer.targetChain.chainId}\"`,\n );\n }\n\n const tracker = async (done: Done<BridgeTransfer>) => {\n /**\n * Return early if:\n * - transfer has already completed successfully or due to some error\n */\n if (updateableTransfer.completedAt) {\n return done(updateableTransfer);\n }\n\n /**\n * Check if `startBlockNumber` became falsy for whatever reason\n */\n if (!updateableTransfer.startBlockNumber) {\n updateTransfer(\n updateableTransfer,\n { completedAt: Date.now(), errorCode: ErrorCode.INVALID_PARAMS },\n updateListener,\n );\n return done(updateableTransfer);\n }\n\n /**\n * Check if the transaction has timed out\n */\n if (updateableTransfer.sourceStartedAt + TRACKING_LIMIT_MS <= Date.now()) {\n updateTransfer(updateableTransfer, { completedAt: Date.now(), errorCode: ErrorCode.TIMEOUT }, updateListener);\n return done(updateableTransfer);\n }\n\n if (!updateableTransfer.targetTxHash) {\n const lastBlockNumber = await targetClient.getBlockNumber();\n const lowestBlockNumber = updateableTransfer.startBlockNumber - MAX_BLOCKS;\n const fromBlock = lowestBlockNumber >= 0n ? lowestBlockNumber : 'earliest';\n const highestBlockNumber = updateableTransfer.startBlockNumber + MAX_BLOCKS;\n const toBlock = highestBlockNumber < lastBlockNumber ? highestBlockNumber : 'latest';\n\n const targetLogs = await targetClient.getLogs({\n address: targetChainData.messageTransmitterAddress,\n event: {\n name: 'MessageReceived',\n type: 'event',\n inputs: [\n { indexed: true, internalType: 'address', name: 'caller', type: 'address' },\n { indexed: false, internalType: 'uint32', name: 'sourceDomain', type: 'uint32' },\n { indexed: true, internalType: 'uint64', name: 'nonce', type: 'uint64' },\n { indexed: false, internalType: 'bytes32', name: 'sender', type: 'bytes32' },\n { indexed: false, internalType: 'bytes', name: 'messageBody', type: 'bytes' },\n ],\n },\n args: { nonce: updateableTransfer.metadata!.nonce as bigint },\n fromBlock,\n toBlock,\n });\n\n if (targetLogs[0]?.transactionHash) {\n updateTransfer(updateableTransfer, { targetTxHash: targetLogs[0].transactionHash }, updateListener);\n } else {\n updateTransfer(updateableTransfer, { startBlockNumber: lastBlockNumber }, updateListener);\n return;\n }\n }\n\n /**\n * Get the transaction's receipt.\n * Throws if the transaction has't been processed by the network yet.\n */\n const txReceipt = await targetClient.getTransactionReceipt({\n hash: updateableTransfer.targetTxHash as Address,\n });\n\n /**\n * Calculate the network fee if needed.\n */\n if (!updateableTransfer.targetNetworkFee) {\n const tx = await targetClient.getTransaction({ hash: updateableTransfer.targetTxHash as Address });\n const networkFee = getNetworkFeeEVM(tx, txReceipt);\n\n if (networkFee) {\n updateTransfer(updateableTransfer, { targetNetworkFee: networkFee }, updateListener);\n }\n }\n\n /**\n * Update the state and terminate if the transaction was reverted\n */\n if (txReceipt.status === 'reverted') {\n updateTransfer(\n updateableTransfer,\n { completedAt: Date.now(), errorCode: ErrorCode.TRANSACTION_REVERTED },\n updateListener,\n );\n return done(updateableTransfer);\n }\n\n /**\n * Check the confirmation count.\n * - update the targetConfirmationCount if it increased\n * - keeps polling until it's greater than requiredTargetConfirmationCount\n */\n const confirmationCount = await targetClient.getTransactionConfirmations({\n hash: updateableTransfer.targetTxHash as Address,\n });\n const hasMoreConfirmations = confirmationCount > updateableTransfer.targetConfirmationCount;\n const hasRequiredConfirmations = confirmationCount >= updateableTransfer.requiredTargetConfirmationCount;\n\n if (hasMoreConfirmations) {\n updateTransfer(updateableTransfer, { targetConfirmationCount: Number(confirmationCount) }, updateListener);\n }\n\n if (!hasRequiredConfirmations) {\n return;\n }\n\n updateTransfer(updateableTransfer, { completedAt: Date.now() }, updateListener);\n return done(updateableTransfer);\n };\n\n return retryPromise<BridgeTransfer>({\n promise: tracker,\n delay: getTrackingDelayByChainId(targetChainData.chainId),\n startAfter: INITIAL_DELAY,\n });\n};\n\nexport function trackTransfer(bridge: BridgeService, params: TrackingParams) {\n let abortFn: (() => void) | undefined;\n\n const cancel = () => {\n abortFn?.();\n };\n\n const executeTracking = async () => {\n await bridge.ensureHasConfig();\n\n const { sourceProvider, targetProvider, updateListener, bridgeTransfer } = params;\n\n const { result: sourceTracker, cancel: cancelSourceTracking } = await trackSourceTx(bridge.config!, {\n sourceProvider,\n targetProvider,\n updateListener,\n bridgeTransfer,\n });\n abortFn = cancelSourceTracking;\n const transferAfterSourceFinished = await sourceTracker;\n\n const { result: targetTracker, cancel: cancelTargetTracking } = await trackTargetTx(bridge.config!, {\n sourceProvider,\n targetProvider,\n updateListener,\n bridgeTransfer: transferAfterSourceFinished,\n });\n abortFn = cancelTargetTracking;\n return targetTracker;\n };\n\n return {\n result: executeTracking(),\n cancel,\n };\n}\n","import { type Transaction, type TransactionReceipt } from 'viem';\n\n// returns the network fee for EVM transaction in wei (10**-18)\nexport const getNetworkFeeEVM = (transaction: Transaction, receipt: TransactionReceipt) => {\n return transaction.gasPrice && BigInt(transaction.gasPrice * receipt.gasUsed);\n};\n","export const wait = async (time: number) =>\n new Promise((res) => {\n setTimeout(res, time);\n });\n","import { wait } from './wait';\n\nexport type Done<T> = (data: T) => void;\n\ntype Params<T> = {\n promise: (done: Done<T>) => Promise<unknown>;\n delay: number;\n startAfter?: number;\n};\n\nexport const retryPromise = <T>({ promise, delay, startAfter }: Params<T>) => {\n let isRunning = false;\n let isCancelled = false;\n let errorCount: number = 0;\n let resolve: ((data: T) => void) | undefined = undefined;\n let reject: ((reason?: string) => void) | undefined = undefined;\n\n const done = (data: T) => {\n if (resolve && isRunning) {\n isRunning = false;\n resolve(data);\n }\n };\n\n const cancel = () => {\n isCancelled = true;\n\n if (reject && isRunning) {\n isRunning = false;\n reject('cancelled');\n }\n };\n\n const result = new Promise<T>((res, rej) => {\n isRunning = true;\n resolve = res;\n reject = rej;\n\n const execute = async (): Promise<void> => {\n if (!isRunning || isCancelled) {\n return;\n }\n\n try {\n await promise(done);\n\n if (!isRunning || isCancelled) {\n return;\n }\n\n await wait(delay);\n } catch (err) {\n console.error((err as Error).message);\n errorCount += 1;\n await wait(2 ** errorCount * delay);\n }\n\n await execute();\n };\n\n if (startAfter) {\n setTimeout(execute, startAfter);\n } else {\n execute();\n }\n });\n\n return {\n result,\n cancel,\n };\n};\n","import { isAddress } from 'viem';\n\nimport { InvalidParamsError } from '../../../errors';\nimport { getClientForChain } from '../../../utils/client';\nimport { ErrorReason, type BridgeService, type TransferParams } from '../../../types';\n\nimport { ERC20_ABI } from '../abis/erc20';\nimport { getTransferData } from '../utils/transfer-data';\nimport { ChainDomain } from '../types/chain';\n\nconst ETH_APPROVAL_TX_GAS_ESTIMATE = 60_000n; // 55.5k gas on average (+/- 200 units)\nconst ETH_TRANSFER_TX_GAS_ESTIMATE = 175_000n; // 161.5k gas on average (+/- 200 units)\nconst AVAX_APPROVAL_TX_GAS_ESTIMATE = 60_000n; // 55.5k gas on average (+/- 200 units)\nconst AVAX_TRANSFER_TX_GAS_ESTIMATE = 215_000n; // 203k gas on average (+/- 200 units)\n/**\n * The CCTP bridging consists of up to two transactions:\n *\n * 1. Token spend approval (technically optional, but realistically performed basically every time)\n * 2. Token transfer (required)\n *\n * Since the 2nd one needs the first transaction to be complete, calling .estimateGas() is not possible.\n * The RPC call raises an error since it cannot execute the transfer transaction locally without\n * the allowance being set. For that reason, we're using hard-coded estimates here, with small buffers added.\n *\n * NOTE: These estimates are only supposed to be used to approximate the network fees in the UI.\n * DO NOT use them as `gasLimit` prop on the transactions!\n */\nexport async function estimateGas(bridge: BridgeService, params: TransferParams): Promise<bigint> {\n await bridge.ensureHasConfig();\n\n const { sourceChain, targetChain, asset, amount, fromAddress, toAddress: maybeToAddress, sourceProvider } = params;\n const toAddress = maybeToAddress ?? fromAddress;\n\n if (!isAddress(fromAddress) || !isAddress(toAddress)) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_ADDRESS_PROVIDED);\n }\n\n const { sourceChainData, burnToken } = getTransferData({ sourceChain, targetChain, asset, amount }, bridge.config!);\n\n const client = getClientForChain({ chain: sourceChain, provider: sourceProvider });\n\n const allowance = await client.readContract({\n address: burnToken.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, sourceChainData.tokenRouterAddress],\n });\n\n const isOffboarding = sourceChainData.domain === ChainDomain.Avalanche;\n\n if (allowance >= amount) {\n return isOffboarding ? AVAX_TRANSFER_TX_GAS_ESTIMATE : ETH_TRANSFER_TX_GAS_ESTIMATE;\n }\n\n return isOffboarding\n ? AVAX_APPROVAL_TX_GAS_ESTIMATE + AVAX_TRANSFER_TX_GAS_ESTIMATE\n : ETH_APPROVAL_TX_GAS_ESTIMATE + ETH_TRANSFER_TX_GAS_ESTIMATE;\n}\n","import { type BridgeServiceFactory, BridgeType } from '../../types/bridge';\nimport { getConfig } from './utils/config';\nimport { getAssets } from './handlers/get-assets';\nimport { getFees } from './handlers/get-fees';\nimport { transferAsset } from './handlers/transfer-asset';\nimport { ensureHasConfig } from '../../utils/ensure-config';\nimport { trackTransfer } from './handlers/track-transfer';\nimport { estimateGas } from './handlers/estimate-gas';\n\nexport const cctpBridgeFactory: BridgeServiceFactory = (environment) => {\n return {\n type: BridgeType.CCTP,\n config: null,\n updateConfig: async function () {\n this.config = await getConfig(environment);\n },\n ensureHasConfig: async function () {\n return ensureHasConfig(this);\n },\n estimateGas: function (params) {\n return estimateGas(this, params);\n },\n getAssets: async function () {\n return getAssets(this);\n },\n getFees: async function (params) {\n return getFees(this, params);\n },\n transferAsset: async function (params) {\n return transferAsset(this, params, environment);\n },\n trackTransfer: function (params) {\n return trackTransfer(this, params);\n },\n };\n};\n","import { cctpBridgeFactory } from '../bridges/cctp/factory';\nimport { BridgeUnavailableError } from '../errors';\nimport type { BridgeAsset } from '../types/asset';\nimport { type BridgeService, BridgeType } from '../types/bridge';\nimport { Environment } from '../types/environment';\n\nexport const supportedBridges = new Map([[BridgeType.CCTP, cctpBridgeFactory]]);\n\nexport const getEnabledBridgeServices = (environment: Environment, disabledBridgeTypes?: BridgeType[]) => {\n return new Map(\n [...supportedBridges]\n .filter(([bridgeType]) => !disabledBridgeTypes?.includes(bridgeType))\n .map(([bridgeType, factory]) => [bridgeType, factory(environment)]),\n );\n};\n\nexport const getBridgeForTransfer = (\n enabledBridgeServices: Map<BridgeType, BridgeService>,\n asset: BridgeAsset,\n targetChainId: string,\n) => {\n const bridgeType = asset.destinations[targetChainId]?.find((bridgeType) => enabledBridgeServices.has(bridgeType));\n\n if (!bridgeType) {\n throw new BridgeUnavailableError();\n }\n\n return {\n type: bridgeType,\n bridge: enabledBridgeServices.get(bridgeType)!,\n };\n};\n","import type { FeeParams, TrackingParams, TransferParams } from './types/bridge';\nimport type { BridgeServiceConfig } from './types/config';\nimport { getBridgeForTransfer, getEnabledBridgeServices } from './utils';\nimport type { BridgeAsset, ChainAssetMap } from './types';\nimport { isArray, mergeWith } from 'lodash';\nimport { BridgeUnavailableError } from './errors';\n\nexport const createUnifiedBridgeService = ({ environment, disabledBridgeTypes }: BridgeServiceConfig) => {\n const enabledBridgeServices = getEnabledBridgeServices(environment, disabledBridgeTypes);\n\n const updateConfigs = async () => {\n await Promise.allSettled(\n Array.from(enabledBridgeServices).map(([, bridgeService]) => bridgeService.updateConfig()),\n );\n };\n\n const init = async () => {\n await updateConfigs();\n };\n\n const getAssets = async () => {\n const assets = await Promise.all(Array.from(enabledBridgeServices).map(([, bridge]) => bridge.getAssets()));\n return assets.reduce<ChainAssetMap>((aggregatedAssets, chainAssetMap) => {\n for (const [chainId, bridgeAssets] of Object.entries(chainAssetMap)) {\n const existingAssets = aggregatedAssets[chainId];\n\n if (existingAssets) {\n for (const bridgeAsset of bridgeAssets) {\n const index = existingAssets.findIndex(({ symbol }) => symbol === bridgeAsset.symbol);\n\n if (index === -1) {\n existingAssets.push(bridgeAsset);\n } else {\n mergeWith(existingAssets[index], bridgeAsset, (objValue, srcValue) => {\n if (isArray(objValue)) {\n return [...new Set(objValue.concat(srcValue))];\n }\n });\n }\n }\n } else {\n aggregatedAssets[chainId] = bridgeAssets;\n }\n }\n\n return aggregatedAssets;\n }, {});\n };\n\n const getFees = async (params: FeeParams) => {\n const { bridge } = getBridgeForTransfer(enabledBridgeServices, params.asset, params.targetChain.chainId);\n return bridge.getFees(params);\n };\n\n const transferAsset = async (params: TransferParams) => {\n const { bridge } = getBridgeForTransfer(enabledBridgeServices, params.asset, params.targetChain.chainId);\n return bridge.transferAsset(params);\n };\n\n const canTransferAsset = (asset: BridgeAsset, targetChainId: string) => {\n try {\n getBridgeForTransfer(enabledBridgeServices, asset, targetChainId);\n return true;\n } catch {\n return false;\n }\n };\n\n const trackTransfer = (params: TrackingParams) => {\n const bridge = enabledBridgeServices.get(params.bridgeTransfer.type);\n\n if (!bridge) {\n throw new BridgeUnavailableError();\n }\n\n return bridge.trackTransfer(params);\n };\n\n const estimateGas = async (params: TransferParams) => {\n const { bridge } = getBridgeForTransfer(enabledBridgeServices, params.asset, params.targetChain.chainId);\n\n return bridge.estimateGas(params);\n };\n\n return {\n environment,\n bridges: enabledBridgeServices,\n init,\n updateConfigs,\n getAssets,\n getFees,\n estimateGas,\n canTransferAsset,\n transferAsset,\n trackTransfer,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/asset.ts","../src/types/bridge.ts","../src/types/environment.ts","../src/types/error.ts","../src/bridges/cctp/handlers/get-assets.ts","../src/utils/client.ts","../src/utils/caip2.ts","../src/bridges/cctp/abis/token-router.ts","../src/errors/bridge-error.ts","../src/errors/bridge-unavailable-error.ts","../src/errors/bridge-initialization-error.ts","../src/errors/invalid-params-error.ts","../src/bridges/cctp/utils/transfer-data.ts","../src/bridges/cctp/handlers/get-fees.ts","../src/bridges/cctp/handlers/transfer-asset.ts","../src/bridges/cctp/abis/erc20.ts","../src/bridges/cctp/utils/build-tx.ts","../src/bridges/cctp/handlers/track-transfer.ts","../src/utils/network-fee.ts","../src/utils/wait.ts","../src/utils/retry-promise.ts","../src/bridges/cctp/utils/config.ts","../src/bridges/cctp/handlers/estimate-gas.ts","../src/bridges/cctp/factory.ts","../src/utils/bridge-types.ts","../src/unified-bridge-service.ts"],"names":["TokenType","BridgeType","BridgeSignatureReason","Environment","ErrorCode","ErrorReason","getAssets","config","chainIds","chainData","assets","asset","destinations","chainId","createWalletClient","publicActions","custom","http","namespacePattern","referencePattern","delimeter","toJSON","identifier","namespace","reference","toString","caip2_default","_getChain","chain","getClientForChain","provider","chainInfo","transport","TOKEN_ROUTER_ABI","BridgeError","message","code","details","BridgeUnavailableError","BridgeInitializationError","InvalidParamsError","getTransferData","sourceChain","targetChain","amount","sourceChainData","targetChainData","burnToken","token","mintToken","getFees","params","feeAmount","isAddress","ERC20_ABI","encodeFunctionData","buildTransferTxData","toAddress","buildApprovalTxData","approveAndTransfer","fromAddress","maybeToAddress","sourceProvider","onStepChange","sign","client","isAllowanceApprovalRequired","requiredSignatures","data","txHash","signedTxHash","request","getStartBlockNumber","targetClient","transferAsset","environment","requiredSourceConfirmationCount","requiredTargetConfirmationCount","fees","bridgeFee","sourceStartedAt","targetBlockNumber","decodeEventLog","getNetworkFeeEVM","transaction","receipt","wait","time","res","retryPromise","promise","delay","startAfter","isRunning","isCancelled","errorCount","resolve","reject","done","cancel","rej","execute","err","CONFIG_URLS","getConfig","getTrackingDelayByChainId","TRACKING_LIMIT_MS","MAX_BLOCKS","INITIAL_DELAY","updateTransfer","initial","updated","updateListener","value","trackSourceTx","targetProvider","bridgeTransfer","sourceClient","updateableTransfer","txReceipt","tx","networkFee","confirmationCount","hasMoreConfirmations","hasRequiredConfirmations","changes","transferEventLog","log","nonce","trackTargetTx","lastBlockNumber","lowestBlockNumber","fromBlock","highestBlockNumber","toBlock","targetLogs","trackTransfer","abortFn","sourceTracker","cancelSourceTracking","transferAfterSourceFinished","targetTracker","cancelTargetTracking","ETH_APPROVAL_TX_GAS_ESTIMATE","ETH_TRANSFER_TX_GAS_ESTIMATE","AVAX_APPROVAL_TX_GAS_ESTIMATE","AVAX_TRANSFER_TX_GAS_ESTIMATE","estimateGas","allowance","isOffboarding","cctpBridgeFactory","compact","supportedBridges","getEnabledBridgeServices","disabledBridgeTypes","filteredBridges","bridgeType","bridgePromisesResults","factory","result","getBridgeForTransfer","enabledBridgeServices","targetChainId","bridge","isArray","mergeWith","createUnifiedBridgeService","aggregatedAssets","chainAssetMap","bridgeAssets","existingAssets","bridgeAsset","index","symbol","objValue","srcValue"],"mappings":"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,EACT,KAAM,oBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,sBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,wBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,8BACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,sBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,sBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,8BACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,sBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,+BACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,uBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,kBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,uBACN,KAAM,OACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,aACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,eACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,sBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,SACd,KAAM,SACN,KAAM,QACR,EACA,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,gBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,YACN,KAAM,MACR,CACF,EACA,QAAS,GACT,aAAc,wCACd,KAAM,mBACN,KAAM,OACR,CACF,EACA,KAAM,0BACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,SACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,SACd,KAAM,QACN,KAAM,QACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,SACd,KAAM,oBACN,KAAM,QACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,wBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,oBACN,KAAM,QACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,uBACN,QAAS,CACP,CACE,aAAc,iCACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,8BACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,sBACN,QAAS,CACP,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,gBACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,YACN,KAAM,MACR,CACF,EACA,aAAc,wCACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,mBACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,qBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,2BACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,EACA,CACE,WAAY,CACV,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,gBACN,KAAM,QACR,EACA,CACE,aAAc,UAC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","sourcesContent":["import type { Address } from 'viem';\nimport type { BridgeType } from './bridge';\n\nexport enum TokenType {\n NATIVE = 'native',\n ERC20 = 'erc20',\n}\n\nexport type Asset = {\n type: TokenType;\n address?: Address;\n name: string;\n symbol: string;\n decimals: number;\n};\n\n// chainId - bridge type pairs\nexport type DestinationInfo = Record<string, BridgeType[]>;\n\nexport type BridgeAsset = Asset & {\n destinations: DestinationInfo;\n};\n\nexport type ChainAssetMap = Record<string, BridgeAsset[]>;\n\nexport type AssetFeeMap = Record<Address, bigint>;\n","import type { AssetFeeMap, BridgeAsset, ChainAssetMap } from './asset';\nimport type { Chain } from './chain';\nimport type { Environment } from './environment';\nimport type { Provider } from './provider';\nimport type { Signer } from './signer';\nimport type { BridgeTransfer } from './transfer';\n\nexport enum BridgeType {\n CCTP = 'cctp',\n}\n\nexport type FeeParams = {\n asset: BridgeAsset;\n amount: bigint;\n sourceChain: Chain;\n targetChain: Chain;\n provider?: Provider;\n};\n\nexport enum BridgeSignatureReason {\n AllowanceApproval = 'allowance-approval',\n TokensTransfer = 'tokens-transfer',\n}\n\nexport type BridgeStepDetails = {\n currentSignature: number;\n requiredSignatures: number;\n currentSignatureReason: BridgeSignatureReason;\n};\n\nexport type TransferParams = {\n asset: BridgeAsset;\n amount: bigint;\n fromAddress: string;\n toAddress?: string;\n sourceChain: Chain;\n targetChain: Chain;\n sourceProvider?: Provider;\n targetProvider?: Provider;\n onStepChange?: (stepDetails: BridgeStepDetails) => void;\n sign?: Signer;\n};\n\nexport type TrackingParams = {\n bridgeTransfer: BridgeTransfer;\n sourceProvider?: Provider;\n targetProvider?: Provider;\n updateListener: (transfer: BridgeTransfer) => void;\n};\n\nexport type BridgeService = {\n type: BridgeType;\n estimateGas: (params: TransferParams) => Promise<bigint>;\n getAssets: () => Promise<ChainAssetMap>;\n getFees: (params: FeeParams) => Promise<AssetFeeMap>;\n transferAsset: (params: TransferParams) => Promise<BridgeTransfer>;\n trackTransfer: (transfer: TrackingParams) => { cancel: () => void; result: Promise<BridgeTransfer> };\n};\n\nexport type BridgeServiceFactory = (environment: Environment) => Promise<BridgeService>;\n","export enum Environment {\n PROD = 'production',\n TEST = 'test',\n}\n","export enum ErrorCode {\n BRIDGE_NOT_AVAILABLE = 5001,\n INITIALIZATION_FAILED = 5002,\n INVALID_PARAMS = 5003,\n TIMEOUT = 5004,\n TRANSACTION_REVERTED = 5005,\n}\n\nexport enum ErrorReason {\n UNKNOWN = 'UNKNOWN', // generic, not specified error\n CONFIG_NOT_AVAILABLE = 'CONFIG_NOT_AVAILABLE', // error while fetching or parsing the config\n INVALID_PARAMS = 'INVALID_PARAMS', // generic error with the params\n IDENTICAL_CHAINS_PROVIDED = 'IDENTICAL_CHAINS_PROVIDED', // provided source and target chains are the same\n INCORRECT_AMOUNT_PROVIDED = 'INCORRECT_AMOUNT_PROVIDED', // the transfer amount is incorrect (e.g.: lesser than or equal to zero)\n INCORRECT_ADDRESS_PROVIDED = 'INCORRECT_ADDRESS_PROVIDED', // the sender or recipient address is incorrect\n CHAIN_NOT_SUPPORTED = 'CHAIN_NOT_SUPPORTED', // the provided source or target chain is not supported by the bridge\n ASSET_NOT_SUPPORTED = 'ASSET_NOT_SUPPORTED', // the provided asset is not supported by the bridge\n CONFIRMATION_COUNT_UNKNOWN = 'CONFIRMATION_COUNT_UNKNOWN', // required confirmation count of the source or target chain is unknown\n}\n","import { TokenType, type ChainAssetMap, type DestinationInfo, BridgeType } from '../../../types';\nimport type { Config } from '../types/config';\n\nexport async function getAssets(config: Config) {\n const chainIds = config.map((chainData) => chainData.chainId);\n\n return config.reduce<ChainAssetMap>((assets, chainData) => {\n assets[chainData.chainId] = chainData.tokens.map((asset) => ({\n ...asset,\n type: TokenType.ERC20,\n destinations: chainIds.reduce<DestinationInfo>((destinations, chainId) => {\n if (chainData.chainId !== chainId) {\n if (!destinations[chainId]) {\n destinations[chainId] = [];\n }\n\n destinations[chainId]?.push(BridgeType.CCTP);\n }\n\n return destinations;\n }, {}),\n }));\n\n return assets;\n }, {});\n}\n","import { createWalletClient, publicActions, custom, http } from 'viem';\nimport type { Chain } from '../types/chain';\nimport type { Provider } from '../types';\nimport caip2 from './caip2';\n\nconst _getChain = (chain: Chain) => {\n const { reference: chainId } = caip2.toJSON(chain.chainId);\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n network: chain.chainName,\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n};\n\nexport const getClientForChain = ({ chain, provider }: { chain: Chain; provider?: Provider }) => {\n const chainInfo = _getChain(chain);\n const transport = provider ? custom(provider) : http(chain.rpcUrl, { batch: true, retryCount: 0 });\n\n return createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n};\n","// ref: https://chainagnostic.org/CAIPs/caip-2\n\nexport type Caip2ChainId = {\n namespace: string;\n reference: string;\n};\n\nconst namespacePattern = '^[-a-z0-9]{3,8}$';\n// the standard allows up to 32 characters for the reference part, but we have to set it to 50 so it accepts our cb58 encoded chain IDs\nconst referencePattern = '^[-_a-zA-Z0-9]{1,50}$';\nconst delimeter = ':';\n\nconst toJSON = (identifier: string): Caip2ChainId => {\n const [namespace, reference] = identifier.split(delimeter);\n\n if (!namespace || !reference) {\n throw new Error('Invalid identifier provided.');\n }\n\n if (!new RegExp(namespacePattern).test(namespace)) {\n throw new Error('Invalid namespace provided.');\n }\n\n if (!new RegExp(referencePattern).test(reference)) {\n throw new Error('Invalid reference provided.');\n }\n\n return {\n namespace,\n reference,\n };\n};\n\nconst toString = ({ namespace, reference }: Caip2ChainId) => {\n return `${namespace}${delimeter}${reference}`;\n};\n\nexport default {\n toJSON,\n toString,\n};\n","export const TOKEN_ROUTER_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'circleTokenMessenger_',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'burnToken_',\n type: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [],\n name: 'AlreadyAdmin',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AlreadyFeeCollector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AlreadySupportedBurnToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AmountLessThanFee',\n type: 'error',\n },\n {\n inputs: [],\n name: 'BalanceNotIncreased',\n type: 'error',\n },\n {\n inputs: [],\n name: 'CannotRemoveLastAdmin',\n type: 'error',\n },\n {\n inputs: [],\n name: 'FeePercentageGreaterThanMax',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidAdminAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidFeeCollector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidMintRecipientAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidTokenAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidTokenMessengerAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'MaxFeeLessThanMinFee',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotAdmin',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotFeeCollector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'UnSupportedBurnToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'UnsupportedDomain',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'admin',\n type: 'address',\n },\n ],\n name: 'AdminAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'admin',\n type: 'address',\n },\n ],\n name: 'AdminRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'BurnTokenAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'BurnTokenRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'FeeCollectorAdded',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'FeeCollectorRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'maxFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'minFee',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'feePercentage',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'txnFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'supported',\n type: 'bool',\n },\n ],\n indexed: false,\n internalType: 'struct FeeCalculator.FeeConfiguration',\n name: 'feeConfiguration',\n type: 'tuple',\n },\n ],\n name: 'FeeConfigurationUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'previousOwner',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'OwnershipTransferred',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Paused',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint64',\n name: 'nonce',\n type: 'uint64',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'burnToken',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'depositor',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'address',\n name: 'mintRecipient',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint32',\n name: 'destinationDomain',\n type: 'uint32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'totalFee',\n type: 'uint256',\n },\n ],\n name: 'TransferTokens',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Unpaused',\n type: 'event',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'addAdmin',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'addFeeCollector',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'addSupportedBurnToken',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'destinationDomain',\n type: 'uint32',\n },\n ],\n name: 'calculateFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'circleTokenMessenger',\n outputs: [\n {\n internalType: 'contract ICircleTokenMessenger',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'circleTokenMessengerAddress',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'collectFees',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'getFeeAmounts',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getFeeConfiguration',\n outputs: [\n {\n components: [\n {\n internalType: 'uint256',\n name: 'maxFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'minFee',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'feePercentage',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'txnFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'supported',\n type: 'bool',\n },\n ],\n internalType: 'struct FeeCalculator.FeeConfiguration',\n name: '',\n type: 'tuple',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getFeePercentage',\n outputs: [\n {\n internalType: 'uint32',\n name: '',\n type: 'uint32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getMaxFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getMinFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'getTxnFee',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'isAdmin',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'isFeeCollector',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'isSupportedBurnToken',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n ],\n name: 'isSupportedDomain',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'paused',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'removeAdmin',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'feeCollector',\n type: 'address',\n },\n ],\n name: 'removeFeeCollector',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'removeSupportedBurnToken',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'renounceOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint32',\n name: 'domain',\n type: 'uint32',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'maxFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'minFee',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'feePercentage',\n type: 'uint32',\n },\n {\n internalType: 'uint256',\n name: 'txnFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'supported',\n type: 'bool',\n },\n ],\n internalType: 'struct FeeCalculator.FeeConfiguration',\n name: 'feeConfiguration',\n type: 'tuple',\n },\n ],\n name: 'setFeeConfiguration',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n name: 'supportedBurnTokens',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newOwner',\n type: 'address',\n },\n ],\n name: 'transferOwnership',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n {\n internalType: 'uint32',\n name: 'destinationDomain',\n type: 'uint32',\n },\n {\n internalType: 'address',\n name: 'mintRecipient',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'burnToken',\n type: 'address',\n },\n ],\n name: 'transferTokens',\n outputs: [\n {\n internalType: 'uint64',\n name: 'nonce',\n type: 'uint64',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'unpause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n","import type { ErrorCode } from '../types';\n\nexport class BridgeError extends Error {\n constructor(\n message: string,\n public code: ErrorCode,\n public details?: string,\n ) {\n super(message);\n }\n}\n","import { ErrorCode, ErrorReason } from '../types';\nimport { BridgeError } from './bridge-error';\n\nexport class BridgeUnavailableError extends BridgeError {\n constructor(message = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.BRIDGE_NOT_AVAILABLE, details);\n this.name = 'BridgeUnavailableError';\n }\n}\n","import { ErrorCode, ErrorReason } from '../types';\nimport { BridgeError } from './bridge-error';\n\nexport class BridgeInitializationError extends BridgeError {\n constructor(message = ErrorReason.UNKNOWN, details?: string) {\n super(message, ErrorCode.INITIALIZATION_FAILED, details);\n this.name = 'BridgeInitializationError';\n }\n}\n","import { ErrorCode, ErrorReason } from '../types';\nimport { BridgeError } from './bridge-error';\n\nexport class InvalidParamsError extends BridgeError {\n constructor(message = ErrorReason.INVALID_PARAMS, details?: string) {\n super(message, ErrorCode.INVALID_PARAMS, details);\n this.name = 'InvalidParamsError';\n }\n}\n","import { InvalidParamsError } from '../../../errors';\nimport { ErrorReason } from '../../../types';\nimport type { TransferParams } from '../../../types/bridge';\nimport type { Config } from '../types/config';\n\ntype PartialTransferParams = Pick<TransferParams, 'sourceChain' | 'targetChain' | 'amount' | 'asset'>;\n\nexport const getTransferData = ({ sourceChain, targetChain, amount, asset }: PartialTransferParams, config: Config) => {\n if (sourceChain.chainId === targetChain.chainId) {\n throw new InvalidParamsError(ErrorReason.IDENTICAL_CHAINS_PROVIDED);\n }\n\n if (amount <= 0n) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_AMOUNT_PROVIDED, 'Amount must be greater than zero');\n }\n\n const sourceChainData = config.find((chainData) => chainData.chainId === sourceChain.chainId);\n\n if (!sourceChainData) {\n throw new InvalidParamsError(\n ErrorReason.CHAIN_NOT_SUPPORTED,\n `Not supported on source chain \"${sourceChain.chainId}\"`,\n );\n }\n\n const targetChainData = config.find((chainData) => chainData.chainId === targetChain.chainId);\n\n if (!targetChainData) {\n throw new InvalidParamsError(\n ErrorReason.CHAIN_NOT_SUPPORTED,\n `Not supported on target chain \"${targetChain.chainId}\"`,\n );\n }\n\n const burnToken = sourceChainData.tokens.find((token) => token.symbol === asset.symbol);\n const mintToken = targetChainData.tokens.find((token) => token.symbol === asset.symbol);\n\n if (!burnToken || !mintToken) {\n throw new InvalidParamsError(ErrorReason.ASSET_NOT_SUPPORTED);\n }\n\n return {\n sourceChainData,\n targetChainData,\n burnToken,\n mintToken,\n };\n};\n","import type { AssetFeeMap, FeeParams } from '../../../types';\nimport { getClientForChain } from '../../../utils/client';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport type { Config } from '../types/config';\nimport { getTransferData } from '../utils/transfer-data';\n\nexport async function getFees(config: Config, params: FeeParams) {\n const { sourceChain, targetChain, asset, amount, provider } = params;\n const { sourceChainData, targetChainData, burnToken } = getTransferData(\n { sourceChain, targetChain, asset, amount },\n config,\n );\n\n const client = getClientForChain({ chain: sourceChain, provider });\n const feeAmount = await client.readContract({\n address: sourceChainData.tokenRouterAddress,\n abi: TOKEN_ROUTER_ABI,\n functionName: 'calculateFee',\n args: [amount, targetChainData.domain],\n });\n\n return {\n [burnToken.address]: feeAmount,\n } as AssetFeeMap;\n}\n","import { isAddress, type PublicClient } from 'viem';\nimport {\n ErrorReason,\n BridgeType,\n type Environment,\n type TransferParams,\n type Hex,\n type BridgeTransfer,\n BridgeSignatureReason,\n} from '../../../types';\nimport { getClientForChain } from '../../../utils/client';\nimport { ERC20_ABI } from '../abis/erc20';\nimport { getTransferData } from '../utils/transfer-data';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport { InvalidParamsError } from '../../../errors';\nimport { buildApprovalTxData, buildTransferTxData } from '../utils/build-tx';\nimport type { Config } from '../types/config';\nimport { getFees } from './get-fees';\n\nconst approveAndTransfer = async (config: Config, params: TransferParams) => {\n const {\n sourceChain,\n targetChain,\n asset,\n amount,\n fromAddress,\n toAddress: maybeToAddress,\n sourceProvider,\n onStepChange,\n sign,\n } = params;\n const toAddress = maybeToAddress ?? fromAddress;\n\n if (!isAddress(fromAddress) || !isAddress(toAddress)) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_ADDRESS_PROVIDED);\n }\n\n const { sourceChainData, targetChainData, burnToken } = getTransferData(\n { sourceChain, targetChain, asset, amount },\n config,\n );\n const client = getClientForChain({ chain: sourceChain, provider: sourceProvider });\n\n const allowance = await client.readContract({\n address: burnToken.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, sourceChainData.tokenRouterAddress],\n });\n\n const isAllowanceApprovalRequired = allowance < amount;\n const requiredSignatures = isAllowanceApprovalRequired ? 2 : 1; // if approval is required, we'll need 2 signatures\n\n if (isAllowanceApprovalRequired) {\n onStepChange?.({\n currentSignature: 1,\n currentSignatureReason: BridgeSignatureReason.AllowanceApproval,\n requiredSignatures,\n });\n\n if (sign) {\n const data = buildApprovalTxData({\n amount,\n sourceChainData,\n });\n const txHash = await sign(\n {\n from: fromAddress,\n to: burnToken.address,\n data,\n },\n (signedTxHash: Hex) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n );\n\n await client.waitForTransactionReceipt({ hash: txHash, pollingInterval: 1_000 });\n } else {\n const { request } = await client.simulateContract({\n account: fromAddress,\n address: burnToken.address,\n abi: ERC20_ABI,\n functionName: 'approve',\n args: [sourceChainData.tokenRouterAddress, amount],\n });\n\n const txHash = await client.writeContract(request);\n await client.waitForTransactionReceipt({ hash: txHash, pollingInterval: 1_000 });\n }\n }\n\n onStepChange?.({\n currentSignature: isAllowanceApprovalRequired ? 2 : 1,\n currentSignatureReason: BridgeSignatureReason.TokensTransfer,\n requiredSignatures,\n });\n\n if (sign) {\n const data = buildTransferTxData({\n amount,\n burnToken,\n targetChainData,\n toAddress,\n });\n\n return sign(\n {\n from: fromAddress,\n to: sourceChainData.tokenRouterAddress,\n data,\n },\n (signedTxHash: Hex) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n );\n }\n\n const { request } = await client.simulateContract({\n account: fromAddress,\n address: sourceChainData.tokenRouterAddress,\n abi: TOKEN_ROUTER_ABI,\n functionName: 'transferTokens',\n args: [amount, targetChainData.domain, toAddress, burnToken.address],\n });\n\n return client.writeContract(request);\n};\n\nconst getStartBlockNumber = async (targetClient: PublicClient) => {\n try {\n const startBlockNumber = await targetClient.getBlockNumber();\n return startBlockNumber;\n } catch {\n return undefined;\n }\n};\n\nexport async function transferAsset(\n config: Config,\n params: TransferParams,\n environment: Environment,\n): Promise<BridgeTransfer> {\n const { minimumConfirmations: requiredSourceConfirmationCount } =\n config.find((chainData) => chainData.chainId === params.sourceChain.chainId) ?? {};\n const { minimumConfirmations: requiredTargetConfirmationCount } =\n config.find((chainData) => chainData.chainId === params.targetChain.chainId) ?? {};\n\n if (!requiredSourceConfirmationCount || !requiredTargetConfirmationCount) {\n throw new InvalidParamsError(ErrorReason.CONFIRMATION_COUNT_UNKNOWN);\n }\n\n const fees = await getFees(config, { ...params, provider: params.sourceProvider });\n\n const bridgeFee = (params.asset.address && fees[params.asset.address]) ?? 0n;\n const txHash = await approveAndTransfer(config, params);\n const sourceStartedAt = Date.now();\n const targetClient = getClientForChain({ chain: params.targetChain, provider: params.targetProvider });\n const targetBlockNumber = await getStartBlockNumber(targetClient);\n\n return {\n type: BridgeType.CCTP,\n environment,\n fromAddress: params.fromAddress,\n toAddress: params.toAddress ?? params.fromAddress,\n amount: params.amount,\n amountDecimals: params.asset.decimals,\n symbol: params.asset.symbol,\n\n bridgeFee,\n\n sourceChain: params.sourceChain,\n sourceStartedAt,\n sourceTxHash: txHash,\n sourceConfirmationCount: 0,\n requiredSourceConfirmationCount,\n\n targetChain: params.targetChain,\n targetConfirmationCount: 0,\n requiredTargetConfirmationCount,\n\n startBlockNumber: targetBlockNumber,\n };\n}\n","export const ERC20_ABI = [\n {\n constant: true,\n inputs: [],\n name: 'name',\n outputs: [{ name: '', type: 'string' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_spender', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'approve',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'totalSupply',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_from', type: 'address' },\n { name: '_to', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'transferFrom',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [{ name: '', type: 'uint8' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [{ name: '_owner', type: 'address' }],\n name: 'balanceOf',\n outputs: [{ name: 'balance', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: true,\n inputs: [],\n name: 'symbol',\n outputs: [{ name: '', type: 'string' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n {\n constant: false,\n inputs: [\n { name: '_to', type: 'address' },\n { name: '_value', type: 'uint256' },\n ],\n name: 'transfer',\n outputs: [{ name: '', type: 'bool' }],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n constant: true,\n inputs: [\n { name: '_owner', type: 'address' },\n { name: '_spender', type: 'address' },\n ],\n name: 'allowance',\n outputs: [{ name: '', type: 'uint256' }],\n payable: false,\n stateMutability: 'view',\n type: 'function',\n },\n { payable: true, stateMutability: 'payable', type: 'fallback' },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'owner', type: 'address' },\n { indexed: true, name: 'spender', type: 'address' },\n { indexed: false, name: 'value', type: 'uint256' },\n ],\n name: 'Approval',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, name: 'from', type: 'address' },\n { indexed: true, name: 'to', type: 'address' },\n { indexed: false, name: 'value', type: 'uint256' },\n ],\n name: 'Transfer',\n type: 'event',\n },\n] as const;\n","import { encodeFunctionData } from 'viem';\nimport type { ChainData, Token } from '../types/config';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport { ERC20_ABI } from '../abis/erc20';\n\nexport function buildTransferTxData({\n amount,\n burnToken,\n targetChainData,\n toAddress,\n}: {\n targetChainData: ChainData;\n toAddress: `0x${string}`;\n burnToken: Token;\n amount: bigint;\n}) {\n return encodeFunctionData({\n abi: TOKEN_ROUTER_ABI,\n functionName: 'transferTokens',\n args: [amount, targetChainData.domain, toAddress, burnToken.address],\n });\n}\n\nexport function buildApprovalTxData({ amount, sourceChainData }: { amount: bigint; sourceChainData: ChainData }) {\n return encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'approve',\n args: [sourceChainData.tokenRouterAddress, amount],\n });\n}\n","import { decodeEventLog, type Address } from 'viem';\nimport { ErrorReason, type BridgeTransfer, type TrackingParams, ErrorCode } from '../../../types';\nimport { getClientForChain } from '../../../utils/client';\nimport { TOKEN_ROUTER_ABI } from '../abis/token-router';\nimport { getNetworkFeeEVM } from '../../../utils/network-fee';\nimport { retryPromise, type Done } from '../../../utils/retry-promise';\nimport { getTrackingDelayByChainId } from '../utils/config';\nimport { InvalidParamsError } from '../../../errors';\nimport type { Config } from '../types/config';\n\n// Maximum time (in ms) before the transaction is considered \"timed out\"\nexport const TRACKING_LIMIT_MS = 1000 * 60 * 60 * 3;\n// The max blocks that can be queried before receiving an error response\nexport const MAX_BLOCKS = 1024n;\n// The delay time before tracking starts\nexport const INITIAL_DELAY = 5000;\n\n/**\n * Mutates the `initial` transfer by merging it with the `updated` properties if they are not undefined\n * Invokes the `updateListener` with a copy of the updated `initial` transfer\n */\nconst updateTransfer = (\n initial: BridgeTransfer,\n updated: Partial<BridgeTransfer>,\n updateListener: TrackingParams['updateListener'],\n) => {\n Object.assign(initial, Object.fromEntries(Object.entries(updated).filter(([, value]) => value !== undefined)));\n updateListener({ ...initial });\n};\n\n/**\n * Polls the source network until it's able to get the CCTP message's `nonce` from the source transaction's logs\n * Updates the provided `BridgeTransfer` and broadcasts the changes via `updateListener`\n */\nexport const trackSourceTx = async (config: Config, params: TrackingParams) => {\n const { sourceProvider, targetProvider, updateListener, bridgeTransfer } = params;\n const sourceClient = getClientForChain({ chain: bridgeTransfer.sourceChain, provider: sourceProvider });\n const sourceChainData = config.find((chainData) => chainData.chainId === bridgeTransfer.sourceChain.chainId);\n const targetClient = getClientForChain({ chain: bridgeTransfer.targetChain, provider: targetProvider });\n const targetChainData = config.find((chainData) => chainData.chainId === bridgeTransfer.targetChain.chainId);\n const updateableTransfer = { ...bridgeTransfer };\n\n if (!sourceChainData || !targetChainData) {\n throw new InvalidParamsError(ErrorReason.CHAIN_NOT_SUPPORTED);\n }\n\n const tracker = async (done: Done<BridgeTransfer>) => {\n /**\n * Return early if:\n * - transfer has already completed successfully or due to some error\n * - the transfer state already has the message's nonce\n */\n if (updateableTransfer.completedAt || updateableTransfer.metadata?.nonce) {\n return done(updateableTransfer);\n }\n\n /**\n * Check if the transaction has timed out\n */\n if (updateableTransfer.sourceStartedAt + TRACKING_LIMIT_MS <= Date.now()) {\n updateTransfer(updateableTransfer, { completedAt: Date.now(), errorCode: ErrorCode.TIMEOUT }, updateListener);\n return done(updateableTransfer);\n }\n\n /**\n * Get the transaction's receipt.\n * Throws if the transaction has't been processed by the network yet.\n */\n const txReceipt = await sourceClient.getTransactionReceipt({\n hash: updateableTransfer.sourceTxHash as Address,\n });\n\n /**\n * Calculate the network fee if needed.\n */\n if (!updateableTransfer.sourceNetworkFee) {\n const tx = await sourceClient.getTransaction({ hash: updateableTransfer.sourceTxHash as Address });\n const networkFee = getNetworkFeeEVM(tx, txReceipt);\n\n if (networkFee) {\n updateTransfer(updateableTransfer, { sourceNetworkFee: networkFee }, updateListener);\n }\n }\n\n /**\n * Update the state and terminate if the transaction was reverted\n */\n if (txReceipt.status === 'reverted') {\n updateTransfer(\n updateableTransfer,\n { completedAt: Date.now(), errorCode: ErrorCode.TRANSACTION_REVERTED },\n updateListener,\n );\n return done(updateableTransfer);\n }\n\n /**\n * Check the confirmation count.\n * - update the sourceConfirmationCount if it increased\n * - update the startBlockNumber if confirmation count increased but is not enough\n * - keeps polling until it's greater than requiredSourceConfirmationCount\n */\n const confirmationCount = await sourceClient.getTransactionConfirmations({\n hash: updateableTransfer.sourceTxHash as Address,\n });\n const hasMoreConfirmations = confirmationCount > updateableTransfer.sourceConfirmationCount;\n const hasRequiredConfirmations = confirmationCount >= updateableTransfer.requiredSourceConfirmationCount;\n\n if (hasMoreConfirmations) {\n const changes = {} as Partial<BridgeTransfer>;\n changes.sourceConfirmationCount = Number(confirmationCount);\n\n if (!hasRequiredConfirmations) {\n changes.startBlockNumber = await targetClient.getBlockNumber();\n }\n\n updateTransfer(updateableTransfer, changes, updateListener);\n }\n\n if (!hasRequiredConfirmations) {\n return;\n }\n\n if (!updateableTransfer.startBlockNumber) {\n updateTransfer(updateableTransfer, { startBlockNumber: await targetClient.getBlockNumber() }, updateListener);\n }\n\n /**\n * Get the `TransferTokens` event's log entry from the receipt\n */\n const transferEventLog = txReceipt.logs.find((log) => {\n if (log.address.toLowerCase() === sourceChainData.tokenRouterAddress.toLowerCase()) {\n const event = decodeEventLog({\n abi: TOKEN_ROUTER_ABI,\n ...log,\n });\n\n return event.eventName === 'TransferTokens';\n }\n\n return false;\n });\n\n if (!transferEventLog) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `unable to find a TransferTokens event in source transaction \"${updateableTransfer.sourceTxHash}\"`,\n );\n }\n\n /**\n * Get the nonce used by the message transmitter from the event's log\n * https://developers.circle.com/stablecoins/docs/evm-smart-contracts#receivemessage\n */\n const transferEvent = decodeEventLog({\n abi: TOKEN_ROUTER_ABI,\n eventName: 'TransferTokens',\n ...transferEventLog,\n });\n\n // save the nonce and broadcast\n const nonce = transferEvent.args.nonce;\n updateTransfer(updateableTransfer, { targetStartedAt: Date.now(), metadata: { nonce } }, updateListener);\n return done(updateableTransfer);\n };\n\n return retryPromise<BridgeTransfer>({\n promise: tracker,\n delay: getTrackingDelayByChainId(sourceChainData.chainId),\n startAfter: INITIAL_DELAY,\n });\n};\n\n/**\n * Polls the target network until it finds the transaction that matches the message's nonce\n * Updates the provided `BridgeTransfer` and broadcasts the changes via `updateListener`\n */\nexport const trackTargetTx = async (config: Config, params: TrackingParams) => {\n const { targetProvider, updateListener, bridgeTransfer } = params;\n const updateableTransfer = { ...bridgeTransfer };\n\n if (!bridgeTransfer.completedAt && !bridgeTransfer.metadata?.nonce) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'nonce is missing');\n }\n\n if (!bridgeTransfer.startBlockNumber) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'startBlockNumber is missing');\n }\n\n const targetClient = getClientForChain({ chain: bridgeTransfer.targetChain, provider: targetProvider });\n const targetChainData = config.find((chainData) => chainData.chainId === bridgeTransfer.targetChain.chainId);\n\n if (!targetChainData) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `unknown target chain \"${bridgeTransfer.targetChain.chainId}\"`,\n );\n }\n\n const tracker = async (done: Done<BridgeTransfer>) => {\n /**\n * Return early if:\n * - transfer has already completed successfully or due to some error\n */\n if (updateableTransfer.completedAt) {\n return done(updateableTransfer);\n }\n\n /**\n * Check if `startBlockNumber` became falsy for whatever reason\n */\n if (!updateableTransfer.startBlockNumber) {\n updateTransfer(\n updateableTransfer,\n { completedAt: Date.now(), errorCode: ErrorCode.INVALID_PARAMS },\n updateListener,\n );\n return done(updateableTransfer);\n }\n\n /**\n * Check if the transaction has timed out\n */\n if (updateableTransfer.sourceStartedAt + TRACKING_LIMIT_MS <= Date.now()) {\n updateTransfer(updateableTransfer, { completedAt: Date.now(), errorCode: ErrorCode.TIMEOUT }, updateListener);\n return done(updateableTransfer);\n }\n\n if (!updateableTransfer.targetTxHash) {\n const lastBlockNumber = await targetClient.getBlockNumber();\n const lowestBlockNumber = updateableTransfer.startBlockNumber - MAX_BLOCKS;\n const fromBlock = lowestBlockNumber >= 0n ? lowestBlockNumber : 'earliest';\n const highestBlockNumber = updateableTransfer.startBlockNumber + MAX_BLOCKS;\n const toBlock = highestBlockNumber < lastBlockNumber ? highestBlockNumber : 'latest';\n\n const targetLogs = await targetClient.getLogs({\n address: targetChainData.messageTransmitterAddress,\n event: {\n name: 'MessageReceived',\n type: 'event',\n inputs: [\n { indexed: true, internalType: 'address', name: 'caller', type: 'address' },\n { indexed: false, internalType: 'uint32', name: 'sourceDomain', type: 'uint32' },\n { indexed: true, internalType: 'uint64', name: 'nonce', type: 'uint64' },\n { indexed: false, internalType: 'bytes32', name: 'sender', type: 'bytes32' },\n { indexed: false, internalType: 'bytes', name: 'messageBody', type: 'bytes' },\n ],\n },\n args: { nonce: updateableTransfer.metadata?.nonce as bigint },\n fromBlock,\n toBlock,\n });\n\n if (targetLogs[0]?.transactionHash) {\n updateTransfer(updateableTransfer, { targetTxHash: targetLogs[0].transactionHash }, updateListener);\n } else {\n updateTransfer(updateableTransfer, { startBlockNumber: lastBlockNumber }, updateListener);\n return;\n }\n }\n\n /**\n * Get the transaction's receipt.\n * Throws if the transaction has't been processed by the network yet.\n */\n const txReceipt = await targetClient.getTransactionReceipt({\n hash: updateableTransfer.targetTxHash as Address,\n });\n\n /**\n * Calculate the network fee if needed.\n */\n if (!updateableTransfer.targetNetworkFee) {\n const tx = await targetClient.getTransaction({ hash: updateableTransfer.targetTxHash as Address });\n const networkFee = getNetworkFeeEVM(tx, txReceipt);\n\n if (networkFee) {\n updateTransfer(updateableTransfer, { targetNetworkFee: networkFee }, updateListener);\n }\n }\n\n /**\n * Update the state and terminate if the transaction was reverted\n */\n if (txReceipt.status === 'reverted') {\n updateTransfer(\n updateableTransfer,\n { completedAt: Date.now(), errorCode: ErrorCode.TRANSACTION_REVERTED },\n updateListener,\n );\n return done(updateableTransfer);\n }\n\n /**\n * Check the confirmation count.\n * - update the targetConfirmationCount if it increased\n * - keeps polling until it's greater than requiredTargetConfirmationCount\n */\n const confirmationCount = await targetClient.getTransactionConfirmations({\n hash: updateableTransfer.targetTxHash as Address,\n });\n const hasMoreConfirmations = confirmationCount > updateableTransfer.targetConfirmationCount;\n const hasRequiredConfirmations = confirmationCount >= updateableTransfer.requiredTargetConfirmationCount;\n\n if (hasMoreConfirmations) {\n updateTransfer(updateableTransfer, { targetConfirmationCount: Number(confirmationCount) }, updateListener);\n }\n\n if (!hasRequiredConfirmations) {\n return;\n }\n\n updateTransfer(updateableTransfer, { completedAt: Date.now() }, updateListener);\n return done(updateableTransfer);\n };\n\n return retryPromise<BridgeTransfer>({\n promise: tracker,\n delay: getTrackingDelayByChainId(targetChainData.chainId),\n startAfter: INITIAL_DELAY,\n });\n};\n\nexport function trackTransfer(config: Config, params: TrackingParams) {\n let abortFn: (() => void) | undefined;\n\n const cancel = () => {\n abortFn?.();\n };\n\n const executeTracking = async () => {\n const { sourceProvider, targetProvider, updateListener, bridgeTransfer } = params;\n\n const { result: sourceTracker, cancel: cancelSourceTracking } = await trackSourceTx(config, {\n sourceProvider,\n targetProvider,\n updateListener,\n bridgeTransfer,\n });\n abortFn = cancelSourceTracking;\n const transferAfterSourceFinished = await sourceTracker;\n\n const { result: targetTracker, cancel: cancelTargetTracking } = await trackTargetTx(config, {\n sourceProvider,\n targetProvider,\n updateListener,\n bridgeTransfer: transferAfterSourceFinished,\n });\n abortFn = cancelTargetTracking;\n return targetTracker;\n };\n\n return {\n result: executeTracking(),\n cancel,\n };\n}\n","import { type Transaction, type TransactionReceipt } from 'viem';\n\n// returns the network fee for EVM transaction in wei (10**-18)\nexport const getNetworkFeeEVM = (transaction: Transaction, receipt: TransactionReceipt) => {\n return transaction.gasPrice && BigInt(transaction.gasPrice * receipt.gasUsed);\n};\n","export const wait = async (time: number) =>\n new Promise((res) => {\n setTimeout(res, time);\n });\n","import { wait } from './wait';\n\nexport type Done<T> = (data: T) => void;\n\ntype Params<T> = {\n promise: (done: Done<T>) => Promise<unknown>;\n delay: number;\n startAfter?: number;\n};\n\nexport const retryPromise = <T>({ promise, delay, startAfter }: Params<T>) => {\n let isRunning = false;\n let isCancelled = false;\n let errorCount = 0;\n let resolve: ((data: T) => void) | undefined = undefined;\n let reject: ((reason?: string) => void) | undefined = undefined;\n\n const done = (data: T) => {\n if (resolve && isRunning) {\n isRunning = false;\n resolve(data);\n }\n };\n\n const cancel = () => {\n isCancelled = true;\n\n if (reject && isRunning) {\n isRunning = false;\n reject('cancelled');\n }\n };\n\n const result = new Promise<T>((res, rej) => {\n isRunning = true;\n resolve = res;\n reject = rej;\n\n const execute = async (): Promise<void> => {\n if (!isRunning || isCancelled) {\n return;\n }\n\n try {\n await promise(done);\n\n if (!isRunning || isCancelled) {\n return;\n }\n\n await wait(delay);\n } catch (err) {\n console.error((err as Error).message);\n errorCount += 1;\n await wait(2 ** errorCount * delay);\n }\n\n await execute();\n };\n\n if (startAfter) {\n setTimeout(execute, startAfter);\n } else {\n execute();\n }\n });\n\n return {\n result,\n cancel,\n };\n};\n","import { BridgeInitializationError } from '../../../errors';\nimport { ErrorReason } from '../../../types';\nimport { Environment } from '../../../types/environment';\nimport { AvalancheChainIds } from '../types/chain';\nimport type { Config } from '../types/config';\n\nconst CONFIG_URLS: Record<Environment, string> = {\n [Environment.TEST]:\n 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.test.json',\n [Environment.PROD]:\n 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/cctp/cctp_config.json',\n};\n\nexport const getConfig = async (environment: Environment): Promise<Config> => {\n try {\n const response = await fetch(CONFIG_URLS[environment]!);\n const config: Config = await response.json();\n\n return config.map((chainData) => ({ ...chainData, chainId: `eip155:${chainData.chainId}` }));\n } catch (err) {\n throw new BridgeInitializationError(\n ErrorReason.CONFIG_NOT_AVAILABLE,\n `Error while fetching CCTP config: ${(err as unknown as Error).message}`,\n );\n }\n};\n\nexport const getTrackingDelayByChainId = (chainId: string) => {\n switch (chainId) {\n case AvalancheChainIds.MAINNET:\n case AvalancheChainIds.FUJI:\n return 1000;\n default:\n return 20000;\n }\n};\n","import { isAddress } from 'viem';\n\nimport { InvalidParamsError } from '../../../errors';\nimport { getClientForChain } from '../../../utils/client';\nimport { ErrorReason, type TransferParams } from '../../../types';\n\nimport { ERC20_ABI } from '../abis/erc20';\nimport { getTransferData } from '../utils/transfer-data';\nimport { ChainDomain } from '../types/chain';\nimport type { Config } from '../types/config';\n\nconst ETH_APPROVAL_TX_GAS_ESTIMATE = 60_000n; // 55.5k gas on average (+/- 200 units)\nconst ETH_TRANSFER_TX_GAS_ESTIMATE = 175_000n; // 161.5k gas on average (+/- 200 units)\nconst AVAX_APPROVAL_TX_GAS_ESTIMATE = 60_000n; // 55.5k gas on average (+/- 200 units)\nconst AVAX_TRANSFER_TX_GAS_ESTIMATE = 215_000n; // 203k gas on average (+/- 200 units)\n/**\n * The CCTP bridging consists of up to two transactions:\n *\n * 1. Token spend approval (technically optional, but realistically performed basically every time)\n * 2. Token transfer (required)\n *\n * Since the 2nd one needs the first transaction to be complete, calling .estimateGas() is not possible.\n * The RPC call raises an error since it cannot execute the transfer transaction locally without\n * the allowance being set. For that reason, we're using hard-coded estimates here, with small buffers added.\n *\n * NOTE: These estimates are only supposed to be used to approximate the network fees in the UI.\n * DO NOT use them as `gasLimit` prop on the transactions!\n */\nexport async function estimateGas(config: Config, params: TransferParams): Promise<bigint> {\n const { sourceChain, targetChain, asset, amount, fromAddress, toAddress: maybeToAddress, sourceProvider } = params;\n const toAddress = maybeToAddress ?? fromAddress;\n\n if (!isAddress(fromAddress) || !isAddress(toAddress)) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_ADDRESS_PROVIDED);\n }\n\n const { sourceChainData, burnToken } = getTransferData({ sourceChain, targetChain, asset, amount }, config);\n\n const client = getClientForChain({ chain: sourceChain, provider: sourceProvider });\n\n const allowance = await client.readContract({\n address: burnToken.address,\n abi: ERC20_ABI,\n functionName: 'allowance',\n args: [fromAddress, sourceChainData.tokenRouterAddress],\n });\n\n const isOffboarding = sourceChainData.domain === ChainDomain.Avalanche;\n\n if (allowance >= amount) {\n return isOffboarding ? AVAX_TRANSFER_TX_GAS_ESTIMATE : ETH_TRANSFER_TX_GAS_ESTIMATE;\n }\n\n return isOffboarding\n ? AVAX_APPROVAL_TX_GAS_ESTIMATE + AVAX_TRANSFER_TX_GAS_ESTIMATE\n : ETH_APPROVAL_TX_GAS_ESTIMATE + ETH_TRANSFER_TX_GAS_ESTIMATE;\n}\n","import { type BridgeServiceFactory, BridgeType } from '../../types/bridge';\nimport { getAssets } from './handlers/get-assets';\nimport { getFees } from './handlers/get-fees';\nimport { transferAsset } from './handlers/transfer-asset';\nimport { trackTransfer } from './handlers/track-transfer';\nimport { estimateGas } from './handlers/estimate-gas';\nimport { getConfig } from './utils/config';\n\nexport const cctpBridgeFactory: BridgeServiceFactory = async (environment) => {\n const config = await getConfig(environment);\n return {\n type: BridgeType.CCTP,\n estimateGas: (params) => estimateGas(config, params),\n getAssets: () => getAssets(config),\n getFees: (params) => getFees(config, params),\n transferAsset: (params) => transferAsset(config, params, environment),\n trackTransfer: (params) => trackTransfer(config, params),\n };\n};\n","import { cctpBridgeFactory } from '../bridges/cctp/factory';\nimport { BridgeUnavailableError } from '../errors';\nimport type { BridgeAsset } from '../types/asset';\nimport { type BridgeService, BridgeType } from '../types/bridge';\nimport type { Environment } from '../types/environment';\nimport type { BridgeServicesMap } from '../types/config';\n\nimport { compact } from 'lodash';\n\nexport const supportedBridges = new Map([[BridgeType.CCTP, cctpBridgeFactory]]);\n\nexport const getEnabledBridgeServices = async (\n environment: Environment,\n disabledBridgeTypes: BridgeType[],\n): Promise<BridgeServicesMap> => {\n const filteredBridges = [...supportedBridges].filter(([bridgeType]) => !disabledBridgeTypes.includes(bridgeType));\n const bridgePromisesResults = await Promise.allSettled(\n filteredBridges.map(\n async ([bridgeType, factory]): Promise<[BridgeType, BridgeService]> => [bridgeType, await factory(environment)],\n ),\n );\n\n return new Map(\n compact(bridgePromisesResults.map((result) => (result.status === 'fulfilled' ? result.value : undefined))),\n );\n};\n\nexport const getBridgeForTransfer = (\n enabledBridgeServices: Map<BridgeType, BridgeService>,\n asset: BridgeAsset,\n targetChainId: string,\n) => {\n const destinations = asset.destinations[targetChainId];\n for (const bridgeType of destinations ?? []) {\n const bridge = enabledBridgeServices.get(bridgeType);\n if (bridge) {\n return { bridge, type: bridgeType };\n }\n }\n throw new BridgeUnavailableError();\n};\n","import type { FeeParams, TrackingParams, TransferParams } from './types/bridge';\nimport type { BridgeServiceConfig } from './types/config';\nimport { getBridgeForTransfer } from './utils';\nimport type { BridgeAsset, ChainAssetMap } from './types';\nimport { isArray, mergeWith } from 'lodash';\nimport { BridgeUnavailableError } from './errors';\n\nexport const createUnifiedBridgeService = ({ environment, enabledBridgeServices }: BridgeServiceConfig) => {\n const getAssets = async () => {\n const assets = await Promise.all(Array.from(enabledBridgeServices).map(([, bridge]) => bridge.getAssets()));\n return assets.reduce<ChainAssetMap>((aggregatedAssets, chainAssetMap) => {\n for (const [chainId, bridgeAssets] of Object.entries(chainAssetMap)) {\n const existingAssets = aggregatedAssets[chainId];\n\n if (existingAssets) {\n for (const bridgeAsset of bridgeAssets) {\n const index = existingAssets.findIndex(({ symbol }) => symbol === bridgeAsset.symbol);\n\n if (index === -1) {\n existingAssets.push(bridgeAsset);\n } else {\n mergeWith(existingAssets[index], bridgeAsset, (objValue, srcValue) => {\n if (isArray(objValue)) {\n return [...new Set(objValue.concat(srcValue))];\n }\n });\n }\n }\n } else {\n aggregatedAssets[chainId] = bridgeAssets;\n }\n }\n\n return aggregatedAssets;\n }, {});\n };\n\n const getFees = async (params: FeeParams) => {\n const { bridge } = getBridgeForTransfer(enabledBridgeServices, params.asset, params.targetChain.chainId);\n return bridge.getFees(params);\n };\n\n const transferAsset = async (params: TransferParams) => {\n const { bridge } = getBridgeForTransfer(enabledBridgeServices, params.asset, params.targetChain.chainId);\n return bridge.transferAsset(params);\n };\n\n const canTransferAsset = (asset: BridgeAsset, targetChainId: string) => {\n try {\n getBridgeForTransfer(enabledBridgeServices, asset, targetChainId);\n return true;\n } catch {\n return false;\n }\n };\n\n const trackTransfer = (params: TrackingParams) => {\n const bridge = enabledBridgeServices.get(params.bridgeTransfer.type);\n\n if (!bridge) {\n throw new BridgeUnavailableError();\n }\n\n return bridge.trackTransfer(params);\n };\n\n const estimateGas = async (params: TransferParams) => {\n const { bridge } = getBridgeForTransfer(enabledBridgeServices, params.asset, params.targetChain.chainId);\n\n return bridge.estimateGas(params);\n };\n\n return {\n environment,\n getAssets,\n getFees,\n estimateGas,\n canTransferAsset,\n transferAsset,\n trackTransfer,\n };\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avalabs/bridge-unified",
|
|
3
|
-
"
|
|
3
|
+
"license": "Limited Ecosystem License",
|
|
4
|
+
"version": "2.1.2",
|
|
4
5
|
"main": "dist/index.cjs",
|
|
5
6
|
"module": "dist/index.js",
|
|
6
7
|
"typings": "dist/index.d.ts",
|
|
7
8
|
"type": "module",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
8
12
|
"dependencies": {
|
|
9
13
|
"abitype": "0.9.3",
|
|
10
14
|
"lodash": "4.17.21",
|
|
11
|
-
"viem": "
|
|
15
|
+
"viem": "2.11.1"
|
|
12
16
|
},
|
|
13
17
|
"devDependencies": {
|
|
14
18
|
"@types/jest": "29.5.7",
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @avalabs/bridge-unified@2.1.0 build /home/runner/work/consumer-sdks/consumer-sdks/packages/bridge-unified
|
|
3
|
-
> tsup
|
|
4
|
-
|
|
5
|
-
[34mCLI[39m Building entry: ./src/index.ts
|
|
6
|
-
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
-
[34mCLI[39m tsup v7.2.0
|
|
8
|
-
[34mCLI[39m Using tsup config: /home/runner/work/consumer-sdks/consumer-sdks/packages/bridge-unified/tsup.config.ts
|
|
9
|
-
[34mCLI[39m Target: es2021
|
|
10
|
-
[34mCLI[39m Cleaning output folder
|
|
11
|
-
[34mCJS[39m Build start
|
|
12
|
-
[34mESM[39m Build start
|
|
13
|
-
[32mCJS[39m [1mdist/index.cjs [22m[32m23.92 KB[39m
|
|
14
|
-
[32mCJS[39m [1mdist/index.cjs.map [22m[32m88.37 KB[39m
|
|
15
|
-
[32mCJS[39m ⚡️ Build success in 1550ms
|
|
16
|
-
[32mESM[39m [1mdist/index.js [22m[32m23.89 KB[39m
|
|
17
|
-
[32mESM[39m [1mdist/index.js.map [22m[32m88.37 KB[39m
|
|
18
|
-
[32mESM[39m ⚡️ Build success in 1551ms
|
|
19
|
-
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in 8949ms
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.cts [22m[32m6.09 KB[39m
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m6.09 KB[39m
|
package/.turbo/turbo-lint.log
DELETED
package/.turbo/turbo-test.log
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @avalabs/bridge-unified@2.1.0 test /home/runner/work/consumer-sdks/consumer-sdks/packages/bridge-unified
|
|
3
|
-
> jest
|
|
4
|
-
|
|
5
|
-
PASS src/bridges/cctp/handlers/track-transfer.test.ts (11.073 s)
|
|
6
|
-
PASS src/bridges/cctp/handlers/transfer-asset.test.ts
|
|
7
|
-
PASS src/unified-bridge-service.test.ts
|
|
8
|
-
PASS src/utils/retry-promise.test.ts
|
|
9
|
-
PASS src/bridges/cctp/handlers/estimate-gas.test.ts
|
|
10
|
-
PASS src/bridges/cctp/utils/transfer-data.test.ts
|
|
11
|
-
PASS src/utils/bridge-types.test.ts
|
|
12
|
-
PASS src/utils/client.test.ts
|
|
13
|
-
PASS src/bridges/cctp/factory.test.ts
|
|
14
|
-
PASS src/bridges/cctp/handlers/get-fees.test.ts
|
|
15
|
-
PASS src/bridges/cctp/utils/config.test.ts
|
|
16
|
-
PASS src/utils/ensure-config.test.ts
|
|
17
|
-
PASS src/utils/caip2.test.ts
|
|
18
|
-
PASS src/bridges/cctp/handlers/get-assets.test.ts
|
|
19
|
-
PASS src/utils/network-fee.test.ts
|
|
20
|
-
PASS src/utils/wait.test.ts
|
|
21
|
-
|
|
22
|
-
Test Suites: 16 passed, 16 total
|
|
23
|
-
Tests: 87 passed, 87 total
|
|
24
|
-
Snapshots: 0 total
|
|
25
|
-
Time: 19.099 s
|
|
26
|
-
Ran all test suites.
|
package/CHANGELOG.md
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# @avalabs/unified-bridge
|
|
2
|
-
|
|
3
|
-
## 2.1.0
|
|
4
|
-
|
|
5
|
-
### Minor Changes
|
|
6
|
-
|
|
7
|
-
- 3b691bc: adds estimateGas() handler for bridge-unified sdk
|
|
8
|
-
|
|
9
|
-
## 2.0.1
|
|
10
|
-
|
|
11
|
-
### Patch Changes
|
|
12
|
-
|
|
13
|
-
- 672c0e8: fix: lowercase addresses for comparison
|
|
14
|
-
|
|
15
|
-
## 2.0.0
|
|
16
|
-
|
|
17
|
-
### Major Changes
|
|
18
|
-
|
|
19
|
-
- 7df7ca0: CCTP integration
|
|
20
|
-
|
|
21
|
-
### Minor Changes
|
|
22
|
-
|
|
23
|
-
- 7df7ca0: use caip2 chain ids
|
|
24
|
-
- 54757d4: Make sourceProvider optional, add bridged asset denomination info
|
|
25
|
-
- b8f102b: update and validate startBlockNumber while tracking
|
|
26
|
-
|
|
27
|
-
## 1.0.1
|
|
28
|
-
|
|
29
|
-
### Patch Changes
|
|
30
|
-
|
|
31
|
-
- a397015: Shared tsup config
|
package/jest.config.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { TokenType, type BridgeAsset } from '../../../types/asset';
|
|
2
|
-
import { BridgeType } from '../../../types/bridge';
|
|
3
|
-
import { TARGET_CHAIN } from './chain.mocks';
|
|
4
|
-
import { SOURCE_TOKEN_ADDRESS } from './config.mock';
|
|
5
|
-
|
|
6
|
-
export const BRIDGE_ASSET = {
|
|
7
|
-
address: SOURCE_TOKEN_ADDRESS,
|
|
8
|
-
name: 'USD Coin',
|
|
9
|
-
symbol: 'USDC',
|
|
10
|
-
decimals: 6,
|
|
11
|
-
type: TokenType.ERC20,
|
|
12
|
-
destinations: {
|
|
13
|
-
[TARGET_CHAIN.chainId]: [BridgeType.CCTP],
|
|
14
|
-
},
|
|
15
|
-
} as BridgeAsset;
|